本文目录导读:

要查看两支球队的主客场战绩差异,通常需要对比它们在主场和客场比赛中的胜率、得失分、净胜分等关键指标,以下是一个使用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))
计算主客场战绩统计
使用groupby按team和venue分组,计算胜率、平均得分、平均失分、净胜分等。
# 计算胜场数和总场数
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)")
通过上述步骤,你可以:
- 数据分组计算:用
groupby按球队和主客场分组,计算胜率、净胜分等。 - 差异分析:计算主场减去客场的差值,直观判断哪支球队更依赖主场。
- 可视化:柱状图或箱线图清晰展示差异。
- 统计检验:用t检验或Mann-Whitney U检验验证差异是否显著。
如果需要处理真实数据(如API获取的NBA赛程),只需将df替换为真实DataFrame即可,这种方法同样适用于足球、篮球、排球等所有主客场制的体育赛事分析。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播