3秒でわかる
matplotlib で散布図を描く関数。2 つの数値の関係に傾向があるかどうかを、集計する前に目で確かめるために使います。
もう少し詳しく
どういうものか
plt.scatter は matplotlib で散布図を描く関数です。x 方向の値の並びと y 方向の値の並びを渡すと、対応する点を平面に打ちます。1 行のデータが 1 個の点になります。
点の大きさは s、色は c、透明度は alpha で指定します。c に数値の列を渡すと値に応じて色が変わるため、2 軸の散布図に 3 つ目の情報を重ねられます。
なぜ必要か
平均や相関係数だけを見て判断すると、形の違いを見落とします。相関係数がほぼ同じでも、実際には直線に乗っている場合、2 つの塊に分かれている場合、外れ値 1 個に引っ張られている場合があります。散布図はその違いが一目で分かります。
分析の初手で散布図を描くと、後で使う手法の選び方も決まります。曲線的な関係なら直線の回帰は合いませんし、塊が 2 つあるならグループごとに分けて見るべきだと分かります。
具体例
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("sales.csv")
plt.scatter(df["temperature"], df["ice_sales"], s=20, alpha=0.5)
plt.xlabel("temperature")
plt.ylabel("ice_sales")
plt.title("temperature vs ice sales")
plt.show()カテゴリで色を分けるなら、グループごとに呼び出して重ねます。
for name, group in df.groupby("shop"):
plt.scatter(group["temperature"], group["ice_sales"], label=name, alpha=0.6)
plt.legend()
plt.show()つまずきやすいところ
点が多いと真っ黒に潰れて何も読めません。数千件を超えたら alpha を 0.3 前後に落とし、s を小さくします。それでも重なるなら、ヒストグラムを 2 次元にした hexbin へ切り替えます。
欠損値の扱いも要注意です。NaN が含まれる行は描画されず、黙って点が減ります。件数が合わないと感じたら df.isna().sum() で先に確認します。
plt.plot に点マーカーを指定しても似た絵になりますが、plot は既定で点どうしを線で結ぶため、順序の無いデータではぐちゃぐちゃな線が入ります。関係を見る目的なら scatter を使います。
覚え方
「線でつながないのが scatter、つなぐのが plot」です。