第一步:创建数据:

import pandas as pd
import matplotlib as plt
plt.rcParams['font.sans-serif'] = ['KaiTi']import warnings
warnings.filterwarnings("ignore")
data = [['Male', '高中及以下', 63.0],['Male', '高中及以下', 64.0],['Male', '高中及以下', 60.0],['Male', '高中及以下', 63.0],['Male', '高中及以下', 66.0],['Male', '高中及以下', 65.0],['Male', '高中及以下', 61.0],['Male', '高中及以下', 62.0],['Male', '高中及以下', 68.0],['Male', '大学本科', 66.5],['Male', '大学本科', 67.0],['Male', '大学本科', 69.5],['Male', '大学本科', 70.0],['Male', '大学本科', 69.0],['Male', '大学本科', 71.5],['Male', '大学本科', 67.0],['Male', '大学本科', 68.5],['Male', '大学本科', 63.5],['Male', '研究生及以上', 88.0],['Male', '研究生及以上', 89.0],['Male', '研究生及以上', 86.0],['Male', '研究生及以上', 92.0],['Male', '研究生及以上', 90.0],['Male', '研究生及以上', 84.0],['Male', '研究生及以上', 91.0],['Male', '研究生及以上', 87.0],['Male', '研究生及以上', 88.0],['Male', '研究生及以上', 85.0],['Female', '高中及以下', 65.0],['Female', '高中及以下', 66.0],['Female', '高中及以下', 61.0],['Female', '高中及以下', 64.0],['Female', '高中及以下', 69.0],['Female', '高中及以下', 70.0],['Female', '高中及以下', 67.0],['Female', '高中及以下', 63.0],['Female', '高中及以下', 63.0],['Female', '高中及以下', 66.0],['Female', '大学本科', 70.0],['Female', '大学本科', 71.0],['Female', '大学本科', 66.0],['Female', '大学本科', 69.0],['Female', '大学本科', 74.0],['Female', '大学本科', 73.0],['Female', '大学本科', 72.0],['Female', '大学本科', 68.0],['Female', '大学本科', 65.0],['Female', '大学本科', 64.0],['Female', '研究生及以上', 82.0],['Female', '研究生及以上', 83.0],['Female', '研究生及以上', 88.0],['Female', '研究生及以上', 91.0],['Female', '研究生及以上', 90.0],['Female', '研究生及以上', 86.0],['Female', '研究生及以上', 84.0],['Female', '研究生及以上', 80.0],['Female', '研究生及以上', 85.0],['Female', '研究生及以上', 76.0]]

2:转成DataFrame格式并查看

df = pd.DataFrame(data, columns = ['gender', 'education', 'Index'])
print(df)

转换数据格式

df1 = pd.DataFrame()
data_list = []
for i in df.gender.unique():for j in df.education.unique():data = df[(df.gender == i)&(df.education == j)]['Index'].valuesdata_list.append(data)df1 = df1.append(pd.DataFrame(data, columns = pd.MultiIndex.from_arrays([[i],[j]])).T)
df1 = df1.T
print(df1)

3:查看数据分布:通过绘制箱线图,检测是否有异常点

# 查看各组数量分布
print(df1.count())
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize = (12,8))
sns.boxplot(x = 'gender', y = 'Index', data = df, hue = 'education')  # 传入的为DataFrame ,x, y,hue,可指定其索引
plt.show()

进行方差分析的条件检验:正态性和方差齐性检验。

from scipy import stats
# Shapiro-Wilk 检验(小数据量的正态分布检验)  :正态检验(方差分析前提1)
sw_test_res = pd.DataFrame()
for i in df1.columns:statistic, pvalue = stats.shapiro(df1[i].dropna())sw_test_res[i]  = [statistic, pvalue]
sw_test_res.index = ['statistic', 'p_value']
print(sw_test_res.T.round(3))# levene test :方差齐性检验
print('基于中位数的levene test P值:', stats.levene(*data_list, center='median').pvalue)

经检测:p值均大于0.05,符合显著性要求

进行交互作用判断:

# 判断交互作用
# df1.mean() # 为Series
df_mean = df1.mean().unstack().round(1)  # unstack :分层索引重置方法将series换为DataFrame, 并保留数据小数点一位
df_mean.columns = ['大学本科', '研究生及以上', '高中及以下']
df_mean = df_mean[['高中及以下', '大学本科', '研究生及以上']]
print(df_mean)

