よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

厚労省の新型コロナデータでグラフ作成

半年ぶりの投稿。
モジュールの使い方等いろいろ忘れているので調べながら思いだしつつ。

この投稿では、厚労省のサイトオープンデータ|厚生労働省 に置いてある新型コロナのデータセットcsvファイルをそのまま用いてグラフを描いてみます。

目次




実行環境


Androidスマホ
termux
Python3.8
JupyterNotebook

csvファイルはローカルにダウンロードして使用。



陽性者数


https://www.mhlw.go.jp/content/pcr_positive_daily.csv

# ライブラリのインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Pandasでファイルの読み込み
df_posi = pd.read_csv("pcr_positive_daily.csv")
# 上から5行だけデータフレームの確認
df_posi.head()
日付 PCR 検査陽性者数(単日)
0 2020/1/16 1
1 2020/1/17 0
2 2020/1/18 0
3 2020/1/19 0
4 2020/1/20 0
# 欠損値の有無の確認
df_posi.isnull().sum()
日付                0
PCR 検査陽性者数(単日)    0
dtype: int64
# Numpy配列に変換
np_arr = np.array(df_posi)

# 横・縦軸の配列データをx,yで
x = np.array(np_arr[:,0]) #横軸データ
y = np.array(np_arr[:,1]) #縦軸データ

plt.plot(x,y)
plt.savefig("pcr_positive_daily.png")
plt.show()

f:id:chayarokurokuro:20200724162428j:plain

※横軸は見えにくいが「日付」です。
グラフは1日毎の新規感染者数を表している。政治家らが「第2波」と言っているのはこのグラフによるのだろう。



同様にして他のファイルもグラフ化していく。



PCR検査実施人数


https://www.mhlw.go.jp/content/pcr_tested_daily.csv

# Pandasデータフレームに読み込み
df_tested = pd.read_csv("pcr_tested_daily.csv")
df_tested.head()
日付 PCR 検査実施件数(単日)
0 2020/2/5 4
1 2020/2/6 19
2 2020/2/7 9
3 2020/2/8 4
4 2020/2/9 10
df_tested.isnull().sum()
日付                0
PCR 検査実施件数(単日)    0
dtype: int64
np_tested = np.array(df_tested)

x_tested = np.array(np_tested[:,0])
y_tested = np.array(np_tested[:,1])

plt.plot(x_tested, y_tested)
plt.savefig("pcr_tested_daily.png")
plt.show()

f:id:chayarokurokuro:20200724162532j:plain

このグラフは1日毎のPCR検査実施人数を表している。
検査人数を増やしているので、前の感染者人数のグラフが増えたということです。小池都知事もそう発言している。
感染者の9割ほどは無症状と言われているが、検査人数を増やした為に無症状感染者が炙り出された形だと思われる。
初期段階から一定した人数で検査していた中で感染者の増加が再燃した、という訳ではない。
感染者は検査人数に比例して増えている。「第2波」は間違いだろう。



入院治療等を要する者の数


https://www.mhlw.go.jp/content/cases_total.csv

# データフレームに取り込み
df_cases_total = pd.read_csv("cases_total.csv")
df_cases_total.head()
日付 入院治療を要する者
0 2020/2/4 15
1 2020/2/5 16
2 2020/2/6 12
3 2020/2/7 12
4 2020/2/8 7
df_cases_total.isnull().sum()
日付           0
入院治療を要する者    0
dtype: int64
np_cases_total = np.array(df_cases_total)

x_cases_total = np.array(np_cases_total[:,0])
y_cases_total =np.array(np_cases_total[:,1])

plt.plot(x_cases_total, y_cases_total)
plt.savefig("cases_total.png")
plt.show()

f:id:chayarokurokuro:20200724162621j:plain

このグラフは入院治療を要すると判断された1日あたりの人数を表している。
検査人数を増やし、感染者がそれに比例して増加。それに伴い入院治療等の診断を下された人も増えたということ。
入院治療等の判断や症状の度合いについてはここでは不明。



退院または療養解除となった者の数


https://www.mhlw.go.jp/content/recovery_total.csv

# データフレームに取り込み
df_recovery_total = pd.read_csv("recovery_total.csv")
df_recovery_total.head()
日付 退院、療養解除となった者
0 2020/1/29 1
1 2020/1/30 1
2 2020/1/31 1
3 2020/2/1 1
4 2020/2/2 1
df_recovery_total.isnull().sum()
日付              0
退院、療養解除となった者    0
dtype: int64
np_recovery_total = np.array(df_recovery_total)

x_recovery_total = np.array(np_recovery_total[:,0])
y_recovery_total = np.array(np_recovery_total[:,1])

plt.plot(x_recovery_total, y_recovery_total)
plt.savefig("recovery_total.png")
plt.show()

f:id:chayarokurokuro:20200724162803j:plain

このグラフは、退院と療養解除の人数を積算で表している。



