企业网站托管排版设计制作,深圳全网营销公司有哪些,网站地图可以自己做么,网站到期时间文章目录 目的#xff1a;python实现one way ANOVA 单因素方差分析1. 代码流程2. python代码实现0 主要的函数1 加载数据2 查看数据统计结果3 数据处理及可视化4 方差分析4.1 模型拟合4.2 单因素方差分析 5 Post Hoc t-test组间比较分析6 根据定义自行分解计算对比调用函数的结… 文章目录 目的python实现one way ANOVA 单因素方差分析1. 代码流程2. python代码实现0 主要的函数1 加载数据2 查看数据统计结果3 数据处理及可视化4 方差分析4.1 模型拟合4.2 单因素方差分析 5 Post Hoc t-test组间比较分析6 根据定义自行分解计算对比调用函数的结果7 获取F分布对应的P值 3. 方差分析公式及原理参考 目的python实现one way ANOVA 单因素方差分析
方差分析 (Analysis of Variance ANOVA 是一种用于比较两个或多个样本均值 是否有显著差异的统计方法。它通过比较组间变异与组内变异的大小关系来判 断样本均值是否有显著差异。
1. 代码流程
a. 通过调用python的包来进行方差分析 b. 根据公式进行方差分析 c. 对比两种方法工具包与手算的结果结果发现一致 d. 最后附上方差分析的原理和计算公式
2. python代码实现
0 主要的函数 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as snsfrom scipy import stats # 里面有方差齐性检验方差
from statsmodels.formula.api import ols # 最小二乘法拟合
from statsmodels.stats.anova import anova_lm # 方差分析import warnings
warnings.filterwarnings(ignore, categoryFutureWarning)
warnings.filterwarnings(ignore, categoryUserWarning)1 加载数据
dataD {treat1:[390,410,372,382,None],treat2:[375,348,354,364,362],treat3:[413,383,408,None,None]}
data pd.DataFrame(dataD)
datatreat1treat2treat30390.0375413.01410.0348383.02372.0354408.03382.0364NaN4NaN362NaN
2 查看数据统计结果
data.describe()treat1treat2treat3count4.0000005.0000003.000000mean388.500000360.600000401.333333std16.11417610.28591316.072751min372.000000348.000000383.00000025%379.500000354.000000395.50000050%386.000000362.000000408.00000075%395.000000364.000000410.500000max410.000000375.000000413.000000
3 数据处理及可视化
我们为了方便计算将所有的数据合成一列并画一下箱线图看一下
data_melt data.melt()
data_melt.columns [Treat, value]
print(data_melt)Treat value
0 treat1 390.0
1 treat1 410.0
2 treat1 372.0
3 treat1 382.0
4 treat1 NaN
5 treat2 375.0
6 treat2 348.0
7 treat2 354.0
8 treat2 364.0
9 treat2 362.0
10 treat3 413.0
11 treat3 383.0
12 treat3 408.0
13 treat3 NaN
14 treat3 NaNimport seaborn as sns
# plt.figure(dpi600)
sns.boxplot(data data_melt, x Treat, y value, palette pastel, # 控制箱子颜色)4 方差分析
4.1 模型拟合
from statsmodels.formula.api import ols # 最小二乘法拟合
from statsmodels.stats.anova import anova_lm # 方差分析
from statsmodels.stats.multicomp import pairwise_tukeyhsd # post Hoc t_testmodel ols(value ~C(Treat), data data_melt).fit() # 最小二乘法拟合
# ols模型拟合的参数
print(model.params)# 模型拟合的均值
# mean_treat1 388.5
# mean_treat2 388.5 - 27.9 360.6
# mean_treat3 388.5 12.833 401.33## 实际的均值
# mean_treat1 388.500000
# mean_treat2 360.600000
# mean_treat3 401.333333Intercept 388.500000
C(Treat)[T.treat2] -27.900000
C(Treat)[T.treat3] 12.833333
dtype: float64无论是普通线性模型还是广义线性模型预测的都是自变量x取特定值时因变量y的平均值。
print(model.summary())OLS Regression Results Dep. Variable: value R-squared: 0.673
Model: OLS Adj. R-squared: 0.600
Method: Least Squares F-statistic: 9.257
Date: Thu, 30 Nov 2023 Prob (F-statistic): 0.00655
Time: 16:43:18 Log-Likelihood: -46.814
No. Observations: 12 AIC: 99.63
Df Residuals: 9 BIC: 101.1
Df Model: 2
Covariance Type: nonrobust
coef std err t P|t| [0.025 0.975]
--------------------------------------------------------------------------------------
Intercept 388.5000 6.910 56.224 0.000 372.869 404.131
C(Treat)[T.treat2] -27.9000 9.271 -3.010 0.015 -48.871 -6.929
C(Treat)[T.treat3] 12.8333 10.555 1.216 0.255 -11.044 36.710Omnibus: 0.469 Durbin-Watson: 2.839
Prob(Omnibus): 0.791 Jarque-Bera (JB): 0.509
Skew: 0.080 Prob(JB): 0.775
Kurtosis: 2.004 Cond. No. 3.80
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.4.2 单因素方差分析
anova_table anova_lm(model, type 2) # 方差分析
pd.DataFrame(anova_table) # 查看方差分析结果dfsum_sqmean_sqFPR(F)C(Treat)2.03536.0500001768.0250009.2573930.006547Residual9.01718.866667190.985185NaNNaN
参数解释 df: degree of freedom 自由度:自由度是你现有数据中包含的可能性。 例1为什么当你求全班5个同学身高总和的时候自由度是 因为如果把学号到学号的同学身高全都固定下来, 比方说总和为米而全班个人的身高总和为.米 那么第个同学的身高必须为.米没有任何自由变化的余地。例2假设有三个数字ABC10假设A为任意数取8B为任意数取2那么c就是0 这个等式才能成立这个等式当中有三个未知量 但是可以有自由变换的数值只有两个所以这个式子自由度就是3-12所以样本当中能自由变化的数据个数叫做自由度。 对于本案例 K 3: 共有3组treat1treat2treat3。 n 12: 3组共有12个测量值 df_C(Treat): K-1 3-12 df_Residual: n-k 12-3 9 sum_sq: error sum of square 误差平方和 表示实验误差大小的偏差平方和在相同的条件下各次测定值xi对测定平均值x的偏差平方后再加和∑(xi-x)2 mean_sq: Mean Squared Error 均方误差 均方误差是指参数估计值与参数真值之差平方的期望值 可以发现treat组间存在显著性差异p0.006547 0.5 因为对比的组别超过三个并且呈现出显著性差异所以考虑使用事后检验post hoc进一步对比具体两两组别间的差异情况。
5 Post Hoc t-test组间比较分析
print(pairwise_tukeyhsd(data_melt[value], data_melt[Treat]))Multiple Comparison of Means - Tukey HSD, FWER0.05group1 group2 meandiff p-adj lower upper reject
-----------------------------------------------
treat1 treat2 nan nan nan nan False
treat1 treat3 nan nan nan nan False
treat2 treat3 nan nan nan nan False
-----------------------------------------------这里我们发现
Q单因素方差分析结果显著但事后t检验两两比较均不显著这样的结果合理吗A合理方差分析结果显著只说明组间可能存在显著差异到底有无显著差异还要看事后比较
6 根据定义自行分解计算对比调用函数的结果
# 全部的算数平均数为380.083
mean_all ((390410372382375348354364362413383408)/12)
# 3个品种的算数平均数分别为388.5360.6401.33
print(总平均:\n, mean_all)
mean_k data.mean(axis 0)
print(组平均:\n, mean_k)总平均:380.0833333333333
组平均:treat1 388.500000
treat2 360.600000
treat3 401.333333
dtype: float64SS_A: 表示因素A的各水平之间的差异带来的影响又被称为组间偏差。
SS_e: 表示随机误差的影响又被称为组内偏差。组间方差
SS_A 4*(388.5-380.083)**2 5*(360.6-380.083)**2 3*(401.333-380.083)**2
df_A 3-1 # 共3个水平
MS_A SS_A/df_A
print(C(Treat) sum_sq:, SS_A)
print(C(Treat) mean_sq:, MS_A) 组内方差
SS_e (390-388.5)**2 (410-388.5)**2 (372-388.5)**2(382-388.5)**2\(375-360.6)**2(348-360.6)**2(354-360.6)**2(364-360.6)**2(362-360.6)**2\(413-401.3)**2(383-401.3)**2(408-401.3)**2
df_e 12-3 # 自由度共12个样本3个水平
MS_e SS_e/df_e
print(Residual sum_sq:, SS_e)
print(Residual mean_sq:, MS_e)C(Treat) sum_sq: 3536.007500999999
C(Treat) mean_sq: 1768.0037504999996Residual sum_sq: 1718.8700000000003
Residual mean_sq: 190.9855555555556## 计算F
F MS_A / MS_e
print(MS_A:, MS_A)
print(MS_e:, MS_e)
print(F:, F)MS_A: 1768.0037504999996
MS_e: 190.9855555555556
F: 9.2572642227160817 获取F分布对应的P值
from scipy.stats import f #导入f
PR f.sf(F, df_A, df_e)
print(PR)m df_A #设置自由度m
n df_e #设置自由度n
alpha0.05 #设置alphaaf.ppf(qalpha, dfnm, dfdn) #单侧左分位点
bf.isf(qalpha, dfnm, dfdn) #单侧右分位点
print(单侧左、右分位点a%.4f, b%.4f%(a, b))a1, b1f.interval(1-alpha, dfnm, dfdn) #双侧分位点
print(双侧左、右分位点a%.4f, b%.4f%(a1, b1))## 可以发现 MS_A/MS_e 9.25 Fm,n(0.05) 5.7147 拒绝原假设H0即存在组间差异0.0065472957497462216
单侧左、右分位点a0.0516, b4.2565
双侧左、右分位点a0.0254, b5.71473. 方差分析公式及原理参考 原理参考https://zhuanlan.zhihu.com/p/33357167 (方差分析的好文章)