乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

コロナ

最近感染が拡大しているということで
最新のコロナ関連のデータを見てみましょう。

解説動画はこちら



今回参考にさせていただくデータは
東洋経済さんのサイトのデータです。

それも厚生労働省のオープンデータが元になっていますが
サイトからダウンロードすることができます。

東洋経済さんのサイト

こちらのデータを元にして
現状を見てみることにしましょう。

まずはデータの読み込みです。
こちらのコードで直接データフレームに
データを読み込むことができます。

import pandas as pd

url = 'https://toyokeizai.net/sp/visual/tko/covid19/csv/prefectures.csv'
df = pd.read_csv(url)
df.head()
スクリーンショット 2021-07-31 17.21.16


集計したりするには
少しデータの形がアレなので
データをきれいに整形します。

def to_date(d):
    return pd.to_datetime('{0:02}/{1:02}/{2:02}'.format(d['year'],d['month'],d['date']),format='%Y/%m/%d')

# 日付に直す
df['days'] = df.apply(to_date, axis=1)

# 値の補完
df['deaths'] =  df['deaths'].str.replace('-','0')
df['serious'] =  df['serious'].str.replace('-','0')

# Null値の補完
df = df.fillna(0)

# 型変換
df['deaths'] =  df['deaths'].astype(int)
df['serious'] =  df['serious'].astype(int)
df['peopleTested'] =  df['peopleTested'].astype(int)
df['hospitalized'] =  df['hospitalized'].astype(int)
df['discharged'] =  df['discharged'].astype(int)

# 必要なカラムのみに絞る
df = df[['days','prefectureNameJ', 'peopleTested', 'testedPositive','discharged', 'hospitalized', 'serious', 'deaths' ]]

df.head()
スクリーンショット 2021-07-31 17.23.00

だいぶ綺麗になりましたね。

これを使って色々集計してみることにしましょう。
こちらのデータは累計データのようです。

まずは都道府県別の累計感染者数を
見てみることにしましょう。

df.groupby('prefectureNameJ').max().sort_values('testedPositive',ascending=False)
スクリーンショット 2021-07-31 17.25.09

2021年7月29までのデータで
感染者数の多い順で都道府県別の累計数を見ています。

東京や大阪、神奈川が多いのは
人口比どうりかと思いますが
沖縄とかも増えてきていますね。


次は色々な率を見てみます。
まずは全国の率を見てみます。

df['陽性率'] =  df['testedPositive'] / df['peopleTested'] * 100
df['復帰率'] = df['discharged'] / df['testedPositive'] * 100
df['療養率'] = df['hospitalized'] / df['testedPositive'] * 100
df['重症化率'] = df['serious'] / df['testedPositive'] * 100
df['死亡率'] = df['deaths'] / df['testedPositive'] * 100
days = '2021-07-29'
df2 = df[['prefectureNameJ','peopleTested','testedPositive','discharged','hospitalized','serious','deaths','陽性率','復帰率','療養率','重症化率','死亡率']][df['days']==days]

df3 = pd.DataFrame(data=df2[['peopleTested','testedPositive','discharged','hospitalized','serious','deaths']].sum())
df3 = df3.T
df3['陽性率'] =  df3['testedPositive'] / df3['peopleTested'] * 100
df3['復帰率'] = df3['discharged'] / df3['testedPositive'] * 100
df3['療養率'] = df3['hospitalized'] / df3['testedPositive'] * 100
df3['重症化率'] = df3['serious'] / df3['testedPositive'] * 100
df3['死亡率'] = df3['deaths'] / df3['testedPositive'] * 100

df3
スクリーンショット 2021-07-31 17.28.51

累計感染者数は90万人弱
累計死亡者数は15166人で
死亡率だと1.68%ほどになります。

参考として2018年の
インフルエンザの感染者が1200万人
死亡者は3325人ということでしたので
そこから計算すると死亡率は0.027%
コロナの方が60倍も高いことになってしまいます。

次のコードで率の高いところを出すことができます。

PCR検査の陽性率は??
df2[['prefectureNameJ','peopleTested','testedPositive','陽性率']].sort_values('陽性率',ascending=False)
死亡者の割合が高いところは?
df2[['prefectureNameJ','testedPositive','deaths','死亡率']].sort_values('死亡率',ascending=False)

最後に最近では感染者が拡大傾向にあるということで
直近の60日間の動向から年末まで
このままいくとどうなるかを予測してみました。

こちらはfbprophetを使うので
インストールしていない人は
インストールなどが必要です。
(要pip install)


ライブラリの読み込みと学習データに整形します。
from fbprophet import Prophet
import warnings
warnings.simplefilter('ignore')

tmp_df = df[['days','testedPositive','discharged','hospitalized','serious','deaths']].groupby('days').sum()
tmp_df = tmp_df.reset_index()
tmp_df.head()

まずは感染者数の推移を予測します。
model = Prophet()
model_df = tmp_df.rename(columns={'days':'ds','testedPositive':'y'})
model.fit(model_df.tail(60))

