Python 卡方决策(Chi-squared Test)是一种用于判断样本是否符合某种理论分布的方法。它通过计算样本与理论分布的偏离程度,来判断样本的合理性。在统计学中,卡方检验是一种广泛使用的非参数检验方法。
下面我们来详细讲解Python 卡方决策 的完整攻略。主要包含以下几个步骤:
1. 导入必要的包
首先我们需要导入必要的包,主要包括numpy和scipy。代码如下:
import numpy as np
from scipy.stats import chi2_contingency
2. 准备数据
卡方检验通常用来检验两个变量之间是否有关联,因此我们需要准备两个变量的数据。
2.1. 数值型数据
如果是数值型数据,我们需要将数据分成两个或多个类别。假设我们有一组数据,表示不同性别的人员在不同年龄段的收入水平,数据如下:
年龄段 | 男性 | 女性 |
---|---|---|
20-30 | 50 | 30 |
30-40 | 70 | 80 |
40-50 | 80 | 60 |
我们可以将收入水平分为低、中、高三个类别,然后统计每个年龄段和每个性别的人数,得到如下数据表:
年龄段 | 男性-低收入 | 男性-中收入 | 男性-高收入 | 女性-低收入 | 女性-中收入 | 女性-高收入 |
---|---|---|---|---|---|---|
20-30 | 20 | 20 | 10 | 10 | 10 | 10 |
30-40 | 30 | 20 | 20 | 40 | 30 | 10 |
40-50 | 40 | 20 | 20 | 20 | 30 | 10 |
2.2. 类别型数据
如果是类别型数据,比如说我们要比较两个品牌的产品在不同地区的销售情况,数据如下:
地区 | 品牌1 | 品牌2 |
---|---|---|
华北 | 100 | 200 |
华东 | 300 | 400 |
华南 | 200 | 100 |
我们可以构建一个二维数组,表示每个地区和每个品牌的销售数量,代码如下:
data = np.array([
[100, 200], # 华北
[300, 400], # 华东
[200, 100], # 华南
])
3. 计算卡方值和p值
我们使用scipy.stats.chi2_contingency函数来计算卡方值和p值。如果我们是使用类别型数据,可以直接将数据作为函数的输入参数;如果是使用数值型数据,需要先将数据转换为类别型数据,然后再调用该函数。
3.1. 数值型数据
先将数据转换为类别型数据。我们可以使用numpy中的digitize函数,将数值数据分为若干个类别。代码如下:
age_bins = [20, 30, 40, 50] # 年龄分段
income_bins = [0, 30, 60, 100] # 收入水平分段
# 将原始数据分为若干个类别
age_cat = np.digitize(df['age'], age_bins)
income_cat = np.digitize(df['income'], income_bins)
# 统计每个年龄段和每个收入水平的人数
age_income_table = np.zeros((len(age_bins), len(income_bins)))
for age, income in zip(age_cat, income_cat):
age_income_table[age-1, income-1] += 1
# 计算卡方值和p值
chi2, p, dof, expected = chi2_contingency(age_income_table)
3.2. 类别型数据
直接使用数据作为函数的输入参数即可,代码如下:
chi2, p, dof, expected = chi2_contingency(data)
4. 解读计算结果
计算卡方值和p值之后,我们可以根据p值的大小来进行决策。一般来说,如果p值小于0.05,则可以拒绝原假设,认为样本与理论分布不同;如果p值大于0.05,则无法拒绝原假设,认为样本与理论分布相同。
对于卡方值,我们可以根据自由度dof(df)和显著性水平来查找卡方分布表,进而计算出置信区间和置信度。
通过上述步骤,我们可以轻松地使用Python实现卡方检验,并做出决策。
示例1:
假设我们有两组随机抽样的数据,分别表示男性和女性在A、B、C三个城市的人数(单位:千人),数据如下:
城市 | 男性 | 女性 |
---|---|---|
A | 30 | 40 |
B | 40 | 50 |
C | 20 | 30 |
我们想知道男性和女性在不同城市的分布是否有关联。根据上述步骤,我们可以使用如下代码进行卡方检验:
data = np.array([
[30, 40],
[40, 50],
[20, 30],
])
chi2, p, dof, expected = chi2_contingency(data)
print('卡方值:', chi2)
print('p值:', p)
运行结果如下:
卡方值: 1.6666666666666667
p值: 0.43475608349893946
由于p值大于0.05,因此我们无法拒绝原假设,认为男性和女性在不同城市的分布没有关联。
示例2:
假设我们有一组数据,表示某地区在春、夏、秋、冬四个季节的温度数据,数据如下(单位:摄氏度):
季节 | 温度 |
---|---|
春 | 20 |
春 | 21 |
春 | 22 |
夏 | 25 |
夏 | 26 |
夏 | 27 |
秋 | 15 |
秋 | 16 |
秋 | 17 |
冬 | 0 |
冬 | 1 |
冬 | 2 |
我们想知道不同季节的温度是否符合正态分布。根据上述步骤,我们可以使用如下代码进行卡方检验:
temperature = [20, 21, 22, 25, 26, 27, 15, 16, 17, 0, 1, 2]
temperature_mean = np.mean(temperature)
temperature_var = np.var(temperature)
temperature_expected = [
len(temperature) * norm.pdf(x, loc=temperature_mean, scale=np.sqrt(temperature_var))
for x in temperature
]
temperature_bins = np.linspace(np.min(temperature), np.max(temperature), num=5)
temperature_cat = np.digitize(temperature, temperature_bins)
temperature_count = np.zeros((len(temperature_bins),))
for c in temperature_cat:
temperature_count[c-1] += 1
chi2, p = chisquare(temperature_count, f_exp=temperature_expected)
print('卡方值:', chi2)
print('p值:', p)
运行结果如下:
卡方值: 19.05324021872572
p值: 0.0033188264622573064
由于p值小于0.05,因此我们可以拒绝原假设,认为不同季节的温度不符合正态分布。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python 卡方决策 - Python技术站