このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
2011年3月11日に発生した東日本大震災とそれに伴う津波・福島第一原子力発電所事故は、東北3県(岩手・宮城・福島)に甚大な人的・物的被害をもたらした。被災地では長期にわたる避難生活が続き、住民の身体的・精神的健康への影響が懸念されてきた。
まず「東日本大震災後の避難生活と健康影響」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
本研究は、都道府県別統計データ(SSDSE-B)を用い、震災後の東北3県における保健医療費・人口移動・病院数の変化を全国平均と比較することで、長期的な健康影響と復興の実態を定量的に把握することを目的とする。
SSDSE-B 時系列分析 断絶時系列(ITS) 地域差比較 パネルデータ
統計センターが公表するSSSSE-B(社会・人口統計体系 都道府県別データ)2026年版を使用。47都道府県 × 12年度(2012〜2023年度)のパネルデータから以下の変数を分析に用いた。
| 変数 | 単位 | 分析での役割 |
|---|---|---|
| 保健医療費(二人以上の世帯) | 円 / 月 / 世帯 | 健康状態の代理変数(目的変数) |
| 転入者数(日本人移動者) | 人 | 人口移動の把握 |
| 転出者数(日本人移動者) | 人 | 人口移動の把握 |
| 総人口 | 人 | 比率計算の分母 |
| 一般病院数 | 施設 | 医療インフラの指標 |
| 区分 | 都道府県 | 地域コード |
|---|---|---|
| 東北3県 | 岩手県・宮城県・福島県 | R03000, R04000, R07000 |
| 全国(47都道府県) | 東北3県を含む全都道府県 | — |
| その他(44都道府県) | 東北3県を除く都道府県 | — |
転入超過率 = (転入者数 − 転出者数)/ 総人口 × 1000(人 / 千人)
1 2 3 4 5 6 7 8 9 10 | df_b = pd.read_csv(DATA_B, encoding='cp932', header=1) df_b = df_b[df_b['地域コード'].str.match(r'^R\d{5}$', na=False)].copy() # 数値変換 num_cols = [ '総人口', '保健医療費(二人以上の世帯)', '消費支出(二人以上の世帯)', '一般病院数', '転出者数(日本人移動者)', '転入者数(日本人移動者)', ] for c in num_cols: df_b[c] = pd.to_numeric(df_b[c], errors='coerce') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。pd.read_csv(...) でCSVを読み込みます。encoding='cp932' は日本語Windows由来の文字コード、header=1 は「2行目を列名として使う」。df['地域コード'].str.match(r'^R\d{5}', ...) — 正規表現で「R+数字5桁」の行(47都道府県)だけTrueにし、真偽値で行をフィルタ。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # 東北3県フラグ TOHOKU_CODES = ['R03000', 'R04000', 'R07000'] TOHOKU_NAMES = {'R03000': '岩手県', 'R04000': '宮城県', 'R07000': '福島県'} df_b['東北フラグ'] = df_b['地域コード'].isin(TOHOKU_CODES) # 東北3県・その他に分割 df_tohoku = df_b[df_b['東北フラグ']].copy() df_other = df_b[~df_b['東北フラグ']].copy() years = sorted(df_b['年度'].unique()) print("=" * 60) print("■ データ概要") print("=" * 60) print(f" 総観測数: {len(df_b)} 行 ({df_b['都道府県'].nunique()} 都道府県 × {len(years)} 年度)") print(f" 期間 : {years[0]}〜{years[-1]} 年度") print(f" 東北3県 : {', '.join(TOHOKU_NAMES.values())}") print(f" その他 : {df_b['都道府県'].nunique() - 3} 都道府県") print() |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。30 31 32 33 34 35 36 37 38 | # ── 各年度の集計 ──────────────────────────────────────────────── def yearly_stats(df, col): """年度ごとに集計(平均)""" return df.groupby('年度')[col].mean() # 東北3県の年度別平均 tohoku_health = yearly_stats(df_tohoku, '保健医療費(二人以上の世帯)') tohoku_hosp = yearly_stats(df_tohoku, '一般病院数') tohoku_pop = yearly_stats(df_tohoku, '総人口') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。39 40 41 42 43 44 45 | # 全国平均(東北含む47都道府県平均) nation_health = yearly_stats(df_b, '保健医療費(二人以上の世帯)') nation_hosp = yearly_stats(df_b, '一般病院数') # その他44都道府県の年度別平均 other_health = yearly_stats(df_other, '保健医療費(二人以上の世帯)') other_hosp = yearly_stats(df_other, '一般病院数') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。46 47 48 49 50 51 52 53 54 55 56 57 58 59 | # ── 人口変化率(転入−転出): 東北3県個別 ──────────────────────── def net_migration_rate(df): """転入超過数 / 総人口 × 1000(千人あたり)""" g = df.groupby('年度') net = g['転入者数(日本人移動者)'].mean() - g['転出者数(日本人移動者)'].mean() pop = g['総人口'].mean() return (net / pop * 1000) net_rate = {} for code in TOHOKU_CODES: df_pref = df_b[df_b['地域コード'] == code] net_move = df_pref['転入者数(日本人移動者)'] - df_pref['転出者数(日本人移動者)'] rate = (net_move / df_pref['総人口'] * 1000).values net_rate[TOHOKU_NAMES[code]] = pd.Series(rate, index=df_pref['年度'].values) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。60 61 62 63 64 65 66 67 68 69 70 71 72 73 | # ── 期間統計サマリ ─────────────────────────────────────────────── early_yrs = [2012, 2013, 2014] recovery_yrs = [2019, 2020, 2021, 2022, 2023] print(" 【保健医療費(二人以上の世帯)年度別平均(円)】") print(f" {'年度':<8} {'東北3県':>10} {'全国平均':>10} {'差':>10}") print(" " + "-" * 42) for yr in years: t_val = tohoku_health.get(yr, float('nan')) n_val = nation_health.get(yr, float('nan')) diff = t_val - n_val marker = " ←早期" if yr in early_yrs else " ←回復" if yr in recovery_yrs else "" print(f" {yr:<8} {t_val:>10,.0f} {n_val:>10,.0f} {diff:>+10,.0f}{marker}") print() |
============================================================ ■ データ概要 ============================================================ 総観測数: 564 行 (47 都道府県 × 12 年度) 期間 : 2012〜2023 年度 東北3県 : 岩手県, 宮城県, 福島県 その他 : 44 都道府県 【保健医療費(二人以上の世帯)年度別平均(円)】 年度 東北3県 全国平均 差 ------------------------------------------ 2012 11,551 12,258 -707 ←早期 2013 11,494 12,138 -645 ←早期 2014 11,318 12,133 -815 ←早期 2015 12,611 12,268 +342 2016 13,627 12,694 +933 2017 13,764 12,491 +1,273 2018 12,167 12,852 -686 2019 12,674 13,514 -841 ←回復 2020 12,677 13,740 -1,063 ←回復 2021 12,620 13,787 -1,167 ←回復 2022 13,678 14,390 -712 ←回復 2023 14,882 14,423 +458 ←回復
df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | ax3a.axvspan(2011.7, 2014.3, color=SHADE_EARLY, alpha=0.6, zorder=0) ax3a.axvspan(2018.7, 2023.3, color=SHADE_RECOVER, alpha=0.6, zorder=0) for code, color in zip(TOHOKU_CODES, [COLOR_IWATE, COLOR_MIYAGI, COLOR_FUKUSHIMA]): df_pref = df_b[df_b['地域コード'] == code].sort_values('年度') ax3a.plot(df_pref['年度'], df_pref['一般病院数'], color=color, linewidth=2.5, marker='o', markersize=5, label=TOHOKU_NAMES[code], zorder=3) ax3a.set_xlabel('年度', fontsize=11) ax3a.set_ylabel('一般病院数(施設)', fontsize=11) ax3a.set_title('東北3県の一般病院数', fontsize=11, fontweight='bold') ax3a.set_xticks(years) ax3a.legend(fontsize=10) ax3a.grid(True, alpha=0.3, axis='y') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。保健医療費(家計支出のうち医療・保健関連の支出)は、住民の健康状態を反映する代理変数として広く利用される。健康状態が悪化するほど医療機関への受診や薬の購入が増加し、保健医療費が上昇する傾向がある。
断絶時系列分析は、政策介入や突発的事象(ここでは東日本大震災)の前後で時系列トレンドがどのように変化したかを定量化する手法である。本研究では「視覚的ITS」として期間帯シェーディングにより早期復興期・回復期を区分し、トレンドの変化を視覚的に確認している。
数式では次のように表現する:
91 92 93 94 95 96 97 98 99 100 101 102 103 | fig1, ax1 = plt.subplots(figsize=(11, 6)) # 期間帯シェーディング ax1.axvspan(2011.7, 2014.3, color=SHADE_EARLY, alpha=0.7, label='早期復興期(2012-2014)', zorder=0) ax1.axvspan(2018.7, 2023.3, color=SHADE_RECOVER, alpha=0.7, label='回復期(2019-2023)', zorder=0) # 東北3県個別 for code, color in zip(TOHOKU_CODES, [COLOR_IWATE, COLOR_MIYAGI, COLOR_FUKUSHIMA]): df_pref = df_b[df_b['地域コード'] == code].sort_values('年度') ax1.plot(df_pref['年度'], df_pref['保健医療費(二人以上の世帯)'], color=color, linewidth=2.5, marker='o', markersize=5, label=TOHOKU_NAMES[code], zorder=3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | # 全国平均 ax1.plot(nation_health.index, nation_health.values, color=COLOR_NATION, linewidth=2.0, linestyle='--', marker='s', markersize=4, label='全国平均(47都道府県)', zorder=2) ax1.set_xlabel('年度', fontsize=12) ax1.set_ylabel('保健医療費(円 / 月 / 世帯)', fontsize=12) ax1.set_title('保健医療費の時系列推移:東北3県 vs 全国平均\n' '(SSDSE-B 2012〜2023年度, 二人以上世帯)', fontsize=13, fontweight='bold') ax1.set_xticks(years) ax1.legend(fontsize=10, loc='upper left') ax1.grid(True, alpha=0.3, axis='y') ax1.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:,.0f}')) plt.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2022_U5_2_fig1_ts_health.png'), bbox_inches='tight', dpi=150) plt.close(fig1) print("図1保存: 2022_U5_2_fig1_ts_health.png") |
図1保存: 2022_U5_2_fig1_ts_health.png
r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。大規模災害の後、被災地では避難による人口流出が生じる。東北3県では震災直後から長期にわたり転出超過が続いた。特に福島県は原子力発電所事故による避難指示の影響で転出圧力が持続した。
| 県 | 早期復興期(2012-2014)の傾向 | 回復期(2019-2023)の傾向 |
|---|---|---|
| 岩手県 | 転出超過(震災・津波被害) | 転出超過が継続するも縮小傾向 |
| 宮城県 | 比較的転出超過は限定的(復興特需) | 安定的な推移 |
| 福島県 | 最大の転出超過(原発避難) | 転出超過が縮小するも他2県より継続 |
東北3県と全国平均を比較することは、差の差法(DiD)の考え方に基づいている。震災前後の変化を「処置群(東北3県)」と「対照群(その他44都道府県)」で比較することで、震災固有の影響を推定できる。
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | fig2, ax2 = plt.subplots(figsize=(11, 6)) ax2.axvspan(2011.7, 2014.3, color=SHADE_EARLY, alpha=0.7, label='早期復興期(2012-2014)', zorder=0) ax2.axvspan(2018.7, 2023.3, color=SHADE_RECOVER, alpha=0.7, label='回復期(2019-2023)', zorder=0) ax2.axhline(0, color='black', linewidth=1.0, linestyle='-', alpha=0.5) for pref, color in zip(['岩手県', '宮城県', '福島県'], [COLOR_IWATE, COLOR_MIYAGI, COLOR_FUKUSHIMA]): s = net_rate[pref].sort_index() ax2.plot(s.index, s.values, color=color, linewidth=2.5, marker='o', markersize=5, label=pref, zorder=3) ax2.fill_between(s.index, s.values, 0, color=color, alpha=0.12, zorder=1) ax2.set_xlabel('年度', fontsize=12) ax2.set_ylabel('転入超過率(人 / 千人)', fontsize=12) ax2.set_title('東北3県の人口移動:転入超過率の推移\n' '(転入者数 − 転出者数) / 総人口 × 1000', fontsize=13, fontweight='bold') ax2.set_xticks(years) ax2.legend(fontsize=10, loc='upper right') ax2.grid(True, alpha=0.3, axis='y') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。ax.fill_between(...) — 2つの曲線で囲まれた領域を塗りつぶし。Lorenz曲線の格差面積などを可視化。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | # 2012年の値にラベル付与 for pref, color, code in zip(['岩手県', '宮城県', '福島県'], [COLOR_IWATE, COLOR_MIYAGI, COLOR_FUKUSHIMA], TOHOKU_CODES): s = net_rate[pref].sort_index() ax2.annotate(f'{s.iloc[0]:+.1f}', xy=(s.index[0], s.iloc[0]), xytext=(-18, 8), textcoords='offset points', fontsize=8.5, color=color, fontweight='bold') plt.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2022_U5_2_fig2_population.png'), bbox_inches='tight', dpi=150) plt.close(fig2) print("図2保存: 2022_U5_2_fig2_population.png") |
図2保存: 2022_U5_2_fig2_population.png
x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。震災は医療インフラにも直接的な被害を与えた。津波により沿岸部の医療機関が流失・損壊し、その後の復旧状況は地域の医療アクセスに大きく影響した。一般病院数の変化を全国と比較することで、医療インフラの回復状況を定量的に把握する。
| 視点 | 東北3県 | 全国(東北以外) | 解釈 |
|---|---|---|---|
| 実数変化(2012→2023) | 個別の病院数を図3左で確認 | 全国的に病院数は減少傾向 | 少子高齢化・医療再編の影響 |
| インデックス変化 | 図3右(赤線)で確認 | 図3右(灰線)で確認 | 東北が全国より大きく低下なら震災影響 |
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | ax3b.axvspan(2011.7, 2014.3, color=SHADE_EARLY, alpha=0.6, zorder=0) ax3b.axvspan(2018.7, 2023.3, color=SHADE_RECOVER, alpha=0.6, zorder=0) ax3b.axhline(100, color='black', linewidth=1.0, linestyle='--', alpha=0.5) # 東北3県の合計をインデックス化 tohoku_hosp_sum = df_tohoku.groupby('年度')['一般病院数'].sum() nation_hosp_sum = df_b.groupby('年度')['一般病院数'].sum() other_hosp_sum = df_other.groupby('年度')['一般病院数'].sum() base_yr = 2012 t_idx = tohoku_hosp_sum / tohoku_hosp_sum[base_yr] * 100 n_idx = nation_hosp_sum / nation_hosp_sum[base_yr] * 100 o_idx = other_hosp_sum / other_hosp_sum[base_yr] * 100 ax3b.plot(t_idx.index, t_idx.values, color='#C62828', linewidth=2.5, marker='o', markersize=5, label='東北3県(合計)', zorder=3) ax3b.plot(n_idx.index, n_idx.values, color=COLOR_NATION, linewidth=2.0, linestyle='--', marker='s', markersize=4, label='全国(47都道府県合計)', zorder=2) ax3b.plot(o_idx.index, o_idx.values, color=COLOR_OTHER, linewidth=1.5, linestyle=':', marker='^', markersize=4, label='東北以外(44都道府県合計)', zorder=2) ax3b.set_xlabel('年度', fontsize=11) ax3b.set_ylabel('病院数インデックス(2012年=100)', fontsize=11) ax3b.set_title('病院数インデックス(2012年基準)', fontsize=11, fontweight='bold') ax3b.set_xticks(years) ax3b.legend(fontsize=9) ax3b.grid(True, alpha=0.3, axis='y') plt.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2022_U5_2_fig3_hospital.png'), bbox_inches='tight', dpi=150) plt.close(fig3) print("図3保存: 2022_U5_2_fig3_hospital.png") |
図3保存: 2022_U5_2_fig3_hospital.png
df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。転出率(転出者数 / 総人口 × 100)と保健医療費の関係を散布図で可視化することで、人口流出と健康状態の代理指標の多変量的な関係を探索する。東北3県を個別に強調表示し、全国の中での位置づけを確認する。
住民の健康状態を直接測定することは困難なため、保健医療費を「健康状態の代理変数(Proxy Variable)」として用いる。代理変数の使用には利点と限界がある。
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 | import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import numpy as np import warnings warnings.filterwarnings('ignore') plt.rcParams['font.family'] = 'Hiragino Sans' plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 150 import os FIG_DIR = 'html/figures' DATA_B = 'data/raw/SSDSE-B-2026.csv' os.makedirs(FIG_DIR, exist_ok=True) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。matplotlib.use('Agg') — グラフを画面表示せずファイルに保存するためのおまじない。plt.rcParams['font.family'] — グラフの日本語表示用フォント指定(Macは Hiragino Sans、Windowsなら Yu Gothic 等)。os.makedirs('html/figures', exist_ok=True) — 図の保存先フォルダを作る(既にあってもOK)。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。215 216 217 218 219 220 221 | COLOR_IWATE = '#1565C0' # 岩手:青 COLOR_MIYAGI = '#2E7D32' # 宮城:緑 COLOR_FUKUSHIMA = '#E65100' # 福島:オレンジ COLOR_NATION = '#9E9E9E' # 全国平均:グレー COLOR_OTHER = '#BDBDBD' # その他:薄グレー SHADE_EARLY = '#FFF9C4' # 早期復興期(黄) SHADE_RECOVER = '#E8F5E9' # 回復期(緑) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。222 223 224 | fig3, (ax3a, ax3b) = plt.subplots(1, 2, figsize=(13, 6)) fig3.suptitle('一般病院数の変化:東北3県 vs 全国\n(SSDSE-B 2012〜2023年度)', fontsize=13, fontweight='bold') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。225 226 227 228 229 230 231 | fig4, (ax4a, ax4b) = plt.subplots(1, 2, figsize=(14, 6)) fig4.suptitle('転出率 vs 保健医療費:東北3県 vs その他\n' '(SSDSE-B 全47都道府県, 2012〜2023年度)', fontsize=13, fontweight='bold') # 転出率(%)= 転出者数 / 総人口 × 100 df_b['転出率'] = df_b['転出者数(日本人移動者)'] / df_b['総人口'] * 100 |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。232 233 234 235 236 237 238 239 | # 左パネル: 早期復興期(2012-2014) df_early = df_b[df_b['年度'].isin(early_yrs)].dropna( subset=['転出率', '保健医療費(二人以上の世帯)']) df_early_other = df_early[~df_early['東北フラグ']] df_early_tohoku = df_early[df_early['東北フラグ']] ax4a.scatter(df_early_other['転出率'], df_early_other['保健医療費(二人以上の世帯)'], color=COLOR_OTHER, s=25, alpha=0.4, label='その他44都道府県', zorder=2) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。{値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 | # 東北3県を個別プロット(強調) for code, color in zip(TOHOKU_CODES, [COLOR_IWATE, COLOR_MIYAGI, COLOR_FUKUSHIMA]): df_pref = df_early[df_early['地域コード'] == code] ax4a.scatter(df_pref['転出率'], df_pref['保健医療費(二人以上の世帯)'], color=color, s=120, alpha=0.9, zorder=5, label=TOHOKU_NAMES[code], edgecolors='white', linewidth=0.5, marker='D') # ラベル(都道府県名を点の右側に) for _, row in df_pref.iterrows(): ax4a.annotate(f"{row['都道府県']}\n({int(row['年度'])})", xy=(row['転出率'], row['保健医療費(二人以上の世帯)']), xytext=(5, 0), textcoords='offset points', fontsize=7, color=color, alpha=0.85) ax4a.set_xlabel('転出率(%)', fontsize=11) ax4a.set_ylabel('保健医療費(円 / 月 / 世帯)', fontsize=11) ax4a.set_title('早期復興期(2012〜2014年度)', fontsize=11, fontweight='bold') ax4a.legend(fontsize=9, loc='upper right') ax4a.grid(True, alpha=0.3) ax4a.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:,.0f}')) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。plt.subplots(figsize=(W, H)) で図サイズ指定、fig.savefig(..., bbox_inches='tight') で余白を自動で詰めて保存。261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 | # 右パネル: 回復期(2019-2023) df_recov = df_b[df_b['年度'].isin(recovery_yrs)].dropna( subset=['転出率', '保健医療費(二人以上の世帯)']) df_recov_other = df_recov[~df_recov['東北フラグ']] df_recov_tohoku = df_recov[df_recov['東北フラグ']] ax4b.scatter(df_recov_other['転出率'], df_recov_other['保健医療費(二人以上の世帯)'], color=COLOR_OTHER, s=25, alpha=0.4, label='その他44都道府県', zorder=2) for code, color in zip(TOHOKU_CODES, [COLOR_IWATE, COLOR_MIYAGI, COLOR_FUKUSHIMA]): df_pref = df_recov[df_recov['地域コード'] == code] ax4b.scatter(df_pref['転出率'], df_pref['保健医療費(二人以上の世帯)'], color=color, s=120, alpha=0.9, zorder=5, label=TOHOKU_NAMES[code], edgecolors='white', linewidth=0.5, marker='D') for _, row in df_pref.iterrows(): ax4b.annotate(f"{row['都道府県']}\n({int(row['年度'])})", xy=(row['転出率'], row['保健医療費(二人以上の世帯)']), xytext=(5, 0), textcoords='offset points', fontsize=7, color=color, alpha=0.85) ax4b.set_xlabel('転出率(%)', fontsize=11) ax4b.set_ylabel('保健医療費(円 / 月 / 世帯)', fontsize=11) ax4b.set_title('回復期(2019〜2023年度)', fontsize=11, fontweight='bold') ax4b.legend(fontsize=9, loc='upper right') ax4b.grid(True, alpha=0.3) ax4b.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:,.0f}')) plt.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2022_U5_2_fig4_scatter.png'), bbox_inches='tight', dpi=150) plt.close(fig4) print("図4保存: 2022_U5_2_fig4_scatter.png") |
図4保存: 2022_U5_2_fig4_scatter.png
for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。.dropna() は欠損行を除去、.copy() は独立したコピーを作る。pandasで警告を防ぐ定石。295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 | print() print("=" * 60) print("■ 期間別サマリ統計") print("=" * 60) print() print(" 【早期復興期 (2012-2014) vs 回復期 (2019-2023)】") print(" 保健医療費(東北3県平均, 円):") early_val = df_b[df_b['年度'].isin(early_yrs) & df_b['東北フラグ']]['保健医療費(二人以上の世帯)'].mean() recover_val = df_b[df_b['年度'].isin(recovery_yrs) & df_b['東北フラグ']]['保健医療費(二人以上の世帯)'].mean() print(f" 早期復興期: {early_val:,.0f}円") print(f" 回復期 : {recover_val:,.0f}円") print(f" 変化率 : {(recover_val-early_val)/early_val*100:+.1f}%") print() print(" 転入超過率(東北3県平均, 人/千人):") for pref in ['岩手県', '宮城県', '福島県']: s = net_rate[pref].sort_index() e_val = s[s.index.isin(early_yrs)].mean() r_val = s[s.index.isin(recovery_yrs)].mean() print(f" {pref}: 早期 {e_val:+.2f} → 回復 {r_val:+.2f} (人/千人)") print() print(" 一般病院数(東北3県合計):") print(f" 2012年: {tohoku_hosp_sum[2012]:.0f} 施設") print(f" 2023年: {tohoku_hosp_sum[2023]:.0f} 施設") print(f" 変化 : {tohoku_hosp_sum[2023]-tohoku_hosp_sum[2012]:+.0f} 施設") print() print("全図の生成完了(4枚)") print(" 2022_U5_2_fig1_ts_health.png : 保健医療費の時系列(東北3県 vs 全国平均)") print(" 2022_U5_2_fig2_population.png : 東北3県の人口変化率(転入超過率)") print(" 2022_U5_2_fig3_hospital.png : 病院数の変化(東北 vs 全国)") print(" 2022_U5_2_fig4_scatter.png : 転出率 vs 保健医療費 散布図(東北強調)") |
============================================================
■ 期間別サマリ統計
============================================================
【早期復興期 (2012-2014) vs 回復期 (2019-2023)】
保健医療費(東北3県平均, 円):
早期復興期: 11,454円
回復期 : 13,306円
変化率 : +16.2%
転入超過率(東北3県平均, 人/千人):
岩手県: 早期 -2.06 → 回復 -3.45 (人/千人)
宮城県: 早期 +1.88 → 回復 -0.28 (人/千人)
福島県: 早期 -3.63 → 回復 -3.59 (人/千人)
一般病院数(東北3県合計):
2012年: 299 施設
2023年: 283 施設
変化 : -16 施設
全図の生成完了(4枚)
2022_U5_2_fig1_ts_health.png : 保健医療費の時系列(東北3県 vs 全国平均)
2022_U5_2_fig2_population.png : 東北3県の人口変化率(転入超過率)
2022_U5_2_fig3_hospital.png : 病院数の変化(東北 vs 全国)
2022_U5_2_fig4_scatter.png : 転出率 vs 保健医療費 散布図(東北強調){値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。SSDSE-B(都道府県別パネルデータ、2012〜2023年度)を用いた時系列・断絶時系列的分析の結果、以下の知見が得られた:
統計データを用いた「証拠に基づく政策立案(EBPM: Evidence-Based Policy Making)」の観点から、本研究のような時系列・地域差比較分析は、復興政策の効果測定と課題発見に有効なツールとなる。
| データ | 出典 | 備考 |
|---|---|---|
| SSDSE-B-2026.csv(都道府県別データ) | 統計センター SSDSE(社会・人口統計体系) | 2012〜2023年度、47都道府県 |
| 保健医療費(二人以上の世帯) | SSDSE-B 収録変数 | 家計消費支出のうち保健医療関連 |
| 転入・転出者数(日本人移動者) | SSDSE-B 収録変数(住民基本台帳移動報告) | 転入超過率の算出に使用 |
| 一般病院数 | SSDSE-B 収録変数(医療施設調査) | インデックス化して比較 |
本教育用コードは SSDSE-B-2026.csv の実データを使用(統計センター公表の公的統計データ)。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。