Contents
散布図とは?
散布図とは、あるデータを元にして縦軸と横軸の2つの項目で量を計測し、データが当てはまる座標 (場所) に点をプロットすることでデータの分布を表現するグラフのことです。別の言い方をすると、散布図は、2つの項目で計測して得られたn組の変量の組み合わせを (x1, y1), (x2, y2), …, (xn, yn) と表したとき、これらの座標に存在する点をxy平面上に表した図と言えます。2つの項目の関係性があるかどうか、どのような関係性があるかについて知りたいときに、非常に役に立ちます。
具体例を挙げると、「気温」と「湿度」の関係性や「親の年収」と「子の年収」の関係性といった、一方の要素に対してもう一方の要素がどう変動するのかを散布図を作成することで調べることができます。
ここで、「関係性」という言葉の曖昧性を残してはいけません。「関係性」にも様々な「関係性」があるからです。
散布図からわかることは、あるデータに関して、縦軸と横軸のそれぞれの要素の間に相関関係 (見た目の関係性) があるのかどうかということだけであり、片方の事象が原因となってもう片方の事象が起こるといった因果関係を示すものではないことに注意する必要があります。
より詳しく違いを説明すると、あくまで相関関係とは、それぞれの要素の変動がどう関係しているかを示すものであり、どちらかが原因でどちらかが結果であるとは限りません。2つの要素同士が双方向に影響を及ぼしている可能性もあります。それに対して因果関係とは、片方の要素がどのようにもう片方の要素に影響を与えているかを示す、原因と結果の関係です。相関関係があったとしても因果関係があるとは限らない点に注意が必要です。逆に、因果関係がある場合は、相関関係はあると言えます。
その他にも散布図では、法則性や集団から外れた特異点 (外れ値) も一瞬で把握することができます。特異点は、元になっているデータが間違っている可能性が高いですが、なかにはデータとして顕在的に扱えていない潜在的な要因によって特異な条件になっている可能性も考えられます。
このように、既存データの整合性の確認も散布図を作成してデータを可視化することで行えます。
散布図の場合に限った話ではなく一般的に分析を行う際は、数値やグラフだけではなく、その背後となる理論や知識・常識も応用することで、得られた結果に対する考察に妥当性があるかどうかなど、総合的に検討を行っていく必要があります。
pythonで散布図を作成する方法
pythonで散布図を作成するには、matplotlibライブラリのpyplot.scatterメソッドを使用します。seabornライブラリにも散布図を作成できるメソッドは存在しますが、ここではpyplot.scatterメソッドを用いた作成方法をご紹介することにします。
また、同様にオブジェクト指向のax.scatterメソッドによる散布図作成方法もここでは割愛させてもらいます。
plt.scatter() を使いこなせるようになれば、綺麗な散布図が簡単に作れるようになります。
主要な引数一覧を次の表にまとめました。一番右の列の既定値は、引数に何も設定しなかった場合のデフォルト値を表しています。
引数 | 説明 | 既定値 |
x, y | グラフに出力するデータ。 | |
s | プロットする点のサイズを指定。 | 20 |
color | プロットする点の色を指定。’b’ (青) や’k’ (黒) 、’r’ (赤) 、’g’ (緑) 、’y’ (黄) 、’w’ (白) 、’c’ (シアン) 、m (マゼンタ) などから選択。色はcolor = (0.0, 0.0, 1.0)のように、RGBの各色の要素を 0.0 ~ 1.0 のタプルで指定することも可能。 | blue |
marker | マーカーの形を、”.” (丸) 、”o” (大きめの丸) 、”*” (星) 、”x” (×) 、”^” (三角) 、”s” (四角) 、”p” (五角形) 、”8″ (八角形) 、”D” (ひし形) などの記号から選択。 | “.” |
cmap | 値の大小に応じた色の濃淡を設定。c が float 型の場合のみ利用可能です。 | |
norm | c を float 型の配列を指定した場合のみ有効。正規化を行う場合の Normalize インスタンスを指定。 | |
vmin, vmax | 正規化時の最大、最小値。 指定しない場合、データの最大・最小値となります。norm にインスタンスを指定した場合、vmin, vmax の指定は無視されます。 | x.min(), x.max() |
alpha | プロットする点の透明度を0 (透明) ~1 (不透明) の間の数値で指定。 | 1 |
linewidths | プロットする点の枠線の太さをptで指定。 | |
linestyle | プロットする点の枠線のスタイルを、”-” (実線) 、”–” (破線) 、”-.” (一点鎖線) 、”:” (点線) から指定。 | |
edgecolors | ’blue’や’red’、’green’、’yellow’などから、枠線の色を指定。 |
以下の章では、これらの引数を設定するとどのような結果が得られるのかを、入力したコードと出力されたヒストグラムを掲載しながら解説していきます。
散布図の書き方
まず、引数も何も設定せずとも得られる基本的な散布図の書き方を説明していきます。
各コード一つ一つの挙動の解説については基本的には、「#」によるコメントアウトで行っていきます。
基本的な散布図は以下のコードを入力することで、出力することができます。
import numpy as np
import matplotlib.pyplot as plt
x = np.random.rand(100)#[0,1]の一様分布に従う乱数を100個生成
y = np.random.rand(100)
plt.scatter(x, y)
plt.title(“Standard Scatter plot”)#タイトル変更
点のサイズを変更
散布図の点のサイズを変更したいときは、plt.scatter () 関数の引数sに指定したいサイズを数値で入力します。
plt.scatter(x,y,s=100)
plt.title(“Standard Scatter plot,S=100”)
点の色を変更
散布図の点の色を変更したいときは、plt.scatter () 関数の引数colorに指定したい色を代入します。
plt.scatter(x,y,color=”green”)
plt.title(“Standard Scatter plot,Color=green”)
引数colorは、color=”g”でも同じです。
つまり、
plt.scatter(x,y,color=”g”)
でも同じ結果を得ることができます。
点の透明度の変更
点の透明度を変更するには、plt.scatter () 関数の引数alphaに0 (透明) ~1 (不透明) の値を指定します。
plt.scatter(x,y,alpha=0.3)
plt.title(“Scatter plot, Alpha=0.3”)
点の枠線の太さと色を変更
点の枠線の太さと色を変更するには、plt.scatter() 関数の引数としてそれぞれ、linewidthsとedgecolorsを指定します。
今回は、枠線の太さと色が分かりやすいように、点のサイズと色、透明度もデフォルトから変更してあります。
x = np.random.rand(20)
y = np.random.rand(20)
plt.scatter(x, y, s=500, color=”pink”, alpha=0.5, linewidths=2,edgecolors=”red”)
plt.title(“Scatter plot, Linewidths=2,Edgecolors=pink”)
点の形を変更
プロットする点の形を変更したい場合、 plt.scatter () 関数の引数markerに表示させたい形を記号形式で指定します。
例えば、プロットする点の形を▲に変更したい場合は、以下のように、引数markerに「^」と入力します。
plt.scatter(x, y, marker=”^”)
plt.title(“Scatter plot, Marker=^”)
プロットする点の形は、三角以外にも様々な形に変更できます。
その他の形は、引数一覧を掲載した以前の表を参照してください。
カラーマップの作成
特徴量に応じて色の濃淡がグラデーションで変化するカラーマップを作成したい場合、plt.scatter() 関数の引数cmapに使用したいカラーマップ名を、引数cに色付けに使用する特徴量 (通常は、[0,1]の一様分布に従う乱数) を指定します。
color = np.random.rand(100)
plt.scatter(x, y, c=color,cmap=”spring”)
plt.title(“Scatter plot, Cmap=spring”)
更に、色の濃淡やグラデーションといったカラースケールを表示するカラーバーを追加したい場合は、上述したコードの後ろにplt.colorbar() を書き加えます。つまり、以下のようなコードとなります。
color = np.random.rand(100)
plt.scatter(x, y, c=color,cmap=”spring”)
plt.colorbar()
plt.title(“Scatter plot, Cmap=spring with Color bar”)
凡例の表示
散布図内に凡例のラベルを表示させたい場合、plt.scatter () 関数の引数labelに表示させたいラベル名を指定します。
また、凡例の表示のためには、引数にlabelを使用するだけではなく、plt.legend()関数を用いてラベルを表示するように明確に指示しなければなりません。
したがって、凡例表示のサンプルコードは次のようになります。
plt.scatter(x,y,label=”sample1″)
plt.legend() #ラベル表示
plt.title(“Scatter plot, Label=sample1”)
この凡例の位置は現在右上になっていますが、任意で変更可能です。
plt.legend()関数の引数locに、凡例を表示したい位置を指定すればいいだけです。
plt.scatter(x,y,label=”sample1″)
plt.legend(loc=”lower center”)#ラベル位置を中央下に
plt.title(“Scatter plot, Label=sample1, Loc=lower center”)
系列が複数存在する散布図の作成方法
複数系列の散布図を作図する場合、plt.scatter() 関数を系列の数だけ繰り返し適用するだけでできます。
x1 = np.random.rand(10)
y1 = np.random.rand(10)
x2 = np.random.rand(10)
y2 = np.random.rand(10)
x3 = np.random.rand(10)
y3 = np.random.rand(10)
plt.scatter(x1,y1,color=”red”,label=”red”)
plt.scatter(x2,y2,color=”blue”,label=”blue”)
plt.scatter(x3,y3,color=”green”,label=”green”)
plt.legend()
plt.title(“Multi Scatter plot”)
軸ラベルの追加
x軸とy軸に軸ラベルを追加するには、それぞれplt.xlabel()関数とplt.ylabel()関数を用います。
plt.scatter(x,y)
plt.xlabel(“X_Score”)
plt.ylabel(“Y_Score”)
plt.title(“Standard plot, Xlabel=X_Score,Ylabel=Y_Score”)
コメントする