「日本は3週間前のアメリカ」という動画は本当なのか?Python で感染者数など比較 [Pythonコードあり]
コロナウイルスに関する記述があります。
筆者は感染症の専門家ではありませんので、不正確な情報かもしれません。
データサイエンスの観点のうち、データの取得、グラフの形状的なことにこの記事では集中します。
--------------------------------------------------------------------------------------
2020-04-11 と 2020-04-26 に追記をしています。
内容はアメリカの感染者数との比較の検証です。
--------------------------------------------------------------------------------------
「日本は3週間前のアメリカ」という動画がありましたが、自分の中では違和感があるのですが、「何について違和感がある」のか、正確にいうことができませんので、データをもとに考察してみたいと思います。
2020-04-26 追記:違和感は「増加率の違い」だと今では思っています。
データの取得は以下の記事「新型コロナのデータサイエンス記事の紹介」
の中の
Kaggle -- COVID-19 Complete Dataset (Updated every 24hrs)
https://www.kaggle.com/imdevskp/corona-virus-report/data
を利用させていただきました。このサイトに行きますと、以下のような画面になります。
下段には詳細なデータが出ていたりするのですが、ここではダイレクトにノートブックを利用して、自分で解析を行います。
右上の「New Notebook」を押していただき、ダイレクトにデータをGoogle Colaboratoryのように解析できる環境に移動します。
いつも通り[Shift]+[Enter]で実行するとPythonでデータの解析ができます。
データはKaggle Notebooksさんの方で準備してくれています。
/kaggle/input/corona-virus-report/usa_county_wise.csv
/kaggle/input/corona-virus-report/covid_19_clean_complete.csv
にあるということなので、それを読み込んで作業の下準備を行います。
corona_df = pd.read_csv('/kaggle/input/corona-virus-report/covid_19_clean_complete.csv', index_col=0)
display(corona_df.head(10).append(corona_df.tail(10)))
display(corona_df["Country/Region"].unique())
今回は日本とアメリカのデータを使いたいので、そのデータだけ抜き出します。
corona_df_JPN=corona_df[corona_df["Country/Region"]=="Japan"].copy()
corona_df_USA=corona_df[corona_df["Country/Region"]=="US"].copy()
corona_df_JPN["日付"] = list(map(lambda x: pd.datetime.strptime(x, '%m/%d/%y'),corona_df_JPN["Date"]))
corona_df_USA["日付"] = list(map(lambda x: pd.datetime.strptime(x, '%m/%d/%y'),corona_df_USA["Date"]))
display(corona_df_JPN.head().append(corona_df_JPN.tail()))
display(corona_df_USA.head().append(corona_df_USA.tail()))
今回は感染者数をグラフにプロットするのですが、
「日本は3週間前のアメリカ」とのことですので、日本のデータを三週間(21日)だけずらしたもの合わせてプロットします。
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
fig = plt.figure()
plt.rcParams["font.size"] = 18
mmdd=mdates.DateFormatter('%m/%d')
fig, (ax1 ,ax2 )= plt.subplots(2,1,figsize=(10,9),
gridspec_kw = {'height_ratios':[1, 1]},sharex=True)
ax1.plot(corona_df_JPN["日付"],corona_df_JPN["Confirmed"],label="JPN-Confirmed")
ax1.plot(corona_df_USA["日付"],corona_df_USA["Confirmed"],label="USA-Confirmed")
ax1.plot(corona_df_JPN["日付"],corona_df_JPN["Confirmed"].shift(-21),label="SHIFT_JPN-Confirmed")
ax1.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=18)
ax1.grid(True)
ax2.plot(corona_df_JPN["日付"],corona_df_JPN["Confirmed"],label="JPN-Confirmed")
ax2.plot(corona_df_USA["日付"],corona_df_USA["Confirmed"],label="USA-Confirmed")
ax2.plot(corona_df_JPN["日付"],corona_df_JPN["Confirmed"].shift(-21),label="SHIFT_JPN-Confirmed")
ax2.set_yscale('log')
ax2.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=18)
ax2.grid(True)
ax2.xaxis.set_major_formatter(mmdd)
fig.show()
通常のグラフだと桁数が大きく違い見にくいので、対数表示にしたものも載せておきます。
現在の絶対数は近いと思いますが、直近の増え方などは大きく違うように見えます。検査の数を徹底して、数が増えたということもあるのかもしれませんが、無理があるようにも思えます。
否定するには、否定する根拠も必要ですが、そこに関しては日本人の公衆衛生観念程度しか、残念ながら私は思いつきません。
念のために死者数でも見てみましょう。
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
fig = plt.figure()
plt.rcParams["font.size"] = 18
mmdd=mdates.DateFormatter('%m/%d')
fig, (ax1 ,ax2 )= plt.subplots(2,1,figsize=(10,9),
gridspec_kw = {'height_ratios':[1, 1]},sharex=True)
ax1.plot(corona_df_JPN["日付"],corona_df_JPN["Deaths"],label="JPN-Deaths")
ax1.plot(corona_df_USA["日付"],corona_df_USA["Deaths"],label="USA-Deaths")
ax1.plot(corona_df_JPN["日付"],corona_df_JPN["Deaths"].shift(-21),label="SHIFT_JPN-Deaths")
ax1.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=18)
ax1.grid(True)
ax2.plot(corona_df_JPN["日付"],corona_df_JPN["Deaths"],label="JPN-Deaths")
ax2.plot(corona_df_USA["日付"],corona_df_USA["Deaths"],label="USA-Deaths")
ax2.plot(corona_df_JPN["日付"],corona_df_JPN["Deaths"].shift(-21),label="SHIFT_JPN-Deaths")
ax2.set_yscale('log')
ax2.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=18)
ax2.grid(True)
ax2.xaxis.set_major_formatter(mmdd)
fig.show()
感染者数とほぼ同じようなグラフの形状です。
陰謀論などいろいろありますが、死者数はごまかすことができないでしょうから、こちらの方が正確かと思います。
今度もこのペースで増えていくのか、抑制が効くのか分かりませんが、交通量自体は減っていないというような記述も見られます。
電車やバスの本数が減ってないという意味なのか、スマホの位置情報でも移動が減っていないのか分かりませんが、少し・かなり気がかりな情報ではあります。
ご自身でさらに解析してみたい場合は、いったんCSVファイルなどにデータを出力し、それをGoogle Colaboratoryで解析することをお勧めします。
最後に
「ツールとして利用していただき」、
「いたずらに不安を煽らず」、
「備えるために必要な情報」
としていただければと思います。
--------------------------------------------------------------------------------------
2020-04-11 追記
多くの方に読んでいただいたようで、感謝しております。
特に奇を衒うわけでもなく、事実や、誰がやっても同じ結果になることを淡々と記述します。
前回の記事を読んでいつくかフィードバックをいただいたうちで追記します。
1.データを自分の環境に持ってきて、そこでいろいろ解析を行いたい。
志の高い質問ですね。可能ですので、お答えします。
Kaggle -- COVID-19 Complete Dataset (Updated every 24hrs)
https://www.kaggle.com/imdevskp/corona-virus-report/data
の右上の「New Notebook」を押していただき、ダイレクトにデータをGoogle Colaboratoryのように解析できる環境に移動します。
データはKaggle Notebooksさんの方で準備してくれていますので、前回同様[Shift]+[Enter]で実行し、データをいったん読み込み、それをCSVとして自分のPCに書き出すことを考えます。
/kaggle/input/corona-virus-report/usa_county_wise.csv
/kaggle/input/corona-virus-report/covid_19_clean_complete.csv
corona_df = pd.read_csv('/kaggle/input/corona-virus-report/covid_19_clean_complete.csv', index_col=0)
display(corona_df.head(10).append(corona_df.tail(10)))
display(corona_df["Country/Region"].unique())
ここまでは前回と同様です。今回は以下のコードでCSVに吐き出します。
corona_df.to_csv("corona_df.csv")
読み込んだデータがCSVで書き出されますので、確認します。
左上のデータの中のOutputフォルダの中に今回指定したファイル名で出力されているのが確認できると思います。後は、右側のダウンロードアイコンをクリックすると自分のPCのダウンロードフォルダにCSVファイルがダウンロードされます。
後はこれを読み込んで自分の環境、もしくはGoogle Colaboratoryなどで解析してください。
2.日本とアメリカのデータだけ抜き出し、エクセルのように同一データテーブルで解析したい。
前回は二つでデータテーブルで別々に抜き出し、プロットしましたが、それをマージして、一つのデータテーブルの方がいろいろ操作しやすいという意味のようでした。
以下のような方法はいかがでしょうか。まず、前回同様日本とアメリカをそれぞれのデータテーブルに書き出します。
corona_df_JPN=corona_df[corona_df["Country/Region"]=="Japan"].copy()
corona_df_USA=corona_df[corona_df["Country/Region"]=="US"].copy()
corona_df_JPN["日付"] = list(map(lambda x: pd.datetime.strptime(x, '%m/%d/%y'),corona_df_JPN["Date"]))
corona_df_USA["日付"] = list(map(lambda x: pd.datetime.strptime(x, '%m/%d/%y'),corona_df_USA["Date"]))
display(corona_df_JPN.head().append(corona_df_JPN.tail()))
display(corona_df_USA.head().append(corona_df_USA.tail()))
そののち、その二つのデータテーブルを日付を基準にマージします。
corona_df_JPN=corona_df_JPN.set_index('日付')
corona_df_USA=corona_df_USA.set_index('日付')
display(corona_df_JPN.head().append(corona_df_JPN.tail()))
display(corona_df_USA.head().append(corona_df_USA.tail()))
df_merge=pd.DataFrame(index=corona_df_JPN.index)
df_merge=pd.merge(corona_df_JPN[["Confirmed","Deaths","Recovered"]], corona_df_USA[["Confirmed","Deaths","Recovered"]], on='日付',suffixes=['_JPN', '_USA'])
display(df_merge.head().append(df_merge.tail()))
一つのテーブルに書き出したので、いろいろ操作しやすいかもしれません。
また、この状態で、CSVに出力すると、自身のPCでの操作も楽かもしれません。
3.日本のデータは動かさずにアメリカのデータを参照として、日本のデータと同じ位置に持ってきたい。
行いたいことは「東京の3月25日の感染者数は212。この数は、偶然にも、3月11日時点のニューヨーク州の感染者数と全く同じ。」とのことなので、そこを基準にし、アメリカのデータを日本のデータ側に合わせて表示ということでした。
まず実際にそうなのか確認してみましょう。
display(df_merge['2020-3-11':'2020-3-25'])
実際に、似たような数字になっているようですね、、それでは、ここに一列追加して、シフトした数字を入れたいのですが、このままやると将来の日付の部分が欠損してしまいますので、いったんダミーデータを入れて行を増やし、それで一列ずらしたデータを追加します。
ここで増やす行は15日とします。
import numpy as np
import matplotlib.dates as mdates
from dateutil.relativedelta import relativedelta
for i in range(1,15):
MDtmp=max(df_merge.index) + relativedelta(days=1)
df_merge.loc[MDtmp]=np.nan
df_merge["SHIFT_Confirmed_USA"]=df_merge["Confirmed_USA"].shift(15)
display(df_merge.head().append(df_merge.tail()))
それでは、これを前回同様プロットします。
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
fig = plt.figure()
plt.rcParams["font.size"] = 18
mmdd=mdates.DateFormatter('%m/%d')
fig, (ax1 ,ax2 )= plt.subplots(2,1,figsize=(10,9),
gridspec_kw = {'height_ratios':[1, 1]},sharex=True)
ax1.plot(df_merge.index,df_merge["Confirmed_JPN"],label="JPN-Confirmed")
ax1.plot(df_merge.index,df_merge["Confirmed_USA"],label="USA-Confirmed")
ax1.plot(df_merge.index,df_merge["SHIFT_Confirmed_USA"],label="SHIFT_USA-Confirmed")
ax1.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=18)
ax1.grid(True)
ax2.plot(df_merge.index,df_merge["Confirmed_JPN"],label="JPN-Confirmed")
ax2.plot(df_merge.index,df_merge["Confirmed_USA"],label="USA-Confirmed")
ax2.plot(df_merge.index,df_merge["SHIFT_Confirmed_USA"],label="SHIFT_USA-Confirmed")
ax2.set_yscale('log')
ax2.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=18)
ax2.grid(True)
ax2.xaxis.set_major_formatter(mmdd)
fig.show()
緑のアメリカの3/11のデータを3/25にずらして、日本と同じ値をとるようにしました。
どうですかね、3月末の段階でニューヨークが、アメリカがと言っていたのとは違った結果のように見えます。
警告を発したおかげでそうならなかった場合もあるでしょうし、そもそも増加率が違うので、という考え方もあります。
急激に感染者が増えているのは事実ですし、全国的に外出を控え、医療関係者の負担を減らす必要があると思います。
数値予想モデルは結果が違うと非難されることが多いですが、声の大きいメディアも同じくらいの記事の後からのレビューを受けてほしいものです。
放射性物質の半減期のような厳密な物理現象と違って、国民の意識や、行動によって結果が変わる感染症予測などは、正確な予測値を出すのが極めて難しいと思われます。
国民一人一人の協力が求められていると思います。データの取り扱い、解析手順や、方法などの参考になれば幸いです。
最後に
「ツールとして利用していただき」、
「いたずらに不安を煽らず」、
「備えるために必要な情報」
としていただければと思います。
--------------------------------------------------------------------------------------
2020-04-26 追記
メディアで「1か月前はイギリスも日本と同じだった!」連休前にニュース番組が注目した“衝撃”の事実」なる記事が出てきました。
ニューヨークの記事の二番煎じの記事で「まあ、でてくるだろうな、、」と思っていました。前回ニューヨークの時と同様に別の記事で粛々と確認していきたいと思います。
まずは、前回のニューヨークの経過報告から。
2020-03-25にアメリカの感染者数と日本の感染者数が同じような値になったので、危険だという「声の大きな」指摘がありましたが、その後一か月でどうなったでしょうか。
感染者数は増加して、危険な状態には間違いないですが、アメリカほどの極端な増加ではないことはわかりますし、予測された範囲内ので挙動なのではないでしょうか。
上のグラフは青の日本の感染者の推移は、その時言われた緑のアメリカの感染者推移のようにはならなかったということは事実として、確認しておく必要があると思います。
「1か月前はイギリスも日本と同じだった!」は本当なのか? データで確認 [Pythonコードあり] という記事を書きました。
最後に、繰り返しますが、油断していいとは思っていません。予測という観点での話です。
311の原子力・放射能デマに日本人の多くは振り回されました。
しかも、まだその当時の総括すらできていません。
あの時に人々の不安に付け込んで、恐怖を煽った人たちに科学は負けてはいけないと思います。