学习信息
千锋教育【2019python】数据分析与人工智能全套
联系:路锋坤——18513106743
matlab科学计算语言,个人可以使用破解版,但是类似学校,公司等一些机构就不行了,
会有追踪。
pip install jupyter
jupyter notebook(cmd不能关闭掉)
环境变量上下移(anaconda与自装python顺序,anaconda安装完成后,由于较多包库,
要使用的话,将环境变量移到一开始自己下载的python前面)
2019python数据分析/挖掘/建模(慕课——哔哩哔哩)
数据获取、探索分析与可视化、预处理理论、
python:简洁、开发效率高、运算速度慢、胶水特性
numpy/scipy/matplotlib/pandas/scikit learn/……
重视理论、勤于查阅、身体力行(代码是自己写的)、联系实际
常用Latex公式表达方式:http://www.mohu.org/info/symbols/symbols.htm
数据获取方式
A. 数据仓库
- 1 所有业务数据经汇总处理(DW)
B. 数据库VS仓库
- 数据库面向业务存储,仓科面向主题存储(主题:较高层次上对分析对象数据的一个完整并且一致的描述)
- 数据库针对应用(OLTP),仓库针对分析(OLAP)
- 数据库组织规范,仓库可能冗余,相对变化大,数据量大
C. 监测与抓取
D. 填写、埋点、日志
- 用户填写信息
- APP或网页埋点(特定流程的信息记录点)
- 操作日志
E. 计算(计算生成衍生数据)
F. 数据学习网站
- 数据竞赛网站(kaggle,面向全球)
- 阿里云天池
- imagenet/open images(数据集网站-图片类)
- 各领域统计数据(统计局、政府机构、公司财报)
理论铺垫
集中趋势:
均值、中位数、众数(主要为离散值衡量)、分位数(常用4分为数)
- 四分位数计算方法:
- Q1的位置=(n+1)*0.25
- Q2(中位数)的位置=(n+1)*0.5
- Q3的位置=(n+1)*0.75
例:1 2 3 4 5 6 7 8(第一四分位数为2.25)
离中趋势(标准差、方差)
σ
=
1
N
∑
i
=
1
N
(
x
i
−
u
)
2
\sigma=\sqrt{\frac{1}{N}\sum_{i=1}^{N}(x_{i}-u)^2}
σ=N1i=1∑N(xi−u)2
注:图表示落在-1.96倍标准差和1.96倍标准差的概率为95%
偏度系数与峰度系数
S = 1 n ∑ i = 1 n ( x i − x ‾ ) 3 ( 1 n ∑ i = 1 n ( x i − x ‾ ) 2 ) 3 2 S=\frac{\frac{1}{n}\sum_{i=1}^{n}(x_{i}-\overline{x})^3}{(\frac{1}{n}\sum_{i=1}^{n}(x_{i}-\overline{x})^2)^\frac{3}{2}} S=(n1∑i=1n(xi−x)2)23n1∑i=1n(xi−x)3 K = 1 n ∑ i = 1 n ( x i − x ‾ ) 4 ( 1 n ∑ i = 1 n ( x i − x ‾ ) 2 ) 2 K=\frac{\frac{1}{n}\sum_{i=1}^{n}(x_{i}-\overline{x})^4}{(\frac{1}{n}\sum_{i=1}^{n}(x_{i}-\overline{x})^2)^2} K=(n1∑i=1n(xi−x)2)2n1∑i=1n(xi−x)4
- 正偏例子(S>0,均值偏大):
- 定义
偏度(Skewness)是描述某变量取值分布对称性的统计量。如果是正太分布的话.偏度是 三阶中心距,值为0.,Skewness=0 分布形态与正态分布偏度相同Skewness>0 正偏差数值较大,为正偏或右偏。长尾巴拖在右边。Skewness<0 负偏差数值较大,为负偏或左偏。长尾巴拖在左边。峰度(Kurtosis)是描述某变量所有取值分布形态陡缓程度的统计量。它是和正态分布相比较的。Kurtosis=0,与正态分布的陡缓程度相同。Kurtosis>0,比正态分布的高峰更加陡峭——尖顶峰,Kurtosis<0比正态分布的高峰来得平缓。
数据分布:分布概率(正态分布与三大分布)
卡方分布
设随机变量
X
1
,
X
2
,
.
.
.
,
X
3
X_{1},X_{2},...,X_{3}
X1,X2,...,X3独立,且都服从正态分布 N(0,1),则随机变量
Y
=
X
1
2
+
X
2
2
+
.
.
.
+
X
n
2
Y=X_{1}^2+X_{2}^2+...+X_{n}^2
Y=X12+X22+...+Xn2服从自由度 n的卡方分布,密度函数如下:
X
n
2
(
x
)
=
e
−
x
2
x
n
−
2
2
Γ
(
n
2
)
2
n
2
,
x
>
0
X_{n}^2(x)=\frac{e^{-\frac{x}{2}}x^{\frac{n-2}{2}}}{\Gamma(\frac{n}{2})2^{\frac{n}{2}}}, x>0
Xn2(x)=Γ(2n)22ne−2xx2n−2,x>0
t分布
设随机变量 X1,X2独立,且分别服从卡方分布
X
2
n
X_{2}^n
X2n和正态分布 N(0,1),则随机变量
Y
=
X
2
/
X
2
n
Y=X_{2}/\sqrt{\frac{X_{2}}{n}}
Y=X2/nX2服从自由度n的t分布:
t
n
(
y
)
=
Γ
(
n
+
1
2
)
n
π
Γ
(
n
2
)
(
1
+
y
2
n
)
−
n
+
1
2
t_{n}(y)=\frac {\Gamma(\frac{n+1}{2})}{\sqrt{n\pi}\Gamma(\frac{n}{2})}(1+\frac{y_{2}}{n})^{-\frac{n+1}{2}}
tn(y)=nπΓ(2n)Γ(2n+1)(1+ny2)−2n+1
F分布
设随机变量 X1,X2独立,且分别服从卡方分布
x
n
2
x_{n}^2
xn2和
x
m
2
x_{m}^2
xm2,则随机变量
Y
=
1
m
X
2
/
(
1
n
X
1
)
Y=\frac{1}{m}X_{2}/(\frac{1}{n}X_{1})
Y=m1X2/(n1X1)服从自由度 (m,n)的F分布:
f
m
n
(
y
)
=
m
m
2
+
n
n
2
Γ
(
m
+
n
2
)
Γ
m
2
Γ
n
2
y
m
2
−
1
(
m
y
+
n
)
−
m
+
n
2
,
y
>
0
f_{mn}(y)=m^{\frac{m}{2}}+n^{\frac{n}{2}}\frac{\Gamma(\frac{m+n}{2})}{\Gamma{\frac{m}{2}}\Gamma{\frac{n}{2}}}y^{\frac{m}{2}-1}(my+n)^{-\frac{m+n}{2}},y>0
fmn(y)=m2m+n2nΓ2mΓ2nΓ(2m+n)y2m−1(my+n)−2m+n,y>0
抽样理论
代码实现
import pandas as pd;
df = pd.read_csv("C:/Users/97464/Desktop/dig_analyse/HR_comma_sep.csv")
#可以利用sep指定分隔符
df.head(10)
type(df) # <class 'pandas.core.frame.DataFrame'>
df.mean()
df['last_evaluation'].mean()
df['last_evaluation'].median() # 求均值
df.quantile(q=0.25) # 求四分位数
df['last_evaluation'].quantile(q=0.25)
df.mode() # 求众数,可能不是唯一的,输出结果
a = df['time_spend_company'].mode()
type(a) # 类型为序列<class 'pandas.core.series.Series'>
df.std() # 求标准差
df.var() # 求方程
df.sum() # 求和
df.skew() # 偏态系数
df.kurt() # 峰度系数
import scipy.stats as ss
ss.norm.stats(moments="mvsk")
"""rvs:随机变量(就是从这个分布中抽一些样本)
pdf:概率密度函数。
cdf:累计分布函数
sf:残存函数(1-CDF)
ppf:分位点函数(CDF的逆)
isf:逆残存函数(sf的逆)
stats:返回均值,方差,(费舍尔)偏态,(费舍尔)峰度。
moment:分布的非中心矩。"""
ss.norm.pdf(0)
ss.norm.ppf(0.9) # 1.2815515655446004
ss.norm.ppf(0) # -inf
ss.norm.cdf(2) # 概率从负无穷累积到2等于多少
ss.norm.cdf(2) - ss.norm.cdf(-2) # 0.9544997361036416
ss.norm.rvs(size=10) # 根据分布生成样本
ss.chi2 # 卡方分布
ss.t # t分布
ss.f # f 分布
#上面的三种分布的操作方法都和norm一样
df.sample(10) # 抽样10个
df.sample(frac=0.001) # 根据百分比抽取一定比例
df['last_evaluation'].sample(10) # 同样可以对series抽样
"""去pandas等官网学习一些接口或者查询"""
数据分类
- 定类(类别):根据事物离散、无差别属性进行的分类。
- 定序(顺序):界定数据的大小,不能测定差值。
- 定距(间隔):界定数据大小同时,可测定差值,但无绝对零点
- 定比(比率):界定数据大小,可测定差值,有绝对零点
单属性分析
异常值分析
对比分析
- 绝对数比较
- 相对数比较:结构、比例、比较、动态、强度
比较角度:时间、空间、经验与计划
结构分析
- 部分:总体
- 静态——动态(产业占比变化)
分布分析
- 直接获得概率分布
- 是不是正太分布
- 极大似然
代码实现
import numpy as np
import pandas as pd
df = pd.read_csv("C:/Users/97464/Desktop/dig_analyse/HR_comma_sep.csv")
sl_s = df['satisfaction_level']
sl_s.isnull() # 排除空值
sl_s[sl_s.isnull()] # 选择空值部分
sl_s = sl_s.dropna() # 丢弃空值异常值
sl_s.mean()
sl_s.std()
sl_s.max()
sl_s.min()
sl_s.median()
sl_s.quantile(q=0.25)
sl_s.quantile(q=0.75)
sl_s.skew()
sl_s.kurt()
# 观察上面的值,分析要怎么去除异常值
np.histogram(sl_s.values, bins=np.arange(0, 1.1, 0.1)) # 第二个参数指切分的临界值
"""(array([ 195, 1214, 532, 973, 1667, 2146, 1972, 2074, 2219, 2004],
dtype=int64), array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]))"""
# s上面的输出结果表示,0-0.1之间的数据个数为195个,0.2-0.3为1214个)
ts = df['time_spend_company']
ts.value_counts() # 显示各个值的出现次数
ts.value_counts(normalize=True) # 按出现比例显示
ts.value_counts(normalize=True).sort_index() # 统计显示并排序
简单对比分析:
代码实现
df.groupby("sales").mean() # 根据某列变量进行分组求值
df.loc[:,["last_evaluation","sales"]].groupby("sales").mean()
# 切片操作,将"last_evaluation","sales"两列选出来,在进行分组求均值
可视化分析:
- matplotlib、seaborn、plotly…
柱状图:
代码实现:
import matplotlib.pyplot as plt
import seaborn as sns
plt.title("Salary")
plt.xlabel("salary")
plt.ylabel("Number")
plt.xticks(np.arange(len(df["salary"].value_counts())) + 0.5, df["salary"].value_counts().index)
#xticks是设置横轴记号
#第一项np.arange(len(df["salary"].value_counts()))+0.5 是按照总类数分类
#+o.5 的作用是将图形往右靠一点
plt.axis([0, 3, 0, 10000]) # 横坐标和纵坐标的取值范围
plt.bar(np.arange(len(df["salary"].value_counts())) + 0.5, df["salary"].value_counts(), width=0.3)
"""下面添加数据标签:"""
for x, y in zip(np.arange(len(df["salary"].value_counts())) + 0.5,
df["salary"].value_counts()):
plt.text(x, y, y, ha="center", va="bottom")
#ha='center', va= 'bottom'代表horizontalalignment(水平对齐)、verticalalignment(垂直对齐)的方式
"""下面利用seaborn改变样式
学习网站:http://seaborn.pydata.org/"""
sns.set_style("darkgrid") # 改变背景色
sns.set_context("paper",font_scale=1.2) #改变字体大小
sns.set_palette("Reds") # 该表柱子颜色,可以去官网查找颜色表示
plt.show()
# 也可以用seaborn画柱形图,seaborn是matplotlib的封装,如下:
sns.countplot(x="salary",hue="sales",data=df) #hue实现多个对比
"""参考资料"""
1、seaborn 官方网站
# http://seaborn.pydata.org/generated/seaborn.countplot.html
2、【Kaggle入门级竞赛top5%排名经验分享】— 分析篇
# https://zhuanlan.zhihu.com/p/40360380
3、【超简单超清楚】mac环境matplotlib的中文配置
# https://blog.csdn.net/gmr2453929471/article/details/78655834
4、Seaborn入门系列(二)——barplot&countplot&pointplot
# https://www.jianshu.com/p/8bb06d3fd21b
"""zip()函数介绍"""
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]
"""range()与numpy.arange()的区别"""
range()返回的是range object,而np.nrange()返回的是numpy.adarray()
1、两者都是均匀地(evenly)等分区间;
range尽可用于迭代,而np.arange作用远不止于此,它是一个序列,可被当做向量使用。
range()不支持步长为小数,np.arange()支持步长为小数
2、两者都可用于迭代
3、两者都有三个参数,以第一个参数为起点,第三个参数为步长,截止到第二个参数之前的不包括第二个参数的数据序列
4、某种意义上,和STL中由迭代器组成的区间是一样的,即左闭右开的区间。[first, last)或者不加严谨地写作[first:step:last)
5、语法:seaborn.set_context(context = None,font_scale = 1,rc = None )"""
context:dict,None或者{paper,notebook,talk,poster}之一
参数字典或预配置集的名称。
font_scale:float,optional
单独的缩放因子可以独立缩放字体元素的大小
rc:dict,可选
参数映射以覆盖预设的seaborn上下文字典中的值。这仅更新被视为上下文定义一部分的参数。
直方图
代码实现
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df=pd.read_csv("C:/Users/97464/Desktop/dig_analyse/HR_comma_sep.csv")
f=plt.figure()
f.add_subplot(1,3,1)
sns.set_palette("Reds") #颜色板控制
#下面利用seaborn绘制直方图
sns.distplot(df['satisfaction_level'].dropna(),bins=10,kde=True)
# 如果kde=False则不会有趋势曲线产生
f.add_subplot(1,3,2)
sns.distplot(df['last_evaluation'].dropna(),bins=10,kde=True)
f.add_subplot(1,3,3)
sns.distplot(df['average_montly_hours'].dropna(),bins=10,kde=True)
plt.show()
.
箱线图
注:在箱线图中,箱子的中间有一条线,代表了数据的中位数。箱子的上下底,分别是数据的上四分位数(Q3)和下四分位数(Q1),这意味着箱体包含了50%的数据。因此,箱子的高度在一定程度上反映了数据的波动程度。上下边缘则代表了该组数据的最大值和最小值。有时候箱子外部会有一些点,可以理解为数据中的“异常值”。
代码实现
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
df = pd.read_csv("C:/Users/97464/Desktop/dig_analyse/HR_comma_sep.csv")
sns.boxplot(y=df["last_evaluation"], x=df["salary"],data=df,
hue="salary",palette="Set3",fliersize=10,whis=1.5)
plt.show()
"""sns.boxplot的使用"""
""" seaborn.boxplot(x=None, y=None, hue=None, data=None,
order=None,hue_order=None, orient=None, color=None,
palette=None, saturation=0.75, width=0.8, dodge=True, fliersize=5,
linewidth=None, whis=1.5, notch=False, ax=None, **kwargs)
"""
1、x,y:dataframe中的列名(str)或者矢量数据
2、data:dataframe或者数组
3、palette:调色板,控制图像的色调
4、hue(str):dataframe的列名,按照列名中的值分类形成分类的条形图
5、order, hue_order (lists of strings):用于控制条形图的顺序
6、orient:"v"|"h" 用于控制图像使水平还是竖直显示
(这通常是从输入变量的dtype推断出来的,此参数一般当不传入x、y,只传入data的时候使用)
7、fliersize:float,用于指示离群值观察的标记大小
8、whis:确定离群值的上下界(IQR超过低和高四分位数的比例),
此范围之外的点将被识别为异常值。IQR指的是上下四分位的差值。
9、width:float,控制箱型图的宽度
折线图
代码实现
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
df = pd.read_csv("C:/Users/97464/Desktop/dig_analyse/HR_comma_sep.csv")
sub_df=df.groupby("time_spend_company").mean()
sns.pointplot(sub_df.index,sub_df["last_evaluation"])
plt.show()
"""或者下列画法(带有取值范围)"""
sns.pointplot(x="time_spend_company",y="last_evaluation",data=df)
plt.show()
饼图
代码实现
lbs=df["salary"].value_counts().index
#也可以自己定义标签:lbs=["","",""]
explodes=[0.05 if i=="low" else 0 for i in lbs]
"""explode :(每一块)离开中心距离;用来突出显示某一块或几块"""
plt.pie(df["salary"].value_counts(normalize=True),labels=lbs,autopct="%3.6f%%",explode=explodes)
#上面的normalize表示统计百分比而不是个数,autopct
#autopct指定了数值的精度格式,%3.6f%%表示三位整数,小数点后有6位
plt.suptitle("pie-test") # 添加居中标题
plt.show()
探索性数据分析(多因子与复合分析)
假设检验
假设检验的思想
步骤:建立原假设——选择统计量——根据显著性水平确定拒绝域——计算P值或样本统计值,作出判断
1、建设检验中,通常将不宜轻易加以否定的假设作为原假设
2、两类错误:拒真错误(H0为真,被拒绝掉了),取伪错误(H0为假,没有被拒绝)
3、检验的P值:显著性水平α的不同可能导致不同的结论,在一个假设检验问题中,利用样本观测值能够做出拒绝原假设的最小显著性水平成为检验的P值,由检验的P值与人们心目中的显著性水平
a
a
a进行比较可以做出检验结论:
如果 a ≥ p a\geq p a≥p,则在显著性水平 a a a下拒绝 H 0 H_{0} H0
如果 a < p a< p a<p,则在显著性水平 a a a下接受 H 0 H_{0} H0
正态总体分布均值参数假设检验
用来自总体的样本,检验总体的均值参数是不是可以对的或者被接受
总体标准差已知时的单个正态总体均值的 u u u检验
设
x
1
.
.
.
x
n
x_{1}...x_{n}
x1...xn是来自
N
(
u
,
σ
2
)
N(u,\sigma^2)
N(u,σ2)的样本,考虑如下三种关于
u
u
u的检验问题
H
0
:
u
≤
u
0
v
s
H
1
:
u
>
u
0
H_{0}:u\leq u_{0} \qquad vs \qquad H_{1}:u>u_{0}
H0:u≤u0vsH1:u>u0
H
0
:
u
≥
u
0
v
s
H
1
:
u
<
u
0
H_{0}:u\geq u_{0} \qquad vs \qquad H_{1}:u<u_{0}
H0:u≥u0vsH1:u<u0
H
0
:
u
=
u
0
v
s
H
1
:
u
=
̸
u
0
H_{0}:u=u_{0} \qquad vs \qquad H_{1}:u =\not u_{0}
H0:u=u0vsH1:u≠u0
u
0
u_{0}
u0是已知常数,检验统计量为
u
=
x
‾
−
u
0
σ
/
n
u=\frac{\overline{x}-u_{0}}{\sigma/\sqrt{n}}
u=σ/nx−u0拒绝域为
W
1
=
{
u
≥
u
1
−
a
}
W_{1}=\{u\geq u_{1-a}\}
W1={u≥u1−a}
W
2
=
{
t
≤
u
a
}
W_{2}=\{t\leq u_{a}\}
W2={t≤ua}
W
3
=
{
∣
u
∣
≥
u
1
−
a
/
2
}
W_{3}=\{|u|\geq u_{1-a/2}\}
W3={∣u∣≥u1−a/2}
用P值表示:
p
1
=
P
(
u
≥
u
0
)
=
1
−
Φ
(
u
0
)
p_1=P(u\geq u_{0})=1-\Phi(u_{0})
p1=P(u≥u0)=1−Φ(u0)
p
2
=
P
(
u
≤
u
0
)
=
Φ
(
u
0
)
p_2=P(u\leq u_{0})=\Phi(u_{0})
p2=P(u≤u0)=Φ(u0)
p
3
=
P
(
∣
u
∣
≥
u
0
)
=
2
(
1
−
Φ
(
∣
u
0
∣
)
)
p_3=P(|u|\geq u_{0})=2(1-\Phi(|u_{0}|))
p3=P(∣u∣≥u0)=2(1−Φ(∣u0∣))
其中
Φ
(
)
\Phi()
Φ()为分布函数
例题:从甲地发送一个信号到乙地,设乙地接收到信号值是一个服从正态分布 N ( u , 0. 2 2 ) N(u,0.2^2) N(u,0.22)的随机变量,其中 u u u为甲地发送的真实信号值。现甲地重复发送同一信号5次,乙地收到的信号值为
8.05 8.15 8.2 8.1 8.25 设接收方有理由猜测甲地发送的信号值为8,问能否接受这猜测?
这是一个双侧检验问题: H 0 : u = 8 v s H 1 : u = ̸ 8 H_{0}:u=8\qquad vs \qquad H_{1}:u=\not 8 H0:u=8vsH1:u≠8
实现代码(自写)
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import scipy.stats as ss
import cmath
x = pd.Series([8.05, 8.15, 8.2, 8.1, 8.25])
n = len(x) # 样本个数
xm = x.mean() # 样本均值
u0 = 8 # 总体的猜测的均值
b = 0.2 # 总体的已知标准差
u = cmath.sqrt(n) * (xm - u0) / b
print(u) # 结果为(1.6770509831248464+0j)
fen=ss.norm.cdf(1.68) #
p=2*(1-fen)
print(p) # 结果为0.09295731572744015,大于0.05,不能拒绝原假设(u=8)
总体标准差未知时的单个正态总体均值的 t t t检验
σ
\sigma
σ未知时,
σ
\sigma
σ替换成样本标准差
s
s
s,形成了下面的
t
t
t统计量:
t
=
n
(
x
‾
−
u
0
)
s
t=\frac{\sqrt{n}(\overline{x}-u_{0})}{s}
t=sn(x−u0)对于检验问题:
H
0
:
u
≤
u
0
v
s
H
1
:
u
>
u
0
H_{0}:u\leq u_{0} \qquad vs \qquad H_{1}:u>u_{0}
H0:u≤u0vsH1:u>u0
H
0
:
u
≥
u
0
v
s
H
1
:
u
<
u
0
H_{0}:u\geq u_{0} \qquad vs \qquad H_{1}:u<u_{0}
H0:u≥u0vsH1:u<u0
H
0
:
u
=
u
0
v
s
H
1
:
u
=
̸
u
0
H_{0}:u=u_{0} \qquad vs \qquad H_{1}:u =\not u_{0}
H0:u=u0vsH1:u≠u0拒绝域为
W
1
=
{
t
≥
t
1
−
a
(
n
−
1
)
}
W_{1}=\{t\geq t_{1-a}(n-1)\}
W1={t≥t1−a(n−1)}
W
2
=
{
t
≤
t
1
−
a
(
n
−
1
)
}
W_{2}=\{t\leq t_{1-a}(n-1)\}
W2={t≤t1−a(n−1)}
W
3
=
{
∣
t
∣
≥
t
1
−
a
/
2
(
n
−
1
)
}
W_{3}=\{|t|\geq t_{1-a/2}(n-1)\}
W3={∣t∣≥t1−a/2(n−1)}
例题:某厂生产的某种铝材的长度服从正太分布,其均值设定为240cm.现从该厂抽取5件产品,测得其长度为239.7 239.6 239 240 239.2
试判断该厂此类铝材的长度是否满足设定要求?
显然这是一个正太均值的双侧检验问题,原假设是 H 0 : u = 240 H_{0}:u=240 H0:u=240,备择假设是 H 0 : u = ̸ 240 H_{0}:u= \not 240 H0:u≠240
代码实现:
import scipy.stats as ss
import numpy as np
sample_s = pd.Series([239.7, 239.6, 239, 240, 239.2])
t=ss.ttest_1samp(sample_s,240)#该函数是用来检验双侧的
#这是双边检验的结果。为了得到单边检验的结果,
#需要将计算出来的 pvalue 除于2 取单边的结果(这里取阈值为0.05)。
t t t输出结果为:Ttest_1sampResult(statistic=-2.7950849718747346, pvalue=0.049056807223872116)
两个正态总体均值差的检验(两独立样本t检验)
设
x
1
,
.
.
.
x
m
x_{1},...x_{m}
x1,...xm是来自正态总体
N
(
u
1
,
σ
1
2
)
N(u_{1},\sigma_{1}^2)
N(u1,σ12)的样本,
y
1
,
.
.
.
y
n
y_{1},...y_{n}
y1,...yn是来自正态总体
N
(
u
2
,
σ
2
2
)
N(u_{2},\sigma_{2}^2)
N(u2,σ22)的样本,两个样本相互独立,考虑一下三类检验问题:
H
0
:
u
1
−
u
2
≤
0
v
s
H
1
:
u
1
−
u
2
>
0
H_{0}:u_{1}-u_{2}\leq 0 \qquad vs \qquad H_{1}:u_{1}-u_{2}> 0
H0:u1−u2≤0vsH1:u1−u2>0
H
0
:
u
1
−
u
2
≥
0
v
s
H
1
:
u
1
−
u
2
<
0
H_{0}:u_{1}-u_{2}\geq 0 \qquad vs \qquad H_{1}:u_{1}-u_{2}< 0
H0:u1−u2≥0vsH1:u1−u2<0
H
0
:
u
1
−
u
2
=
0
v
s
H
1
:
u
1
−
u
2
=
̸
0
H_{0}:u_{1}-u_{2}=0 \qquad vs \qquad H_{1}:u_{1}-u_{2}= \not 0
H0:u1−u2=0vsH1:u1−u2≠0
检验统计量为:
t
=
x
‾
−
y
‾
s
w
1
m
+
1
n
t=\frac{\overline{x}-\overline{y}}{s_{w}\sqrt{\frac{1}{m}+\frac{1}{n}}}
t=swm1+n1x−y
例题:某厂铸造车间为提高铸件的耐磨性而是试制了一种镍合金铸件以取代铜合金铸件,为此,从两种铸件中各抽取一个容量分别为8和9的样本,测得其硬度(一种耐磨性指标为):
镍合金:76.43 76.21 73.58 69.69 65.29 70.83 82.75 72.34
铜合金:73.66 64.27 69.34 71.37 69.77 68.12 67.27 68.07 62.61
根据专业经验,硬度服从正太分布,且方差保持不变,试在显著性水平 a = 0.05 a=0.05 a=0.05下判断镍合金的硬度是否有明显提高?
代码实现
data1 = pd.Series([76.43, 76.21, 73.58, 69.69, 65.29, 70.83, 82.75, 72.34])
data2 = pd.Series([73.66, 64.27, 69.34, 71.37, 69.77, 68.12, 67.27, 68.07, 62.61])
# 当不确定两总体方差是否相等时,应先利用levene检验,检验两总体是否具有方差齐性。
ss.levene(data1,data2)
# 如果返回结果的p值远大于0.05,那么我们认为两总体具有方差齐性。
# 如果两总体不具有方差齐性,需要加上参数equal_val并设定为False。。
t=ss.ttest_ind(data1,data2)
成对数据检验(配对样本t检验)
配对样本T检验可视为单样本T检验的扩展,检验的对象由一群来自正态分布独立样本更改为二群配对样本观测值之差。它常用于比较同一受试对象处理的前后差异,或者按照某一条件进行两两配对分别给与不同处理的受试对象之间是否存在差异。
例子:为了比较两种谷物种子的优劣,特选取10块土质不全相同的土地,并将每块土地分为面积相同的两部分,分别种植两种种子,施肥与田间管理在20块小块土地上都是一样的,下面是个小块上的单位产量:
土地 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
种子一的单位产量x | 23 | 35 | 29 | 42 | 39 | 29 | 37 | 34 | 35 | 28 |
种子二的单位产量x | 30 | 39 | 35 | 40 | 38 | 34 | 36 | 33 | 41 | 31 |
差 d = x − y d=x-y d=x−y | -7 | -4 | -6 | 2 | 1 | -5 | 1 | 1 | -6 | -3 |
假设单位产量服从正态分布,试问:两种种子的平均单位产量在显著性水平
a
=
0.05
a=0.05
a=0.05上有无显著差异?
1、首先,先用二样本t检验来解决此问题,假设为:
H
0
:
u
1
=
u
2
v
s
H
1
:
u
1
=
̸
u
2
H_{0}:u_{1}=u_{2}\qquad vs \qquad H_{1}:u_{1}=\not u_{2}
H0:u1=u2vsH1:u1≠u2
代码实现:
import scipy.stats as ss
import numpy as np
data3=pd.Series([23, 35, 29,42, 39,29,37,34 ,35 ,28])
data4=pd.Series([30 ,39 ,35, 40, 38,34 ,36, 33 ,41, 31])
#ss.levene(data3,data4) 这部可以省略掉,因为这里假定两个总体的方差相等时合理的
t=ss.ttest_ind(data3,data4)
#输出结果为:Ttest_indResult(statistic=-1.1936600671765385,
pvalue=0.2481061643294022)
可知,使用该方法不能拒绝原假设,即认为两种种子的单位产量平均值没有显著差别。
2、使用配对t检验,在正态性假定下,
d
=
x
−
y
∼
N
(
u
,
σ
d
2
)
d=x-y\sim N(u,\sigma_{d}^2)
d=x−y∼N(u,σd2),其中
u
=
u
1
−
u
2
,
σ
d
2
=
σ
1
2
+
σ
2
2
u=u_{1}-u_{2},\sigma_{d}^2=\sigma_{1}^2+\sigma_{2}^2
u=u1−u2,σd2=σ12+σ22 原先要比较的
u
1
u_{1}
u1和
u
2
u_{2}
u2的大小,转化为观察
u
u
u是否为0,即把双样本的检验问题转化为单样本T检验问题。这时的检验t统计量为:
t
=
d
‾
/
(
s
d
/
n
)
t=\overline{d}/(s_{d}/\sqrt{n})
t=d/(sd/n)
其中
d
‾
=
1
n
∑
i
=
1
n
d
i
,
s
d
=
(
1
n
−
1
∑
i
=
1
n
(
d
i
−
d
‾
)
2
)
1
/
2
\overline{d}=\frac{1}{n}\sum_{i=1}^{n}d_{i},\qquad s_{d}=(\frac{1}{n-1}\sum_{i=1}^{n} (d_{i}-\overline{d})^2)^{1/2}
d=n1i=1∑ndi,sd=(n−11i=1∑n(di−d)2)1/2
代码实现:
import scipy.stats as ss
import numpy as np
data3=pd.Series([23, 35, 29,42, 39,29,37,34 ,35 ,28])
data4=pd.Series([30 ,39 ,35, 40, 38,34 ,36, 33 ,41, 31])
ss.ttest_rel(data3, data4)
#输出结果为:Ttest_relResult(statistic=-2.3475241351724994,
pvalue=0.043481079673054035)
可知,P值小于0.05,拒绝原假设,与上面方法的结论不同
正态总体分布方差参数假设检验
单个正态总体方差的 χ 2 \chi^2 χ2检验
设
x
1
.
.
.
x
n
x_{1}...x_{n}
x1...xn是来自
N
(
u
,
σ
2
)
N(u,\sigma^2)
N(u,σ2)的样本,对方差亦考虑如下三个检验问题:
H
0
:
σ
2
≤
σ
0
2
v
s
H
1
:
σ
2
>
σ
0
2
H_{0}:\sigma^2\leq \sigma_{0}^2\qquad vs \qquad H_{1}:\sigma^2>\sigma_{0}^2
H0:σ2≤σ02vsH1:σ2>σ02
H
0
:
σ
2
≥
σ
0
2
v
s
H
1
:
σ
2
<
σ
0
2
H_{0}:\sigma^2\geq \sigma_{0}^2\qquad vs \qquad H_{1}:\sigma^2<\sigma_{0}^2
H0:σ2≥σ02vsH1:σ2<σ02
H
0
:
σ
2
=
σ
0
2
v
s
H
1
:
σ
2
=
̸
σ
0
2
H_{0}:\sigma^2= \sigma_{0}^2\qquad vs \qquad H_{1}:\sigma^2=\not \sigma_{0}^2
H0:σ2=σ02vsH1:σ2≠σ02
其中
σ
0
2
\sigma_{0}^2
σ02是已知的常数,通常假定
u
u
u是未知的,采用检验统计量为:
χ
2
=
(
n
−
1
)
s
2
/
σ
0
2
\chi^2=(n-1)s^2/\sigma_{0}^2
χ2=(n−1)s2/σ02
拒绝域为:
W
1
=
{
χ
2
≥
χ
1
−
a
2
(
n
−
1
)
}
W_{1}=\{\chi ^2\geq \chi_{1-a}^2(n-1)\}
W1={χ2≥χ1−a2(n−1)}
W
2
=
{
χ
2
≤
χ
1
−
a
2
(
n
−
1
)
}
W_{2}=\{\chi ^2\leq \chi_{1-a}^2(n-1)\}
W2={χ2≤χ1−a2(n−1)}
W
3
=
{
χ
2
≤
χ
a
/
2
2
(
n
−
1
)
}
或
{
χ
2
≥
χ
1
−
a
/
2
2
(
n
−
1
)
}
W_{3}=\{\chi ^2\leq \chi_{a/2}^2(n-1)\} 或\{\chi ^2\geq \chi_{1-a/2}^2(n-1)\}
W3={χ2≤χa/22(n−1)}或{χ2≥χ1−a/22(n−1)}
例子:某类钢板每块的重量X服从正态分布,其一项质量指标是钢板重量的方差不得超过0.016,现在从某天生产的钢板中随机抽取25块,得其样本方差 s 2 = 0.025 s^2=0.025 s2=0.025,问该天生产的钢板重量得方差是否满足要求?
设原假设为: σ 2 ≤ 0.016 \sigma ^2\leq 0.016 σ2≤0.016,备择假设为: σ 2 > 0.016 \sigma ^2> 0.016 σ2>0.016
代码实现:
import scipy.stats as ss
import numpy as np
k2=(25-1)*0.025/0.016 #37.50000000000001
ss.chi2.ppf(0.95,24)# 36.41502850180731
因为37.5大于36.41,拒绝原假设,重量不符合要求
两个正态总体方差比的 F 检验
设
x
1
.
.
.
x
m
x_{1}...x_{m}
x1...xm是来自
N
(
u
,
σ
1
2
)
N(u,\sigma_{1}^2)
N(u,σ12)的样本,
y
1
.
.
.
y
n
y_{1}...y_{n}
y1...yn是来自
N
(
u
,
σ
2
2
)
N(u,\sigma_{2}^2)
N(u,σ22)的样本,考虑如下三个检验问题:
H
0
:
σ
1
2
≤
σ
2
2
v
s
H
1
:
σ
1
2
>
σ
2
2
H_{0}:\sigma_{1}^2\leq \sigma_{2}^2\qquad vs \qquad H_{1}:\sigma_{1}^2>\sigma_{2}^2
H0:σ12≤σ22vsH1:σ12>σ22
H
0
:
σ
1
2
≥
σ
2
2
v
s
H
1
:
σ
1
2
<
σ
2
2
H_{0}:\sigma_{1}^2\geq \sigma_{2}^2\qquad vs \qquad H_{1}:\sigma_{1}^2<\sigma_{2}^2
H0:σ12≥σ22vsH1:σ12<σ22
H
0
:
σ
1
2
=
σ
2
2
v
s
H
1
:
σ
1
2
=
̸
σ
2
2
H_{0}:\sigma_{1}^2= \sigma_{2}^2\qquad vs \qquad H_{1}:\sigma_{1}^2=\not \sigma_{2}^2
H0:σ12=σ22vsH1:σ12≠σ22
其中
σ
2
2
\sigma_{2}^2
σ22是已知的常数,通常假定
u
u
u是未知的,采用检验统计量为:
F
=
s
x
2
s
y
2
F=\frac{s_{x}^2}{s_{y}^2}
F=sy2sx2
拒绝域为:
W
1
=
{
F
≥
F
1
−
a
(
m
−
1
,
n
−
1
)
}
W_{1}=\{F\geq F_{1-a}(m-1,n-1)\}
W1={F≥F1−a(m−1,n−1)}
W
2
=
{
F
≤
F
1
−
a
(
m
−
1
,
n
−
1
)
}
W_{2}=\{F\leq F_{1-a}(m-1,n-1)\}
W2={F≤F1−a(m−1,n−1)}
W
3
=
{
F
≤
F
a
/
2
(
m
−
1
,
n
−
1
)
}
或
{
F
≥
F
1
−
a
/
2
(
m
−
1
,
n
−
1
)
}
W_{3}=\{F\leq F_{a/2}(m-1,n-1)\}或\{F\geq F_{1-a/2}(m-1,n-1)\}
W3={F≤Fa/2(m−1,n−1)}或{F≥F1−a/2(m−1,n−1)}
例子:甲、乙两台机床加工某种零件,零件的直径服从正态分布,总体的方差反映了加工精度,为比较两台机床的加工精度有无差别,现从各自加工的零件中分别抽取7件产品和8件产品,测得其直径为
X(机床甲):16.2 16.8 15.8 15.5 16.7 15.6 15.8
Y(机床乙):15.9 16.0 16.4 16.1 16.5 15.8 15.7 15.0
设原假设为: σ 1 2 = σ 2 2 \sigma_{1} ^2=\sigma _{2}^2 σ12=σ22,备择假设为: σ 1 2 = ̸ σ 2 2 \sigma_{1} ^2=\not \sigma _{2}^2 σ12≠σ22
代码实现:
import pandas as pd
import scipy.stats as ss
x = pd.Series([16.2, 16.8, 15.8, 15.5, 16.7, 15.6, 15.8])
y = pd.Series([15.9, 16.0, 16.4, 16.1, 16.5, 15.8, 15.7, 15.0])
f = x.std()**2 / y.std()**2 # 求检验统计量的值
m=7 #第一个样本个数
n=8 #第二个样本个数
a=0.05 #显著性水平
f1=ss.f.ppf(1-0.5*a,m-1,n-1) #临界值1
f2=ss.f.ppf(0.5*a,m-1,n-1) #临界值2
print(f,f1,f2) #输出
#1.2607260726072604 5.1185966133841045 0.17557812030115116
#可知,样本未落入拒绝域内,即在0.05的显著性水平下可以认为两台
#机床的加工精度无显著差异
卡方 χ 2 \chi^2 χ2检验(非参数检验)
主要是比较两个及两个以上样本率( 构成比)以及两个分类变量的关联性分析。其根本思想就是在于比较理论频数和实际频数的吻合程度或拟合优度问题。
χ
2
\chi^2
χ2计算的公式为
∑
(
f
0
−
f
e
)
2
f
e
\sum\frac{(f_{0}-f_{e})^2}{f_{e}}
∑fe(f0−fe)2
其中
f
0
f_{0}
f0为实际观察频次,
f
e
f_{e}
fe为理论值,根据这个公式,可认为卡方检验的一般问题是要检验名义型变量的实际观测次数和理论次数分布之间是否存在显著差异。
一般卡方检验方法进行统计检验时,要求样本容量不宜太小,理论次数⩾5,否则需要进行校正。如果个别单元格的理论次数小于5,处理的方法有以下四种:
- 单元格合并法
- 增加样本数
- 去除样本数
- 使用校正公式,当某一期次数小于5时,应该利用校正公式计算卡方值。校正公式为: ∑ ( ∣ f 0 − f e ∣ − 0.5 ) 2 f e \sum\frac{(|f_{0}-f_{e}|-0.5)^2}{f_{e}} ∑fe(∣f0−fe∣−0.5)2
卡方独立性检验
独立性检验 验证从两个变量抽出的配对观察值组是否互相独立(例如:每次都从A国和B国各抽一个人,看他们的反应是否与国籍无关)。
独立性检验主要用于两个或两个以上因素多项分类的计数资料分析,也就是研究两类变量之间的关联性和依存性问题。如果两变量无关联即相互独立,说明对于其中一个变量而言,另一变量多项分类次数上的变化是在无差范围之内;如果两变量有关联即不独立,说明二者之间有交互作用存在。
独立性检验一般采用 列联表 的形式记录观察数据, 列联表是由两个以上的变量进行交叉分类的频数分布表,是用于提供基本调查结果的最常用形式,可以清楚地表示定类变量之间是否相互关联。又可具体分为:
- 四格表的独立性检验:又称为 2*2 列联表的卡方检验。四格表资料的独立性检验用于进行两个率或两个构成比的比较,是列联表的一种最简单的形式。
- 行x列表资料的独立性检验:又称为 RxC 列联表的卡方检验。行x列表资料的独立性检验用于多个率或多个构成比的比较
例子:求检验杀虫效果是否跟农药类型有关
杀虫效果 | 甲 | 乙 | 丙 | 统计 |
---|---|---|---|---|
死亡数 | 37 | 49 | 23 | 109 |
未死亡数 | 150 | 100 | 57 | 307 |
统计 | 187 | 149 | 80 | 416 |
假设: H 0 H_{0} H0:变量相互独立 VS H 1 H_{1} H1:变量相互不独立
代码实现:
import numpy as np
import scipy.stats as ss
ss.chi2_contingency([[37, 49, 23],[150, 100 ,57]])
#输出结果为:
(7.6919413561281065, 0.021365652322337315, 2,
array([[ 48.99759615, 39.04086538, 20.96153846],
[138.00240385, 109.95913462, 59.03846154]]))
输出结果的 第一个值为卡方值,第二个值为P值,第三个值为自由度,第四个为与原数据数组同维度的对应理论值
-
一个R*C的列联表自由度为(r-1)*(c-1),在这个例子中自由度即为 (农药类型个数-1)*(杀虫效果个数-1)=(3-1)*(2-1)=2
-
由P值大小可以,拒绝原假设,即杀虫效果跟农药类型有关
检验步骤:
- Step1:建议原假设
H0:两变量相互独立;H1:两变量相互不独立- Step2:计算自由度与理论频数
自由度: d f = ( r − 1 ) ( c − 1 ) df=(r−1)(c−1) df=(r−1)(c−1),理论频数: e i j = F Y i ⋅ F X j n e_{ij}=\frac {F_{Y_{i}}\cdot F_{X_{j}}}{n} eij=nFYi⋅FXj- Step3:计算统计量
χ 2 = ∑ i = 1 r ∑ j = 1 c ( f i j − e i j ) 2 e i j ∼ χ 2 ( d f ) \chi^2=\sum_{i=1}^{r}\sum_{j=1}^{c}\frac{(f_{ij}-e_{ij})^2}{e_{ij}}\sim \chi^2(df) χ2=i=1∑rj=1∑ceij(fij−eij)2∼χ2(df)- Step4:查χ2分布临界值表,确定接受域和拒绝域
接受域:
χ 1 − a 2 2 ( d f ) < χ 2 < χ a 2 2 ( d f ) \chi_{1-\frac{a}{2}}^2(df)<\chi^2<\chi_{\frac{a}{2}}^2(df) χ1−2a2(df)<χ2<χ2a2(df)
应用条件
要求 样本含量 应大于40且每个格子中的 理论频数 不应小于5。当样本含量大于40但理论频数有小于5的情况时卡方值需要校正,及上面的校正公式
计算步骤演示:https://www.cnblogs.com/Yuanjing-Liu/articles/9252844.html
上面
卡方拟合性检验
卡方检验能检验单个多项分类名义型变量各分类间的实际观测次数与理论次数之间是否一致的问题,这里的观测次数是根据样本数据得多的实计数,理论次数则是根据理论或经验得到的期望次数 。这一类检验称为拟合性检验。其自由度通常为分类数减去1,理论次数通常根据某种经验或理论。
总而言之,卡方拟合度检验用于判断不同类型结果的比例分布相对于一个期望分布的拟合程度。
应用条件
- 卡方拟合性检验适用于 变量为类别型变量 的情况。 例如:变量为有罪或无罪。
- 当每个类别中观察到的或预期的频率太小时,此检验无效。要求样本含量应大于40且每个格子中的理论频数不应小于5
例子:随机抽取60名高一学生,问他们文理要不要分科,回答赞成的39人,反对的21人,问对分科的意见是否有显著的差异。
理论次数采用均值法:60/2=30, ( 39 − 30 ) 2 30 − ( 21 − 30 ) 2 30 = 5.4 > χ 0.05 2 ( 1 ) = 3.84 \frac{(39-30)^2}{30}-\frac{(21-30)^2}{30}=5.4>\chi_{0.05}^2(1)=3.84 30(39−30)2−30(21−30)2=5.4>χ0.052(1)=3.84拒绝原假设,认为学生的态度有显著差异。
代码实现:
import scipy.stats as ss
#scipy.stats.chisquare(f_obs, f_exp=None, ddof=0, axis=0)[source]
#当给出f_obs时,假设预期频率是均匀的并且由观察频率的平均值给出。
ss.chisquare([39,21]) #
#使用f_exp可以自己给出预期的频率,如下:
chisquare([16, 18, 16, 14, 12, 12], f_exp=[16, 16, 16, 16, 16, 8])
卡方独立性检验与拟合性检验的异同
-
从表面上看,拟合性检验和独立性检验不论在列联表的形式上,还是在计算卡方的公式上都是相同的,所以经常被笼统地称为卡方检验。但是两者还是存在差异的。
-
首先,两种检验抽取样本的方法不同。如果抽样是在各类别中分别进行,依照各类别分别计算其比例,属于拟合优度检验。如果抽样时并未事先分类,抽样后根据研究内容,把入选单位按两类变量进行分类,形成列联表,则是独立性检验。
-
其次,两种检验假设的内容有所差异。拟合优度检验的原假设通常是假设各类别总体比例等于某个期望概率,而独立性检验中原假设则假设两个变量之间独立。
-
最后,期望频数的计算不同。拟合优度检验是利用原假设中的期望概率,用观察频数乘以期望概率,直接得到期望频数。独立性检验中两个水平的联合概率是两个单独概率的乘积。
方差检验(比较多个总体均值)
理论:
- 偏差平方和:用来度量若干个数据分散的程度 Q = ∑ i = 1 k ( y i − y ‾ ) 2 Q=\sum_{i=1}^{k}(y_{i}-\overline{y})^2 Q=i=1∑k(yi−y)2
- 由偏差平方和的定义引出下面的三个平方和
- 总平方和: S T = ∑ i = 1 r ∑ j = 1 m ( y i j − y ‾ ) 2 , f T = n − 1 S_{T}=\sum_{i=1}^{r}\sum_{j=1}^{m}(y_{ij}-\overline{y})^2, f_{T}=n-1 ST=i=1∑rj=1∑m(yij−y)2,fT=n−1其中 y ‾ \overline{y} y为所有数据的均值, f T f_{T} fT为自由度, r r r代表因子有多少个水平,m为第 i i i个水平的试验个数
- 组内平方和: S e = ∑ i = 1 r ∑ j = 1 m ( y i j − y ‾ i ⋅ ) 2 , f e = n − r S_{e}=\sum_{i=1}^{r}\sum_{j=1}^{m}(y_{ij}-\overline{y}_{i\cdot})^2, f_{e}=n-r Se=i=1∑rj=1∑m(yij−yi⋅)2,fe=n−r
- 组间平方和: S A = m ∑ i = 1 r ( y ‾ i ⋅ − y ‾ ) 2 , f A = r − 1 S_{A}=m\sum_{i=1}^{r}(\overline{y}_{i\cdot}-\overline{y})^2, f_{A}=r-1 SA=mi=1∑r(yi⋅−y)2,fA=r−1
- 为了比较不同偏差平方和,下面引入 均方 M S = Q f Q MS=\frac{Q}{f_{Q}} MS=fQQ
- 再由均方的定义得到下列不同的均方:
- M S A = S A f A MS_{A}=\frac{S_{A}}{f_{A}} MSA=fASA
- M S e = S e f e MS_{e}=\frac{S_{e}}{f_{e}} MSe=feSe
-
最后,根据上面两个组间与组内的均方,得到检验统计量F F = M S A M S e F=\frac{MS_{A}}{MS_{e}} F=MSeMSA
-
比较各水平下的均值是否相同,对如下假设进行检验:
H 0 : u 1 = u 2 = ⋅ ⋅ ⋅ u r H_{0}:u_{1}=u_{2}=\cdot \cdot \cdot u_{r} H0:u1=u2=⋅⋅⋅ur -
备择假设是 H 1 : u 1 , u 2 ⋅ ⋅ ⋅ u r 不 全 相 等 H_{1}:u_{1},u_{2}\cdot \cdot \cdot u_{r}不全相等 H1:u1,u2⋅⋅⋅ur不全相等
单因素方差分析
例子:在饲料养鸡增肥的研究中,有三种饲料配方: A 1 、 A 2 、 A 3 A_{1}、A_{2}、A_{3} A1、A2、A3,位比较三种饲料的效果,特选24只相似的雏鸡随机均分为三组,每组喂一种饲料,60天后观察它们的重量,实验结果如下:
饲料A | 鸡重 | |||||||
---|---|---|---|---|---|---|---|---|
A 1 A_{1} A1 | 1073 | 1009 | 1060 | 1001 | 1002 | 1012 | 1009 | 1028 |
A 2 A_{2} A2 | 1107 | 1092 | 990 | 1109 | 1090 | 1074 | 1122 | 1001 |
A 3 A_{3} A3 | 1093 | 1029 | 1080 | 1021 | 1022 | 1032 | 1029 | 1048 |
问:三种饲料对鸡的增肥作用是否相同
分析: 该题中的饲料A就是我们所说的因子,这里为单因子方差分析,因子A有三个水平
A
1
、
A
2
、
A
3
A_{1}、A_{2}、A_{3}
A1、A2、A3,
代码实现:
import scipy.stats as ss
ss.f_oneway([1073, 1009, 1060, 1001, 1002, 1012, 1009, 1028], [1107, 1092, 990, 1109, 1090, 1074, 1122, 1001],
[1093, 1029,1080, 1021, 1022, 1032, 1029, 1048])
#F_onewayResult(statistic=3.5948158616381747, pvalue=0.04543221091994169)
由P值=0.045可知,拒绝原假设,认为因子A(饲料)是显著的,即三种饲料对鸡的增肥作用有显著的差别。
多因素方差分析
例子: 饮料的销量有可能受到销售地区或者饮料颜色的影响。在方差分析中,若把饮料的颜色看做影响销量的因素A,把销售地区看做影响因素B。同时对因素A和因素B进行分析,就称为双因素方差分析。使用的数据如下:(放在excel导入)
a b c
a1 b1 20
a1 b2 22
a1 b3 24
a1 b4 16
a1 b5 26
a2 b1 12
a2 b2 10
a2 b3 14
a2 b4 4
a2 b5 22
a3 b1 20
a3 b2 20
a3 b3 18
a3 b4 8
a3 b5 16
a4 b1 10
a4 b2 12
a4 b3 18
a4 b4 6
a4 b5 20
a5 b1 14
a5 b2 6
a5 b3 10
a5 b4 18
a5 b5 10
代码实现:
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
import pandas as pd
df=pd.read_excel("C:/Users/97464/Desktop/ann.xlsx")
formula= 'c~ a + b '#注意formula的写法
anova_results = anova_lm(ols(formula,df).fit())
print(anova_results)
结果如下:
df | sum_sq | mean_sq | F | PR(>F) | |
---|---|---|---|---|---|
a | 4.0 | 335.36 | 83.84 | 3.874307 | 0.021886 |
b | 4.0 | 199.36 | 49.84 | 2.303142 | 0.103195 |
Residual | 16.0 | 346.24 | 21.64 | NaN | NaN |
结果分析:
素A的p值0.021886<0.05,拒绝原假设,说明饮料颜色对销量有显著影响;而因素B的p值0.103195>0.05,不能拒绝原假设,因此没有充分的理由说明销售地区对销量有显著影响。
多重比较
从上面的双因素方差分析,可以知道,颜色对销量有影响,那分别是什么样的颜色呢?
多重比较(multiple comparisons)是指方差分析后对各样本平均数间是否有显著差异的假设检验的统称。方差分析只能判断各总体平均数间是否有差异,多重比较可用来进一步确定哪两个平均数间有差异,哪两个平均数间没有差异。 比较方法有 N-K(Newman-Keuls)检验、邓肯(DunCan)检验、图基(Tukey)检验邓尼特(Dunnett)检验、最小显著差检验及谢费(Scheffé)检验等它们的理论依据和应用条件都有所不同。
例子: 继续对上面的颜色进行多重比较
代码实现:
from statsmodels.stats.multicomp import pairwise_tukeyhsd
print(pairwise_tukeyhsd(df['c'], df['a']))
# 输出结果如下:
Multiple Comparison of Means - Tukey HSD, FWER=0.05
=====================================================
group1 group2 meandiff p-adj lower upper reject
-----------------------------------------------------
a1 a2 -9.2 0.076 -19.0855 0.6855 False
a1 a3 -5.2 0.5267 -15.0855 4.6855 False
a1 a4 -8.4 0.1207 -18.2855 1.4855 False
a1 a5 -10.0 0.0466 -19.8855 -0.1145 True
a2 a3 4.0 0.7225 -5.8855 13.8855 False
a2 a4 0.8 0.9 -9.0855 10.6855 False
a2 a5 -0.8 0.9 -10.6855 9.0855 False
a3 a4 -3.2 0.8531 -13.0855 6.6855 False
a3 a5 -4.8 0.5919 -14.6855 5.0855 False
a4 a5 -1.6 0.9 -11.4855 8.2855 False
-----------------------------------------------------
a1和a5的reject=True,表明拒绝原假设,即a1和a5两种颜色有显著差异
齐性检验
在上述方差分析中,单个因子试验中 r r r个水平的指标可以用 r r r个正态分布 N ( u i , σ i 2 ) , i = 1 , 2 , ⋅ ⋅ ⋅ , r N(u_{i},\sigma_{i}^2),i=1,2,\cdot \cdot\cdot,r N(ui,σi2),i=1,2,⋅⋅⋅,r表示。在进行方差分析时,要求 r r r个方差相等,这就称为方差齐性,而方差齐性不一定自然具有,理论研究表明,当正态性假定不满足时,对均值相等的F检验影响较小,即F检验对正态性的偏离具有一定的稳健性,而F检验对方差齐性的偏离较为敏感,所以 r r r个方差的齐性检验就显得十分重要。
直观点讲,方差分析就是在大家误差水平差不多的条件下看控制和对照组是不是有显著差异。那方差其实就是误差水平了。当方差不一致的时候,这个方法就没法分辨出究竟是控制造成的差异还是,内在的波动造成的差异
拓展:方差分析的基本假定:
- 可加性——方差分析的每一次观察值都包含了总体平均数、各因素主效应、各因素间的交互效应、随机误差等许多部分,这些组成部分必须以叠加的方式综合起来,即每一个观察值都可视为这些组成部分的累加和。
- 正态性——即随机误差 ε 必须为相互独立的正态随机变量。这也是很重要的条件,如果它不能满足,则均方期望的推导就不能成立,采用 F 统计量进行检验也就失去了理论基础。
- 方差同质性(齐性)——即要求所有处理随机误差的方差都要相等,换句话说不同处理不能影响随机误差的方差。由于随机误差的期望一定为 0 ,这实际是要求随机误差有共同的分布。
方差齐性检验就是对如下假设进行检验:
H
0
:
σ
1
2
=
σ
2
2
=
⋅
⋅
⋅
=
σ
r
2
v
s
H
1
:
诸
σ
i
2
不
全
相
等
H_{0}:\sigma_{1}^2=\sigma_{2}^2=\cdot\cdot\cdot=\sigma_{r}^2\qquad vs\qquad H_{1}:诸\sigma_{i}^2不全相等
H0:σ12=σ22=⋅⋅⋅=σr2vsH1:诸σi2不全相等
检验方法通常由如下:
- Hartley(哈特利检验),适用于样本量相等的场合
- Barlett(巴特利特)检验,可用于样本量相等或不等的场合,但是每个样本量不得低于5
- 修正的Barlett检验,在样本量较小或较大、相等或不等场合均可使用
Barlett(巴特利特)检验
例子:研究各个产地的绿茶叶酸含量是否有显著差异,特选四个产地的绿茶,也算含量测试结果如下:
水平 | 数据 | ||||||
---|---|---|---|---|---|---|---|
A 1 A_{1} A1 | 7.9 | 6.2 | 6.6 | 8.6 | 8.9 | 10.1 | 9.6 |
A 2 A_{2} A2 | 5.7 | 7.5 | 9.8 | 6.1 | 8.4 | ||
A 3 A_{3} A3 | 6.4 | 7.1 | 7.9 | 4.5 | 5.0 | 4.0 | |
A 4 A_{4} A4 | 6.8 | 7.5 | 5.0 | 5.3 | 6.1 | 7.4 |
代码实现:
import scipy.stats as ss
ss.bartlett([7.9, 6.2, 6.6, 8.6, 8.9, 10.1, 9.6], [5.7, 7.5, 9.8, 6.1, 8.4],
[6.4, 7.1, 7.9, 4.5, 5.0, 4.0],
[6.8, 7.5, 5.0, 5.3, 6.1, 7.4])
#输出结果为:BartlettResult(statistic=0.9650136761335196, pvalue=0.8097167441591846)
#统计量成为B,且P值可以通过以下方法得出:
pvalue=1-ss.chi2.cdf(0.96501367,3)
由P值可知,应接受原假设,即认为各水平下的方差间无显著差异
学习链接: https://segmentfault.com/a/1190000007626742
Q-Q图
统计学里Q-Q图(Q代表分位数)是一个概率图,用图形的方式比较两个概率分布,把他们的两个分位数放在一起比较。首先选好分位数间隔。图上的点(x,y)反映出其中一个第二个分布(y坐标)的分位数和与之对应的第一分布(x坐标)的相同分位数。因此,这条线是一条以分位数间隔为参数的曲线。比如说:比如说某个点是数据集1的上四分位点,那么也一定是数据集2的上四分位点
如果两个分布相似,则该Q-Q图趋近于落在y=x线上。如果两分布线性相关,则点在Q-Q图上趋近于落在一条直线上,但不一定在y=x线上。Q-Q图可以用来可在分布的位置-尺度范畴上可视化的评估参数。
QQ图有两个作用:
- 检验一组数据是否服从某一分布
- 检验两个分布是否服从同一分布
QQ图原理:
QQplot的横坐标是theoretical quantilies,纵坐标是sample quantilies*
- sample quantilies是你的 样本原始的数据 学习链接 假设你有100个数据,那么每个数据都看做一个分为点,sample quantilies就是100个数据本身(1%的分为点就是100个数中最小的那个数,2%的分为点就是100个数中第二小的那个数,依次类推)
- theoretical quantilies是什么呢?他是 标准正态分布的分位数
100个数取哪些分为点呢?具体的计算方法是这样的,(1:100-0.5)/100 你可以得到0.005 0.015 0.025 …0.995,然后分别计算在0.005 0.015 0.025 …0.995的面积下(也就是0.005 0.015 0.025 …0.995的概率下)标准正态分布的分位数是什么。这样你就得到了theoretical quantilies。
代码实现:
import numpy as np
import scipy.stats as ss
import matplotlib.pyplot as plt
- 下面绘制标准正态累计分布图
x=np.arange(-5,5,0.1)
y=ss.norm.cdf(x,0,1)
plt.plot(x,y)
plt.show()
- 下面随机生成样本,并绘制样本的累计分布图
sample=ss.norm.rvs(size=100)
sort_sample=np.sort(sample)
yvalue=np.arange(len(sort_sample))/float(len(sort_sample))
plt.plot(sort_sample,yvalue)
plt.show()
- 下面得到样本函数y值得分位点,并手动绘制QQ图
x_yvalue_norm=ss.norm.ppf(yvalue)"""对样本函数值求标准正态分函数的逆(分位点函数)"""
plt.scatter(x_yvalue_norm,sort_sample)
plt.show()
- 利用函数scipy.stats.probplot()直接生成QQ图
ss.probplot(sort_sample,dist="norm",plot=plt)
plt.show()
"""probplot()函数"""
scipy.stats.probplot(x, sparams=(), dist='norm', fit=True, plot=None, rvalue=False)[source]
"""
1、x是样本数据
2、sparams,元组,可选。为特定于分布的形状参数
3、dist,分布或分布名称,对于正态概率图,默认值为“norm"
4、plot:如果给出,则绘制分位数和最小二乘拟合图,默认值为无,表示不创建任何图
"""
- 利用qqplot()函数直接生成QQ图
from statsmodels.graphics.api import qqplot
qqplot(sort_sample)
plt.show()
从上面的QQ图可以看出,所有点基本落在同一条直线上,即认为两个分布为同一分布,样本数据服从正态分布。
相关系数
代码实现:
s1=pd.Series([1 ,2 ,3,5 ,7, 9])
s2=pd.Series([0,3,4,8,10,8])
s1.corr(s2)
#0.8837051853525956
指定方法为spearman
s1.corr(s2,method="spearman")
#0.8986451052612952
使用Dataframe的方法来求
df=pd.DataFrame(np.array([s1,s2]).T) #corr()是对Dataframe的列求相关系数的,所以要转置
"""df
0 1
0 1 0
1 2 3
2 3 4
3 5 8
4 7 10"""
df.corr()
"""输出结果为:
0 1
0 1.000000 0.883705
1 0.883705 1.000000"""