Python--统计学检验

1.导入相关库

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
from scipy import stats

from scipy.stats import normaltest,kstest,shapiro,anderson,levene, bartlett,f_oneway
from scipy.stats import ttest_1samp,ttest_ind,ttest_rel,mannwhitneyu,kruskal
from statsmodels.stats.multicomp import pairwise_tukeyhsd,MultiComparison

from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

2.加载数据

one   = [55.49,	55.98,	54.84,	56.37,	55.96,	57.52,	57.70,	58.22,	56.92,	55.68,	56.18,	54.94,	54.77,	57.53,	58.18,	56.66,	55.76,	56.26,	55.37,	55.34,	57.11,	55.96,	56.43,	55.29]
two   = [51.89,	48.96,	53.36,	52.99,	52.84,	54.72,	53.16,	54.11,	53.58,	51.52,	52.09,	51.71,	52.66,	54.59,	54.33,	51.54,	52.81,	53.64,	52.35,	52.48,	51.78,	52.62,	52.29,	51.76]
three = [49.35,	49.22,	51.00,	50.11,	50.44,	50.29,	49.91,	49.58,	50.68,	49.46,	48.40,	49.76,	49.95,	49.42,	49.47,	50.57,	51.79,	51.97,	51.13,	49.85,	50.95,	49.64,	49.78,	49.18]
np.mean(one),np.mean(two),np.mean(three)

3.正态性检验

#方法一:直接调用scipy.stats.normaltest()
"""
normaltest 也是专门做正态性检验的模块
scipy.stats.normaltest(a, axis=0, nan_policy=’propagate’)
a:待检验的数据
axis:默认为0,表示在0轴上检验,即对数据的每一行做正态性检验,我们可以设置为 axis=None 来对整个数据做检验
nan_policy:当输入的数据中有空值时的处理办法。默认为 ‘propagate’,返回空值;设置为 ‘raise’ 时,抛出错误;设置为 ‘omit’ 时,在计算中忽略空值。
"""
normaltest(one),normaltest(two),normaltest(three)
#方法二:直接用算法做KS检验scipy.stats.kstest()
"""
# kstest方法:KS检验,参数分别是:待检验的数据,检验方法(这里设置成norm正态分布),均值与标准差
# 结果返回两个值:statistic → D值,pvalue → P值
# p值大于0.05,接受原假设:数据服从正态分布
# p值小于0.05,拒绝原假设:数据不服从正态分布
"""
stats.kstest(one  , 'norm', (np.mean(one)  , np.std(one))),\
stats.kstest(two  , 'norm', (np.mean(two)  , np.std(two))),\
stats.kstest(three, 'norm', (np.mean(three), np.std(three)))
#方法三:直接用算法scipy.stats.shapiro(x)
"""
W检验(Shapiro-Wilk的简称)是基于两个分布的相关性来进行判断,会得出一个类似于皮尔逊相关系数的值。
值越大,说明两个分布越相关,越符合某个分布。在Python中可通过scipy包直接进行W检验:scipy.stats.shapiro(x),
x为待检验的样本集,上面的代码会返回两个结果:W值和其对应的p_value。shapiro是专门用于正态性检验的,所以不需要指明分布类型。
且 shapiro 不适合做样本数>5000的正态性检验。
"""
shapiro(one),\
shapiro(two),\
shapiro(three)
#方法四:直接用算法scipy.stats.anderson(x)
"""
anderson 是修改版的 kstest,说是增强版也不为过。也可以做多种分布的检验,默认的检验时正态性检验
安德森-达令检验样本数据是否来自特定分布,包括分布:‘norm’, ‘expon’, ‘gumbel’, ‘extreme1’ or ‘logistic’.
原假设 H0:样本服从特定分布;备择假设 H1:样本不服从特定分布
返回:anderson 有三个输出值,第一个为统计数,第二个为评判值,第三个为显著性水平,评判值与显著性水平对应
对于正态性检验,显著性水平为:15%, 10%, 5%, 2.5%, 1%
如果输出的统计量值statistic < critical_values,则表示在相应的significance_level下,接受原假设
"""
anderson(one,   dist= 'norm'),\
anderson(two,   dist= 'norm'),\
anderson(three, dist= 'norm')

4.方差齐性检验

#方法一:scipy.stats.levene()
"""
Levene检验是将每个值先转换为为该值与其组内均值的偏离程度,
然后再用转换后的偏离程度去做方差分析,即组间方差/组内方差。
"""
levene(one,two,three)
#方法二:scipy.stats.bartlett()
"""
Bartlett检验的核心思想是通过求取不同组之间的卡方统计量,然后根据卡方统计量的值来判断组间方差是否相等。
该方法极度依赖于数据是正态分布,如果数据非正态分布,则的出来的结果偏差很大。
"""
bartlett(one,two,three)

5.方差分析

#方法一:方差分析,按照原理进行拟合
d = {'one' : pd.Series(one),'two' : pd.Series(two),'three' : pd.Series(three)}
# index 与序列长度相投
# 字典不同的 key 代表一个列的表头,pd.Series 作为 value 作为该列的元素
data = pd.DataFrame(d)
data_new = data.stack().reset_index().rename(columns={0:'value'}).iloc[:,1:]
data_new.columns = ['type','value']
data_new.head(5)
formula = '{} ~ {}'.format(data_new.columns[1], data_new.columns[0])
model = ols(formula, data_new).fit()
anova_lm(model)
#方法二:方差分析scipy.stats.f_oneway()
"""
# 结果返回两个值:statistic → D值,pvalue → P值
# p值大于0.05,接受原假设:组间数据均值无显著差异
# p值小于0.05,拒绝原假设:组间数据均值存在显著性差异
"""
f_oneway(data.one,data.two,data.three)

6.多重比较检验

"""
单因素多重比较
from statsmodels.stats.multicomp import pairwise_tukeyhsd
from statsmodels.stats.multicomp import MultiComparison
reject=True,说明有显著性差异
reject=False,说明无显著性差异。
"""
mc = MultiComparison(data_new['value'], data_new['type'])
result = mc.tukeyhsd()
print(result)

特别注明本文属于Python学习笔记,不以盈利为目的,纯手工码字不容易,若整理的笔记中,对您有所助益,麻烦点个赞或者收藏,万分感谢!如有构成侵权的地方,请联系作者删除,谢谢合作!

你可能感兴趣的:(Python,python)