更新了部分文档

pull/792/head
jackfrued 2021-06-20 18:05:22 +08:00
parent b67ed793e3
commit 1ef5bf058a
12 changed files with 1085 additions and 602 deletions

File diff suppressed because it is too large Load Diff

View File

@ -25,14 +25,13 @@ job varchar(20) not null comment '员工职位',
mgr int comment '主管编号',
sal int not null comment '员工月薪',
comm int comment '每月补贴',
dno int comment '所在部门编号',
primary key (eno),
foreign key (dno) references tb_dept(dno),
foreign key (mgr) references tb_emp(eno)
dno int comment '所在部门编号'
);
alter table tb_emp add constraint pk_emp_eno primary key (eno);
alter table tb_emp add constraint uk_emp_ename unique (ename);
-- alter table tb_emp add constraint fk_emp_mgr foreign key (mgr) references tb_emp (eno);
-- alter table tb_emp add constraint fk_emp_dno foreign key (dno) references tb_dept (dno);
alter table tb_emp add constraint fk_emp_dno foreign key (dno) references tb_dept (dno);
insert into tb_emp values
(7800, '张三丰', '总裁', null, 9000, 1200, 20),
@ -61,11 +60,11 @@ insert into tb_emp values
-- 查询月薪最高的员工(Boss除外)的姓名和月薪
-- 查询超过平均薪的员工的姓名和月薪
-- 查询薪超过平均薪的员工的姓名和月薪
-- 查询超过其所在部门平均薪的员工的姓名、部门编号和月薪
-- 查询薪超过其所在部门平均薪的员工的姓名、部门编号和月薪
-- 查询部门中最高的人姓名、月薪和所在部门名称
-- 查询部门中薪最高的人姓名、月薪和所在部门名称
-- 查询主管的姓名和职位

View File

@ -14,7 +14,7 @@ create table `tb_college`
`col_name` varchar(50) not null comment '名称',
`col_intro` varchar(5000) default '' comment '介绍',
primary key (`col_id`)
) engine=innodb;
) engine=innodb comment '学院表';
-- 创建学生表
create table `tb_student`
@ -27,7 +27,7 @@ create table `tb_student`
`col_id` int unsigned not null comment '所属学院',
primary key (`stu_id`),
foreign key (`col_id`) references `tb_college` (`col_id`)
) engine=innodb;
) engine=innodb comment '学生表';
-- 创建教师表
create table `tb_teacher`
@ -38,7 +38,7 @@ create table `tb_teacher`
`col_id` int unsigned not null comment '所属学院',
primary key (`tea_id`),
foreign key (`col_id`) references `tb_college` (`col_id`)
);
) engine=innodb comment '老师表';
-- 创建课程表
create table `tb_course`
@ -49,7 +49,7 @@ create table `tb_course`
`tea_id` int unsigned not null comment '授课老师',
primary key (`cou_id`),
foreign key (`tea_id`) references `tb_teacher` (`tea_id`)
);
) engine=innodb comment '课程表';
-- 创建选课记录表
create table `tb_record`
@ -63,7 +63,7 @@ primary key (`rec_id`),
foreign key (`sid`) references `tb_student` (`stu_id`),
foreign key (`cid`) references `tb_course` (`cou_id`),
unique (`sid`, `cid`)
);
) engine=innodb comment '选课记录表';
-- 插入学院数据
insert into `tb_college`

View File

