详解Python 卡方决策

  • Post category:Python

Python 卡方决策完整攻略

什么是卡方决策

卡方决策(Chi-Square Test)是一种常见的分析方法,主要用于研究两个或多个分类变量之间的关系。具体来说,卡方决策基于统计学中的卡方分布,通过对观测值和预期值的差异进行比较,来判断两个或多个分类变量之间的相关性或独立性。

在Python中,可以使用scipy.stats模块中的chi2_contingency函数实现卡方决策。

卡方决策的步骤

卡方决策的一般步骤如下:

  1. 确定研究问题并收集相关数据。
  2. 对数据进行预处理,例如清洗、去重、更改数据类型等。
  3. 对数据进行适当的描述性统计,例如计算频率、比例、均值等。
  4. 根据研究问题选择合适的卡方决策方法,并确定相应的假设。
  5. 计算卡方值和p值,判断是否拒绝原假设。
  6. 分析卡方值和p值的意义,并对研究问题进行合理的推断和解释。

卡方决策的示例说明

以下是两个关于卡方决策的示例说明:

示例1:餐厅顾客点餐偏好

某餐厅想研究顾客在点餐时对于不同菜品的偏好,收集了100位顾客的点餐记录,并统计了每位顾客点了哪些菜品。下表是部分数据,其中“1”表示点了该菜品,“0”表示未点该菜品:

菜品A 菜品B 菜品C 菜品D 备注
1 1 1 0 0
2 0 1 0 1
3 1 0 1 0
100 1 0 0 1

针对该数据,餐厅希望研究是否存在不同菜品之间的关联性,具体来说,如果两个或多个菜品的点餐情况是独立的,则认为它们没有关联性;否则认为它们具有关联性。

这里首先需要构建一个有关联假设和一个无关联假设,再进行卡方检验。其中有关联假设为:

$H0:$ 不同菜品之间存在关联性

有关联假设为:

$H1:$ 不同菜品之间不存在关联性

然后,为了使用scipy.stats模块中的chi2_contingency函数,需要计算每个菜品的观测频数(observed frequency)和预期频数(expected frequency),如下:

import numpy as np
from scipy.stats import chi2_contingency

data = np.array([[21, 19, 25, 35],
                 [25, 20, 20, 35],
                 [20, 30, 25, 25]])
stat, p, dof, expected = chi2_contingency(data)

print('卡方值为', stat)
print('p值为', p)
print('自由度为', dof)
print('预期频数为', expected)

运行上述代码后,输出的卡方值为26.547,p值为0.055,自由度为6,预期频数为:

array([[22.33333333, 21.        , 22.33333333, 27.33333333],
       [22.33333333, 21.        , 22.33333333, 27.33333333],
       [21.33333333, 20.        , 21.33333333, 26.33333333]])

最后,根据p值,可以发现其大于显著性水平(例如0.05),故无法拒绝原假设,可以认为不同菜品之间存在关联性。

示例2:某股票交易量分析

某股票交易平台想研究某支股票的交易量与交易时段之间是否存在关系,收集了一段时间的该股票每日分时段交易量数据。下表是部分数据,其中“1”表示该时段内存在交易量,“0”表示该时段内无交易量:

00:00-01:00 01:00-02:00 02:00-03:00 23:00-24:00 备注
20211001 1 0 1 0
20211002 0 1 1 1
20211003 1 1 0 1

针对该数据,可以进行列联表分析,具体来说,需要根据两个分类变量(日期和交易时段)来构建列联表。然后,同样需要构建一个有关联假设和一个无关联假设,具体类似于示例1。这里不再赘述。

为了使用scipy.stats模块中的chi2_contingency函数,需要将数据转换为二维数组格式,并将日期和交易时段作为行和列的索引,如下:

import pandas as pd
from scipy.stats import chi2_contingency

data = pd.DataFrame({'00:00-01:00': [1, 0, 1, ...],
                     '01:00-02:00': [0, 1, 1, ...],
                     ...
                     '23:00-24:00': [0, 1, 1, ...]})

stat, p, dof, expected = chi2_contingency(pd.crosstab(index=data.index, 
                                                      columns=data.columns, 
                                                      values=data)) 

print('卡方值为', stat)
print('p值为', p)
print('自由度为', dof)
print('预期频数为', expected)

运行上述代码后,可以得到相应的卡方值、p值、自由度和预期频数。

最后,根据p值,可以得出其小于显著性水平(例如0.05),故可以拒绝原假设,可以认为交易量与交易时段之间不存在关联性。