Quantcast
Channel: pandas - よちよちpython
Viewing all articles
Browse latest Browse all 30

新型コロナのデータを見る

$
0
0

新型コロナのデータ 2021-07-03まで

どんな具合か久しぶりに見てみる。書き散らかしメモ。



目次



データファイル

# 新型コロナのデータファイルURLリスト
URLs = [
    "http://www.ipss.go.jp/projects/j/Choju/covid19/data/japan_deaths.xlsx", # 年代別データ(国立社会保障・人口問題研究所)"https://toyokeizai.net/sp/visual/tko/covid19/csv/demography.csv", # 年代別国内発生動向 (東洋経済オンライン)"https://www.mhlw.go.jp/content/pcr_positive_daily.csv", # 陽性者数 (厚生労働省 オープンデータ)"https://www.mhlw.go.jp/content/pcr_tested_daily.csv", # PCR検査実施人数 (厚生労働省 オープンデータ)"https://www.mhlw.go.jp/content/cases_total.csv",   # 入院治療等を要する者の数(厚生労働省 オープンデータ)"https://www.mhlw.go.jp/content/recovery_total.csv",  # 退院又は療養解除となった者の数(厚生労働省 オープンデータ)"https://www.mhlw.go.jp/content/death_total.csv",  # 死亡者数(厚生労働省 オープンデータ)"https://www.mhlw.go.jp/content/pcr_case_daily.csv",  # PCR検査の実施件数(厚生労働省 オープンデータ)"https://www.mhlw.go.jp/content/current_situation.csv",  # 発生状況(厚生労働省 オープンデータ)"https://www.mhlw.go.jp/content/severe_daily.csv",  # 重症者 (厚生労働省 オープンデータ)"https://www3.nhk.or.jp/n-data/opendata/coronavirus/nhk_news_covid19_prefectures_daily_data.csv", # 都道府県別感染者・死亡者(NHK)    
]

リストの1番上のExcelファイル以外を今回使います。10個

# 使用するデータファイルfrom glob import glob

files = glob('*.csv')
files
['cases_total.csv',
 'current_situation.csv',
 'death_total.csv',
 'demography.csv',
 'nhk_news_covid19_prefectures_daily_data.csv',
 'pcr_case_daily.csv',
 'pcr_positive_daily.csv',
 'pcr_tested_daily.csv',
 'recovery_total.csv',
 'severe_daily.csv']
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
%matplotlib inline



no.0 cases_total.csv

df_cases_total = pd.read_csv(files[0])
df_cases_total
日付\t入院治療を要する者
02020/2/415
12020/2/516
22020/2/612
32020/2/712
42020/2/87
.........
5112021/6/2916159
5122021/6/3016272
5132021/7/116249
5142021/7/216192
5152021/7/316350

516 rows × 2 columns

# cases_total.csv 折れ線グラフ# インポート x軸日付ラベルの重なり解消import matplotlib.dates as mdates

# 時系列データに変換
df_cases_total_copy = df_cases_total.copy() # データフレームをコピー
df_cases_total_copy['日付\t'] = pd.to_datetime(df_cases_total['日付\t']) # 日付列をdatetime型に変換
df_cases_total_copy = df_cases_total_copy.set_index('日付\t')  # 日付列をインデックスにする# 折れ線グラフ
plt.figure(facecolor='w')
plt.plot(df_cases_total_copy)
plt.title('新型コロナ入院治療を要する者の数(2020-02-04~2021-07-03)')
plt.gcf().autofmt_xdate() # 日付ラベル重なり解消
plt.grid()
plt.savefig('00_cases_total折れ線グラフ.jpg')
plt.show()

f:id:chayarokurokuro:20210707202450j:plain



no.1 current_situation.csv

