STEP 34:ストーリーテリングとナラティブ

📖 STEP 34: ストーリーテリングとナラティブ

データで説得力のあるストーリーを語る方法をマスターしよう!

📋 このステップで学ぶこと

  • データストーリーテリングとは何か、なぜ重要か
  • ストーリーの基本構造(背景→課題→解決策→結果)
  • ビジュアルで視線を誘導するテクニック
  • アニメーションの効果的な活用方法
  • 説得力のあるプレゼンテーションの設計
  • 実務でのストーリー設計と応用

📖 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. 1〜5月(課題期):点が左下に移動 → 新規顧客↓、売上↓
  2. 6〜8月(移行期):点が右上に移動開始 → 施策の効果が出始める
  3. 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枚のダッシュボードで、以下のストーリーが伝わります:

  1. 冒頭(タイトルKPI):「売上が350万→450万に!28%増加!」という結論を先に見せる
  2. 課題(左上グラフ):最初は横ばいだったことがわかる
  3. 解決策(右上グラフ):3つの施策とその効果が見える
  4. 結果(左下ゲージ):目標達成率112%が強調される
  5. 次の目標(右下グラフ):来期は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文を埋めるだけでストーリーができます:

  1. 「以前は〇〇でした」(背景)
  2. 「しかし、△△という問題がありました」(課題)
  3. 「そこで、□□をしました」(解決策)
  4. 「その結果、◇◇になりました」(結果)

まずはこのテンプレートに当てはめる練習をしましょう。

Q3: アニメーションは使うべきですか?

場面によって判断しましょう。

場面アニメーション
プレゼンテーション✅ 効果的
経営会議✅ 効果的
日常ダッシュボード❌ 邪魔になる
印刷レポート❌ 使えない
Q4: 注釈を入れすぎると見にくくなりませんか?

1グラフに3つまでが目安です。それ以上入れると、かえって何が重要かわからなくなります。

注釈を入れるポイントを厳選し、「最も伝えたい3つ」に絞りましょう。

Q5: データが良い結果でないときもストーリーテリングできますか?

もちろんできます。むしろ重要です。

悪い結果の場合のストーリー構造:

  1. 「このような施策を実施しました」(背景)
  2. 「期待した効果は得られませんでした」(課題)
  3. 「原因を分析したところ、〇〇でした」(分析)
  4. 「次は△△を試みます」(次のアクション)

失敗から学びを得て、次につなげるストーリーも価値があります。

📝

学習メモ

データ可視化マスター - Step 34

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE