論文一覧に戻る 🕸 論文ネットワーク 🗺 用語ネットワーク 統計データ分析コンペ 教育用再現集
2019年度(令和元年度) 統計データ分析コンペティション | 特別賞(大学生・一般の部)

潜在患者数に対する医師偏在の可視化
入院患者数あたり医師数のジニ係数による都道府県比較

⏱️ 推定読了時間: 約40分
2019年度 | 大学生・一般の部 | 特別賞 | 眞田 英毅(東北大学大学院文学研究科)・三浦 萌実(株式会社社会情報サービス)
🔬 Gini係数🔬 ジニ係数🔬 ローレンツ曲線🔬 地図可視化🏷 医療・健康
🔬 手法タグ / 🏷 応用タグ(クリックで同タグの論文をネットワーク検索)
🔬 再現カルテ — 原論文と同じデータ・同じ手法で再現(一部を除く)

この教材は原論文と同じデータを読み込み、同じ手順で計算し直しています。画面に出る数値と図は、あなたのブラウザがその場で計算した結果です。
⚠ ただし一部は再現していません:原論文の中核である二次医療圏別ジニ係数は、 市区町村→二次医療圏の対応表と入院患者数が必要で、 SSDSE だけでは再現できません。 図2〜図4 は原論文 表2 の報告値の可視化です。

原論文が使ったデータSSDSE-A・平成 28 年医療施設(動態)調査・平成 28 年医師・歯科医師・薬剤師調査・平成 27 年国勢調査・平成 29 年患者調査
分析単位:その他
中核手法:ジニ係数
この教材が使うデータ
原論文(PDF)潜在患者数に対する医師偏在の可視化
特別賞/眞田 英毅、三浦 萌実(東北大学大学院文学研究科、株式会社社会情報サービス)
✅ この教材でできること
  • 分析に使うデータは同梱済みで、ブラウザ上でそのまま読み込める
突合監査の結果、主要データと中核手法はいずれも原論文と一致しています。

▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2019_U5_1_shorei.py(244 行)そのものです。

🏅 論文審査会コメント(審査員はここを評価した)
「医師の偏在という興味深いテーマについて、記述統計的分析のレベルにはとどまっているが、解釈も明確で好感が持てる論文として評価された。層別などを行うことでより良い分析ができたのではないだろうか。」
出典:統計センター「統計データ分析コンペティション」受賞論文PDF掲載の審査講評。プロの審査員が何を評価し、何を注文したかは論文の読み方の最良の手本になる。
📝 3行で分かる要約

目次

  1. 研究の背景と目的
  2. データと手法
  3. 主要な分析結果
  4. 統計的手法の解説
  5. 発展的学習
  6. まとめ
  7. 参考文献
  8. 📥 データの準備
  9. 💼 実社会での応用
  10. ⚠️ よくある誤解
  11. 📖 用語集
  12. 📐 手法ガイド
  13. 🚀 発展の可能性
  14. 🎯 自分でやってみよう
  15. 🤔 Q&A
  16. 🐍 ブラウザで動かす

🎯 この記事を読むと何ができるようになるか

📥 データの準備(再現コードを動かす前に)

このページの実データ計算(従来指標「人口10万人あたり医師数」)を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。図1〜図4は原論文の報告値を可視化するもので、追加データは不要です。

1
データをダウンロードする 統計センターの SSDSE 配布ページから、以下のファイルをダウンロードします。
SSDSE-A-2025.csv ← SSDSE-A(市区町村データ)📥 直接DL
⬇ SSDSEダウンロードページを開く
2
ファイルを所定のフォルダに配置する ダウンロードしたCSVを、プロジェクトの data/raw/ フォルダに入れます。
2026 統計・データ解析コンペ/ ├── code/ │ └── 2019_U5_1_shorei.py ← 実行するスクリプト └── data/ └── raw/ SSDSE-A-2025.csv ← ここに置く
3
スクリプトをそのまま実行する ターミナルでプロジェクトルートに移動し、以下を実行します。
python3 code/2019_U5_1_shorei.py
図は html/figures/ に自動保存されます。
研究の背景と目的

高齢化が進む日本では、医療へのアクセスにおける格差=医療格差が社会的課題として重要性を増している。平成20年度以降、医学部の入学定員は過去最大規模まで増員され、医師数は着実に増加してきた(2000年 255,792人 → 2016年 319,480人。原論文 図1)。それにもかかわらず、医師の地域偏在・診療科偏在は依然として解消されておらず、地域・診療科によってはいまだ「医師不足」と指摘されている。

地域ごとの医師数の比較には、これまで一般的に人口10万人対医師数が使われてきた。しかし原論文は、この指標には「医療需要(ニーズ)」が考慮されていない——つまり「人口のうちどれだけの人が実際に医療を必要としているか」が反映されていない——ことを問題にする。厚生労働省の医師需給分科会第2次中間取りまとめでも「都道府県が主体的・実効的に医師偏在対策を講じることができる体制の構築」が掲げられており、偏在を測る新しい「ものさし」の開発は急務である。

そこで原論文は、入院患者数という情報を新しく用いる。入院患者は実際に医療を必要としている人の数であり、その地域における潜在的な医療需要とみなすことができる。従来の人口あたり医師数による偏在の見え方と、新たに算出する入院患者数あたり医師数による偏在の見え方を比較することで、医療へのアクセスの実態をより詳細に明らかにすることを目指した。

研究の問い
  1. 従来指標の限界:人口あたり医師数でみた偏在(都道府県内の二次医療圏間のばらつき)はどの程度か?
  2. 需要を反映した指標:入院患者数(潜在的医療需要)あたり医師数でみると、偏在の見え方はどう変わるか?
  3. 地理的分布:2つのジニ係数の差分はどの地域で大きいか(=従来指標が見落としてきた偏在はどこにあるか)?

先行研究