df_current_situation = pd.read_csv(files[1])
df_current_situation
Unnamed: 0PCR検査\n実施人数 ※3陽性者数入院治療等を要する者の数うち重症者の数退院又は療養解除と\nなった者の数死亡者数確認中 ※4
0国内事例 ※1,※5\n(チャーター便帰国\n者を除く)15,857,880 \n(+38,122)802,203\n(+1,864)※216,350\n(+158)496\n(-5)※6770,414\n(+1,692)14,837\n(+18)1,342\n(+8)
1空港,海港検疫779,294\n(+3,879)※73,158\n(+14)102\n(+10)03,051\n(+4)50
2チャーター便\n帰国者事例82915001500
3合計16,638,003\n(+42,001)805,376\n(+1,878)※216,452\n(+168)496\n(-5)※6773,480\n(+1,696)14,842\n(+18)1,342\n(+8)



no.2 death_total.csv

df_death_total = pd.read_csv(files[2])
df_death_total
日付死亡者数
02020/2/141
12020/2/151
22020/2/161
32020/2/171
42020/2/181
.........
5012021/6/2914735
5022021/6/3014776
5032021/7/114797
5042021/7/214819
5052021/7/314837

506 rows × 2 columns

# death_total.csv 折れ線グラフ# インポート x軸日付ラベルの重なり解消import matplotlib.dates as mdates

# 時系列データに変換
df_death_total_copy = df_death_total.copy() # データフレームをコピー
df_death_total_copy['日付'] = pd.to_datetime(df_death_total['日付']) # 日付列をdatetime型に変換
df_death_total_copy = df_death_total_copy.set_index('日付')  # 日付列をインデックスにする# 折れ線グラフ
plt.figure(facecolor='w')
plt.plot(df_death_total_copy)
plt.title('新型コロナ累計死亡者数(2020-02-14~2021-07-03)')
plt.gcf().autofmt_xdate() # 日付ラベル重なり解消
plt.grid()
plt.savefig('02_death_total折れ線グラフ.jpg')
plt.show()

f:id:chayarokurokuro:20210707202541j:plain



no.2.2 death_daily (death_total.csvを日毎に変換)

# death_totalの累計データを日毎に変換
narr = df_death_total.iloc[:, 1].to_numpy()
death_daily = np.append(1, np.diff(narr))
# データフレーム作成
df_death_daily = pd.DataFrame(df_death_total.iloc[:, 0])
df_death_daily['死亡者数(日毎)'] = death_daily
df_death_daily
日付死亡者数(日毎)
02020/2/141
12020/2/150
22020/2/160
32020/2/170
42020/2/180
.........
5012021/6/2935
5022021/6/3041
5032021/7/121
5042021/7/222
5052021/7/318

506 rows × 2 columns

# death_total.csvをdailyに変換したデータの折れ線グラフ# インポート x軸日付ラベルの重なり解消import matplotlib.dates as mdates

# 時系列データに変換
df_death_daily_copy = df_death_daily.copy() # データフレームをコピー
df_death_daily_copy['日付'] = pd.to_datetime(df_death_daily['日付']) # 日付列をdatetime型に変換
df_death_daily_copy = df_death_daily_copy.set_index('日付')  # 日付列をインデックスにする# 折れ線グラフ
plt.figure(facecolor='w')
plt.plot(df_death_daily_copy)
plt.title('新型コロナ日ごと死亡者数(2020-02-14~2021-07-03)')
plt.gcf().autofmt_xdate() # 日付ラベル重なり解消
plt.grid()
plt.savefig('02_2_death_daily折れ線グラフ.jpg')
plt.show()

f:id:chayarokurokuro:20210707202614j:plain

※右の方に1本飛び出して250人を超えてる部分があるのは、兵庫県神戸市が「カウントし損なっていたデータがあった」とかいう理由で2~3か月分の人数130人ほどを計上した為に不自然になっている。



no.3 demography.csv

