LESSON

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/seabornPlotly
論文・報告書推奨-
探索的分析-推奨
プレゼン・共有-推奨
大量のグラフ推奨(軽量)-
ダッシュボード-推奨
細かいカスタマイズ推奨-

まとめ

項目ポイント
Plotly Express少ないコードでインタラクティブなグラフを作成
インタラクティブ機能ズーム、ホバー、フィルタリングで探索的分析に最適
ダッシュボードsubplotsで複数グラフを統合表示
ドリルダウンボタンやドロップダウンで表示を切り替え
エクスポートHTML/PNG形式で共有可能

チェックリスト

  • Plotly Expressで基本グラフ(折れ線、棒、散布図)を作成できる
  • サンバーストやファネルなど高度なグラフを作成できる
  • subplotsでダッシュボード風レイアウトを作成できる
  • HTMLファイルとしてエクスポートできる

次のステップへ

インタラクティブ可視化を学びました。次は、データから洞察を引き出し、ストーリーとして伝えるデータストーリーテリングを学びましょう。


推定読了時間:30分