本文目录导读:

我理解你想了解关于人盯人防守成功率的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 等列
如果你有特定的数据结构或想分析特定指标,请告诉我,我可以帮你调整代码!
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播