📋 このステップで学ぶこと
- KPIカードとは何か、なぜ重要なのか
- 効果的なKPIカードの4つの要素
- 数値を大きく表示する方法と視覚的階層
- 前期比の矢印表示(▲▼)の実装
- 信号機カラー(赤・黄・緑)での状態表現
- スパークライン(小さなグラフ)の追加
- 実務で使える営業・ECダッシュボードの作成
📊 1. KPIカードとは
KPIカードの定義と役割
KPIカード(KPI Card)とは、重要業績評価指標(KPI: Key Performance Indicator)を1枚のカードにまとめて表示したUIコンポーネントです。
ダッシュボードの上部に並べて配置されることが多く、ビジネスの状況を5秒で把握できるように設計されています。
💡 身近な例で考えてみよう
KPIカードは、車のダッシュボードに似ています:
スピードメーター:現在の速度を大きく表示(=メイン数値)
燃料計:残量を色で表示(緑=十分、赤=要給油)
警告ランプ:問題があれば点灯(=ステータス表示)
運転中に「今何km?」と聞かれたら、一目でメーターを見て答えられる。KPIカードも同じように、ビジネスの状況を一瞬で把握できるように設計します。
KPIカードの構成要素
効果的なKPIカードは、以下の要素で構成されています。それぞれが「何を伝えるか」という役割を持っています。
【KPIカードの構成要素】
┌────────────────────────┐
│ 月間売上 │ ← ① タイトル(何のKPIか)
│ │
│ 450万円 │ ← ② メイン数値(最も重要、大きく表示)
│ │
│ ▲ +12.5% │ ← ③ 変化率(前期比、矢印で方向を表示)
│ 前月比 │
│ │
│ ━━━━━━━━━━━━━━━━━━━━ │
│ │
│ 目標: 400万円 ✓達成 │ ← ④ 目標値とステータス
│ │
│ ╱╲ ╱╲╱╲╱ │ ← ⑤ スパークライン(トレンド)
│ ╱ ╲╱ ╲ │
└────────────────────────┘
【各要素の役割】
① タイトル: 「何のKPIか」を明示
② メイン数値: 「今どれくらいか」を大きく表示
③ 変化率: 「良くなったか悪くなったか」を矢印で表示
④ 目標・状態: 「目標に達したか」を色やアイコンで表示
⑤ スパークライン: 「過去の推移」を小さなグラフで表示
📊 KPIカードが使われる場面
| 用途 |
具体例 |
特徴 |
| ダッシュボード |
売上、顧客数、CVRなどを横に並べて表示 |
複数のKPIを一覧で比較できる |
| レポート |
月次レポートのサマリーセクション |
重要指標だけを抜粋して表示 |
| モニタリング |
サーバー稼働率、エラー率のリアルタイム監視 |
異常を即座に検知できる |
| モバイルアプリ |
営業アプリの今日の売上表示 |
小さな画面でもコンパクトに表示 |
💡 良いKPIカードの4つの特徴
| 特徴 |
実現方法 |
悪い例 |
| 一目で理解 |
数値を48-72ptで大きく表示 |
数値が小さくて読めない |
| 状況が分かる |
良い=緑、悪い=赤で色分け |
全部同じ色で区別がつかない |
| トレンドが見える |
上昇=▲、下降=▼の矢印 |
変化の方向が分からない |
| 文脈がある |
目標値や前期比を併記 |
数値だけで良し悪しが判断できない |
🔢 2. 数値を大きく表示する
視覚的階層の重要性
KPIカードでは、数値が主役です。他の要素(タイトル、ラベル、補足情報)よりも圧倒的に大きく表示することで、見た人が最初に数値に目を向けるように設計します。
これを視覚的階層(Visual Hierarchy)と呼びます。重要な情報ほど大きく、目立つようにデザインします。
【フォントサイズの階層設計】
┌────────────────────────┐
│ 月間売上 │ ← 14-18pt(タイトル):何のKPIか
│ │
│ 450万円 │ ← 48-72pt(メイン数値)★ 最も大きく!
│ │
│ +12.5% │ ← 18-24pt(変化率):方向性を示す
│ 前月比 │ ← 10-12pt(ラベル):補足説明
└────────────────────────┘
【ポイント】
✓ メイン数値は他の要素の3〜5倍のサイズ
✓ 数値だけで意味が伝わるように単位も表示
✓ 色やウェイト(太さ)でさらに強調
【サイズの目安】
・タイトル: 14-18pt(通常の太さ)
・メイン数値: 48-72pt(太字)★
・変化率: 18-24pt(色付き)
・ラベル: 10-12pt(薄いグレー)
基本的なKPIカードの作成
Plotlyのgo.Indicatorを使うと、KPIカードを簡単に作成できます。まずは最もシンプルな形から始めましょう。
# 基本的なKPIカードの作成
import plotly.graph_objects as go
# KPIデータ
売上 = 450 # 今月の売上(万円)
前月 = 400 # 前月の売上(万円)
# KPIカードを作成
fig = go.Figure(go.Indicator(
mode=’number+delta’, # 数値と変化率を表示
value=売上, # メインの数値
delta={
‘reference’: 前月, # 比較対象(前月)
‘relative’: True, # 変化率を%で表示
‘valueformat’: ‘.1f’, # 小数点1桁
‘suffix’: ‘%’ # 単位に%を追加
},
number={
‘suffix’: ‘万円’, # 単位
‘font’: {
‘size’: 64, # フォントサイズ(大きく!)
‘weight’: ‘bold’ # 太字
}
},
title={
‘text’: ‘月間売上’, # タイトル
‘font’: {‘size’: 18}
}
))
# レイアウト設定
fig.update_layout(
height=250,
paper_bgcolor=’#F8F9FA’ # 薄いグレーの背景
)
fig.show()
コードの解説
📝 go.Indicator() の主要パラメータ
| パラメータ |
説明 |
なぜ使うのか |
mode |
表示モード(’number’, ‘delta’, ‘gauge’の組み合わせ) |
どの要素を表示するか指定するため |
value |
メインの数値 |
KPIの現在値を表示するため |
delta |
変化率の設定 |
前期比や変化を表示するため |
number |
数値の表示設定 |
フォントサイズや単位を設定するため |
title |
タイトルの設定 |
何のKPIか明示するため |
【modeパラメータの組み合わせ】
‘number’ → 数値のみ表示
‘number+delta’ → 数値 + 変化率
‘number+gauge’ → 数値 + ゲージ(メーター)
‘number+delta+gauge’ → 数値 + 変化率 + ゲージ
【deltaパラメータの詳細】
reference: 比較対象の値(前月、目標など)
relative: True=変化率(%)、False=差分(絶対値)
valueformat: 表示形式(’.1f’=小数点1桁)
suffix: 単位(’%’など)
increasing: 増加時の色設定
decreasing: 減少時の色設定
複数のKPIカードを並べる
実際のダッシュボードでは、複数のKPIカードを横に並べて表示します。make_subplotsを使って実装します。
# 複数のKPIカードを横に並べる
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# KPIデータ(3つのKPI)
kpis = [
{‘名前’: ‘売上’, ‘値’: 450, ‘前期’: 400, ‘単位’: ‘万円’},
{‘名前’: ‘新規顧客’, ‘値’: 38, ‘前期’: 30, ‘単位’: ‘社’},
{‘名前’: ‘満足度’, ‘値’: 4.5, ‘前期’: 4.2, ‘単位’: ‘点’}
]
# 3列のサブプロットを作成
fig = make_subplots(
rows=1, cols=3,
specs=[[{‘type’: ‘indicator’}] * 3], # 3つともIndicator型
subplot_titles=[kpi[‘名前’] for kpi in kpis]
)
# 各KPIカードを追加
for i, kpi in enumerate(kpis, start=1):
fig.add_trace(go.Indicator(
mode=’number+delta’,
value=kpi[‘値’],
delta={
‘reference’: kpi[‘前期’],
‘relative’: True,
‘valueformat’: ‘.1f’,
‘suffix’: ‘%’,
‘increasing’: {‘color’: ‘green’}, # 増加=緑
‘decreasing’: {‘color’: ‘red’} # 減少=赤
},
number={
‘suffix’: kpi[‘単位’],
‘font’: {‘size’: 48, ‘weight’: ‘bold’}
}
), row=1, col=i)
# レイアウト設定
fig.update_layout(
height=250,
showlegend=False,
paper_bgcolor=’white’
)
fig.show()
【実行結果】
3つのKPIカードが横に並んで表示されます:
売上: 450万円 ▲+12.5%(緑)
新規顧客: 38社 ▲+26.7%(緑)
満足度: 4.5点 ▲+7.1%(緑)
📈 3. 前期比の矢印表示
矢印で増減を表現する理由
矢印(↑↓ または ▲▼)は、数値の変化を直感的に伝えます。数値を読まなくても、矢印の向きを見るだけで「良くなった」「悪くなった」が分かります。
特に複数のKPIカードを並べたとき、矢印があると一瞬でどのKPIに問題があるかを把握できます。
【矢印の使い方と色の組み合わせ】
■ 上昇(良い変化)
記号: ↑ または ▲
色: 緑 (#2ECC71)
例: 売上 450万円 ▲+12.5%
■ 下降(悪い変化)
記号: ↓ または ▼
色: 赤 (#E74C3C)
例: 顧客満足度 3.8点 ▼-5.0%
■ 横ばい(変化なし)
記号: → または ━
色: グレー (#7F8C8D)
例: 利益率 15% →±0%
【注意】指標によって「上昇=良い」とは限らない
・売上、顧客数 → 上昇=良い(▲緑)
・コスト、エラー率 → 上昇=悪い(▲赤)
・指標の性質に合わせて色を設定すること!
矢印付きKPIカードの作成
Plotlyのdeltaパラメータで、自動的に矢印と色を付けることができます。
# 矢印付きKPIカードを作成する関数
import plotly.graph_objects as go
def create_kpi_card(タイトル, 値, 前期値, 単位=”):
“””
矢印付きKPIカードを作成する
Parameters:
———–
タイトル : str – KPIの名前
値 : float – 現在の値
前期値 : float – 比較対象(前月、前年など)
単位 : str – 単位(万円、%など)
Returns:
——–
fig : Figure – PlotlyのFigureオブジェクト
“””
fig = go.Figure(go.Indicator(
mode=’number+delta’,
value=値,
delta={
‘reference’: 前期値,
‘relative’: True, # 変化率で表示
‘valueformat’: ‘.1f’, # 小数点1桁
‘suffix’: ‘%’,
‘increasing’: {
‘color’: ‘green’, # 増加時は緑
‘symbol’: ‘▲’ # 上向き三角
},
‘decreasing’: {
‘color’: ‘red’, # 減少時は赤
‘symbol’: ‘▼’ # 下向き三角
}
},
number={
‘suffix’: 単位,
‘font’: {‘size’: 64, ‘weight’: ‘bold’}
},
title={
‘text’: タイトル,
‘font’: {‘size’: 18}
}
))
fig.update_layout(
height=250,
paper_bgcolor=’#F8F9FA’,
margin=dict(t=50, b=20, l=20, r=20)
)
return fig
# 使用例:売上が増加した場合
fig1 = create_kpi_card(‘月間売上’, 450, 400, ‘万円’)
fig1.show()
# 使用例:満足度が低下した場合
fig2 = create_kpi_card(‘顧客満足度’, 3.8, 4.0, ‘点’)
fig2.show()
【実行結果】
月間売上: 450万円 ▲+12.5%(緑色の矢印)
顧客満足度: 3.8点 ▼-5.0%(赤色の矢印)
⚠️ 「上昇=良い」とは限らない場合の対処
コストやエラー率など、下がった方が良い指標では、色の設定を逆にする必要があります。
increasing: {'color': 'red'}(上昇=悪い=赤)
decreasing: {'color': 'green'}(下降=良い=緑)
🎨 4. 色での強調(信号機カラー)
信号機カラーシステムとは
赤・黄・緑の信号機カラーは、世界中で「止まれ・注意・進め」として認知されています。この直感的な色分けをKPIカードに適用することで、状況を瞬時に伝えることができます。
【信号機カラーの定義】
🟢 緑(Good): 目標達成、良好な状態
RGB: (46, 204, 113)
HEX: #2ECC71
→ 「問題なし、このまま継続」
🟡 黄(Warning): 注意、警告が必要
RGB: (243, 156, 18)
HEX: #F39C12
→ 「注意が必要、対策を検討」
🔴 赤(Bad): 未達成、問題あり
RGB: (231, 76, 60)
HEX: #E74C3C
→ 「問題あり、即座に対応が必要」
【適用ルールの例】
┌─────────────┬────────────────────────┐
│ 指標 │ 色分けルール │
├─────────────┼────────────────────────┤
│ 目標達成率 │ ≥100%: 緑 │
│ │ 80-99%: 黄 │
│ │ <80%: 赤 │
├─────────────┼────────────────────────┤
│ 顧客満足度 │ ≥4.0点: 緑 │
│ │ 3.0-3.9点: 黄 │
│ │ <3.0点: 赤 │
├─────────────┼────────────────────────┤
│ エラー率 │ <1%: 緑 │
│ │ 1-5%: 黄 │
│ │ ≥5%: 赤 │
└─────────────┴────────────────────────┘
色分けKPIカードの作成
目標達成率に応じて背景色を変える、色分けKPIカードを作成します。
# 色分けKPIカード(目標達成率で色を変える)
import plotly.graph_objects as go
def kpi_card_with_color(タイトル, 値, 目標, 単位=”):
“””
目標達成率に応じて色分けされたKPIカードを作成
Parameters:
———–
タイトル : str – KPIの名前
値 : float – 現在の値
目標 : float – 目標値
単位 : str – 単位
“””
# 達成率を計算
達成率 = (値 / 目標) * 100
# 達成率に応じて色とステータスを決定
if 達成率 >= 100:
背景色 = ‘#D5F4E6’ # 薄い緑
文字色 = ‘#2ECC71’ # 緑
ステータス = ‘✓ 目標達成’
elif 達成率 >= 80:
背景色 = ‘#FCF3CF’ # 薄い黄
文字色 = ‘#F39C12’ # 黄
ステータス = ‘⚠ 要注意’
else:
背景色 = ‘#FADBD8’ # 薄い赤
文字色 = ‘#E74C3C’ # 赤
ステータス = ‘✗ 未達成’
# KPIカードを作成
fig = go.Figure(go.Indicator(
mode=’number+gauge’,
value=値,
number={
‘suffix’: 単位,
‘font’: {
‘size’: 56,
‘color’: 文字色,
‘weight’: ‘bold’
}
},
title={
‘text’: f'{タイトル}
{ステータス}‘,
‘font’: {‘size’: 16}
},
gauge={
‘axis’: {‘range’: [0, 目標 * 1.2]},
‘bar’: {‘color’: 文字色},
‘threshold’: {
‘line’: {‘color’: ‘black’, ‘width’: 2},
‘thickness’: 0.75,
‘value’: 目標
}
}
))
fig.update_layout(
height=300,
paper_bgcolor=背景色,
margin=dict(t=80, b=20, l=20, r=20)
)
return fig
# 使用例:目標達成
fig1 = kpi_card_with_color(‘月間売上’, 450, 400, ‘万円’)
fig1.show()
# 使用例:要注意
fig2 = kpi_card_with_color(‘新規顧客’, 35, 40, ‘社’)
fig2.show()
# 使用例:未達成
fig3 = kpi_card_with_color(‘成約率’, 6, 10, ‘%’)
fig3.show()
【実行結果】
月間売上: 450万円(緑背景)✓ 目標達成
新規顧客: 35社(黄背景)⚠ 要注意
成約率: 6%(赤背景)✗ 未達成
💡 色分けのベストプラクティス
| ポイント |
推奨 |
避けるべきこと |
| 一貫性 |
同じ色は常に同じ意味 |
グラフごとに色の意味が違う |
| コントラスト |
背景と文字色の差を大きく |
薄い背景に薄い文字 |
| アクセシビリティ |
色だけでなくアイコン(✓✗)も併用 |
色だけで状態を判断させる |
📉 5. スパークライン(小さなグラフ)
スパークラインとは
スパークライン(Sparkline)は、文字サイズ程度の小さな線グラフです。限られたスペースで過去の推移(トレンド)を表現できます。
KPIカードにスパークラインを追加すると、「今の値」だけでなく「過去からの流れ」も一目で把握できるようになります。
【スパークラインの効果】
┌────────────────────────┐
│ 月間売上 │
│ │
│ 450万円 │ ← 現在の値
│ ▲ +12.5% │ ← 前月比
│ │
│ ╱╲ ╱╲╱╲╱ │ ← スパークライン
│ ╱ ╲╱ ╲ │ (過去6ヶ月の推移)
└────────────────────────┘
【スパークラインのメリット】
✓ トレンドが一目で分かる(上昇傾向?下降傾向?)
✓ 異常値の発見(急激な変化があったか?)
✓ スペースを取らない(小さなカード内に収まる)
✓ 詳細グラフへの誘導(「もっと詳しく見たい」と思わせる)
【表示する期間の目安】
・日次データ: 過去7-14日
・週次データ: 過去8-12週
・月次データ: 過去6-12ヶ月
スパークライン付きKPIカードの作成
make_subplotsを使って、上部にKPI数値、下部にスパークラインを配置します。
# スパークライン付きKPIカード
import plotly.graph_objects as go
from plotly.subplots import make_subplots
def kpi_card_with_sparkline(タイトル, 現在値, 履歴データ, 単位=”):
“””
スパークライン付きKPIカードを作成
Parameters:
———–
タイトル : str – KPIの名前
現在値 : float – 現在の値
履歴データ : list – 過去のデータ(リスト形式)
単位 : str – 単位
“””
# 前期の値(履歴データの最後から2番目)
前期値 = 履歴データ[-2] if len(履歴データ) > 1 else 現在値
# 2行のサブプロットを作成(上:KPI、下:スパークライン)
fig = make_subplots(
rows=2, cols=1,
row_heights=[0.7, 0.3], # 上70%、下30%
specs=[
[{‘type’: ‘indicator’}],
[{‘type’: ‘scatter’}]
],
vertical_spacing=0.05 # 行間のスペース
)
# 上部: KPI数値
fig.add_trace(go.Indicator(
mode=’number+delta’,
value=現在値,
delta={
‘reference’: 前期値,
‘relative’: True,
‘valueformat’: ‘.1f’,
‘suffix’: ‘%’
},
number={
‘suffix’: 単位,
‘font’: {‘size’: 48, ‘weight’: ‘bold’}
},
title={
‘text’: タイトル,
‘font’: {‘size’: 16}
}
), row=1, col=1)
# 下部: スパークライン
fig.add_trace(go.Scatter(
x=list(range(len(履歴データ))),
y=履歴データ,
mode=’lines’,
line=dict(color=’#3498DB’, width=2),
fill=’tozeroy’, # 下を塗りつぶす
fillcolor=’rgba(52, 152, 219, 0.2)’, # 薄い青
showlegend=False,
hovertemplate=’%{y}’ + 単位 + ‘‘
), row=2, col=1)
# 軸を非表示(スパークラインはシンプルに)
fig.update_xaxes(showticklabels=False, showgrid=False, row=2, col=1)
fig.update_yaxes(showticklabels=False, showgrid=False, row=2, col=1)
fig.update_layout(
height=300,
paper_bgcolor=’#F8F9FA’,
margin=dict(t=50, b=20, l=20, r=20)
)
return fig
# 使用例
過去6ヶ月売上 = [320, 350, 380, 400, 420, 450]
fig = kpi_card_with_sparkline(‘月間売上’, 450, 過去6ヶ月売上, ‘万円’)
fig.show()
【実行結果】
月間売上: 450万円 ▲+7.1%
(下部に過去6ヶ月の上昇トレンドを示すスパークラインが表示)
コードの解説
📝 スパークラインの設定ポイント
| 設定 |
コード |
効果 |
| 塗りつぶし |
fill='tozeroy' |
線の下を塗りつぶしてエリアチャートに |
| 透明度 |
fillcolor='rgba(52, 152, 219, 0.2)' |
薄い色で圧迫感を減らす |
| 軸非表示 |
showticklabels=False |
軸ラベルを消してシンプルに |
| グリッド非表示 |
showgrid=False |
グリッド線を消してスッキリ |
💼 6. 実務での応用例
例1: 営業ダッシュボード
営業チームが毎日確認するダッシュボードの例です。4つのKPIを横に並べて表示します。
# 営業ダッシュボード(4つのKPIカード)
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# 営業KPIデータ
営業データ = {
‘月間売上’: {‘値’: 450, ‘目標’: 400, ‘前月’: 400, ‘単位’: ‘万円’},
‘新規顧客’: {‘値’: 38, ‘目標’: 30, ‘前月’: 24, ‘単位’: ‘社’},
‘商談数’: {‘値’: 52, ‘目標’: 50, ‘前月’: 48, ‘単位’: ‘件’},
‘成約率’: {‘値’: 12.5, ‘目標’: 10.0, ‘前月’: 11.2, ‘単位’: ‘%’}
}
# 4列のサブプロットを作成
fig = make_subplots(
rows=1, cols=4,
specs=[[{‘type’: ‘indicator’}] * 4],
subplot_titles=list(営業データ.keys())
)
# 各KPIを追加
for i, (名前, data) in enumerate(営業データ.items(), start=1):
# 達成率で色を決定
達成率 = (data[‘値’] / data[‘目標’]) * 100
if 達成率 >= 100:
色 = ‘#2ECC71’ # 緑
elif 達成率 >= 80:
色 = ‘#F39C12’ # 黄
else:
色 = ‘#E74C3C’ # 赤
fig.add_trace(go.Indicator(
mode=’number+delta+gauge’,
value=data[‘値’],
delta={
‘reference’: data[‘前月’],
‘relative’: True,
‘valueformat’: ‘.1f’,
‘suffix’: ‘%’,
‘increasing’: {‘color’: ‘green’},
‘decreasing’: {‘color’: ‘red’}
},
number={
‘suffix’: data[‘単位’],
‘font’: {‘size’: 36, ‘weight’: ‘bold’}
},
gauge={
‘axis’: {‘range’: [0, data[‘目標’] * 1.2]},
‘bar’: {‘color’: 色},
‘threshold’: {
‘line’: {‘color’: ‘black’, ‘width’: 2},
‘value’: data[‘目標’]
}
}
), row=1, col=i)
fig.update_layout(
height=300,
showlegend=False,
title_text=’📊 営業KPIダッシュボード’,
title_font_size=20
)
fig.show()
【実行結果】
営業KPIダッシュボード
月間売上: 450万円 ▲+12.5%(緑ゲージ)
新規顧客: 38社 ▲+58.3%(緑ゲージ)
商談数: 52件 ▲+8.3%(緑ゲージ)
成約率: 12.5% ▲+11.6%(緑ゲージ)
例2: ECサイトKPIダッシュボード
ECサイトの運営者向けダッシュボードです。スパークライン付きで過去の推移も表示します。
# ECサイトKPIダッシュボード(スパークライン付き)
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# ECサイトKPIデータ
ec_data = {
‘訪問者数’: {
‘値’: 15000,
‘履歴’: [12000, 12500, 13000, 13800, 14200, 15000],
‘単位’: ‘人’
},
‘CVR’: {
‘値’: 2.9,
‘履歴’: [2.4, 2.5, 2.6, 2.7, 2.8, 2.9],
‘単位’: ‘%’
},
‘平均単価’: {
‘値’: 5294,
‘履歴’: [4800, 4900, 5000, 5100, 5200, 5294],
‘単位’: ‘円’
},
‘売上’: {
‘値’: 230,
‘履歴’: [150, 160, 180, 200, 210, 230],
‘単位’: ‘万円’
}
}
# 4列×2行のグリッド(上:KPI、下:スパークライン)
fig = make_subplots(
rows=2, cols=4,
row_heights=[0.65, 0.35],
specs=[
[{‘type’: ‘indicator’}] * 4,
[{‘type’: ‘scatter’}] * 4
],
subplot_titles=list(ec_data.keys()),
vertical_spacing=0.12
)
# 各KPIとスパークラインを追加
for i, (名前, data) in enumerate(ec_data.items(), start=1):
前期 = data[‘履歴’][-2]
# KPI数値(上段)
fig.add_trace(go.Indicator(
mode=’number+delta’,
value=data[‘値’],
delta={
‘reference’: 前期,
‘relative’: True,
‘valueformat’: ‘.1f’,
‘suffix’: ‘%’
},
number={
‘suffix’: data[‘単位’],
‘font’: {‘size’: 32, ‘weight’: ‘bold’}
}
), row=1, col=i)
# スパークライン(下段)
fig.add_trace(go.Scatter(
x=list(range(len(data[‘履歴’]))),
y=data[‘履歴’],
mode=’lines+markers’,
line=dict(color=’#3498DB’, width=2),
marker=dict(size=5),
fill=’tozeroy’,
fillcolor=’rgba(52, 152, 219, 0.2)’,
showlegend=False
), row=2, col=i)
# 軸を非表示
fig.update_xaxes(showticklabels=False, showgrid=False, row=2, col=i)
fig.update_yaxes(showticklabels=False, showgrid=False, row=2, col=i)
fig.update_layout(
height=350,
title_text=’🛒 ECサイトKPIダッシュボード’,
title_font_size=20,
showlegend=False
)
fig.show()
【実行結果】
ECサイトKPIダッシュボード
訪問者数: 15,000人 ▲+5.6%(上昇トレンドのスパークライン)
CVR: 2.9% ▲+3.6%(上昇トレンドのスパークライン)
平均単価: 5,294円 ▲+1.8%(上昇トレンドのスパークライン)
売上: 230万円 ▲+9.5%(上昇トレンドのスパークライン)
📝 STEP 31 のまとめ
✅ このステップで学んだこと
| トピック |
重要ポイント |
| KPIカードとは |
重要指標を1枚のカードに集約、5秒で状況把握 |
| 大きな数値 |
48-72ptで目立たせる、視覚的階層を意識 |
| 矢印表示 |
▲▼で増減を直感的に表現 |
| 信号機カラー |
赤・黄・緑で状況を瞬時に伝える |
| スパークライン |
小さなグラフでトレンドを表示 |
| 実務応用 |
営業・ECダッシュボードで活用 |
💡 最重要ポイント
効果的なKPIカードは、数値を大きく、変化を矢印で、状況を色で表現することで、一目で理解できます。
スパークラインを追加すれば、トレンドも同時に把握できます。
これらの要素を組み合わせることで、ユーザーが5秒で状況を判断できるKPIカードが完成します!
📝 実践演習
演習 1
基礎
売上450万円(目標400万円、前月400万円)のKPIカードを作成してください。変化率も表示してください。
【解答コード】
import plotly.graph_objects as go
fig = go.Figure(go.Indicator(
mode=’number+delta+gauge’,
value=450,
delta={
‘reference’: 400,
‘relative’: True,
‘valueformat’: ‘.1f’,
‘suffix’: ‘%’
},
number={‘suffix’: ‘万円’, ‘font’: {‘size’: 60, ‘weight’: ‘bold’}},
title={‘text’: ‘月間売上’, ‘font’: {‘size’: 18}},
gauge={
‘axis’: {‘range’: [0, 500]},
‘bar’: {‘color’: ‘green’},
‘threshold’: {‘value’: 400, ‘line’: {‘width’: 2}}
}
))
fig.update_layout(height=300)
fig.show()
解説:deltaで前月比を表示し、gaugeで目標値をラインで示しています。
演習 2
応用
3つのKPIカード(売上、顧客数、満足度)を横に並べて表示してください。目標達成率に応じて色分けも追加してください。
【解答コード】
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# データ: [値, 目標, 単位]
kpis = [
{‘名前’: ‘売上’, ‘値’: 450, ‘目標’: 400, ‘単位’: ‘万円’},
{‘名前’: ‘顧客数’, ‘値’: 35, ‘目標’: 40, ‘単位’: ‘社’},
{‘名前’: ‘満足度’, ‘値’: 4.5, ‘目標’: 4.0, ‘単位’: ‘点’}
]
fig = make_subplots(
rows=1, cols=3,
specs=[[{‘type’: ‘indicator’}] * 3],
subplot_titles=[k[‘名前’] for k in kpis]
)
for i, kpi in enumerate(kpis, 1):
達成率 = kpi[‘値’] / kpi[‘目標’] * 100
色 = ‘#2ECC71’ if 達成率 >= 100 else ‘#F39C12’ if 達成率 >= 80 else ‘#E74C3C’
fig.add_trace(go.Indicator(
mode=’number+gauge’,
value=kpi[‘値’],
number={‘suffix’: kpi[‘単位’], ‘font’: {‘size’: 42}},
gauge={
‘axis’: {‘range’: [0, kpi[‘目標’] * 1.2]},
‘bar’: {‘color’: 色},
‘threshold’: {‘value’: kpi[‘目標’], ‘line’: {‘width’: 2}}
}
), row=1, col=i)
fig.update_layout(height=300)
fig.show()
解説:達成率に応じて緑・黄・赤の3色を使い分けています。
演習 3
発展
スパークライン付きのKPIカードを作成してください。過去6ヶ月のデータ [320, 350, 380, 400, 420, 450] を表示してください。
【解答コード】
import plotly.graph_objects as go
from plotly.subplots import make_subplots
履歴 = [320, 350, 380, 400, 420, 450]
現在 = 450
前月 = 420
fig = make_subplots(
rows=2, cols=1,
row_heights=[0.7, 0.3],
specs=[[{‘type’: ‘indicator’}], [{‘type’: ‘scatter’}]],
vertical_spacing=0.05
)
# KPI数値
fig.add_trace(go.Indicator(
mode=’number+delta’,
value=現在,
delta={‘reference’: 前月, ‘relative’: True, ‘suffix’: ‘%’},
number={‘suffix’: ‘万円’, ‘font’: {‘size’: 56, ‘weight’: ‘bold’}},
title={‘text’: ‘月間売上’}
), row=1, col=1)
# スパークライン
fig.add_trace(go.Scatter(
y=履歴,
mode=’lines’,
line=dict(color=’#3498DB’, width=2),
fill=’tozeroy’,
fillcolor=’rgba(52, 152, 219, 0.2)’,
showlegend=False
), row=2, col=1)
fig.update_xaxes(showticklabels=False, showgrid=False, row=2)
fig.update_yaxes(showticklabels=False, showgrid=False, row=2)
fig.update_layout(height=300)
fig.show()
解説:make_subplotsで2段構成にし、下段にfill='tozeroy'でエリアチャートを追加しています。
❓ よくある質問
Q1: KPIカードにはどれくらいの情報を入れるべきですか?
最小限にしましょう。必須要素は以下の3つです:
1. メイン数値(大きく表示)
2. 変化率または前期比(矢印付き)
3. タイトル(何のKPIか)
オプションで目標値、スパークライン、ステータスを追加できますが、詰め込みすぎないことが重要です。情報が多すぎると「5秒で把握」ができなくなります。
Q2: 数値が小さい場合(例: 2.9%)でも大きく表示すべきですか?
はい、大きく表示してください。数値の大小に関わらず、KPIとして重要なら大きく目立たせます。
ただし、以下の点に注意してください:
• 単位(%、円、人など)を必ず表示する
• 小数点以下の桁数を適切に設定する(2.9%なら小数点1桁)
• 文脈(目標値や前期比)を併記して意味が分かるようにする
Q3: 色は必ず赤・黄・緑を使う必要がありますか?
推奨ですが、必須ではありません。信号機カラーは直感的で分かりやすいですが、ブランドカラーに合わせることも可能です。
ただし、以下のルールは守りましょう:
• 一貫性:同じ色は常に同じ意味
• コントラスト:良い/悪いが明確に区別できる
• アクセシビリティ:色覚特性に配慮し、色だけでなくアイコン(✓✗)も併用
Q4: スパークラインはどの程度の期間を表示すべきですか?
データの粒度に応じて決めます:
• 日次データ:過去7〜14日(直近の変化を見る)
• 週次データ:過去8〜12週(約2〜3ヶ月)
• 月次データ:過去6〜12ヶ月(半年〜1年のトレンド)
あまり長い期間を表示すると細かすぎて見にくくなります。「トレンドの方向性が分かる」程度の粒度が理想です。
artnasekai
#artnasekai #学習メモ