Skip to content

Latest commit

 

History

History
116 lines (95 loc) · 3.53 KB

File metadata and controls

116 lines (95 loc) · 3.53 KB
Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0485
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
- 本教程同步发布在: 
	- 个人网站: `https://oeasy.org` 
	- 蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
	- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
	- Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

卡方

  • 卡方检验是一种用于检验两个或多个分类变量之间是否存在显著关联的统计方法

    • 主要适用于计数数据(如频数表)的分析
  • 其核心思路是:

    • 通过比较实际观测到的频数与理论上期望的频数之间的差异
    • 来判断变量间是否独立
    • 如果实际频数与期望频数差异过大(超出随机误差范围)
      • 则认为变量间存在关联
  • 常见应用场景:

    • 检验性别与是否喜欢某类电影是否有关联(如男性 vs 女性,喜欢动作片 vs 不喜欢)。
    • 分析不同年龄段与购物偏好是否存在显著差异。
    • 验证某种治疗方法的效果与疾病康复情况是否相关等。
  • 卡方检验就像一个“关联探测器”

    • 帮助我们判断分类变量之间的关系是真实存在的,还是由随机因素导致的

检验数据

import numpy as np
from scipy.stats import chi2_contingency

# 构建列联表
# 这里假设是一个 2x2 的列联表,实际应用中可以根据情况修改
obs = np.array([[10, 20], [15, 25]])

# 进行卡方检验
chi2, p, dof, expected = chi2_contingency(obs)

print(f"卡方统计量: {chi2}")
print(f"p 值: {p}")
print(f"自由度: {dof}")
print(f"期望频数: \n{expected}")

性别和观影类型

import pandas as pd
import random
from scipy.stats import chi2_contingency
from faker import Faker  # 导入Faker库

# 初始化中文Faker生成器
fake = Faker('zh_CN')

# 生成200条样本数据
data = []
for _ in range(200):
    # 随机选择性别
    gender = random.choice(['男', '女'])
    
    # 使用Faker生成对应性别的姓名
    last_name = fake.last_name()
    if gender == '男':
        first_name = fake.first_name_male()  # 男性名字
        # 男性70%概率喜欢武打片
        likes_martial = random.random() < 0.7
    else:
        first_name = fake.first_name_female()  # 女性名字
        # 女性30%概率喜欢武打片
        likes_martial = random.random() < 0.3
    
    name = f"{last_name}{first_name}"
    data.append({
        '姓名': name,
        '性别': gender,
        '爱看武打片': likes_martial
    })

# 创建DataFrame并显示前几行数据
df = pd.DataFrame(data)
print("生成的样本数据(前5行):")
print(df.head())

# 创建列联表
contingency_table = pd.crosstab(df['性别'], df['爱看武打片'], 
                               rownames=['性别'], colnames=['爱看武打片'])
print("\n性别与武打片偏好列联表:")
print(contingency_table)

# 执行卡方检验
chi2, p_value, dof, expected = chi2_contingency(contingency_table)

# 输出检验结果
print("\n卡方检验结果:")
print(f"卡方值: {chi2:.4f}")
print(f"p值: {p_value:.4f}")
print(f"自由度: {dof}")

# 根据p值判断关联性
alpha = 0.05
if p_value < alpha:
    conclusion = "拒绝原假设,性别和爱看武打片之间存在显著关联。"
else:
    conclusion = "未能拒绝原假设,性别和爱看武打片之间没有显著关联。"
print(f"结论: {conclusion}")


  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。