Python

インタラクティブな分析を高速化する Plotly expressの使い方

こんにちは、皆さん Jupyterなどでデータ分析をやっているときにグラフの作成は何を使っていますか?Matplotlibや Seabornがすぐに思い浮かぶと思いますが、散布図を書いたときに外れ値が原因で見たい領域が全然見えなかったり、軸で切り分けてみるときにいちいち元データを整形しないといけなかったり…

本来であればデータの構造を理解するために頭と時間を使いたいのにデータ可視化の時点で手間取ってしまい、効率が落ちてしまうことはよくあると思います。

そこで、登場するのがデータ可視化ライブラリである「Plotly」です。これは、Pythonだけでなく R, Julia, Javascriptなどでも使えるグラフを作るためのライブラリです。今回はこの Plotlyを使ってお手軽に色々な種類のグラフを作ってみました。

Plotlyとは

Plotlyはインタラクティブなグラフやチャートを生成できるライブラリです(公式ページ)。Pythonで使用するときには大きく分けて二種類のクラスメソッドがあります。

  • plotly.express : pandas.DataFrameを使って、短いコードでグラフを作成
  • plotly.graph_objects : listlikeなデータを使って、詳細まで明示したグラフを作成

plotly.expressではとりあえずグラフを見てみたいときに使うイメージで、plotly.graph_objectsは細かい部分までグラフを作りこむときに使うイメージです。

plotly.graph_objectsは Matplotlibや Seabornよりも複雑で習熟にそこそこなコストがかかりそうですが、plotly.expressは簡単にグラフが書け(体感 Seabornに似ています)かなりインタラクティブにグラフを操作することができます。今回はこの plotly.expressに絞ってコードをどんなグラフができるかを書いていきます。

plotly.express リファレンス

インストール

pip で入ります

pip install plotly

condaで入れるときにはチャネルが「plotly」であることに注意してください

conda install -c plotly plotly

使用データ

今回使用したデータはTableauのサンプルデータとしてよく使われるスーパーストアの日本バージョンのものを使用しました。

URL: https://drive.google.com/drive/u/0/folders/1kXSb3fqPTt3VcPjGUSgOmrztlRfvvpMH

少し整形して、このようなデータを使って可視化しています。

基本系

大枠の出力方法は、pandas.DataFrameを指定してx軸とy軸に使うカラムを指定、色を分けたい場合はcolorに分析軸のカラムを指定します。

このようにして作られたグラフはグラフ内をドラッグすることによって表示する軸の範囲を変更できます。また、右側の要素をクリックするとその要素を表示するかどうかを選択することができます。他にもスライダーで表示させる要素を切り替えられたり、色々な操作性を組み込むことができます。以下コード例と出力結果を並べるので色々触ってみてください。

散布図

import plotly.express as px

fig = px.scatter(
    data_frame=df,
    x='売上',
    y='利益',
    color='地域',
    marginal_x='rug',
    marginal_y='rug',
    title='Scatter Plot'
)
fig.show()

バブルチャート

import plotly.express as px

fig = px.scatter(
    data_frame=df,
    x='売上',
    y='利益',
    color='出荷モード',
    size='数量',
    title='Bubble chart'
)
fig.show()

折れ線グラフ

import plotly.express as px

fig = px.line(
    data_frame=df,
    x='オーダー日',
    y='利益',
    color='カテゴリ',
    animation_frame='オーダー日(年)',
    title='Line Plot'
)
fig.show()

棒グラフ

※集計された積み上げ棒グラフを作成するのは histogram関数を使う必要があります

import plotly.express as px

fig = px.histogram(
    data_frame=df,
    x='地域',
    y='売上',
    color='顧客区分',
    title='Bar plot (by use Histogram)'
)
fig.show()

比較

円グラフ

import plotly.express as px

fig = px.pie(
    data_frame=df,
    values='売上',
    names='カテゴリ',
    title='Pie Chart'
)
fig.show()

サンバースト

import plotly.express as px

fig = px.sunburst(
    data_frame=df,
    values='売上',
    path=['カテゴリ', 'サブカテゴリ'],
    color='利益',
    title='Sunburst Chart'
)
fig.show()

ツリーマップ

import plotly.express as px

fig = px.treemap(
    data_frame=df,
    values='売上',
    path=['国', '地域', '都道府県'],
    color='利益',
    title='Treemap',
)
fig.show()

散布図行列

import plotly.express as px

fig = px.scatter_matrix(
    data_frame=df,
    dimensions=['売上', '利益', '数量', '割引率'],
    color='顧客区分',
    title='3D Scatter plot'
)
fig.show()

Parallel Coodinates

import plotly.express as px

fig = px.parallel_coordinates(
    data_frame=df,
    color='利益',
    dimensions=['数量', '割引率', '売上', '利益'],
    color_continuous_scale=px.colors.diverging.Tealrose,
    color_continuous_midpoint=2,
    title='Parallel Coodinates'
)
fig.show()

分布

ヒストグラム(連続値)

import plotly.express as px

fig = px.histogram(
    data_frame=df,
    x='利益',
    nbins=100,
    title='Histogram (value)'
)
fig.show()

ヒストグラム(カテゴリ)

import plotly.express as px

fig = px.histogram(
    data_frame=df,
    x='オーダー日(月)',
    title='Histogram (category)'
)
fig.show()

ボックスプロット

import plotly.express as px

fig = px.box(
    data_frame=df,
    x='オーダー日(月)',
    y='利益',
    title='Box plot'
)
fig.show()

バイオリンプロット

import plotly.express as px

fig = px.violin(
    data_frame=df,
    x='オーダー日(月)',
    y='利益',
    color='顧客区分',
    title='Violin plot'
)
fig.show()

※y軸を0付近にすると見えます

ヒートマップ

import plotly.express as px

fig = px.density_heatmap(
    data_frame=df,
    x='オーダー日(年)',
    y='オーダー日(月)',
    z='利益',
    title='Heatmap'
)
fig.show()

等高線

import plotly.express as px

fig = px.density_contour(
    data_frame=df,
    x='売上',
    y='利益',
    color='都道府県',
    title='Density Contours'
)
fig.show()

※x軸、y軸を0付近にすると見えます

三次元

三次元散布図

import plotly.express as px

fig = px.scatter_3d(
    data_frame=df,
    x='売上',
    y='利益',
    z='割引率',
    color='カテゴリ',
    title='3D Scatter plot'
)
fig.show()

というわけで Plotlyで色々可視化してみました。少ないコード量で、脳死でもリッチなグラフを書けるのが最大の強みだと思います。ぜひ使ってみてください。

最後まで読んでいただきありがとうございました。

Yasui
アナリティクス&デベロップメント所属 特技はPCR