死亡者数


https://www.mhlw.go.jp/content/death_total.csv

# データフレームに取り込み
df_death_total = pd.read_csv("death_total.csv")
df_death_total
日付 死亡者数
0 2020/2/14 1
1 2020/2/15 1
2 2020/2/16 1
3 2020/2/17 1
4 2020/2/18 1
... ... ...
155 2020/7/18 984
156 2020/7/19 984
157 2020/7/20 987
158 2020/7/21 988
159 2020/7/22 989

160 rows × 2 columns

# Numpy配列に変換
np_death_total = np.array(df_death_total)
# 死者数の積算の列を抜き出し
np_y_total = np_death_total[:,1]
# 累積を差分にする(1日毎の増加分に変換)
np_diff = np.diff(np_y_total)

np_diff
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 0, 1, 0, 0, 0, 0, 0,
       0, 1, 2, 3, 3, 4, 2, 1, 2, 4, 1, 2, 2, 2, 1, 5, 1, 1, 2, 1, 3, 3,
       2, 2, 1, 3, 3, 6, 1, 3, 7, 1, 4, 3, 6, 4, 4, 7, 10, 17, 12, 6, 7,
       10, 15, 91, 10, 30, 17, 14, 3, 25, 13, 26, 17, 26, 34, 18, 11, 22,
       8, 49, 13, 8, 22, 25, 19, 23, 15, 19, 5, 14, 8, 6, 19, 12, 12, 10,
       16, 12, 9, 7, 12, 5, 1, 2, 6, 3, 4, 7, 2, 0, 0, 3, 1, 2, 2, 1, 0,
       2, 4, 4, 0, 17, 1, 0, 2, 8, 4, 1, 2, 0, 1, 0, 2, 1, 1, 1, 0, 0, 1,
       2, 1, 1, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 3, 1, 1], dtype=object)
# 最大値の確認
np_diff.max()
91
# 先頭に初期値を追加
y_death_daily = np.append(1,np_diff)

x_death_daily = np.array(np_death_total[:,0])

plt.plot(x_death_daily, y_death_daily)
plt.savefig("death_daily.png")
plt.show()

f:id:chayarokurokuro:20200724162848j:plain

このグラフは新型コロナが原因と判断された死亡者の1日毎の人数を表している。
基データcsvファイルは死亡者数の積算になっているため、np.diffを使って1日あたりの数に変換した。データが一つ減るので、先頭にnp.appendで初期値の1(1人)を追加している。

前のグラフに於けるいわゆる「第2波」部分で検査人数や感染者数が増えているにもかかわらず、死者数の増加はこのグラフでは見られない。

基本的に死亡原因の診断は各医師の判断に任されているようです。
ウイルス(コロナなど)が原因の風邪をこじらせて肺炎を併発して亡くなった場合、死亡診断は「肺炎」とされる可能性が高い。そうであるから肺炎の死亡者数が年間10万人以上いると言える。

「風邪は万病の基」ということで。



PCR検査の実施件数


https://www.mhlw.go.jp/content/pcr_case_daily.csv

df_pcr_case_daily = pd.read_csv("pcr_case_daily.csv")    
df_pcr_case_daily.head()
日付 国立感染症研究所 検疫所 地方衛生研究所・保健所 民間検査会社 大学等 医療機関
0 2020/2/18 472 75 398 0 79 NaN
1 2020/2/19 15 68 609 0 0 NaN
2 2020/2/20 20 15 758 0 0 NaN
3 2020/2/21 261 188 902 132 108 NaN
4 2020/2/22 341 127 677 2 19 NaN
df_pcr_case_daily.isnull().sum()
日付              0
国立感染症研究所        0
検疫所             0
地方衛生研究所・保健所     0
民間検査会社          0
大学等             0
医療機関           17
dtype: int64

どこでどれだけ検査の実施がされたかのデータ。グラフは無しで。



発生状況


https://www.mhlw.go.jp/content/current_situation.csv

df_current_situation = pd.read_csv("current_situation.csv")
df_current_situation.head()
Unnamed: 0 PCR検査\n実施人数 ※3 陽性者数 入院治療等を要する者の数 うち重症者の数 退院又は療養解除と\nなった者の数 死亡者数 確認中 ※4
0 国内事例 ※1,※5\n(チャーター便帰国\n者を除く) 579,185\n(+16,357) 26,529\n(+792) ※2 4,751\n(+330) 59\n(+4) 20,787\n(+384) 989\n(+1) 14\n(+7)
1 空港検疫 108,022\n(+1,060) 485\n(+4) 251\n(+4) 0 233 1 0
2 チャーター便\n帰国者事例 829 15 0 0 15 0 0
3 合計 688,036\n(+17,417) 27,029\n(+796) ※2 5,002\n(+334) 59\n(+4) 21,035\n(+384) 990\n(+1) 14\n(+7)

これもグラフ無しで。



以上。