df_demography = pd.read_csv(files[3])
df_demography
yearmonthdateage_grouptested_positivehospitalizedseriousdeath
0202163010歳未満26904198800
1202163010代59816426100
2202163020代1761221115408
3202163030代1180717507027
4202163040代115534833729106
5202163050代103576779560301
6202163060代66730567799939
7202163070代5836556731392976
8202163080代以上575355277798094
92021630不明1035810947259
# demography.csv 年代別棒グラフ作成
fig = plt.figure(figsize=(15, 20), facecolor='w')

data = [df_demography['tested_positive'], df_demography['hospitalized'], df_demography['serious'], df_demography['death']]
colors = ['orange', 'green', 'red', 'black'] # 色分け用
titles = ['陽性者数', '要入院者数', '重症者数', '死亡者数'] # タイトル用for i, (d, color, title) inenumerate(zip(data,colors, titles)):
    ax = fig.add_subplot(4,1,i+1)
    ax.bar(df_demography['age_group'], d, color=color)
    plt.title(f'年代別{title}グラフ', size=12)
    plt.xticks(size=12)
    plt.ylabel(f'{title}', size=15)
    plt.grid()

plt.savefig('demography_csv_bar_graph.jpg')
plt.show()
        

f:id:chayarokurokuro:20210707202703j:plain

これには年代別の検査数データを含んでいないので若年層は感染しやすいと勘違いするが、若年層の検査数は高齢者の2~3倍多い。
一日あたり累計の検査数で、たとえば20代の15万人に対し、80代は5万人とかそんな具合。しかし重症者数・死亡者数は高齢者に偏る。 某ワクチン企業の報告書にも「60代以上の重症化率は高い」とある。そんなことコロナに限ったことではないだろうけど。



no.4 nhk_news_covid19_prefectures_daily_data.csv

df_nhk_data = pd.read_csv(files[4])
df_nhk_data
日付都道府県コード都道府県名各地の感染者数_1日ごとの発表数各地の感染者数_累計各地の死者数_1日ごとの発表数各地の死者数_累計
02020/1/161北海道0000
12020/1/171北海道0000
22020/1/181北海道0000
32020/1/191北海道0000
42020/1/201北海道0000
........................
251872021/6/3047沖縄県67207832183
251882021/7/147沖縄県63208464187
251892021/7/247沖縄県61209074191
251902021/7/347沖縄県76209830191
251912021/7/447沖縄県34210170191

25192 rows × 7 columns

# 都道府県ごとの各項目の合計値データフレーム 、各地の死者数_1日ごとの発表数に基づき降順で並び替え
df_nhk = df_nhk_data.groupby('都道府県名').sum().sort_values('各地の死者数_1日ごとの発表数', ascending=False)
# 不要列削除
df_nhk = df_nhk.drop(['都道府県コード', '各地の感染者数_累計', '各地の死者数_累計'], axis=1)
# 感染者数累計ごとの死亡者累計を算出 列追加
df_nhk['死亡累計/感染累計'] = (df_nhk['各地の死者数_1日ごとの発表数'] / df_nhk['各地の感染者数_1日ごとの発表数']).map('{:.2%}'.format)

df_nhk
各地の感染者数_1日ごとの発表数各地の死者数_1日ごとの発表数死亡累計/感染累計
都道府県名
大阪府10385026802.58%
東京都17650122391.27%
北海道4146614053.39%
兵庫県4103213083.19%
愛知県512959711.89%
神奈川県683119521.39%
埼玉県469418321.77%
千葉県408747101.74%
福岡県356395221.46%
京都府166612461.48%
沖縄県210171910.91%
岐阜県92821872.01%
広島県115251751.52%
茨城県106511651.55%
福島県49621613.24%
群馬県80511521.89%
静岡県94011511.61%
奈良県82461311.59%
岡山県75961261.66%
熊本県64911181.82%
石川県39541152.91%
三重県52781122.12%
長野県5039911.81%
宮城県9187900.98%
滋賀県5571901.62%
栃木県7120821.15%
山口県3159802.53%
愛媛県2755752.72%
長崎県3216692.15%
大分県3494641.83%
徳島県1657633.80%
新潟県3423521.52%
和歌山県2693491.82%
岩手県1713472.74%
山形県2028472.32%
鹿児島県3698381.03%
富山県2042381.86%
福井県1327352.64%
青森県2520311.23%
香川県2099311.48%
宮崎県3094270.87%
高知県1851261.40%
佐賀県2565240.94%
山梨県2124210.99%
秋田県907202.21%
鳥取県49120.41%
島根県55310.18%