日本の医師偏在を地理的分布から捉えた研究として、原論文は次を挙げる。Kobayashi & Takaki(1992, Lancetは全国の市町村の医師数と人口で2時点のローレンツ曲線を描いてジニ係数を比較し、1980〜1990年の医師増加が偏在を改善したかを検証した。Toyabe(2009)はジニ係数に加えてアトキンソン尺度・タイル尺度を用いて1996〜2006年の変化を追った。同一時点の偏在については、三浦ら(2010)が人口10万人当たり医師数を二次医療圏ごとに偏差値化し、石川ら(2011)が面積1,000km²あたり医師数や75歳以上人口の増減率も用いて偏在を示した。

先行研究との違い(原論文の新規性) 以上の研究はいずれも、医療需要を人口や面積で代替している。しかし同じ人口でも人口構成によって医療需要は異なり、面積も可住地・不可住地の区別が必要になる。原論文は地域内に居住する入院患者数という「患者の数そのもの」に着目することで、従来の指標では捉えられなかった医師偏在の実態把握を狙った。
分析の流れ
SSDSE-2019A
市区町村の
医師数・総人口
二次医療圏へ集計
(344圏域)
+入院患者数
都道府県ごとに
ローレンツ曲線
ジニ係数×2種
差分をとって
地図で塗り分け
(正=青・負=赤)

ジニ係数 ローレンツ曲線 二次医療圏 地図可視化(コロプレス図) SSDSE-A

データと手法

分析単位:二次医療圏

原論文は二次医療圏を1つの地域として医師数を比較する。二次医療圏とは、一般の入院に係る医療を提供する地域的単位として、地理的条件・日常生活の需要の充足状況・交通事情等を考慮して設定される区分である(三次医療圏=都道府県よりも細かい)。医療のかかりやすさの改善という観点で最も重要な区分が二次医療圏であること、また医師偏在対策の主体が都道府県であることから、「各都道府県の中で、二次医療圏ごとの医師数に偏りがないか」を確認する設計になっている。

使用データ

データ使用変数年次役割
SSDSE-2019A(市区町村データ)医師数(Code I6100)2016年二次医療圏別の医師数の元データ
SSDSE-2019A(市区町村データ)総人口(Code A1101)2015年二次医療圏別の人口の元データ
平成28年 医療施設(動態)調査市区町村→二次医療圏の対応2016年対応表の作成(二次医療圏数は344
平成29年 患者調査病院の推計入院患者数(患者住所地・千人単位)2017年潜在的医療需要(実数に換算して使用)
平成28年 医師・歯科医師・薬剤師調査/平成27年 国勢調査二次医療圏別医師数・区別人口2016/2015年市内に複数の二次医療圏を含む川崎市・横浜市の処理

※ 患者調査は3年に1回の実施のため、医師数データの取得年(2016年)に最も近い2017年データが使われている。入院では二次医療圏を跨ぐ患者の「流入」「流出」が起きるが、流出は需要(患者数)に対して供給(医師数)が不足している場合に発生するため、原論文は「各医療圏に居住する患者は当該医療圏内で受療できる状況が望ましい」という観点から、患者の住所地ベースの入院患者数を用いている。二次医療圏が入院医療の単位であることから、分析対象は入院患者のみである。

手順:2種類のジニ係数と差分

ジニ係数は不平等さを0〜1の数値で表す指標で、0に近いほど平等、1に近いほど不平等となる。原論文の手順は次の3段階である(各都道府県について実施)。

手順1
二次医療圏ごとに人口1人当たり医師数を計算 → 小さい順に並べ、累積人口と累積医師数の相対割合から
ジニ係数(人口)
手順2
患者1人当たり医師数で同様にローレンツ曲線を描き
ジニ係数(入院患者数)
手順3
差分 = Gini(入院患者数) − Gini(人口) を地図で塗り分け
差分の読み方(原論文 4.3節)

Gini(入院患者数) > Gini(人口) → 青色 人口に対して潜在的医療需要が高い
Gini(入院患者数) < Gini(人口) → 赤色 人口に対して潜在的医療需要が低い
🔁 このページの再現方針(再現可能性トリアージ)
  • 実データ計算(従来指標):市区町村別の医師数(I6100)・総人口(A1101)は現行 SSDSE-A-2025 にも収録されており、都道府県単位の「人口10万人あたり医師数」は実データで計算する(ただし医師数2022年・人口2020年で、原論文の2016年・2015年とは年次が異なる)。
  • 原論文の報告値の可視化(図1〜図4):市区町村→二次医療圏の対応表(医療施設調査)と二次医療圏別の推計入院患者数(患者調査)は SSDSE 未収録のため、原論文の中核である二次医療圏別ジニ係数は再計算できない。図1は原論文 図1、図2〜図4は原論文 表2 の報告値をそのまま可視化したものである(再計算ではない)。地図はタイルマップで再表現し、原論文のコロプレス図そのものは原論文を参照。
  • 新しい数値の創作はしない:本ページに登場する統計量は「SSDSE実データ計算」か「原論文の報告値」のどちらかであることを、図注・本文で常に明示する。
やってみよう1. SSDSE-A の読み込みと従来指標「人口10万人あたり医師数」の実データ計算
📝 コード
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# ===== ステップ1: SSDSE-A(市区町村)から従来指標を実データ計算 =====
# 1行目=変数コード、2行目=年度、3行目=日本語名 → コード行を列名に使う
df = pd.read_csv(DATA_A, encoding='cp932', header=0, skiprows=[1, 2])
df = df.rename(columns={df.columns[0]: 'code',
                        'Prefecture': '都道府県',
                        'Municipality': '市区町村'})
df['総人口'] = pd.to_numeric(df['A1101'], errors='coerce')   # 2020年
df['医師数'] = pd.to_numeric(df['I6100'], errors='coerce')   # 2022年
print(f"【SSDSE-A-2025】{len(df)}市区町村(医師数=2022年、総人口=2020年)")
print('  ※ 原論文が使った SSDSE-2019A は医師数2016年・総人口2015年。年次が異なる')
print('  ※ 市区町村→二次医療圏の対応表(平成28年医療施設調査)と')
print('     二次医療圏別の推計入院患者数(平成29年患者調査)は SSDSE 未収録')
print('     → 原論文の中核「二次医療圏別ジニ係数」は再計算不可(報告値で提示)')

pref = df.groupby('都道府県', sort=False).agg(
    医師数=('医師数', 'sum'), 総人口=('総人口', 'sum'))
pref['人口10万対医師数'] = pref['医師数'] / pref['総人口'] * 100000
pref_sorted = pref.sort_values('人口10万対医師数', ascending=False)
print('\n=== 従来指標「人口10万人あたり医師数」(SSDSE-A-2025 実データ計算) ===')
print('上位5:')
print(pref_sorted.head(5)[['人口10万対医師数']].round(1).to_string())
print('下位5:')
print(pref_sorted.tail(5)[['人口10万対医師数']].round(1).to_string())
print(f"全国計: 医師数 {int(pref['医師数'].sum()):,}人 / "
      f"人口 {int(pref['総人口'].sum()):,}人 = "
      f"10万対 {pref['医師数'].sum()/pref['総人口'].sum()*1e5:.1f}人")
print('  → 上位と下位で約2倍の開き。原論文はこの従来指標に')
print('    「医療需要(ニーズ)が反映されていない」ことを問題にした')
▼ 実行結果
【SSDSE-A-2025】1741市区町村(医師数=2022年、総人口=2020年)
  ※ 原論文が使った SSDSE-2019A は医師数2016年・総人口2015年。年次が異なる
  ※ 市区町村→二次医療圏の対応表(平成28年医療施設調査)と
     二次医療圏別の推計入院患者数(平成29年患者調査)は SSDSE 未収録
     → 原論文の中核「二次医療圏別ジニ係数」は再計算不可(報告値で提示)

=== 従来指標「人口10万人あたり医師数」(SSDSE-A-2025 実データ計算) ===
上位5:
      人口10万対医師数
都道府県
京都府       351.7
東京都       345.8
徳島県       344.4
鳥取県       339.4
高知県       339.2
下位5:
      人口10万対医師数
都道府県
福島県       223.4
新潟県       222.3
千葉県       215.1
茨城県       210.3
埼玉県       186.0
全国計: 医師数 343,275人 / 人口 126,146,099人 = 10万対 272.1人
  → 上位と下位で約2倍の開き。原論文はこの従来指標に
    「医療需要(ニーズ)が反映されていない」ことを問題にした
💡 解説
  • pd.read_csv(..., encoding='cp932', header=0, skiprows=[1, 2]) — SSDSE-A は1行目が変数コード、2行目が年度、3行目が日本語名。コード行(A1101・I6100)を列名に使います。
  • groupby('都道府県').agg(...) — 1,741市区町村を47都道府県に集計。医師数と総人口の合計から従来指標を計算します。
  • 実行結果の「※」は本ページの再現範囲の宣言です。実データで計算できるもの(この従来指標)と、原論文の報告値をグラフ化するだけのもの(図1〜図4)を最初に区別しておきます。
💡 Python TIPS df['A'] / df['B'] * 100000 — pandasの列同士の演算は要素ごと(element-wise)。「10万人あたり」のような率の計算が1行で書けます。

主要な分析結果

※ 本節のジニ係数・差分などの統計量はすべて原論文の報告値である。図1は原論文 図1 の報告値の可視化、図2〜図4は原論文 表2 の報告値の再表現であり、再計算ではない。

1
前提:医師総数は増えている(原論文 図1)

医師・歯科医師・薬剤師調査によれば、医師数は2000年の255,792人から2016年の319,480人まで一貫して増加した。「総数が増えても偏在は解消されない」——これが原論文の出発点である。

医師数の推移(2000-2016年)
図1:医師数の推移(2000〜2016年)。原論文 図1 の報告値の可視化(再計算ではない)。出典:医師・歯科医師・薬剤師調査。
やってみよう2. 図1: 医師数の推移(原論文 図1 の報告値の可視化)
📝 コード
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
# ===== ステップ2: 図1 医師数の推移(原論文 図1 の報告値) =====
# 出典: 医師・歯科医師・薬剤師調査(原論文 図1 に記載された値)
years = [2000, 2002, 2004, 2006, 2008, 2010, 2012, 2014, 2016]
docs  = [255792, 262687, 270371, 277927, 286699,
         295049, 303268, 311205, 319480]

fig, ax = plt.subplots(figsize=(8.6, 5.2))
bars = ax.bar([str(y) + '年' for y in years], docs,
              color='#5B9BD5', edgecolor='white', width=0.62)
for b, v in zip(bars, docs):
    ax.text(b.get_x() + b.get_width() / 2, v + 3500, f'{v:,}',
            ha='center', va='bottom', fontsize=8.2)
ax.set_ylim(0, 360000)
ax.yaxis.set_major_formatter(lambda x, _: f'{int(x):,}')
ax.set_ylabel('医師数(人)', fontsize=11)
ax.set_title('図1:医師数の推移(2000〜2016年)\n'
             '原論文 図1 の報告値の可視化(出典:医師・歯科医師・薬剤師調査。再計算ではない)',
             fontsize=11.5, fontweight='bold')
ax.grid(axis='y', alpha=0.3)
fig.tight_layout()
fig.savefig(os.path.join(FIG_DIR, '2019_U5_1_fig1.png'),
            dpi=150, bbox_inches='tight')
plt.close(fig)
print('\n[保存] 図1: 医師数の推移(原論文 図1 の報告値の可視化)')
print(f'  2000年 {docs[0]:,}人 → 2016年 {docs[-1]:,}人(+{docs[-1]-docs[0]:,}人)')
print('  → 医師総数は一貫して増加。それでも「偏在」は解消していない、が出発点')
▼ 実行結果
[保存] 図1: 医師数の推移(原論文 図1 の報告値の可視化)
  2000年 255,792人 → 2016年 319,480人(+63,688人)
  → 医師総数は一貫して増加。それでも「偏在」は解消していない、が出発点
💡 解説
  • yearsdocs原論文 図1 に記載された値の転記(出典:医師・歯科医師・薬剤師調査)。再計算ではありません。
  • ax.text(...) で各棒の上に実数値を表示。原論文の図1もデータラベル付きの棒グラフです。
  • ax.yaxis.set_major_formatter(lambda x, _: f'{int(x):,}') — 目盛りを3桁区切りにする小技。
💡 Python TIPS f-stringの書式 {値:,}(3桁区切り)、{値:.3f}(小数3桁)を覚えると数値の見せ方が一気に整います。
2
人口あたりの医師数でみたジニ係数(原論文 図2・表2)

従来型の指標(人口1人当たり医師数)で、都道府県内の二次医療圏間の偏りをジニ係数にすると、最大値0.326(東京都)・最小値0.083(広島県・徳島県)・中央値0.147であった(原論文の報告値)。ジニ係数は0.4をこえると不平等といわれるが(原論文はUN-Habitat 2008を引用)、人口あたりでみる限り「すぐさま改善が必要」といえる水準の県はない。ただし都道府県ごとの差は大きく、人口の多い関東地方や島嶼部を含む都道府県で値が高くなる傾向があった。

人口あたり医師数でみたジニ係数の都道府県比較(タイルマップ)
図2:人口あたりの医師数でみたジニ係数の都道府県比較。原論文 表2・図2 の報告値の再表現(再計算ではない)。原論文はコロプレス図(塗り分け地図)で、本図は同じ値をタイルマップで再表現したもの。原論文の地図そのものは原論文 図2 を参照。
📌 このタイルマップ(塗り分け地図の再表現)の読み方
このグラフは
47都道府県を地理的な並びに近い格子に配置し、各タイルをジニ係数の大きさで塗り分けた図。原論文のコロプレス図と同じ情報を持つ。
読み方
色が濃い県ほど「都道府県内の二次医療圏間で、人口あたり医師数の偏りが大きい」。タイル内の数値が原論文 表2 の報告値そのもの。
なぜそう解釈できるか
ジニ係数は0(完全に平等)〜1(完全に不平等)の値をとり、色スケールは原論文の凡例(0.000〜0.400)に合わせてある。
3
入院患者数あたり医師数でみたジニ係数(原論文 図3・表2)

分母を人口から入院患者数(潜在的医療需要)に変えると、ジニ係数は最大値0.359・最小値0.106・中央値0.177となり、最大値・最小値・中央値のすべてが人口あたりよりも高くなった(原論文の報告値)。原論文はこれを「入院患者数あたりで確認すると医師偏在がより明確になる」と解釈し、最大値0.359(東京都)は不平等の目安である0.4に近づきつつある数字として特に注意が必要だとした。

入院患者数あたり医師数でみたジニ係数の都道府県比較(タイルマップ)
図3:入院患者数あたり医師数でみたジニ係数の都道府県比較。原論文 表2・図3 の報告値の再表現(再計算ではない)。図2と同じ色スケール(0〜0.4)。図2より全体に色が濃い=どの県でも偏在がより強く見える。
主な発見(図2 vs 図3、いずれも原論文の報告値)
  • 人口あたり:最大 0.326/最小 0.083/中央値 0.147
  • 入院患者数あたり:最大 0.359/最小 0.106/中央値 0.1773つとも上昇
  • 「医療を必要とする人」を分母にすると、従来指標では見えなかった偏在が浮かび上がる
やってみよう3. 原論文 表2 の報告値の転記と検算
📝 コード
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# ===== ステップ3: 原論文 表2(都道府県別ジニ係数と差分)の転記 =====
# 値はすべて原論文 表2 の報告値(入院患者数あたり, 人口あたり, 差分)
GINI = {
    '北海道': (0.195, 0.173, 0.022), '青森県': (0.196, 0.175, 0.021),
    '岩手県': (0.218, 0.181, 0.037), '宮城県': (0.188, 0.117, 0.071),
    '秋田県': (0.195, 0.181, 0.014), '山形県': (0.107, 0.125, -0.018),
    '福島県': (0.177, 0.129, 0.049), '茨城県': (0.290, 0.257, 0.032),
    '栃木県': (0.293, 0.229, 0.064), '群馬県': (0.250, 0.218, 0.032),
    '埼玉県': (0.113, 0.109, 0.004), '千葉県': (0.171, 0.124, 0.047),
    '東京都': (0.359, 0.326, 0.033), '神奈川県': (0.106, 0.112, -0.006),
    '新潟県': (0.141, 0.138, 0.003), '富山県': (0.117, 0.104, 0.013),
    '石川県': (0.175, 0.146, 0.030), '福井県': (0.234, 0.217, 0.018),
    '山梨県': (0.175, 0.154, 0.021), '長野県': (0.179, 0.169, 0.010),
    '岐阜県': (0.151, 0.134, 0.017), '静岡県': (0.131, 0.113, 0.018),
    '愛知県': (0.176, 0.200, -0.025), '三重県': (0.123, 0.107, 0.016),
    '滋賀県': (0.215, 0.191, 0.024), '京都府': (0.167, 0.170, -0.003),
    '大阪府': (0.146, 0.126, 0.020), '兵庫県': (0.165, 0.123, 0.043),
    '奈良県': (0.109, 0.085, 0.024), '和歌山県': (0.205, 0.185, 0.020),
    '鳥取県': (0.197, 0.160, 0.037), '島根県': (0.292, 0.205, 0.088),
    '岡山県': (0.150, 0.105, 0.046), '広島県': (0.152, 0.083, 0.069),
    '山口県': (0.161, 0.138, 0.023), '徳島県': (0.154, 0.083, 0.071),
    '香川県': (0.211, 0.136, 0.074), '愛媛県': (0.244, 0.147, 0.097),
    '高知県': (0.119, 0.111, 0.008), '福岡県': (0.224, 0.160, 0.064),
    '佐賀県': (0.210, 0.171, 0.039), '長崎県': (0.150, 0.167, -0.017),
    '熊本県': (0.302, 0.220, 0.082), '大分県': (0.196, 0.104, 0.091),
    '宮崎県': (0.293, 0.192, 0.100), '鹿児島県': (0.276, 0.205, 0.071),
    '沖縄県': (0.159, 0.126, 0.033),
}
gini = pd.DataFrame(GINI, index=['G入院患者数', 'G人口', '差分']).T

print('\n=== 原論文 表2 の報告値(都道府県別ジニ係数)の検算 ===')
for col, label, rep in [('G人口', '人口あたり', (0.326, 0.083, 0.147)),
                        ('G入院患者数', '入院患者数あたり', (0.359, 0.106, 0.177))]:
    mx, mn, md = gini[col].max(), gini[col].min(), gini[col].median()
    ok = '一致' if (round(mx, 3), round(mn, 3), round(md, 3)) == rep else '不一致'
    print(f'  {label}: 最大 {mx:.3f} / 最小 {mn:.3f} / 中央値 {md:.3f} '
          f'→ 原論文本文の報告値 {rep}{ok}')
print('  ※ 表2の値から取った要約であり、ジニ係数そのものの再計算ではない')
▼ 実行結果
=== 原論文 表2 の報告値(都道府県別ジニ係数)の検算 ===
  人口あたり: 最大 0.326 / 最小 0.083 / 中央値 0.147 → 原論文本文の報告値 (0.326, 0.083, 0.147) と一致
  入院患者数あたり: 最大 0.359 / 最小 0.106 / 中央値 0.177 → 原論文本文の報告値 (0.359, 0.106, 0.177) と一致
  ※ 表2の値から取った要約であり、ジニ係数そのものの再計算ではない
💡 解説
  • GINI 辞書は原論文 表2(各都道府県のジニ係数と差分)の47都道府県分の報告値をそのまま転記したものです。
  • 検算では、表2の値から取った最大・最小・中央値が、原論文本文(4.1節・4.2節)の報告値と一致するかを確認しています(両者とも一致)。
  • ジニ係数そのものの再計算には二次医療圏別の医師数・人口・入院患者数が必要で、SSDSE には未収録です。
💡 Python TIPS pd.DataFrame(辞書, index=[...]).T — 「キー→タプル」の辞書は転置 .T で行=キーの表になります。
4
2つのジニ係数の差分:偏在は西日本に(原論文 図4・表2)

最後に、差分 = Gini(入院患者数) − Gini(人口) を都道府県ごとにとる。差分が正なら「潜在的医療需要を考慮した場合にジニ係数が高くなる」=人口に対して潜在的医療需要が高い県(青)、負ならその逆(赤)である。原論文 図4 から、人口当たり医師数では捉えられなかった潜在的医療需要に対する医師偏在は、おもに西日本で多く発生していることが読み取れる。

2つのジニ係数の差分の都道府県比較(正=青・負=赤)
図4:2つのジニ係数の差分の都道府県比較(正=青・負=赤)。原論文 表2・図4 の報告値の再表現(再計算ではない)。凡例は原論文に合わせ ±0.100。
主な発見(図4、原論文 表2 の報告値より)
  • 差分が正(青)の都道府県は42。多くの都道府県で、潜在的な医療需要への対処が追いついていない
  • 差分が負(赤)は5県:山形県(−0.018)・神奈川県(−0.006)・愛知県(−0.025)・京都府(−0.003)・長崎県(−0.017)——これらは潜在的な医療需要に対応できているとされた
  • 差分の大きい上位5県は宮崎県(+0.100)・愛媛県(+0.097)・大分県(+0.091)・島根県(+0.088)・熊本県(+0.082)——すべて西日本

表2:各都道府県のジニ係数と差分(原論文 表2 の報告値の転記)

都道府県ジニ係数
(入院患者数)
ジニ係数
(人口)
差分都道府県ジニ係数
(入院患者数)
ジニ係数
(人口)
差分
北海道0.1950.173+0.022滋賀県0.2150.191+0.024
青森県0.1960.175+0.021京都府0.1670.170-0.003
岩手県0.2180.181+0.037大阪府0.1460.126+0.020
宮城県0.1880.117+0.071兵庫県0.1650.123+0.043
秋田県0.1950.181+0.014奈良県0.1090.085+0.024
山形県0.1070.125-0.018和歌山県0.2050.185+0.020
福島県0.1770.129+0.049鳥取県0.1970.160+0.037
茨城県0.2900.257+0.032島根県0.2920.205+0.088
栃木県0.2930.229+0.064岡山県0.1500.105+0.046
群馬県0.2500.218+0.032広島県0.1520.083+0.069
埼玉県0.1130.109+0.004山口県0.1610.138+0.023
千葉県0.1710.124+0.047徳島県0.1540.083+0.071
東京都0.3590.326+0.033香川県0.2110.136+0.074
神奈川県0.1060.112-0.006愛媛県0.2440.147+0.097
新潟県0.1410.138+0.003高知県0.1190.111+0.008
富山県0.1170.104+0.013福岡県0.2240.160+0.064
石川県0.1750.146+0.030佐賀県0.2100.171+0.039
福井県0.2340.217+0.018長崎県0.1500.167-0.017
山梨県0.1750.154+0.021熊本県0.3020.220+0.082
長野県0.1790.169+0.010大分県0.1960.104+0.091
岐阜県0.1510.134+0.017宮崎県0.2930.192+0.100
静岡県0.1310.113+0.018鹿児島県0.2760.205+0.071
愛知県0.1760.200-0.025沖縄県0.1590.126+0.033
三重県0.1230.107+0.016

※ 値はすべて原論文 表2 の転記。赤字=差分が負の5県、青字=差分の大きい上位5県。表中の差分は原論文の表記のままであり、掲載値の丸めにより「入院患者数−人口」の単純計算と末尾が1違う県がある(例:茨城県 0.290−0.257=0.033 だが表は 0.032)。

やってみよう5. 図2・図3: 2つのジニ係数の都道府県比較(報告値の再表現)
📝 コード
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# ===== ステップ5: 図2・図3 ジニ係数の都道府県比較(報告値の再表現) =====
norm_g = Normalize(vmin=0.0, vmax=0.4)   # 原論文の凡例 0.000〜0.400 に合わせる
tile_map(gini['G人口'],
         '図2:人口あたりの医師数でみたジニ係数の都道府県比較\n'
         '原論文 表2・図2 の報告値の再表現(タイルマップ。再計算ではない)',
         'Blues', norm_g, 'ジニ係数(0=平等、0.4=不平等の目安)',
         '2019_U5_1_fig2.png')
print('\n[保存] 図2: 人口あたり医師数のジニ係数(原論文 表2 の報告値の再表現)')
print('  最大: 東京都 0.326 / 最小: 広島県・徳島県 0.083 / 中央値 0.147')

tile_map(gini['G入院患者数'],
         '図3:入院患者数あたり医師数でみたジニ係数の都道府県比較\n'
         '原論文 表2・図3 の報告値の再表現(タイルマップ。再計算ではない)',
         'Blues', norm_g, 'ジニ係数(0=平等、0.4=不平等の目安)',
         '2019_U5_1_fig3.png')
print('[保存] 図3: 入院患者数あたり医師数のジニ係数(同上)')
print('  最大: 東京都 0.359 / 最小: 神奈川県 0.106 / 中央値 0.177')
print('  → 最大・最小・中央値のすべてが人口あたり(図2)より高い')
▼ 実行結果
[保存] 図2: 人口あたり医師数のジニ係数(原論文 表2 の報告値の再表現)
  最大: 東京都 0.326 / 最小: 広島県・徳島県 0.083 / 中央値 0.147
[保存] 図3: 入院患者数あたり医師数のジニ係数(同上)
  最大: 東京都 0.359 / 最小: 神奈川県 0.106 / 中央値 0.177
  → 最大・最小・中央値のすべてが人口あたり(図2)より高い
💡 解説
  • 図2(人口あたり)と図3(入院患者数あたり)は同じ色スケール(0〜0.4)で描くのがポイント。原論文も両図の凡例を揃えており、これにより「図3の方が全体に色が濃い」ことが一目でわかります。
  • 0.4 はジニ係数で「不平等」といわれる目安(原論文はUN-Habitat 2008を引用)。東京都の0.359(図3)はこれに近づきつつある値です。
  • タイル内の数値はすべて原論文 表2 の報告値です。
💡 Python TIPS 色で比較する図を複数枚並べるときは、カラースケール(vmin/vmax)を必ず統一する。揃っていない図は誤読のもとです。
やってみよう6. 図4: 差分の可視化(正=青・負=赤)と内訳の確認
📝 コード
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# ===== ステップ6: 図4 2つのジニ係数の差分(正=青・負=赤) =====
norm_d = TwoSlopeNorm(vmin=-0.10, vcenter=0.0, vmax=0.10)
tile_map(gini['差分'],
         '図4:2つのジニ係数の差分の都道府県比較(正=青・負=赤)\n'
         '差分 = Gini(入院患者数) − Gini(人口)。'
         '原論文 表2・図4 の報告値の再表現(再計算ではない)',
         'RdBu', norm_d, '差分(青: 潜在的医療需要が高い / 赤: 低い)',
         '2019_U5_1_fig4.png', fmt='{:+.3f}')
print('[保存] 図4: 2つのジニ係数の差分(同上)')

pos = gini[gini['差分'] > 0]
neg = gini[gini['差分'] < 0]
west = ['滋賀県', '京都府', '大阪府', '兵庫県', '奈良県', '和歌山県', '三重県',
        '鳥取県', '島根県', '岡山県', '広島県', '山口県', '徳島県', '香川県',
        '愛媛県', '高知県', '福岡県', '佐賀県', '長崎県', '熊本県', '大分県',
        '宮崎県', '鹿児島県', '沖縄県']
top5 = gini['差分'].sort_values(ascending=False).head(5)
print('\n=== 差分(原論文 表2 の報告値)の内訳 ===')
print(f'  差分が正(青): {len(pos)}都道府県 / 負(赤): {len(neg)}県'
      f'({"、".join(neg.index)})')
print('  差分の大きい上位5県: '
      + '、'.join(f'{p} {v:+.3f}' for p, v in top5.items()))
print(f'  上位5県のうち西日本(近畿以西): {sum(p in west for p in top5.index)}県')
print('  → 「潜在的医療需要に対する医師偏在はおもに西日本で発生」という')
print('    原論文の指摘(図4)と整合する')

print('\n====== まとめ ======')
print('・従来指標(人口10万対医師数)は SSDSE-A-2025 実データで再計算し、')
print('  都道府県間で約2倍の開きを確認(実データ計算)')
print('・二次医療圏別ジニ係数(図2〜4)は原論文 表2 の報告値の可視化であり、')
print('  再計算ではない(対応表・患者調査データが SSDSE 未収録のため)')
print('・入院患者数あたりのジニ係数(最大0.359・中央値0.177)は人口あたり')
print('  (最大0.326・中央値0.147)より一様に高く、差分の大きい県は西日本に集中')
print('\nDONE: 2019_U5_1_shorei')
▼ 実行結果
[保存] 図4: 2つのジニ係数の差分(同上)

=== 差分(原論文 表2 の報告値)の内訳 ===
  差分が正(青): 42都道府県 / 負(赤): 5県(山形県、神奈川県、愛知県、京都府、長崎県)
  差分の大きい上位5県: 宮崎県 +0.100、愛媛県 +0.097、大分県 +0.091、島根県 +0.088、熊本県 +0.082
  上位5県のうち西日本(近畿以西): 5県
  → 「潜在的医療需要に対する医師偏在はおもに西日本で発生」という
    原論文の指摘(図4)と整合する

====== まとめ ======
・従来指標(人口10万対医師数)は SSDSE-A-2025 実データで再計算し、
  都道府県間で約2倍の開きを確認(実データ計算)
・二次医療圏別ジニ係数(図2〜4)は原論文 表2 の報告値の可視化であり、
  再計算ではない(対応表・患者調査データが SSDSE 未収録のため)
・入院患者数あたりのジニ係数(最大0.359・中央値0.177)は人口あたり
  (最大0.326・中央値0.147)より一様に高く、差分の大きい県は西日本に集中

DONE: 2019_U5_1_shorei
💡 解説
  • TwoSlopeNorm(vmin=-0.10, vcenter=0.0, vmax=0.10) — 0を中心に正負で色を分ける正規化。原論文 図4 の凡例(+0.100〜−0.100、正=青・負=赤)に合わせています。
  • 差分が負(赤)の5県(山形・神奈川・愛知・京都・長崎)と、差分の大きい上位5県(宮崎・愛媛・大分・島根・熊本=すべて西日本)は原論文 表2 の報告値から機械的に確認できます。
  • 「潜在的医療需要に対する医師偏在はおもに西日本で発生」という原論文の主要な発見が、報告値の内訳からも裏づけられます。
💡 Python TIPS df[df['列'] > 0] — 条件式で行を絞り込む「ブールインデックス」。件数の確認は len() で。

統計的手法の解説

DS LEARNING POINT 1

ローレンツ曲線とジニ係数

ローレンツ曲線は、対象(ここでは都道府県内の二次医療圏)を「1単位あたりの量(人口1人当たり医師数)」の小さい順に並べ、横軸に累積人口の相対割合、縦軸に累積医師数の相対割合をとって描く曲線。完全に平等なら45度線(均等配分線)に一致し、偏りが大きいほど下にたわむ。ジニ係数は「45度線とローレンツ曲線に挟まれた面積の2倍」で、0(完全平等)〜1(完全不平等)の値をとる。

# ジニ係数の計算例(台形公式): 原論文 2.3節の手順 # x = 各二次医療圏の人口, y = 医師数 import numpy as np def gini_coef(x, y): r = np.argsort(y / x) # 1人当たり医師数の小さい順 cx = np.cumsum(x[r]) / x.sum() # 累積人口の相対割合 cy = np.cumsum(y[r]) / y.sum() # 累積医師数の相対割合 cx = np.insert(cx, 0, 0.0); cy = np.insert(cy, 0, 0.0) # 45度線とローレンツ曲線の間の面積 × 2 return 1.0 - np.sum((cx[1:] - cx[:-1]) * (cy[1:] + cy[:-1])) # 原論文はこれを47都道府県 × 2種類の分母(人口・入院患者数)で計算 # ※ 二次医療圏別データが SSDSE 未収録のため本ページでは再計算せず、 # 原論文 表2 の報告値を可視化している
ジニ係数(台形公式): G = 1 − Σk (xk − xk−1)(yk + yk−1)
(xk = 累積人口の相対割合, yk = 累積医師数の相対割合, 並び順は1人当たり医師数の昇順)

解釈の目安: 0 = 完全平等 / 0.4 超 = 不平等といわれる水準(UN-Habitat 2008) / 1 = 完全不平等

DS LEARNING POINT 2

「分母を変える」という指標設計

本論文の核心は、高度な統計モデルではなく指標の分母の選び直しにある。「医師数 ÷ 人口」は供給を住んでいる人の数で割った指標であり、医療を必要としない人も分母に含まれる。「医師数 ÷ 入院患者数」は供給を実際に医療を必要としている人の数(潜在的医療需要の代理)で割った指標である。同じ医師数データでも、分母が変わればジニ係数の値も順位も変わる——これが図2と図3の違いを生む。

# 概念図: 同じ「医師数の分布」でも分母で偏在の見え方が変わる 偏在指標(従来) = 医師数 / 人口 # 需要の濃淡を無視 偏在指標(原論文) = 医師数 / 入院患者数 # 需要(患者住所地ベース)を反映 # 原論文の結果(報告値): 分母を患者数にすると # 最大 0.326 → 0.359 / 最小 0.083 → 0.106 / 中央値 0.147 → 0.177 # → どの要約統計量でも偏在がより強く見える

DS LEARNING POINT 3

二次医療圏:制度に根ざした分析単位

分析単位(市区町村か、二次医療圏か、都道府県か)の選択は結果を左右する(可変単位地区問題:MAUP)。原論文が二次医療圏を選んだのは統計上の都合ではなく、「一般の入院に係る医療を提供する地域的単位」という制度上の定義が、入院患者数という需要指標と正確に対応するからである。さらに医師偏在対策の実施主体が都道府県であることから、「都道府県の中の二次医療圏間の偏り」を測る設計にした。分析単位を制度・政策の単位と揃えることで、結果がそのまま政策提言(都道府県内での医師の割振り配置)につながっている。

コロプレス図(塗り分け地図)とタイルマップ

方式長所短所本ページでの扱い
コロプレス図(原論文 図2〜4)実際の地形で直感的面積の大きい県(北海道など)が過大に見える。白地図データが必要原論文を参照
タイルマップ(本ページ 図2〜4)全県が同じ大きさ=値の比較が公平。数値を書き込める正確な位置・隣接関係は近似原論文 表2 の報告値で再表現
やってみよう4. タイルマップ(地図可視化の再表現)関数の定義
📝 コード
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
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
# ===== ステップ4: タイルマップ(コロプレス図の再表現)関数 =====
# 都道府県を格子状に並べた「タイルマップ」。原論文の地図(コロプレス図)の
# 再表現(白地図データを使わずに塗り分けを表現する方法)
TILE = {  # (列, 行) 行は上から下へ
    '北海道': (13, 0), '青森県': (13, 1), '秋田県': (12, 2), '岩手県': (13, 2),
    '山形県': (12, 3), '宮城県': (13, 3), '新潟県': (10, 4), '福島県': (12, 4),
    '富山県': (9, 4), '石川県': (8, 4), '福井県': (8, 5), '長野県': (10, 5),
    '群馬県': (11, 5), '栃木県': (12, 5), '茨城県': (13, 5), '岐阜県': (9, 5),
    '山梨県': (11, 6), '埼玉県': (12, 6), '千葉県': (13, 6), '愛知県': (9, 6),
    '静岡県': (10, 6), '東京都': (12, 7), '神奈川県': (11, 7), '滋賀県': (8, 6),
    '京都府': (7, 5), '兵庫県': (6, 5), '鳥取県': (5, 5), '島根県': (4, 5),
    '大阪府': (7, 6), '岡山県': (5, 6), '広島県': (4, 6), '山口県': (3, 6),
    '奈良県': (8, 7), '和歌山県': (7, 7), '三重県': (9, 7),
    '香川県': (5, 7), '徳島県': (6, 7), '愛媛県': (4, 7), '高知県': (5, 8),
    '福岡県': (2, 6), '佐賀県': (1, 6), '長崎県': (0, 7), '大分県': (2, 7),
    '熊本県': (1, 7), '宮崎県': (2, 8), '鹿児島県': (1, 8), '沖縄県': (0, 10),
}


def tile_map(values, title, cmap, norm, cbar_label, fname, fmt='{:.3f}'):
    fig, ax = plt.subplots(figsize=(10.4, 8.2))
    sm = ScalarMappable(norm=norm, cmap=cmap)
    for p, (cx, cy) in TILE.items():
        v = values[p]
        fc = sm.to_rgba(v)
        lum = 0.299 * fc[0] + 0.587 * fc[1] + 0.114 * fc[2]
        tc = 'white' if lum < 0.55 else '#222222'
        ax.add_patch(Rectangle((cx, -cy), 0.96, 0.96, facecolor=fc,
                               edgecolor='white', linewidth=1.2))
        name = p if p == '北海道' else p[:-1]  # 「県」「府」「都」を省く
        ax.text(cx + 0.48, -cy + 0.60, name, ha='center', va='center',
                fontsize=7.8, color=tc, fontweight='bold')
        ax.text(cx + 0.48, -cy + 0.28, fmt.format(v), ha='center',
                va='center', fontsize=7.2, color=tc)
    ax.set_xlim(-0.4, 15.4)
    ax.set_ylim(-10.6, 1.6)
    ax.set_aspect('equal')
    ax.axis('off')
    cb = fig.colorbar(sm, ax=ax, shrink=0.62, pad=0.01)
    cb.set_label(cbar_label, fontsize=10)
    ax.set_title(title, fontsize=11.5, fontweight='bold')
    fig.tight_layout()
    fig.savefig(os.path.join(FIG_DIR, fname), dpi=150, bbox_inches='tight')
    plt.close(fig)
▼ 実行結果
このステップは print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。
💡 解説
  • TILE は47都道府県を格子状に並べた座標表。白地図データ(シェープファイル)がなくても、コロプレス図(塗り分け地図)の情報を再表現できます。
  • ScalarMappable(norm, cmap) — 値→色の変換器。図2・図3は原論文の凡例(0.000〜0.400)に合わせて Normalize(0, 0.4) を使います。
  • 背景色の明るさ(輝度)を計算して文字色を白/黒で切り替えると、濃い色のタイルでも値が読めます。
💡 Python TIPS ax.add_patch(Rectangle(...)) — matplotlibでは長方形・円などの図形を「パッチ」として自由に置けます。グラフ以外の図解にも便利。

発展的学習

審査コメントから:層別という次の一手

論文審査会コメントは「記述統計的分析のレベルにはとどまっているが、解釈も明確で好感が持てる」と評価した上で、「層別などを行うことでより良い分析ができたのではないか」と指摘している。層別の候補としては、診療科別(偏在は診療科によって大きく異なる)、年齢階級別(高齢者ほど入院需要が高い)、病床機能別(高度急性期〜慢性期)などが考えられる。

偏在を測る他の尺度(先行研究より)
  1. アトキンソン尺度・タイル尺度:Toyabe(2009)はジニ係数と併用。タイル尺度は「地域間格差」と「地域内格差」に分解できるのが強み
  2. 偏差値化:三浦ら(2010)は人口10万人当たり医師数を二次医療圏ごとに偏差値化して偏在を表現
  3. 医師偏在指標(厚生労働省, 2019年導入):性・年齢別の受療率や患者の流出入、医師の性・年齢構成まで織り込んだ公式指標。原論文と同じ問題意識(人口10万対医師数の限界)から生まれた

原論文が自認する課題

課題内容発展の方向
外来患者の欠落二次医療圏ごとの外来患者数データがなく、入院患者のみで分析NDBオープンデータ・患者調査の外来推計の活用
地理的要素居住しにくさ・交通事情等を考慮できていないアクセス時間(最寄り病院への到達時間)を組み込む空間分析
患者の流出入患者住所地ベース=「圏内で受療できる状況が望ましい」という規範的仮定受療地ベースとの比較、流出入率の分析
記述統計の範囲偏在の「記述」であり、偏在の「要因」は特定していない回帰分析等で偏在の決定要因を探る(審査コメントの層別も)
より詳細な分析への発展
  • 時点間比較:Kobayashi & Takaki(1992)のように複数時点のジニ係数を比較すれば、「偏在は改善しているのか」を検証できる
  • 需要の精緻化:性・年齢階級別の受療率 × 人口構成で「期待患者数」を作れば、患者調査の実測値と組み合わせた需要推計ができる
  • 要因分析:差分(図4)を目的変数に、病床数・大学医学部の有無・所得などを説明変数にした回帰分析へ拡張できる

まとめ

主要な発見(いずれも原論文の報告値)

  1. 従来指標での偏在は限定的:人口あたり医師数でみた都道府県内のジニ係数は最大0.326・最小0.083・中央値0.147。不平等の目安0.4を超える県はないが、人口の多い関東や島嶼部を含む県で高い傾向(図2)。
  2. 需要を反映すると偏在がより明確に:入院患者数あたり医師数でみたジニ係数は最大0.359・最小0.106・中央値0.177。最大・最小・中央値のすべてが人口あたりより高く、最大値0.359(東京都)は0.4に近づきつつある(図3)。
  3. 偏在はおもに西日本で発生:差分(入院患者数−人口)が正の県は42。差分上位5県(宮崎・愛媛・大分・島根・熊本)はすべて西日本で、負は山形・神奈川・愛知・京都・長崎の5県のみ(図4)。
  4. 政策提言:都道府県が主体となり、入院患者数などの潜在的医療需要から二次医療圏ごとに必要医師数を定め、教員採用試験のように一括採用→割振り配置・定期異動する体制の整備を提案。医師数自体は増えており地域枠の医学部入学者も増えているが、その多くは都市部で従事しているというギャップの認識が出発点にある。
政策的示唆(原論文 5章) 都市部の方が人口も大病院も多く医師の需要が高いように見えるが、潜在的医療需要でみると需要が高まっているのはそれ以外の地域である。このギャップを認識して医師を調整・配置することが必要であり、各都道府県が主体性をもって進められるよう国のさらなる体制整備が求められる。高齢化で医療を必要とする人が増える日本において、「どの地域にいま最も医師が必要なのか」に多角的な要素で答えることが重要である。
分析の限界(原論文が明記) 潜在的医療需要の代理として入院患者数のみを用いており、外来患者数はデータが得られず含められていない。居住しにくさや交通事情などの地理的要素も考慮できていない。また審査会コメントの通り、本分析は記述統計のレベルであり、層別などによる深掘りの余地がある。
教育的価値(この分析から学べること)
  • 指標設計の力:高度なモデルを使わなくても、「分母を人口から患者数に変える」という一点の工夫で新しい知見が得られる。
  • ジニ係数の応用範囲:所得分配の指標として有名なジニ係数を、医師配置という資源配分の偏り測定に転用している。
  • 公的統計の合わせ技:SSDSE(市区町村)+医療施設調査(対応表)+患者調査(需要)という複数の公的統計の結合が分析を可能にした。
  • 可視化の設計:2枚の地図を同一色スケールで並べ、3枚目で差分を発散配色(青赤)にする——比較のための可視化のお手本。

参考文献

データ・コードのダウンロード

分析スクリプト(2019_U5_1_shorei.py)
ファイル内容出典
SSDSE-A-2025.csv1,741市区町村の統計データ独立行政法人統計センター SSDSE(教育用標準データセット)
2019_U5_1_fig1.png医師数の推移(2000〜2016年)本スクリプト生成(原論文 図1 の報告値の可視化。再計算ではない)
2019_U5_1_fig2.png人口あたり医師数のジニ係数タイルマップ本スクリプト生成(原論文 表2 の報告値の再表現。再計算ではない)
2019_U5_1_fig3.png入院患者数あたり医師数のジニ係数タイルマップ本スクリプト生成(原論文 表2 の報告値の再表現。再計算ではない)
2019_U5_1_fig4.png2つのジニ係数の差分タイルマップ本スクリプト生成(原論文 表2 の報告値の再表現。再計算ではない)

従来指標(人口10万人あたり医師数)のみ SSDSE-A-2025 の実データ計算。図1〜図4は原論文の報告値の可視化であり、合成データ・創作値は一切使用していない。

教育用再現ページ | 2019年度 統計データ分析コンペティション 特別賞(大学生・一般の部)

⚠️ よくある誤解——この論文を読むときの注意

この論文は検定も回帰も使わない「記述統計」の論文です。だからこそ、指標と可視化の解釈で誤解が起きやすいポイントを整理します。

❌ 「ジニ係数が0.4未満だから偏在は問題ない」ではない
「0.4を超えると不平等」という目安は、もともと所得分配の文脈(UN-Habitat)で使われてきた経験則です。医師配置のような別の資源に機械的に当てはめてよい理論的根拠はありません。原論文も0.4を「絶対的な合格ライン」ではなく比較の参照点として使っています。重要なのは水準そのものより、「分母を患者数に変えると最大・最小・中央値がすべて上がる」という相対比較の方です。
❌ 「このページの図2〜図4は再現実験の結果」ではない
図2〜図4のジニ係数は原論文 表2 の報告値をそのまま可視化したもので、再計算ではありません。再計算には市区町村→二次医療圏の対応表(平成28年医療施設調査)と二次医療圏別の推計入院患者数(平成29年患者調査)が必要ですが、SSDSEには未収録です。本ページで実データから計算しているのは従来指標「人口10万人あたり医師数」だけです。何が実データ計算で何が報告値かを区別して読む習慣は、再現性の議論の第一歩です。
❌ 「入院患者数=医療需要そのもの」ではない
入院患者数はあくまで潜在的医療需要の代理変数(proxy)です。原論文自身も、外来患者を含められていないこと、地理的要素を考慮できていないことを課題に挙げています。さらに注意したいのは需要と供給の相互依存:入院は病床と医師があって初めて発生するので、患者数は供給側の影響も受けます(供給者誘発需要の議論)。なお原論文には入院患者数を「操作変数として用い」という記述がありますが、これは計量経済学のIV(instrumental variable)ではなく代理変数の意味で使われています。
❌ 「色が濃い県=医師が少ない県」ではない
図2・図3のジニ係数は「都道府県の中の二次医療圏間のばらつき」を測っており、医師の絶対数や充足度ではありません。実際、東京都は人口10万対医師数では全国トップクラス(本ページの実データ計算でも345.8人)ですが、ジニ係数は全国最大(0.359)——都心に医師が集中し、島嶼部・多摩地域との圏域間格差が大きいためです。「多い/少ない」と「偏っている/均等」は別の軸だと意識してください。
❌ 「分析単位を変えても結果は同じ」ではない
ジニ係数は集計単位の取り方に依存します(可変単位地区問題:MAUP)。市区町村単位で測るか、二次医療圏単位で測るか、圏域数が21ある北海道と3〜4しかない県とでは、値の意味合いも安定性も変わります。原論文が二次医療圏を選んだのは「入院医療の提供単位」という制度上の対応があるからで、単位の選択理由を明示している点が優れています。自分で応用するときも「なぜその単位か」を必ず言語化しましょう。
❌ 「記述統計だけの論文は価値が低い」ではない
本論文は検定もモデルも使っていませんが、特別賞を受賞しました。審査会コメントも「記述統計的分析のレベルにはとどまっているが、解釈も明確で好感が持てる」と評価しています。適切な問い × 適切な指標設計 × 適切な可視化がそろえば、記述統計だけでも政策提言につながる知見が出せます。逆に、問いが曖昧なまま高度な手法を使っても良い分析にはなりません。

📖 用語集(この記事に出てくる統計用語)

統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。

ジニ係数
分布の不平等さ(偏り)を0〜1で表す指標。0に近いほど平等、1に近いほど不平等。0.4をこえると不平等といわれる(原論文はUN-Habitat 2008を引用)。もとは所得分配の指標だが、本論文のように資源配分の偏り一般に使える。
ローレンツ曲線
対象を「1単位あたりの量」の小さい順に並べ、累積の相対割合(横軸)と配分される量の累積相対割合(縦軸)を結んだ曲線。完全平等なら45度線に一致。ジニ係数はこの曲線と45度線に挟まれた面積の2倍。
二次医療圏
一体の区域として病院等における入院に係る医療を提供することが相当である単位。地理的条件・日常生活の需要の充足状況・交通事情等の社会的条件を考慮して設定される。原論文が使った平成28年医療施設(動態)調査の時点で全国344圏域。
潜在的医療需要
原論文の中心概念。実際に医療を必要としている人の量。人口では捉えられないため、原論文は「二次医療圏内に居住する入院患者数(患者調査・患者住所地ベース)」をその代理として用いた。
代理変数(proxy variable)
直接観測できない概念(例:医療需要)の代わりに使う、観測可能で強く関連する変数(例:入院患者数)。代理の妥当性が分析全体の妥当性を左右する。
中央値
データを小さい順に並べたときの真ん中の値。外れ値(例:東京都の突出したジニ係数)の影響を受けにくいため、平均と併記されることが多い。原論文もジニ係数の要約に中央値を使っている。
コロプレス図(塗り分け地図)
地域ごとの統計量を色の濃淡で地図上に表す地図可視化の代表的手法。原論文の図2〜図4がこれ。面積の大きい地域が視覚的に過大評価されやすい点に注意。
タイルマップ
各地域を同じ大きさのタイルとして格子状に並べる地図表現。面積による誇張がなく数値も書き込めるが、正確な位置・隣接関係は近似になる。本ページの図2〜図4で採用。
実データと報告値
本ページでは、SSDSE から実際に計算した値を「実データ計算」、原論文に記載された数値の転記を「原論文の報告値」と呼んで区別している。図2〜図4は後者の可視化。
記述統計
データの特徴を要約・可視化して示す統計(平均・中央値・ジニ係数・地図など)。仮説検定や回帰のような推測統計と対になる概念。本論文は記述統計のみで構成される。

📐 使っている手法をわかりやすく解説

統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。

◆ 統計の基本概念(どの論文にも共通)

🔍 要約統計量(最大・最小・中央値)とは
何?
データ全体の特徴を少数の数値に要約したもの。本論文は47都道府県のジニ係数を「最大・最小・中央値」で要約している。
なぜ必要?
47個の値を全部眺めても傾向はつかめない。少数の代表値に圧縮することで、2つの分布(人口あたり vs 患者数あたり)を比較できるようになる。
何がわかる?
「最大・最小・中央値のすべてが高くなった」という本論文の主要な発見は、この要約統計量の比較そのもの。
読み方
平均外れ値に引きずられるため、東京都(0.359)のような突出値があるデータでは中央値の方が分布の中心を素直に表す。
🗂️ 検定のない論文の読み方
何?
本論文にはp値も信頼区間も登場しない。全都道府県・全二次医療圏の「全数データ」を記述しているからである。
なぜ必要?
標本から母集団を推測する場面では検定が要るが、47都道府県すべてを観測している場合、「標本誤差」の議論はそもそも発生しにくい(測定誤差や年次のずれは別途残る)。
何がわかる?
検定がなくても、指標の定義・データの出典・比較の設計が適切なら結論は成立する。逆に、検定があっても設計が悪ければ結論は成立しない。
読み方
「差は偶然か?」の代わりに「指標の定義は妥当か?」「比較の条件は揃っているか?」を問いながら読むのが、記述統計論文の正しい読み方。

◆ この論文で使われている手法

📈 ジニ係数ローレンツ曲線
何?
資源(医師)の配分がどれだけ偏っているかを0〜1の1つの数値に要約する手法。ローレンツ曲線の「たわみ」の大きさを面積で測る。
どう使う?
単位地域を1人当たり量の小さい順に並べ、累積相対割合の折れ線(ローレンツ曲線)を描き、45度線との間の面積を2倍する(台形公式)。
何がわかる?
「偏りの大きさ」を地域間・時点間・指標間で比較できる。本論文は47都道府県 × 2種類の分母で比較した。
結果の読み方
0に近いほど平等。0.4超は「不平等」といわれる目安(所得分配由来)。値の水準より、条件を変えたときの変化の方向が本質的な情報になることが多い。
⚠️ 注意点
(1) 集計単位に依存——二次医療圏の数が3〜4しかない県では少数の圏域で値が決まり不安定(MAUP)。(2) 0.4基準は経験則——所得分配の文脈由来で、他の資源への機械的適用は不可。(3) 並べ替えに敏感——「1人当たり量の昇順」という並べ方の定義を変えると値が変わる。(4) 分布の形は見えない——同じジニ係数でも「上位集中」と「下位欠落」は区別できないので、ローレンツ曲線自体も確認する。
🧮 指標設計(分母の選択・代理変数)
何?
「何を何で割るか」を目的に合わせて設計すること。本論文の「医師数÷入院患者数」は、需要を反映した偏在指標の設計例。
どう使う?
測りたい概念(医療需要に対する供給の偏り)を言語化し、分子(医師数)と分母(人口 or 患者数)の候補を比較して、目的に合う組を選ぶ。
何がわかる?
同じデータでも指標の定義しだいで見える偏在が変わる。本論文では分母を変えるだけで最大・最小・中央値がすべて上昇した(報告値)。
結果の読み方
指標の変化分(差分)にこそ情報がある。差分が正=需要を考慮すると偏在がより深刻に見える地域。
⚠️ 注意点
(1) 分母の妥当性が生命線——入院患者数は外来を含まず、需要の一部しか代理しない。(2) 分母と分子の年次を揃える——原論文は医師数2016年に最も近い患者調査2017年を選択し、ずれを明示した。(3) 需要と供給の相互依存——患者数は供給(病床・医師)の影響も受けるため、純粋な需要とは限らない。(4) 単位の換算ミス——患者調査は千人単位・医師調査も千人単位の表があるため、実数への換算を必ず確認。
🗾 地図可視化(コロプレス図・差分地図)
何?
地域別の統計量を色の濃淡で地図上に示す手法。本論文は図2・図3(水準)と図4(差分)の3枚構成。
どう使う?
連続量は単色の濃淡(例:Blues)、正負のある差分は発散配色(青⇔白⇔赤)を使い、凡例の範囲を明示する。
何がわかる?
表では気づきにくい空間的なまとまり(例:差分の大きい県が西日本に集中)が一目でわかる。
結果の読み方
色の濃さは凡例の範囲に対する相対値。図をまたいで比較するときは色スケールが同一かを必ず確認する。
⚠️ 注意点
(1) 色スケールの統一——図2と図3の凡例(0〜0.4)が揃っているから「図3の方が濃い」と言える。揃っていなければ比較は無意味。(2) 面積の錯覚——北海道のような大きい県は視覚的な重みが過大になる(タイルマップはこの対策)。(3) 階級区分の恣意性——連続階調か等間隔か分位点かで印象が大きく変わる。(4) 色覚多様性——赤緑の組み合わせは避け、青赤(本論文と同じ)や色覚に配慮したパレットを使う。
🔗 公的統計の結合(データ統合
何?
複数の公的統計を共通のキー(市区町村・二次医療圏)でつなぎ、単独の統計では作れない分析用データを作ること。
どう使う?
本論文は SSDSE-A(市区町村の医師数・人口)を医療施設調査の対応表で二次医療圏に集計し、患者調査の入院患者数と結合した。
何がわかる?
「二次医療圏別の患者1人当たり医師数」という、どの単独統計にも存在しない指標が計算できる。
結果の読み方
結合の各段階(対応表の年次、単位換算、例外処理)が結果の信頼性を決める。論文では処理をすべて明記するのが作法。
⚠️ 注意点
(1) 境界の不一致——市区町村内に複数の二次医療圏が含まれる例外(川崎市・横浜市)には個別対応が必要(原論文は医師・歯科医師・薬剤師調査と国勢調査で処理)。(2) 年次のずれ——医師数2016年・人口2015年・患者数2017年と揃いきらないことを明示する。(3) 市町村合併・圏域改編——対応表の時点と数値データの時点がずれると集計を誤る。(4) 単位の統一——千人単位と人単位の混在は結合ミスの定番。

🚀 発展の可能性(結果 X → 新仮説 Y → 課題 Z)

この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。

① 需要側の拡張:外来患者と年齢構造
結果 X
入院患者数を潜在的医療需要の代理としたところ、人口あたりよりも医師偏在が明確になった(原論文の報告値)。ただし外来患者は含められていない。
新仮説 Y
外来患者数や性・年齢階級別の受療率を組み込めば、需要の捕捉がさらに精緻になり、偏在の見え方が変わる(特に外来依存度の高い都市部で)可能性がある。
課題 Z
(1)NDBオープンデータや患者調査の外来推計から二次医療圏レベルの外来需要を構成する。(2)性・年齢階級別受療率 × 人口構成で「期待患者数」を計算し、実測の入院患者数と比較する。(3)入院のみ/入院+外来の2通りでジニ係数を計算し、結論の頑健性を確認する。
② 層別分析:審査コメントへの応答
結果 X
審査会コメントは「層別などを行うことでより良い分析ができたのではないか」と指摘した。
新仮説 Y
医師偏在は診療科(産科・小児科・外科など)や病床機能によって大きく異なり、全診療科合計のジニ係数は深刻な診療科別偏在を平均化して隠している可能性がある。
課題 Z
(1)医師・歯科医師・薬剤師調査の診療科別医師数で診療科別のジニ係数を計算する。(2)診療科別の患者数(患者調査の傷病分類)と対応させる。(3)「総数では平等でも診療科別では不平等」な県を特定し、政策優先度を提案する。
③ アクセスの空間分析と公式指標との比較
結果 X
原論文は地理的要素(居住しにくさ・交通事情)を考慮できなかったことを課題に挙げた。
新仮説 Y
同じジニ係数でも、圏域間の物理的距離・到達時間が長い県ほど偏在の実害(受療の断念・救急搬送時間)が大きいはずである。
課題 Z
(1)国土数値情報の医療機関データと道路網から「最寄り病院への到達時間」を計算する。(2)厚生労働省が2019年に導入した医師偏在指標(受療率・流出入・医師の性年齢構成を反映)と原論文のジニ係数の順位相関を調べ、シンプルな指標がどこまで公式指標を近似できるかを検証する。(3)到達時間を重みにした「アクセス調整済みジニ係数」を試作する。

🎯 自分でやってみよう(5つのチャレンジ)

学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。

★☆☆☆☆ 入門
CH1. スクリプトを実行して図を再現する
付属の Python スクリプトをそのまま実行し、図1〜図4を生成してみてください。
ポイント: 実行結果のどこまでが「SSDSE実データ計算」で、どこからが「原論文の報告値の可視化」かを説明できるようにする。
★★☆☆☆ 初級
CH2. 市区町村ベースで都道府県内ジニ係数を計算する
SSDSE-A-2025 には市区町村別の医師数(I6100)と総人口(A1101)が入っています。二次医療圏の代わりに市区町村を単位として、都道府県ごとの「人口あたり医師数のジニ係数」を計算してみましょう(本ページの gini_coef 関数が使えます)。
ポイント: 原論文(二次医療圏単位・表2)と順位を比べる。単位が細かくなるとジニ係数はどう変わるか(MAUP)。
★★★☆☆ 中級
CH3. 別の医療資源でタイルマップを描く
SSDSE-A には歯科医師数(I6200)・薬剤師数(I6300)・病院数なども収録されています。本ページの tile_map 関数を再利用して、別の資源の偏在を可視化してください。
ポイント: 医師と歯科医師で偏在のパターンは同じか? 色スケールをどう設定すれば公平な比較になるか。
★★★★☆ 上級
CH4. 「差分」の要因を回帰分析で探る
原論文 表2 の差分(本ページに転記)を目的変数に、SSDSE-B の都道府県データ(高齢化率・病床数・所得など)を説明変数にした回帰分析で、「なぜ西日本で差分が大きいのか」に仮説を立ててみましょう。
ポイント: N=47 の小サンプルなので、変数は絞り、係数の符号と大きさを中心に解釈する。
★★★★★ 発展
CH5. 自分の「分母」を設計する
本論文の本質は「分母を人口から患者数に変えた」ことです。あなたの関心のあるテーマで「従来の指標は何を分母にしているか」「本当の需要は何か」を考え、独自の指標を設計・可視化してください。例:保育所定員 ÷ 共働き世帯の乳幼児数、図書館数 ÷ 通学圏人口
ポイント: 問い・指標の定義・データ出典・可視化・限界を1ページのレポートにまとめる。
💡 ヒント: 詰まったら本サイトの他の論文(同じ手法を使っている)のスクリプトをコピーして組み合わせるのが効率的です。手法ガイド・用語集も参考に。

💼 この手法は実社会でこう使われている

本論文で学んだ手法(偏在指標の設計・ジニ係数・地図可視化)は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。

🏥
医療政策(医師偏在対策)
厚生労働省は2019年度から「医師偏在指標」を導入し、都道府県は医師確保計画で医師少数区域を指定しています。本論文とまったく同じ問題意識(人口10万対医師数の限界)が、現実の政策指標の設計に反映されています。
🏛️
行政の資源配分
保育所・学校・図書館・消防などの公共サービス配置でも、「人口あたり」ではなく「対象需要あたり」(乳幼児数・児童数・高齢者数)で偏りを測る指標設計が使われます。ジニ係数は配分の公平性のモニタリングに便利です。
🏢
企業の出店・物流戦略
小売・物流では「商圏人口あたり店舗数」「需要あたり配送拠点」の偏りを地図で可視化して空白地帯を特定します。需要の代理変数(昼間人口・EC注文数など)の選び方が本論文の分母選択と同じ論点になります。
📊
メディア・データジャーナリズム
「医師不足の地図」「保育の空白地帯」といった報道は、コロプレス図と偏在指標の組み合わせが定番です。色スケールの選び方ひとつで印象操作にもなり得るため、本論文のような凡例の統一が倫理的にも重要です。
🎓
学術研究(医療経済学・地理学)
医師の地理的分布研究は Lancet 掲載の Kobayashi & Takaki(1992)以来の蓄積があり、ジニ係数・アトキンソン尺度・タイル尺度による偏在測定は国際比較研究でも標準的な手法です。
🌍
国際機関の格差モニタリング
WHO は保健人材の偏在を、UN-Habitat は都市の所得格差をジニ係数で監視しています。本論文が引用した「0.4を超えると不平等」という目安も UN-Habitat の報告書に由来します。

🤔 よくある質問(読者からの想定Q&A)

この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。

Q1. この分析、自分でも完全に再現できますか?
一部できます。従来指標(人口10万人あたり医師数)は SSDSE-A の実データから計算でき、本ページのスクリプトで実行済みです。一方、原論文の中核である二次医療圏別ジニ係数は、市区町村→二次医療圏の対応表(医療施設調査)と入院患者数(患者調査)が必要で、e-Stat から自分で収集すれば原理的には再現可能ですが、SSDSE だけでは再現できません。本ページの図2〜図4は原論文 表2 の報告値の可視化です。
Q2. ジニ係数が0.4未満なら医師偏在は心配ないのでは?
0.4はもともと所得分配の文脈の経験則で、医師配置の「合格ライン」ではありません。原論文のポイントは水準ではなく比較です:需要(入院患者数)を反映しただけで最大・最小・中央値がすべて上がった——つまり従来指標は偏在を過小に見せていた、という点にこそ意味があります。
Q3. この論文は因果関係を示していますか?
いいえ。本論文は偏在の実態を測って可視化する記述統計的分析であり、「なぜ西日本で差分が大きいのか」という要因(因果)は特定していません。審査会コメントもその点(層別などによる深掘りの余地)を指摘しています。ただし、政策の現状把握という目的に対しては記述統計で十分に価値があります。
Q4. 最新のデータで同じ分析をするとどうなりますか?
医師数はその後も増加しており(2022年時点の SSDSE-A-2025 集計で約34.3万人)、患者調査も2020年・2023年と更新されています。また厚生労働省の「医師偏在指標」という公式指標が2019年に導入されたため、原論文のジニ係数と公式指標の比較自体が面白い研究テーマになります(本ページ「発展の可能性③」参照)。
Q5. もっと深く学ぶには何を読めばいいですか?
ジニ係数・ローレンツ曲線は日本統計学会の『統計学基礎』(原論文の参考文献)でカバーされます。医師偏在の背景は桐野高明『医師の不足と過剰』(東京大学出版会, 2018)が読みやすい入門です。地図可視化は本サイトの他の論文(階級区分図を使った2019年高校生特別賞など)も参考になります。

✅ 理解度チェック(4問)

この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。

🐍 ブラウザで動かす — インストール不要でこの論文の分析を再現する

このページの分析は、この画面の中でそのまま実行できます。 Python をインストールする必要も、CSV をダウンロードする必要もありません。 下のセルの 「▶ ブラウザで実行」 を上から順に押すか、 「▶ 最初から全部実行」 で一気に流してください。 表示されるのは、本文の図表とまったく同じ計算の結果です (動かしているのは再現スクリプト code/2019_U5_1_shorei.py そのもの)。

コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。