8:データを可視化しよう (matplotlib / seaborn)

データの可視化

データ分析で重要なスキルの一つが可視化です。
視覚的にわかりやすく表現することで、傾向や異常値をすぐに発見できます。

ここでは、Pythonの代表的な可視化ライブラリmatplotlibseabornの使い方を、NBA_APIを使って学んでいきましょう!


使用ライブラリ

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

import matplotlib.pyplot as plt

  • matplotlibという可視化ライブラリの中のpyplotモジュールをpltという名前でインポートしています。
  • pyplotグラフを描くための基本的な関数群を提供しており、plt.plot()plt.bar() などで折れ線グラフ・棒グラフなどを簡単に描画できます。

import seaborn as sns

  • seabornは、matplotlibをベースにしたより洗練された見た目のグラフが描けるライブラリです。
  • 統計的なプロット(ヒストグラム、散布図、箱ひげ図など)が簡単に作れるほか、色やスタイルも自動で見やすく整えてくれます。
  • snsという省略名で呼ぶのが一般的です。

matplotlib/seaborn比較

ライブラリ用途特徴
matplotlib.pyplot (plt)汎用的なグラフ描画基本機能が豊富、細かくカスタマイズ可
seaborn (sns)統計的なデータ可視化デザインが美しい、複雑な統計プロットが簡単

どちらを使っても問題ございませんし、基本的には組み合わせて使います。実際のデータで試してみましょう。


Shai Gilgeous-Alexanderのスタッツをグラフ化しよう

前回同様、2024-25シーズンのMVPのShai Gilgeous-Alexander(以下、SGA)のスタッツを用いて練習していきたいと思います。

シーズンスタッツの取得

season = '2024-25'
sga_id = 1628983 

gamelog_sga = playergamelog.PlayerGameLog(player_id=sga_id, season=season)
df_sga = gamelog_sga.get_data_frames()[0]
df_sga['GAME_DATE'] = pd.to_datetime(df_sga['GAME_DATE'])

pd.to_datetime(df_sga[‘GAME_DATE’])はdf_sgaGAME_DATE列をdatetime型に変換する処理です。
GAME_DATEが文字列(str)やオブジェクト型で読み込まれていた場合に、日時として認識できる型に変換します。変換後は、日付順の並び替えや月ごとの集計、曜日の抽出など日時操作が可能になります。


折れ線グラフ

matplotlibを使用して、得点の折れ線グラフを作成します。以下を実行していきましょう。

plt.figure(figsize=(12,6))
plt.plot(df_sga['GAME_DATE'], df_sga['PTS'], marker='o')
plt.title('SGA Points Per Game (2024-25)')
plt.xlabel('Game Date')
plt.ylabel('Points')
plt.xticks(rotation=45)
plt.grid(True)
plt.show()

plt.figure(figsize=(12,6))

  • 新しいグラフの「キャンバス」を作成する命令です。
  • figsize=(12,6)は、グラフの横幅12インチ、縦6インチのサイズに指定しています。
     数字が大きいほど大きなグラフになります。

plt.plot(df_sga['GAME_DATE'], df_sga['PTS'], marker='o')

  • 折れ線グラフを描く命令です。
  • df_sga['GAME_DATE']: x軸に試合日GAME_DATE列のデータ)を指定
  • df_sga['PTS']: y軸に得点PTS列のデータ)を指定
  • marker='o': 各データ点を丸いマーカー(●)で表示
     これで各試合の得点が線だけでなく点でもわかりやすくなります。
  • 今回は使用していませんが、linestyle=’–‘を加えると点線グラフになるので試してみてください。

plt.title('SGA Points Per Game (2024-25)')

  • グラフのタイトルを設定します。
  • 表示されるタイトルは「SGA Points Per Game (2024-25)」
    = SGAの2024-25シーズンの得点推移

plt.xlabel('Game Date')

  • x軸のラベル(説明文)を設定します。
  • この場合は「Game Date」で、x軸は試合日を表すことを示しています。

plt.ylabel('Points')

  • y軸のラベルを設定します。
  • この場合は「Points」で、y軸は得点数を示します。

plt.xticks(rotation=45)

  • x軸の目盛り(試合日の日付)を45度回転させています。
  • 日付が長いため、そのままだと重なって見づらいので、斜めにして読みやすくするための設定です。

plt.grid(True)

  • グラフにグリッド線(補助線)を表示します。
  • データの位置関係や数値が読み取りやすくなります。

plt.show()

  • 実際にグラフを描画して表示する命令です。
  • pltで設定してきた内容をここでまとめて「実行」して表示します。

出力結果は以下のようになります。

ヒストグラム

続いてseaborn(sns)も使用して、得点のヒストグラムを作成していきましょう。以下を実行します。

plt.figure(figsize=(8,6))
sns.histplot(df_sga['PTS'], bins=10, kde=True)
plt.title('SGA Points Distribution (2024-25)')
plt.xlabel('Points')
plt.ylabel('Frequency')
plt.show()

✅ plt.figure(figsize=(8,6))

  • グラフのサイズ(横8インチ、縦6インチ)を指定。
  • ヒストグラムはそれほど広いx軸を必要としないため、このサイズで十分です。

sns.histplot(df_sga['PTS'], bins=10, kde=True)

  • seabornのhistplot関数でヒストグラムを描画。
  • df_sga['PTS']: 得点(Points)のデータを対象に。
  • bins=10: 階級(棒の本数)を10個に分割
    • 例:0-10点、10-20点…といった範囲に分ける。
  • kde=True: ヒストグラムの上にカーネル密度推定(KDE)を表示。
    • KDEは得点の分布を滑らかな曲線で示し、分布の傾向がよりわかりやすい。

実行結果は以下になります。

30点前後が多くなっていることが一目で確認できますね。

散布図

続いてseaborn(sns)も使用して、アシスト(AST)とターンオーバー(TOV)の関係の散布図を作成していきましょう。以下を実行します。

plt.figure(figsize=(8,6))
sns.scatterplot(data=df_sga, x='AST', y='TOV')
plt.title('SGA: Assists vs Turnovers (2024-25)')
plt.xlabel('Assists')
plt.ylabel('Turnovers')
plt.show()

sns.scatterplot(data=df_sga, x='AST', y='TOV', alpha=0.6)

  • seabornのscatterplot関数で散布図を描画。
  • data=df_sga: データはSGAの試合ごとのスタッツが入ったデータフレーム。
  • x='PTS': x軸はアシスト(AST
  • y='AST': y軸はターンオーバー(TOV)
  • , alpha=0.6 : alpha=0.6: 少し透明にして点が重なっても見やすくしています。(色の濃い部分はデータ数が多い)

実行結果は以下になります。

SGAはボールを多く持つので、アシストが多い試合でターンオーバーも増えるか?が視覚的に確認できます。アシストが多い試合はターンオーバーも多いという関係性はなさそうです。


まとめ

今回はSGAのデータを用いて折れ線グラフ・ヒストグラム・散布図を学びました。今回紹介したのはごく一部になりますが、この後もグラフでの可視化は頻繁に行いますので、何度も使用することで慣れていきましょう!