广告赞助
广告赞助
问鼎H5

篮球数据分析入门指南(从零开始学篮球数据分析)

tats文

入门路线图

  • 先选场景:球员评价、球队对比、阵容搭配、投篮分布、胜率预测等;明确指标与输出图表
  • 准备数据:确定联赛(NBA/CBA/其他)、赛季范围、样本粒度(球员/球队/回合/投篮)
  • 建立工具链:Python 或 R + 笔记本环境 + 版本管理;先做一个最小可复现项目
  • 迭代:先构建基础指标→进阶指标→可视化→简单建模→报告/结论

数据来源

  • NBA
    • 开源/免费:Basketball-Reference(赛季/比赛/球员/阵容统计)、Kaggle(历史数据集)
    • API/库:python nba_api(官方站点数据,速率与稳定性受限)、pbpstats(历史资源)、SportsRef 系列
    • ![整理](/assets/images/69AD2F32.jpeg)
    • 付费/高阶:Second Spectrum(跟踪数据)、Cleaning The Glass、Synergy

otyqu

  • CBA/其他
    • CBA 官网技术统计、RealGM、部分社区整理数据;一致性与完整性需自查
  • 抓取与合规:尊重站点条款与频率限制;本地缓存数据,记录来源与时间戳
  • 核心概念与公式(常用)

    • 回合数(估算,球队级):Poss ≈ FGA + 0.44*FTA + TOV - ORB
    • Pace(节奏):每48分钟回合数
    • Four Factors(队层):eFG%、TOV%、ORB%、FTr
      • eFG% = (FGM + 0.5*3PM) / FGA
      • TOV% = TOV / Poss
      • ORB% = ORB / (ORB + opp DRB)
      • FTr = FTA / FGA

  • 得分效率
    • TS% = PTS / (2*(FGA + 0.44*FTA))
    • ORtg/DRtg/NetRtg:每100回合的得分/失分/净胜分
  • 归一化
    • per-36、per-100:按上场时间或回合归一
  • 使用率(球员):USG% 近似基于球员回合占比(射、罚、失误)
  • 阵容与对位:On/Off、两人组/五人组净效率;注意样本量与赛程强度
  • 工具栈建议

    • Python:pandas/numpy、matplotlib/seaborn/plotly、scikit-learn、nba_api
    • R:tidyverse、ggplot2、broom、nbastatR
    • SQL:用于清洗与聚合;把原始表设计成 shots、possessions、games、players、lineups

    最小示例(Python,球队比赛层)

    import pandas as pd
    
    # 假设有 team_game_logs.csv 含: game_id, team, opp, pts, fga, fgm, fg3a, fg3m, fta, tov, orb, drb, minutes
    df = pd.read_csv("team_game_logs.csv")
    
    # 回合估算与节奏
    df["poss_for"]  = df["fga"] + 0.44*df["fta"] + df["tov"] - df["orb"]
    # 需要对手数据计算更准确的比赛总回合;这里先用本队估算
    df["pace48"]    = df["poss_for"] * 48 / (df["minutes"]/5)  # minutes为全队总上场分钟(5人同时在场)
    
    # 效率与四要素
    df["efg"]       = (df["fgm"] + 0.5*df["fg3m"]) / df["fga"].clip(lower=1)
    df["ts"]        = df["pts"] / (2*(df["fga"] + 0.44*df["fta"]).clip(lower=1))
    df["ftr"]       = df["fta"] / df["fga"].clip(lower=1)
    df["tov_pct"]   = df["tov"] / df["poss_for"].clip(lower=1)
    # 进攻篮板率需要对手防守篮板,可先近似用本行对手数据合并后计算
    
    # 每100回合
    df["ortg"]      = df["pts"] / df["poss_for"].clip(lower=1) * 100
    
    team_season = df.groupby("team").agg(
        games=("game_id","nunique"),
        ortg=("ortg","mean"),
        efg=("efg","mean"),
        ts=("ts","mean"),
        ftr=("ftr","mean"),
        tov_pct=("tov_pct","mean"),
        pace48=("pace48","mean"),
    ).reset_index().sort_values("ortg", ascending=False)
    
    print(team_season.head())
    

    投篮图(球员投篮层,示意)

    import pandas as pd, matplotlib.pyplot as plt
    
    # shots.csv: shooter, x, y, made(0/1), shot_value(2/3)
    shots = pd.read_csv("shots.csv")
    p = shots[shots["shooter"]=="Player A"]
    
    plt.figure(figsize=(6,5))
    plt.scatter(p["x"], p["y"], c=p["made"], cmap="coolwarm", alpha=0.6, s=18)
    plt.title("Shot Chart - Player A")
    plt.xlim(-250, 250); plt.ylim(0, 470)  # 以NBA半场英寸/厘米坐标系为例,需与数据坐标匹配
    plt.axis("off"); plt.show()
    

    提示

    • 球场坐标系需要与数据一致;常用单位: 英寸或厘米,(0,0)多设在篮筐;必要时做仿射变换
    • 更高级可用核密度/hexbin 显示命中率或期望得分

    常见分析题目

    • 球员效率画像:3PAr vs TS%,回合占比 vs 失误率
    • 阵容净效率:五人组样本筛选(如>200回合),对比联赛分位数
    • 投篮质量:各区域 eFG 加权,创建 xPPS(期望每次投篮得分)
    • 对手针对:防守端限制三分出手比与命中率的权衡
    • 胜率驱动因素:Four Factors 对胜负的相对重要性(回归/SHAP)

    建模起步

    • 逻辑回归:投篮命中(特征: 距离、角度、上一次进攻类型、时间、对手强度)
    • 回归:球队 NetRtg ~ 四要素、赛程强度、伤病虚拟变量
    • 聚类:KMeans/混合高斯做球员角色聚类(持球三分手、终结点、护框内线等)
    • 时间序列:胜率/净效率的移动窗口与变点检测

    可视化与报告

    • 标配:散点(带回归线)、箱线、蜂窝/热力投篮图、阶梯胜率曲线
    • 沟通:图上标注样本量与置信区间;给出基线(联盟均值/分位数)

    验证与复现

    • 小样本与垃圾时间:设阈值(上场分钟/回合),过滤垃圾时间;报告置信区间
    • 赛程强度/对手调整:加入对手实力或做分层/正则化(RAPM 类思路)
    • 版本控制:项目结构 data/raw, data/processed, notebooks/, src/
    • 记录:数据来源、时间、代码版本;固定随机种子;导出图与表

    坑点与偏差

    • 多重检验与过拟合:控制假阳性(FDR);交叉验证;保留验证集
    • 共线性:四要素、节奏与效率常相关,建模时做正则或降维
    • 上下文偏差:队友/对手、战术与角色对个人指标影响很大
    • 指标含义:BPM/RAPM/RAPTOR/EPM 为模型产物,不等价“真是非虚构的能力值”

    进阶指标概览(查阅为主)

    • BPM、OBPM、DBPM;RAPM/Regularized APM;RAPTOR、EPM;LEBRON
    • On/Off、With-or-Without-You(WOWY)
    • Lineup spacing/creation metrics(需事件级/跟踪数据)

    学习资源

    • 书籍:Dean Oliver - Basketball on Paper
    • ![uot](/assets/images/160EC060.jpeg)
    • 站点:Basketball-Reference Glossary、NBA Stats(文档与图表)
    • 博客/课程:Cleaning The Glass 文章、各队分析师/数据科学博客、Kaggle 篮球竞赛

    下一步

    • 告诉我你的联赛范围(NBA/CBA/校队等)、目标问题(例如球员对比或阵容优化)、工具偏好(Python/R/Excel)。我可以基于你的选择给出数据抓取脚本、项目模板和第一张图的可复现代码。