综合python案例,历史交锋数据有何规律?

wen python案例 3

本文目录导读:

综合python案例,历史交锋数据有何规律?

  1. 案例背景与数据说明
  2. 核心代码实现(含注释)
  3. 输出与业务洞察(模仿实际报表)
  4. 规律总结(给业务的建议)
  5. 案例扩展建议

这是一个非常经典的综合Python数据分析案例,针对“历史交锋数据有何规律”这个问题,我设计了一个综合实战案例,包含数据清洗、特征工程、可视化分析、统计检验和规律总结五个维度。

本案例以模拟的网球(或羽毛球)历史交锋数据为例,分析两位选手(或两支球队)的交锋规律。


案例背景与数据说明

业务目标:分析A队与B队历史交锋中,是否存在主场优势近期状态与胜负是否相关?比分分差是否有连续性(即大胜之后是否容易大败)?

数据结构(假设matches.csv文件):

  • date:比赛日期
  • home_team:主队
  • away_team:客队
  • home_score:主队得分
  • away_score:客队得分
  • tournament:赛事级别(如“决赛”、“小组赛”)

核心代码实现(含注释)

数据加载与预处理

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 加载数据(假设已存在)
df = pd.read_csv('matches.csv')
# 统一格式:只分析A队 vs B队
df = df[((df['home_team']=='A队') & (df['away_team']=='B队')) | 
        ((df['home_team']=='B队') & (df['away_team']=='A队'))]
# 特征工程:1-A队赢,0-B队赢
df['A_win'] = np.where((df['home_team']=='A队') & (df['home_score']>df['away_score']) | 
                       (df['home_team']=='B队') & (df['away_score']>df['home_score']), 1, 0)
# 特征工程:主场是否为A队
df['A_home'] = np.where(df['home_team']=='A队', 1, 0)
# 特征工程:比分分差(A队得分 - B队得分)
df['score_diff'] = np.where(df['home_team']=='A队', 
                            df['home_score']-df['away_score'], 
                            df['away_score']-df['home_score'])
# 排序
df = df.sort_values('date').reset_index(drop=True)
print("数据概览:")
print(df.head())

规律一:主场优势检验(卡方检验)

# 建立交叉表:主客场 vs 胜负
contingency_table = pd.crosstab(df['A_home'], df['A_win'], margins=True)
print("\n=== 主客场获胜分布 ===")
print(contingency_table)
# 卡方检验:判断主场与胜负是否独立
chi2, p_value, dof, expected = stats.chi2_contingency(pd.crosstab(df['A_home'], df['A_win']))
print(f"\n卡方统计量={chi2:.3f}, P值={p_value:.3f}")
if p_value < 0.05:
    print("主场与胜负存在显著关联(存在主场优势)")
else:
    print("主场与胜负无显著关联(无主场优势)")

规律二:近期状态与胜负的相关性(线性回归/皮尔逊相关系数)

# 计算近5场胜率(滑动窗口)
df['recent_form'] = df['A_win'].rolling(window=5, min_periods=1).mean().shift(1)  # 避免未来数据
# 去掉缺失值
valid_df = df.dropna(subset=['recent_form'])
# 皮尔逊相关系数
corr, p_val = stats.pearsonr(valid_df['recent_form'], valid_df['A_win'])
print(f"\n=== 近期状态(近5场胜率)与当前胜负相关性 ===")
print(f"相关系数={corr:.3f}, P值={p_val:.3f}")
# 可视化:胜率与胜负关系
sns.regplot(x='recent_form', y='A_win', data=valid_df, logistic=True, ci=None)'近期胜率对当前胜负的影响')
plt.xlabel('近5场胜率')
plt.ylabel('获胜概率')
plt.show()

规律三:分差连续性(自相关分析)

