Python案例怎么看两队的主客场战绩差异?

wen python案例 2

本文目录导读:

Python案例怎么看两队的主客场战绩差异?

  1. 数据准备
  2. 计算主客场战绩统计
  3. 对比分析:查看差异
  4. 可视化展示
  5. 扩展:统计显著性检验

要查看两支球队的主客场战绩差异,通常需要对比它们在主场客场比赛中的胜率、得失分、净胜分等关键指标,以下是一个使用Python进行此类分析的案例,包含了数据准备、计算和可视化步骤。

数据准备

我们模拟两支球队(湖人队和凯尔特人队)的主客场战绩数据,实际应用中,数据通常从CSV、数据库或API获取。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 模拟数据:包含球队、主客场、比赛结果、得分、失分
data = {
    'team': ['Lakers', 'Lakers', 'Lakers', 'Lakers', 'Lakers', 'Lakers', 'Lakers', 'Lakers', 'Lakers', 'Lakers',
             'Celtics', 'Celtics', 'Celtics', 'Celtics', 'Celtics', 'Celtics', 'Celtics', 'Celtics', 'Celtics', 'Celtics'],
    'venue': ['Home', 'Home', 'Home', 'Home', 'Home', 'Away', 'Away', 'Away', 'Away', 'Away',
              'Home', 'Home', 'Home', 'Home', 'Home', 'Away', 'Away', 'Away', 'Away', 'Away'],
    'result': ['Win', 'Win', 'Loss', 'Win', 'Loss', 'Win', 'Loss', 'Loss', 'Win', 'Loss',
               'Win', 'Loss', 'Win', 'Win', 'Win', 'Loss', 'Win', 'Loss', 'Loss', 'Win'],
    'points_for': [110, 115, 102, 108, 95, 105, 98, 100, 112, 97,
                   120, 115, 118, 122, 109, 108, 114, 102, 100, 116],
    'points_against': [100, 108, 110, 104, 103, 98, 105, 112, 107, 102,
                       110, 117, 109, 111, 112, 114, 108, 110, 115, 109]
}
df = pd.DataFrame(data)
print("原始数据预览:")
print(df.head(10))

计算主客场战绩统计

使用groupbyteamvenue分组,计算胜率、平均得分、平均失分、净胜分等。

# 计算胜场数和总场数
team_venue_stats = df.groupby(['team', 'venue']).agg(
    total_games=('result', 'count'),
    wins=('result', lambda x: (x == 'Win').sum()),
    avg_points_for=('points_for', 'mean'),
    avg_points_against=('points_against', 'mean')
).reset_index()
# 计算胜率和净胜分
team_venue_stats['win_rate'] = team_venue_stats['wins'] / team_venue_stats['total_games']
team_venue_stats['avg_net_points'] = team_venue_stats['avg_points_for'] - team_venue_stats['avg_points_against']
print("\n各球队主客场战绩统计:")
print(team_venue_stats.to_string(index=False))

对比分析:查看差异

计算每支球队主场与客场的差异,主场胜率 - 客场胜率,主场净胜分 - 客场净胜分。

# 分离主场和客场数据
home_stats = team_venue_stats[team_venue_stats['venue'] == 'Home'][['team', 'win_rate', 'avg_net_points']]
away_stats = team_venue_stats[team_venue_stats['venue'] == 'Away'][['team', 'win_rate', 'avg_net_points']]
# 合并并计算差异
diff_df = home_stats.merge(away_stats, on='team', suffixes=('_home', '_away'))
diff_df['win_rate_diff'] = diff_df['win_rate_home'] - diff_df['win_rate_away']
diff_df['net_points_diff'] = diff_df['avg_net_points_home'] - diff_df['avg_net_points_away']
print("\n主客场差异对比:")
print(diff_df[['team', 'win_rate_diff', 'net_points_diff']].to_string(index=False))
# 结论判断
for _, row in diff_df.iterrows():
    team = row['team']
    wr_diff = row['win_rate_diff']
    np_diff = row['net_points_diff']
    if wr_diff > 0 and np_diff > 0:
        print(f"{team}: 主场表现明显优于客场(胜率+{wr_diff:.2f},净胜分+{np_diff:.1f})")
    elif wr_diff < 0 and np_diff < 0:
        print(f"{team}: 客场表现优于主场(客场胜率更高或净胜分更高)")
    else:
        print(f"{team}: 主客场差异不明显或方向不一致,需进一步分析")

可视化展示

用柱状图直观展示主场与客场的胜率和净胜分对比。

# 设置中文支持(如果环境支持)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 或 ['Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# 胜率对比
for i, team in enumerate(diff_df['team']):
    home_rate = diff_df.loc[i, 'win_rate_home']
    away_rate = diff_df.loc[i, 'win_rate_away']
    axes[0].bar(team + ' 主场', home_rate, width=0.3, label='主场' if i==0 else '', color='blue', alpha=0.7)
    axes[0].bar(team + ' 客场', away_rate, width=0.3, label='客场' if i==1 else '', color='red', alpha=0.7)
axes[0].set_title('主客场胜率对比')
axes[0].set_ylabel('胜率')
axes[0].legend()
# 净胜分对比
for i, team in enumerate(diff_df['team']):
    home_net = diff_df.loc[i, 'avg_net_points_home']
    away_net = diff_df.loc[i, 'avg_net_points_away']
    axes[1].bar(team + ' 主场', home_net, width=0.3, label='主场' if i==0 else '', color='blue', alpha=0.7)
    axes[1].bar(team + ' 客场', away_net, width=0.3, label='客场' if i==1 else '', color='red', alpha=0.7)
axes[1].set_title('主客场平均净胜分对比')
axes[1].set_ylabel('净胜分')
axes[1].legend()
plt.tight_layout()
plt.show()

扩展:统计显著性检验

如果数据量较大,可以进行假设检验(如t检验)判断主场优势是否统计显著。

from scipy.stats import ttest_ind
# 以湖人队为例:检验主场与客场的得分差异是否显著
lakers_home = df[(df['team'] == 'Lakers') & (df['venue'] == 'Home')]['points_for']
lakers_away = df[(df['team'] == 'Lakers') & (df['venue'] == 'Away')]['points_for']
t_stat, p_value = ttest_ind(lakers_home, lakers_away)
print(f"\n湖人队主场 vs 客场得分 t检验: t={t_stat:.3f}, p={p_value:.3f}")
if p_value < 0.05:
    print("差异具有统计显著性(p<0.05)")
else:
    print("差异不具有统计显著性(p>=0.05)")

通过上述步骤,你可以:

  1. 数据分组计算:用groupby按球队和主客场分组,计算胜率、净胜分等。
  2. 差异分析:计算主场减去客场的差值,直观判断哪支球队更依赖主场。
  3. 可视化:柱状图或箱线图清晰展示差异。
  4. 统计检验:用t检验或Mann-Whitney U检验验证差异是否显著。

如果需要处理真实数据(如API获取的NBA赛程),只需将df替换为真实DataFrame即可,这种方法同样适用于足球、篮球、排球等所有主客场制的体育赛事分析。

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