@ -0,0 +1,144 @@
drop database if exists hrs;
create database hrs default charset utf8mb4;
use hrs;
create table tb_dept
(
dno int not null comment '编号',
dname varchar(10) not null comment '名称',
dloc varchar(20) not null comment '所在地',
primary key (dno)
);
insert into tb_dept values
(10, '会计部', '北京'),
(20, '研发部', '成都'),
(30, '销售部', '重庆'),
(40, '运维部', '深圳');
create table tb_emp
(
eno int not null comment '员工编号',
ename varchar(20) not null comment '员工姓名',
job varchar(20) not null comment '员工职位',
mgr int comment '主管编号',
sal int not null comment '员工月薪',
comm int comment '每月补贴',
dno int comment '所在部门编号',
primary key (eno),
foreign key (dno) references tb_dept (dno)
);
-- alter table tb_emp add constraint pk_emp_eno primary key (eno);
-- alter table tb_emp add constraint uk_emp_ename unique (ename);
-- alter table tb_emp add constraint fk_emp_mgr foreign key (mgr) references tb_emp (eno);
-- alter table tb_emp add constraint fk_emp_dno foreign key (dno) references tb_dept (dno);
insert into tb_emp values
(7800, '张三丰', '总裁', null, 9000, 1200, 20),
(2056, '乔峰', '分析师', 7800, 5000, 1500, 20),
(3088, '李莫愁', '设计师', 2056, 3500, 800, 20),
(3211, '张无忌', '程序员', 2056, 3200, null, 20),
(3233, '丘处机', '程序员', 2056, 3400, null, 20),
(3251, '张翠山', '程序员', 2056, 4000, null, 20),
(5566, '宋远桥', '会计师', 7800, 4000, 1000, 10),
(5234, '郭靖', '出纳', 5566, 2000, null, 10),
(3344, '黄蓉', '销售主管', 7800, 3000, 800, 30),
(1359, '胡一刀', '销售员', 3344, 1800, 200, 30),
(4466, '苗人凤', '销售员', 3344, 2500, null, 30),
(3244, '欧阳锋', '程序员', 3088, 3200, null, 20),
(3577, '杨过', '会计', 5566, 2200, null, 10),
(3588, '朱九真', '会计', 5566, 2500, null, 10);
-- 查询月薪最高的员工姓名和月薪
select ename, sal from tb_emp where sal=(select max(sal) from tb_emp);
select ename, sal from tb_emp where sal>=all(select sal from tb_emp);
-- 查询员工的姓名和年薪((月薪+补贴)*13)
select ename, (sal+ifnull(comm,0))*13 as ann_sal from tb_emp order by ann_sal desc;
-- 查询有员工的部门的编号和人数
select dno, count(*) as total from tb_emp group by dno;
-- 查询所有部门的名称和人数
select dname, ifnull(total,0) as total from tb_dept left join
(select dno, count(*) as total from tb_emp group by dno) tb_temp
on tb_dept.dno=tb_temp.dno;
-- 查询月薪最高的员工(Boss除外)的姓名和月薪
select ename, sal from tb_emp where sal=(
select max(sal) from tb_emp where mgr is not null
);
-- 查询月薪排第2名的员工的姓名和月薪
select ename, sal from tb_emp where sal=(
select distinct sal from tb_emp order by sal desc limit 1,1
);
select ename, sal from tb_emp where sal=(
select max(sal) from tb_emp where sal<(select max(sal) from tb_emp)
);
-- 查询月薪超过平均月薪的员工的姓名和月薪
select ename, sal from tb_emp where sal>(select avg(sal) from tb_emp);
-- 查询月薪超过其所在部门平均月薪的员工的姓名、部门编号和月薪
select ename, t1.dno, sal from tb_emp t1 inner join
(select dno, avg(sal) as avg_sal from tb_emp group by dno) t2
on t1.dno=t2.dno and sal>avg_sal;
-- 查询部门中月薪最高的人姓名、月薪和所在部门名称
select ename, sal, dname
from tb_emp t1, tb_dept t2, (
select dno, max(sal) as max_sal from tb_emp group by dno
) t3 where t1.dno=t2.dno and t1.dno=t3.dno and sal=max_sal;
-- 查询主管的姓名和职位
-- 提示尽量少用in/not in运算尽量少用distinct操作
-- 可以使用存在性判断exists/not exists替代集合运算和去重操作
select ename, job from tb_emp where eno in (
select distinct mgr from tb_emp where mgr is not null
);
select ename, job from tb_emp where eno=any(
select distinct mgr from tb_emp where mgr is not null
);
select ename, job from tb_emp t1 where exists (
select 'x' from tb_emp t2 where t1.eno=t2.mgr
);
-- MySQL8有窗口函数row_number() / rank() / dense_rank()
-- 查询月薪排名4~6名的员工的排名、姓名和月薪
select ename, sal from tb_emp order by sal desc limit 3,3;
select row_num, ename, sal from
(select @a:=@a+1 as row_num, ename, sal
from tb_emp, (select @a:=0) t1 order by sal desc) t2
where row_num between 4 and 6;
-- 窗口函数不适合业务数据库,只适合做离线数据分析
select
ename, sal,
row_number() over (order by sal desc) as row_num,
rank() over (order by sal desc) as ranking,
dense_rank() over (order by sal desc) as dense_ranking
from tb_emp limit 3 offset 3;
select ename, sal, ranking from (
select ename, sal, dense_rank() over (order by sal desc) as ranking from tb_emp
) tb_temp where ranking between 4 and 6;
-- 窗口函数主要用于解决TopN查询问题
-- 查询每个部门月薪排前2名的员工姓名、月薪和部门编号
select ename, sal, dno from (
select ename, sal, dno, rank() over (partition by dno order by sal desc) as ranking
from tb_emp
) tb_temp where ranking<=2;
select ename, sal, dno from tb_emp t1
where (select count(*) from tb_emp t2 where t1.dno=t2.dno and t2.sal>t1.sal)<2
order by dno asc, sal desc;

