python案例认为比赛用球不同影响技术吗?

wen python案例 14

本文目录导读:

python案例认为比赛用球不同影响技术吗?

  1. 问题拆解
  2. 完整Python案例
  3. 关键结论解读
  4. 实际研究中的注意事项
  5. 如果要分析真实比赛数据

这是一个很有意思的统计推断问题,下面用Python完整演示如何检验"比赛用球不同是否影响技术表现"。

问题拆解

"技术表现"需要量化指标,常见的有:

  • 投篮命中率、传球成功率
  • 控球时间、失误次数
  • 跑动距离、冲刺次数

核心统计问题是:不同用球条件下,技术指标是否存在显著差异?

下面用模拟数据演示完整流程(篮球投篮命中率场景)。

完整Python案例

import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
np.random.seed(42)
# ========== 1. 构造模拟数据 ==========
# 场景:同一批球员分别用 A球(旧球) 和 B球(新球) 各投100次
# 真实设定:B球略微影响手感(命中率下降约3%)
n_players = 30
players = [f"P{i}" for i in range(n_players)]
# 每个球员的基础命中率(个体差异)
base_skill = np.random.normal(0.45, 0.08, n_players)
base_skill = np.clip(base_skill, 0.25, 0.65)
data = []
for i, p in enumerate(players):
    # A球:正常发挥
    hits_A = np.random.binomial(100, base_skill[i])
    # B球:命中率略降(模拟用球影响)
    hits_B = np.random.binomial(100, base_skill[i] - 0.03)
    data.append({"player": p, "ball": "A", "hits": hits_A, "shots": 100})
    data.append({"player": p, "ball": "B", "hits": hits_B, "shots": 100})
df = pd.DataFrame(data)
df["rate"] = df["hits"] / df["shots"]
print(df.groupby("ball")["rate"].describe())
# ========== 2. 配对样本 t 检验 ==========
# 因为同一球员两种球都投了 → 配对设计,检验个体内差异
pivot = df.pivot(index="player", columns="ball", values="rate")
diff = pivot["A"] - pivot["B"]   # 正数表示A球命中率更高
t_stat, p_val = stats.ttest_rel(pivot["A"], pivot["B"])
print(f"配对t检验: t={t_stat:.3f}, p={p_val:.4f}")
# 效应量 Cohen's d(配对版)
d = diff.mean() / diff.std(ddof=1)
print(f"Cohen's d = {d:.3f}")
# ========== 3. 非参数检验(稳健性)==========
# 命中率是比例数据,可能不满足正态性 → Wilcoxon 符号秩检验
w_stat, w_p = stats.wilcoxon(pivot["A"], pivot["B"])
print(f"Wilcoxon检验: W={w_stat:.1f}, p={w_p:.4f}")
# 正态性检验
print("差值正态性 Shapiro:", stats.shapiro(diff))
# ========== 4. 可视化 ==========
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
# 箱线图
sns.boxplot(data=df, x="ball", y="rate", ax=axes[0])
axes[0].set_title("命中率分布(A球 vs B球)")
# 配对散点
axes[1].scatter(pivot["A"], pivot["B"], alpha=0.7)
lim = [0.2, 0.7]
axes[1].plot(lim, lim, "r--", label="y=x")
axes[1].set_xlabel("A球命中率"); axes[1].set_ylabel("B球命中率")
axes[1].set_title("配对散点(对角线下方=用B球更差)")
axes[1].legend()
# 差值分布
axes[2].hist(diff, bins=15, edgecolor="k")
axes[2].axvline(0, color="r", linestyle="--")
axes[2].set_title("每名球员命中率差值 (A−B)")
plt.tight_layout(); plt.show()
# ========== 5. 贝叶斯视角(可选)==========
# 用 bootstrap 估计差值均值的置信区间
n_boot = 10000
boot_means = [np.random.choice(diff, size=len(diff), replace=True).mean()
              for _ in range(n_boot)]
ci_low, ci_high = np.percentile(boot_means, [2.5, 97.5])
print(f"差值均值 95% CI: [{ci_low:.4f}, {ci_high:.4f}]")
print(f"P(差值>0) ≈ {np.mean(np.array(boot_means) > 0):.3f}")

关键结论解读

检验 判断依据
配对 t 检验 p < 0.05 且差值均值为正 A球命中率显著更高
Wilcoxon 非参数稳健性验证 同上
Cohen's d d≈0.2小 / 0.5中 / 0.8大 衡量影响大小
置信区间 是否包含 0 影响方向的确定性

实际研究中的注意事项

  1. 配对设计是关键——同一批球员用两种球,消除了个体能力差异,统计功效更高。
  2. 样本量:每名球员投100次是模拟理想值;现实中需用功效分析(statsmodels.stats.power)确定最少样本量。
  3. 混杂因素:球的影响可能被疲劳、对手强度、比赛时段掩盖,需随机化用球顺序。
  4. 区分统计显著 vs 实际显著:p<0.05 但命中率只差1%,对比赛意义可能不大,需看效应量。
  5. 比例数据:若每人投篮次数不同,考虑用逻辑回归/混合效应模型(statsmodels 的 GLM 或 MixedLM)而不是简单t检验。

如果要分析真实比赛数据

替换为真实数据集,

# 假设有真实数据:每场比赛的用球型号 + 球员技术统计
# df = pd.read_csv("game_stats.csv")
# 用球型号作为分组变量,技术指标作为因变量
# 若同一球员多场比赛 → 用混合效应模型控制球员随机效应
import statsmodels.formula.api as smf
# model = smf.mixedlm("hit_rate ~ C(ball_type)", df, groups=df["player"]).fit()
# print(model.summary())

一句话总结:是否"影响技术"不是看直觉,而是通过配对/混合效应设计 + 显著性检验 + 效应量 + 置信区间综合判断;Python的 scipy.stats、statsmodels、seaborn 可以完整覆盖这一流程。

需要我把这个案例改成足球/乒乓球场景,或加上混合效应模型的完整代码吗?

友情链接

欧易欧易欧易欧易欧易欧易欧易欧易直播帮篮球控NBA帮比赛虎聊足球

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

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