9:相関分析 データ同士の関係を探る


相関分析とは

データ分析において、「相関分析」は欠かせない手法です。
「ある指標が増えると、別の指標も増えるのか」「反対に関係がないのか」そんな
データ同士の関係性を数値化する
のが相関分析です。


ピアソン相関係数(Pearson’s correlation coefficient)

最も一般的な指標がピアソンの積率相関係数(r値)で、値の範囲は-1から+1です。

相関係数意味
+1.0完全な正の相関:片方が増えると必ずもう片方も増える
0.7〜0.9強い正の相関
0.4〜0.6中程度の正の相関
0.1〜0.3弱い正の相関
0無相関(関係なし)
-0.1〜-0.3弱い負の相関
-0.4〜-0.6中程度の負の相関
-0.7〜-0.9強い負の相関
-1.0完全な負の相関:片方が増えると必ずもう片方は減る

✅例

  • 正の相関:身長が高い人ほど体重も重い(傾向)
  • 負の相関:車のスピードが速いほど、移動時間は短くなる
  • 相関なし:身長と英語のテストの点数は基本的に関係ない

✅注意点

  • 相関関係は因果関係ではない
    • 「相関がある」からといって「片方が原因で片方が変化する」とは限らない。
    • 例:「アイスクリームの売上と溺水事故数」は正の相関があるが、「アイスが原因で事故が増える」わけではない(夏の気温という共通要因がある)。
  • 外れ値の影響
    • ごく一部の極端なデータ(外れ値)があると、相関係数が実態以上に高く/低く出ることがある。
  • 線形の関係のみ
    • ピアソン相関係数は直線的な関係のみを捉える。
    • 非線形な関係(例:放物線的な関係)は捉えきれない。

NBAの相関関係の活用

NBAにおいて相関分析は、

  • 勝利数とスタッツの関係
  • 得点とシュート成功率の関係
  • アシストとターンオーバーの関係

などを調べることで、
「勝つために何を伸ばすべきか」「勝敗に影響しない指標は何か」をデータから見つける手がかりになります。



2024-25 シーズンのチームスタッツで相関係数を求めてみよう

実際にチームスタッツを使用して、相関関係確認していきましょう。まずはチームスタッツの取得です。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from nba_api.stats.endpoints import leaguedashteamstats
import pandas as pd

team_stats = leaguedashteamstats.LeagueDashTeamStats(
    season_type_all_star='Regular Season',
    season='2024-25',
    measure_type_detailed_defense='Advanced'
)

df_team = team_stats.get_data_frames()[0]

✅nba_api.stats.endpoints.LeagueDashTeamStats

NBA全チームのシーズン・期間別の統計情報(勝敗、得点、リバウンド、FG%など)を一括で取得できます。
以下がLeagueDashTeamStatsの主なパラメーターです。

パラメータ名説明例 / デフォルト
season対象シーズン'2024-25'
season_type_all_starシーズンの種別'Regular Season', 'Playoffs', 'All Star', 'Pre Season'
league_idリーグの種類'00'(NBA)
per_mode_detailedデータの単位'PerGame', 'Totals', 'Per36', 'Per100Possessions'
measure_type_detailed_defense指標の種類'Base', 'Advanced', 'Misc', 'Four Factors', 'Scoring', 'Opponent', 'Defense'
plus_minusプラスマイナスの表示有無'N'(なし), 'Y'(あり)
pace_adjustペース調整(100ポゼッション換算)'N', 'Y'
rank順位表示の有無'N', 'Y'
outcome試合結果フィルター'W'(勝ち), 'L'(負け), ''(全て)
locationホーム / アウェイ'Home', 'Road', ''
month月別フィルター0(全て), 1~12
season_segmentシーズン期間'Post All-Star', 'Pre All-Star', ''
date_from開始日(YYYY-MM-DD)''
date_to終了日(YYYY-MM-DD)''
opponent_team_id対戦相手チームID0(全チーム対象)
vs_conference対戦カンファレンス'East', 'West', ''
vs_division対戦ディビジョン'Atlantic', 'Central', 'Southeast', 'Northwest', 'Pacific', 'Southwest', ''
game_segment試合の時間帯'First Half', 'Second Half', 'Overtime', ''
periodクォーター指定0(全て), 1~4, 5(OT)
shotclock_rangeショットクロックの時間帯'24-22', '22-18 Very Early', '18-15 Early', '15-7 Average', '7-4 Late', '4-0 Very Late', ''
last_n_games直近試合数0(全試合), 1~N

ここでは、レギュラーシーズンの試合毎の平均スタッツにパラメーターを設定しました。また、今回は勝率とTS%(トゥルーシューティングパーセンテージ)の相関を見てみたいので、指標の種類に’Advanced’を設定してます。TS%はアドバンススタッツを呼ばれる詳細な指標の一つです。

✅ TS%(トゥルーシューティングパーセンテージ)とは
TS%(True Shooting Percentage)は、シュートの「総合的な効率」を表す指標です。

  • フィールドゴール(2P/3P)
  • 3ポイントシュート
  • フリースロー

これら全てを得点への貢献として総合的に評価する指標です。

✅ TS%の計算式

項目内容
得点(PTS)試合で獲得した得点
FGAフィールドゴール試投数(2P+3P)
FTAフリースロー試投数
0.44フリースロー1回がポゼッションに与える影響の平均的な重み(NBAで経験的に使われる係数)

※指標の定義についてはNBA公式参照


それでは、勝率とTS%の相関関係を計算していきます。

correlation = df_team[['W_PCT', 'TS_PCT']].corr()
print(correlation)

.corr()は、PandasのDataFrameやSeriesに用意されているメソッドで、「相関係数(通常はピアソン相関係数)」を計算するために使います。

勝率(W_PCT)とTS%(TS_PCT)の相関係数は0.723で強い正の相関がありました。つまり、勝率が高いチームは、効率的に得点している傾向があります。


前回学習した、散布図で確認してみましょう。

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(8,6))
sns.scatterplot(data=df_team, x='TS_PCT', y='W_PCT')
plt.title('Win Percentage vs True Shooting Percentage (2024-25)')
plt.xlabel('True Shooting Percentage (TS%)')
plt.ylabel('Win Percentage')
plt.grid(True)
plt.show()

散布図で右肩上がりの関係が見られますね。このように散布図を作成すると、視覚的に2つの指標の傾向を確認することができます。


まとめ

今回は相関係数をテーマに、endpoints.LeagueDashTeamStatsの使用方法や相関関係の求め方をを学びました。相関関係はデータ分析で基本的ですが重要なテーマですのでマスターしてしまいましょう。