大家好,我是小寒
方差分析(ANOVA)是一种统计方法,用于比较三个或三个以上总体均值是否存在显著差异。
方差分析广泛应用于实验设计、医学研究、市场调研等领域。
方差分析的核心思想是,将数据的总变异分解为组间变异和组内变异,然后通过比较这些变异来检验不同组的均值是否存在显著差异。
如果组间变异显著大于组内变异,则说明不同组之间的均值差异显著,反之则说明没有显著差异。
假设你正在测试三种不同的施肥方案对农作物产量的影响。观测到的产量之所以会有波动,通常来自两个方面。
如果组间差异显著大于组内随机误差,我们就有理由相信,不同的处理(肥料)确实产生了不同的效果。
以最基础的单因素方差分析为例,假设我们有 个组,总样本量为 。
总平方和 (SST)
所有观测值与总均值 之差的平方和。
组间平方和 (SSB)
各组均值与总均值之差的平方和(反映处理效应)。
组内平方和 (SSW)
各组内部观测值与其组均值之差的平方和(反映随机误差)。
数学上满足:。
平方和会受到样本量的影响,因此我们需要除以各自的自由度 (df) 来得到 “平均方差”
这是方差分析的判定指标
方差分析有多种类型,常见的有
假设你是一名农艺师,想要研究三种不同的肥料对玉米产量的影响。
你随机选择了 30 块实验田,平均分为三组,每组 10 块,分别施用肥料 A、B 和 C。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 1. 模拟实验数据
np.random.seed(42)
data = {
'Fertilizer': ['肥料A']*10 + ['肥料B']*10 + ['肥料C']*10,
'Yield': np.concatenate([
np.random.normal(20, 2, 10), # 均值20
np.random.normal(26, 2, 10), # 均值26
np.random.normal(22, 2, 10) # 均值22
])
}
df = pd.DataFrame(data)
# 2. 绘图:展示不同组别的均值差异与数据离散度
plt.figure(figsize=(8, 6))
# 使用箱线图展示中位数和四分位距
sns.boxplot(x='Fertilizer', y='Yield', data=df, palette='Pastel1', width=0.5)
# 叠加散点图展示每一个原始观测值,方便观察组内变异(随机误差)
sns.swarmplot(x='Fertilizer', y='Yield', data=df, color='black', alpha=0.6)
plt.title('单因素方差分析:不同肥料对玉米产量的影响', fontsize=14)
plt.xlabel('肥料类型', fontsize=12)
plt.ylabel('产量 (吨/公顷)', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.5)
plt.show()

最后
—