データの期間は未確認。たぶん他のデータと同じく1年以上の累計。なぜリセットしないのかね。

これらの数字は各都道府県の人口や検査数に依存する。検査しなければ全て0。新型コロナ騒動以前のように。

コロナ感染者の99%以上は発症すらしない(ワクチン製薬会社2社共の発表によると)。これを集団免疫と言わずに何というのだろうか。
検査を増やせば致死率なども下がる。しかし99%以上の人には関係ないので検査するだけ費用の無駄とも言える。



no.5 pcr_case_daily.csv

df_pcr_case_daily = pd.read_csv(files[5])
df_pcr_case_daily
日付国立感染症研究所検疫所地方衛生研究所・保健所民間検査会社大学等医療機関
02020/2/18472753980.079.0NaN
12020/2/1915686090.00.0NaN
22020/2/2020157580.00.0NaN
32020/2/21261188902132.0108.0NaN
42020/2/223411276772.019.0NaN
........................
4962021/6/2800200238218.05277.024129.0
4972021/6/2900253221037.04293.019854.0
4982021/6/3000241632046.03854.017310.0
4992021/7/102236328021.03018.013821.0
5002021/7/2001208NaNNaNNaN

501 rows × 7 columns



no.6 pcr_positive_daily.csv

df_pcr_positive_daily = pd.read_csv(files[6])
df_pcr_positive_daily
日付PCR検査陽性者数(単日)
02020/1/161
12020/1/170
22020/1/180
32020/1/190
42020/1/200
.........
5302021/6/291375
5312021/6/301811
5322021/7/11741
5332021/7/21774
5342021/7/31864

535 rows × 2 columns

# pcr_positive_dailyの折れ線グラフ# 時系列データに変換
df_pcr_positive_daily_copy = df_pcr_positive_daily.copy() # データフレームをコピー
df_pcr_positive_daily_copy['日付'] = pd.to_datetime(df_pcr_positive_daily['日付']) # 日付列をdatetime型に変換
df_pcr_positive_daily_copy = df_pcr_positive_daily_copy.set_index('日付')  # 日付列をインデックスにする# 折れ線グラフ
plt.figure(facecolor='w')
plt.plot(df_pcr_positive_daily_copy)
plt.title('新型コロナ日ごと陽性者数(2020-01-16~2021-07-03)')
plt.gcf().autofmt_xdate() # 日付ラベル重なり解消
plt.grid()
plt.savefig('06_pcr_positive_daily折れ線グラフ.jpg')
plt.show()

f:id:chayarokurokuro:20210707202802j:plain

検査数を100倍にすれば陽性者数・感染者数も100倍になるだろう。しかし重症者は100倍にはならない。死亡者も100倍にはならない。そんなことになれば、年間の全死亡者数をコロナが占めてしまう。どこにもそのようなデータは無い。2020年の超過死亡者は減ってすらいる。



no.7 pcr_tested_daily.csv

df_pcr_tested_daily = pd.read_csv(files[7])
df_pcr_tested_daily
日付PCR検査実施件数(単日)
02020/2/54
12020/2/619
22020/2/79
32020/2/84
42020/2/910
.........
5072021/6/2961916
5082021/6/3067576
5092021/7/177063
5102021/7/267044
5112021/7/338122

512 rows × 2 columns

