本文目录导读:

我将为您设计一个综合的Python案例,用于对比两支球队的阵地战得分能力,这个案例将涵盖数据清洗、统计分析、可视化等多个方面。
完整代码实现
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
# ==================== 1. 数据生成与清洗 ====================
np.random.seed(42)
def generate_team_data(team_name, n_games=82, avg_score=105, consistency=0.85):
"""生成模拟球队比赛数据"""
dates = pd.date_range('2023-10-01', periods=n_games, freq='D')
# 生成基础数据
data = {
'日期': dates,
'球队': team_name,
'比分': np.random.normal(avg_score, avg_score*0.08, n_games),
'投篮命中率': np.random.normal(0.47, 0.05, n_games),
'三分命中率': np.random.normal(0.36, 0.06, n_games),
'罚球命中率': np.random.normal(0.76, 0.05, n_games),
'进攻篮板': np.random.poisson(10, n_games),
'助攻': np.random.poisson(24, n_games),
'失误': np.random.poisson(14, n_games),
'对手防守强度': np.random.uniform(0.6, 1.0, n_games)
}
df = pd.DataFrame(data)
# 确保成绩为正
df['比分'] = df['比分'].clip(80, 140)
df['投篮命中率'] = df['投篮命中率'].clip(0.35, 0.60)
df['三分命中率'] = df['三分命中率'].clip(0.25, 0.45)
return df
# 生成两支球队数据(模拟:湖人队和勇士队)
team_a = generate_team_data('洛杉矶湖人', n_games=82, avg_score=112, consistency=0.9)
team_b = generate_team_data('金州勇士', n_games=82, avg_score=108, consistency=0.8)
# 合并数据
all_data = pd.concat([team_a, team_b], ignore_index=True)
# 添加额外特征
all_data['进攻效率'] = all_data['比分'] / 100 * 100
# 计算每场比赛的净胜分(模拟对手得分)
all_data['对手得分'] = np.random.normal(105, 8, len(all_data)).clip(80, 130)
all_data['净胜分'] = all_data['比分'] - all_data['对手得分']
print("=" * 60)
print("数据前5行预览")
print("=" * 60)
print(all_data.head())
# ==================== 2. 阵地战得分能力分析 ====================
print("\n" + "=" * 60)
print("阵地战得分能力分析")
print("=" * 60)
# 计算阵地战得分相关指标
def calculate_half_court_metrics(df):
"""计算阵地战得分能力指标"""
metrics = df.groupby('球队').agg({
'比分': ['mean', 'std', 'median', 'min', 'max'],
'投篮命中率': 'mean',
'三分命中率': 'mean',
'进攻篮板': 'mean',
'助攻': 'mean',
'失误': 'mean'
}).round(2)
# 重命名列
metrics.columns = ['场均得分', '得分稳定性', '得分中位数', '最低分', '最高分',
'投篮命中率', '三分命中率', '进攻篮板', '助攻', '失误']
return metrics
half_court_metrics = calculate_half_court_metrics(all_data)
print("\n阵地战基础指标对比:")
print(half_court_metrics)
# ==================== 3. 得分效率分析 ====================
print("\n" + "=" * 60)
print("得分效率分析")
print("=" * 60)
# 计算真实投篮命中率 (TS%)
all_data['真实投篮命中率'] = all_data['比分'] / (
(all_data['投篮命中率'] * 0.44 + all_data['三分命中率'] * 0.69) * 1.5
)
# 计算球员效率值 (PER)简化版
efficiency_data = []
for team in ['洛杉矶湖人', '金州勇士']:
team_data = all_data[all_data['球队'] == team]
efficiency = {
'球队': team,
'场均得分效率': team_data['比分'].mean() / team_data['比分'].std(),
'得分效率': np.mean(team_data['比分'] / 100),
'稳定性指数': 1 - (team_data['比分'].std() / team_data['比分'].mean())
}
efficiency_data.append(efficiency)
efficiency_df = pd.DataFrame(efficiency_data)
print("\n得分效率对比:")
print(efficiency_df)
# ==================== 4. 统计检验 ====================
print("\n" + "=" * 60)
print("统计显著性检验")
print("=" * 60)
# 独立样本T检验
team_a_scores = all_data[all_data['球队'] == '洛杉矶湖人']['比分']
team_b_scores = all_data[all_data['球队'] == '金州勇士']['比分']
t_stat, p_value = stats.ttest_ind(team_a_scores, team_b_scores)
print(f"\n独立样本T检验结果:")
print(f"t统计量: {t_stat:.3f}")
print(f"p值: {p_value:.4f}")
print(f" {'差异显著' if p_value < 0.05 else '差异不显著'}")
# 效应量 (Cohen's d)
def cohens_d(group1, group2):
"""计算Cohen's d效应量"""
n1, n2 = len(group1), len(group2)
var1, var2 = group1.var(), group2.var()
pooled_std = np.sqrt(((n1-1)*var1 + (n2-1)*var2) / (n1+n2-2))
return (group1.mean() - group2.mean()) / pooled_std
effect_size = cohens_d(team_a_scores, team_b_scores)
print(f"效应量(Cohen's d): {effect_size:.3f}")
# ==================== 5. 得分分布分析 ====================
print("\n" + "=" * 60)
print("得分分布特征")
print("=" * 60)
# 使用KS检验判断分布是否正态
for team in ['洛杉矶湖人', '金州勇士']:
team_scores = all_data[all_data['球队'] == team]['比分']
ks_stat, p_value = stats.kstest(team_scores, 'norm', args=(team_scores.mean(), team_scores.std()))
print(f"\n{team}得分分布KS检验:")
print(f"统计量: {ks_stat:.3f}")
print(f"p值: {p_value:.3f}")
print(f" {'符合正态分布' if p_value > 0.05 else '不符合正态分布'}")
# ==================== 6. 可视化分析 ====================
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
# 1. 得分分布对比
colors = ['#FF4444', '#4444FF'] # 湖人红,勇士蓝
for idx, team in enumerate(['洛杉矶湖人', '金州勇士']):
team_scores = all_data[all_data['球队'] == team]['比分']
axes[0,0].hist(team_scores, bins=20, alpha=0.6, label=team, color=colors[idx])
axes[0,0].set_title('得分分布对比', fontsize=14)
axes[0,0].set_xlabel('得分')
axes[0,0].set_ylabel('频率')
axes[0,0].legend(loc='upper left')
axes[0,0].axvline(x=team_a_scores.mean(), color='red', linestyle='--', label='湖人平均')
axes[0,0].axvline(x=team_b_scores.mean(), color='blue', linestyle='--', label='勇士平均')
axes[0,0].legend()
# 2. 得分趋势图
for team, color in zip(['洛杉矶湖人', '金州勇士'], colors):
team_data = all_data[all_data['球队'] == team]
axes[0,1].plot(team_data['日期'], team_data['比分'].rolling(window=5).mean(),
label=f'{team} (5场移动平均)', color=color)
axes[0,1].set_title('得分趋势对比(5场移动平均)', fontsize=14)
axes[0,1].set_xlabel('日期')
axes[0,1].set_ylabel('得分')
axes[0,1].legend()
axes[0,1].tick_params(axis='x', rotation=45)
# 3. 投篮效率对比
efficiency_cols = ['投篮命中率', '三分命中率']
team_data = all_data.groupby('球队')[efficiency_cols].mean()
efficiency_cols.append('真实投篮命中率')
team_data['真实投篮命中率'] = all_data.groupby('球队')['比分'].mean() / (all_data.groupby('球队')['投篮命中率'].mean()*0.44 + all_data.groupby('球队')['三分命中率'].mean()*0.69)
team_data.plot(kind='bar', ax=axes[1,0], rot=0, color=['#FF6B6B', '#4ECDC4', '#45B7D1'])
axes[1,0].set_title('投篮效率对比', fontsize=14)
axes[1,0].set_ylabel('命中率/效率')
axes[1,0].legend(loc='upper right')
axes[1,0].set_xticklabels(team_data.index, rotation=0)
# 4. 得分稳定性箱线图
all_data.boxplot(column='比分', by='球队', ax=axes[1,1],
patch_artist=True, boxprops=dict(color='black', facecolor='lightblue'),
medianprops=dict(color='red'))
axes[1,1].set_title('得分稳定性对比', fontsize=14)
axes[1,1].set_xlabel('')
axes[1,1].set_ylabel('得分')
axes[1,1].set_ylim(80, 140)
plt.suptitle('阵地战得分能力综合分析', fontsize=16)
plt.tight_layout()
# ==================== 7. 相关性分析 ====================
print("\n" + "=" * 60)
print("影响因素相关性分析")
print("=" * 60)
correlation_cols = ['投篮命中率', '三分命中率', '罚球命中率', '进攻篮板', '助攻', '失误', '对手防守强度']
print("\n湖人队得分与各因素相关性:")
team_a_data = all_data[all_data['球队'] == '洛杉矶湖人']
corr_a = team_a_data['比分'].corr(team_a_data[correlation_cols].apply(lambda x: x, axis=0))
print(corr_a.round(3))
print("\n勇士队得分与各因素相关性:")
team_b_data = all_data[all_data['球队'] == '金州勇士']
corr_b = team_b_data['比分'].corr(team_b_data[correlation_cols].apply(lambda x: x, axis=0))
print(corr_b.round(3))
# ==================== 8. 综合评分 ====================
print("\n" + "=" * 60)
print("综合得分能力评分")
print("=" * 60)
def calculate_composite_score(team_data):
"""计算综合得分能力评分(0-100)"""
conditions = {
'场均得分': (team_data['比分'].mean() - 80) / 40 * 30, # 权重30%
'得分效率': (team_data['比分'].mean() / team_data['比分'].std()) * 2, # 权重10%
'稳定性': (1 - (team_data['比分'].std() / team_data['比分'].mean())) * 100 * 0.2, # 权重20%
'投篮命中率': (team_data['投篮命中率'].mean() - 0.35) / 0.25 * 100 * 0.2, # 权重20%
'进攻效率': (team_data['助攻'].mean() / team_data['失误'].mean()) * 10, # 权重10%
'效率指数': (team_data['比分'].mean() / 100) * 100 * 0.1 # 权重10%
}
return min(max(sum(conditions.values()) / 2.3, 0), 100) # 归一化
scores = []
for team in ['洛杉矶湖人', '金州勇士']:
team_data = all_data[all_data['球队'] == team]
score = calculate_composite_score(team_data)
scores.append({'球队': team, '综合得分能力评分': score})
score_df = pd.DataFrame(scores)
print("\n综合得分能力评分对比:")
print(score_df)
# ==================== 9. 结论报告 ====================
print("\n" + "=" * 60)
print("分析结论")
print("=" * 60)
# 最终对比总结
final_comparison = pd.DataFrame({
'指标': ['场均得分', '得分稳定性(std)', '最高分', '最低分', '投篮命中率', '三分命中率', '综合评分'],
'洛杉矶湖人': [
f"{team_a_scores.mean():.1f}",
f"{team_a_scores.std():.1f}",
f"{team_a_scores.max():.1f}",
f"{team_a_scores.min():.1f}",
f"{team_a_data['投篮命中率'].mean()*100:.1f}%",
f"{team_a_data['三分命中率'].mean()*100:.1f}%",
f"{scores[0]['综合得分能力评分']:.1f}"
],
'金州勇士': [
f"{team_b_scores.mean():.1f}",
f"{team_b_scores.std():.1f}",
f"{team_b_scores.max():.1f}",
f"{team_b_scores.min():.1f}",
f"{team_b_data['投篮命中率'].mean()*100:.1f}%",
f"{team_b_data['三分命中率'].mean()*100:.1f}%",
f"{scores[1]['综合得分能力评分']:.1f}"
]
})
print("\n最终对比表:")
print(final_comparison.to_string(index=False))
# 判断优势方
print("\n" + "-"*40)
if scores[0]['综合得分能力评分'] > scores[1]['综合得分能力评分']:
print(f" {scores[0]['球队']}在阵地战得分能力上整体更强")
else:
print(f" {scores[1]['球队']}在阵地战得分能力上整体更强")
print(f"但需要注意: 阵地战得分能力强并不代表比赛结果必然占优")
plt.show()
代码分析和特点
主要功能模块:
- 数据生成:模拟两支球队82场比赛的数据
- 基础指标分析:包括场均得分、稳定性、命中率等
- 效率分析:包括真实投篮命中率、效率指数等
- 统计检验:T检验判断差异显著性
- 相关性分析:找出影响得分的关键因素
- 可视化分析:4个子图对比不同维度
- 综合评分:构建0-100的评分模型
关键分析方法:
- 分布分析:判断得分是否正态分布
- 趋势分析:使用移动平均了解状态变化
- 相关性分析:识别影响得分的关键因素
- 综合评分:多维度加权评分
运行结果示例:
这个案例可以清晰地展示两支队伍在阵地战得分能力上的差异,包括基础的数据对比、统计显著性检验、影响因素相关性和综合评分,通过可视化可以直观看到两队在得分分布、趋势、效率等方面的表现。
通过这个综合案例,学生可以掌握:
- 数据清洗和预处理
- 统计分析(T检验、KS检验等)
- 多维度数据对比分析
- 可视化呈现方法
- 构建综合评分模型
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播