future_df = model.make_future_dataframe(150)
forecast = model.predict(future_df)
model.plot(forecast)
download
7月に入ってからの感染者数が増えてきています。
年末までこのままのペースだと160万人
最悪180万人ほどにもなる見込みです。


次に死亡者の推移を予測してみます。
model = Prophet()
model_df = tmp_df.rename(columns={'days':'ds','deaths':'y'})
model.fit(model_df.tail(60))

future_df = model.make_future_dataframe(150)
forecast = model.predict(future_df)
model.plot(forecast)
downloadのコピー

死亡者は最近おちついてきている傾向です。
感染拡大が続いても今のペースが続くなら
そこまでの死亡者が出ない予測になっていますが
油断は禁物です。



まとめです。

2021年7月29日までの感染者数は90万人ほどで
うち死亡者は15166人で死亡率1.68%

感染拡大が広がっているが、現状のまま進むと
2021年内には累計160万人が感染し
死亡者累計1万7千人ほどになる見込みです。

ワクチンを打ってもかかる人はいます。
過去に感染しても再感染する人もいます。

正直な所
強めの風邪なんじゃないかと思います。

何も打つ手が無さそうなので
人の多いところに行かないで
静かに生活するしかなさそうですね。

データは日々更新されていきますが
このコードを使えば簡単に見れますので
興味のある方は見てみて下さい。

それでは。



米失業保険申請者数のデータがあったので
可視化してみました。


解説動画はこちら



データはここにあります。

データソース:2020年03/28までの統計データ

米国労働省:

https://www.dol.gov/ui/data.pdf

アメリカ合衆国 労働省雇用管理局

https://oui.doleta.gov/unemploy/wkclaims/report.asp

これをcsvファイルにしておきます。
列は「N.S.A(日付)」「S.F.(申請数)」の2列分を用意します。




pandas を使ってデータを読み込みします。
import pandas as pd

df = pd.read_table("米失業申請者数データ20200328.csv")
df['day'] = pd.to_datetime(df['N.S.A'], format='%m/%d/%Y')
「N.S.A」列が日付の部分の文字列「m/d/y」形式になっているので
日付のデータに直します。

次に可視化ツールのplotlyの方ですが
普通はインストールされていないと思うので
インストールしていない方はpip install plotly
などでインストールしてください。

以下のコードがこのデータを可視化するコードです。
import plotly
plotly.offline.init_notebook_mode(connected=False)
data = [
    plotly.graph_objs.Scatter(x=df["day"], y=df["S.F."], name="Claims")
]
layout = plotly.graph_objs.Layout(
    width=1000, height=600,
    title="title",
    xaxis={"title":"Years"},
    yaxis={"title":"Claims"},
)
fig = plotly.graph_objs.Figure(data=data, layout=layout)
plotly.offline.iplot(fig, show_link=False) 

日付を横軸(x) , 申請者数を縦軸(y)にあてて
線グラフを作ります。

可視化の結果は・・・
スクリーンショット 2020-04-05 15.56.29

右上にplotlyのツール類が表示され、ズームインアウトや
選択など色々選んで操作できます。

一般的なpandas、matplotlibの可視化では
動かすことができないので
可視化された図表を動かして見ることのできる
plotlyはかなりの優れものです。

データの方を見てみると
1982年とリーマンショックのあった2009年に
かなり多くの申請があったことが見えました。

しかし2020年3月になると
ドーンと跳ね上がって・・・

スクリーンショット 2020-04-05 16.01.20

爆増しているのが見えます。
レポートの数値から見ると
失業申請者数は600万人を超えているみたいですね。

リーマンの時でさえ100万人に満たなかった訳で
今回の影響がどれだけヤバイのかがすぐにわかります。

このデータは3/28のデータ
今日は4/5なのでそこから1週間経ってるいるため
さらに倍増している可能性もあります。

一説によると
アメリカの労働人口の2割ほどが影響を受けているそうで
もし、日本でも同様の事態となると
数十万人 - 100万人単位で
影響を受ける方が増えると予想されます。

特にレストランやバー、映画館、ホテル、スポーツジム
などは営業停止しており
特定の製造業も工場の稼働停止をしています。

リーマンの時は稼働停止までは至っていなかったと思うので
10年前の大不況に比べると
はるかに大きな不況が目の前に来ています。

前回の余波は、自分も食らったので2年くらい
まともな仕事が無かったです。

今回、それを超えるようなことに
ならないことを願うばかりです。

エンジニアの対策としては
現状新規案件が白紙、撤回されたり
内定も取り消されるケースが増えているようです。

フリーランスになったり、転職活動は
かなり厳しくなると予想されるので
今雇用があるなら、そこでじっと騒動が収まるまで
耐えるしかないかなと思います。

頑張って乗り切れば
明るい未来が待っていると思いたい。

それでは。



 

このページのトップヘ