本文目录导读:

我理解你想了解关于人盯人防守成功率的Python案例,这是一个体育数据分析(篮球/足球)中常见的场景。
由于你没有提供具体的代码或数据,我将为你构建一个完整的、可直接运行的Python模拟案例,用于计算和分析人盯人防守的成功率。
这个案例将涵盖:
- 模拟数据:生成球员防守数据。
- 核心算法:如何定义和计算“成功率”。
- 结果分析:按球队/球员汇总,并可能进行可视化。
案例设计:人盯人防守成功率分析
场景假设: 我们模拟一场篮球比赛,记录每一次防守回合的数据,判断该回合是否为“人盯人”防守,以及防守是否“成功”。
定义:
- 防守类型:
Man_to_Man(人盯人)或Zone(区域联防)。 - 成功标准:如果该防守回合导致对方投篮不中、失误或抢断,则视为防守成功;如果对方得分或造成犯规(罚球),则视为失败。
代码实现:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置随机种子以便结果可复现
np.random.seed(42)
# --------------------------
# 1. 模拟比赛数据
# --------------------------
def generate_defensive_data(num_plays=500):
"""
模拟生成防守回合数据。
每一行代表一次防守回合。
"""
teams = ['湖人', '凯尔特人']
players = ['詹姆斯', '戴维斯', '里夫斯', '塔图姆', '布朗', '怀特']
data = []
for i in range(num_plays):
# 随机选择防守球队和防守人
team = np.random.choice(teams)
# 根据球队选择该队球员(简化处理)
if team == '湖人':
defender = np.random.choice(['詹姆斯', '戴维斯', '里夫斯'])
else:
defender = np.random.choice(['塔图姆', '布朗', '怀特'])
# 防守类型(约60%的概率是人盯人)
defense_type = np.random.choice(['Man_to_Man', 'Zone'], p=[0.6, 0.4])
# 防守强度(影响成功率)
pressure = np.random.uniform(0.5, 1.0) # 压迫感值
# 根据防守类型和压力计算成功概率
# 人盯人通常更消耗体力,但高压下成功率更高(假设)
if defense_type == 'Man_to_Man':
# 人盯人基础成功率40%,随压力增加
success_prob = 0.3 + 0.3 * pressure
else:
# 区域防守成功率较低一些(假设)
success_prob = 0.2 + 0.2 * pressure
# 生成防守结果
is_success = np.random.choice([True, False], p=[success_prob, 1 - success_prob])
data.append({
'team': team,
'defender': defender,
'defense_type': defense_type,
'pressure': round(pressure, 2),
'is_success': is_success
})
return pd.DataFrame(data)
# 生成数据
df = generate_defensive_data(800)
print("前10行数据预览:")
print(df.head(10))
# --------------------------
# 2. 计算人盯人防守成功率
# --------------------------
def calculate_success_rate(dataframe):
"""
计算不同维度下的防守成功率。
成功率 = 成功次数 / 总防守次数
"""
# 总体成功率
overall_rate = dataframe['is_success'].mean()
# 按防守类型分组
type_stats = dataframe.groupby('defense_type')['is_success'].agg(['mean', 'count'])
type_stats.columns = ['成功率', '防守次数']
type_stats['成功率'] = (type_stats['成功率'] * 100).round(2)
# 人盯人防守细分(按球员)
man_stats = dataframe[dataframe['defense_type'] == 'Man_to_Man']
player_stats = man_stats.groupby('defender')['is_success'].agg(['mean', 'count'])
player_stats.columns = ['成功率', '防守次数']
player_stats['成功率'] = (player_stats['成功率'] * 100).round(2)
# 按球队和防守类型交叉分析
team_type_stats = dataframe.groupby(['team', 'defense_type'])['is_success'].agg(['mean', 'count'])
team_type_stats.columns = ['成功率', '防守次数']
team_type_stats['成功率'] = (team_type_stats['成功率'] * 100).round(2)
return overall_rate, type_stats, player_stats, team_type_stats
overall, type_stats, player_stats, team_type = calculate_success_rate(df)
print("\n" + "="*50)
print("【总体防守成功率】")
print(f"全队所有防守类型的总体成功率:{overall*100:.2f}%")
print("\n【按防守类型对比】")
print(type_stats)
print("\n【人盯人防守 - 按球员表现】")
print(player_stats)
print("\n【按球队+防守类型交叉】")
print(team_type)
# --------------------------
# 3. 可视化展示
# --------------------------
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 图1:防守类型成功率对比
sns.barplot(data=df, x='defense_type', y='is_success', ax=axes[0,0], palette='Set2')
axes[0,0].set_title('防守类型对成功率的影响')
axes[0,0].set_ylabel('平均成功率(0-1)')
axes[0,0].set_xlabel('防守类型')
# 图2:人盯人防守球员表现
man_df = df[df['defense_type'] == 'Man_to_Man']
sns.barplot(data=man_df, x='defender', y='is_success', ax=axes[0,1], palette='coolwarm')
axes[0,1].set_title('人盯人防守 - 球员成功率对比')
axes[0,1].set_ylabel('平均成功率(0-1)')
axes[0,1].set_xlabel('球员')
# 图3:防守压力与成功率关系(人盯人)
man_df_scatter = man_df.groupby('pressure')['is_success'].mean().reset_index()
axes[1,0].plot(man_df_scatter['pressure'], man_df_scatter['is_success'], 'o-', color='purple')
axes[1,0].set_title('防守压力 vs 成功率(人盯人)')
axes[1,0].set_xlabel('防守压力等级')
axes[1,0].set_ylabel('成功率')
axes[1,0].grid(True)
# 图4:球队x防守类型热力图
pivot_table = df.pivot_table(index='team', columns='defense_type', values='is_success', aggfunc='mean')
sns.heatmap(pivot_table*100, annot=True, fmt='.1f', cmap='RdYlGn', ax=axes[1,1], cbar_kws={'label': '成功率(%)'})
axes[1,1].set_title('球队 vs 防守类型成功率热力图')
plt.tight_layout()
plt.show()
# --------------------------
# 4. 业务结论与洞察
# --------------------------
print("\n" + "="*50)
print("【分析结论(基于模拟数据)】")
# 找出人盯人防守成功率最高的球员
best_player = player_stats['成功率'].idxmax()
best_rate = player_stats.loc[best_player, '成功率']
print(f"1. 人盯人防守成功率最高的球员是 {best_player},成功率高达 {best_rate}%。")
# 对比人盯人和区域防守
man_rate = type_stats.loc['Man_to_Man', '成功率']
zone_rate = type_stats.loc['Zone', '成功率']
if man_rate > zone_rate:
print(f"2. 人盯人防守({man_rate}%)比区域防守({zone_rate}%)更有效。")
else:
print(f"2. 区域防守({zone_rate}%)比人盯人防守({man_rate}%)更有效。")
# 压力与成功率相关性
corr = np.corrcoef(man_df['pressure'], man_df['is_success'])[0,1]
print(f"3. 人盯人防守中,压力等级与成功率的相关系数为 {corr:.2f}。")
if corr > 0.5:
print(" => 防守压力越大,人盯人防守成功率越高。")
运行结果解读(示例输出)
运行代码后,你会看到类似如下的输出(因为随机数,结果会有浮动):
前10行数据预览:
team defender defense_type pressure is_success
0 凯尔特人 塔图姆 Man_to_Man 0.73 True
1 湖人 戴维斯 Zone 0.67 False
...
【总体防守成功率】
全队所有防守类型的总体成功率:43.75%
【按防守类型对比】
成功率 防守次数
defense_type
Man_to_Man 52.17 400
Zone 33.33 400
【人盯人防守 - 按球员表现】
成功率 防守次数
defender
布朗 57.14 35
戴维斯 44.44 45
...
这个案例展示了什么?
- 数据模拟:如何生成结构化的比赛防守数据。
- 指标计算:
groupby()和聚合函数的使用。 - 可视化:
seaborn和matplotlib展示不同维度对比。 - 业务洞察:得出结论——人盯人防守成功率通常高于区域防守,且防守强度(压力)是影响人盯人成功率的关键因素。
如何修改成你自己的真实数据?
如果你的数据是 CSV 或 Excel 文件,只需要修改 generate_defensive_data() 部分,将你的数据读入 df 即可:
# 替代模拟数据生成部分
df = pd.read_csv('your_defensive_data.csv')
# 确保你的数据包含:defense_type, is_success, defender, team 等列
如果你有特定的数据结构或想分析特定指标,请告诉我,我可以帮你调整代码!