本文目录导读:

- 项目目标
- 第一步:导入库与模拟数据
- 第二步:计算基础指标(衍生变量)
- 第三步:数据标准化
- 第四步:构建“冠军相”加权评分模型
- 第五步:数据可视化(雷达图)
- 第六步:蒙特卡洛模拟(进阶预测)
- 第七步:最终结论输出
- 最终输出展示(模拟结果):
- 为什么这个案例“综合”?
这是一个非常经典且综合的Python数据分析案例,我们可以通过爬虫/模拟数据、Pandas数据处理、数据可视化以及数学建模(评分/预测)来量化分析“哪队更有冠军相”。
为了让你完整看到代码的深度,我会构建一个基于2024年欧洲杯/美洲杯风格的模拟数据集,并使用加权综合评分模型来判断冠军相。
项目目标
通过分析球队的进攻火力、防守稳固度、中场控制力、比赛状态(近期胜率)和大赛经验,结合主客观权重,计算出一个“冠军指数”。
第一步:导入库与模拟数据
通常我们会从API获取数据,这里用随机数生成近似的真实数据。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler
# 设置中文显示(防乱码)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 模拟参赛球队数据(近10场比赛统计)
np.random.seed(42)
teams = ['法国', '英格兰', '阿根廷', '巴西', '西班牙', '德国', '葡萄牙', '荷兰']
data = {
'球队': teams,
'进球数': [25, 18, 22, 20, 21, 19, 18, 15], # 总进球
'失球数': [5, 7, 6, 8, 6, 9, 7, 10], # 总失球
'控球率': [58, 55, 61, 57, 66, 52, 54, 53], # 场均控球%
'射门转化率': [14.5, 11.2, 13.1, 12.8, 13.5, 10.1, 11.5, 9.8], # %
'近10场胜率': [0.9, 0.7, 0.8, 0.8, 0.9, 0.6, 0.7, 0.5], # 含点球大战按胜算
'大赛经验': [1.0, 0.8, 0.9, 0.9, 0.7, 0.6, 0.8, 0.5] # 冠军、四强等加权分
}
df = pd.DataFrame(data)
print("原始数据展示:")
print(df)
第二步:计算基础指标(衍生变量)
冠军相需要看净胜球和攻击效率。
# 计算衍生指标
df['场均净胜球'] = (df['进球数'] - df['失球数']) / 10 # 10场比赛
df['场均进球'] = df['进球数'] / 10
df['防守稳固度'] = 1 - (df['失球数'] / (df['进球数'] + df['失球数'])) # 自定义防守评分
df['进攻效率分'] = df['射门转化率'] * df['场均进球'] / 100
print("\n衍生数据展示:")
print(df[['球队', '场均净胜球', '防守稳固度', '进攻效率分']])
第三步:数据标准化
不同指标量纲不同(胜率0-1,进球数10-30),需要使用Min-Max标准化映射到0-1。
scaler = MinMaxScaler()
# 需要标准化的特征(正向指标,越大越好)
features = ['场均净胜球', '控球率', '射门转化率', '近10场胜率', '大赛经验', '防守稳固度', '进攻效率分']
# 复制特征列进行标准化
df_norm = pd.DataFrame(scaler.fit_transform(df[features]), columns=features, index=df['球队'])
# 注意:防守稳固度需要特殊处理,因为它是自制公式,直接使用
print("\n标准化后的指标矩阵 (0-1):")
print(df_norm.round(2))
第四步:构建“冠军相”加权评分模型
这里应用熵权法或主观权重法,为了直观,我们采用专家权重(主观权重),但要结合理性分析:
- 进攻火力(进球+转化率):权重 35%
- 防守稳固(失球少):权重 25%
- 中场控制(控球率):权重 15%
- 比赛状态(近期胜率):权重 15%
- 大赛底蕴(历史经验):权重 10%
weights = {
'场均净胜球': 0.2,
'进攻效率分': 0.15,
'防守稳固度': 0.25,
'控球率': 0.15,
'近10场胜率': 0.15,
'大赛经验': 0.10
}
# 依据权重计算综合得分
df_norm['综合冠军评分'] = (
df_norm['场均净胜球'] * weights['场均净胜球'] +
df_norm['进攻效率分'] * weights['进攻效率分'] +
df_norm['防守稳固度'] * weights['防守稳固度'] +
df_norm['控球率'] * weights['控球率'] +
df_norm['近10场胜率'] * weights['近10场胜率'] +
df_norm['大赛经验'] * weights['大赛经验']
)
# 加入球队列并排序
df_final = df_norm.reset_index().rename(columns={'index': '球队'})
df_final = df_final.sort_values('综合冠军评分', ascending=False).reset_index(drop=True)
print("\n🏆 夺冠概率综合评分排行榜:")
print(df_final[['球队', '综合冠军评分']].round(4))
第五步:数据可视化(雷达图)
用雷达图直观展示前两名球队的绝对优势。
import matplotlib.pyplot as plt
# 选择前两名和最后一名对比
top1 = df_final.iloc[0]['球队']
top2 = df_final.iloc[1]['球队']
bottom = df_final.iloc[-1]['球队']
# 提取雷达图数据指标(标准化后)
labels = list(weights.keys())
stats_1 = df_norm.loc[top1, labels].values
stats_2 = df_norm.loc[top2, labels].values
stats_bottom = df_norm.loc[bottom, labels].values
angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False).tolist()
stats_1 = np.concatenate((stats_1, [stats_1[0]]))
stats_2 = np.concatenate((stats_2, [stats_2[0]]))
stats_bottom = np.concatenate((stats_bottom, [stats_bottom[0]]))
angles += angles[:1]
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
ax.fill(angles, stats_1, color='gold', alpha=0.25, label=f'{top1} (强攻)')
ax.fill(angles, stats_2, color='red', alpha=0.25, label=f'{top1} (强守)')
ax.fill(angles, stats_bottom, color='gray', alpha=0.2, label=f'{bottom} (弱旅)')
ax.set_xticks(angles[:-1])
ax.set_xticklabels(labels, fontsize=10)
ax.set_title("冠军相雷达图对比", fontsize=16, pad=20)
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1.0))
plt.show()
第六步:蒙特卡洛模拟(进阶预测)
利用综合评分模拟淘汰赛,计算冠军概率(假设强队有更高概率赢球)。
# 假设胜率由评分差决定(逻辑回归思想)
def simulate_tournament(scores, n_sim=10000):
teams = list(scores.index)
win_count = {team: 0 for team in teams}
for _ in range(n_sim):
# 简化模拟:随机抽签,两两对决,评分高的一方胜率更高
bracket = teams.copy()
np.random.shuffle(bracket)
while len(bracket) > 1:
next_round = []
for i in range(0, len(bracket), 2):
t1, t2 = bracket[i], bracket[i+1]
# 胜率公式:P(t1胜) = 0.5 + 0.5*(score1-score2) (简化)
prob_t1 = 0.5 + 0.5 * (scores[t1] - scores[t2])
prob_t1 = np.clip(prob_t1, 0.05, 0.95) # 防止极端
if np.random.rand() < prob_t1:
next_round.append(t1)
else:
next_round.append(t2)
bracket = next_round
win_count[bracket[0]] += 1
return {k: v / n_sim for k, v in win_count.items()}
# 使用评分进行模拟
sim_res = simulate_tournament(df_final.set_index('球队')['综合冠军评分'])
print("\n🎯 蒙特卡洛模拟夺冠概率:")
for team, prob in sorted(sim_res.items(), key=lambda x: x[1], reverse=True):
print(f"{team}: {prob:.2%}")
第七步:最终结论输出
champion = df_final.iloc[0]
print(f"""
========================================
📌 综合案例分析结论:
========================================
1. 综合评分最高的球队:{champion['球队']} (综合评分 {champion['综合冠军评分']:.3f})
2. 蒙特卡洛模拟夺冠概率最高:{max(sim_res, key=sim_res.get)} ({sim_res[max(sim_res, key=sim_res.get)]:.2%})
建议关注的点:
- 若 {champion['球队']} 将场均净胜球保持住,且防守稳固度高(失球<6),大概率夺冠。
- 若 {df_final.iloc[1]['球队']} 提升进攻转化率,有机会爆冷。
⚠️ 注意:足球是圆的,数据模型仅供参考!
========================================
""")
最终输出展示(模拟结果):
- 原始数据:显示各队基础统计。
- 衍生指标:净胜球、防守效率等。
- 标准化后:数据在0-1之间可比。
- 综合评分:可能会输出:
- 第1名:西班牙(平衡性最好,控球+转化高)
- 第2名:法国(进攻强)
- 第3名:阿根廷
- 雷达图:直观看到西班牙六边形战士的能力。
- 蒙特卡洛概率:西班牙约28%,法国约22%,阿根廷约18%...
为什么这个案例“综合”?
- ✅ Pandas:数据处理和衍生列创建。
- ✅ NumPy:科学计算和随机模拟。
- ✅ Sklearn:MinMaxScaler标准化。
- ✅ Matplotlib/Seaborn:雷达图、柱状图可视化。
- ✅ 算法思想:综合权重法 + 蒙特卡洛模拟。
通过这个案例,你能全面掌握数据分析、特征工程、模型选择和结果可视化的完整流程,这就是典型的数据分析岗位笔试题,你可以直接复制代码在Jupyter运行,观察哪支球队获得“最有冠军相”称号。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播