四时宝库

程序员的知识宝库

总方差 = 组内方差 + 组间方差?用excel和python计算验证源文件下载

或许有点了解的人会认为总方差=组内方差+组间方差,很多教材有可能也是这样表达的:


我不知道大家有没有拿EXCEL验证过上面的等式是否成立,我可以告诉你上面的等式是不成立的。

我们说的总体变异等于组内变异和组间变异之和,并不是方差,也不是标准差,而是平方和。

即: 总体平方和 = 组内平方和 + 组间平方和

SST = SSW + SSB

EXCEL验证

接下来我们用Excel和Python实现并验证 SST = SSW + SSB

从上面的excel手动计算,我们很清楚的了解到总体平方和 = 组内平方和 + 组间平方和,并且和EXCEL数据分析工具对比结果一致。


Python验证

import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
from scipy.stats import f
import numpy as np


# Define the data 
data = [[72,25,70,7,24],
[53,93,91,48,2],
[64,1,67,94,37],
[59,19,64,85,43],
[34,26,13,71,53],
[93,10,53,39,5],
[54,67,42,50,94],
[71,48,4,29,48],
[83,96,51,95,68],
[85,18,20,61,99],
[58,52,30,100,6],
[44,23,40,16,19],
[47,71,79,42,10],
[30,53,48,83,53],
[65,49,8,8,15],
[51,97,16,81,60],
[52,22,21,69,90],
[53,7,79,24,12],
[21,97,15,40,45],
[40,92,17,21,84]]


# Make DataFrame with given data
df = pd.DataFrame(data, columns=['col_1', 'col_2', 'col_3', 'col_4', 'col_5'])


# Stack the DataFrame
df_long = df.stack().reset_index()
df_long.columns = ['row', 'column', 'value']


# Convert `column` to categorical, ensuring correct order
df_long['column'] = pd.Categorical(df_long['column'], categories=['col_1', 'col_2', 'col_3', 'col_4', 'col_5'], ordered=True)


接下来开始手工计算



# 1.计算各组均值
group_means = df_long.groupby('column')['value'].mean()
print("group_means:",group_means)


# 2. 计算总体均值
overall_mean = df_long['value'].mean()


# 3. 计算组间平方和 (SSB)
ssb = sum(df_long.groupby('column').size() * (group_means - overall_mean) ** 2)


# 4. 计算组间平方和 (SSW)
ssw = sum((df_long['value'] - pd.to_numeric(df_long['column'].map(group_means))) ** 2) 


# 5. 计算组间自由度
df_between = len(group_means) - 1


# 6. 计算组内自由度
df_within = len(df_long) - len(group_means)


# 7. 计算F统计量
msb = ssb / df_between
msw = ssw / df_within


f_statistic = msb / msw


# 8. 计算P值
p_value = 1 - f.cdf(f_statistic, df_between, df_within)


# 9. 组合结果和打印
manual_anova_results = {
    "F_statistic": f_statistic,
    "p_value": p_value,
    "df": (df_between, df_within)
}


手动python计算和用statsmodel的anova计算结果对比

两者完全一致。

通过上面我们知道:

  • 总方差不等于组内方差+组间方差
  • 总体平方和 = 组内平方和 + 组间平方和


上述的 “总体平方和 = 组内平方和 + 组间平方和” 是在方差分析中使用得最多的。我们简易SPC也提供方差分析功能,并且整合到SPC分析报告中。


方差分析(Analysis of Variance,简称ANOVA),又称“变异数分析”,是R.A.Fisher发明的,用于两个及两个以上样本均数差别的显著性检验。由于各种因素的影响,研究所得的数据呈现波动状。造成波动的原因可分成两类,一是不可控的随机因素,另一是研究中施加的对结果形成影响的可控因素。

本文举例的是one-way方差分析,也就是单因素方差分析,衡量因素的几个水平之间是否存在差异的。只要P值大于0.05,我们就认为因素的水平之间不存在差异。

本文的EXCEL文件和python文件,请回复“方差分析”下载。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接