这个python案例显示人盯人防守成功率?

wen python案例 3

本文目录导读:

这个python案例显示人盯人防守成功率?

  1. 案例设计:人盯人防守成功率分析
  2. 运行结果解读(示例输出)
  3. 这个案例展示了什么?
  4. 如何修改成你自己的真实数据?

我理解你想了解关于人盯人防守成功率的Python案例,这是一个体育数据分析(篮球/足球)中常见的场景。

由于你没有提供具体的代码或数据,我将为你构建一个完整的、可直接运行的Python模拟案例,用于计算和分析人盯人防守的成功率。

这个案例将涵盖:

  1. 模拟数据:生成球员防守数据。
  2. 核心算法:如何定义和计算“成功率”。
  3. 结果分析:按球队/球员汇总,并可能进行可视化。

案例设计:人盯人防守成功率分析

场景假设: 我们模拟一场篮球比赛,记录每一次防守回合的数据,判断该回合是否为“人盯人”防守,以及防守是否“成功”。

定义

  • 防守类型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
...

这个案例展示了什么?

  1. 数据模拟:如何生成结构化的比赛防守数据。
  2. 指标计算groupby() 和聚合函数的使用。
  3. 可视化seabornmatplotlib 展示不同维度对比。
  4. 业务洞察:得出结论——人盯人防守成功率通常高于区域防守,且防守强度(压力)是影响人盯人成功率的关键因素

如何修改成你自己的真实数据?

如果你的数据是 CSV 或 Excel 文件,只需要修改 generate_defensive_data() 部分,将你的数据读入 df 即可:

# 替代模拟数据生成部分
df = pd.read_csv('your_defensive_data.csv')
# 确保你的数据包含:defense_type, is_success, defender, team 等列

如果你有特定的数据结构或想分析特定指标,请告诉我,我可以帮你调整代码!

抱歉,评论功能暂时关闭!