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
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)
#方法一:直接调用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')
#方法一:scipy.stats.levene()
"""
Levene检验是将每个值先转换为为该值与其组内均值的偏离程度,
然后再用转换后的偏离程度去做方差分析,即组间方差/组内方差。
"""
levene(one,two,three)
#方法二:scipy.stats.bartlett()
"""
Bartlett检验的核心思想是通过求取不同组之间的卡方统计量,然后根据卡方统计量的值来判断组间方差是否相等。
该方法极度依赖于数据是正态分布,如果数据非正态分布,则的出来的结果偏差很大。
"""
bartlett(one,two,three)
#方法一:方差分析,按照原理进行拟合
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)
"""
单因素多重比较
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学习笔记,不以盈利为目的,纯手工码字不容易,若整理的笔记中,对您有所助益,麻烦点个赞或者收藏,万分感谢!如有构成侵权的地方,请联系作者删除,谢谢合作!