📋 このステップで学ぶこと
- データストーリーテリングとは何か、なぜ重要か
- ストーリーの基本構造(背景→課題→解決策→結果)
- ビジュアルで視線を誘導するテクニック
- アニメーションの効果的な活用方法
- 説得力のあるプレゼンテーションの設計
- 実務でのストーリー設計と応用
📖 1. データストーリーテリングとは
なぜストーリーが必要なのか
データストーリーテリング(Data Storytelling)とは、データを使って物語を語り、相手を説得する手法です。
データ分析をして、グラフを作って、数字を見せる…それだけでは人の心は動きません。なぜなら、人間の脳は「物語」を通じて情報を理解し、記憶するようにできているからです。
どんなに素晴らしい分析結果も、「だから何?」「次に何をすればいい?」という疑問に答えられなければ、意思決定には使われません。ストーリーテリングは、その橋渡しをする技術です。
💡 身近な例で考えてみよう
映画やドラマを思い出してください。
ただの事実の羅列:「主人公は朝起きて、朝食を食べて、会社に行って、仕事をして、帰宅した」
→ 退屈で記憶に残らない
ストーリー:「主人公は朝から大ピンチ。寝坊して朝食も取れず、重要な会議に遅刻しそうになりながらも、機転を利かせて危機を乗り越え、最後は大成功を収めた」
→ ワクワクして記憶に残る
データも同じです。「何が起きた」だけでなく「なぜ起きた」「だからどうなった」を語ることで、印象に残り、行動につながるのです。
【単なるデータ提示 vs ストーリーテリングの違い】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
❌ 単なるデータ提示:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
「今月の売上は450万円でした。
前月比+12.5%、目標達成率112%です。」
問題点:
・事実の羅列にすぎない
・「だから何?」に答えていない
・印象に残らない
・次のアクションが見えない
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ ストーリーテリング:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
「3ヶ月前、売上は月350万円で低迷していました。
新規顧客が減少し、このままでは年間目標未達の危機。
そこで、新商品を投入し、SNS広告を強化しました。
その結果、今月は目標を12%上回る450万円を達成!
来期はさらに500万円を目指します。」
効果:
・流れがあり、理解しやすい
・「なぜ」「だから」が明確
・印象に残る
・次のアクションが見える
📖 ストーリーテリングの3要素
| 要素 |
説明 |
役割 |
| データ(Data) |
事実・数字・統計 |
信頼性と根拠を与える |
| ナラティブ(Narrative) |
物語・文脈・解釈 |
意味と理解を与える |
| ビジュアル(Visual) |
グラフ・図表・画像 |
直感的な理解を助ける |
この3つが揃って初めて、説得力のあるストーリーになります。どれか1つでも欠けると、効果は半減します。
💡 ストーリーテリングの4つの効果
| 効果 |
理由 |
ビジネスでのメリット |
| 記憶に残る |
人は物語を覚えやすい |
会議後も印象が持続する |
| 感情を動かす |
データだけでは動かない心を動かす |
意思決定者を説得できる |
| 行動を促す |
「次に何をすべきか」が明確になる |
提案が承認されやすい |
| 理解が深まる |
文脈があると理解しやすい |
複雑な分析も伝わる |
📐 2. ストーリーの基本構造
4つのフェーズ
効果的なデータストーリーは、4つのフェーズで構成されます。これは映画や小説の構造と同じで、人間が自然に理解しやすい流れです。
【データストーリーの基本構造】
┌─────────────────────────────────────────────────────────┐
│ │
│ 1. 背景(Context) 2. 課題(Challenge) │
│ 「どんな状況だったか」 「何が問題だったか」 │
│ │
│ ↓ ↓ │
│ │
│ 3. 解決策(Solution) 4. 結果(Result) │
│ 「何をしたか」 「どうなったか」 │
│ │
└─────────────────────────────────────────────────────────┘
【各フェーズの役割】
1. 背景(Context)
目的: 聴衆を同じスタート地点に立たせる
内容: 現状の説明、前提条件、時期
例: 「昨年同期、売上は月350万円で停滞していました」
2. 課題(Challenge)
目的: 解決すべき問題を明確にする
内容: 問題点、リスク、機会損失
例: 「新規顧客が減少し、リピート率も低下していました」
3. 解決策(Solution)
目的: 実施したアクションを示す
内容: 施策、対策、投資
例: 「新商品を投入し、SNS広告を2倍に増額しました」
4. 結果(Result)
目的: 成果と次のステップを示す
内容: 成果、学び、今後の計画
例: 「今月は450万円に到達、目標達成率112%です」
💡 4フェーズを映画で例えると
映画「ロッキー」を例にすると:
- 背景:フィラデルフィアの無名ボクサー、ロッキー
- 課題:世界チャンピオンとの試合が決定。勝ち目はほぼゼロ
- 解決策:厳しいトレーニング、階段ダッシュ、生卵…
- 結果:最終ラウンドまで戦い抜き、自分自身に勝利
ビジネスのデータストーリーも同じ構造です。「困難を乗り越えて成功に至る」という流れが、人の心を動かします。
実例:売上改善のストーリー
実際のビジネスシーンで、4フェーズをどう使うか見てみましょう。
【売上改善ストーリーの具体例】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
フェーズ1: 背景
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
「昨年の第3四半期、売上は月350万円で横ばいでした。
市場全体が成長している中、当社だけが取り残されていました。」
→ グラフ: 売上推移(横ばい)+ 市場平均との比較
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
フェーズ2: 課題
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
「原因を分析したところ、2つの問題が見つかりました:
① 新規顧客の獲得数が前年比40%減少
② 既存顧客のリピート率が65%から50%に低下」
→ グラフ: 新規顧客推移(減少)、リピート率推移(低下)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
フェーズ3: 解決策
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
「3つの施策を実施しました:
① 新商品を投入(若年層向け)
② SNS広告を月50万円→100万円に増額
③ 既存顧客向けポイントキャンペーン開始」
→ グラフ: 施策実施前後の比較(Before/After)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
フェーズ4: 結果
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
「施策から3ヶ月で、売上は450万円に到達!
目標達成率112%、新規顧客も回復傾向です。
来期はさらに500万円を目指します。」
→ グラフ: 大きなKPI(112%達成)、売上推移(V字回復)
ストーリーを4つのグラフで表現する
4フェーズをそれぞれ1つのグラフで表現し、ダッシュボード形式でまとめることができます。以下のコードをGoogle Colabに入力して実行してください。
※ コードが横に長い場合は横スクロールできます
# ライブラリのインポート
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np
# 4つのグラフを2×2で配置するサブプロットを作成
# subplot_titles: 各グラフのタイトル
fig = make_subplots(
rows=2, cols=2,
subplot_titles=[
‘1. 背景: 売上停滞(昨年)’,
‘2. 課題: 新規顧客減少’,
‘3. 解決策: 施策の効果’,
‘4. 結果: 目標達成!’
],
vertical_spacing=0.12, # 縦の間隔
horizontal_spacing=0.1 # 横の間隔
)
# ========== 1. 背景: 売上推移(停滞) ==========
月 = list(range(1, 13))
# 350万円前後で横ばいのデータを生成
昨年売上 = [350 + np.random.randn() * 15 for _ in range(12)]
fig.add_trace(go.Scatter(
x=月, y=昨年売上,
mode=’lines+markers’,
line=dict(color=’gray’, width=2, dash=’dash’),
marker=dict(size=6),
name=’昨年売上’
), row=1, col=1)
# ========== 2. 課題: 新規顧客数の減少 ==========
# 月を追うごとに減少するデータ
新規顧客 = [40, 38, 35, 32, 30, 28, 25, 23, 22, 20, 18, 16]
fig.add_trace(go.Scatter(
x=月, y=新規顧客,
mode=’lines+markers’,
line=dict(color=’red’, width=3),
marker=dict(size=8),
name=’新規顧客’
), row=1, col=2)
# ========== 3. 解決策: 施策の効果(棒グラフ) ==========
施策 = [‘新商品’, ‘SNS広告’, ‘キャンペーン’]
効果 = [50, 30, 20] # 各施策の売上増加額(万円)
fig.add_trace(go.Bar(
x=施策,
y=効果,
marker=dict(color=[‘#3498DB’, ‘#E74C3C’, ‘#F39C12′]),
text=[f’+{v}万円’ for v in 効果],
textposition=’outside’,
name=’施策効果’
), row=2, col=1)
# ========== 4. 結果: 目標達成(ゲージ) ==========
fig.add_trace(go.Indicator(
mode=’number+delta+gauge’,
value=450,
delta={
‘reference’: 400, # 目標値との比較
‘relative’: True, # パーセント表示
‘increasing’: {‘color’: ‘green’}
},
number={‘suffix’: ‘万円’, ‘font’: {‘size’: 36}},
title={‘text’: ‘目標達成率: 112%’},
gauge={
‘axis’: {‘range’: [0, 500]},
‘bar’: {‘color’: ‘green’},
‘threshold’: {
‘value’: 400,
‘line’: {‘width’: 3, ‘color’: ‘red’}
}
}
), row=2, col=2)
# レイアウト全体の設定
fig.update_layout(
height=700,
title_text=’📊 売上改善のストーリー(4フェーズ)’,
title_font_size=20,
showlegend=False
)
fig.show()
💡 コードのポイント解説
| コード |
意味 |
なぜ必要か |
make_subplots(rows=2, cols=2) |
2×2のグラフ配置を作成 |
4フェーズを1画面に表示 |
subplot_titles |
各グラフのタイトル |
フェーズの意味を明確に |
go.Indicator(mode='gauge') |
ゲージチャートを作成 |
達成度を視覚的に表現 |
delta={'reference': 400} |
目標値との差分を表示 |
+12%達成を強調 |
👁️ 3. ビジュアルでの誘導テクニック
なぜ視線誘導が必要か
ストーリーを伝えるためには、グラフを見せるだけでなく、「どこを見るべきか」を誘導することが重要です。
人間の視線は自然と「目立つもの」に向かいます。何も工夫しないと、見てほしいポイントではなく、関係ない部分に注目されてしまいます。
👁️ ビジュアル誘導の5つのテクニック
| テクニック |
方法 |
効果 |
| 色のコントラスト |
重要な部分だけ目立つ色に |
自然と視線が集まる |
| サイズの変化 |
重要な数値を大きく表示 |
優先度が明確になる |
| 矢印・注釈 |
見てほしい場所を指し示す |
説明なしで意図が伝わる |
| ハイライト |
枠で囲む、背景色を変える |
特定の領域に注目させる |
| アニメーション |
順番に表示、動きで強調 |
時系列の変化を伝える |
注釈と矢印での誘導
グラフの重要なポイントに注釈(アノテーション)と矢印を追加することで、見てほしい場所を明確に示せます。以下のコードでは、売上推移グラフの3つの重要ポイント(最低点、施策開始、目標達成)に注釈を追加します。
※ コードが横に長い場合は横スクロールできます
import plotly.graph_objects as go
# 売上推移データ(1月〜12月)
月 = list(range(1, 13))
売上 = [350, 340, 345, 355, 350, 370, 390, 410, 430, 450, 460, 470]
fig = go.Figure()
# 折れ線グラフを追加
fig.add_trace(go.Scatter(
x=月, y=売上,
mode=’lines+markers’,
line=dict(color=’steelblue’, width=3),
marker=dict(size=8),
name=’売上’
))
# ========== 重要ポイント1: 最低点を強調 ==========
fig.add_annotation(
x=2, y=340, # 注釈を付ける位置
text=’📉 最低点
新規顧客減少’, # 表示するテキスト
showarrow=True, # 矢印を表示
arrowhead=2, # 矢印の形
arrowsize=1, # 矢印のサイズ
arrowwidth=2, # 矢印の太さ
arrowcolor=’red’, # 矢印の色
ax=40, ay=-50, # 矢印の方向(テキスト位置からの相対座標)
bgcolor=’#FADBD8′, # テキストの背景色
bordercolor=’red’, # テキストの枠線色
borderwidth=2,
font=dict(size=12, color=’red’)
)
# ========== 重要ポイント2: 施策開始 ==========
fig.add_annotation(
x=6, y=370,
text=’🚀 施策開始
新商品投入’,
showarrow=True,
arrowhead=2,
arrowcolor=’orange’,
ax=-40, ay=-50,
bgcolor=’#FCF3CF’,
bordercolor=’orange’,
borderwidth=2,
font=dict(size=12, color=’#B7950B’)
)
# ========== 重要ポイント3: 目標達成 ==========
fig.add_annotation(
x=10, y=450,
text=’✓ 目標達成!
450万円突破’,
showarrow=True,
arrowhead=2,
arrowcolor=’green’,
ax=40, ay=50,
bgcolor=’#D5F4E6′,
bordercolor=’green’,
borderwidth=2,
font=dict(size=14, color=’green’)
)
# ========== 目標ラインを追加 ==========
# add_hline(): 水平線を追加
fig.add_hline(
y=400,
line_dash=’dash’, # 破線
line_color=’green’,
annotation_text=’目標: 400万円’,
annotation_position=’right’
)
# レイアウト設定
fig.update_layout(
title=’📈 売上改善ストーリー: 課題から成功まで’,
xaxis_title=’月’,
yaxis_title=’売上(万円)’,
height=600,
hovermode=’x unified’
)
fig.show()
💡 注釈パラメータの意味
| パラメータ |
意味 |
設定のコツ |
x, y |
注釈を付ける座標 |
グラフ上の重要ポイント |
ax, ay |
矢印の方向(ピクセル) |
正=右/下、負=左/上 |
bgcolor |
テキストの背景色 |
薄い色で読みやすく |
arrowhead |
矢印の形(0〜8) |
2が一般的な矢印 |
色でストーリーのフェーズを表現する
棒グラフの色をフェーズごとに変えることで、ストーリーの進行を視覚的に表現できます。以下のコードでは、「課題期(赤)」「移行期(オレンジ)」「成功期(緑)」の3フェーズを色で区別します。
※ コードが横に長い場合は横スクロールできます
import plotly.graph_objects as go
# 売上データ
月 = list(range(1, 13))
売上 = [350, 340, 345, 355, 350, 370, 390, 410, 430, 450, 460, 470]
# フェーズごとに色を設定
# 1〜5月: 課題期(赤)
# 6〜8月: 移行期(オレンジ)
# 9〜12月: 成功期(緑)
色リスト = []
for i in range(len(売上)):
if i < 5:
色リスト.append('#E74C3C') # 赤(課題期)
elif i < 8:
色リスト.append('#F39C12') # オレンジ(移行期)
else:
色リスト.append('#2ECC71') # 緑(成功期)
fig = go.Figure()
# 棒グラフで色分け
fig.add_trace(go.Bar(
x=月,
y=売上,
marker=dict(
color=色リスト,
line=dict(width=2, color='white') # 白い枠線
),
text=売上,
textposition='outside',
textfont=dict(size=11)
))
# ========== フェーズ区分の背景を追加 ==========
# add_vrect(): 縦方向の矩形(背景色)を追加
# 課題期の背景
fig.add_vrect(
x0=0.5, x1=5.5, # X軸の範囲
fillcolor='red',
opacity=0.1, # 薄く
annotation_text='課題期',
annotation_position='top left'
)
# 移行期の背景
fig.add_vrect(
x0=5.5, x1=8.5,
fillcolor='orange',
opacity=0.1,
annotation_text='移行期',
annotation_position='top left'
)
# 成功期の背景
fig.add_vrect(
x0=8.5, x1=12.5,
fillcolor='green',
opacity=0.1,
annotation_text='成功期',
annotation_position='top left'
)
# レイアウト設定
fig.update_layout(
title='📊 色でストーリーを表現: 課題→移行→成功',
xaxis_title='月',
yaxis_title='売上(万円)',
height=500,
showlegend=False
)
fig.show()
💡 色でフェーズを表現するメリット
- 直感的に理解できる:赤=悪い、緑=良いは万国共通
- ストーリーの流れが見える:左から右へ、悪い状態から良い状態へ
- 言葉なしで伝わる:グラフを見るだけでフェーズがわかる
- 記憶に残りやすい:色の印象は長く残る
🎬 4. アニメーションの活用
なぜアニメーションが効果的か
アニメーションは、ストーリーを時系列で展開するのに最適なツールです。静的なグラフでは「Before/After」しか見せられませんが、アニメーションでは「変化の過程」を見せることができます。
特にプレゼンテーションでは、聴衆の注目を集め、ストーリーに引き込む効果があります。
🎬 アニメーションの効果的な使い方
| 使い方 |
効果 |
適した場面 |
| 段階的な情報開示 |
聴衆の注意を維持 |
プレゼンテーション |
| 時系列の変化 |
トレンドを直感的に理解 |
長期間のデータ |
| Before/Afterの強調 |
変化のインパクトを伝える |
施策効果の報告 |
| クライマックスへの誘導 |
結論への期待感を高める |
成功事例の紹介 |
⚠️ アニメーションを使うべき場面と避けるべき場面
| 場面 |
アニメーション |
理由 |
| プレゼンテーション |
✅ 使う |
注目を集め、ストーリーを強調 |
| 経営会議での報告 |
✅ 使う |
変化の過程を見せられる |
| 日常のダッシュボード |
❌ 使わない |
毎日見るものは邪魔になる |
| 印刷レポート |
❌ 使えない |
紙では動かない |
時系列アニメーションの作成
売上の月次推移をアニメーションで表現してみましょう。月ごとにデータが追加されていく様子を見せることで、成長のストーリーを伝えられます。
※ コードが横に長い場合は横スクロールできます
import plotly.express as px
import pandas as pd
import numpy as np
# 月ごとの売上データを作成
data = []
for month in range(1, 13):
# 施策開始(6月)以降は売上が増加
if month <= 5:
売上 = 350 + np.random.randn() * 10
フェーズ = '課題期'
elif month <= 8:
売上 = 350 + (month - 5) * 20 + np.random.randn() * 10
フェーズ = '移行期'
else:
売上 = 350 + (month - 5) * 20 + np.random.randn() * 10
フェーズ = '成功期'
data.append({
'月': month,
'売上': 売上,
'フェーズ': フェーズ
})
df = pd.DataFrame(data)
# アニメーション付き棒グラフ
# animation_frame: アニメーションの基準(月ごと)
fig = px.bar(
df,
x='月',
y='売上',
animation_frame='月', # 月ごとにアニメーション
color='フェーズ', # フェーズで色分け
color_discrete_map={
'課題期': '#E74C3C',
'移行期': '#F39C12',
'成功期': '#2ECC71'
},
title='📊 月次売上の推移(アニメーション)',
labels={'売上': '売上(万円)'},
range_y=[0, 500] # Y軸の範囲を固定
)
# アニメーション速度を調整
# frame['duration']: 各フレームの表示時間(ミリ秒)
# transition['duration']: フレーム間の遷移時間(ミリ秒)
fig.layout.updatemenus[0].buttons[0].args[1]['frame']['duration'] = 800
fig.layout.updatemenus[0].buttons[0].args[1]['transition']['duration'] = 500
fig.update_layout(height=500)
fig.show()
散布図アニメーションでストーリーを語る
「新規顧客数」と「売上」の関係を、月ごとにアニメーションで見せることもできます。点が移動する様子で、「新規顧客が増えると売上も増える」という因果関係を視覚的に伝えられます。
※ コードが横に長い場合は横スクロールできます
import plotly.express as px
import pandas as pd
import numpy as np
# 月ごとのデータを作成
data = []
for month in range(1, 13):
# 課題期: 新規顧客減少、売上停滞
if month <= 5:
売上 = 350 + np.random.randn() * 10
新規顧客 = 40 - (month * 2) + np.random.randn() * 2
フェーズ = '課題期'
# 施策後: 新規顧客回復、売上増加
else:
売上 = 350 + (month - 5) * 20 + np.random.randn() * 10
新規顧客 = 30 + (month - 5) * 3 + np.random.randn() * 2
フェーズ = '成功期' if month > 8 else ‘移行期’
data.append({
‘月’: month,
‘売上’: 売上,
‘新規顧客’: 新規顧客,
‘フェーズ’: フェーズ
})
df = pd.DataFrame(data)
# アニメーション付き散布図
fig = px.scatter(
df,
x=’新規顧客’,
y=’売上’,
animation_frame=’月’, # 月ごとにアニメーション
size=[100] * len(df), # 点のサイズ
color=’フェーズ’,
color_discrete_map={
‘課題期’: ‘#E74C3C’,
‘移行期’: ‘#F39C12’,
‘成功期’: ‘#2ECC71′
},
title=’🎬 新規顧客と売上の関係(月次アニメーション)’,
labels={
‘売上’: ‘売上(万円)’,
‘新規顧客’: ‘新規顧客数(社)’
}
)
# 軸の範囲を固定(アニメーション中に軸が動かないように)
fig.update_layout(
height=600,
xaxis=dict(range=[15, 50]),
yaxis=dict(range=[300, 500])
)
fig.show()
💡 アニメーションで伝わるストーリー
このアニメーションでは、以下のストーリーが視覚的に伝わります:
- 1〜5月(課題期):点が左下に移動 → 新規顧客↓、売上↓
- 6〜8月(移行期):点が右上に移動開始 → 施策の効果が出始める
- 9〜12月(成功期):点が右上に到達 → 新規顧客↑、売上↑
言葉で説明するより、動きを見せる方が圧倒的に伝わります。
🎯 5. 説得力のあるプレゼンテーションの設計
ストーリーボードの作成
プレゼンテーションを成功させるには、ストーリーボード(絵コンテ)で事前に計画を立てることが重要です。映画やアニメの制作と同じで、全体の流れを可視化することで、説得力のある構成ができます。
【プレゼン用ストーリーボードの例】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
スライド1: タイトル
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
内容: 「売上V字回復の軌跡」
目的: 聴衆の興味を引く
ビジュアル: インパクトのある画像 or 大きな数字(+28%)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
スライド2: 背景
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
内容: 「昨年の状況」
目的: 問題の深刻さを共有
ビジュアル: 売上推移グラフ(停滞を強調、赤い矢印で下降を示す)
話す内容: 「昨年、売上は月350万円で横ばいでした」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
スライド3: 課題の深掘り
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
内容: 「なぜ売上が伸びなかったのか」
目的: 原因を特定し、納得感を与える
ビジュアル: 2つのグラフ(新規顧客減少 + リピート率低下)
話す内容: 「原因は2つ。新規顧客の減少とリピート率の低下です」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
スライド4: 解決策
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
内容: 「実施した3つの施策」
目的: アクションの具体性を示す
ビジュアル: アイコン付きリスト or 施策効果の棒グラフ
話す内容: 「そこで、3つの施策を実施しました」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
スライド5: 結果(クライマックス)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
内容: 「目標達成!」
目的: 成功を印象づける
ビジュアル: 大きなKPIカード(112%達成)+ V字回復グラフ
話す内容: 「結果、目標を12%上回る450万円を達成しました!」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
スライド6: 次のステップ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
内容: 「さらなる成長に向けて」
目的: 今後の方向性を示し、行動を促す
ビジュアル: 次期目標グラフ + アクションアイテム
話す内容: 「来期は500万円を目指します。ご支援をお願いします」
完成形:ストーリー付きダッシュボード
ここまで学んだテクニックを組み合わせて、ストーリーを語るダッシュボードを作成しましょう。1つの画面で「課題→解決策→結果→次の目標」を伝えられます。
※ コードが横に長い場合は横スクロールできます
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np
# 総合ストーリーダッシュボード
# 3行2列のレイアウト
fig = make_subplots(
rows=3, cols=2,
row_heights=[0.2, 0.4, 0.4], # 各行の高さ比率
subplot_titles=[
”, ”, # 1行目はタイトルKPIなのでサブタイトル不要
‘📉 課題: 売上停滞’, ‘🚀 解決策: 施策別効果’,
‘✓ 結果: 目標達成!’, ‘📈 次の目標’
],
specs=[
# 1行目: KPIカード(2列結合)
[{‘type’: ‘indicator’, ‘colspan’: 2}, None],
# 2行目: 折れ線グラフ、棒グラフ
[{‘type’: ‘scatter’}, {‘type’: ‘bar’}],
# 3行目: ゲージ、折れ線グラフ
[{‘type’: ‘indicator’}, {‘type’: ‘scatter’}]
],
vertical_spacing=0.12
)
# ========== 1行目: タイトルKPI ==========
fig.add_trace(go.Indicator(
mode=’number+delta’,
value=450,
delta={
‘reference’: 350,
‘relative’: True,
‘increasing’: {‘color’: ‘green’}
},
number={‘suffix’: ‘万円’, ‘font’: {‘size’: 56}},
title={‘text’: ‘📈 売上V字回復ストーリー’, ‘font’: {‘size’: 22}}
), row=1, col=1)
# ========== 2行目左: 売上推移(課題→成功) ==========
月 = list(range(1, 13))
売上 = [350, 340, 345, 355, 350, 370, 390, 410, 430, 450, 460, 470]
fig.add_trace(go.Scatter(
x=月, y=売上,
mode=’lines+markers’,
line=dict(color=’steelblue’, width=3),
marker=dict(size=8),
name=’売上推移’
), row=2, col=1)
# 目標ライン
fig.add_hline(y=400, line_dash=’dash’, line_color=’green’, row=2, col=1)
# ========== 2行目右: 施策別効果 ==========
fig.add_trace(go.Bar(
x=[‘新商品’, ‘SNS広告’, ‘キャンペーン’],
y=[50, 30, 20],
marker=dict(color=[‘#3498DB’, ‘#E74C3C’, ‘#F39C12’]),
text=[‘+50万’, ‘+30万’, ‘+20万’],
textposition=’outside’,
name=’施策効果’
), row=2, col=2)
# ========== 3行目左: 目標達成ゲージ ==========
fig.add_trace(go.Indicator(
mode=’number+gauge’,
value=112,
number={‘suffix’: ‘%’, ‘font’: {‘size’: 42}},
title={‘text’: ‘目標達成率’, ‘font’: {‘size’: 14}},
gauge={
‘axis’: {‘range’: [0, 150]},
‘bar’: {‘color’: ‘green’},
‘threshold’: {
‘value’: 100,
‘line’: {‘width’: 3, ‘color’: ‘red’}
}
}
), row=3, col=1)
# ========== 3行目右: 次期目標 ==========
次期月 = list(range(1, 7))
次期目標 = [450, 470, 490, 510, 530, 550]
fig.add_trace(go.Scatter(
x=次期月,
y=次期目標,
mode=’lines+markers’,
line=dict(color=’purple’, width=3, dash=’dot’),
marker=dict(size=10),
name=’次期目標’
), row=3, col=2)
# レイアウト設定
fig.update_layout(
height=900,
showlegend=False,
font=dict(size=12)
)
# 軸ラベルを追加
fig.update_xaxes(title_text=’月’, row=2, col=1)
fig.update_yaxes(title_text=’売上(万円)’, row=2, col=1)
fig.update_xaxes(title_text=’施策’, row=2, col=2)
fig.update_yaxes(title_text=’効果(万円)’, row=2, col=2)
fig.update_xaxes(title_text=’月’, row=3, col=2)
fig.update_yaxes(title_text=’目標(万円)’, row=3, col=2)
fig.show()
💡 このダッシュボードで伝わるストーリー
1枚のダッシュボードで、以下のストーリーが伝わります:
- 冒頭(タイトルKPI):「売上が350万→450万に!28%増加!」という結論を先に見せる
- 課題(左上グラフ):最初は横ばいだったことがわかる
- 解決策(右上グラフ):3つの施策とその効果が見える
- 結果(左下ゲージ):目標達成率112%が強調される
- 次の目標(右下グラフ):来期は550万を目指すことがわかる
📝 STEP 34 のまとめ
✅ このステップで学んだこと
| トピック |
重要ポイント |
| ストーリーテリングとは |
データで物語を語り、相手を説得する手法 |
| 3つの要素 |
データ + ナラティブ + ビジュアル |
| 4つのフェーズ |
背景 → 課題 → 解決策 → 結果 |
| ビジュアル誘導 |
色、サイズ、注釈、ハイライトで視線を導く |
| アニメーション |
時系列の変化を直感的に伝える |
| プレゼン設計 |
ストーリーボードで計画を立てる |
💡 最重要ポイント
データストーリーテリングは、単なるデータの羅列ではなく、物語として伝えることで、相手の心を動かします。
覚えておくべき原則:
- 4フェーズ構造:背景 → 課題 → 解決策 → 結果
- 視線誘導:色とサイズで重要ポイントを強調
- 注釈活用:見てほしい場所を明確に示す
- アニメーション:変化の過程を見せる(プレゼンで有効)
データは、ストーリーがあってこそ活きるのです!次のステップでは、誤解を招くグラフの回避について学びます。
📝 実践演習
演習 1
基礎
あなたの身近なデータ(売上、体重、勉強時間など)でストーリーの4フェーズ(背景→課題→解決策→結果)を書いてください。
【解答例:ダイエットのストーリー】
1. 背景:
「3ヶ月前、体重は75kgで、健康診断でメタボ判定」
2. 課題:
「運動不足と食べ過ぎが原因。
このままでは生活習慣病のリスク」
3. 解決策:
「毎日30分のウォーキングを開始。
夕食の炭水化物を半分に減らした」
4. 結果:
「3ヶ月で70kgに減量成功!
健康診断の数値も改善した」
このストーリーをグラフで表現するなら:
→ 体重の推移グラフ(右下がり)
→ 施策開始のポイントに注釈(🚀 ウォーキング開始)
→ 目標達成を緑でハイライト(✓ 70kg達成!)
演習 2
応用
売上データの折れ線グラフに、3つの重要ポイント(最低点、転換点、最高点)に注釈と矢印を追加してください。
【解答例】
import plotly.graph_objects as go
月 = list(range(1, 13))
売上 = [300, 290, 280, 295, 300, 320, 350, 380, 400, 420, 440, 450]
fig = go.Figure()
# 折れ線グラフ
fig.add_trace(go.Scatter(
x=月, y=売上,
mode=’lines+markers’,
line=dict(color=’steelblue’, width=3)
))
# 最低点(3月)
fig.add_annotation(
x=3, y=280,
text=’📉 最低点
280万円’,
showarrow=True, arrowhead=2,
arrowcolor=’red’, ay=-50,
bgcolor=’#FADBD8′, bordercolor=’red’
)
# 転換点(6月)
fig.add_annotation(
x=6, y=320,
text=’🚀 新施策開始’,
showarrow=True, arrowhead=2,
arrowcolor=’orange’, ay=-50,
bgcolor=’#FCF3CF’, bordercolor=’orange’
)
# 最高点(12月)
fig.add_annotation(
x=12, y=450,
text=’✓ 最高記録!
450万円’,
showarrow=True, arrowhead=2,
arrowcolor=’green’, ay=50,
bgcolor=’#D5F4E6′, bordercolor=’green’
)
fig.update_layout(
title=’売上改善ストーリー’,
xaxis_title=’月’,
yaxis_title=’売上(万円)’,
height=500
)
fig.show()
演習 3
発展
月ごとに売上が増えていくアニメーション付きの棒グラフを作成してください。フェーズ(課題期・成功期)で色を変えてください。
【解答例】
import plotly.express as px
import pandas as pd
# データ作成
data = []
for month in range(1, 13):
売上 = 300 + (month * 12)
フェーズ = ‘課題期’ if month <= 6 else '成功期'
data.append({
'月': month,
'売上': 売上,
'フェーズ': フェーズ
})
df = pd.DataFrame(data)
# アニメーション付き棒グラフ
fig = px.bar(
df,
x='月',
y='売上',
animation_frame='月',
color='フェーズ',
color_discrete_map={
'課題期': '#E74C3C',
'成功期': '#2ECC71'
},
title='売上改善アニメーション',
range_y=[0, 500]
)
# アニメーション速度調整
fig.layout.updatemenus[0].buttons[0].args[1]['frame']['duration'] = 600
fig.show()
❓ よくある質問
Q1: ストーリーテリングは必ず必要ですか?日常のレポートでも?
用途によって使い分けましょう。
- プレゼンテーション:必須。ストーリーがないと印象に残らない
- 提案書・企画書:必須。相手を説得するために必要
- 日常のモニタリング:不要。事実だけシンプルに
- 定期レポート:部分的に。結論部分にストーリーを
Q2: ストーリーを作るのが難しいです。コツはありますか?
テンプレートを使いましょう。以下の4文を埋めるだけでストーリーができます:
- 「以前は〇〇でした」(背景)
- 「しかし、△△という問題がありました」(課題)
- 「そこで、□□をしました」(解決策)
- 「その結果、◇◇になりました」(結果)
まずはこのテンプレートに当てはめる練習をしましょう。
Q3: アニメーションは使うべきですか?
場面によって判断しましょう。
| 場面 | アニメーション |
| プレゼンテーション | ✅ 効果的 |
| 経営会議 | ✅ 効果的 |
| 日常ダッシュボード | ❌ 邪魔になる |
| 印刷レポート | ❌ 使えない |
Q4: 注釈を入れすぎると見にくくなりませんか?
1グラフに3つまでが目安です。それ以上入れると、かえって何が重要かわからなくなります。
注釈を入れるポイントを厳選し、「最も伝えたい3つ」に絞りましょう。
Q5: データが良い結果でないときもストーリーテリングできますか?
もちろんできます。むしろ重要です。
悪い結果の場合のストーリー構造:
- 「このような施策を実施しました」(背景)
- 「期待した効果は得られませんでした」(課題)
- 「原因を分析したところ、〇〇でした」(分析)
- 「次は△△を試みます」(次のアクション)
失敗から学びを得て、次につなげるストーリーも価値があります。
artnasekai
#artnasekai #学習メモ