分享免费的编程资源和教程

网站首页 > 技术教程 正文

方差分析 in R语言 and Excel

goqiw 2025-01-09 12:36:08 技术教程 1 ℃ 0 评论

今天来写一篇实际中比较实用的分析方法,方差分析。通过方差分析,我们可以确定组别之间的差异是否超出了由于随机因素引起的差异范围。方差分析分为单因素方差分析和多因素方差分析,这一篇先介绍一下单因素方差分析,后续看需求介绍多因素方差分析。本篇使用的工具是R语言和Excel来实现,下一篇再使用常用的Python来实现一下,这样就可以根据不同的需求选择不同的工具了。

这次使用的数据如下,复制链接到浏览器就可以直接下载了↓

https://linss.oss-cn-beijing.aliyuncs.com/Excel/ANOVA_data.xlsx

数据的业务逻辑大概是,有四个省份,然后进行了一次培训。培训前后不同人员的销售金额的变化,需要看每个省份培训后是否带来销售额的提升,再决定后续是否加大培训,以及全国其他省份都进行培训的推广。

首先我们通过直观的图形来看一下,每个省份的平均销售金额有不有提升,在Excel里面绘制一个直方图↓

从图形可以看出,培训后河南、江西、四川三个省份销售均值都有提升,且四川提升最明显;而山东省销售金额还有所下降。然后我们在绘制箱线图来看看整体分布情况变化大不大↓

箱线图的绘制有Excel、PowerBI、R语言、Python四种工具可以参考《PowerBI箱线图 and Excel》《R语言_010可视化(箱型图)》《seaborn_boxplot》

可以看到,整体分布变化不大,四川、江西都有提升,河南整体有提升但是中位数在下降,山东整体下降。但是这只是直观的变化感受,实际在统计学意义上是否显著,是否培训真的带来了明显的效果,还需要做统计检验,这里就是用方差分析来实现。

如果为了介绍的完整性,我们这里还要花很大的篇幅来介绍方差的假设、方差的计算推导步骤(组内平方和、组间平方和、计算均值、计算F值、判断显著性),这写原理大概了解就行了,就可以当成一个黑盒子,根据实际需求,知道传入什么参数,然后能根据结果判断就行了,不必全部深究。这里使用Excel和R语言来对上面的数据做方差分析↓


【Excel方差分析】

Excel的数据分析功能其实很强大,除了函数功能外,还有一个专门的数据分析模块,里面常用的数据统计分析方法都有,这里就介绍一下单因素方差分析。

在Excel的方差分析里,数据字段的格式要求是几个数据就需要放几列,我们这里有两个阶段,就需要分别把两个阶段的结果放成两列。然后因为四个省份培训的人和内容有差异,所以需要四个省份分别来做方差分析,数据如下↓

下面是Excel里面方差分析的步骤↓

菜单【数据】->【数据分析】,然后在出现的界面里面选择单因素方差分析↓

然后参数选择很简单,Input Range选择我们的两列数据就行了,然后把标签在首行勾选上,默认的Alpha值是0.05,使用默认的就行;最后选择输出位置,可以新建一个sheet,或者就在当前sheet里面选择一个单元格作为输出的起始位置就行了↓

最后的输出结果如下↓

如果对方差分析过程参数感兴趣可以看一下其他参数,但是一般使用中我们看一下P值就行了,就是0.05作为判断标准,如果小于0.05就表示我们培训前后效果是显著的,本次四川省的培训效果对销售量有实际提升。

然后我们再使用同样的方式,对剩下三个省份进行方差分析,结果我只取P值,如下↓

江西省:0.32401085013613;

山东省:0.581523331518028;

河南省:0.397483802566017。

可以看到都不显著,说明虽然河南和江西有增长,山东有下降,但都不是因为培训带来的,可能是其他随机因素导致的结果。

所以我们的整体结论是,培训在部分省份有效果,可把四川省的培训方式在复制一份到其他省份看效果,再验证结果是否显著。


【R语言方差分析】

其实在做方差分析前,还需要先对数据本身情况进行检验,检验效果通过才能进行下一步的方差分析,不然分析结论就没意义了。当进行方差分析之前,正态性和方差齐性检验是非常重要的步骤。这些检验可以帮助我们验证方差分析的前提条件是否满足,从而确保我们得到的分析结果是可靠的。

正态性和方差齐性的检验,在Excel里面操作就很麻烦了,但是在代码工具比如R或Python就很简单了,都有成熟的包可以直接调用,我们对两种检验分别使用两种常用的方法,也可以对比看一下效果。

正态性检验-Shapiro-Wilk检验】

Shapiro-Wilk检验是一种用于检验数据是否符合正态分布的统计检验方法。在R语言中,通过shapiro.test()函数可以进行Shapiro-Wilk检验。假设检验的零假设是数据符合正态分布。如果p值小于显著性水平,则拒绝零假设,表示数据不符合正态分布。

shapiro.test(df$销量)

这是对所有样本进行正态性的检测,只是看一下,因为实际我们还是分别对各省每个阶段的数据分别进行正态性检测,结果如下↓

	Shapiro-Wilk normality test

