在数据分析过程中,判断不同组别之间是否存在显著差异是一个常见的需求。显著性差异分析和方差分析(ANOVA)是两种重要的统计方法,它们能够帮助我们确定组间差异是否具有统计学意义。本文将详细介绍这两种分析方法的原理、应用场景,并通过Python代码示例进行实现,最后结合可视化结果,帮助大家更好地理解和应用这些统计方法。
一、显著性差异分析
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats
# 生成模拟数据
np.random.seed(42)
group1 = np.random.normal(loc=50, scale=10, size=30) # 药物1效果
group2 = np.random.normal(loc=55, scale=10, size=30) # 药物2效果
# 进行t检验
t_stat, p_value = stats.ttest_ind(group1, group2)
print(f"T-statistic: {t_stat:.3f}, P-value: {p_value:.3f}")
## T-statistic: -2.398, P-value: 0.020
# 数据整理
df = pd.DataFrame({'Group': ['Drug1']*30 + ['Drug2']*30, 'Effect': np.concatenate([group1, group2])})
# 可视化箱线图
plt.figure(figsize=(8,6))
sns.boxplot(x='Group', y='Effect', data=df)
plt.title(f'T-test Result: P-value = {p_value:.3f}')
plt.show()
group1
和 group2
分别代表两种药物的治疗效果,我们使用 scipy.stats.ttest_ind()
进行独立样本 t 检验。 二、方差分析(ANOVA)
import statsmodels.api as sm
from statsmodels.formula.api import ols
import seaborn as sns
# 生成模拟数据
np.random.seed(42)
fertilizer1 = np.random.normal(loc=100, scale=15, size=30) # 肥料1
fertilizer2 = np.random.normal(loc=110, scale=15, size=30) # 肥料2
fertilizer3 = np.random.normal(loc=105, scale=15, size=30) # 肥料3
# 创建数据框
df_anova = pd.DataFrame({
'Fertilizer': ['Fert1']*30 + ['Fert2']*30 + ['Fert3']*30,
'Yield': np.concatenate([fertilizer1, fertilizer2, fertilizer3])
})
# ANOVA分析
model = ols('Yield ~ C(Fertilizer)', data=df_anova).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print(anova_table)
## sum_sq df F PR(>F)
## C(Fertilizer) 1942.885859 2.0 4.867571 0.009912
## Residual 17362.980801 87.0 NaN NaN
# 可视化箱线图
plt.figure(figsize=(8,6))
sns.boxplot(x='Fertilizer', y='Yield', data=df_anova)
plt.title('ANOVA Analysis of Fertilizer Effects on Yield')
plt.show()
statsmodels
库中的 ols()
方法构建线性模型,并通过 anova_lm()
进行方差分析。