Plotlyインタラクティブ可視化
田中VPoE「matplotlibで作った静的グラフは報告書には最適だ。でも、経営会議では『このカテゴリの内訳が見たい』『この期間を拡大したい』といったリクエストが飛び交う。」
あなた「そのたびにグラフを作り直すのは大変ですね。」
田中VPoE「そこでインタラクティブなグラフの出番だ。Plotlyを使えば、ズーム、ホバー、フィルタリングができるグラフが簡単に作れる。ダッシュボードの基盤にもなるよ。」
Plotlyとは
Plotlyは、インタラクティブなWebベースのグラフを作成できるライブラリです。Jupyter Notebook上でそのまま操作でき、HTMLファイルとしてエクスポートもできます。
Plotly Express
Plotly Expressは、Plotlyの簡易APIです。seabornのように少ないコードで美しいグラフを作成できます。
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
基本グラフ
折れ線グラフ
fig = px.line(
monthly_sales,
x='month',
y='revenue',
color='category',
title='カテゴリ別月次売上推移',
labels={'revenue': '売上(万円)', 'month': '月', 'category': 'カテゴリ'}
)
fig.update_layout(hovermode='x unified')
fig.show()
棒グラフ
fig = px.bar(
category_sales,
x='category',
y='revenue',
color='category',
title='カテゴリ別売上',
text='revenue'
)
fig.update_traces(texttemplate='%{text:,.0f}万円', textposition='outside')
fig.show()
散布図
fig = px.scatter(
df,
x='age',
y='amount',
color='category',
size='quantity',
hover_data=['customer_id', 'order_date'],
title='年齢と注文金額の関係',
opacity=0.6
)
fig.show()
ヒストグラム
fig = px.histogram(
df,
x='amount',
nbins=50,
color='category',
marginal='box',
title='注文金額の分布(カテゴリ別)'
)
fig.show()
高度なグラフ
サンバーストチャート(階層構造)
fig = px.sunburst(
df_summary,
path=['region', 'category'],
values='revenue',
title='地域→カテゴリの売上構成'
)
fig.show()
ファネルチャート
stages = ['サイト訪問', '商品閲覧', 'カート投入', '決済開始', '購入完了']
values = [50000, 25000, 8000, 4000, 2500]
fig = px.funnel(
x=values,
y=stages,
title='購買ファネル分析'
)
fig.show()
トレンドライン付き散布図
fig = px.scatter(
df,
x='ad_spend',
y='revenue',
trendline='ols',
title='広告費と売上の関係(回帰直線付き)'
)
fig.show()
ダッシュボード風レイアウト
subplotsを使って、複数グラフを1つのFigureにまとめます:
from plotly.subplots import make_subplots
fig = make_subplots(
rows=2, cols=2,
subplot_titles=['月次売上推移', 'カテゴリ別構成', '注文金額分布', '地域別売上'],
specs=[
[{'type': 'scatter'}, {'type': 'pie'}],
[{'type': 'histogram'}, {'type': 'bar'}]
]
)
# 左上:折れ線
fig.add_trace(
go.Scatter(x=months, y=sales, mode='lines+markers', name='売上'),
row=1, col=1
)
# 右上:円グラフ
fig.add_trace(
go.Pie(labels=categories, values=values, name='構成比'),
row=1, col=2
)
# 左下:ヒストグラム
fig.add_trace(
go.Histogram(x=df['amount'], nbinsx=50, name='金額分布'),
row=2, col=1
)
# 右下:棒グラフ
fig.add_trace(
go.Bar(x=regions, y=region_sales, name='地域別'),
row=2, col=2
)
fig.update_layout(
height=700,
title_text='NetShop社 経営ダッシュボード',
showlegend=False
)
fig.show()
ドリルダウン機能
Plotlyのクリックイベントを使ったドリルダウンの例:
# ボタンで表示を切り替え
fig = go.Figure()
for category in categories:
cat_data = monthly_sales[monthly_sales['category'] == category]
fig.add_trace(
go.Scatter(x=cat_data['month'], y=cat_data['revenue'],
mode='lines+markers', name=category, visible=True)
)
# ドロップダウンメニュー
buttons = [{'label': '全カテゴリ',
'method': 'update',
'args': [{'visible': [True] * len(categories)}]}]
for i, cat in enumerate(categories):
visibility = [False] * len(categories)
visibility[i] = True
buttons.append({
'label': cat,
'method': 'update',
'args': [{'visible': visibility}]
})
fig.update_layout(
updatemenus=[{'buttons': buttons, 'direction': 'down', 'x': 0.1, 'y': 1.15}],
title='カテゴリ別売上推移(カテゴリ選択可能)'
)
fig.show()
HTMLエクスポート
# HTMLファイルとして保存(共有に便利)
fig.write_html('dashboard.html', include_plotlyjs='cdn')
# 画像として保存
fig.write_image('chart.png', width=1200, height=600, scale=2)
matplotlibとの使い分け
| 用途 | matplotlib/seaborn | Plotly |
|---|---|---|
| 論文・報告書 | 推奨 | - |
| 探索的分析 | - | 推奨 |
| プレゼン・共有 | - | 推奨 |
| 大量のグラフ | 推奨(軽量) | - |
| ダッシュボード | - | 推奨 |
| 細かいカスタマイズ | 推奨 | - |
まとめ
| 項目 | ポイント |
|---|---|
| Plotly Express | 少ないコードでインタラクティブなグラフを作成 |
| インタラクティブ機能 | ズーム、ホバー、フィルタリングで探索的分析に最適 |
| ダッシュボード | subplotsで複数グラフを統合表示 |
| ドリルダウン | ボタンやドロップダウンで表示を切り替え |
| エクスポート | HTML/PNG形式で共有可能 |
チェックリスト
- Plotly Expressで基本グラフ(折れ線、棒、散布図)を作成できる
- サンバーストやファネルなど高度なグラフを作成できる
- subplotsでダッシュボード風レイアウトを作成できる
- HTMLファイルとしてエクスポートできる
次のステップへ
インタラクティブ可視化を学びました。次は、データから洞察を引き出し、ストーリーとして伝えるデータストーリーテリングを学びましょう。
推定読了時間:30分