Pandasで目的変数別に色分けしたヒストグラムを作成する


概要

pandasのデータフレームを使っていると、別カラムで与えたカテゴリ情報(目的変数やhueと呼ぶほうがしっくりくるかもしれません)ごとに色分けしたヒストグラムを眺めたいシーンがあります。ただし、pandasの標準のplot機能やseabornの機能を使ってもなかなか一発では描けません。もちろん、matplotlibでsubplotsを使えば描けることは分かるのですが、そこまでするのはなんか面倒ですよね。
ということで、pivot_tableを使って、それほど多くない行数で実装する方法をご紹介します。またtargethistという名称でファンクション化も実施しましたので、併せてご覧ください。イメージは以下です。

targethistの仕様は以下になります。

  1. データフレームと目的変数を引数に取る
  2. データフレームの全カラムについて、目的変数の値ごとに色分けしたヒストグラムを描く
  3. オプションで保存することができる
  4. pandasのplot機能をラッピングしている

なお、GitHubでも、ソースコードを公開しています。

ソースコード

10行程度のコードで簡単に記述することができました。ポイントはpivot_tableを使って、目的変数の値ごとのマルチカラムに整形していることですね。あとは、**kwardsを受けるようにしているので、pandasのplotと同じように使えることです。

import pandas as pd

def targethist(df, target, save=False, kind='hist', **kwards):
    
    columns = df.columns[df.columns != target]
    pdf = df.pivot_table(index=df.index, columns=target)
    
    for column in columns:
        
        ax = pdf.loc[:, column].plot(kind=kind, title=column, **kwards)
        
        if save==True:
            ax.get_figure().savefig(column+".png") 

使用例

いつものように、irisのデータを使って検証していきます。

if __name__ == "__main__":
    df = pd.read_csv("iris.csv")

普通に使う

オーソドックに使ってみます。

targethist(df, target="Name")

以下のようにターゲットごとに色分けされた状態で、各カラムのヒストグラムが出力されました。

binやalphaのパラメータを指定する

pandasのplotをラップしている点を活用してパラメータを指定します。

targethist(df, target="Name", bins=30, alpha=0.8)

設定値が棒の細かさや色の透過度に反映されていますね。

箱ひげ図を描く

kindをboxとすれば、箱ひげを出力することも可能です。

targethist(df, target="Name", kind='box')

これは地味に便利そうですね。

まとめ

pandasのデータフレームを使って、別カラムで与えたカテゴリ情報に基づき色分けしたヒストグラムを出力するための方法と、そのファンクション(targethist)をご紹介しました。今回は1つ1つの図を出力するだけなので、そのうちlayoutをつけたサブプロット機能も検討したいと思っています。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA