▶ 初学者向けにPythonを使ったデータ分析に役立つ記事を書いています
▶ matplotlibによる可視化を基本から解説しています。以下の投稿も合わせてご覧ください。
はじめに
今回は散布図の描き方を基本から解説します。これまで1つの変数に着目してデータの分布をみる方法を扱ってきましたが、変数間の関係性を見ることも非常に重要です。この「変数間の関係性」を視覚的に捉えることができるのが散布図です。散布図を使えば、変数間に相関があるかどうか、またその強さや方向を一目でわかるようになります。今回は、Pythonで散布図を描き方を紹介します。
環境
- Windows11
- Python 3.11.4
- pandas 2.0.3
- numpy: 1.25.0
- matplotlib: 3.7.1
- seaborn: 0.12.2
散布図とは
散布図とは、2つの変数の関係性を視覚的に表すグラフの一種です。散布図では、横軸と縦軸にそれぞれ変数をとり、各データを点でプロットします。散布図は、量的データどうしの関係を示すのに適しています。量的データとは、数値で表されるデータのことで、例えば身長や体重、年齢や収入などが該当します。量的データどうしの関係を見ることで、変数間に相関があるかどうか、またその強さや方向を調べることができます。
散布図を描く
matplotlibを使って描く
まず基本書式を確認しておきましょう。
x, yはdf[‘列名’]の形でも指定できますがdata=dfとしておくと、x,yを列名だけで指定できます。sはサイズでプロットのサイズを指定することができます。サイズのdefaultは20です。単純に数字を指定してマーカーサイズを変更することもできますし、sに量的変数を指定してその値ごとにマーカーサイズを変えることもできます。cも単純に色を指定することもできますし、cに量的変数を指定してさらにcmapにカラーマップを指定することで、その値ごとに色を変えることもできます。
やってみましょう。
# matplotlibで散布図を描く
plt.scatter(x='bill_length_mm',y='bill_depth_mm',data=df,)
次にsを指定してみましょう。ここでは量的変数である、flipper_length_mmを指定してみます。
# matplotlibで散布図を描く:sを指定
plt.scatter(x='bill_length_mm',y='bill_depth_mm',data=df,s='flipper_length_mm',alpha=0.3)
簡単ですね。重なり部分が多かったので、alpha=0.3としてプロットの透過度を挙げています。次にcを指定してみましょう。先ほどと同様にflipper_length_mmをcに指定してみます。
# matplotlibで散布図を描く:cを指定
plt.scatter(x='bill_length_mm',y='bill_depth_mm',data=df,c='flipper_length_mm',alpha=0.3)
cを指定した際には、cmapsでカラーマップを指定することもできます。
# matplotlibで散布図を描く:cとcmapを指定
plt.scatter(x='bill_length_mm',y='bill_depth_mm',data=df,c='flipper_length_mm',alpha=0.3,cmap='Reds')
seabornを使って描く
seabornには散布図を描画するいろんな方法があります。まずはそれぞれの書式を見ておきましょう。
いろいろ書いてしまいましたが、使い分けをするとよいです。
- sns.relplot
kindで散布図(“scatter”), ラインプロット(“line”)のようにプロットの種類を切り替えることができます。デフォルトは”scatter”です。colとrowを使うことで多変数な散布図を表示することができます。colを指定すると、列方向に複数のサブプロットを持つ複数グラフを描画できます。rowを指定すると、行方向に複数のサブプロットを持つ複数グラフを描画できます。colの指定変数が多い場合は、col_wrapを指定することで複数行での描画を指定することができます。 - sns.jointplot
散布図を描き、その外側にヒストグラムを出力します。散布図だけだとデータの分布がわかりにくいですが、このjointplotを使うと散布図で2変数の関係、ヒストグラムで各変数の分布までわかります。kindでは以下を指定できます。"scatter"
: 散布(default))"reg"
: 散布図と回帰直線"resid"
: y 軸に回帰直線からの残差 (誤差) を出力"kde"
: カーネル密度推定"hex"
: 六角形のヒートマップ
- sns.regplot()
2つの量的データの線形回帰分析を実施して直線をフィットさせて、散布図に重ねてプロットします。fit_reg(defaultはFalse)をTrueにするとx,yの値に基づいて線形回帰分析をおこないます。引数orderで次数を指定すると多項式回帰をすることもできます。
- sns.lmplot()
regplotの機能に加えて複数のグラフをまとめて1度に出力(FacetGrid)することができます。colを指定すると、列方向に複数のサブプロットを持つ複数グラフを描画できます。rowを指定すると、行方向に複数のサブプロットを持つ複数グラフを描画できます。colの指定変数が多い場合は、col_wrapを指定することで複数行での描画を指定することができます。
一つずつ見ていきましょう。まずはrelplotです。シンプルなものをまず描いてみましょう。
# 散布図:relplot
sns.relplot(x='bill_length_mm',y='bill_depth_mm',data=df)
relplotではhue, col, rowが使えるので比較がはかどります。hueとcolを設定してみましょう。
# 散布図:relplot(hueとcolを設定)
sns.relplot(x='bill_length_mm',y='bill_depth_mm',data=df,col='sex',hue='species')
col=’sex’としたのでMale/Femaleでわけて列方向に描画しています。さらにhue=’species’としているので、それぞれの男女それぞれの描画をspeciesの値ごとに色分けしています。このようなグラフがコード一行で描けてしまうので、破壊力抜群ですね。rowは行方向に描画されます。
次にjointplotをみてみましょう。
# 散布図:jointplot
sns.jointplot(x='bill_length_mm',y='bill_depth_mm',data=df)
jointplotでは散布図とともに各変数のヒストグラムも確認できます。さらにjointplotでは回帰直線を描くこともできます。
# 散布図:jointplot(kind='reg')
sns.jointplot(x='bill_length_mm',y='bill_depth_mm',data=df,kind='reg')
ちょっと回帰直線がフィットしていないように見えますね。複数のグループが混在しているように得ます。そこでhueにspeciesを設定してみましょう。
# 散布図:jointplot(hueを設定)
sns.jointplot(x='bill_length_mm',y='bill_depth_mm',data=df,hue='species')
綺麗に別れましたね。ただ、jointplotではkind=’reg’とhueを混在させることができません。でも心配はいりません。lmplotであればhueで色分けしたグループごとに回帰直線を描くことができます。
# 散布図:lmplot(colとhueを設定)
sns.lmplot(x='bill_length_mm',y='bill_depth_mm',data=df,col='sex',hue='species')
このようにlmplotでは複数のグラフを比較する際に便利です。hue, col, rowが使えるので変数が多くその組み合わせで比較したいときはlmplotを使うとよいですね。反対に1つに描画するのであれば、regplotがあります。こちらも見ておきましょう。
# 散布図:regplot
sns.regplot(x='bill_length_mm',y='bill_depth_mm',data=df)
まとめ
今回は散布図の描き方を基本から解説しました。いろんな方法を紹介したので逆に混乱したかもしれませんが、変数が少なくて、ちょっと変数間の関係を見たいときであれば、分布も確認できるのでjointplot、変数の組み合わせが多い場合はrelplot、あるいはlmplotを選択するとよいでしょう。relplotはkind=’line’とすることでlineplotも描けますが、散布図に回帰直線に描画したいのであれば、lmplotの方が簡単です。なので、私はだいたい、lmplotを使うことが多いです。
コメント