data:  df$销量
W = 0.99199, p-value = 0.0002547

可以看到P值是不到0.01的,所以不能接受原假设(符合正态分布),所以整体来看是不通过正态性检测的。所以我们还是分别对各省来进行正态性检验,看看效果↓

df_jx = subset(df,df$省份 == "江西省")
shapiro.test(df_jx$销量)
	Shapiro-Wilk normality test

data:  df_jx$销量
W = 0.99592, p-value = 0.8728

江西省的P值是0.87,通过正态性检测。其他几个省份同样操作,结果如下:

四川0.11,河南0.23,山东0.54都通过了正态性检测。

正态性检验-Kolmogorov-Smirnov检验】

Kolmogorov-Smirnov检验用于检验一个样本是否来自特定分布。在R语言中,通过ks.test()函数可以进行Kolmogorov-Smirnov检验。我们将数据与正态分布进行比较,如果p值小于显著性水平,则表示数据不符合正态分布。

还是先看一下整体的分布是否正态

ks.test(df$销量, "pnorm", mean(df$销量), sd(df$销量))
	Asymptotic one-sample Kolmogorov-Smirnov test

data:  df$销量
D = 0.044542, p-value = 0.08363
alternative hypothesis: two-sided

结果也是勉强通过检验,还是需要看一下每个省份的检验效果。

ks.test(df_jx$销量, "pnorm", mean(df_jx$销量), sd(df_jx$销量))
	Asymptotic one-sample Kolmogorov-Smirnov test

data:  df_jx$销量
D = 0.046131, p-value = 0.7883
alternative hypothesis: two-sided

江西省的结果是0.778,其他四川是0.24、河南是0.87、山东是0.87,都非常完美的通过了检验。

方差齐性检验-Bartlett检验】

Bartlett检验用于检验不同组之间的方差是否相等。在R语言中,通过bartlett.test()函数可以进行Bartlett检验。假设检验的零假设是各组样本的方差相等。如果p值小于显著性水平,则拒绝零假设,表示各组样本的方差不相等。

我们就直接使用每个省份的数据来进行检验了,江西省代码和结果如下↓

bartlett.test(df_jx$销量 ~ df_jx$次数)
	Bartlett test of homogeneity of variances

data:  df_jx$销量 by df_jx$次数
Bartlett's K-squared = 0.25787, df = 1, p-value = 0.6116

结果为0.61,通过了方差齐性检验,表示江西省这两次的结果方差整体差异不大。

其他三个省份的结果分别是,四川0.53,河南0.36,山东0.93,都完美的通过了Bartlett方差齐性检测。

方差齐性检验-Levene检验】

Levene检验也用于检验不同组之间的方差是否相等,通常用于小样本情况。在R语言中,通过leveneTest()函数进行Levene检验。同样,假设检验的零假设是各组样本的方差相等。如果p值小于显著性水平,则表示各组样本的方差不相等。

还是重复上面的操作,江西省效果如下↓

leveneTest(df_jx$销量 ~ df_jx$次数)
Levene's Test for Homogeneity of Variance (center = median)
       Df F value Pr(>F)
group   1  0.2638 0.6081
      198

结果为0.61,通过了方差齐性检验,表示江西省这两次的结果方差整体差异不大。

其他三个省份的结果分别是,四川0.38,河南0.57,山东0.98,也都完美的通过了Levene方差齐性检测。


【R语言正式方差分析】

通过一系列的检测,并且都通过了,我们就可以顺利的进入到最后一步,进行各省的方差分析了。

我们还是直接从省份开始了,在R里面,方差分析就是aov函数,参数就是分析的数据和维度,江西省代码如下↓

aov_jx <- aov(df_jx$销量 ~ df_jx$次数)
summary(aov_jx)
             Df Sum Sq Mean Sq F value Pr(>F)
df_jx$次数    1    105   105.1   0.978  0.324
Residuals   198  21293   107.5

结果是0.324,和Excel里面的结果是完全一样的,没有通过方差检验,说明江西省这次培训前后销量的变化没有差异。

然后是几个省份的值:

四川是0.0378,表示培训前后销售有明显变化,而且在R语言里面如果通过了显著性检验,会在P值后面标记*,三*最好↓

             Df Sum Sq Mean Sq F value Pr(>F)  
df_sc$次数    1   1842  1842.2   4.371 0.0378 *
Residuals   198  83447   421.5                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

剩下的河南0.397,山东0.582都是和Excel结果一样的。


完成了方差分析后,我们才有更可靠的统计学支撑,对比只看表面图形和数字的变化更具有说服力。也是作为业务判断有力的一个标准。

链接是我使用PowerBI整合的历史文章,按类型分类,可以根据需求查询:Microsoft Power BI↓

https://app.powerbi.com/view?r=eyJrIjoiNjI2NWQ3NjktYjU0ZC00ZWZhLTgzMDgtMGI4ZTk1ZDlkODM3IiwidCI6IjI3NDQ3MWQ0LTM4ZDQtNDVlZS1hMmJkLWU1NTVhOTBkYzM4NiJ9

End

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表