python单因素分析
写了个简易小程序实现,以后用的时候直接复制就行:
import numpy as np
from scipy.stats import fdatas = [[65,60,69,79,38,68,54,67,68,43],[74,71,58,49,58,49,48,68,56,47],[22,34,24,21,20,36,36,31,28,33]
]
a = 0.05def get_mean_var(data):data_mean = np.mean(data)data_var = np.var(data)return data_mean, data_varn_total = 0
for i in range(len(datas)):print(f'n_{i+1}:{len(datas[i])}')n_total += len(datas[i])print(f'n_total:{len(datas)}')# 求所有data的平方和
data_all = np.concatenate(datas)
data_all_mean, data_all_var = get_mean_var(data_all)total_square_sum = data_all_var*len(data_all)
print(f'总体均值: {data_all_mean}')
# 求组间平方和
group_square_sum = 0
for data in datas:data_mean, _ = get_mean_var(data)group_square_sum += len(data) * (data_mean - data_all_mean)**2# 求误差平方和
error_square_sum = 0
for data in datas:data_mean, _ = get_mean_var(data)for d in data:error_square_sum += (d-data_mean)**2s = len(datas)
n = n_totalA_mean_square_sum = group_square_sum/(s-1)
E_mean_square_sum = error_square_sum/(n-s)
F_value = A_mean_square_sum/E_mean_square_sum
F_threshold = f.isf(q=a,dfn=s-1,dfd=n-s)
# 列表输出
print(f'| 方差来源 | 平方和 | 自由度 | 均方和 | F值 |')
print(f'| 因素A | {group_square_sum} | {s-1} | {A_mean_square_sum} | {F_value}')
print(f'| 误差E | {error_square_sum} | {n-s} | {E_mean_square_sum} |')
print(f'| 总体T | {total_square_sum} | {n-1} |')print(f'\na值: {a}')
print(f'临界F值---F_{a}({s-1},{n-s}): {F_threshold}' )if F_value > F_threshold:print('拒绝原假设,不同处理之间存在显著差异')
else:print('接受原假设,不同处理之间不存在显著差异')