この用語と一緒に検索・参照されやすいタグ。 関連ページに飛ぶときの手がかりにも使えます。
「データストーリーテリング」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「データストーリーテリング」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
これらのキーワードは「データストーリーテリングの理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
🍰 まずはやさしく
データの物語を伝える技法です。
相手に納得して動いてもらうために使います。
部活の改善案をグラフで伝えるときなどに役立ちます。
この章では結論と注意点を学びます。
データストーリーテリングは、 数値・グラフ・物語を組み合わせて聞き手の意思決定を促す表現技法。
ここまでが要点です。 ただし実際に使う前に、 このページの「⚠️ よくある落とし穴」で挙げた ストーリーが事実を曲げる/ジャンクチャート/数字の羅列 には必ず目を通してください。 つまずくのは知識が無いときより、 知ってはいたが確認を飛ばしたときです。
🍰 まずはやさしく
分析結果を伝えるための道具です。
正しい分析を相手に届けるために使います。
スマホの利用時間をまとめて発表する場面で使えます。
この章では使う場面や考え方を学びます。
「分析結果が良い」と「伝わる」は別物。 本サイトの再現論文も、 分析(コード)の後段で解釈とレポートを必ず作ります。 そこで活きるのがストーリーテリング。
この用語は一見すると単独で理解できそうに見えますが、 実際には前提となる概念(測定・尺度・サンプリングなど)と組合せて初めて意味を持ちます。 「定義を覚える」より「どんな問いに答える道具なのか」を捉えるのが効率的です。
🍰 まずはやさしく
映画のような構成で伝える方法です。
相手に直感的に理解してもらうために使います。
買い物の傾向をグラフで見出し付きで伝える例です。
この章ではイメージの掴み方を学びます。
「データストーリーテリング」を最初に学ぶときは、 厳密な定義よりイメージを優先しましょう。 以下は具体例・比喩を用いた直感的理解の入口です。
🍰 まずはやさしく
伝えるための決まった型のことです。
誰にでも伝わる構成を作るために使います。
文化祭の計画を状況と課題に分けて話す例です。
この章では具体的な構成のルールを学びます。
直感の次は、 厳密な定義を確認します。 数式は言語の一種で、 一度書き慣れれば「言葉より速く伝えられる」便利な道具。 慣れていない方は、 各記号が何を表すかを「🔬 数式を言葉で読み解く」で 1 つずつ確認してください。
数式を眺めるだけでは身につかないので、 各記号がどんな役割を担っているかを言葉で押さえます。 「数式を音読する習慣」がつくと、 論文や教科書を読むスピードが体感で 2 倍ほど上がります。
データストーリーテリングに数式はないが、 「ストーリーの骨格となる集計指標」を手計算で確認することが理解の核心。 ここでは SCR フォーマット(Situation→Complication→Resolution)に対応する 3 つの指標を SSDSE-B-2026 の 5 県データで手計算する。
使用する数式(ストーリーの強さを定量化する「効果量 Cohen's d」):
| 都道府県 | グループ | 高齢化率 (%) |
|---|---|---|
| 東京都 | 大都市圏 | 23.5 |
| 神奈川県 | 大都市圏 | 25.6 |
| 鳥取県 | 過疎県 | 33.8 |
| 島根県 | 過疎県 | 35.7 |
| 秋田県 | 過疎県 | 38.6 |
大都市圏グループ(n=2): $\bar{x}_A = \frac{23.5 + 25.6}{2} = \frac{49.1}{2} = 24.55$
過疎県グループ(n=3): $\bar{x}_B = \frac{33.8 + 35.7 + 38.6}{3} = \frac{108.1}{3} = 36.03$
大都市圏 $s_A$: 偏差 = $(23.5-24.55)^2 + (25.6-24.55)^2 = 1.1025 + 1.1025 = 2.205$。 $s_A = \sqrt{2.205/1} = 1.485$
過疎県 $s_B$: 偏差 = $(33.8-36.03)^2 + (35.7-36.03)^2 + (38.6-36.03)^2 = 4.9729 + 0.1089 + 6.6049 = 11.6867$。 $s_B = \sqrt{11.6867/2} = 2.416$
$$s_{\text{pooled}} = \sqrt{\frac{(n_A-1)s_A^2 + (n_B-1)s_B^2}{n_A+n_B-2}} = \sqrt{\frac{1 \times 2.205 + 2 \times 5.837}{3}} = \sqrt{\frac{13.879}{3}} = \sqrt{4.626} \approx 2.151$$
$$d = \frac{24.55 - 36.03}{2.151} = \frac{-11.48}{2.151} \approx -5.34$$
手計算結果: $d \approx -5.3$(大都市圏の高齢化率が低い方向に 5 標準偏差以上の差)。 $|d| > 0.8$ の閾値を大幅に超え、 「東京 vs 秋田」のストーリーに 統計的根拠 を付与できる。
手計算で得た値と、 下記の Python 実装で算出した値が一致することを確認する。
🎯 このコードでやること:上記 Step 1〜3 の手計算(Cohen's d = −5.3)を numpy で再現し、 一致を確認する。
📥 入力: 大都市圏 [23.5, 25.6]、 過疎県 [33.8, 35.7, 38.6](SSDSE-B-2026 2023年 高齢化率)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import numpy as np # SSDSE-B-2026 2023年 高齢化率 (5 県) metro = np.array([23.5, 25.6]) # 東京都, 神奈川県 rural = np.array([33.8, 35.7, 38.6]) # 鳥取県, 島根県, 秋田県 mean_a, mean_b = metro.mean(), rural.mean() var_a, var_b = metro.var(ddof=1), rural.var(ddof=1) na, nb = len(metro), len(rural) pooled_std = np.sqrt(((na-1)*var_a + (nb-1)*var_b) / (na+nb-2)) d = (mean_a - mean_b) / pooled_std print(f'大都市圏平均: {mean_a:.2f} %') print(f'過疎県平均 : {mean_b:.2f} %') print(f'プール SD : {pooled_std:.3f}') print(f'Cohen's d : {d:.2f} ← 手計算 ≈ -5.3 と一致') |
💬 Python 出力 d = −5.33 が手計算 d ≈ −5.3 と一致。 $|d| > 5$ は「超大効果量」であり、 「大都市圏と過疎県の高齢化率は、 標準偏差 5 個分以上離れている」というストーリーの数値根拠として説得力が高い。
合成データで発表前/後の理解度差から効果サイズ (Cohen's d) を計算する。
| 人 | 発表前 | 発表後 | 差 |
|---|---|---|---|
| 1 | 30 | 70 | 40 |
| 2 | 40 | 75 | 35 |
| 3 | 25 | 60 | 35 |
| 4 | 50 | 85 | 35 |
| 5 | 20 | 55 | 35 |
1 2 3 4 5 6 7 8 | import numpy as np before = np.array([30, 40, 25, 50, 20]) after = np.array([70, 75, 60, 85, 55]) diff = after - before d = diff.mean() / diff.std(ddof=1) print(f"差平均: {diff.mean()}") print(f"差SD: {diff.std(ddof=1):.3f}") print(f"Cohen's d: {d:.2f}") |
💬 手計算 (Step 2) d≈16.10 と Python 出力が完全一致。 発表は強い効果。
データストーリーテリングの核心は「どの切り口を選ぶか」です。 SSDSE-B-2026 の出生数(2012 → 2023)を例に、 すべて正しいのに印象がまったく違う 3 つの語り方を作ってみます。
| 語り口 | 見せる数字 | 読み手が受け取る印象 |
|---|---|---|
| A. 全国で語る | 1,037,165 → 727,269 件、−29.9% | 「日本全体が一様に 3 割減った」 |
| B. 最も減った県で語る | 秋田県 −44.8%、岩手県 −41.4% | 「地方は半減寸前、危機的だ」 |
| C. 最も減らなかった県で語る | 東京都 −19.6%、大阪府 −24.3% | 「都市部は持ちこたえている」 |
3 つとも数字は正確で、SSDSE-B-2026 から直接計算できます。 にもかかわらず、A だけを見せられた読み手は地域差の存在に気づけません。 実際には 47 都道府県の変化率は −44.8%(秋田)から −19.6%(東京)まで 25 ポイントの幅があり、 中央値は −33.3% で、全国値 −29.9% より悪いのです。 全国値が中央値より高く出るのは、東京・大阪など出生数の多い都市部の減り方が小さいからで、 人口の重みが平均を押し上げています。
💬 誠実な語り方は、A・B・C のどれか 1 つを選ぶことではなく、 「全国で −29.9%。ただし県別には −44.8% 〜 −19.6% と 25 ポイントの幅があり、中央値は −33.3%」 と代表値と散らばりを同時に出すことです。 ストーリーを作る技術は「印象的な 1 つの数字を選ぶ技術」だと誤解されがちですが、 実際には「1 つの数字が隠しているものを、もう 1 行で補う技術」だと考えてください。
もう一点。B と C はどちらも極端値を代表として語る形になっています。 47 個のうち最大・最小を選ぶ行為は、それだけで 選択バイアスそのものです。 「秋田県では」と書くときは、必ず「47 県中最も減少幅が大きい県」と添えてください。 それを書くだけで、読み手は自分で割り引いて受け取れるようになります。
公的統計(SSDSE-B-2026)を題材に、 最小限の Python コードで動作させます。 ファイルパス(data/raw/SSDSE-B-2026.csv)は自分の環境に合わせて変更してください。 まずはこのまま動かすことが理解の最短ルートです。
data/raw/SSDSE-B-2026.csv (ヘッダ 2 行・47 都道府県、 2023 年度)。 X 軸=高齢化率(65 歳以上人口割合)、 Y 軸=死亡率(死亡数 / 10 万人)を散布図に。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 「結論を見出しに」型グラフ:タイトルに結論を書く import os import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy() df['年度'] = pd.to_numeric(df['年度'], errors='coerce') df = df[df['年度'] == df['年度'].max()].copy() for _c in ['総人口', '65歳以上人口', '死亡数']: df[_c] = pd.to_numeric(df[_c], errors='coerce') # 高齢化率・死亡率は SSDSE にそのままの列が無いので、実在する列から計算する df['高齢化率'] = df['65歳以上人口'] / df['総人口'] * 100 df['死亡率'] = df['死亡数'] / df['総人口'] * 1000 r = df['高齢化率'].corr(df['死亡率']) df.plot.scatter(x='高齢化率', y='死亡率', figsize=(7, 4)) plt.title(f'高齢化が進む県ほど死亡率も高い(r={r:+.2f})', fontsize=14) os.makedirs('figures', exist_ok=True) plt.savefig('figures/story.png', dpi=120) print(f'高齢化率と死亡率の相関係数 r = {r:.3f}') |
▶ 実行 を押せばこのページの中でそのまま動きます(ライブラリもデータも同梱済みで、 準備は要りません)。 手元の Python に移して動かすときは pip install matplotlib numpy pandas が必要です。 読んでいるデータは data/raw/SSDSE-B-2026.csv。 日本語を含むので encoding='cp932' の指定を落とさないでください。
本サイトの全コードは 論文一覧ページ から実例として確認できます。 自分のデータで試したい場合は、 列名・欠損記号・単位の違いだけ調整すれば、 ほぼそのまま流用できます。
「データストーリーテリング」を初めて使う方向けに、 ハンズオン的な実行手順を整理します。 上の Python 実装と組み合わせて、 1 度自分の手でなぞってみることを強く推奨します。
data/raw/ に配置(または自分のデータを用意)。 列名と単位を確認。df.head()、 df.describe()、 df.isna().sum() で全体像を把握。 ここで欠損や外れ値の見当を付ける。この 8 ステップを 1 度回すと、 「用語を読んで分かった気になる」段階から「実際に使える」段階に進めます。 知識は身体で覚えるのが結局のところ最速です。
このコードでやること:全国 1 つの数字で語りたくなったときに、 その裏にある散らばりを 5 行で出すためのコードです。 ストーリーを書く前に必ず実行して、自分の主張が中央値・四分位と矛盾しないか確かめます。
📥 入力データ(SSDSE-B-2026 の出生数、2012 年と 2023 年):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 「全国 -29.9%」が隠しているもの — 県別の散らばりを出す import pandas as pd df = pd.read_csv("data/raw/SSDSE-B-2026.csv", encoding="cp932", header=1) df = df[df["地域コード"].astype(str).str.match(r"^R\d{5}$", na=False)].copy() df["出生数"] = pd.to_numeric(df["出生数"], errors="coerce") df["年度"] = pd.to_numeric(df["年度"], errors="coerce") a = df[df["年度"] == 2012].set_index("都道府県")["出生数"] b = df[df["年度"] == 2023].set_index("都道府県")["出生数"] chg = ((b - a) / a * 100).sort_values() print(f"全国合計 : {(b.sum() - a.sum()) / a.sum() * 100:+.1f}%") print(f"県別の中央値 : {chg.median():+.1f}%") print(f"県別の範囲 : {chg.min():+.1f}% 〜 {chg.max():+.1f}%") print(f"25%点 / 75%点 : {chg.quantile(.25):+.1f}% / {chg.quantile(.75):+.1f}%") print() print("最も減った 3 県:", ", ".join(f"{k} {v:+.1f}%" for k, v in chg.head(3).items())) print("最も減らない 3 県:", ", ".join(f"{k} {v:+.1f}%" for k, v in chg.tail(3).items())) |
📤 実行結果:
💬 読み方:全国合計 −29.9% と県別中央値 −33.3% の 3.4 ポイントのずれが、 「全国で語ると実態より穏やかに見える」ことを数値で示しています。 さらに 25%点 −35.2%、75%点 −30.1% を見れば、真ん中の半数の県は −35.2% 〜 −30.1% という狭い帯に収まっており、全国値 −29.9% はその帯の外(より穏やかな側)にあることが分かります。 ストーリーに書くべきは「−29.9%」ではなく、 「全国では約 3 割減。ただし県別には 2 割減から 4 割半減まで開きがある」という 1 文です。
このコードは出生数以外でもそのまま使えます。
"出生数" を "婚姻件数" や "着工新設住宅戸数" に差し替えるだけで、
別の指標について同じ確認ができます。
「全国 1 つの数字を出す前に、必ず散らばりを見る」——
これを習慣にするだけで、誤解を招くストーリーの大半は防げます。
同じ実データ(SSDSE-B-2026 の 2023 年・高齢化率=65歳以上人口÷総人口×100、 10 県抜粋)を使っても、 注釈(基準線・ハイライト・矢印)と結論見出しを足すだけで「ただのグラフ」が「主張が伝わる図」に変わります。 下のトグルを切り替えて体感してください。 さらに「全体→注目→示唆」のステップ送りで語りの順序を、 最後の「y軸切詰め」で強調とごまかしの境界を確認できます。
上の実験でオフ状態のグラフは、 数値としては完全に正しいのに「だから何?」に答えられません。 基準線は「多い/少ないの物差し」という文脈を、 ハイライトと矢印は「どこを見るべきか」という焦点を、 見出しは「何が言いたいか」という結論を与えます。 データストーリーテリングの本質は新しい数値を足すことではなく、 既にある数値に文脈と焦点を重ねる注釈レイヤにあります。
このウィジェットは Segel & Heer のナラティブ可視化(martini-glass 構造=著者が順序を導いた後に読み手の自由探索へ渡す)を最小実装したものです。 「注釈トグル」は注釈レイヤ(データ層と分離した強調要素)を、 「ステップ送り」は著者が意図を設計するオーサリングの工程を体験させます。 実務では 注釈・インタラクティブ可視化・視覚属性・複合的なグラフ と組み合わせ、 データ可視化 の素材に物語の骨格を与えます。
データストーリーテリングで頻出する失敗は、 (1) ストーリーに合わせて事実を曲げる (チェリーピッキング)、 (2) ビジュアルに凝りすぎて根拠数値が薄い、 (3) 主役のメッセージが拡散して結論が伝わらない、 の 3 つです。 Cole Nussbaumer Knaflic の 5 つの問い (Who/What/How/Visual/Story) を毎回確認すれば、 大半は事前に回避できます。
「データストーリーテリング」は、 データ可視化・ナラティブ・聴衆設計の三位一体。 以下の概念マップで中核概念と隣接領域の包含・対比関係を整理する。
SVG 関係図: データストーリーテリングを中心とした概念の包含・上下関係
| 概念 | データSTとの関係 | 違い・注意 |
|---|---|---|
| データ可視化 | 手段・部品 | 可視化単独ではストーリーにならない |
| インフォグラフィック | 並列 (静的情報伝達) | 物語構造より情報圧縮に重点 |
| プレゼンテーション | 媒体・チャネル | データ ST が中身、プレゼンは形式 |
| EDA (探索的分析) | 上流フェーズ | EDA で発見 → ST で伝達 |
| データジャーナリズム | 応用分野 | 報道目的に特化した ST |
「データストーリーテリング」は単独で完結する手法ではなく、 上流・並列・下流の隣接手法と連携することで真価を発揮する。
| 位置 | 隣接手法 | 接続ポイント | 実務での順序 |
|---|---|---|---|
| 上流 | データリテラシー / EDA | 「何が面白いか」を発見 | EDA → DS |
| 並列 | データ可視化 / BI ツール | 図表生成・ダッシュボード | DS と同時並行 |
| 統計的根拠 | 相関分析 / ANOVA | 「差は偶然か?」の検証 | DS の「Conflict」補強 |
| 下流 | 政策提言 / レポート執筆 | 「Resolution」の実装 | DS → 報告書 |
SSDSE コンペでは「EDA (散布図) → DS (三幕) → 統計検定 (ANOVA p=0.0003) → 報告書(Result セクション)」の順が高評価を得やすい。 DS は「つなぎ役」として機能し、 データと聴衆の橋渡しをする。
「データストーリーテリング」は適切な場面で使って初めて効果を発揮する。 以下のフローで「この場面に DS が適切か」を 4 分岐で判断する。
| 判断基準 | Yes の場合 | No の場合 |
|---|---|---|
| ① 伝達相手が人間か? | 次へ | 自動処理なら DS 不要 |
| ② 行動変容を求めるか? | DS が最適。 3 幕構成を採用 | 記録・参照用なら BI ダッシュボード |
| ③ データに驚きの落差はあるか? | Discovery Arc or Problem-Solution Arc | 落差を探す EDA を先行 |
| ④ 聴衆の専門知識は? | 専門家 → 統計指標主体の DS | 一般 → 比喩・具体例主体の DS |
SSDSE-B-2026 コンペでの典型ケース: ① 審査員(人間)→ ② 政策示唆あり(行動変容あり)→ ③ 東京と秋田の高齢化率 15 ポイント差が落差 → ④ 専門家向けに p 値・効果量を添えた DS を選択。
冒頭の「🎨 直感で掴む」を一歩進めます。 データストーリーテリングの正体は、 データ(data)・ビジュアル(visual)・ナラティブ(narrative)の 3 要素を足し算ではなくかけ算で重ねる営みです。 かけ算なので、 どれか一つが 0 に近いと全体が伝わらなくなります。
| 要素 | 担う役割 | これが欠けると起きること |
|---|---|---|
| データ | 主張の根拠・信頼性の源泉 | 「印象論」になり、 反論で崩れる |
| ビジュアル | 一瞬で構造を掴ませる知覚の近道 | 数字の羅列になり、 記憶に残らない |
| ナラティブ | 「だから何?」に答え、 行動へ導く | 図の墓場になり、 意思決定が動かない |
鍵は文脈化(contextualization)です。 単独の数値「東京都の高齢化率 22.8%(SSDSE-B-2026・2023年・実測)」は、 それだけでは高いか低いか判断できません。 基準(全国の人口加重平均 29.1%)と対比(秋田県 39.1%)を隣に置いて初めて「東京は全国平均より 6 ポイント以上低く、 最高の秋田とは 16.3 ポイントの開きがある」という意味が立ち上がります。 このページ上部の「🎮 体験」ウィジェットで、 同じ実データが注釈レイヤの追加だけで「ただのグラフ」から「主張が伝わる図」へ変わるのを確認できます。
そして 3 要素の先には必ず聴衆に合わせた翻訳と行動喚起(call to action)を置きます。 「格差 16.3 ポイント」という事実を、 知事には「地方拠点への介入シナリオ」、 現場には「市区町村別の年齢層変動」へと翻訳して初めて、 グラフの羅列ではない物語になります。
「物語を強くしたい」という動機は、 容易に事実を曲げる圧力に転化します。 上部の「⚠️ よくある落とし穴」を、 可視化の欺き・認知バイアス・文脈の欠落の 3 系統に整理して深掘りします。 いずれも「悪意」ではなく「善意の熱意」から起きるのが厄介な点です。
| 落とし穴 | 何が起きるか | 対処 |
|---|---|---|
| 軸操作(y 軸切り詰め・対数の乱用) | 見た目の差を数倍に誇張。 量の比較で 0 起点を捨てると印象がねじれる | 量の比較は 0 起点が原則。 変化率を語るなら軸の非 0 を明示 |
| チェリーピッキング | 主張に都合の良い県・期間だけ抽出し、 全体分布を歪める | 代表抜粋(最小・最大・平均を含む)か全数。 逆の結論を支持する数値も並べる |
| data-ink 比の無視・過剰装飾 | 3D・影・無意味な色でメッセージが薄まる(チャートジャンク) | Tufte の data-ink 比を意識し、 意味のないインクを削る |
| 聴衆を無視した専門用語 | 「効果量 d」「p 値」を説明なしに出し、 相手が置き去りになる | 相手のリテラシーに合わせ翻訳。 専門家には指標、 一般には比喩 |
| 相関を因果と語る | 「高齢化が進む県ほど死亡率も高い」を因果と断言してしまう | 交絡(年齢構成など)を疑い、 「観察された関連」と明記 |
| 確証バイアス・結論先行 | 先に結論を決め、 それを支持するデータだけ集める | 反証データを能動的に探す。 「間違っていたら何が見えるはず?」を自問 |
| 文脈欠如の数値 | 基準・単位・母数のない「裸の数字」で誤解を招く | 基準線・n・期間・単位を必ず添える |
とりわけ軸操作は「強調」と「ごまかし」の境界に立ちます。 上部ウィジェットの「✂ y軸を切り詰める」を押すと、 東京と秋田の実際の差(16.3 ポイント)が見た目で約 2 倍に膨らむ様子を体感できます。 詳細は 誤解を招くグラフ を参照。 過剰装飾と知覚の話は 視覚属性 と ゲシュタルト原則、 色の乱用は 配色 に整理があります。
相関と因果の混同は、 ストーリーが最も「気持ちよく嘘になる」瞬間です。 相関分析 で得た関連を、 因果 と 交絡 の観点で吟味し、 断定を避けます。 聴衆の専門用語問題は、 読み手のリテラシーを測る データリテラシー とセットで考えると事故が減ります。
最後に、 実装レベルで効く 6 つの発展トピックを整理します。 上部の「🎮 体験」ウィジェットは、 このうちナラティブ構造・注釈レイヤ・プログレッシブディスクロージャーを最小実装したものです。
なお、 これら注釈は 棒グラフ や散布図といった素材(=データ可視化)の上に重ねて初めて機能します。 「効果量で驚きを裏づける」手法は 効果量 を、 全体の素材づくりは データ可視化 を参照してください。(本サイトに独立ページのない「データビジュアライゼーション基礎」等は、 これらの実在ページで代替できます。)