Python案例如何用Scipy做统计检验

wen python案例 2

本文目录导读:

Python案例如何用Scipy做统计检验

  1. 单样本t检验(检验均值是否等于某个值)
  2. 独立样本t检验(比较两组数据的均值)
  3. 配对样本t检验(同一组样本前后比较)
  4. 卡方检验(检查分类变量相关性)
  5. 方差分析ANOVA(比较多个组均值)
  6. 正态性检验
  7. 综合案例:数据分析流程
  8. 使用建议

我来介绍几个用Scipy做统计检验的常见Python案例:

单样本t检验(检验均值是否等于某个值)

import numpy as np
from scipy import stats
# 示例数据:某班级学生考试成绩
scores = np.array([85, 78, 92, 88, 76, 95, 82, 90, 79, 84])
# 检验平均分是否等于80分
t_stat, p_value = stats.ttest_1samp(scores, 80)
print(f"t统计量: {t_stat:.3f}")
print(f"p值: {p_value:.3f}")
# 判断结果
if p_value < 0.05:
    print("在0.05显著性水平下,拒绝原假设:平均分不等于80分")
else:
    print("在0.05显著性水平下,不能拒绝原假设:平均分等于80分")

独立样本t检验(比较两组数据的均值)

import numpy as np
from scipy import stats
# 两组独立数据
group1 = np.array([85, 78, 92, 88, 76, 95])
group2 = np.array([72, 68, 75, 70, 82, 65])
# 方差齐性检验
f_stat, f_p = stats.levene(group1, group2)
print(f"方差齐性检验 p值: {f_p:.3f}")
# 独立样本t检验
t_stat, p_value = stats.ttest_ind(group1, group2)
print(f"t统计量: {t_stat:.3f}")
print(f"p值: {p_value:.3f}")
if p_value < 0.05:
    print("两组数据均值存在显著差异")
else:
    print("两组数据均值没有显著差异")

配对样本t检验(同一组样本前后比较)

import numpy as np
from scipy import stats
# 培训前后的成绩
before = np.array([65, 72, 78, 70, 68, 75])
after = np.array([82, 85, 88, 80, 79, 86])
# 配对t检验
t_stat, p_value = stats.ttest_rel(after, before)
print(f"t统计量: {t_stat:.3f}")
print(f"p值: {p_value:.3f}")
if p_value < 0.05:
    print("培训前后的成绩存在显著差异")
else:
    print("培训前后的成绩没有显著差异")

卡方检验(检查分类变量相关性)

import numpy as np
from scipy import stats
# 创建一个列联表:性别与购买意愿
# 行: 男性, 女性
# 列: 愿意购买, 不愿意购买
observed = np.array([[45, 15],   # 男性
                     [30, 10]])  # 女性
# 卡方检验
chi2, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"卡方统计量: {chi2:.3f}")
print(f"p值: {p_value:.3f}")
print(f"自由度: {dof}")
print("期望频数:")
print(expected)
if p_value < 0.05:
    print("性别与购买意愿存在显著关联")
else:
    print("性别与购买意愿没有显著关联")

方差分析ANOVA(比较多个组均值)

import numpy as np
from scipy import stats
# 三组数据
group_a = np.array([85, 82, 88, 90, 86])
group_b = np.array([78, 75, 80, 72, 76])
group_c = np.array([92, 95, 88, 91, 94])
# 单因素方差分析
f_stat, p_value = stats.f_oneway(group_a, group_b, group_c)
print(f"F统计量: {f_stat:.3f}")
print(f"p值: {p_value:.3f}")
if p_value < 0.05:
    print("三组均值存在显著差异")
else:
    print("三组均值没有显著差异")

正态性检验

import numpy as np
from scipy import stats
# 生成数据
normal_data = np.random.normal(0, 1, 100)  # 正态分布
non_normal_data = np.random.uniform(0, 1, 100)  # 均匀分布
# Shapiro-Wilk检验
stat_normal, p_normal = stats.shapiro(normal_data)
stat_non, p_non = stats.shapiro(non_normal_data)
print("正态分布数据:")
print(f"统计量: {stat_normal:.3f}, p值: {p_normal:.3f}")
print("\n非正态分布数据:")
print(f"统计量: {stat_non:.3f}, p值: {p_non:.3f}")
# 也可以使用Kolmogorov-Smirnov检验
ks_stat, ks_p = stats.kstest(normal_data, 'norm')
print(f"\nKS检验p值: {ks_p:.3f}")

综合案例:数据分析流程

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# 生成示例数据
np.random.seed(42)
control = np.random.normal(70, 10, 50)  # 对照组
treatment = np.random.normal(75, 10, 50)  # 实验组
# 1. 描述性统计
print("对照组: 均值={:.2f}, 标准差={:.2f}".format(
    np.mean(control), np.std(control)))
print("实验组: 均值={:.2f}, 标准差={:.2f}".format(
    np.mean(treatment), np.std(treatment)))
# 2. 正态性检验
_, p_control = stats.shapiro(control)
_, p_treatment = stats.shapiro(treatment)
print(f"\n正态性检验: 对照组p={p_control:.3f}, 实验组p={p_treatment:.3f}")
# 3. 方差齐性检验
_, p_levene = stats.levene(control, treatment)
print(f"方差齐性检验p值: {p_levene:.3f}")
# 4. 选择检验方法
if p_control > 0.05 and p_treatment > 0.05 and p_levene > 0.05:
    # 满足条件,使用独立样本t检验
    t_stat, p_value = stats.ttest_ind(control, treatment)
    print(f"\n独立样本t检验: t={t_stat:.3f}, p={p_value:.3f}")
else:
    # 不满足条件,使用Mann-Whitney U检验
    u_stat, p_value = stats.mannwhitneyu(control, treatment)
    print(f"\nMann-Whitney U检验: U={u_stat:.0f}, p={p_value:.3f}")
# 5. 结果解释
if p_value < 0.05:
    print("实验组和控制组存在显著差异")
else:
    print("实验组和控制组没有显著差异")
# 6. 可视化
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.boxplot([control, treatment], labels=['对照组', '实验组'])'箱线图')
plt.subplot(1, 2, 2)
plt.hist(control, alpha=0.7, label='对照组', bins=10)
plt.hist(treatment, alpha=0.7, label='实验组', bins=10)'分布直方图')
plt.legend()
plt.tight_layout()
plt.show()

使用建议

  1. 选择检验方法时考虑

    • 数据类型(连续、分类)
    • 样本分布(正态、非正态)
    • 样本是否配对
    • 比较组数
  2. 检验前预处理

    • 检查异常值
    • 验证假设条件
    • 进行必要的转换
  3. 结果报告

    • 报告检验统计量
    • 报告p值和置信区间
    • 说明显著性水平

这些案例涵盖了常用的统计检验方法,可以根据实际需求选择合适的检验方式。

抱歉,评论功能暂时关闭!