Ciao!みなさんこんにちは!このブログでは主に
(1)pythonデータ解析,
(2)DTM音楽作成,
(3)お料理,
(4)博士転職
の4つのトピックについて発信しています。
今回から数回に渡って、pythonで綺麗な散布図を描く方法をご紹介します!2次元の散布図を描くとき、点の数が多いと密集した場所が潰れてしまって見えなくなることがよくあります。このような場合には、散布図上の点の密度をカラーや等高線で表示すると綺麗に描画できます。今回は概要編として、普通の散布図の問題点と、その解決策として密度をカラーで表示する方法をご紹介します!
この記事を読めば、pythonで綺麗な2次元散布図をプロットする方法を知ることができます!ぜひ最後までご覧ください。
この記事はこんな人におすすめ
- Pythonでデータ解析をしている
- 散布図を綺麗に描きたい
Abstract | 散布図は密度をカラーで表示すると綺麗に描ける
散布図はデータ点の密度をカラーで表示すると綺麗に描くことができます。散布図はデータ点の分布状況を可視化するのに便利なプロットです。\(x\)と\(y\)にどのような関係があるか相関分析を行う際などに重宝します。ただし、pythonでデータ解析をする場合、Matplotlibのscatterをそのまま使って普通の散布図を描くと、データ点が密集している場所が潰れてしまいます。情報量の多い高密度部分の分布の様子がわからない問題が生じます。
そこで、データ点の密度をカラーで示すことで、点の密度が高い部分から低い部分まで、分布の様子全体を把握することができます。今回は、普通の散布図の問題点とその解決策として、密度カラー散布図をご紹介します。普通の散布図と密度カラー散布図の違い、密度から散布図のパワーをご理解いただけるはずです!密度カラー散布図の描き方の詳細は次回以降でじっくり解説しますので、そちらもお楽しみに!
(追記)次回以降も含めた関連記事はこちらです↓
- Matplotlib | Pythonで綺麗な2次元散布図を描く方法(1. 概要編)
- Matplotlib | Pythonで綺麗な2次元散布図を描く方法(2. 理論編)
- Matplotlib | Pythonで綺麗な2次元散布図の実装方法(3. 基礎編)
- Matplotlib | Pythonで散布図を1次元ヒストグラムと同時にプロットする方法(4. 応用編)
Background | 2次元の散布図は潰れて見にくい
データ解析において、2次元の散布図はデータの性質を調べるために重宝します。しかし、データ点の数が多いとき、2次元の散布図を描くと点が密集している場所が潰れてしまって状況がわからなくなっている図がよく見られます(図1)。Pythonでは、Matplotlibのscatter()を普通に適用すると、このような図になります。
普通の散布図ではデータの分布に区別がつけられない例
普通の散布図では区別がつけられず困ってしまう例を取り上げてみましょう。以下2つのデータセットの散布図を用意します。
- データ1: 正規分布に従うデータ
- データ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の右側が双峰分布であることを知っていれば、輪郭の形の微妙な違いに気づくことができるかもしれません。しかし、点の密度が高い(=それだけ情報量も多い)部分の情報が読み取れない図を作るのは問題です。
Method | 密度をカラーで示すことで綺麗な散布図が描ける
データ点の密度をカラーで示すようにすることで、データ点が密集している場所でも情報を読み取れるようにすることができます。ここでは、密度カラー散布図(scatter-density plot)と呼ぶことにします。図1に示したデータ1の散布図は、図3のような密度カラー散布図に描き替えることができます。
図3では色の赤いところほどデータ点の密度が高く、青いところほど低く表示されています。カラーから等密度線が読み取れるので、密度の高い部分の分布の様子もよくわかります。ちなみにカラーバーを図の内側に挿入するとスッキリ見えます。この方法も本シリーズ後半で解説する予定です。
綺麗な散布図(密度カラー散布図)を使ってデータの分布を区別する例
さきほどの例のデータ1(正規分布に従う)とデータ2(双峰分布に従う)を密度カラー散布図にすることで、分布の違いを明確化することができます。図4はデータ1とデータ2の密度カラー散布図です。
図4のように密度をカラーで表示することで、データ点の密度が高い部分での分布の様子がよく分かります。左側のデータ1は正規分布、右側のデータ2は双峰分布に従っていることが読み取れます。
データ点が多いときは密度カラー散布図を使うべし
このように、データ点の数が多い散布図を作る場合は密度カラー散布図を用いることが有効です。密度をカラーで示すことでデータ点の密度が高い部分の様子を読み取ることができます。また、散布図の形を取っているので、密度の低い部分の点の分布の情報も失われません(単純な2次元ヒストグラムでは低密度部分の情報が失われてしまいます)。
Result | 今回の図を作成したコードのサンプル
密度カラー散布図の描き方の詳細は次回以降で解説します。ここでは、今回の図の作成に用いたコードを掲載するにとどめます。
Conclusion | まとめ
最後までご覧頂きありがとうございます!
Pythonで2次元の散布図を描く際の問題点と、綺麗な散布図を描く解決策の概要を紹介しました!
詳しいコーディングの方法は次回以降の記事で扱いますので、そちらもご参考ください。
データ点が多いとき、Matplotlibのscatterで普通に散布図を描くと、点の密度の高い領域が潰れて見えなくなってしまいます。点の密度の高い領域は情報量の多い領域でもあるので、分布の様子をなるべくわかりやすく図示すべきです。密度カラー散布図を使えば、点の密度の高い領域でも分布の様子をよみとることができます!ぜひ参考にしてみてください。
以上「Matplotlib | Pythonで綺麗な2次元散布図を描く方法(1. 概要編)」でした!
またお会いしましょう!Ciao!
References | 本シリーズの関連記事
本シリーズ「Pythonで綺麗な2次元散布図を描く方法」の関連記事は以下です。 第1回の概要編に加え、密度カラー散布図の描き方の分類(2. 理論編)、基本的な実装方法(3. 基礎編)、1次元のヒストグラムと同時に描画する方法(4. 応用編)など、詳しく扱っておりますので参考にどうぞ!
コメント