パンナの学生生活

地方大学の大学生/プログラミング言語【python】を中心に紹介しています。/日々の脳内をアウトプット/麻雀とワインと日本酒が好き/将来は幸せになりたい

【python】コロナウイルその日の感染者人数を予測する。

日に日に猛威を振るっているコロナウイル。その感染者の人数をもとにどのような推移で感染者が増しているのかをpythonで調べてみようかと思いました。

コロナウイル感染者のオープンデータ

コードの説明

コロナウイルについて

コロナウイル感染者のオープンデータ

コロナウイルのオープンデータは厚生労働省の報道発表資料のやつを使っています。

そのCSVファイルはこちらから見ることが出来ます。

GitHub - kaz-ogiwara/covid19: 新型コロナウイルス(COVID19)の国内における感染の状況を厚生労働省の報道発表資料からビジュアルにまとめた。

今回はこのデータの日にちとその日の感染者数のデータを使用します。最初の感染者が出た日から日数によって予測していきます。

 

ちなみにこのデータでは確定日が調査中のデータは省きました。2020年3月5日23時時点では、3月3日の感染者までしか更新されていませんのでそのデータを使って予測していきます。

 

予測方法はAICを使ってn次関数で予測していきます。

過去にこのソースコードを貼っておきます。

 

pannakotta.hatenablog.jp

 この時の方法で関数を求めていきます。

出力結果の説明

import AIC
import LSM

x1 = np.array(x)
y1=np.array(y)

plt.plot(x,y,'o')
num=5

data = np.array([x1,y1]).T

data_x=[]
data_y=[]
for i in data :
    data_x.append(i[0])
    data_y.append(i[1])

# データをプロット

for k in range(0,num):
    N = k
AIC_com=[]

for n in range(N+1):
    # 実行する次数
    print("N="+str(n))

    # LSMで誤差と重みベクトルcoeを計算
    error, coe = LSM.LSM(data, int(n+1))
    print("error:"+str(error))
    print("coe:"+str(coe[::-1]))

    # ここで,このモデルのAICを計算
    l = AIC.l_MAX(list(coe[::-1]),data_x,data_y)
    AIC_n = AIC.AIC(l,n+1)
    print("l="+str(l)+", AIC("+str(n)+")="+str(AIC_n))
    AIC_com.append(AIC_n)



Minimum = np.min(AIC_com)
for m in range(0,num):
    if AIC_com[m] == Minimum:
        print('AIC最小の次数は:{}次'.format(m))
        s = m
        print("N="+str(s))

    # LSMで誤差と重みベクトルcoeを計算
error, coe = LSM.LSM(data, int(s+1))
print("error:"+str(error))
print("coe:"+str(coe[::-1]))

    # ここで,このモデルのAICを計算
l = AIC.l_MAX(list(coe[::-1]),data_x,data_y)
AIC_s = AIC.AIC(l,s+1)
print("l="+str(l)+", AIC("+str(s)+")="+str(AIC_s))
AIC_com.append(AIC_s)
print(np.poly1d(coe))
    # LSMで得た近似線をプロット
test_3 = np.arange(min(data_x), max(data_x), 0.01)
plt.plot(test_3, LSM.quation_LSM(coe, test_3),color='black')

plt.title("AIC")
plt.xlabel('x value')
plt.xlim(0,30)
plt.ylim(0,30)
plt.show()

#出力
N=0
error:26.001860975583043
coe:[7.83870968]
l=-102.50728561326845, AIC(0)=209.0145712265369
N=1
error:16.619676887376517
coe:[-3.76789208  0.38813879]
l=-88.63228194791694, AIC(1)=183.26456389583387
N=2
error:15.92196810296838
coe:[ 0.39436123 -0.0319299   0.00788319]
l=-87.30276787584789, AIC(2)=182.60553575169578
N=3
error:15.923022013429266
coe:[ 3.88904456e-01 -3.08874768e-02  7.83557747e-03  6.10255673e-07]
l=-87.30481976684739, AIC(3)=184.60963953369478
N=4
error:16.69140259160465
coe:[-3.95739942e+00  4.02112647e-01 -3.82898220e-05 -1.85238141e-06
 -6.78651480e-08]
l=-88.76578109007211, AIC(4)=189.53156218014422
AIC最小の次数は:2次
N=2
error:15.92196810296838
coe:[ 0.39436123 -0.0319299   0.00788319]
l=-87.30276787584789, AIC(2)=182.60553575169578
          2
0.007883 x - 0.03193 x + 0.3944

 このように2次式関数が一番近い関数ということが分かりました。また、次数も低いので、過学習までには至ってないように思います。

f:id:panNakotta:20200305231348p:plain

これを30日後以降も表示していきます。

def f(x):
    y= 0.007883*x**2-0.03193*x+0.3944
    return y
#xの範囲を0~100とする。
x=np.linspace(0,100)
plt.plot(x,f(x))
plt.label("COVID-19")
plt.xlabel("days")
plt.ylabel("the number of patients") plt.grid(True) plt.show() #1月15日からの51日後、3月6日の感染者数を表示(予測) print(int(f(51))) #出力 18
#3月6日は18人の感染者が出る?

 

f:id:panNakotta:20200305232956p:plain

このような出力結果になりました。

今回の関数による予測は不安を煽るために行ったわけではありません。また、分析方法が間違ていたり、統計的に問題点があった場合は、ご指摘または、ご教授の方をよろしくお願いいたします。

コロナウイルについて

今回の予測結果のような2次関数のように増加していくと大変なことになってしまいます。そのための休校の処置であったりすると思います。今回の予測はただの数値による予測でしかありません。なので、そこまで深刻に感じないようよろしくお願いいたします。

また、AICに関しましては、こちらを参考に

http://takashiyoshino.random-walk.org/memo/keikaku2/node5.html#SECTION00054100000000000000

GitHub - ustato/CalcAIC: モデル評価指標であるAIC(Akaike's Information Criterion)の計算をPythonで実装した.