Python

Python初学者向け:散布図の描き方を基本から解説(matplotlib/seaborn)

スポンサーリンク

 

この記事はこんな方におススメです
  • データ分析をはじめたいが、どのように学習を進めればよいかわからない方
  • データ分析の基本的な部分の全体像を把握しておきたい方
  • データ分析の勉強を始めたが、進め方に迷っている方

▶ 初学者向けに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を使って描く

まず基本書式を確認しておきましょう。

plt.scatter(x, y, data, s, c)

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,)
matplotlibで散布図を描く

次に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)
# matplotlibで散布図を描く:sを指定

簡単ですね。重なり部分が多かったので、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)
# matplotlibで散布図を描く:cを指定

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')
# matplotlibで散布図を描く:cとcmapを指定
スポンサーリンク

seabornを使って描く

seabornには散布図を描画するいろんな方法があります。まずはそれぞれの書式を見ておきましょう。

<散布図を描画するとき>
sns.relplot(x, y, data, kind, hue,row, col)
<ヒストグラムも描画するとき>
sns.jointplot(x, y,data, kind)
<回帰曲線もあわせて描画するとき>
sns.regplot(x, y, data, fit_reg)
sns.lmplot(x, y, data, hue, col, row, fit_reg)

いろいろ書いてしまいましたが、使い分けをするとよいです。

  • 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

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')
# 散布図:relplot(hueとcolを設定)

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では回帰直線を描くこともできます。

# 散布図:jointplot(kind='reg')
sns.jointplot(x='bill_length_mm',y='bill_depth_mm',data=df,kind='reg')
# 散布図:jointplot(kind=’reg’)

ちょっと回帰直線がフィットしていないように見えますね。複数のグループが混在しているように得ます。そこでhueにspeciesを設定してみましょう。

# 散布図:jointplot(hueを設定)
sns.jointplot(x='bill_length_mm',y='bill_depth_mm',data=df,hue='species')
# 散布図:jointplot(hueを設定)

綺麗に別れましたね。ただ、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(colとhueを設定)

このようにlmplotでは複数のグラフを比較する際に便利です。hue, col, rowが使えるので変数が多くその組み合わせで比較したいときはlmplotを使うとよいですね。反対に1つに描画するのであれば、regplotがあります。こちらも見ておきましょう。

# 散布図:regplot
sns.regplot(x='bill_length_mm',y='bill_depth_mm',data=df)
# 散布図:regplot
スポンサーリンク

まとめ

今回は散布図の描き方を基本から解説しました。いろんな方法を紹介したので逆に混乱したかもしれませんが、変数が少なくて、ちょっと変数間の関係を見たいときであれば、分布も確認できるのでjointplot、変数の組み合わせが多い場合はrelplot、あるいはlmplotを選択するとよいでしょう。relplotはkind=’line’とすることでlineplotも描けますが、散布図に回帰直線に描画したいのであれば、lmplotの方が簡単です。なので、私はだいたい、lmplotを使うことが多いです。

コメント

タイトルとURLをコピーしました