データの可視化
データ分析で重要なスキルの一つが可視化です。
視覚的にわかりやすく表現することで、傾向や異常値をすぐに発見できます。
ここでは、Pythonの代表的な可視化ライブラリmatplotlibとseabornの使い方を、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_sga
のGAME_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のデータを用いて折れ線グラフ・ヒストグラム・散布図を学びました。今回紹介したのはごく一部になりますが、この後もグラフでの可視化は頻繁に行いますので、何度も使用することで慣れていきましょう!