Matplotlib | 綺麗な2次元散布図の描き方1(概要編)

データサイエンス

Ciao!みなさんこんにちは!このブログでは主に
(1)pythonデータ解析,
(2)DTM音楽作成,
(3)お料理,
(4)博士転職
の4つのトピックについて発信しています。

今回から数回に渡って、pythonで綺麗な散布図を描く方法をご紹介します!2次元の散布図を描くとき、点の数が多いと密集した場所が潰れてしまって見えなくなることがよくあります。このような場合には、散布図上の点の密度をカラーや等高線で表示すると綺麗に描画できます。今回は概要編として、普通の散布図の問題点と、その解決策として密度をカラーで表示する方法をご紹介します!

この記事を読めば、pythonで綺麗な2次元散布図をプロットする方法を知ることができます!ぜひ最後までご覧ください。

Kaiko
Kaiko

この記事はこんな人におすすめ

  • Pythonでデータ解析をしている
  • 散布図を綺麗に描きたい



Abstract | 散布図は密度をカラーで表示すると綺麗に描ける

散布図はデータ点の密度をカラーで表示すると綺麗に描くことができます。散布図はデータ点の分布状況を可視化するのに便利なプロットです。\(x\)と\(y\)にどのような関係があるか相関分析を行う際などに重宝します。ただし、pythonでデータ解析をする場合、Matplotlibのscatterをそのまま使って普通の散布図を描くと、データ点が密集している場所が潰れてしまいます。情報量の多い高密度部分の分布の様子がわからない問題が生じます。

そこで、データ点の密度をカラーで示すことで、点の密度が高い部分から低い部分まで、分布の様子全体を把握することができます。今回は、普通の散布図の問題点とその解決策として、密度カラー散布図をご紹介します。普通の散布図と密度カラー散布図の違い、密度から散布図のパワーをご理解いただけるはずです!密度カラー散布図の描き方の詳細は次回以降でじっくり解説しますので、そちらもお楽しみに!



Background | 2次元の散布図は潰れて見にくい

データ解析において、2次元の散布図はデータの性質を調べるために重宝します。しかし、データ点の数が多いとき、2次元の散布図を描くと点が密集している場所が潰れてしまって状況がわからなくなっている図がよく見られます(図1)。Pythonでは、Matplotlibのscatter()を普通に適用すると、このような図になります。

図1. 点が密集した部分の様子が潰れてわからない散布図の例



普通の散布図ではデータの分布に区別がつけられない例

普通の散布図では区別がつけられず困ってしまう例を取り上げてみましょう。以下2つのデータセットの散布図を用意します。

  1. データ1: 正規分布に従うデータ
  2. データ2: 双峰分布に従うデータ

以下では、これら2つのデータを普通の散布図でプロットしたらどうなるかを見ていきます。



データ1: \(x\)が標準正規分布に従うデータ

データ1では、\(x\)が標準正規分布に従い、\(y\)は\(x\)と相関するとします。すなわち
$$
\begin{align}
x &\sim \mathrm{Norm}(\mu=0, \sigma=1) \\
y &= x + s
\end{align}
$$
ただし、
$$
s \sim \mathrm{Norm}(\mu=0, \sigma=1)
$$
ということです。このような分布に従うデータ点を1万個用意します。

図1はデータ1をプロットしたものです。データの分布の輪郭は把握することができますが、密度の高い部分でどのような分布になっているのか全くわかりません。



データ2: \(x\)が双峰分布に従うデータ

データ2では、\(x\)は双峰分布に従うとします。\(\mu=-1, \sigma=0.5\)の正規分布と\(\mu=1, \sigma=0.5\)の正規分布を合わせた双峰分布とします。\(x\)と\(y\)の関係はデータ1と同じとします。すなわち
$$
\begin{align}
x &\sim \mathrm{Norm}(\mu=-1, \sigma=0.5)\ \mathrm{or}\ \mathrm{Norm}(\mu=1, \sigma=0.5) \\
y &= x + s
\end{align}
$$
ただし、
$$
s \sim \mathrm{Norm}(\mu=0, \sigma=1)
$$
です。こちらも1万個のデータ点を用意して、以下で分布を比較していきます。



普通の散布図では2つの分布を区別できない

普通の散布図ではデータ1とデータ2を区別するのは困難です。データ1とデータ2、それぞれ1万個の点を普通の散布図としてプロットすると図2のようになります。輪郭はほとんど同じような形をしています。これらが図2の右側が双峰分布であることを知っていれば、輪郭の形の微妙な違いに気づくことができるかもしれません。しかし、点の密度が高い(=それだけ情報量も多い)部分の情報が読み取れない図を作るのは問題です。

図2. 普通の散布図ではデータ点の分布を区別することが困難



Method | 密度をカラーで示すことで綺麗な散布図が描ける

データ点の密度をカラーで示すようにすることで、データ点が密集している場所でも情報を読み取れるようにすることができます。ここでは、密度カラー散布図(scatter-density plot)と呼ぶことにします。図1に示したデータ1の散布図は、図3のような密度カラー散布図に描き替えることができます。

図3. 密度カラー散布図(scatter-density plot)なら高密度部分も綺麗に図示できる

図3では色の赤いところほどデータ点の密度が高く、青いところほど低く表示されています。カラーから等密度線が読み取れるので、密度の高い部分の分布の様子もよくわかります。ちなみにカラーバーを図の内側に挿入するとスッキリ見えます。この方法も本シリーズ後半で解説する予定です。



綺麗な散布図(密度カラー散布図)を使ってデータの分布を区別する例

さきほどの例のデータ1(正規分布に従う)とデータ2(双峰分布に従う)を密度カラー散布図にすることで、分布の違いを明確化することができます。図4はデータ1とデータ2の密度カラー散布図です。

図4. 密度カラー散布図にすることで分布の差異が明確になる例

図4のように密度をカラーで表示することで、データ点の密度が高い部分での分布の様子がよく分かります。左側のデータ1は正規分布、右側のデータ2は双峰分布に従っていることが読み取れます。



データ点が多いときは密度カラー散布図を使うべし

このように、データ点の数が多い散布図を作る場合は密度カラー散布図を用いることが有効です。密度をカラーで示すことでデータ点の密度が高い部分の様子を読み取ることができます。また、散布図の形を取っているので、密度の低い部分の点の分布の情報も失われません(単純な2次元ヒストグラムでは低密度部分の情報が失われてしまいます)。



Result | 今回の図を作成したコードのサンプル

密度カラー散布図の描き方の詳細は次回以降で解説します。ここでは、今回の図の作成に用いたコードを掲載するにとどめます。



Conclusion | まとめ

最後までご覧頂きありがとうございます!
Pythonで2次元の散布図を描く際の問題点と、綺麗な散布図を描く解決策の概要を紹介しました!
詳しいコーディングの方法は次回以降の記事で扱いますので、そちらもご参考ください。

データ点が多いとき、Matplotlibのscatterで普通に散布図を描くと、点の密度の高い領域が潰れて見えなくなってしまいます。点の密度の高い領域は情報量の多い領域でもあるので、分布の様子をなるべくわかりやすく図示すべきです。密度カラー散布図を使えば、点の密度の高い領域でも分布の様子をよみとることができます!ぜひ参考にしてみてください。

以上「Matplotlib | 綺麗な2次元散布図の描き方1(概要編)」でした!
またお会いしましょう!Ciao!

コメント

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