相関分析とは
データ分析において、「相関分析」は欠かせない手法です。
「ある指標が増えると、別の指標も増えるのか」「反対に関係がないのか」そんなデータ同士の関係性を数値化するのが相関分析です。
ピアソン相関係数(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 | 対戦相手チームID | 0(全チーム対象) |
| 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の使用方法や相関関係の求め方をを学びました。相関関係はデータ分析で基本的ですが重要なテーマですのでマスターしてしまいましょう。