File diff suppressed because one or more lines are too long

View File

@ -1,22 +0,0 @@
drop database if exists shop;
create database shop default charset utf8;
use shop;
drop table if exists tb_goods;
create table tb_goods
(
gid int not null auto_increment,
gname varchar(50) not null,
gprice decimal(10,2) not null,
gimage varchar(255),
primary key (gid)
);
insert into tb_goods values
(default, '乐事Lays无限薯片', 8.2, 'images/lay.jpg'),
(default, '旺旺 仙贝 加量装 540g', 18.5, 'images/wang.jpg'),
(default, '多儿比Dolbee黄桃水果罐头', 6.8, 'images/dolbee.jpg'),
(default, '王致和 精制料酒 500ml', 7.9, 'images/wine.jpg'),
(default, '陈克明 面条 鸡蛋龙须挂面', 1.0, 'images/noodle.jpg'),
(default, '鲁花 菜籽油 4L', 69.9, 'images/oil.jpg');

File diff suppressed because one or more lines are too long

View File

@ -259,7 +259,7 @@ Notebook是基于网页的用于交互计算的应用程序可以用于代码
在实际工作中,我们经常通过四分位数再配合[箱线图](https://zhuanlan.zhihu.com/p/110580568)来发现异常值。例如,小于$Q_1 - 1.5 \times IQR$的值或大于$Q3 + 1.5 \times IQR$的值可以视为普通异常值,而小于$Q_1 - 3 \times IQR$的值或大于$Q3 + 3 \times IQR$的值通常视为极度异常值。这种检测异常值的方法跟[“3西格玛法则”](https://zh.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7%E5%8E%9F%E5%89%87)的道理是一致的,如下图所示。
![](res/quartile_and_3sigma.png)
![](res/3sigma.png)
2. 离散趋势

View File

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

View File

@ -0,0 +1,149 @@
## 概率基础
### 数据的集中趋势
我们经常会使用以下几个指标来描述一组数据的集中趋势:
1. 均值 - 均值代表某个数据集的整体水平,我们经常提到的客单价、平均访问时长、平均配送时长等指标都是均值。均值的缺点是容易受极值的影响,虽然可以使用加权平均值来消除极值的影响,但是可能事先并不清楚数据的权重;对于正数可以用几何平均值来替代算术平均值。
- 算术平均值:$$\bar{x}=\frac{\sum_{i=1}^{n}x_{i}}{n}=\frac{x_{1}+x_{2}+\cdots +x_{n}}{n}$$。
- 几何平均值:$$\left(\prod_{i=1}^{n}x_{i}\right)^{\frac{1}{n}}={\sqrt[{n}]{x_{1}x_{2} \cdots x_{n}}}$$。
2. 中位数 - 将数据按照升序或降序排列后位于中间的数,它描述了数据的中等水平。
3. 众数 - 数据集合中出现频次最多的数据,它代表了数据的一般水平。数据的趋势越集中,众数的代表性就越好。众数不受极值的影响,但是无法保证唯一性和存在性。
例子有A和B两组数据。
```
A组5, 6, 6, 6, 6, 8, 10
B组3, 5, 5, 6, 6, 9, 12
```
A组
均值6.74中位数6众数6。
B组
均值6.57中位数6众数5, 6。
对A组的数据进行一些调整。
```
A组5, 6, 6, 6, 6, 8, 10, 20
B组3, 5, 5, 6, 6, 9, 12
```
A组的均值会大幅度提升但中位数和众数却没有变化。
> **思考**怎样判断上面的20到底是不是一个异常值
| | 优点 | 缺点 |
| ------ | -------------------------------- | ------------------------------------ |
| 均值 | 充分利用了所有数据,适应性强 | 容易收到极端值(异常值)的影响 |
| 中位数 | 能够避免被极端值(异常值)的影响 | 不敏感 |
| 众数 | 能够很好的反映数据的集中趋势 | 有可能不存在(数据没有明显集中趋势) |
> **练习1**:在“概率基础练习.xlsx”文件的表单“练习1”中有一组用户订单支付金额的数据计算订单的均值、中位数、众数。
>
> **练习2**在“概率基础练习.xlsx”文件的表单“练习2”中有一组商品销售量的数据现计划设定一个阈值对阈值以下的商品对应的分销商进行优化应该选择什么作为阈值比较合适
### 数据的离散趋势
如果说数据的集中趋势说明了数据最主要的特征是什么那么数据的离散趋势则体现了这个特征的稳定性。例如A地区冬季平均气温`0`摄氏度,最低气温`-10`摄氏度B地区冬季平均气温`-2`摄氏度,最低气温`-4`摄氏度如果你是一个特别怕冷的人在选择A和B两个区域作为工作和生活的城市时你会做出怎样的选择
1. 极值就是最大值maximum、最小值minimum代表着数据集的上限和下限。
2. 极差:又称“全距”,是一组数据中的最大观测值和最小观测值之差,记作$R$。一般情况下,极差越大,离散程度越大,数据受极值的影响越严重。
3. 方差:将每个值与均值的偏差进行平方,然后除以总数据量得到的值。简单来说就是表示数据与期望值的偏离程度。方差越大,就意味着数据越不稳定、波动越剧烈,因此代表着数据整体比较分散,呈现出离散的趋势;而方差越小,意味着数据越稳定、波动越平滑,因此代表着数据整体比较集中。
- 总体方差:$$ \sigma^2 = \frac {\sum_{i=1}^{N}(X_i - \mu)^2} {N} $$。
- 样本方差:$$ S^2 = \frac {\sum_{i=1}^{N}(X_i - \bar{X})^2} {N-1} $$。
4. 标准差:将方差进行平方根运算后的结果,与方差一样都是表示数据与期望值的偏离程度。
- 总体标准差:$$ \sigma = \sqrt{\frac{\sum_{i=1}^{N}(X_i - \mu)^2}{N}} $$。
- 样本标准差:$$ S = \sqrt{\frac{\sum_{i=1}^{N}(X_i - \bar{X})^2}{N-1}} $$。
> **练习3**:复制“概率基础练习.xlsx”文件的表单“练习1”将复制的表单命名为“练习3”计算订单支付金额的最大值、最小值、极差、方差和标准差。
### 数据的频数分析
频数分析是指用一定的方式将数据分组,然后统计每个分组中样本的数量,再辅以图表(如直方图)就可以更直观的展示数据分布趋势的一种方法。
频数分析的意义:
1. 大问题变小问题,迅速聚焦到需要关注的群体。
2. 找到合理的分类机制,有利于长期的数据分析(维度拆解)。
例如一个班有40个学生考试成绩如下所示
```
73, 87, 88, 65, 73, 76, 80, 95, 83, 69, 55, 67, 70, 94, 86, 81, 87, 95, 84, 92, 92, 76, 69, 97, 72, 90, 72, 85, 80, 83, 97, 95, 62, 92, 67, 73, 91, 95, 86, 77
```
用上面学过的知识,先解读学生考试成绩的数据。
均值81.275中位数83众数95。
最高分97最低分55极差42方差118.15标准差10.87。
但是仅仅依靠上面的数据是很难对一个数据集做出全面的解读我们可以把学生按照考试成绩进行分组如下所示大家可以自行尝试在Excel或用Python来完成这个操作。
| 分数段 | 学生人数 |
| -------- | -------- |
| <60 | 1 |
| [60, 65) | 1 |
| [65, 69) | 5 |
| [70, 75) | 6 |
| [75, 80) | 3 |
| [80, 85) | 6 |
| [85, 90) | 6 |
| [90, 95) | 6 |
| >=95 | 6 |
> **练习4**:在“概率基础练习.xlsx”文件的表单“练习4”中有某App首页版本迭代上线后的A/B测试数据数据代表了参与测试的用户7日的活跃天数请分析A组和B组的数据并判定哪组表现更优。
>
> **练习5**:在“概率基础练习.xlsx”文件的表单“练习5”中有某App某个功能迭代上线后的A/B测试数据数据代表了参与测试的用户30日的产品使用时长请分析A组和B组的数据并判定哪组表现更优。
### 数据的概率分布
#### 基本概念
1. 随机试验:在相同条件下对某种随机现象进行观测的试验。随机试验满足三个特点:
- 可以在相同条件下重复的进行。
- 每次试验的结果不止一个,事先可以明确指出全部可能的结果。
- 重复试验的结果以随机的方式出现(事先不确定会出现哪个结果)。
2. 随机变量:如果$X$指定给概率空间$S$中每一个事件$e$有一个实数$X(e)$,同时针对每一个实数$r$都有一个事件集合$A_r$与其相对应,其中$A_r=\{e: X(e) \le r\}$,那么$X$被称作随机变量。从这个定义看出,$X$的本质是一个实值函数,以给定事件为自变量的实值函数,因为函数在给定自变量时会产生因变量,所以将$X$称为随机变量。
- 离散型随机变量:数据可以一一列出。
- 连续型随机变量:数据不可以一一列出。
如果离散型随机变量的取值非常庞大时,可以近似看做连续型随机变量。
3. 概率质量函数/概率密度函数:概率质量函数是描述离散型随机变量为特定取值的概率的函数,通常缩写为**PMF**。概率密度函数是描述连续型随机变量在某个确定的取值点可能性的函数,通常缩写为**PDF**。二者的区别在于,概率密度函数本身不是概率,只有对概率密度函数在某区间内进行积分后才是概率。
#### 离散型分布
1. 伯努利分布(*Bernoulli distribution*):又名**两点分布**或者**0-1分布**是一个离散型概率分布。若伯努利试验成功则随机变量取值为1。若伯努利试验失败则随机变量取值为0。记其成功概率为$p (0 \le p \le 1)$,失败概率为$q=1-p$,则概率质量函数为:
$$ {\displaystyle f_{X}(x)=p^{x}(1-p)^{1-x}=\left\{{\begin{matrix}p&{\mbox{if }}x=1,\\q\ &{\mbox{if }}x=0.\\\end{matrix}}\right.} $$
2. 二项分布(*Binomial distribution*$n$个独立的是/非试验中成功的次数的离散概率分布,其中每次试验的成功概率为$p$。一般地,如果随机变量$X$服从参数为$n$和$p$的二项分布,记为$X\sim B(n,p)$。$n$次试验中正好得到$k$次成功的概率由概率质量函数给出,$\displaystyle f(k,n,p)=\Pr(X=k)={n \choose k}p^{k}(1-p)^{n-k}$,对于$k= 0, 1, 2, ..., n$,其中${n \choose k}={\frac {n!}{k!(n-k)!}}$。
3. 泊松分布(*Poisson distribution*适合于描述单位时间内随机事件发生的次数的概率分布。如某一服务设施在一定时间内受到的服务请求的次数、汽车站台的候客人数、机器出现的故障数、自然灾害发生的次数、DNA序列的变异数、放射性原子核的衰变数等等。泊松分布的概率质量函数为$P(X=k)=\frac{e^{-\lambda}\lambda^k}{k!}$,泊松分布的参数$\lambda$是单位时间(或单位面积)内随机事件的平均发生率。
> **说明**:泊松分布是在没有计算机的年代,由于二项分布的运算量太大运算比较困难,为了减少运算量,数学家为二项分布提供的一种近似。
#### 连续型分布
1. 均匀分布(*Uniform distribution*):如果连续型随机变量$X$具有概率密度函数$f(x)=\begin{cases}{\frac{1}{b-a}} \quad &{a \leq x \leq b} \\ {0} \quad &{\mbox{other}}\end{cases}$,则称$X$服从$[a,b]$上的均匀分布,记作$X\sim U[a,b]$。
2. 指数分布(*Exponential distribution*):如果连续型随机变量$X$具有概率密度函数$f(x)=\begin{cases} \lambda e^{- \lambda x} \quad &{x \ge 0} \\ {0} \quad &{x \lt 0} \end{cases}$,则称$X$服从参数为$\lambda$的指数分布,记为$X \sim Exp(\lambda)$。指数分布可以用来表示独立随机事件发生的时间间隔,比如旅客进入机场的时间间隔、客服中心接入电话的时间间隔、知乎上出现新问题的时间间隔等等。指数分布的一个重要特征是无记忆性(无后效性),这表示如果一个随机变量呈指数分布,它的条件概率遵循:$P(T \gt s+t\ |\ T \gt t)=P(T \gt s), \forall s,t \ge 0$。
3. 正态分布(*Normal distribution*):又名**高斯分布***Gaussian distribution*),是一个非常常见的连续概率分布,经常用自然科学和社会科学中来代表一个不明的随机变量。若随机变量$X$服从一个位置参数为$\mu$、尺度参数为$\sigma$的正态分布,记为$X \sim N(\mu,\sigma^2)$,其概率密度函数为:$\displaystyle f(x)={\frac {1}{\sigma {\sqrt {2\pi }}}}e^{-{\frac {\left(x-\mu \right)^{2}}{2\sigma ^{2}}}}$。
<img src="normal-distribution.png" width="600">
“3$\sigma$法则”:
<img src="3sigma.png" height="600">
4. 伽马分布(*Gamma distribution*):假设$X_1, X_2, ... X_n$为连续发生事件的等候时间,且这$n$次等候时间为独立的,那么这$n$次等候时间之和$Y$$Y=X_1+X_2+...+X_n$)服从伽玛分布,即$Y \sim \Gamma(\alpha,\beta)$,其中$\alpha=n, \beta=\lambda$,这里的$\lambda$是连续发生事件的平均发生频率。
5. 卡方分布(*Chi-square distribution*):若$k$个随机变量$Z_1,Z_2,...,Z_k$是相互独立且符合标准正态分布数学期望为0方差为1的随机变量则随机变量$Z$的平方和$X=\sum_{i=1}^{k}Z_i^2$被称为服从自由度为$k$的卡方分布,记为$X \sim \chi^2(k)$。

View File

@ -162,7 +162,7 @@ Hive的数据类型如下所示。
set hive.exec.max.dynamic.partitions.pernode=10000;
```
5. 拷贝数据。
5. 拷贝数据Shell命令
```Shell
hdfs dfs -put /home/ubuntu/data/user_trade/* /user/hive/warehouse/demo.db/user_trade