より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

都道府県別の病院数についてPythonで分析してみる

都道府県別の病院数について自分なりに分析してみます。

www.e-stat.go.jp

前処理

下記の流れでデータを用意。

  1. e-statのサイトからダウンロード
  2. Googleスプレッドシートにアップロード
  3. スプレッドシート上で適当に編集、コメントアウト
  4. 再度スプレッドシートからダウンロード
  5. JupyterNotebookにアップロード

f:id:rimever:20181125222007p:plain

年々、病院は減っていますね。

PandasをMarkdownに変換

これまでJupyter Notebookのスクショを貼り付けることをしていました。

が、Markdownとして貼り付けた方がスマートだし、見栄えが良いからできないかなと思ったところ、下記サイトを見つけました。

DataFrame could have a to_markdown method. · Issue #11052 · pandas-dev/pandas · GitHub

temp = data.query("都道府県 == '全 国'")
from tabulate import tabulate
print(tabulate(temp, headers='keys', tablefmt='pipe'))

f:id:rimever:20181125222713p:plain

こんな感じで出ますので、出力された文字列を貼り付ければ。

都道府県 1996年 1999年 2002年 2005年 2008年 2011年 2014年 2015年 2016年 人口10万対
全 国 9490 9286 9187 9026 8794 8605 8493 8480 8442 6.7

表になります。

人口に対して病院が少ない都道府県は?

人口10万に対する病院数のデータがあるので、これで少ない順に並び替えてみます。

一番少ないのは神奈川。人口の多い県が目立ちます。

滋賀県が入ってきています。

正直なところ、地方にお医者さんがいないという話は聞きますので、関東圏の病院が少ないというのは私としては意外でした。

都道府県 1996年 1999年 2002年 2005年 2008年 2011年 2014年 2015年 2016年 人口10万対
神奈川 370 363 361 356 348 344 342 341 341 3.7
滋 賀 59 58 62 63 60 60 58 57 57 4
愛 知 394 374 365 350 334 327 321 322 323 4.3
千 葉 304 299 296 287 284 279 284 285 286 4.6
埼 玉 371 366 367 361 355 346 341 343 342 4.7
東 京 704 684 681 667 648 643 642 648 651 4.8

人口に対して病院が多い都道府県は?

高知県。全体的に九州が多い印象。

都道府県 1996年 1999年 2002年 2005年 2008年 2011年 2014年 2015年 2016年 人口10万対
高 知 150 148 144 141 140 137 130 131 130 18
鹿児島 292 290 285 279 274 265 256 252 252 15.4
徳 島 132 134 130 123 119 114 113 113 112 14.9
大 分 164 161 164 165 165 160 158 157 157 13.5
佐 賀 120 118 114 111 110 110 108 108 107 12.9
宮 崎 166 161 152 149 145 142 140 140 140 12.8
熊 本 234 230 225 222 217 216 214 214 212 12
長 崎 180 177 173 168 165 160 156 154 151 11

病院の少ない都道府県

先ほど上がった、人口に対して病院の少ない滋賀もランクインしていますが、一番少ないのは鳥取県

都道府県 1996年 1999年 2002年 2005年 2008年 2011年 2014年 2015年 2016年 人口10万対
鳥 取 42 44 46 45 46 45 45 45 44 7.7
島 根 63 61 59 58 57 54 52 51 51 7.4
滋 賀 59 58 62 63 60 60 58 57 57 4
山 梨 61 59 62 61 60 60 60 60 60 7.2
山 形 69 69 69 70 70 68 68 68 68 6.1

病院の多い都道府県

東京・北海道・大阪・福岡と大きな都市を抱える都道府県がランクイン。

都道府県 1996年 1999年 2002年 2005年 2008年 2011年 2014年 2015年 2016年 人口10万対
東 京 704 684 681 667 648 643 642 648 651 4.8
北海道 654 640 634 620 594 579 569 566 562 10.5
大 阪 591 575 566 552 541 534 530 531 523 5.9
福 岡 492 489 485 478 468 467 460 462 461 9
兵 庫 349 347 349 350 353 348 353 353 350 6.3

県別データの可視化

と、ここまでは、ただサイトのデータを並べ替えただけです。

Pythonならではのことにチャレンジしてみたいところ。

qiita.com

これはやりたいですね。

f:id:rimever:20181126073650p:plain

記事の通りにやっているだけなのですが、本当に日本地図が出てきました。

都道府県別に色を塗り分ける事も出来るので、ヒートマップで塗り分けてみようと思います。

ヒートマップとは?(英: Heat map)色の理由と見方を理解し、分析例を知る|【無料】ヒートマップ分析ツール (スマホ分析可)- MIERUCA(ミエルカ)

人口10万対

最大(緑)ー平均(黄色)ー最小(赤)となるようにします。

Pythonに慣れてスマートに書きたいのですが、こんな感じで。

%matplotlib inline
import matplotlib.pyplot as plt
from japanmap import *

column_name = '人口10万対'

color_map = {}

temp = data.query("都道府県 != '全 国'")

mean = np.mean(temp[column_name])
max_value = np.max(temp[column_name])
min_value = np.min(temp[column_name])

for index, row in temp.iterrows():        
    prefecture = str(index).replace(' ', '')
    value = row[column_name]
    if mean < value:
        red_value = int(255 - 255 * (value - mean) / (max_value - mean))
        red = str(hex(red_value))[2:]
        if len(red) == 1:
            red = "0" + red
            
        color_map[prefecture] = "#" + red + "FF00"
    else:
        green_value = int(255 - 255 * (mean - value) / (mean - min_value))
        green = str(hex(green_value))[2:]
        if len(green) == 1:
            green = "0" + green
        
        color_map[prefecture] = "#FF" + green + "00"


plt.imshow(picture(color_map));

諸事情により時間がないので。汚いコードでごめんなさい。

f:id:rimever:20181126230509p:plain

やはり、西は人口に対して全体的に病院は充足感ありそう。

2016年の病院数

さっきと似たようなロジックで

f:id:rimever:20181126230334p:plain

都市部の病院数自体は多いようですね。