本文目录导读:

- 案例背景
- 步骤1:模拟数据(模拟两支球队的抢断数据)
- 步骤2:基础统计量
- 步骤3:统计显著性检验(确定差距是否“真实”)
- 步骤4:可视化分析(观察差距大小)
- 步骤5:效应量(衡量差距的实际“大小”)
- 如何判断“差距大不大”?
案例背景
假设你有一份包含多场比赛的抢断数据,数据分为两个队伍(或两个球员),我们需要:
- 加载数据
- 计算总抢断、场均抢断
- 进行显著性检验(如T检验)来判断差距是否“统计显著”
- 通过可视化直观展示分布差异
步骤1:模拟数据(模拟两支球队的抢断数据)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
# 设置随机种子以便复现结果
np.random.seed(42)
# 模拟两支球队的抢断数据(20场比赛)
team_a = np.random.poisson(lam=7.5, size=20) # 平均抢断7.5次
team_b = np.random.poisson(lam=8.2, size=20) # 平均抢断8.2次
# 创建DataFrame
df = pd.DataFrame({
'球队': ['A队']*20 + ['B队']*20,
'抢断次数': np.concatenate([team_a, team_b])
})
print(df.head())
步骤2:基础统计量
# 分组汇总
summary = df.groupby('球队')['抢断次数'].agg(['mean', 'std', 'median', 'sum'])
print("基础统计:\n", summary)
# 输出总抢断差值
diff_total = summary.loc['B队','sum'] - summary.loc['A队','sum']
print(f"\n两队在20场比赛中总抢断差值为:{diff_total:.0f} 次(B队- A队)")
输出示例:
基础统计:
mean std median sum
球队
A队 7.450000 2.500178 7.0 149
B队 7.800000 2.412646 8.0 156
步骤3:统计显著性检验(确定差距是否“真实”)
使用独立样本T检验(假设双方方差相等),若p值小于0.05则认为差距显著。
t_stat, p_value = stats.ttest_ind(team_a, team_b, equal_var=True)
print(f"T统计量:{t_stat:.3f}, P值:{p_value:.4f}")
alpha = 0.05
if p_value < alpha:
print("两队的抢断次数存在显著差异(差距在统计意义上显著)。")
else:
print("没有足够证据表明两队抢断次数有显著差异(差距可能由随机波动引起)。")
输出示例(假设数据):
T统计量:-0.449, P值:0.6562
没有足够证据表明两队抢断次数有显著差异。
注意:这里P值>0.05,说明虽然样本均值相差0.35次/场,但变异较大,不能排除误差导致,因此统计上差距不显著。
步骤4:可视化分析(观察差距大小)
plt.figure(figsize=(10, 5))
# 箱线图展示分布
plt.subplot(1, 2, 1)
sns.boxplot(x='球队', y='抢断次数', data=df)'抢断次数箱线图比较')
plt.ylabel('抢断次数')
# 直方图+密度曲线
plt.subplot(1, 2, 2)
sns.histplot(data=df, x='抢断次数', hue='球队', kde=True, alpha=0.5)'抢断次数分布比较')
plt.xlabel('抢断次数')
plt.tight_layout()
plt.show()
步骤5:效应量(衡量差距的实际“大小”)
仅看P值不够,计算Cohen’s d(效应量),判断差距的实际影响大小:
n1, n2 = len(team_a), len(team_b)
pooled_std = np.sqrt(((n1-1)*np.var(team_a, ddof=1) + (n2-1)*np.var(team_b, ddof=1)) / (n1+n2-2))
cohen_d = (np.mean(team_b) - np.mean(team_a)) / pooled_std
print(f"Cohen‘s d 效应量:{cohen_d:.3f}")
# 效应大小解释(经验法则)
if abs(cohen_d) < 0.2:
print("差距很小(几乎无差别)")
elif abs(cohen_d) < 0.5:
print("差距较小")
elif abs(cohen_d) < 0.8:
print("差距中等")
else:
print("差距很大")
如何判断“差距大不大”?
你在实际使用中,可结合:
- 业务角度:比如一场比赛差0.3次抢断对比赛影响大吗?
- 统计显著:P<0.05 说明差异可能不是随机,但样本小也可能不显著。
- 效应量:Cohen’s d >0.8 通常认为大效果。
建议:如果绝对差值小(如场均差<1),且效应量小、不显著,结论往往是“差距不大,属正常波动”,如果绝对差值大,且P<0.05、d>0.8,则可以明确说差距明显。