# pcr_tested_dailyの折れ線グラフ# 時系列データに変換
df_pcr_tested_daily_copy = df_pcr_tested_daily.copy() # データフレームをコピー
df_pcr_tested_daily_copy['日付'] = pd.to_datetime(df_pcr_tested_daily['日付']) # 日付列をdatetime型に変換
df_pcr_tested_daily_copy = df_pcr_tested_daily_copy.set_index('日付')  # 日付列をインデックスにする# 折れ線グラフ
plt.figure(facecolor='w')
plt.plot(df_pcr_tested_daily_copy, label='検査実施件数')
plt.plot(df_pcr_tested_daily_copy.rolling(window=7, min_periods=1).mean(), label='7日移動平均') # 7日移動平均
plt.title('新型コロナ日ごと検査実施件数(2020-02-05~2021-07-03)')
plt.gcf().autofmt_xdate() # 日付ラベル重なり解消
plt.grid()
plt.legend()
plt.savefig('07_pcr_tested_daily折れ線グラフ.jpg')
plt.show()

f:id:chayarokurokuro:20210707202838j:plain

no.7_2 陽性者数/検査実施件数 で陽性率を出す

# 結合
df_positive_tested_rate = df_pcr_tested_daily_copy.join(df_pcr_positive_daily_copy, how='inner')
# 陽性率列を追加
df_positive_tested_rate['陽性率'] = (df_positive_tested_rate['PCR 検査陽性者数(単日)'] / df_positive_tested_rate['PCR 検査実施件数(単日)'])  

print('陽性率平均値:', df_positive_tested_rate['陽性率'].mean())
print('陽性率中央値:', df_positive_tested_rate['陽性率'].median())
print('陽性率最大値:', df_positive_tested_rate['陽性率'].max())
df_positive_tested_rate.describe()
陽性率平均値: 0.10498579148938529
陽性率中央値: 0.048645076066993725
陽性率最大値: 10.017543859649123
PCR検査実施件数(単日)PCR検査陽性者数(単日)陽性率
count512.000000512.000000512.000000
mean30920.4257811557.2128910.104986
std30844.7254391730.1729480.462973
min4.0000000.0000000.000000
25%4901.750000265.7500000.025345
50%21065.500000915.0000000.048645
75%54593.2500002371.5000000.090876
max176379.0000007844.00000010.017544

入力ミスか集計ミスかわからないが、陽性率の最大値maxが10を超えてる。そのせいでか陽性率平均値が高い。
このままグラフ化すると外れ値が一本飛び出していたので、それを以下で除外する。

# 外れ値を除外  4分位数範囲基準defoutlier(df) :
    for i inrange(len(df.columns)):
        col = df.iloc[:, i]
        #四分位数範囲
        Q1 = col.describe()['25%']
        Q3 = col.describe()['75%']
        IQR = Q3 - Q1
        # 外れ値基準
        outlier_min = Q1 - (IQR)*1.5
        outlier_max = Q3 + (IQR)*1.5# 外れ値除外
        col[col < outlier_min] = None
        col[col > outlier_max] = Nonereturn df

df_rate = outlier(df_positive_tested_rate)  # 外れ値除去
df_rate = df_rate.dropna(how='any') # Nanがある行を除去print('陽性率平均値', df_rate['陽性率'].mean())
print('陽性率中央値', df_rate['陽性率'].median())
print('陽性率最大値', df_rate['陽性率'].max())

df_rate
陽性率平均値 0.041858348606778575
陽性率中央値 0.033985348538630014
陽性率最大値 0.1198726857040391
PCR検査実施件数(単日)PCR検査陽性者数(単日)陽性率
日付
2020-02-0619.00.00.000000
2020-02-079.00.00.000000
2020-02-084.00.00.000000
2020-02-0910.00.00.000000
2020-02-1012.00.00.000000
............
2021-06-2961916.01375.00.022208
2021-06-3067576.01811.00.026799
2021-07-0177063.01741.00.022592
2021-07-0267044.01774.00.026460
2021-07-0338122.01864.00.048896

