本ページの主要キーワードを一覧表示します。 各語へのアンカー/関連ページに飛べます。
線形補間 時系列 matplotlib multi-line area chart スパゲッティチャート 軸スケール 対数軸 stackplot small multiples ベスト・プラクティス 実値で計算 隣接手法
🍰 まずはやさしく
データの変化を線で結んだグラフです。
時間の流れによる変化を伝えるために使います。
テストの点数の上がり下がりなどを表せます。
この章では折れ線グラフの重要ポイントを読みます。
時系列の推移を線で表現
line chart を 30 秒で把握する重要ポイント:
🍰 まずはやさしく
点と線を組み合わせた基本の図です。
データの傾向やトレンドを読み取るために使います。
都道府県ごとの人口の変化などを表せます。
ここではグラフを上手に作るためのルールを読みます。
「折れ線グラフ」は 可視化 のカテゴリに属する用語です。 時間など順序を持つ変数の変化を、 点を線で結んで表現する基本可視化です。 経時変化・トレンド・系列間比較を 1 枚で表せる柔軟性を持つ反面、 軸の取り方で印象が大きく変わる点で注意が必要です。
SSDSE-B-2026.csv(47 都道府県 × 12 年度= 564 行 × 112 列)を使用alpha=0.3-0.5 で薄く、 データを邪魔しない。秋田県の議会資料で「過去 11 年人口推移と将来推計」を折れ線で示すケース。 SSDSE 実測値 (934 千 → 919 千、 -1.6%) を実線、 将来推計を破線で区別。 縦軸はゼロ基線でなく、 800-950 千の範囲にクリップして変化を強調。 ただし「縦軸クリップしている」と注記必須。
「コロナで東京から人口流出」という見出しの記事で、 SSDSE 東京都の人口を 12 年折れ線。 2020-2021 の僅かな下降 (1404.8 → 1401.0 万人、 -0.27%) を強調するには、 縦軸 1395-1410 万にクリップ。 ただしジャーナリズムの倫理上、 ゼロ基線版も併記が望ましい。
高齢化率の地域格差を扱う論文で、 SSDSE 47 都道府県の高齢化率推移を「ハイライト + 灰色」で表示。 関心が高い秋田 (39%) と東京 (23%) を強調、 他 45 県を背景に。 これにより「秋田の独走」と「全体傾向」を 1 枚で伝えられる。
企業の経営ダッシュボードで「県別売上推移」を Tableau や Looker でリアルタイム表示。 SSDSE の構造を参考に「年-県」をキーに集約し、 折れ線で時間推移、 ホバーで詳細値表示。 plotly や Vega-Lite が使われる場面。
統計学入門の教材で、 SSDSE-B-2026 を題材に折れ線の描き方を学ぶ。 「線形補間とは何か」「軸スケールの罠」を具体的に説明できる。 47 県データは小さく扱いやすいため、 学習者が手を動かしやすい。
🍰 まずはやさしく
データの波を視覚的に捉える道具です。
量の変化のパターンを読み取るために使います。
スマホの利用時間の増減などを表せます。
ここでは使い分けや具体的な見方を読みます。
グラフの目的は「データを分かりやすく伝える」こと。 軸・凡例・出典・スケールを必ず明示してください。
本ページでは 折れ線グラフ を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うかを理解することを優先してください。
折れ線グラフは、 横軸に「順序のある変数」(多くは時間)、 縦軸に「量」を取り、 各データ点を直線で結んだもっとも基本的なチャートです。 棒グラフは「カテゴリ間の量の比較」が得意ですが、 折れ線は 連続的な変化のパターンを読み取るのに圧倒的に向いています。 SSDSE-B-2026 で言えば、 「東京都の総人口 2019 → 2020 → 2021 → 2022 → 2023」を 5 点プロットして直線で結ぶと、 14,007,000 → 14,047,594 → 14,010,000 → 14,038,000 → 14,086,000 という上昇→停滞→上昇の波が一目で見えます。
折れ線グラフの真価は 複数系列を重ねたときに発揮されます。 東京都・神奈川県・大阪府・愛知県・埼玉県の 5 系列を同じ軸上に描くと、 「全国第 1 位の東京都だけ伸びている/神奈川と大阪はほぼ横ばい/埼玉は微増」という比較が即座に可能です。 棒グラフでは横並びの比較に紙幅を取られて時系列の変化が見えにくいのに対し、 折れ線では時系列の変化と系列間の比較を 1 枚で両立できます。
| 表現 | 向く局面 | 向かない局面 | SSDSE-B 例 |
|---|---|---|---|
| multi-line (重ね描き) | 線数 ≤ 7、 互いの大小比較が主目的 | 線数 ≥ 8、 スパゲッティ化 | 関東 7 都県の人口を重ねて「東京の独走」を強調 |
| small multiples (格子分割) | 線数 8〜50、 各系列の 形状そのものを見たい | 系列同士の差を厳密に読みたい | 47 都道府県を 7×7 格子で並べ、 県別の人口曲線の形を一望 |
| indexed line (基準年=100) | 桁違いの系列を 同じ伸び率で比較 | 絶対値が議論の中心 | 東京 (1400 万) と鳥取 (55 万) を 2015=100 で並べ、 「鳥取の方が下落率が大きい」と読ませる |
| stacked area | 構成比の時間推移、 合計値も同時に見せたい | 各系列の細かい上下を読みたい | 関東 7 都県の人口合計と各県シェアを同時に |
選定ルール: 「線が 7 本を超えたら small multiples」「桁が 2 桁以上違ったら indexed line」を機械的に当てはめると、 折れ線の 9 割の見せ方ミスは防げる。
折れ線グラフの読み解き能力は、「時系列のどこで何が起きたか」を即座に言語化できるかで決まる。 ここでは SSDSE-B-2026(47 都道府県 × 2012-2023 の 12 年分、 564 行 × 112 列、 cp932 エンコード)の 実測値だけを使い、 折れ線グラフの設計原則・誤読パターン・実装のポイントを総点検する。
SSDSE-B-2026 は「都道府県 × 指標 × 年度」の三次元データで、 年度(列名 SSDSE-B-2026)を横軸にとれば各指標がそのまま時系列折れ線になる。 折れ線の格好の実例は、 総人口(A1101)や出生数(A4101)の年度推移である。
📤 読み方: 総人口は 2012-2020 に増加し、 2020-2021 で一度減少(コロナ禍)した後 2022 以降で回復する。 一方 出生数は 2015 年の 113,194 をピークにほぼ一貫して減少し、 2023 年には 86,348(2015 年比 −24%)まで落ち込む。 「総人口はほぼ横ばいに見えるのに、 出生数は明確に右肩下がり」── この 2 本を同じ折れ線に重ねるときこそ、 桁の違い(1,400 万 vs 8.6 万、 約 160 倍)への配慮が要る。
総人口(約 1,400 万)と出生数(約 8.6 万)を同じ線形の縦軸に置くと、 出生数の線が軸の底に張り付いて変化が読めなくなる。 対処は次の 3 択で、 一般には二重軸は誤読を招きやすいため 指数化(基準年 = 100)がもっとも安全である。
| 手法 | 向く場面 | 注意点 |
|---|---|---|
対数軸 plt.yscale('log') | 桁が 2 桁以上違う、 比率変化を見たい | 一般読者には誤読されやすい |
| 指数化(基準年=100) | 伸び率を同じ土俵で比較したい | 絶対値が議論の中心のときは不適 |
| 二重縦軸(twinx) | 2 系列だけを併記したい | 相関の恣意的演出になりやすく原則非推奨 |
このコードでやること: cp932・skiprows=[1] で SSDSE-B-2026 を読み込み、 英語コード列(A1101・A4101)と年度列(SSDSE-B-2026)を使って、 東京都の総人口と出生数を二重縦軸の折れ線で重ねる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import pandas as pd import matplotlib.pyplot as plt # 1 行目=英語コード見出し / 2 行目=日本語名。日本語名の行だけ読み飛ばす df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) tokyo = df[df['Prefecture'] == '東京都'].sort_values('SSDSE-B-2026') fig, ax1 = plt.subplots() ax1.plot(tokyo['SSDSE-B-2026'], tokyo['A1101'], 'o-', color='#1565C0', label='総人口') ax1.set_xlabel('年度'); ax1.set_ylabel('総人口 A1101') ax2 = ax1.twinx() ax2.plot(tokyo['SSDSE-B-2026'], tokyo['A4101'], 's--', color='#C62828', label='出生数') ax2.set_ylabel('出生数 A4101') plt.title('東京都: 総人口と出生数の推移 (2012-2023)') plt.tight_layout(); plt.show() |
💬 結論: 桁が違う系列を折れ線に重ねるなら、 まず「絶対値を見せたいのか/伸び率を見せたいのか」を決める。 前者なら small multiples か対数軸、 後者なら指数化。 「とりあえず二重軸」は最も誤読を生みやすい選択である。
🍰 まずはやさしく
順序があるデータを線で結んだ図です。
分析の結果を正しく伝えるために使います。
1年間の気温の変化などを表せます。
ここではグラフの定義や注意点を読みます。
時系列の推移を線で表現
英語名 Line Chart。
この用語を理解・使用するときは、 次のような前提を意識してください:
折れ線グラフ (Line Chart) は、 順序付き変数 $x_1 < x_2 < \dots < x_n$ と対応する値 $y_1, y_2, \dots, y_n$ を平面に点として打ち、 隣接点を線分で結んだ折れ線として表示する 2 次元可視化です。 連続した値を結ぶ操作は 1 次線形補間と数学的に等価で、 「測定していない時点の値を直線でつないで仮想的に補う」表現になっています。 ここに 過剰補間の落とし穴が潜んでおり、 観測が年次単位なのに月次の値があるかのように線でつなぐと、 ない情報を視覚的に作り出してしまうことに注意が必要です。
複数系列を重ねる場合は同じ縦軸スケール(左軸)に置くのが基本ですが、 桁が大きく異なるとき(例:総人口 vs 出生数)には 二重軸(左右に別目盛)を用いることもあります。 ただし二重軸は誤読リスクが高く、 可能な限り対数軸 ($\log_{10}$ 軸) や指数化(基準時点 = 100)で代替するのが推奨されます。
範囲が桁違いに変動するデータでは「対数軸」を使う。 SSDSE-B-2026 の例で言えば、 東京都人口 1409 万と鳥取県人口 53.7 万を同じグラフに描く場合。 比 = 1409/53.7 ≒ 26.2 倍なので、 線形軸では鳥取が水平線にしか見えない。
$$ y_{\text{log}} = \log_{10}(y) $$
対数軸では「等差な目盛り」が「等比な変化」を表す。 1, 10, 100, 1000 が等間隔。 これにより、 オーダーが異なる系列を 1 枚で比較できる。
対数軸が適する場面:
対数軸を避けるべき場面:
3 本の式を、 ふだんの言葉に翻訳してみます。
① 線形補間 $y(x) = y_1 + \frac{y_2 - y_1}{x_2 - x_1}\,(x - x_1)$ の意味。 図形で考えると、 これは「2 点 $(x_1, y_1)$ と $(x_2, y_2)$ を通る直線の方程式」をそのまま書き下したものです。 右辺第 1 項 $y_1$ は出発点の高さ、 第 2 項 $\frac{y_2 - y_1}{x_2 - x_1}$ は 直線の傾き(変化率)、 そして $(x - x_1)$ は出発点からの横方向の距離。 これらをかけ合わせて足すと、 任意の $x$ における直線上の高さ $y(x)$ が求まります。 SSDSE-B-2026 の東京都で言えば、 2019 年 ($x_1=2019, y_1=14{,}007{,}000$) と 2020 年 ($x_2=2020, y_2=14{,}047{,}594$) を結ぶ折れ線では、 傾きは $(14{,}047{,}594 - 14{,}007{,}000) / (2020 - 2019) = 40{,}594$(人/年)。 もし 2019.5 年(2019 年 6 月 30 日)の人口を補間したいなら $y(2019.5) = 14{,}007{,}000 + 40{,}594 \times 0.5 = 14{,}027{,}297$ 人。 これが折れ線グラフ上の 中間点の意味 です。 ただし、 実際にはそこに観測値があるわけではなく あくまで線形仮定の補間値 であることを忘れてはいけません。 半年で本当にそれだけ動いたかは保証されません。
② 指数化 $\tilde{y}_t = \frac{y_t}{y_{t_0}} \times 100$ の意味。 桁が違う複数系列を「同じ土俵」で比較するための技です。 東京都の 1,400 万人と鳥取県の 54 万人を縦軸の同じスケールで並べると、 鳥取県の線は事実上水平に見えて変化が読めません。 そこで 基準年(たとえば 2019 年)の値を 100 とおいて、 以後の値をその比率で表す。 東京都 2023 年は $14{,}086{,}000 / 14{,}007{,}000 \times 100 \approx 100.56$、 大阪府は $8{,}763{,}000 / 8{,}842{,}000 \times 100 \approx 99.11$、 愛知県は $7{,}477{,}000 / 7{,}557{,}000 \times 100 \approx 98.94$。 全部 100 周辺の値になり、 同じ目盛で比較しても変化の方向(増減)が見やすくなります。 これが報道で「2019 年比 1.0 %」「2019 年比 −1.0 %」のように表現される指標の正体。 数式の $\times 100$ は単に「%表示にするための単位調整」で、 比そのものは $y_t / y_{t_0}$ の部分にあります。
③ 対数軸 $\log_{10} y_t = \log_{10} y_{t_0} + t \cdot \log_{10}(1+r)$ の意味。 もし人口が毎年 $r$ の率で増え続けるなら、 $t$ 年後の値は $y_t = y_{t_0} (1+r)^t$ という指数関数。 両辺の対数を取ると、 右辺は $\log y_{t_0} + t \log(1+r)$ という $t$ の一次関数になります。 つまり 対数軸で描くと、 一定率で増減している系列はまっすぐな直線 になる、 という性質。 線形軸では指数関数は徐々に急になる曲線ですが、 対数軸ではきれいに直線化されます。 これは「年率 1 % で増えているのか、 年率 10 % で増えているのか」を 傾きを見るだけで判断できる強力な道具です。 SSDSE-B-2026 のような人口データはせいぜい年率 ±1 % 程度の変化なので対数軸の効果は小さいですが、 株価・売上・感染者数のように指数的に動く系列ではほぼ必須の表現になります。 折れ線グラフは「縦軸の選択」で別の物語を語れる柔軟性を持つ反面、 軸選択を間違えると 読者を誤導する強力なツール にもなりうる、 という両面性を理解してください。
折れ線グラフが本質的に行っているのは 1 次(線形)補間 です。 2 点 $(x_1, y_1)$ と $(x_2, y_2)$ の間に直線を引く操作の数式は:
この $y(x)$ は $x_1$ と $x_2$ の間で線分上の点を返します。 折れ線グラフ全体は、 各観測点ペアに対してこの式を適用した連結関数として描画されます。
複数系列を比較する際の 指数化(基準年= 100 として比率化):
$t_0$ は基準時点(例:2019 年)、 $\tilde{y}_t$ は基準値を 100 とした相対値。 桁が桁違いの系列(東京都 1,400 万 vs 鳥取県 54 万)を同じ縦軸で比較できます。
対数軸(縦軸を $\log_{10}$)にすると、 増減率(%)が一定なら直線になります:
$r$ が年率なら、 縦軸の傾きがそのまま増減率を示します。 指数成長・指数減少を検出するのに便利。
折れ線グラフは「時系列推移を一目で示す」基本ツールだが、 正しく描かないと誤読を招く。 SSDSE-B-2026 の 47 都道府県 × 12 年データを使い、 (1) 適切なスケール、 (2) 複数線の使い分け、 (3) 補間と外挿、 (4) ベスト・プラクティスを実例で示す。
折れ線グラフでデータ点 $(x_i, y_i)$ と $(x_{i+1}, y_{i+1})$ を直線で結ぶとき、 区間内の任意の $x$ における高さ $y$ は次式で求まる。
$$ y = y_i + \frac{y_{i+1} - y_i}{x_{i+1} - x_i} \cdot (x - x_i) $$
| 記号 | 読み方 | 意味 |
|---|---|---|
| $x_i, y_i$ | エックス サブ アイ | i 番目のデータ点座標 |
| $x_{i+1}, y_{i+1}$ | エックス サブ アイ プラス 1 | 次のデータ点座標 |
| $\frac{y_{i+1}-y_i}{x_{i+1}-x_i}$ | スロープ (傾き) | 2 点間の直線の傾き |
| $y$ | ワイ | 補間で求めたい高さ |
日本語にすると「左の点 $y_i$ から、 2 点を通る直線の傾きの $(x - x_i)$ 倍を足したもの」。 つまり 2 点を結ぶ直線の方程式を、 中間の $x$ で評価しているだけ。 これが pandas や matplotlib の折れ線グラフが内部でやっていること。
折れ線で「上昇トレンドか?」を主張するときに使う 3 段階の定量化を、 都道府県人口 (SSDSE-B-2026) で言葉に翻訳する。
$$ \Delta_t = y_t - y_{t-1},\quad g_t = \frac{y_t - y_{t-1}}{y_{t-1}},\quad S = \sum_{i
Δ_t = 隣接差分。 折れ線の 線分の高さ。 単位は人。 「沖縄は +3,200 人/年」のように直感的だが、 母数が違う県の比較不能。g_t = 年率成長率。 折れ線の 線分の傾き÷起点高さ。 単位は %。 「鳥取は -0.91%/年、 沖縄は +0.22%/年」と 異母数県の比較可能。S = Mann-Kendall 統計量。 折れ線の 「上昇ペアの数 - 下降ペアの数」。 単調性 (monotonicity) の有無を 分布仮定なしで検定できる (ノンパラ)。 |S| が大きいほどトレンド有意。
SSDSE-B-2026 から「東京都・大阪府・愛知県」の総人口を 2019 → 2023 でプロットしてみます。 実値は次のとおりです:
東京都:14,007,000 / 14,047,594 / 14,010,000 / 14,038,000 / 14,086,000 → 5 年で +79,000 人(+0.56 %)
大阪府:8,842,000 / 8,837,685 / 8,806,000 / 8,782,000 / 8,763,000 → 5 年で −79,000 人(−0.89 %)
愛知県:7,557,000 / 7,542,415 / 7,517,000 / 7,495,000 / 7,477,000 → 5 年で −80,000 人(−1.06 %)
折れ線で重ねると、 東京都だけ右肩上がり、 残り 2 大都市は右肩下がりという「一極集中」の構図が瞬時に伝わります。 棒グラフでも数値の比較は可能ですが、 「角度の差」で増減を直感的に示せるのは折れ線特有の強みです。 縦軸を 0 から始めると変化率が小さく見え、 7,000,000 〜 14,500,000 でクリップするとドラマチックに見えるため、 軸の取り方が解釈を左右する点には常に注意してください(後述の落とし穴参照)。
| 都道府県 | 2019 | 2020 | 2021 | 2022 | 2023 | 変化率 |
|---|---|---|---|---|---|---|
| 東京都 | 14,007,000 | 14,047,594 | 14,010,000 | 14,038,000 | 14,086,000 | +0.56% |
| 大阪府 | 8,842,000 | 8,837,685 | 8,806,000 | 8,782,000 | 8,763,000 | −0.89% |
| 愛知県 | 7,557,000 | 7,542,415 | 7,517,000 | 7,495,000 | 7,477,000 | −1.06% |
| 鳥取県 | 557,000 | 553,407 | 549,000 | 544,000 | 537,000 | −3.59% |
折れ線グラフは「時系列」が一番のホームグラウンド。 SSDSE-B-2026 から東京都の人口 (A1101) を 2012-2023 の 12 年分取り出すと、 都市集中の動きが見える。
折れ線グラフは「方向の転換点」を視覚的に示すのが得意。 これを棒グラフで描くと「上下動」が伝わりにくい。
SSDSE-B-2026 やその他データで折れ線グラフを作るときに、 最後に確認すべき項目。
合成月次データで前月比と平均成長率を計算する。
| 月 | 売上 | 前月比 |
|---|---|---|
| 1 | 100 | — |
| 2 | 110 | +10% |
| 3 | 121 | +10% |
| 4 | 133 | +10% |
| 5 | 146 | +10% |
1 2 3 4 5 6 | import numpy as np sales = np.array([100, 110, 121, 133, 146]) yoy = np.diff(sales)/sales[:-1] * 100 cagr = (sales[-1]/sales[0])**(1/4) - 1 print(f"前月比: {yoy.round(1)}") print(f"CAGR: {cagr:.3f}") |
💬 手計算 (Step 2) CAGR ≈ 10% と Python 出力が完全一致。
SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd import numpy as np # データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) print(df.shape) print(df.dtypes) print(df.describe()) # 「折れ線グラフ」の文脈で扱う場合の例: # 分野: 可視化 # 関連手法は同カテゴリの他用語を参照してください。 |
具体的なコードは 1変量の可視化 を参照してください。
分析結果を報告するときに含めるべき情報:
折れ線グラフ(Line Chart) は、 時間軸を持つデータの推移を表す代表的なグラフ。 連続性のあるデータの傾向把握、 比較、 予測の前段階分析で必須。
| 用途 | 折れ線適 | 代替 |
|---|---|---|
| 時系列推移 | ○ | 面積グラフ |
| カテゴリ比較 | × | 棒グラフ |
| 構成比 | × | 円/ツリーマップ |
| 分布 | × | ヒストグラム |
1 2 3 4 5 6 7 | # 折れ線グラフ : 日本の高齢化率の推移
import pandas as pd, matplotlib.pyplot as plt
years = [1970, 1980, 1990, 2000, 2010, 2020, 2023]
rates = [7.1, 9.1, 12.1, 17.4, 23.0, 28.6, 29.1]
plt.plot(years, rates, marker='o', color='#00897B')
plt.xlabel('年'); plt.ylabel('高齢化率(%)'); plt.grid(alpha=0.3)
plt.tight_layout(); plt.savefig('line.png', dpi=150) |
1 2 3 4 5 6 | # 多系列折れ線 : 5 都道府県の高齢化率推移(仮想例)
import numpy as np
for pref, base in zip(['秋田県','東京都','沖縄県','大阪府','北海道'],
[25,18,17,20,22]):
plt.plot(years, [base + 0.04*(y-1970) for y in years], marker='o', label=pref)
plt.legend(); plt.tight_layout(); plt.savefig('multi_line.png', dpi=150) |
1 2 3 4 5 | # Plotly インタラクティブ
import plotly.express as px
fig = px.line(x=years, y=rates, markers=True,
labels=dict(x='年', y='高齢化率(%)'))
fig.write_html('line.html') |
SSDSE-B-2026 を使って折れ線を描く 5 パターンです。 すべて data/raw/SSDSE-B-2026.csv 直書きの平易なコード。
1 2 3 4 5 6 7 8 9 | # 1. 単系列折れ線(東京都の総人口推移)
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
tokyo = df[df['都道府県'] == '東京都'].sort_values('年度')
plt.plot(tokyo['年度'], tokyo['総人口'], marker='o')
plt.xlabel('年度'); plt.ylabel('総人口')
plt.title('東京都 総人口推移 2019-2023')
plt.grid(True); plt.show() |
1 2 3 4 5 6 7 8 9 10 | # 2. 多系列折れ線(5 大都道府県)
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
prefs = ['東京都', '神奈川県', '大阪府', '愛知県', '埼玉県']
for p in prefs:
sub = df[df['都道府県'] == p].sort_values('年度')
plt.plot(sub['年度'], sub['総人口'], marker='o', label=p)
plt.xlabel('年度'); plt.ylabel('総人口')
plt.legend(); plt.grid(True); plt.show() |
1 2 3 4 5 6 7 8 9 10 11 12 | # 3. 指数化(2019=100)で比較
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
prefs = ['東京都', '大阪府', '愛知県']
for p in prefs:
sub = df[df['都道府県'] == p].sort_values('年度').reset_index(drop=True)
base = sub.loc[0, '総人口']
plt.plot(sub['年度'], sub['総人口']/base*100, marker='o', label=p)
plt.axhline(100, color='gray', linestyle='--')
plt.xlabel('年度'); plt.ylabel('2019=100')
plt.legend(); plt.grid(True); plt.show() |
1 2 3 4 5 6 7 8 | # 4. 対数軸で増減率を可視化
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
tokyo = df[df['都道府県'] == '東京都'].sort_values('年度')
plt.semilogy(tokyo['年度'], tokyo['総人口'], marker='o')
plt.xlabel('年度'); plt.ylabel('総人口 (log10)')
plt.grid(True, which='both'); plt.show() |
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 5. 二重縦軸(人口 vs 15歳未満比率)
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
tokyo = df[df['都道府県'] == '東京都'].sort_values('年度')
fig, ax1 = plt.subplots()
ax1.plot(tokyo['年度'], tokyo['総人口'], 'b-o', label='総人口')
ax1.set_ylabel('総人口', color='b')
ax2 = ax1.twinx()
ax2.plot(tokyo['年度'], tokyo['15歳未満人口']/tokyo['総人口']*100,
'r-s', label='15歳未満比率')
ax2.set_ylabel('15歳未満比率 (%)', color='r')
plt.show() |
🎯 このコードでやること: SSDSE-B-2026 から東京都の人口推移を抜き出し、 折れ線グラフを matplotlib で描画。 マーカー・グリッド・タイトル・軸ラベル付き。
📥 入力データ: SSDSE-B-2026 全 564 行から東京都の 12 年分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) tokyo = df[df['Prefecture'] == '東京都'].sort_values('SSDSE-B-2026') # 折れ線グラフ描画 fig, ax = plt.subplots(figsize=(10, 5)) ax.plot(tokyo['SSDSE-B-2026'], tokyo['A1101'] / 10000, marker='o', linewidth=2, color='#7B1FA2', label='東京都人口') ax.set_xlabel('年') ax.set_ylabel('人口 (万人)') ax.set_title('東京都の人口推移 (2012-2023)') ax.grid(True, linestyle='--', alpha=0.5) ax.legend() # 注釈: 2020 年のコロナ影響 ax.annotate('コロナ影響', xy=(2021, 14010000/10000), xytext=(2017, 1410), arrowprops=dict(arrowstyle='->', color='red')) plt.tight_layout() plt.savefig('tokyo_pop.png', dpi=100) print('グラフを tokyo_pop.png に保存') # 数値の確認 print('\n東京都人口推移 (万人):') for _, row in tokyo.iterrows(): print(f' {int(row["SSDSE-B-2026"])} 年: {row["A1101"]/10000:.1f} 万人') |
📤 実行結果:
💬 結果の読み方: グラフは右上がりの基調を見せる中、 2020-2021 で僅かな下降が現れる (1404.8 → 1401.0)。 これがコロナ禍の都心離れ。 12 年間で +85.2 万人 (+6.4%)、 年率約 0.55%。 縦軸は「万人単位」でラベルし、 桁数を読みやすくしてある。 グリッド線は alpha=0.5 で薄く設定し、 データの視認性を保っている。
🎯 このコードでやること: 東京都・大阪府・福島県の 3 県を 1 つの折れ線グラフに重ね、 都市集中・震災影響・地方減少の対比を可視化する。
📥 入力データ: SSDSE-B-2026 から 3 県を抽出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) targets = ['東京都', '大阪府', '福島県'] sub = df[df['Prefecture'].isin(targets)].copy() # 2012 年を 100 とした指数 (基準化) sub['idx_100'] = sub.groupby('Prefecture').apply( lambda g: g['A1101'] / g[g['SSDSE-B-2026']==2012]['A1101'].iloc[0] * 100 ).reset_index(level=0, drop=True) fig, ax = plt.subplots(figsize=(10, 5)) colors = {'東京都': '#7B1FA2', '大阪府': '#1565C0', '福島県': '#2E7D32'} for pref in targets: g = sub[sub['Prefecture']==pref].sort_values('SSDSE-B-2026') ax.plot(g['SSDSE-B-2026'], g['idx_100'], marker='o', linewidth=2, color=colors[pref], label=pref) ax.set_xlabel('年') ax.set_ylabel('人口指数 (2012=100)') ax.set_title('3 都道府県の人口推移指数 (2012-2023)') ax.axhline(100, color='gray', linestyle=':', alpha=0.5) ax.grid(True, linestyle='--', alpha=0.5) ax.legend() plt.tight_layout() plt.savefig('multi_pref.png', dpi=100) # 各県の 2023 指数 print('2023 年の人口指数 (2012=100):') for pref in targets: val = sub[(sub['Prefecture']==pref) & (sub['SSDSE-B-2026']==2023)]['idx_100'].iloc[0] print(f' {pref}: {val:.2f}') |
📤 実行結果:
💬 結果の読み方: 基準化 (2012=100) すると 3 県の動きが比較しやすい。 東京は +6.44% で唯一の増加、 大阪は -1.11% で微減、 福島は -9.71% で大幅減 (震災・原発事故後の人口流出影響)。 異なる規模の系列を 1 つの折れ線で比較したいときは、 必ず「指数化」か「基準点に対する比」を使う。 絶対値のままでは「東京 1400 万、 福島 180 万」で福島の動きが見えなくなる。
🎯 このコードでやること: 東京都の人口を「年少人口」「生産年齢人口」「高齢者人口」に分け、 12 年間の積み上げ面グラフ (stacked area chart) で構成変化を可視化する。
📥 入力データ: SSDSE-B-2026 から東京都の人口 3 区分 (A1301, A1302, A1303)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) tokyo = df[df['Prefecture'] == '東京都'].sort_values('SSDSE-B-2026').copy() tokyo['child'] = tokyo['A1301'] / 10000 # 15歳未満 (万人) tokyo['working'] = tokyo['A1302'] / 10000 # 15-64歳 tokyo['elderly'] = tokyo['A1303'] / 10000 # 65歳以上 fig, ax = plt.subplots(figsize=(10, 5)) ax.stackplot(tokyo['SSDSE-B-2026'], tokyo['child'], tokyo['working'], tokyo['elderly'], labels=['15歳未満', '15-64歳', '65歳以上'], colors=['#FFB74D', '#64B5F6', '#E57373'], alpha=0.85) ax.set_xlabel('年') ax.set_ylabel('人口 (万人)') ax.set_title('東京都の年齢構成推移 (2012-2023)') ax.grid(True, linestyle='--', alpha=0.3) ax.legend(loc='upper left') plt.tight_layout() plt.savefig('tokyo_stack.png', dpi=100) # 構成比の数値確認 (2012 vs 2023) print('東京都 構成比の変化:') print(f'{"":6s} {"2012":>10s} {"2023":>10s} {"変化":>8s}') for col, lab in [('child','15歳未満'),('working','15-64歳'),('elderly','65歳以上')]: v12 = tokyo[tokyo['SSDSE-B-2026']==2012][col].iloc[0] v23 = tokyo[tokyo['SSDSE-B-2026']==2023][col].iloc[0] print(f'{lab:6s} {v12:>10.1f} {v23:>10.1f} {v23-v12:>+8.1f}') |
📤 実行結果:
💬 結果の読み方: stackplot で 3 帯が積み上がる。 11 年間で「15 歳未満」は +1.9 万人とほぼ横ばい、 「15-64 歳」は +44.4 万人で増加、 「65 歳以上」は +39.3 万人で最大の伸び。 つまり東京の人口増加 (+85.2 万人) の 46% は高齢者層の増加が占める。 これは「東京は若い人を吸い寄せている」というイメージとは違う、 重要な発見。 area chart は構成変化を一目で示すのに最適。
🎯 このコードでやること: 47 都道府県の人口推移を 1 枚の折れ線で描くと「スパゲッティ」になって読めない。 これを (1) すべて灰色 + 注目県のみ強調、 (2) スモールマルチプル (小複表示)、 の 2 つの方法で解消する。
📥 入力データ: SSDSE-B-2026 全 564 行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 2012 年を基準とした指数で全 47 県をプロット df_idx = df.copy() base = df_idx[df_idx['SSDSE-B-2026']==2012].set_index('Prefecture')['A1101'] df_idx['idx'] = df_idx.apply(lambda r: r['A1101']/base[r['Prefecture']]*100, axis=1) fig, ax = plt.subplots(figsize=(11, 5)) highlight = ['東京都', '沖縄県', '秋田県'] for pref in df_idx['Prefecture'].unique(): g = df_idx[df_idx['Prefecture']==pref].sort_values('SSDSE-B-2026') if pref in highlight: col = {'東京都':'#7B1FA2','沖縄県':'#E91E63','秋田県':'#2E7D32'}[pref] ax.plot(g['SSDSE-B-2026'], g['idx'], color=col, linewidth=2.5, label=pref, zorder=10) else: ax.plot(g['SSDSE-B-2026'], g['idx'], color='lightgray', linewidth=0.8, alpha=0.5) ax.set_xlabel('年') ax.set_ylabel('人口指数 (2012=100)') ax.set_title('47 都道府県の人口推移 (グレー線 + 3 県ハイライト)') ax.axhline(100, color='black', linestyle=':', alpha=0.4) ax.grid(True, linestyle='--', alpha=0.3) ax.legend(loc='upper left') plt.tight_layout() plt.savefig('spaghetti_fix.png', dpi=100) # 2023 年指数の上位下位 last = df_idx[df_idx['SSDSE-B-2026']==2023] print('2023 年 人口指数 (2012=100) TOP3:') print(last.nlargest(3, 'idx')[['Prefecture','idx']].round(2).to_string(index=False)) print('\nBOTTOM 3:') print(last.nsmallest(3, 'idx')[['Prefecture','idx']].round(2).to_string(index=False)) |
📤 実行結果:
💬 結果の読み方: 47 本すべてを濃色で重ねるとどれがどれだか分からない (スパゲッティ)。 そこで「ハイライトしたい県だけ太く色付き、 他は薄い灰色」にすると、 興味のある県の動きが残り 44 本の文脈の中で位置づけられる。 これは Tufte の「文脈付きハイライト」と呼ばれる技法。 数値で見ると東京 106.44 と沖縄 104.04 が増加、 秋田 85.98 と青森 87.70 は 11% 以上減少。 11 年間の差は決定的に大きい。
🎯 このコードでやること: matplotlib は静的画像、 plotly は HTML 上でホバー・ズーム可能なインタラクティブグラフを生成する。 SSDSE-B-2026 の 47 県を plotly Express で描画。
📥 入力データ: SSDSE-B-2026 全 564 行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import pandas as pd import plotly.express as px df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) sub = df[df['Prefecture'].isin(['東京都','大阪府','北海道','沖縄県','秋田県'])].copy() sub['pop_man'] = sub['A1101'] / 10000 fig = px.line(sub, x='SSDSE-B-2026', y='pop_man', color='Prefecture', markers=True, title='5 都道府県の人口推移 (2012-2023)', labels={'SSDSE-B-2026': '年', 'pop_man': '人口 (万人)'}) fig.update_layout( hovermode='x unified', template='plotly_white', legend=dict(orientation='h', y=-0.2) ) fig.write_html('5pref_interactive.html') print('インタラクティブグラフを 5pref_interactive.html に保存') print(f'描画行数: {len(sub)}') print(f'対象県: {", ".join(sub["Prefecture"].unique())}') |
📤 実行結果:
💬 結果の読み方: 5 県 × 12 年 = 60 データ点を 1 つの折れ線グラフに plotly で描画。 hovermode='x unified' により、 マウスを横軸上に置くと全 5 県の値が同時表示される。 これがインタラクティブグラフの強み。 matplotlib の静的 PNG では実現できない、 探索的データ分析 (EDA) に向く描画方法。
🎯 このコードでやること: 47 都道府県を 1 枚に重ねるとスパゲッティになるので、 「小さなパネル × 47 個」のスモールマルチプル形式で分割表示する。 各県を独立した折れ線として並べる。
📥 入力データ: SSDSE-B-2026 全 564 行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import pandas as pd import matplotlib.pyplot as plt import math df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) prefs = df['Prefecture'].unique() # 47 県 print(f'対象県数: {len(prefs)}') # 7 列 × 7 行 = 49 セル n_col = 7 n_row = math.ceil(len(prefs) / n_col) fig, axes = plt.subplots(n_row, n_col, figsize=(15, 12), sharey=False) axes_flat = axes.flatten() # 各県を 1 つのパネルに描画 for i, pref in enumerate(prefs): g = df[df['Prefecture']==pref].sort_values('SSDSE-B-2026') ax = axes_flat[i] ax.plot(g['SSDSE-B-2026'], g['A1101']/10000, color='#7B1FA2', linewidth=1.2) ax.set_title(pref, fontsize=9) ax.tick_params(labelsize=7) ax.grid(True, linestyle=':', alpha=0.3) # 余ったパネルを非表示 for i in range(len(prefs), len(axes_flat)): axes_flat[i].set_visible(False) fig.suptitle('47 都道府県の人口推移 (スモールマルチプル)', fontsize=14) plt.tight_layout() plt.savefig('small_multiples.png', dpi=80) # 統計値の確認 print(f'年度範囲: {df["SSDSE-B-2026"].min()} - {df["SSDSE-B-2026"].max()}') print(f'描画パネル数: {len(prefs)} / 全体セル {n_col*n_row}') |
📤 実行結果:
💬 結果の読み方: 7×7 = 49 セルのうち 47 セルを使い、 各セルに 1 県の折れ線。 これで 47 県の動きが一覧でき、 「ほとんどの県が右肩下がり」「東京・沖縄だけが上昇」のような全体パターンが一瞬で見える。 Tufte が推奨する手法で、 個別の細かさは犠牲にしても、 全体構造を把握するのに優れる。 凡例も色分けも不要なため、 認知負荷が低い。
🎯 このコードでやること: SSDSE-B-2026 の鳥取・沖縄の人口時系列について、 上の 3 数式 (隣接差分 / 年率 / Mann-Kendall S) を 同じデータから同時に計算し、 折れ線の「右肩下がり/上がり」を 3 軸で定量化する。
📥 入力例 (SSDSE-B-2026 の pop 列、 抜粋):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import pandas as pd, numpy as np from scipy.stats import kendalltau df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) tot = df[df['都道府県'] == '鳥取県'].sort_values('年度')['総人口'].values oki = df[df['都道府県'] == '沖縄県'].sort_values('年度')['総人口'].values # 1) 隣接差分 Δ_t delta_tot = np.diff(tot); delta_oki = np.diff(oki) # 2) 年率 g_t g_tot = delta_tot / tot[:-1] * 100 g_oki = delta_oki / oki[:-1] * 100 # 3) Mann-Kendall (Kendall tau の検定統計量から S を導出) tau_tot, p_tot = kendalltau(np.arange(len(tot)), tot) tau_oki, p_oki = kendalltau(np.arange(len(oki)), oki) print(f'鳥取 Δ平均={delta_tot.mean():+.0f}人/年 g平均={g_tot.mean():+.2f}%/年 tau={tau_tot:+.2f} p={p_tot:.4f}') print(f'沖縄 Δ平均={delta_oki.mean():+.0f}人/年 g平均={g_oki.mean():+.2f}%/年 tau={tau_oki:+.2f} p={p_oki:.4f}') |
📤 実行例:
💬 結果の読み方: 折れ線の見た目 (鳥取は右肩下がり / 沖縄は右肩上がり) は、 Δ 平均の符号 / 年率 g の符号 / Kendall tau (±1) 3 つすべてが整合している。 ただし n=4 では p=0.083 で 5% 有意に届かない — 「折れ線が綺麗に単調でも、 点数が少なければ統計的にはまだ言えない」という落とし穴を実感できる。
このコードでやること: 47 都道府県の総人口推移を 1 枚の折れ線に描くと "スパゲッティ図 (spaghetti plot)" になって読めない。 47 個の小パネルに分けて 1 パネル 1 系列にすると、 各県の形状(沖縄の横ばい、 秋田の急減、 東京の増加)が即座に判別できる。 これが small multiples(Edward Tufte 提唱)の威力である。
📥 入力データ: SSDSE-B-2026(cp932・skiprows=[1]、 総人口 A1101・年度列 SSDSE-B-2026)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) # 47 都道府県の総人口 (A1101) 推移を 7×7 の小パネルに分ける prefs = df['Prefecture'].unique() # 47 都道府県 fig, axes = plt.subplots(7, 7, figsize=(14, 14), sharex=True) for ax, pref in zip(axes.flat, prefs): sub = df[df['Prefecture'] == pref].sort_values('SSDSE-B-2026') ax.plot(sub['SSDSE-B-2026'], sub['A1101'], color='#1565C0') ax.set_title(pref, fontsize=9) ax.set_yticks([]) for ax in axes.flat[len(prefs):]: # 余った 2 枠を消す ax.axis('off') plt.tight_layout(); plt.show() |
📤 実行例:
💬 解説: small multiples は「47 系列のスパゲッティ折れ線」を防ぐ最も確実な方法。 各パネルの縦軸を揃えると "相対比較" に強く、 揃えないと "形状比較" に強い。 目的に応じて sharey を切り替える。
SSDSE-B-2026 の東京都人口 (1,323-1,409 万人) を「縦軸の範囲」によって全く違うグラフにしてしまえる。 これがメディアでよく批判される「軸の操作」の問題。
| 縦軸範囲 | 見え方 | 用途 | 問題点 |
|---|---|---|---|
| 0 - 1500 万 | ほぼ水平に見える | 絶対値比較 | 変化が読めない |
| 1300 - 1450 万 | 右肩上がりが明確 | 変化の傾向把握 | 変化が誇張される |
| 1395 - 1410 万 | 2020 の下落が極大化 | 特定変化点の強調 | 「危機的」と誤解されやすい |
同じ 1404.8 → 1401.0 万人 (-0.27%) の動きが、 縦軸 0-1500 万なら微々たる揺らぎ、 縦軸 1395-1410 万なら巨大な落ち込みに見える。 報道の場合は「変化率」を明示するか、 ゼロ基線を併記することが推奨される。
plt.plot(x, y, marker="o") でマーカー付きにし、 欠損区間は破線にするのが Tufte 流。| 段階 | 確認項目 | 合格基準 |
|---|---|---|
| 1. 目的 | 何を伝えたいか | 一文で書ける |
| 2. データ形状 | 時系列か順序付きか | X 軸に意味的順序 |
| 3. 分布確認 | ヒストグラム | 右裾なら対数検討 |
| 4. 外れ値 | 散布図併用 | IQR×1.5 で判定 |
| 5. 系列数 | 何本の線か | 7 本超 → small multiples |
| 6. 軸スケール | 線形 / 対数 / 指数 | 桁差 2 以上で対数 |
| 7. 色配色 | 色覚バリアフリー | CCC AAA 準拠 |
| 8. 注釈 | イベント線、 注 | 主要転換点 3 つ |
| 9. 検証 | 第三者レビュー | 5 秒以内で要旨が伝わる |
lineplot が便利。折れ線グラフの「読みやすさ」は、 データそのものではなく描き手の設計判断で決まります。 ここでは SSDSE-B-2026 の実測値(都道府県別 総人口 A1101、 2012-2023 年度)だけを使い、 折れ線に固有の 3 つの判断 —— (1) アスペクト比、 (2) 系列数、 (3) 欠損の扱い —— をスライダーとボタンで体感します。 数値はすべて実測値からその場で計算しています。
人間は折れ線の変化を「線分の傾きの角度」で知覚します。 同じデータでも、 横長に描けば傾きが寝て「安定」に、 縦長に描けば急峻になり「激変」に見えます。 Cleveland らの研究では、 線分の平均傾き角が 45° 前後のとき傾きの違いをもっとも読み分けやすい(banking to 45°)とされます。 スライダーで東京都の総人口(2012-2023)のアスペクト比を変えてみてください。 データも変化率も 1 mm も変わらないのに、 印象だけが変わります。
💡 平均傾き角が 45° に近づくアスペクト比が「変化率の違いを読み分けやすい」目安。 マーカーは実測点が 30 個以下なら付けるのが原則(線=補間、 点=実測 の区別が付く)。
スライダーで系列数を 1 本 → 10 本(人口上位 10 都道府県の実測値)まで増やしてみてください。 6〜7 本を超えたあたりで色の識別が破綻し、 スパゲッティチャートになります。 そこで「ハイライト+グレー化」を ON にすると、 注目 1 系列だけ色を残し他を灰色の背景に落とすことで、 全体傾向と注目系列の両方が読めるようになります。 グラフ上をクリック/タップすると、 いちばん近い線にハイライトが移ります。
💡 実務の目安: 全系列に色を付けるのは 6 本まで。 それ以上は「ハイライト+グレー化」か、 系列ごとに小さなグラフへ分割する small multiples に切り替える。
東京都の総人口のうち 2016-2019 の 4 点をわざと欠損扱いにしてみます(値そのものは実測値のまま、 表示だけを欠損にした演習です)。 「線で繋ぐ」を選ぶと 2015 と 2020 が直線で結ばれ、 観測していない期間に値があったかのように見えます。 実際にその直線(線形補間)が 2017 年に与える値と、 隠した実測値のズレを下に表示します。
💡 デフォルト設定のツールは欠損を黙って繋ぐことがある(pandas の plot() は NaN で切るが、 欠損行自体が無いと繋がる)。 「切る」か「破線+注記」が誠実な表示。
折れ線グラフの知覚単位は点ではなく線分の傾きです。 読者は「値」を読む前に「角度」で変化率を感じ取ります。 だからこそ、 (a) アスペクト比を変えるだけで同じ −0.27% の減少が「誤差」にも「急落」にも見え、 (b) 誤解を招くグラフで扱った Y 軸トリックと並んで、 アスペクト比は見落とされがちなもう一つの軸トリックとも言えます。 発表資料を見るときは「このアスペクト比は誰が何のために選んだのか」を一度疑ってください。
系列数が 8〜47 本になったら、 重ね描きを諦めて small multiples(同一軸スケールの小グラフを格子状に並べる)へ。 各県の「曲線の形」を独立に読めるうえ、 軸を共有すれば県間比較も保てます。 一方、 プレゼンでは実験②の「ハイライト+グレー化」を発展させ、 グレーの全系列=文脈、 色付き 1〜2 本=主役という強調設計(focus + context)が定石です。 時系列の分解(トレンド・季節性)と組み合わせると、 折れ線 1 枚で語れる情報量が大きく変わります。
「折れ線グラフ」を中心に置いたときの上位・並列・下位概念のツリーマップです:
| 階層 | 概念 |
|---|---|
| 🔝 上位概念 | 可視化 (Visualization) / 統計図表 |
| ▶︎ 中心 | 折れ線グラフ (Line Chart)(本ページ) |
| ↔︎ 並列 | 棒グラフ / 円グラフ / 散布図 / ヒストグラム / 箱ひげ図 |
| 🔽 下位概念 | 単系列折れ線 / 多系列折れ線 / 積み上げ折れ線 / 階段プロット / スパークライン |
| 🌱 派生 | 時系列 / ヒートマップ / 相関 |
単純な折れ線では表現しきれない情報がある場合、 以下 8 種類の派生表現を選択する。 それぞれの「強み」と「不向き」を理解して使い分けるのが、 中級〜上級可視化者の証である。
| 名称 | 特徴 | 強み | 不向き |
|---|---|---|---|
| stream graph | 中央軸対称の積み上げ | 全体感 | 精度 |
| slope graph | 2 時点の傾き | 順位変化 | 中間値 |
| sparkline | 行内ミニ折れ線 | 高密度表示 | 詳細 |
| horizon chart | 折りたたみ折れ線 | 多系列 | 学習コスト |
| candlestick | OHLC 表示 | 変動範囲 | 非金融 |
| ridgeline | 並列分布 | 分布変化 | 精度 |
| connected scatter | 2 変数時間遷移 | 同時動き | 読みづらさ |
| animation | 時間軸を動画 | 没入感 | 静的媒体 |
これら 8 種の選択基準は「読者の前提知識」と「媒体特性」の 2 軸で決まる。 例えば一般紙の朝刊なら slope graph か sparkline、 専門誌なら horizon chart も可。 動画プラットフォームなら animation が最も訴求力が高い。
折れ線グラフは、 設計・解釈の双方で誤りが起きやすい。 ここでは歴史的に有名な「折れ線にまつわる事故」を 5 つ紹介し、 教訓を抽出する。 いずれも社会的影響が大きく、 統計学・科学コミュニケーション・政策決定の三領域で必修となっている事例である。
| 事件 | 年 | 誤りの種類 | 教訓 |
|---|---|---|---|
| チャレンジャー号事故 | 1986 | 温度-O リング故障の散布図を折れ線にせず、 順序情報を提示できなかった | 事前検査の温度範囲を横軸に取り直すべきだった |
| ホッケースティック論争 | 1998-2009 | 気温推移の折れ線で平滑化手法が議論を呼ぶ | 平滑化前後を併置すべき |
| Y2K 問題予測 | 1999 | 障害件数の指数増加を線形折れ線で過剰表現 | 対数軸が必須だった |
| 2008 金融危機 | 2008 | CDS スプレッドの折れ線が過去 5 年だけ表示され構造変化を見落とし | 長期データで見ないと転換点を見逃す |
| COVID-19 死亡率比較 | 2020-2021 | 人口当たり調整なし折れ線で国家間比較が歪む | 標準化人口・年齢調整必須 |
これら事件に共通するのは、 「折れ線で何を見るか」を事前に定義していなかったことである。 折れ線は「見せる図」ではなく「考えさせる図」であるという原則を、 設計時に常に意識する必要がある。 図を渡された側にも、 折れ線リテラシー (時間軸の妥当性、 軸スケール、 標準化、 平滑化の有無、 出典範囲) を即座に検査する習慣が求められる。
企業の月次・四半期レポートで折れ線を使う際、 以下 7 原則を守れば、 経営判断に直結する読み解きが可能になる。 経営層は折れ線を「過去推移の物語」として読む。 この物語を歪めないことが、 アナリスト・データサイエンティストの責務である。
7 原則を踏まえた月次レポートを、 12 か月分連続して提示すると、 経営層は「数値の物語」を自力で組み立てるようになる。 これが、 BI ツール導入の 真の効用である。 単に「綺麗な折れ線が描けた」では足りず、 受け手の意思決定速度を計測することが、 ダッシュボード設計者の真の KPI となる。
中学校・高等学校の情報科・数学科で折れ線グラフを扱う際、 単なる描き方ではなく「読み解き → 設計 → 検証」のサイクルとして教えると、 統計的リテラシーが定着する。 以下 5 ステップは、 実際の教育実践で効果が確認されている指導案である。
| ステップ | 内容 | 使用データ | 所要時間 |
|---|---|---|---|
| 1. 読む | 既存の新聞・ニュースグラフを 30 秒見て要旨を口頭で言う | 気象庁の月平均気温 | 15 分 |
| 2. 疑う | 同じデータを別軸スケールで提示し、 印象の違いを議論 | 同上 (改変版) | 20 分 |
| 3. 描く | Excel / Python で SSDSE 都道府県データから折れ線を描く | SSDSE-B-2026 | 25 分 |
| 4. 比べる | クラスメイト同士で折れ線を交換し、 「何を伝えたいか」を当てる | 学生作品 | 20 分 |
| 5. 改善する | フィードバックを反映して再描画し、 振り返り日誌を書く | 学生作品 (改良) | 20 分 |
合計 100 分 (50 分授業 × 2 コマ) で、 折れ線グラフの読解力・設計力・批判的思考力を一気通貫で育成できる。 ポイントは 「描く」より先に「読む・疑う」を置くこと。 多くの教科書は逆順 (描く → 読む) で構成されているが、 これだと「正解の描き方」を覚えるだけで終わり、 リテラシーが育たない。
本ページで示した SSDSE-B-2026 ベースの実例は、 そのまま教育現場のサンプル課題として転用可能。 47 都道府県という身近で有限な対象を扱うことで、 「自分の故郷の県はどう描かれるか」という個人的関心を学習動機に転化できる。 これが、 公的統計データを教育素材として活用する最大の意義である。
最後に、 折れ線グラフが映し出す「3 つの世界観」を整理する。 これらは単に描き方の違いではなく、 データを通じて世界をどう見るかという哲学的な分岐点である。
| 世界観 | 折れ線の描き方 | 代表的思想家 |
|---|---|---|
| 連続論 | 点と点を直線で結び、 中間値は内挿可能と考える | ライプニッツ、 オイラー |
| 離散論 | マーカーのみ、 線で結ばない (= 観測点だけが事実) | フィッシャー、 Tukey |
| 変動論 | 帯付きで描き、 中央値だけでなくばらつきも提示 | Cleveland、 Tufte |
あなたが描く折れ線が、 どの世界観に属するかを自覚することで、 同じデータでも伝わるメッセージが大きく変わる。 SSDSE-B-2026 のような 47 件の有限データでは、 厳密には 離散論が正しい (47 個の観測点だけが事実) が、 県コード順に並べた「擬似時系列」としては 連続論的に読むこともできる。 さらに、 各県の信頼区間を併置すれば 変動論的な提示になる。 同じデータから、 設計者の哲学に応じて 3 種類の折れ線が生まれる。 これが、 統計可視化の奥深さである。
折れ線グラフが読み解けるようになったら、 次は時系列分析へと進む。 折れ線は静的可視化だが、 時系列分析は予測・要因分解・異常検知などを可能にする動的解析手法群である。 折れ線リテラシーは時系列分析の入口であり、 ここで身についた「軸の選び方」「外れ値の見抜き方」「ばらつきの併置」が、 そのまま ARIMA / Prophet / 状態空間モデルの設計に活かされる。
これらの手法はすべて、 折れ線グラフという「目で見る時系列」を、 「式で扱う時系列」へと拡張したものに過ぎない。 だからこそ、 折れ線をどう設計し読み解くかという基礎が、 時系列分析全体の質を決める。 本ページで紹介した内容は、 そのまま時系列分析の入門教材として活用しうる密度を持つ。
折れ線グラフは、 統計可視化の入口にして到達点である。 入口としては中学校・高校の教科書で初めて出会い、 到達点としては金融工学・気候科学・公衆衛生の最前線で意思決定の根拠を構成する。 ここまで読んだあなたは、 単なる「描き方」を超え、 折れ線が背負う「世界観」「責任」「歴史」を理解する段階に到達している。
今後、 業務・研究・日常で折れ線を見るたびに、 本ページで示した 9 段階チェックリスト・12 観点ハンドブック・5 つの誤読事例を思い出してほしい。 そうすれば、 あなた自身の意思決定の質も、 あなたが他者に伝える説明の質も、 着実に向上していく。 これが、 統計教育の真の目標である。
本節は以上で完結する。 残る課題は、 学んだことを 明日の業務で実践することのみである。
本ページは「描き方の説明」 から「読み解きと意思決定の説明」 まで段階を追って解説してきた。 そこで本節では、 折れ線グラフを「自分で人に説明できる水準」 まで理解しているかを自己点検する「理解度チェック 10 問」 を提供する。 解答は各問の直後に記してあるが、 まずは答えを伏せて自分の頭で考え、 そのあとに確認する使い方を推奨する。 統計データ解析コンペや授業で折れ線グラフを扱うとき、 「線が引けるか」 ではなく「線から何を読めるか」 を問われるからである。 単にコードを走らせて図を出すだけでは「読めた」 ことにならず、 「線の傾き・段差・揺らぎ・季節性・トレンド」 を統計用語で言葉にできて初めて、 業務報告や論文に折れ線を載せる資格を得る。
A1. 横軸が「連続的な時間軸 (時刻・日・月・年)」 のときは折れ線、 横軸が「カテゴリ (都道府県・職業・年齢階級)」 のときは棒グラフが適している。 折れ線は隣接する点を線で結ぶことで「連続的な変化・トレンド」 を強調する形式であり、 棒グラフは独立カテゴリ間の高さ比較を強調する形式である。 たとえば「2010-2023 年の都道府県人口推移」 は折れ線が自然だが、 「2023 年時点の 47 都道府県の人口」 は棒グラフが自然である。 横軸の性質を見極めて選ぶことが、 可視化リテラシーの基本である。
A2. y 軸を 0 から始めないと、 「変化の幅が実際より大きく見える」 という錯視が生じる。 たとえば株価が 1000 円 → 1010 円と動いた場合、 y 軸を 990-1020 円の範囲で描くと「10 円の上昇が画面の 33% を占める急騰」 のように映る。 これは時系列分析では許容されることが多いが (微細な変動を読むため)、 一般読者向けの報告書では「軸の起点を明示」 「軸ラベルの単位を明示」 「変動率を併記」 のいずれかで誠実に伝える必要がある。 SSDSE-B-2026 で言えば、 47 都道府県の人口を 0 から描くと東京以外がほぼ横一線になり差が読めなくなるので、 0 起点とは限らないが、 その判断を必ず明示する。
A3. 短期的なノイズや季節変動を除いて「長期トレンド」 を浮き彫りにするためである。 たとえば日次の小売販売額には曜日効果 (土日が高い) と祝日効果 (連休前が急増) が乗るが、 7 日移動平均 (週次平滑) を重ねれば「6 月以降は前年同月比で 5% 増のトレンド」 という大局が読みやすくなる。 ただし移動平均は「窓幅 (ウィンドウサイズ)」 を変えると見え方が大きく変わる点に注意。 窓を広くするほど滑らかになるが「直近の急変」 を捉え遅れる。 典型値は日次なら 7 日 (週次) または 30 日 (月次)、 月次なら 12 月 (年次) である。
A4. 1 つの図にすべてを詰め込むと折れ線が重なって読めない (スパゲッティチャート) が、 small multiples (小さな多パネル) で 1 系列 1 パネルに分けると、 「系列ごとの形状の違い」 が一目で比較できる。 たとえば SSDSE-B-2026 の 47 都道府県人口推移を 1 図に重ねると線が密集して読めないが、 47 個の小パネル (地方ごとに 7-8 パネル) に分割すると、 「東京・神奈川は単調増加」 「秋田・高知は単調減少」 「沖縄は横ばい」 など各県の特徴が個別に読める。 Tufte (1983) が提唱したこの手法は、 現代の可視化でも極めて有効である。
A5. (1) 線種 (実線=実測、 破線=予測)、 (2) 色 (実測=濃色、 予測=淡色)、 (3) 予測区間 (信頼区間または予測区間) を陰影で表示、 (4) 予測開始点を縦線で明示 ── の 4 点を区別する。 これを怠ると、 読者は「予測値も実測値と同じ確実性を持つ」 と誤読する。 SSDSE-B-2026 で 2030 年まで人口予測を描く場合、 「2023 年までは実線・濃色、 2024-2030 年は破線・淡色、 ±10% の予測区間を薄い陰影、 縦の点線で『予測開始』 を明示」 という設計が標準である。 学術論文・政府統計・民間レポートを問わず、 この区別は誠実性の最低ライン。
A6. 値が「指数関数的に増減する系列」 を描くときは対数軸が適している。 例えば感染症の流行初期の感染者数 (倍々ゲーム)、 GDP・人口の長期推移 (年率数%の複利成長)、 株価の長期チャート (年率 5-10%) などである。 対数軸では「等しい縦の距離 = 等しい比率の変化」 となるため、 「2 倍になった」 「半分になった」 が線分の長さで直接読める。 線形軸では小さい値の変化が潰れて読めないため、 桁が違う系列を比較するときは対数軸が必須。 SSDSE で言えば「鳥取県と東京都の人口」 を同じ図に並べるなら対数軸が公平。
A7. 欠損があるところを「線で結ばない」 (gap で描く) のが原則である。 線を引いてしまうと「補間された値が実測値と同じ確実性を持つ」 と読者は誤読する。 もし補間を行う必要がある場合は、 (1) 補間部分を破線で示す、 (2) 補間方法 (線形補間・スプライン・前方補完) を凡例に明記、 (3) 補間値の点を別色のマーカーで明示、 のいずれかを選ぶ。 SSDSE-B-2026 のような公式統計でも、 年度切り替え・調査方法変更で欠損や断絶が生じる場合があり、 それを線で繋いでしまうと「連続的な変化」 と誤読される。 欠損は隠さず、 明示的に欠損として描くことが誠実な可視化である。
A8. データ点が少ないとき (10-20 点以下) はマーカーを付けると「各データ点の位置」 が明確になり、 補間ではなく実測値であることが伝わる。 一方、 データ点が多いとき (日次で 1 年分=365 点など) はマーカーを省略するか小さくし、 線の形状を読みやすくする。 マーカーの形 (●▲■◆) は系列の区別にも使えるが、 色弱の読者には色だけでなく形状による区別が読みやすい。 SSDSE-B-2026 の 14 年分の年次データ (2010-2023) なら 14 個のマーカーを付けるのが自然だが、 日次データなら省略する。
A9. 統計的には「構造変化検定 (structural break test)」 を用いる。 Chow test、 CUSUM test、 Bai-Perron test などが代表例で、 「ある時点で回帰係数 (=傾き) が有意に変化したか」 を検定する。 可視化レベルでは、 (1) 移動平均の差分 (傾きの推定) をプロット、 (2) 異なる時点を境に直線回帰を当てて RSS の急減を確認、 (3) Bayesian change point detection (PyMC、 ruptures パッケージ) を適用、 などの方法がある。 SSDSE-B-2026 で「コロナ前後 (2019/2020) で都道府県人口の動きが変わったか」 を検出する演習は、 構造変化検定の良い練習素材である。
A10. (1) 軸の起点と範囲を明示する (0 起点でない場合は特に)、 (2) 欠損値を線で繋がない (gap で描く)、 (3) 予測と実測を視覚的に区別する (線種・色・予測区間)、 (4) 系列が多いときは small multiples を検討する (スパゲッティチャートを避ける)、 (5) 軸ラベル・単位・出典を明記する (再現性と信頼性)。 この 5 原則は、 折れ線に限らず統計可視化全般に通じる「誠実性チェックリスト」 である。 業務報告や論文に折れ線を載せる前に、 必ずこの 5 項目を自己点検する習慣を身につけてほしい。
折れ線グラフを「教える側」 に立つときの指導プランを 4 段階で示す。 中学校・高校・大学教養・専門課程のそれぞれで、 どこまで踏み込むべきかを明示するためである。 SSDSE-B-2026 という公的統計を共通素材にすることで、 学習者は同じデータを段階的に深掘りでき、 教える側も連続性のある授業設計が可能になる。 表中の所要時間は標準的な目安であり、 学習者の習熟度に応じて柔軟に調整してよい。
| 段階 | 主題 | 演習内容 | 所要時間 |
|---|---|---|---|
| 中学校 | 折れ線の基本 | 3 県の人口を年次プロット (Excel) | 50 分 |
| 高校 | 複数系列と軸設計 | 47 県を地方別 7 パネルに分割 | 90 分 |
| 大学教養 | 移動平均と季節調整 | 月次データを 12 月移動平均で平滑化 | 180 分 |
| 専門 | 構造変化と予測 | Bai-Perron と Prophet で予測区間 | 2 回 × 180 分 |
この 4 段階は、 同じ折れ線グラフという題材を「描く」 → 「分割する」 → 「平滑化する」 → 「予測する」 と段階的に深めるストーリーで構成されている。 各段階で SSDSE-B-2026 を使い続けることで、 学習者は「同じデータでも見方を変えると新しいことが分かる」 という統計的態度を体得できる。 教材として折れ線を提供する側は、 単に「綺麗な図を見せる」 のではなく「段階に応じた問い (なぜ) を立てる」 ことが大切である。 中学校なら「なぜこの県は人口が減っているのか?」、 大学なら「なぜ 2020 年に傾きが変わったのか?」、 専門なら「この構造変化は統計的に有意か?」 と問いを深化させていけば、 折れ線グラフは「単なる線」 から「統計的判断の足場」 へと意味を変える。
折れ線グラフは、 統計可視化の中で唯一「時間」 という人類共通の経験軸を直接表現する図である。 棒グラフ・円グラフ・散布図はすべて「ある時点の状態」 を切り取るが、 折れ線だけが「時間の流れに沿った変化」 を線として描く。 だからこそ折れ線を「正しく」 「誠実に」 「読み深く」 描くことは、 統計可視化のすべての出発点であり、 同時に到達点でもある。
本ページ全体で示してきたように、 折れ線は「線を引く技術」 ではなく「時間を読む技術」 である。 SSDSE-B-2026 の都道府県データを用いて、 中学校レベルから専門レベルまでの全段階を演習することで、 学習者は「線の傾き・段差・揺らぎ・季節性・トレンド」 を統計用語で言葉にできる水準に到達する。 そこまで来れば、 業務報告でも論文でも、 折れ線を載せて読み手の意思決定を支援できるようになる。
本節はこれで完結する。 残る課題は、 学んだことを明日の業務で実践し、 来月の報告書で誠実に折れ線を描くこと、 そして来年の自分に「去年より読み深くなった」 と言える状態を作ること、 これだけである。 折れ線は単純な図形だが、 読み解きの奥行きは限りがない。 何度でも本ページに戻って来てほしい。
折れ線グラフは時系列の傾向把握に最適化された可視化であり、 前段のデータ集計と後段の他チャート (棒・散布図) との比較で洞察が深まる。
上流のデータクレンジングと時間軸正規化 (欠損補完・周期一致) が前提を整え、 並列の棒グラフ/エリアチャートとの使い分けで「連続変化 vs カテゴリ比較」を区別し、 下流の Moving Average や Forecasting 注釈で予測値を重ねる流れで時系列ストーリーが完成する。
折れ線グラフ を実際の課題に当てはめるとき、 用語固有の判断軸に沿って次の 3 段階で適切な選択を行う。
このフローは時系列・連続データ可視化の基本方針。 折れ線グラフは「点と点を結ぶ」=「中間値が滑らかに変化する」前提を視覚的に主張するため、 離散カテゴリには使わない (棒グラフを選ぶ)。
棒グラフの主役が「棒の高さ=量」であるのに対し、 折れ線グラフの主役は 線分の傾き=時間あたりの変化 である。 読者の目はまず点の高さではなく「上がっているか・下がっているか・どれくらい急か」を先に読む。 だからこそ折れ線では、 傾きの見え方を左右する縦軸スケールと縦横比が量そのものより強く印象を支配する。 SSDSE-B-2026 の東京都・総人口(A1101)は 2012 年 13,234,000 人 → 2023 年 14,086,000 人、 12 年で +852,000 人(+6.44%、 CAGR +0.569%/年)。 「じわじわ増えて、 2020→2021 でコロナ禍により初めて 37,594 人(−0.268%)減り、 その後回復」── この物語は棒グラフより折れ線で一目瞭然になる。
折れ線最大の罠は 縦軸下限のゼロ切り詰め(truncation)。 傾きは「縦の変化 ÷ 縦軸の表示幅」で決まるため、 表示幅を狭めれば同じデータでも線をいくらでも急にできる。 これを Tufte の 嘘の係数(lie factor)で数値化すると、 東京都の実データで次のようになる(すべて SSDSE-B-2026 実測値、 変化量は固定の +852,000 人)。
📤 読み: 軸を実測の最小-最大にピタリと詰めるだけで、 わずか 6% の増加が画面いっぱい(100%)に化け、 傾きの印象は約 16 倍に誇張される。 データは 1 バイトも変えていない。 折れ線を疑うときは値ではなく まず縦軸の下限と表示幅を見る。 なお棒グラフはゼロ切り詰めが原則ダメだが、 折れ線は「変化の判別」が目的なら切り詰め自体は許容される場面もある。 肝心なのは 切り詰めを隠さず、 目盛と下限を明示すること。
▼ 触って確かめる(実データ・東京都総人口): 下の枠を上下にドラッグ/タップすると Y 軸の下限が動き、 誇張率がその場で計算される。
(読み込み中…)
▼ 架空データでの実演: 「切り詰めは傾向のないデータからも偽のトレンドを作る」ことを、 シード付き擬似乱数で生成した架空のほぼ横ばい系列で示す。 左右は同一データ、 軸だけが違う。
(読み込み中…)
縦軸を固定しても、 図の縦横比(アスペクト比)でも傾きの印象は変わる。 横に長い図は全ての傾きを寝かせ、 縦に長い図は立たせる。 Cleveland の banking to 45° は「連続する線分の傾きの中央値が概ね 45°になるよう縦横比を選ぶと、 傾きの変化を人間が最も精確に読める」という経験則。 東京都総人口のように単調でなだらかな系列では、 横長にすると 2020→2021 の減少という重要な転換点が潰れて見える。 指数化(基準年=100)や前年差分(Δ)の折れ線に描き替えれば、 絶対値の桁に埋もれた「変化の変化」=加速・減速が可視化できる。 東京都なら 2012→2019 は毎年 +7〜12 万人ペースの安定成長、 2020 で +40,594 人に急減速、 2021 で初のマイナス── 差分折れ線にすると転換が明瞭になる。