绘图查看两个因素之间是否存在交互作用

# 定义一个绘图函数
def draw_pics(data, feature):fig, ax = plt.subplots(figsize=(8, 6))for i in data.index:ax.plot(data.columns, data.loc[i, :], label = i, marker='o')ax.legend()ax.set_title("幸福指数平均值")ax.set_xlabel(feature, fontdict={'fontsize': 14})ax.set_ylabel("平均值", fontdict={'fontsize': 14})plt.show()
# 绘制不同的性别在不同的教育程度下的均值变化
draw_pics(df_mean, 'education')# 结论:存在双因素交互作用# 绘制不同的教育程度在不同的性别下的均值变化
draw_pics(df_mean.T, 'gender')

结论:存在双因素交互作用。

进行多因素方差分析(结论在注释里):

from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
# 进行多因素方差分析
print(df)
anova = ols('Index ~ C(gender) + C(education) + C(gender)*C(education)',data = df).fit()
print(anova_lm(anova, typ=1))
"""性别P = 0.404大于0.05,表明性别对幸福指数没有影响
教育P < 0.001,表明教育对于幸福指数有显著影响
交互项具F(2,52)=4.148,P= 0.021,有统计学意义,表明性别和受教育程度在对幸福指数的影响上存在交互作用
"""
import statsmodels.api as sm
# 不同教育程度的事后多重比较
print(sm.stats.multicomp.pairwise_tukeyhsd(groups=df.education, endog=df.Index).summary())
"""大学本科学历 的幸福指数比 高中及以下学历 的人高4.13(95%CI:1.55-6.72),P=0.001;
研究生及以上学历 的幸福指数比 高中及以下学历 的人高21.72(95%CI:19.17-24.28),P<0.001;
研究生及以上学历 的幸福指数比 大学本科学历 的人高17.59(95%CI:15.04-20.15),P<0.001。
"""

不同教育程度的事后多重比较和性别的单独效应(结论在注释里)
import statsmodels.api as sm
# 不同教育程度的事后多重比较
print(sm.stats.multicomp.pairwise_tukeyhsd(groups=df.education, endog=df.Index).summary())
"""大学本科学历 的幸福指数比 高中及以下学历 的人高4.13(95%CI:1.55-6.72),P=0.001;
研究生及以上学历 的幸福指数比 高中及以下学历 的人高21.72(95%CI:19.17-24.28),P<0.001;
研究生及以上学历 的幸福指数比 大学本科学历 的人高17.59(95%CI:15.04-20.15),P<0.001。
"""# 性别的单独效应
gender_pc_df = pd.DataFrame()
for i in df.gender.unique():pc = sm.stats.multicomp.pairwise_tukeyhsd(groups = df.query("gender == @i").education,endog=df.query("gender == @i").Index).summary()pc_df = pd.DataFrame(pc, index = [i] * (df.education.nunique() + 1), )[1:]gender_pc_df = gender_pc_df.append(pc_df)gender_pc_df.columns = ['group1', 'group2', 'meandiff', 'p-adj', 'lower', 'upper', 'reject']
print(gender_pc_df)
"""男性中:高中及以下学历 的幸福指数评分比 大学本科学历 的低4.50(95%CI:1.58 - 7.42),P = 0.0021;
高中及以下学历 的幸福指数评分比 研究生及以上学历 的低24.44(95%CI:21.60 - 27.29),P = 0.001。
大学本科学历 的幸福指数评分比 研究生及以上学历 的低19.94(95%CI:17.10 - 22.79),P = 0.001。
女性中:高中及以下学历 的幸福指数评分比 大学本科学历 没有显著性差异,P = 0.071;
高中及以下学历 比 研究生及以上学历 的低19.10(95%CI:15.02 - 23.17),P = 0.001。
大学本科学历 的幸福指数评分比 研究生及以上学历 的低15.30(95%CI:11.23 - 19.37),P = 0.001。
"""

