足球让球胜平负分布分析案例
下面用一个完整的 Python 案例演示如何分析和可视化让球胜平负的分布。

数据准备
假设你有一批比赛数据(可从 API 或爬虫获取),格式如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示
matplotlib.rcParams['axes.unicode_minus'] = False
# 模拟数据:一场比赛的让球盘口和赛果
data = {
'match_id': range(1, 21),
'home_team': ['A队','B队','C队','D队','E队']*4,
'away_team': ['F队','G队','H队','I队','J队']*4,
'handicap': [-1, -0.5, 0, 0.5, 1, -1.5, -0.5, 0, 0.5, 1.5,
-1, -0.5, 0, 0.5, 1, -1, -0.25, 0.25, 0.75, -0.75],
# 实际赛果(主队视角):home_win / draw / away_win
'result': ['home_win','draw','away_win','home_win','draw',
'away_win','home_win','draw','home_win','away_win',
'home_win','draw','away_win','home_win','draw',
'away_win','home_win','draw','home_win','away_win'],
# 让球后赛果:让球胜 / 让球平 / 让球负
'handicap_result': ['win','push','lose','win','win',
'lose','win','push','win','lose',
'win','push','lose','win','win',
'lose','win','push','win','lose']
}
df = pd.DataFrame(data)
print(df.head())
统计让球胜平负的分布
# 整体分布
overall = df['handicap_result'].value_counts(normalize=True).sort_index()
print("整体分布:\n", overall)
# 按盘口分组统计
by_handicap = pd.crosstab(df['handicap'], df['handicap_result'], normalize='index')
print("\n各盘口下的分布:\n", by_handicap)
可视化分布
饼图 —— 整体占比
labels = {'win':'让球胜','push':'让球平','lose':'让球负'}
overall.plot.pie(
autopct='%.1f%%',
labels=[labels[i] for i in overall.index],
colors=['#4CAF50','#FFC107','#F44336'],
startangle=90, figsize=(6,6)
)'让球胜平负整体分布')
plt.ylabel('')
plt.show()
堆叠柱状图 —— 按盘口
by_handicap.plot(kind='bar', stacked=True,
color=['#F44336','#FFC107','#4CAF50'],
figsize=(10,5))'不同让球盘口的胜平负分布')
plt.xlabel('让球盘口(负=主让,正=主受让)')
plt.ylabel('占比')
plt.legend(['让球负','让球平','让球胜'])
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()
热力图 —— 盘口 × 结果
import seaborn as sns pivot = pd.crosstab(df['handicap'], df['handicap_result'], normalize='index') sns.heatmap(pivot, annot=True, fmt='.2f', cmap='YlOrRd')'让球盘口 × 胜平负 热力图') plt.show()
进阶分析
计算赔率隐含概率 vs 实际概率
# 假设某盘口的欧赔:胜2.10 / 平3.40 / 负3.20
odds = np.array([2.10, 3.40, 3.20])
implied = (1/odds) / (1/odds).sum()
print("隐含概率:", dict(zip(['胜','平','负'], implied.round(3))))
# 实际概率(以该盘口为例)
actual = df[df['handicap']==-0.5]['handicap_result'].value_counts(normalize=True)
print("实际概率:\n", actual)
按主客场或时间维度细分
# 假设字段中有日期和主客
df['month'] = pd.to_datetime('2024-01-01') + pd.to_timedelta(df.index, unit='D')
df['month'] = df['month'].dt.to_period('M')
monthly = pd.crosstab(df['month'], df['handicap_result'], normalize='index')
monthly.plot(kind='line', marker='o', figsize=(10,5))'让球胜平负按月分布趋势')
plt.ylabel('占比')
plt.show()
关键要点小结
| 步骤 | 方法 | 用途 |
|---|---|---|
| 数据整理 | pd.crosstab |
交叉表统计分布 |
| 整体分布 | value_counts(normalize=True) |
求占比 |
| 分盘口分析 | crosstab(..., normalize='index') |
条件概率 |
| 可视化 | 饼图/柱状图/热力图 | 直观展示 |
| 深度分析 | 赔率隐含概率 vs 实际概率 | 找价值盘口 |
数据来源建议
- API:Football-Data.org、API-Football、TheSportsDB
- 爬虫:500.com、澳客、懂球帝(需注意反爬和合规)
- 公开数据集:Kaggle 上的欧洲联赛历史数据
需要我针对某一联赛真实数据的抓取 + 分布分析给出完整代码吗?或者聚焦于赔率/让球盘口的价值分析模型?
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播