この教材は原論文と同じデータを読み込み、同じ手順で計算し直しています。画面に出る数値と図は、あなたのブラウザがその場で計算した結果です。
⚠ ただし一部は再現していません:原論文の中核である二次医療圏別ジニ係数は、 市区町村→二次医療圏の対応表と入院患者数が必要で、 SSDSE だけでは再現できません。 図2〜図4 は原論文 表2 の報告値の可視化です。
| 原論文が使ったデータ | SSDSE-A・平成 28 年医療施設(動態)調査・平成 28 年医師・歯科医師・薬剤師調査・平成 27 年国勢調査・平成 29 年患者調査 分析単位:その他 中核手法:ジニ係数 |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | 潜在患者数に対する医師偏在の可視化 特別賞/眞田 英毅、三浦 萌実(東北大学大学院文学研究科、株式会社社会情報サービス) |
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2019_U5_1_shorei.py(244 行)そのものです。
このページの実データ計算(従来指標「人口10万人あたり医師数」)を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。図1〜図4は原論文の報告値を可視化するもので、追加データは不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
高齢化が進む日本では、医療へのアクセスにおける格差=医療格差が社会的課題として重要性を増している。平成20年度以降、医学部の入学定員は過去最大規模まで増員され、医師数は着実に増加してきた(2000年 255,792人 → 2016年 319,480人。原論文 図1)。それにもかかわらず、医師の地域偏在・診療科偏在は依然として解消されておらず、地域・診療科によってはいまだ「医師不足」と指摘されている。
地域ごとの医師数の比較には、これまで一般的に人口10万人対医師数が使われてきた。しかし原論文は、この指標には「医療需要(ニーズ)」が考慮されていない——つまり「人口のうちどれだけの人が実際に医療を必要としているか」が反映されていない——ことを問題にする。厚生労働省の医師需給分科会第2次中間取りまとめでも「都道府県が主体的・実効的に医師偏在対策を講じることができる体制の構築」が掲げられており、偏在を測る新しい「ものさし」の開発は急務である。
そこで原論文は、入院患者数という情報を新しく用いる。入院患者は実際に医療を必要としている人の数であり、その地域における潜在的な医療需要とみなすことができる。従来の人口あたり医師数による偏在の見え方と、新たに算出する入院患者数あたり医師数による偏在の見え方を比較することで、医療へのアクセスの実態をより詳細に明らかにすることを目指した。
日本の医師偏在を地理的分布から捉えた研究として、原論文は次を挙げる。Kobayashi & Takaki(1992, Lancet)は全国の市町村の医師数と人口で2時点のローレンツ曲線を描いてジニ係数を比較し、1980〜1990年の医師増加が偏在を改善したかを検証した。Toyabe(2009)はジニ係数に加えてアトキンソン尺度・タイル尺度を用いて1996〜2006年の変化を追った。同一時点の偏在については、三浦ら(2010)が人口10万人当たり医師数を二次医療圏ごとに偏差値化し、石川ら(2011)が面積1,000km²あたり医師数や75歳以上人口の増減率も用いて偏在を示した。
ジニ係数 ローレンツ曲線 二次医療圏 地図可視化(コロプレス図) 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年データが使われている。入院では二次医療圏を跨ぐ患者の「流入」「流出」が起きるが、流出は需要(患者数)に対して供給(医師数)が不足している場合に発生するため、原論文は「各医療圏に居住する患者は当該医療圏内で受療できる状況が望ましい」という観点から、患者の住所地ベースの入院患者数を用いている。二次医療圏が入院医療の単位であることから、分析対象は入院患者のみである。
ジニ係数は不平等さを0〜1の数値で表す指標で、0に近いほど平等、1に近いほど不平等となる。原論文の手順は次の3段階である(各都道府県について実施)。
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都道府県に集計。医師数と総人口の合計から従来指標を計算します。df['A'] / df['B'] * 100000 — pandasの列同士の演算は要素ごと(element-wise)。「10万人あたり」のような率の計算が1行で書けます。※ 本節のジニ係数・差分などの統計量はすべて原論文の報告値である。図1は原論文 図1 の報告値の可視化、図2〜図4は原論文 表2 の報告値の再表現であり、再計算ではない。
医師・歯科医師・薬剤師調査によれば、医師数は2000年の255,792人から2016年の319,480人まで一貫して増加した。「総数が増えても偏在は解消されない」——これが原論文の出発点である。
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人) → 医師総数は一貫して増加。それでも「偏在」は解消していない、が出発点
years と docs は原論文 図1 に記載された値の転記(出典:医師・歯科医師・薬剤師調査)。再計算ではありません。ax.text(...) で各棒の上に実数値を表示。原論文の図1もデータラベル付きの棒グラフです。ax.yaxis.set_major_formatter(lambda x, _: f'{int(x):,}') — 目盛りを3桁区切りにする小技。{値:,}(3桁区切り)、{値:.3f}(小数3桁)を覚えると数値の見せ方が一気に整います。従来型の指標(人口1人当たり医師数)で、都道府県内の二次医療圏間の偏りをジニ係数にすると、最大値0.326(東京都)・最小値0.083(広島県・徳島県)・中央値0.147であった(原論文の報告値)。ジニ係数は0.4をこえると不平等といわれるが(原論文はUN-Habitat 2008を引用)、人口あたりでみる限り「すぐさま改善が必要」といえる水準の県はない。ただし都道府県ごとの差は大きく、人口の多い関東地方や島嶼部を含む都道府県で値が高くなる傾向があった。
分母を人口から入院患者数(潜在的医療需要)に変えると、ジニ係数は最大値0.359・最小値0.106・中央値0.177となり、最大値・最小値・中央値のすべてが人口あたりよりも高くなった(原論文の報告値)。原論文はこれを「入院患者数あたりで確認すると医師偏在がより明確になる」と解釈し、最大値0.359(東京都)は不平等の目安である0.4に近づきつつある数字として特に注意が必要だとした。
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都道府県分の報告値をそのまま転記したものです。pd.DataFrame(辞書, index=[...]).T — 「キー→タプル」の辞書は転置 .T で行=キーの表になります。最後に、差分 = Gini(入院患者数) − Gini(人口) を都道府県ごとにとる。差分が正なら「潜在的医療需要を考慮した場合にジニ係数が高くなる」=人口に対して潜在的医療需要が高い県(青)、負ならその逆(赤)である。原論文 図4 から、人口当たり医師数では捉えられなかった潜在的医療需要に対する医師偏在は、おもに西日本で多く発生していることが読み取れる。
| 都道府県 | ジニ係数 (入院患者数) | ジニ係数 (人口) | 差分 | 都道府県 | ジニ係数 (入院患者数) | ジニ係数 (人口) | 差分 |
|---|---|---|---|---|---|---|---|
| 北海道 | 0.195 | 0.173 | +0.022 | 滋賀県 | 0.215 | 0.191 | +0.024 |
| 青森県 | 0.196 | 0.175 | +0.021 | 京都府 | 0.167 | 0.170 | -0.003 |
| 岩手県 | 0.218 | 0.181 | +0.037 | 大阪府 | 0.146 | 0.126 | +0.020 |
| 宮城県 | 0.188 | 0.117 | +0.071 | 兵庫県 | 0.165 | 0.123 | +0.043 |
| 秋田県 | 0.195 | 0.181 | +0.014 | 奈良県 | 0.109 | 0.085 | +0.024 |
| 山形県 | 0.107 | 0.125 | -0.018 | 和歌山県 | 0.205 | 0.185 | +0.020 |
| 福島県 | 0.177 | 0.129 | +0.049 | 鳥取県 | 0.197 | 0.160 | +0.037 |
| 茨城県 | 0.290 | 0.257 | +0.032 | 島根県 | 0.292 | 0.205 | +0.088 |
| 栃木県 | 0.293 | 0.229 | +0.064 | 岡山県 | 0.150 | 0.105 | +0.046 |
| 群馬県 | 0.250 | 0.218 | +0.032 | 広島県 | 0.152 | 0.083 | +0.069 |
| 埼玉県 | 0.113 | 0.109 | +0.004 | 山口県 | 0.161 | 0.138 | +0.023 |
| 千葉県 | 0.171 | 0.124 | +0.047 | 徳島県 | 0.154 | 0.083 | +0.071 |
| 東京都 | 0.359 | 0.326 | +0.033 | 香川県 | 0.211 | 0.136 | +0.074 |
| 神奈川県 | 0.106 | 0.112 | -0.006 | 愛媛県 | 0.244 | 0.147 | +0.097 |
| 新潟県 | 0.141 | 0.138 | +0.003 | 高知県 | 0.119 | 0.111 | +0.008 |
| 富山県 | 0.117 | 0.104 | +0.013 | 福岡県 | 0.224 | 0.160 | +0.064 |
| 石川県 | 0.175 | 0.146 | +0.030 | 佐賀県 | 0.210 | 0.171 | +0.039 |
| 福井県 | 0.234 | 0.217 | +0.018 | 長崎県 | 0.150 | 0.167 | -0.017 |
| 山梨県 | 0.175 | 0.154 | +0.021 | 熊本県 | 0.302 | 0.220 | +0.082 |
| 長野県 | 0.179 | 0.169 | +0.010 | 大分県 | 0.196 | 0.104 | +0.091 |
| 岐阜県 | 0.151 | 0.134 | +0.017 | 宮崎県 | 0.293 | 0.192 | +0.100 |
| 静岡県 | 0.131 | 0.113 | +0.018 | 鹿児島県 | 0.276 | 0.205 | +0.071 |
| 愛知県 | 0.176 | 0.200 | -0.025 | 沖縄県 | 0.159 | 0.126 | +0.033 |
| 三重県 | 0.123 | 0.107 | +0.016 |
※ 値はすべて原論文 表2 の転記。赤字=差分が負の5県、青字=差分の大きい上位5県。表中の差分は原論文の表記のままであり、掲載値の丸めにより「入院患者数−人口」の単純計算と末尾が1違う県がある(例:茨城県 0.290−0.257=0.033 だが表は 0.032)。
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)より高い
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_shoreiTwoSlopeNorm(vmin=-0.10, vcenter=0.0, vmax=0.10) — 0を中心に正負で色を分ける正規化。原論文 図4 の凡例(+0.100〜−0.100、正=青・負=赤)に合わせています。df[df['列'] > 0] — 条件式で行を絞り込む「ブールインデックス」。件数の確認は len() で。ローレンツ曲線は、対象(ここでは都道府県内の二次医療圏)を「1単位あたりの量(人口1人当たり医師数)」の小さい順に並べ、横軸に累積人口の相対割合、縦軸に累積医師数の相対割合をとって描く曲線。完全に平等なら45度線(均等配分線)に一致し、偏りが大きいほど下にたわむ。ジニ係数は「45度線とローレンツ曲線に挟まれた面積の2倍」で、0(完全平等)〜1(完全不平等)の値をとる。
本論文の核心は、高度な統計モデルではなく指標の分母の選び直しにある。「医師数 ÷ 人口」は供給を住んでいる人の数で割った指標であり、医療を必要としない人も分母に含まれる。「医師数 ÷ 入院患者数」は供給を実際に医療を必要としている人の数(潜在的医療需要の代理)で割った指標である。同じ医師数データでも、分母が変わればジニ係数の値も順位も変わる——これが図2と図3の違いを生む。
分析単位(市区町村か、二次医療圏か、都道府県か)の選択は結果を左右する(可変単位地区問題:MAUP)。原論文が二次医療圏を選んだのは統計上の都合ではなく、「一般の入院に係る医療を提供する地域的単位」という制度上の定義が、入院患者数という需要指標と正確に対応するからである。さらに医師偏在対策の実施主体が都道府県であることから、「都道府県の中の二次医療圏間の偏り」を測る設計にした。分析単位を制度・政策の単位と揃えることで、結果がそのまま政策提言(都道府県内での医師の割振り配置)につながっている。
| 方式 | 長所 | 短所 | 本ページでの扱い |
|---|---|---|---|
| コロプレス図(原論文 図2〜4) | 実際の地形で直感的 | 面積の大きい県(北海道など)が過大に見える。白地図データが必要 | 原論文を参照 |
| タイルマップ(本ページ 図2〜4) | 全県が同じ大きさ=値の比較が公平。数値を書き込める | 正確な位置・隣接関係は近似 | 原論文 表2 の報告値で再表現 |
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) を使います。ax.add_patch(Rectangle(...)) — matplotlibでは長方形・円などの図形を「パッチ」として自由に置けます。グラフ以外の図解にも便利。論文審査会コメントは「記述統計的分析のレベルにはとどまっているが、解釈も明確で好感が持てる」と評価した上で、「層別などを行うことでより良い分析ができたのではないか」と指摘している。層別の候補としては、診療科別(偏在は診療科によって大きく異なる)、年齢階級別(高齢者ほど入院需要が高い)、病床機能別(高度急性期〜慢性期)などが考えられる。
| 課題 | 内容 | 発展の方向 |
|---|---|---|
| 外来患者の欠落 | 二次医療圏ごとの外来患者数データがなく、入院患者のみで分析 | NDBオープンデータ・患者調査の外来推計の活用 |
| 地理的要素 | 居住しにくさ・交通事情等を考慮できていない | アクセス時間(最寄り病院への到達時間)を組み込む空間分析 |
| 患者の流出入 | 患者住所地ベース=「圏内で受療できる状況が望ましい」という規範的仮定 | 受療地ベースとの比較、流出入率の分析 |
| 記述統計の範囲 | 偏在の「記述」であり、偏在の「要因」は特定していない | 回帰分析等で偏在の決定要因を探る(審査コメントの層別も) |
| ファイル | 内容 | 出典 |
|---|---|---|
| SSDSE-A-2025.csv | 1,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.png | 2つのジニ係数の差分タイルマップ | 本スクリプト生成(原論文 表2 の報告値の再表現。再計算ではない) |
従来指標(人口10万人あたり医師数)のみ SSDSE-A-2025 の実データ計算。図1〜図4は原論文の報告値の可視化であり、合成データ・創作値は一切使用していない。
この論文は検定も回帰も使わない「記述統計」の論文です。だからこそ、指標と可視化の解釈で誤解が起きやすいポイントを整理します。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
gini_coef 関数が使えます)。
tile_map 関数を再利用して、別の資源の偏在を可視化してください。
本論文で学んだ手法(偏在指標の設計・ジニ係数・地図可視化)は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2019_U5_1_shorei.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。