目录
方差分析
Python进行正态性检验
观察法
统计方法
Python进行方差齐性检验
Python进行方差分析
Python进行Welch方差分析
总结
参考
方差分析是用于分析定类数据与定量数据之间的关系情况。例如研究人员想知道三组学生的智商平均值是否有显著差异。
进行方差分析需要满足如下假定:
(1)抽取数据的随机性与独立性假定
这一假定要求随机抽取样本,确保一组数据一定独立于实验中的任何其他数据。
(2)抽取数据的正态性假定
这一假定要求在抽样的时候一定要在正态总体中随机抽取数据,即保证抽取的数据服从正态分布。但方差检验对数据的正态性的有一定的耐受能力,只要数据近似正态即可接受。如果数据严重不正态,则可使用非参数检验。
(3)抽取数据方差的一致性假定
这一假定要求只能在均值可以不同但是方差一定相等的正态总体中抽取数据。否则,会影响方差分析的推断效果。方差分析前一般需要对数据进行方差齐性检验。当方差齐检验呈现出显著性,即说明不同组别的数据波动不一致,方差不齐。此时可考虑使用Welch anova或Brown-Forsythe anova或非参数检验作为代替方法,进行分析。
在使用统计方法进行正态性检验前,可以先绘制小提琴图进行初步的查看
我这里有两列的dataframe数据,其中market_type列为分类数据,r为数值型数据
fig,axes=plt.subplots(1,2,figsize=(15,6),sharey=True)
sns.violinplot(x = 'market_type', y = 'r', data = data,ax=axes[0])
sns.boxplot(x = 'market_type', y = 'r', data = data,ax=axes[1])
scipy.stats.kstest(rvs, cdf, args=(), N=20, alternative='two-sided', method='auto')
for x in data['market_type'].unique():#所有取值即所有组
u=data[data['market_type']==x]['r'].mean()
std=data[data['market_type']==x]['r'].std()
print(kstest(data[data['market_type']==x]['r'], 'norm',(u, std)))
结果显示不能拒绝原假设,即可以认为所有组的数据都服从正态分布
方差齐性检验可以使用scipy.stats.levene进行检验
scipy.stats.levene(*samples, center='median', proportiontocut=0.05)
gb=data.groupby('market_type')
groups=[]
for a,group in gb:
groups.append(group['r'])
l=levene(*groups)
LeveneResult(statistic=2.3141014660435144, pvalue=0.09896642987651097)
结果显示不能拒绝原假设,即可以认为满足方差齐性
使用statsmodels.formula.api.ols和statsmodels.stats.anova.anova_lm进行方差分析,并使用statsmodels.stats.multicomp.pairwise_tukeyhsd进行两两比较
formula = "r~ C(market_type)"
model=anova_lm(ols(formula,data=data).fit())
print(model)
re=pairwise_tukeyhsd(data['r'],data['market_type'],alpha=0.05)
print('多重比较:')
print(re.summary())
结果显示,方差分析和两两比较结果均显著
当数据不满足正态性和方差齐性假设时,就需要使用非参数检验的方法,Welch’s ANOVA就是其中一种检验方法。在python中使用Welch’s ANOVA需要安装pingouin库。其中的welch_anova和pairwise_gameshowell分别用于Welch’s ANOVA和两两比较。
model=pg.welch_anova(dv='r', between='market_type', data=data)
print(model)
print('多重比较:')
print(pg.pairwise_gameshowell(dv='r', between='market_type', data=data))
为了方便使用,将上述代码汇总成一个函数
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from statsmodels.formula.api import ols
from scipy.stats import levene
from scipy.stats import kstest
from statsmodels.stats.anova import anova_lm#方差分析
from statsmodels.stats.multicomp import pairwise_tukeyhsd#两两比较
import pingouin as pg
def anova_d(column,data):
gb=data.groupby('market_type')
groups=[]
for a,group in gb:
groups.append(group[column])
l=levene(*groups)
print(column+'的方差齐性检验结果为',l)
if l.pvalue>0.05:
formula = column+"~ C(market_type)"
model=anova_lm(ols(formula,data=data).fit())
print(model)
re=pairwise_tukeyhsd(data[column],data['market_type'],alpha=0.05)
print('多重比较:')
print(re.summary())
else:
model=pg.welch_anova(dv=column, between='market_type', data=data)
print(model)
print('多重比较:')
print(pg.pairwise_gameshowell(dv=column, between='market_type', data=data))
anova_d('r',data)
scipy.stats.kstest — SciPy v1.10.1 Manualhttps://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kstest.html#scipy.stats.kstestWelch's ANOVA in Python (Step-by-Step) (statology.org)
https://www.statology.org/welchs-anova-in-python/Welch's ANOVA in Python (Step-by-Step) (statology.org)
https://www.statology.org/welchs-anova-in-python/