たなブログ 教養を高めて生涯資産を増やすブログ(`・ω・´)

【Python Coding】Plotlyを用いて「箱ひげ図」を描く方法を紹介

PR Pythonを学ぶ

こんにちは、TAKです。
今回は、「plotly」を用いてpythonで箱ひげ図(Boxplot)のグラフを描く方法を紹介したいと思います。

plotlyの概要と基本的な使い方は以下記事で紹介しているので、「plotlyって何?」という方はまずコチラを参考にしてみてください。

【こんな人に読んで欲しい記事です】

● 「plotly」を使って「箱ひげ図(Boxplot)」を描けるようになりたい方

● pythonを用いて、データをインタラクティブに可視化出来るようになりたい方

今回は、最終的に以下のようなグラフを描くことを目的としていますが、基本的には上記記事で紹介しているコードとほぼ同じです。コードを見ながら「違うのはココ」とわかるように紹介していきます。

今回の記事の目的|「plotly」を用いてBoxplotのグラフを描く

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

まず最初に、いつものように必要なライブラリのインポートをしておきます。

今回使うライブラリのインポート

今回はsklearnライブラリのアヤメデータセットを用いるので、pandasとload_irisを上2行でインポートしています。下2行が「plotly」 を用いて可視化するために必要なメイン部分となります。

利用データの作成

僕の記事でも何回か登場しているので見慣れている方も多いかもしれませんが、アヤメデータセットには以下3つの品種に関するデータ(がく・花びらの長さや幅)が含まれています。

アヤメデータのイメージ(3つの品種名とイメージ)

アヤメデータセットを読み込んで、pandasのデータフレームとして格納しているコードが以下となります。

アヤメデータセットのデータフレーム化

上記コード内では、ラベル部分を数値から品種名に変換していますが、これはグラフ時に見やすくするための処理となります。加えて、カラム名がデフォルトだと操作しにくいの以下のように変更しておきます。

データセットのカラム名を変更

これで準備が出来たので、「plotly」を用いてBoxplotのグラフを描いていきましょう。
今回は、以下2つの内容を想定してグラフ化していきます。

【具体例①】 カラム「sepal length」だけを用いて「Boxplot」のグラフを品種別に描く

【具体例②】 全カラムを用いて「Boxplot」のグラフを品種別に描く (2行2列の形)

【具体例①】「sepal length」を用いて「箱ひげ図」を描く

冒頭でお伝えした通り、「plotly」の基本的なコードは前回とほぼ同じです。
指定するデータ以外に異なる箇所は、前回「go.Scatter()」としていた部分を「go.Box()」に変更する点のみです(以下コードの赤線部分参照)。

【具体例①】plotlyを用いてBoxplotを描いたコード

グラフにカーソルを当てると、以下のように箱ひげ図で示される統計量が表示されることがわかります。

【具体例①】描いたグラフにカーソルを当てた場合の表示

箱ひげ図は四分位点などの統計量を表示してくれますが、グラフで表示されている数値が実際に計算した統計量と一致しているか、参考程度に確認してみます。興味のある方は、以下のコードと赤枠部分の結果が一致していることを確認してみてください。

「setosa」を例に要約統計量が一致していることを確認

【具体例②】「4つの特徴量」を用いて「箱ひげ図」を描く

先ほどは1つのカラム「sepal_length」のみを使用しましたが、今度は4つすべての特徴量を用いてBoxplotを「2行2列」の形で描いてみたいと思います。

各特徴量ごとに「add_trace」「go.Box()」を用いて「row/col」を指定すれば描くことが出来ます。

【具体例②】plotlyを用いてBoxplotを描いたコード

先ほどと同様に、グラフにカーソルを合わせると統計量が表示されていますね。

【具体例②】描いたグラフにカーソルを当てた場合の表示

以上が、plotlyを用いた箱ひげ図(Boxplot)を描く方法の紹介でした。

まとめ

今回は、pythonの「plotly」を用いて箱ひげ図(Boxplot)をインタラクティブに描く方法を紹介しました

「matplotlib」や「seaborn」を用いたグラフ化が一般的ですが、時と場合によっては今回紹介した「plotly」を利用してみてください。

「seaborn」を用いてグラフを描く方法も以下記事で紹介しているので、「一般的なグラフを描きたい」という方は参考にしてみてください。

では今回はこのへんで。