python做卡方检验 python 卡方检验_应用实例


什么是卡方检验

卡方检验是一种用途很广的基于卡方分布的假设检验方法,其根本思想就是在于比较理论频数和实际频数的吻合程度或拟合优度问题。其主要应用于分类变量,根据样本数据推断总体分布与期望分布是否有显著差异或推断两个分类变量是否相关或相互独立。

卡方检验分类


python做卡方检验 python 卡方检验_假设检验_02


卡方检验步骤

卡方检验可以参照一般假设检验步骤:

  • 设置原假设与备择假设
  • 设置显著性水平
  • 根据问题选择具体的假设检验方式
  • 计算统计量,并通过统计量获取P值
  • 根据P值与显著性水平,决定接受原假设还是备择假设

一般可以设原假设为:观察频数与期望频数没有差异,或者两个变量相互独立不相关。

卡方检验的计算公式为:


python做卡方检验 python 卡方检验_卡方分布公式_03


从公式也可以看出它是利用类别变量的观测值频数与期望值频数进行构建的。

卡方检验的应用实例

  1. 应用实例--拟合优度检验

以掷骰子为例,有一天小王同学闲来无事,发现桌上刚好有一枚骰子,身为数据分析师的他,好奇骰子是不是均匀的,于是他连着投掷了120次,并统计了各点出现的次数。由于原假设骰子是均衡的,所以每点数期望值都为20。


python做卡方检验 python 卡方检验_卡方分布公式_04


第一步我们确定原假设即骰子是均衡的,第二步设置显著性水平α=0.05,在确立使用卡方检验之后


python做卡方检验 python 卡方检验_假设检验_05


确定上述统计值之后,并结合卡方表就可对其进行判断。


python做卡方检验 python 卡方检验_卡方检验_06


接下来用python实现


import pandas as pd 
import numpy as np 
from scipy import stats
#创建上述表
observed_pd = pd.DataFrame(['1点']*23+['2点']*20+['3点']*18+['4点']*19+['5点']*24+['6点']*16)
expected_pd = pd.DataFrame(['1点']*20+['2点']*20+['3点']*20+['4点']*20+['5点']*20+['6点']*20)
observed_table = pd.crosstab(index=observed_pd[0],columns='count')
expected_table = pd.crosstab(index=expected_pd[0],columns='count')
print(observed_table)
print('——————')
print(expected_table)
#通过公式算出卡方值
observed = observed_table 
expected = expected_table 
chi_squared_stat = ((observed-expected)**2/expected).sum()
print('chi_squared_stat')
print(chi_squared_stat)


有两种实现方式


#方法一
crit = stats.chi2.ppf(q=0.95,df=5)  #95置信水平 df = 自由度
print(crit) #临界值,拒绝域的边界 当卡方值大于临界值,则原假设不成立,备择假设成立
P_value = 1-stats.chi2.cdf(x=chi_squared_stat,df=5)
print('P_value')
print(P_value) 
# 方法二 
stats.chisquare(f_obs=observed, #Array of obversed counts
                f_exp=expected) #Array of expected counts


python做卡方检验 python 卡方检验_python做卡方检验_07


可以看出P值要远大于显著性水平α,所以我们没有理由拒绝原假设,即骰子是均匀的。

2.应用实例--交叉表卡方

在日常的数据分析工作中,卡方检验主要用于留存率,渗透率等漏斗指标,下面我们就以留存率为例,假设平台从微博、微信、知乎渠道引流,现在我们要确定留存率是否与渠道有关。(示例数据皆为虚构)

第一步我们先设立原假设:留存率与渠道无关;第二步设置显著性水平α=0.05,在确立使用卡方检验之后接下来用python实现


df = pd.DataFrame(columns = ['register','stay'],index = ['weibo','zhihu','weixin'],
                 data=[[11570,3173],[15113,3901],[18244,4899]])
df['lost'] = df['register']- df['stay'] 
df


python做卡方检验 python 卡方检验_卡方检验_08


observed = df[['stay','lost']]
stats.chi2_contingency(observed=observed)


python做卡方检验 python 卡方检验_python做卡方检验_09


可以看出P值要小于我们原先定的显著性水平α,所以我们有理由拒绝原假设,即用户渠道的确影响了留存情况,两者并不是相互独立的。