#idea来源#
在使用spss帮朋友做单因素分析时,发现个别数据需要调整到符合显著性的要求,在spss中修改数据,再在spss中操作步骤太麻烦,于是有了这个想法。
程序思路
1、将数据放到excel里,确定两列数据,Group(分组数据)和B(对应数据列)
2、程序读取excel数据
3、整理数据格式,将数据分组,将数据从宽格式转换为长格式,以便于进行ANOVA分析。
4、执行单因素方差分析(ANOVA),使用 statsmodels
的 ols
和 anova_lm
方法进行单因素方差分析。
5、计算均方误差(MSE)和LSD值,计算每组的均值和标准差,根据均方误差和样本量计算LSD值。
6、进行LSD多重比较,比较各组之间的均值差异,判断是否显著。
程序代码:
import pandas as pd
import numpy as np
from scipy import stats
import statsmodels.api as sm
from statsmodels.formula.api import ols
# 读取数据
file_path = 'data.xlsx' # 替换为你的数据文件路径
df = pd.read_excel(file_path)
# 查看数据结构
print(df.head())
# 转换数据格式为长格式
data_long = pd.melt(df, id_vars=['Group'], value_vars=['B'], var_name='Sample', value_name='Value')
# 查看长格式数据
print(data_long.head())
# 执行单因素方差分析(ANOVA)
model = ols('Value ~ C(Group)', data=data_long).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print("\n单因素方差分析结果:")
print(anova_table)
# 提取均方误差 (MSE)
mse = anova_table['sum_sq'][1] / anova_table['df'][1]
# 计算每组的均值和标准差
group_stats = data_long.groupby('Group')['Value'].agg(['mean', 'std', 'count'])
print("\n各组统计信息:")
print(group_stats)
# 计算LSD
alpha = 0.05
n = data_long['Value'].count() / len(data_long['Group'].unique()) # 每组样本量
t_value = stats.t.ppf(1 - alpha / 2, df=(len(data_long['Value']) - len(data_long['Group'].unique())))
lsd = t_value * np.sqrt(2 * mse / n)
print(f"\nLSD值: {lsd}")
# 多重比较:计算组间均值差异并判断显著性
groups = data_long['Group'].unique()
comparisons = []
for i in range(len(groups)):
for j in range(i + 1, len(groups)):
group1 = groups[i]
group2 = groups[j]
mean_diff = abs(group_stats.loc[group1, 'mean'] - group_stats.loc[group2, 'mean'])
if mean_diff > lsd:
comparisons.append((group1, group2, mean_diff, True))
else:
comparisons.append((group1, group2, mean_diff, False))
# 输出比较结果
print("\nLSD多重比较结果:")
for group1, group2, mean_diff, significant in comparisons:
if significant:
print(f"组 {group1} 和 组 {group2} 之间的均值差异 {mean_diff:.2f} 显著大于 LSD 值 {lsd:.2f}")
else:
print(f"组 {group1} 和 组 {group2} 之间的均值差异 {mean_diff:.2f} 不显著")
同样的数据 执行结果与spss执行结果一致。