欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

统计学检验——Python

程序员文章站 2022-07-11 14:58:29
...

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