【Python Coding】seabornで箱ひげ図を作る方法を解説します

こんにちは、TAKです。
前回に引き続き、今回もpythonのseabornを使った可視化について解説していきます。
今回は「Boxplot(箱ひげ図)」について、pythonのJupyter Notebookを用いて紹介していきます。
1. pythonを用いた可視化方法を学んでいきたい方
2. pythonを用いて「箱ひげ図」を描けるようにしたい方
seabornを用いたデータ可視化 | Boxplot
必要ライブラリのインポート

今回必要となるライブラリは以上の4つです。
最初の4行は、データを読み込んで可視化する場合のお馴染みのコードです。
最後の1行は、今回使うアヤメのデータを呼び出すために必要なコードです。
利用データの確認
今回使うデータはアヤメのデータセットです。
これは、データサイエンスや統計学の勉強をしている方にはお馴染みのデータセットなのですが、「アヤメ」という花の3つの品種について、「がく片の長さ」「がく片の幅」「花びらの長さ」「花びらの幅」の各データが記録されたデータです。
データセットの構成は以下のようになっています。
● sepal length(cm):がく片の長さ
● sepal width(cm):がく片の幅
● petal length(cm):花びらの長さ
● petal width(cm):花びらの幅
● target:アヤメの品種(Setosa、Versicolor、Virginica)
データの準備(STEP1:データセット読込)
では実際にpandasを用いてアヤメのデータセットを読み込んでいきます。
まず最初に、データセットを以下のようにして読み込みます。

データセットの構成は上記のような辞書型になっています。
今回主に使っていくのは以下の3つです。
● 特徴量の名前が格納されている「feature_names」
● 目的変数が格納されている「target」
データの準備(STEP2:説明変数のデータフレーム化)
次に説明変数と特徴量を以下のように読み込みましょう。

各4つの特徴量が適切に取得出来ていることがわかりますね。
データの準備(STEP3:目的変数のシリーズ化)
説明変数の設定が出来たので、目的変数について見ていきます。
各特徴量を持つ品種が何かを意味する目的変数は、targetに格納されているので、これをSeries型として読み込んでおきます。

先頭5行についてはすべて「0」となっていますが、これは機械学習モデルを構築しやすいように、既にラベルの変換が行われているためです。つまり、「Setosa → 0」「Versicolor → 1」「Virginica → 2」と変換した後の結果がtargetに格納されているということです。
今回はモデル構築ではなく、データ可視化が目的なので理解を深めるために品種名に戻しておきます。
クラスラベルの変換として下記コードを実行すればOKです。

この結果、ラベル名が適切に品種名になっていることが確認出来ました。
クラスラベルの変換方法について今一つわからない方は、下記記事で紹介しているので参考にしてください。
データの準備(STEP4:データの結合とカラム名変換)
説明変数と目的変数について準備が出来たので、これらを統合したデータセットを作っておきます。
以下のコードで結合が可能です。

以上でOKなのですが、カラム名(列名)に(cm)と入っていて個人的に見にくいので、下記コードを追加することでシンプルなデータセットにしておきます。これは好みなのでなくても大丈夫です。

以上でデータ可視化用のデータが出来上がりました。
データ可視化①
では実際にseabornを用いて箱ひげ図を描画していきましょう。
特徴量が4つありますが、今回も「petal length(花びらの長さ)」にフォーカスして箱ひげ図を描いていきます。僕は特徴量の手打ちが面倒なので、以下のようにしてリスト化しておきます。

そして、以下のコードを実行することで、箱ひげ図を描画することが可能です。

ポイントは以下2つです。
● 引数としてxとyの値、そして対象となるデータを指定する必要がある
これで箱ひげ図を描くことが出来ましたね。
箱ひげ図は、前回紹介した棒グラフと同じく、2変数(カテゴリ変数×量的変数)のデータを可視化する時に使える方法なので、棒グラフでも試しに可視化してみましょう。それが以下のコードです。

比べてみると、なんとなく似ているグラフになりますが、決定的に違う点が以下です。
● 棒グラフ:各カテゴリごとのデータ分布の平均値を高さで表示
データ可視化②
では次に、各特徴量ごとに箱ひげ図を一気に表示させてみましょう。
データの全体像を俯瞰する観点からは、「カテゴリ別×特徴量別」に情報を可視化出来た方が理解が進むためです。
2×2のサイズで表示するために、少し関係ないコードが追加されていますが、sns.boxplotの部分さえ理解していればOKです(引数’ax’も2×2の表示用なので気にしなくて大丈夫です)。

結果、4つの特徴量ごとの箱ひげ図が描けましたね。
こんな感じで可視化が出来れば、データの全体像・雰囲気がわかるようになります。
花びらの長さ・幅からわかるように、品種Setosaは相対的に小さめの花と言えそうですね。
最初のアヤメの品種別写真を見ても、うなずける結果かと思います。
ちなみに、上記のコードがよくわからないという方は、以下のように書いてもOKです。
まとめてコードを書いた方がスッキリしていいのは確かですが、本質を理解して可視化さえ出来れば、シンプルなコードでも全然問題ないと思います(先頭グラフのみ表示しています)。

まとめ
いかがだったでしょうか?
今回は可視化手法として「箱ひげ図」について紹介してきました。
データ分布の全体像を「統計量分布」と合わせて把握したいような時にも使える手法なので、是非使えるようにしてしてみてください。
では今回はこのへんで。