DATAFLUCT Tech Blog

データ技術・データサイエンス・MLOps に関するトレンドを追いかけます

密度分布を比較するためJoyPyでサクッと重ねてみた

こんにちは!nakamura(@naka957)です。今回は可視化で便利なOSSをご紹介します。1次元密度分布をさくっと描画でき、データの傾向を簡単に比較できます。

JoyPyとは

JoyPyは複数の1次元密度分布を重ねて描画できるPythonライブラリです。joyplotsもしくはridgeline plotsと呼ばれています。

1次元密度分布は、ヒストグラムを滑らかにしたデータ分布に相当します。そのため、変数の分布の確認で使用します。

変数分布の確認は、データ分析時に非常に重要です。例えば、商品の需要予測を考えます。対象の商品価格の分布が、低価格帯が多い、高価格帯に特異な分布が存在する、といったデータの定性的な情報はデータ分析で重要です。

変数分布の描画だけでなく、分布間の比較が簡単にできるのがJoyPyです!

とっても簡単に使えるので、是非試してみてください。

では早速、本題に入っていきましょう。

 

ライブラリの読み込み

使用するライブラリを読み込みます。

import joypy
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
import seaborn as sns
%matplotlib inline

JoyPyをインストールしていない方は、pipもしくはcondaコマンドでインストールできます。

$ pip install joypy

 

データセットの準備

今回は、有名なirisデータセットと呼ばれる、植物のアヤメのデータセットを使用します。3種類のアヤメに関する、がくと花弁の情報が含まれたデータセットです。

データセットはseabornライブラリからpandasのデータフレーム形式で読み込めます。

df = sns.load_dataset('iris')
df.head()

 

これで、データセットの準備が整いました!

以降では、sepal(がく)やpetal(花弁)の密度分布を描画していきます。さらに、アヤメ種(species)ごとに分布を分け、比較してみましょう。種類ごとの比較で分布が異なることを確認できます。

Joyplotsを試してみる

データセットに含まれる数値型の変数分布を全て確認してみます。JoyPyなら2行で描画できます。

joypy.joyplot()にpandasのDataFrame型でデータセットを渡すだけです。自動で数値型の変数列が描画されます。

joypy.joyplot(df)
plt.show()

sepal(がく)やpetal(花弁)の長さと幅に関する変数分布を表示できました。これだけで、説明変数それぞれで分布が異なることがわかります。

変数分布をズラしたデザインで描画されるため、比較が容易です。

次に、アヤメ種ごとに分布を分けてみましょう。アヤメ種 speciesの列名を引数 byに渡します。また、引数 legendにTrueを渡せば、凡例も表示できます。

joypy.joyplot(df, by='species', legend=True)
plt.show()

アヤメ種ごとで変数分布が異なることがわかります。つまり、種類でsepal(がく)やpetal(花弁)の長さと幅が異なることが読み取れます。

縦軸(密度)の範囲は、グラフ間で最も大きい縦軸の範囲がデフォルトで適用されます。例えば、上図ではsetosa種のpetal_widthの値が最も大きいため、その軸範囲が3つのグラフに適用されています。そのため、versicolor種やvirginica種のグラフ縦軸方向の変化が見えにくくなっています。

そこで、縦軸の範囲は各グラフごとで決めてみましょう。引数 ylim=’own’で指定できます。

joypy.joyplot(df, by='species', legend=True, ylim='own')
plt.show()

いかがでしょうか。分布の変化がみやすくなったかと思います。

しかし、時には比較のために、縦軸の範囲を揃えたい場合もあります。その場合は、縦軸の範囲は共通とし、グラフ間の重なりの調整で見栄えを整えることができます。

重なり具合の調整は引数 overlapで指定できます。

joypy.joyplot(df, by='species', legend=True, overlap=4)
plt.show()

いかかでしょうか。視覚的に分布の大きさをグラフをで比較できています。

また、描画する対象を絞ることもできます。引数 columnにリスト型で変数名を指定します。

joypy.joyplot(df, by='species', legend=True, column=['sepal_length', 'petal_length'])
plt.show()

以上が、JoyPyの基本的な描画形式です。残りは、グラフの色に関する指定方法をご紹介します。色のデザインも簡単に行えます。

グラフの色をデザインする

色のデザインは4つの引数で指定します。デフォルトの指定は、次の通りです。

  • fill = True
  • color = None
  • linecolor = None
  • colormap = None

各引数は、fillが色の塗りつぶしの有無、colorが塗りつぶし色、linecolorが線の色、colormapは連続色(例えば、虹色)を固定パターンで指定する方法です。

ただし、引数が反映される優先順位は次の通りであることに注意してください。

 

linecolor > color > colormap

 

例えば、色を引数colorで既に指定した場合は、colormapでの指定は無視されます。

以下に、いくつか例をご紹介しますので参考にしてみてください。

線の色を単色で指定

joypy.joyplot(df, by='species', legend=True,
              fill=False,
              color=None,
              linecolor='red',
              colormap=None)
plt.show()

線の色をカラーマップで指定

joypy.joyplot(df, by='species', legend=True,
              fill=False,
              color=None,
              linecolor=None,
              colormap=cm.rainbow_r)
plt.show()

塗りつぶし色を単色で指定

joypy.joyplot(df, by='species', legend=True,
              fill=True,
              color='red',
              linecolor=None,
              colormap=None)
plt.show()

塗りつぶし色を個々で指定

joypy.joyplot(df, by='species', legend=True,
              fill=True,
              color=['red', 'blue', 'green', 'black'],
              linecolor=None,
              colormap=None)
plt.show()

いかがでしたでしょうか。4つの引数で、色々とデザインすることが可能です。

 

まとめ

JoyPyを用いた1次元密度分布の描画方法をご紹介しました。変数分布の描画と比較を簡単に行うことができます。また、色のデザイン指定も簡単にできます。

変数分布の確認は、データ分析において重要な作業の1つです。JoyPyなら簡単です。

是非色々と試してみてください!

 

参考文献