369 rows × 3 columns

# 陽性率の折れ線グラフ
plt.figure(facecolor='w')
plt.plot(df_rate['陽性率'])
plt.plot(df_rate['陽性率'].rolling(7,1).mean()) # 7日移動平均
plt.title('新型コロナ日ごと陽性率(2020-02-05~2021-07-03)')
plt.gcf().autofmt_xdate() # 日付ラベル重なり解消
plt.grid()
plt.savefig('07_2陽性率折れ線グラフ.jpg')
plt.show()

f:id:chayarokurokuro:20210707202915j:plain

アメリカCDCは少なく見積もってもアメリカ人の3分の1が既に新型コロナに感染しているという認識だという。1億人以上。
日本で3分の1なら4000万人。計算したところ、全国で1日あたり219万人を検査すれば妥当な陽性者数が出るかもしれん。
現在の水準では1~2桁足りませんね。
しかし感染者の99%以上は発症すらしないので、検査するのは無駄でしょう。

推定感染者数4000万人のうち1%が発症したとすると40万人。一日あたり1095人の発症。そのうち重症化するのは・・・
この後で見るsevere_daily.csvデータに載っている。



no.8 recovery_total

df_recovery_total = pd.read_csv(files[8])
df_recovery_total
日付退院、療養解除となった者
02020/1/291
12020/1/301
22020/1/311
32020/2/11
42020/2/21
.........
5172021/6/29763569
5182021/6/30765277
5192021/7/1766949
5202021/7/2768722
5212021/7/3770414

522 rows × 2 columns

大して意味なさそうなのでグラフ無し。



no.9 severe_daily

df_severe_daily = pd.read_csv(files[9])
df_severe_daily
日付重症者数
02020/2/50
12020/2/60
22020/2/70
32020/2/80
42020/2/90
.........
5102021/6/29523
5112021/6/30517
5122021/7/1511
5132021/7/2501
5142021/7/3496

515 rows × 2 columns

# severe_dailyの折れ線グラフ# 時系列データに変換
df_severe_daily_copy = df_severe_daily.copy() # データフレームをコピー
df_severe_daily_copy['日付'] = pd.to_datetime(df_severe_daily['日付']) # 日付列をdatetime型に変換
df_severe_daily_copy = df_severe_daily_copy.set_index('日付')  # 日付列をインデックスにする# 折れ線グラフ
plt.figure(facecolor='w')
plt.plot(df_severe_daily_copy)
plt.title('新型コロナ日ごと重症者数(2020-02-05~2021-07-03)')
plt.gcf().autofmt_xdate() # 日付ラベル重なり解消
plt.grid()
plt.savefig('09_severe_daily折れ線グラフ.jpg')
plt.show()

f:id:chayarokurokuro:20210707202946j:plain

↑の陽性率の所で、一日当たり1095人の発症者が出ると推定したが、1月は冬なんでまぁ分かるが、6月は多い。なんだろう? しかも重症者数でこの数値。「発症=重症」みたいな値。だいぶ高い。

風邪の原因の80~90%がウィルスによるもので、残りは菌だという。それらのウィルスのうち15%ぐらいがコロナウィルス。
年間に誰でも2~3回風邪のウィルスに感染しているらしいが、別の医療系サイトでは3~6回感染しているとしてあった。風邪の症状などそんなに頻繁に起こらないわけで、気づかないほどヘナチョコレベルか、発症していない、無症状なわけですよね。

仮に日本人全員が年間3回風邪に感染しているとして、そのうち15%がコロナウィルスなので、年間延べ5400万人がコロナウィルスに感染しているということになる。気づかないけど。
で、感染のうち99%以上が発症しない、いや、1%が発症するとして年間54054万人が発症。コロナウィルスで重症者が出まくるなんて今まで聞いたことないなぁ。「重症化=インフルエンザ」って認識はあるが。



以上。


Viewing all articles
Browse latest Browse all 30

Trending Articles