目录
卡方检验
卡方检验的statsmodels实现
配对卡方检验
相关分析(关联性分析)概述
相关系数的计算原理
相关分析的Python实现
卡方检验的主要用途
卡方检验的基本原理
H0 :观察频数与期望频数没有差别
其原理为考察基于H0的理论频数分布和实际频数分布间的差异大 小,据此求出相应的P值
案例: 所有受访家庭会按照家庭年收入被分为低收入家庭和高收入家 庭两类,现希望考察不同收入级别的家庭其轿车拥有率是否相同。
基于H0成立,即观察频数和期望频数无差别,也就是两组变量 (家庭收入级别与是否拥有轿车)相互不产生影响,两组变量不相 关,如果检验P值很高,则接受H0;如果检验P值很低,则检验不通 过,观察频数和期望频数有差别,两组变量相关。
卡方统计量
卡方统计量的计算公式:
其中A为实际频数,E为期望频数(理论频数)。
卡方统计量的理解:
案例: 所有受访家庭会按照家庭年收入被分为低收入家庭和高收入家 庭两类,现希望考察不同收入级别的家庭其轿车拥有率是否相同。
statsmodels中首先需要建立对应的列联表对象:
Table类的方法: test_nominal_association() 无序分类行、列变量的独立性检验
import pandas as pd
import statsmodels.stats.contingency_tables as tbl
# 读取excel文件
home = pd.read_excel("home_income.xlsx")
# 考察不同收入级别的家庭其轿车拥有率是否相同
table = tbl.Table(pd.crosstab(home.Ts9,home.O1))
res = table.test_nominal_association() # 卡方检验
print("卡方值:",res.statistic)
print("自由度:",res.df)
print("p值:",res.pvalue) # 格式化后的p值
McNemar's检验(配对卡方检验)用于分析两个相关率的变化是否 有统计学意义
案例: 用A、B两种方法检查已确诊的某种疾病患者140名,A法检出91 名(65%),B法检出77名(55%),A、B两法一致的检出56名(40%), 问哪种方法阳性检出率更高?
分析思路:
一般在 b + c < 40 时,需用确切概率法进行检验,或者进行校正
代码实现
statsmodels.stats.contingency_tables中常用的配对卡方的分析使用:
用SquareTable类分析
import numpy as np
import statsmodels.stats.contingency_tables as tbl
table = tbl.SquareTable(np.array([[56,35],[21,28]]))
print(table.summary()) # 查看汇总结果
print(table.symmetry()) # 只查看配对卡方检验的结果
用mcnemar类分析
table = tbl.mcnemar(pd.DataFrame([[56,35],[21,28]]))
table.pvalue # 确切概率结果
什么是相关分析(关联性分析)
相关分析是用于考察变量间数量关系密切程度的分析方法,例如: 身高与体重的关系。
几乎所有涉及到多个变量的假设检验方法,都可以被看作是这些变 量间的关联性分析。
各种相关系数
统计图/统计表在相关分析中的重要性
常用术语(针对两连续变量的相关)
Pearson相关系数
公式理解:标准差代表变量的离散程度(信息量大小); 协方差Cov(X,Y)代表各变量共同携带的信息量大 小; 相关系数代表两个变量总信息量中的共同部分占比。
Spearman秩相关系数
相关分析作为比较简单的方法,在statsmodels中并未作进一步 的完善,因此主要使用scipy实现。
scipy.stats.pearsonr(a, b)
scipy.stats.spearmanr(a, b)
scipy.stats.kendalltau(a, b) # 肯德尔相关系数
scipy.stats.spearmanr(a, b) # 斯皮尔曼秩相关系数
import pandas as pd
from scipy import stats as ss
home = pd.read_excel("home_income.xlsx") # 读取excel文件
# 考察年龄(s3)与总信心指数(index1)间的相关关系
# 先通过散点图,观察两个变量是否为线性关系
home.plot.scatter("s3","index1")
# 年龄分组,重新观察两个变量是否为线性关系
home.groupby("s3").index1.mean().plot()
# 返回皮尔逊相关系数和p值
ss.pearsonr(home.s3,home.index1)