# 检验“大胜之后是否容易大败”——看分差的滞后相关性
diff_series = df['score_diff']
# 计算滞后1期的自相关系数
lag1_corr = diff_series.autocorr(lag=1)
lag2_corr = diff_series.autocorr(lag=2)
print(f"\n=== 比分分差连续性分析 ===")
print(f"滞后1期自相关={lag1_corr:.3f}")
print(f"滞后2期自相关={lag2_corr:.3f}")
# 画分差随时间变化的折线图
plt.figure(figsize=(12,4))
plt.plot(df['date'], diff_series, marker='o', markersize=4)
plt.axhline(0, color='red', linestyle='--')'历史交锋比分分差变化趋势')
plt.ylabel('A队净胜分')
plt.xticks(rotation=45)
plt.show()

规律四:赛事级别的影响(方差分析)

# 分析不同赛事级别下,胜负是否有显著差异
grouped = df.groupby('tournament')['A_win'].mean()
print("\n=== 不同赛事级别下A队胜率 ===")
print(grouped)
# 单因素方差分析(检验不同赛事级别是否影响胜负)
f_stat, p_value_anova = stats.f_oneway(
    df[df['tournament']=='决赛']['A_win'],
    df[df['tournament']=='小组赛']['A_win'],
    df[df['tournament']=='友谊赛']['A_win']
)
print(f"\nF统计量={f_stat:.3f}, P值={p_value_anova:.3f}")

输出与业务洞察(模仿实际报表)

运行以上代码后,你可能会得到如下输出(基于模拟数据):

数据概览:
        date home_team away_team  home_score  away_score tournament  A_win  A_home  score_diff
0  2020-01-01      A队       B队          3          1      小组赛      1       1           2
...
=== 主客场获胜分布 ===
A_home   0   1  All
A_win              
0        12  10   22
1         8  15   23
All     20  25   45
卡方统计量=1.820, P值=0.177
主场与胜负无显著关联(无主场优势)
=== 近期状态与当前胜负相关性 ===
相关系数=0.45, P值=0.002
近期状态与胜负呈显著正相关,状态好的队伍胜率更高。
=== 比分分差连续性分析 ===
滞后1期自相关=-0.15
滞后2期自相关=0.05
分差无显著自相关,胜负分差更多是随机波动,不存在“大胜后必大败”的规律。
=== 不同赛事级别下A队胜率 ===
tournament
友谊赛    0.60
小组赛    0.50
决赛      0.75
Name: A_win, dtype: float64
F统计量=1.232, P值=0.310
赛事级别对胜负影响不显著(但决赛A队胜率较高,可能样本量小)。

规律总结(给业务的建议)

基于上述案例,我们可以得出以下综合规律

  1. 客观规律:不存在明显的主场优势(P值 > 0.05),数据显示主场胜率仅55%,双方实力接近。
  2. 核心规律近期状态是胜负的核心预测指标(相关系数0.45,P<0.01),如果A队近5场胜率高于60%,本场获胜概率显著提升,建议球队重点关注连续作战的体能管理和连胜士气。
  3. 市场规律比分分差具有随机性,历史数据显示,上一场赢2分和赢0分的队伍,在本场获胜概率无显著差异,对于博彩或预测模型,不宜用“上一场大胜”来预测下一场大胜,应回归基本面实力。
  4. 赛事规律:不同赛事级别虽然未达到统计学显著水平,但在决赛中A队胜率较高(75%),这可能与A队大赛经验丰富有关,建议在关键赛事中给予A队更高权重。

案例扩展建议

  • 加入机器学习:用逻辑回归构建包含主场、近期状态、Elo等级分的预测模型。
  • 可视化增强:使用热力图展示交互效应(如主场×状态的胜率矩阵)。
  • 数据扩充:加入球员伤病、教练轮换等更细粒度数据,进行更深度挖掘。

这个案例覆盖了统计学假设检验、时序分析和机器学习预处理的核心知识点,可以直接用于答辩展示或数据分析报告,实际项目中,你只需替换为真实的CSV数据文件即可运行。

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