DS(データサイエンス) Data Visualization python データサイエンス 非エンジニア向け

【Data Visualization】seabornを使って可視化する(その3)【Density Plot】

こんにちは、TAKです。

前回に引き続き、今回もpythonのseabornを使った可視化について解説していきます。
今回は「Density Plot(カーネル密度)」について
、pythonのJupyter Notebookを用いて紹介していきます。前回紹介したヒストグラムの拡張版と思って頂ければOKです。

【こんな人に読んで欲しい記事です】
1. pythonを用いた可視化方法を学んでいきたい方
2. pythonを用いてカーネル密度を描けるようにしたい方
今回も、前回と同じデータセットを用いていくため、既に以下の前回記事を読んでいる方は、目次の「カーネル密度推定とは」から読み始めてください。(それまでの内容は前回と全く同じため)

seabornを用いたデータ可視化 | Density Plot

必要ライブラリのインポート

今回必要となるライブラリは以上の4つです。
最初の4行は、データを読み込んで可視化する場合のお馴染みのコードです。
最後の1行は、今回使うアヤメのデータを呼び出すために必要なコードです。

利用データの確認

今回使うデータはアヤメのデータセットです。
これは、データサイエンスや統計学の勉強をしている方にはお馴染みのデータセットなのですが、「アヤメ」という花の3つの品種について、「がく片の長さ」「がく片の幅」「花びらの長さ」「花びらの幅」の各データが記録されたデータです。

データセットの構成は以下のようになっています。

データセットの構成
● sepal length(cm):がく片の長さ
● sepal width(cm):がく片の幅
● petal length(cm):花びらの長さ
● petal width(cm):花びらの幅
● target:アヤメの品種(Setosa、Versicolor、Virginica)
sklearnのデータセットとして格納されているため、pandasを用いながらうまくデータを読み込んでいく点が最初のポイントとなります。ちなみに、全部で150個分のデータがあり、各品種が50個ずつデータを持っている構成になっています。

データの準備(STEP1:データセット読込)

では実際にpandasを用いてアヤメのデータセットを読み込んでいきます。
まず最初に、データセットを以下のようにして読み込みます。

データセットの構成は上記のような辞書型になっています。
今回主に使っていくのは以下の3つです。

● 説明変数が格納されている「data」
● 特徴量の名前が格納されている「feature_names」
● 目的変数が格納されている「target」

データの準備(STEP2:説明変数のデータフレーム化)

次に説明変数と特徴量を以下のように読み込みましょう。

各4つの特徴量が適切に取得出来ていることがわかりますね。

データの準備(STEP3:目的変数のシリーズ化)

説明変数の設定が出来たので、目的変数について見ていきます。
各特徴量を持つ品種が何かを意味する目的変数は、targetに格納されているので、これをSeries型として読み込んでおきます。

先頭5行についてはすべて「0」となっていますが、これは機械学習モデルを構築しやすいように、既にラベルの変換が行われているためです。つまり、「Setosa → 0」「Versicolor → 1」「Virginica → 2」と変換した後の結果がtargetに格納されているということです。

今回はモデル構築ではなく、データ可視化が目的なので理解を深めるために品種名に戻しておきます。
クラスラベルの変換として下記コードを実行すればOKです。

この結果、ラベル名が適切に品種名になっていることが確認出来ました。

クラスラベルの変換方法について今一つわからない方は、下記記事で紹介しているので参考にしてください。

データの準備(STEP4:データの結合とカラム名変換)

説明変数と目的変数について準備が出来たので、これらを統合したデータセットを作っておきます。
以下のコードで結合が可能です。

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

以上でデータ可視化用のデータが出来上がりました。

カーネル密度推定とは

カーネル密度推定とは、ヒストグラムが持つ問題点を解消するための考え方です。
ヒストグラムは1変量のデータについて可視化する方法であり、グラフ化する方法は前回お伝えした通りですが、実は「観測データの区分をどうするか」という問題がヒストグラムには存在します。

pythonではほぼ自動でイイ感じに調整してくれるので、前回記事でも意識する必要はありませんでしたが、ヒストグラムを構成している1本1本の縦棒を作る幅(度数の幅)の設定方法によっては、グラフの形状が異なるという問題点があるのです。

それを解消するための方法が「カーネル密度推定」と言われるものであり、簡単に言ってしまえば「ヒストグラムを滑らかな線で繋げてあげれば、そもそも区分分けなんていらない」といった考え方に基づいて作られるグラフです。ラフに滑らかなヒストグラムと言った方が理解しやすいかもしれませんね

データ可視化①

では実際にseabornを用いてカーネル密度推定を描画していきましょう。
特徴量が4つありますが、今回も「petal length(花びらの長さ)」をピックアップしてカーネル密度を描きます。僕は特徴量の手打ちが面倒なので、以下のようにしてリスト化しておきます。

そして、以下のコードを実行することで、カーネル密度推定を描画することが可能です。

ポイントは以下3つです。

● sns.kdeplotを用いることで、カーネル密度推定を描くことが出来る!
● 引数にある「shade」をTrueとしてあげることで、線で囲われた下部分に色を付けられる
● 合計面積が「1」となるように変換されているため、縦軸の数値が変化している

これでカーネル密度推定を描くことが出来ましたね。

先ほど、ヒストグラムと関係があるといった話をしましたが、ヒストグラムで「ある引数を操作」することでも上記のカーネル密度推定を可視化することが出来ます。それが以下のコードです。

その引数とは「kde」であり、前回False指定していた点をTrue指定(デフォルト)にすることで、ヒストグラムと合わせてカーネル密度推定を描くことも可能となります。比べてみると、同じような曲線が描かれていることがわかりますね。知っておくと便利なので、今回の論点と合わせて抑えておいてください。

データ可視化②

では次に、前回と同じく品種別にグラフを描いてみます。データセットには150個分のデータがまとめて格納されているので、まずは品種別に50個ずつデータを分割していきます。50個ずつ適切にデータ分割出来ればどんな方法でもOKです。

僕であれば以下のような方法でデータを分割・確認します(前回同様)。

データの分割が出来たので、品種別にカーネル密度推定を描いてみましょう。

結果、品種別にカーネル密度推定が描けたことがわかります。
基本的に前回と同じコードですが、labelの指定時にsetを使っている点だけが異なります。
(これを使わないと、なぜか大量のデータがラベルとなってしまうため)

では最後に、前回のヒストグラムの引数kdeをTrueにしたバージョンを確認してみましょう。

同じ形状をしたカーネル密度推定が描かれていることがわかりますね。

以上のように、品種別に花びらの長さについてカーネル密度推定を可視化出来ました。
品種によって花びらの長さの分布が異なっていることが一目瞭然なので、ヒストグラムと同じく1変量のデータの中に、種別のような性質の異なるデータが含まれている時や全体感を知りたい時に使える手法です。

ちなみに、上記のコードがよくわからないという方は、以下のように書いてもOKです。
同じ結果が得られることがわかるかと思います。

まとめ

いかがだったでしょうか?
今回は可視化手法として「カーネル密度推定」について紹介してきました。

実質、前回紹介したヒストグラムの延長的な位置づけの可視化手法とも言えますね。データ分布の全体像を把握したいような時にも使える手法なので、是非使えるようにしてしてみてください。

では今回はこのへんで。