双因素方差分析之Python实例相关推荐

  1. Python玩转数据分析——双因素方差分析

    概念 方差分析(Analysis of Variance,简称ANOVA),又称"变异数分析"或"F检验",用于两个及两个以上样本均数差别的显著性检验.双因素方 ...

  2. python基于pingouin包进行统计分析:anova函数执行非平衡双因素方差分析(Two-Way ANOVA、设置effsize参数为n2)、以dataframe的形式输出分析结果

    python基于pingouin包进行统计分析:使用anova函数执行非平衡双因素方差分析(Two-Way  ANOVA.设置effsize参数为n2).以dataframe的形式输出分析结果(包含S ...

  3. 双因素方差分析_多因素方差分析

    总第173篇/张俊红 01.前言 在前面我们讲过简单的单因素方差分析,这一篇我们讲讲双因素方差分析以及多因素方差分析,双因素方差分析是最简单的多因素方差分析. 单因素分析就是只考虑一个因素会对要比较的 ...

  4. 【数据分析】双因素方差分析

    0.双因素方差分析的分类 无交互作用的方差分析 假定因素AAA和因素BBB的效应之间是相互独立的,不存在相互关系. 有交互作用的方差分析 假定因素AAA和因素BBB的结合会产生出一种新的效应. 无交互 ...

  5. R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA)、使用HH包中的interaction2wt函数为任何阶的双因素方差分析可视化主效应和交互作用图、箱图显示主效应

    R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA).使用HH包中的interaction2wt函数为任何阶的双因素方差分析可视化主效应和交互作用图(Main ef ...

  6. R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA)、在双因素方差分析中,受试者被分配到由两个因素交叉分类形成的组(Two-way factorial ANOVA)

    R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA).在双因素方差分析中,受试者被分配到由两个因素交叉分类形成的组(Two-way factorial ANOVA) ...

  7. R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA)、使用interaction.plot函数在双因素方差分析中可视化交互作用(Interaction)

    R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA).使用interaction.plot函数在双因素方差分析中显示(可视化)交互作用(Interaction) 目 ...

  8. R语言双因素方差分析

    R语言双因素方差分析 条件: 各个样本是相互独立的随机: 各个样本来自正态总体: 具有方差齐性: 用途: 检验两个或多样本均数间的差异有无统计学意义:注:本均数的比较可以采用 t检验或 F检验,两个以 ...

  9. 第13章重复测量和双因素方差分析

    第1章统计学入门 第2章频数分布略 第3章集中趋势的测量 第4章变异性 第5章分数的位置及标准化分布 第6章概率和正态分布 第7章概率和样本:样本均值的分布 第8章假设检验介绍 第9章t检验介绍 第1 ...

最新文章

  1. 网站robots.txt探测工具Parsero
  2. 朱峰谈概念设计(六):美术部门
  3. 从popup window出发做navigation
  4. Spring MVC定制用户登录注销实现示例
  5. 中大计算机考研复试刷人太狠,中山大学考研复试被刷原因大盘点!
  6. 持续集成之 Spring Boot 实战篇
  7. win7系统0xt000000f错误代码的解决方法
  8. 1.7 编程基础之字符串 33 判断字符串是否为回文 python
  9. 一点php博客,PHP一点认识
  10. python oj题目_Python OJ 从入门到入门基础练习 10 题
  11. VC++模拟鼠标点击
  12. 简单java数组程序_最简单易懂的java数组排序方法整理
  13. Objective-C概述
  14. Angular测试机床TestBed
  15. 如何利用SPSS进行秩和检验
  16. 墨天轮“高可用架构”干货文档分享(含Oracle、MySQL、PG资料124篇)
  17. 查找网络上的计算机快捷键,电脑表格查找快捷键ctrl加什么(表格快捷键各种用法大全)...
  18. 今天收到一封非常牛B的离职信
  19. el-input实现防抖
  20. iOS安全攻与防(总篇)

热门文章

  1. SSN:Temporal Action Detection with Structured Segment Networks
  2. C语言课程设计之井字棋
  3. git submodule 添加子仓库
  4. BUUCTF-WEB-Upload[详细wp]
  5. 恢复安卓谷歌套件 to replace
  6. 玩飞开发板:目前手上有哪些板子
  7. 动态加载laydate 失效_【技术帖】弹簧制动缸支架失效分析与解决方案
  8. java 替换word文档中的内容
  9. 没有什么比破除束缚更自由的事情了
  10. 未来简史第一章:人类的新议题