3.2 数据的假设检验
使用Python进行简单的常用的假设检验,主要有数据正态性检验、独立两样本t检验、单因素方差分析、相关性检验。
P:拒绝原假设(H0)时犯错误的可能性,这个P值很小(P<0.05代表P很小),则可以认为原假设时错误的。
1.K-S检验
用来判断一组数据是否服从正态分布
使用Scipy库中的stats模块
K-S检验
Kolmogorov-Smirnov检验
它是检验单一样本是否来自某一特定分布的方法。比如检验一组数据是否为正态分布。
(它的检验方法是以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。)
即对于假设检验问题:
H0:样本所来自的总体分布服从某特定分布(正态分布)
H1:样本所来自的总体分布不服从某特定分布(正态分布)
使用方式
stats.kstest(rvs, cdf, args=(), N=20, alternative=‘two-sided’, mode=‘approx’)
#3.2假设检验
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
from scipy import stats
## 检验数据是否是正态分布
np.random.seed() # 初始化随机数生成器
x = stats.norm.rvs(size=100) # 产生服从这种分布的一个样本,对随机变量进行随机取值,可以通过size参数指定输出的数组大小。
print(x)
## 查看数据的直方图
plt.figure()
plt.hist(x,bins=20)
plt.xlabel("x")
plt.ylabel("frequenry")
plt.title("hist plot")
plt.show()
## 对数据进行正态性检验
stats.kstest(x,'norm') #K-S检验
P=0.79,远远大于0.05,符合正态分布
如果,达到最佳95%
np.random.seed(19) # 初始化随机数生成器,
程序会把这个特殊的数字——19作为种子,生成对应的初始值,19——对应生成正态分布随机数
P很大如果拒绝原假设就有95%的可能性是错的,所以不能拒绝原假设,认为该组数据是服从正态分布的。
2. 两独立样本t检验
stats.ttest_ind(a, b, axis=0, equal_var=True, nan_policy=‘propagate’)
Calculates the T-test for the means of two independent samples of scores.
对两个独立的数据进行t检验,比较两组样本的均值是否相等,本检验假定两样本具有相同的方差。
原假设:两独立样本具有相同的均值。
备择假设:两独立样本的均值不同。
## 例1:
np.random.seed(125)
x1 = stats.norm.rvs(loc=5,scale=10,size=500) #生成500个均值为5,标准差为10的数据
x2 = stats.norm.rvs(loc=5,scale=10,size=500)
## 查看数据的直方图
plt.figure()
plt.hist(x1,bins=20,color="red",alpha = 0.5)
plt.hist(x2,bins=20,color="blue",alpha = 0.5)
plt.xlabel("x")
plt.ylabel("frequenry")
plt.title("hist plot")
plt.show()
## 独立两样本t检验
stats.ttest_ind(x1,x2)
结果P=76%,远大于0.05,说明这两组数据的均值几乎相等。
3. 单因素方差分析
单因素方差分析 (one-way ANOVA),用于完全随机设计的多个样本均数间的比较,其统计推断是推断各样本所代表的各总体均数是否相等。
H0:各个因素的均值相等μ0=μ1=…=μn
H1:各个因素的均值不完全相等
stats.f_oneway()
Performs a 1-way ANOVA.
单因素方差分析测试两个或多个组具有相同总体平均值的零假设。 该测试应用于来自两个或更多个组的样品,可能具有不同的样本数目。
注:这里没搞懂,代码附上
import seaborn as sns
sns.set_style("white")
Iris = sns.load_dataset("iris")
Iris.head()
## 盒形图 查看数据
# Seaborn中的boxplot,可以画箱线图,可以看出不同种类的分布情况
## 中间线为中位数,理论上是不能对比均值的,但是可以做为参考。
plt.figure(figsize=(8,6))
sns.boxplot(x="species", y="sepal_width", data=Iris)
plt.title("Boxplot")
plt.show()
## 单因素方差分析
setosa = Iris.sepal_width[Iris.species == "setosa"]
versicolor = Iris.sepal_width[Iris.species == "versicolor"]
virginica = Iris.sepal_width[Iris.species == "virginica"]
## 方差齐性检验
print(stats.levene(setosa,versicolor,virginica))
print("pvalue > 0.05 ,说明各组方差相等")
print("----------------------------------")
print(stats.f_oneway(setosa,versicolor,virginica))
print("pvalue < 0.05 ,说明各组均值不全相等")
Levene检验,检验结果pvalue=0.55远大于0.05,说明3个数组方差相等,可以进行单因素方差分析
## 进行多重比较
from statsmodels.stats.multicomp import pairwise_tukeyhsd
tukey = pairwise_tukeyhsd(endog=Iris.sepal_width, # 数据
groups=Iris.species, # 分组
alpha=0.05) # 显著性水平
print(tukey)
tukey.plot_simultaneous() # 绘画出每组的置信区间
tukey.summary() # 查看summary
4. 相关性检验
检验数据是否具有线性相关使用*stats.pearsonr()*函数。对sepal_length和petal_length进行皮尔逊相关性检验
from sklearn.preprocessing import LabelEncoder,StandardScaler
Iris = pd.read_csv("D:\Desktop\python在机器学习中的应用\Iris.csv")
r,pval = stats.pearsonr(Iris["SepalLengthCm"],Iris["PetalLengthCm"])
print("相关系数: ",r)
print("---------------------")
print("相关系数显著性检验p-value: ",pval)
相关系数大小为0.87 ,p-value远小于0.05,说明线性关系成立。
注:其他方法以后遇到了会补充。
上一篇: 假设检验
下一篇: mllib 假设检验