或许有点了解的人会认为总方差=组内方差+组间方差,很多教材有可能也是这样表达的:
我不知道大家有没有拿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文件,请回复“方差分析”下载。