Je ne suis pas un expert en maladies infectieuses, veuillez donc le lire après avoir compris.
La nouvelle pneumonie corona (Covid-19) survenue à Wuhan, dans la province du Hubei, en Chine à partir de décembre 2019, s'est propagée au Japon et le nombre de personnes infectées augmente. Le 7 avril 2020, une déclaration d'urgence a également été publiée au Japon, appelant à s'abstenir de sortir. Bien que le travail à domicile soit de plus en plus répandu, certains rapports indiquent qu'il ne suffit pas de s'abstenir de sortir. Par conséquent, dans quelle mesure puis-je sortir de la maîtrise de soi, ou pour changer la façon dont l'augmentation du nombre de personnes infectées en sortant de la maîtrise de soi, je voudrais prédire.
Cette fois, nous allons prédire le nombre de personnes infectées en revenant à l'apprentissage automatique. Il existe différents types d'algorithmes de régression, mais cette fois, [Support Vector Regression] de scikit-learn (https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR) .html) est utilisé.
J'ai utilisé covid_19_clean_complete.csv du [COVID-19 Complete Dataset (mis à jour toutes les 24 heures)] de Kaggle (https://www.kaggle.com/imdevskp/corona-virus-report). Ces données contiennent des données du monde entier, mais seul le nombre de personnes infectées au Japon est utilisé. Pour le Japon, il existe des données du 2020/1/22 au 2020/4/9. La figure ci-dessous montre le nombre de personnes infectées et le nombre de nouvelles infections quotidiennes.
Il n'y a pas de bonnes données sur le nombre de personnes qui s'abstiennent de sortir dans tout le Japon en raison de leur abstention. Cependant, le nouveau site de contrôle des maladies infectieuses du virus Corona à Tokyo dispose de données sur l'évolution du nombre d'utilisateurs du métro Toei. Nous utiliserons ces données sur le métro Toei à Tokyo, bien qu'elles soient limitées aux données hebdomadaires. Cependant, ces données sont diffusées au format PDF. Par conséquent, je l'ai entré manuellement au format CSV (pleurer). Les données sur les personnes infectées distribuées sur le nouveau site de contrôle des infections par le virus corona sont distribuées au format CSV, je souhaitais donc que le nombre d'utilisateurs de Toei Subway soit également distribué au format CSV. Vous trouverez ci-dessous un graphique du taux d'augmentation / diminution du nombre d'utilisateurs du métro Toei.
journée | Shinjuku 7 heures | Shinjuku 8 heures | Shinjuku 9 heures | Shibuya 7 heures | Shibuya 8 heures | Shibuya 9 heures | 7 heures à Tokyo | Tokyo 8 heures | Tokyo 9 heures |
---|---|---|---|---|---|---|---|---|---|
2020/1/31 | 1.88% | -2.96% | 0.39% | 0.57% | -4.58% | -1.86% | -1.49% | -1.93% | 0.44% |
2020/2/7 | 0.18% | -1.03% | 2.06% | -0.56% | -4.05% | 1.65% | 1.15% | 0.84% | 1.97% |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
Les données suivantes sont extraites du nombre de personnes infectées de Kaggle.
Index | journée | Nombre de personnes infectées |
---|---|---|
1 | 2020/1/22 | 2 |
2 | 2020/1/23 | 2 |
3 | 2020/1/24 | 2 |
4 | 2020/1/25 | 2 |
5 | 2020/1/26 | 4 |
6 | 2020/1/27 | 4 |
7 | 2020/1/28 | 7 |
8 | 2020/1/29 | 7 |
9 | 2020/1/30 | 11 |
10 | 2020/1/31 | 5 |
... | ... | ... |
79 | 2020/4/9 | 4667 |
La variable explicative X est [0, 1 ,, 2, 3, ...., 79]. La cible prévue Y est le nombre de personnes infectées [2, 2, 2, 2, 4, 4, 7, ...].
Du 2020/1/22 au 2020/4/9, 90% du front sont des données d'entraînement et 10% du back sont des données de test. Le modèle de régression a été formé avec les données d'entraînement et évalué avec les données de test. La partie des données d'entraînement est presque exactement la même, mais la partie des données de test est un peu différente. Une simple régression seule ne peut pas prédire correctement. Nous avons également prédit 10 jours dans le futur.
Dans la prévision simple, seules les données de Kaggle ont été utilisées, mais la prévision est faite en ajoutant le taux de diminution du nombre d'utilisateurs de Toei Subway. On dit que l'effet de la maîtrise de soi apparaîtra après environ deux semaines. Par conséquent, le nombre de personnes infectées est combiné avec le taux de diminution des utilisateurs du métro Toei il y a deux semaines pour faire une prédiction.
Du 2020/1/22 au 2020/4/9, 90% du front sont des données d'entraînement et 10% du back sont des données de test. Le modèle de régression a été formé avec les données d'entraînement et évalué avec les données de test. La partie des données d'entraînement et la partie des données de test sont également exactement les mêmes. De plus, nous prévoyons les 10 prochains jours et les montrons avec une ligne rouge épaisse. Le nombre de personnes infectées augmentera rapidement à l'avenir.
Nous avons évalué comment l'effet de la maîtrise de soi apparaît dans la prédiction à l'aide d'un modèle de prédiction. Le taux d'augmentation / diminution des utilisateurs du métro Toei sera affecté après 2 semaines, donc si le taux d'augmentation / diminution des utilisateurs du métro Toei a diminué de 40% par rapport à il y a 2 semaines (27 mars), nous simulerons ce qui se passerait. Je l'ai essayé. Le nombre de passagers du métro le 3 avril a diminué d'environ 40%, selon l'heure de la journée. Puisqu'elle est encore réduite de 40%, il s'agit d'une simulation lorsqu'elle est réduite d'environ 80%.
À compter du 27 mars, il y a deux semaines, si nous pouvions réduire le nombre d'usagers du métro d'environ 80%, nous serions en mesure de réduire considérablement le rythme d'augmentation du nombre de personnes infectées. Si vous pouvez voir l'effet de ne pas sortir par de telles prédictions, vous aurez envie de vous abstenir de sortir. Cependant, l'effet sera visible après plus de deux semaines, vous devez donc le supporter.
Kaggle : https://www.kaggle.com/imdevskp/corona-virus-report Nouveau site de contrôle des infections par le virus corona à Tokyo: https://stopcovid19.metro.tokyo.lg.jp/
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import numpy as np
import pandas as pd
from datetime import datetime
import copy
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVR
def read_confirmed():
data = pd.read_csv('covid_19_clean_complete.csv')
data_japan = data[data.loc[:, 'Country/Region']=='Japan']
data_japan = data_japan.reset_index(drop=True)
data_japan = data_japan.loc[:, ['Date', 'Confirmed', 'Deaths', 'Recovered']]
data_japan['New_confirmed'] = (data_japan['Confirmed'] - data_japan['Confirmed'].shift(1)).fillna(0)
return data_japan
def read_subway(data_japan):
subway = pd.read_csv('20200409_subway.csv')
data_japan1 = pd.merge(data_japan, subway, left_on='Date', right_on='Date3', how="outer")
data_japan1 = data_japan1.drop(["Date1", "Date2", "Date3"], axis=1)
data_japan1 = data_japan1.loc[:78, :]
data_japan1 = data_japan1.fillna(0)
data_japan1["x"] = data_japan1.index
return data_japan1
def plot1(data_japan):
# x=data_japan.loc[:, 'Date']
x = np.arange(len(data_japan))
plt.plot(x, data_japan.loc[:, 'Confirmed'], label='confirmed')
plt.plot(x, data_japan.loc[:, 'New_confirmed'], label='New_confirmed')
plt.title('Japan')
plt.legend()
plt.savefig('japan_confirmed.png')
plt.cla()
def predict_svr1(data_japan):
y = data_japan['Confirmed']
x = np.arange(len(data_japan)).reshape((-1,1))
Xtrain, Xtest, Ytrain, Ytest = train_test_split(x, y, test_size=0.10, shuffle=False)
svm_confirmed = SVR(shrinking=True, kernel='poly',gamma=0.01, epsilon=1,degree=5, C=0.1)
svm_confirmed.fit(Xtrain, Ytrain)
Ytrain_pred = svm_confirmed.predict(Xtrain)
Ytest_pred = svm_confirmed.predict(Xtest)
#Prévisions futures
Xtest2 = np.arange(Xtest[-1]+1, Xtest[-1]+11).reshape((-1, 1))
Ytest_pred2 = svm_confirmed.predict(Xtest2)
#terrain
plt.plot(np.arange(len(data_japan)), data_japan.loc[:, 'Confirmed'], label="confirmed", color='blue')
plt.plot(Xtrain, Ytrain_pred, '--', label="train_pred", color='red')
plt.plot(Xtest, Ytest_pred, label="test_pred", color='red', linewidth=1)
plt.plot(Xtest2, Ytest_pred2, label="pred2", color='red', linewidth=3)
plt.legend()
plt.title('Japan')
plt.savefig('japan_redict1.png')
plt.cla()
def predict_svr2(data_japan):
y = data_japan["Confirmed"]
x = data_japan[['Shinjyuku_7', 'Shinjyuku_8', 'Shinjyuku_9', 'Shibuya_7', 'Shibuya_8', 'Shibuya_9', 'Tokyo_7', 'Tokyo_8', 'Tokyo_9', 'x']]
Xtrain, Xtest, Ytrain, Ytest = train_test_split(x, y, test_size=0.10, shuffle=False)
Xtest = Xtest.reset_index(drop=True)
svm_confirmed = SVR(shrinking=True, kernel='poly',gamma=0.01, epsilon=1,degree=5, C=0.1)
svm_confirmed.fit(Xtrain, Ytrain)
Ytrain_pred = svm_confirmed.predict(Xtrain)
Ytest_pred = svm_confirmed.predict(Xtest)
#Prédiction future 1
Xtest2 = copy.deepcopy(Xtest)
last = len(Xtest) - 1
Xtest2.loc[:, 'x'] = np.arange(Xtest.loc[last, 'x'] + 1, Xtest.loc[last, 'x'] + 1 + len(Xtest))
last = len(Xtest) - 1
Xtest2['Shinjyuku_7'] = Xtest.loc[last, 'Shinjyuku_7']
Xtest2['Shinjyuku_8'] = Xtest.loc[last, 'Shinjyuku_8']
Xtest2['Shinjyuku_9'] = Xtest.loc[last, 'Shinjyuku_9']
Xtest2['Shibuya_7'] = Xtest.loc[last, 'Shibuya_7']
Xtest2['Shibuya_8'] = Xtest.loc[last, 'Shibuya_8']
Xtest2['Shibuya_9'] = Xtest.loc[last, 'Shibuya_9']
Xtest2['Tokyo_7'] = Xtest.loc[last, 'Tokyo_7']
Xtest2['Tokyo_8'] = Xtest.loc[last, 'Tokyo_8']
Xtest2['Tokyo_9'] = Xtest.loc[last, 'Tokyo_9']
Ytest_pred2 = svm_confirmed.predict(Xtest2)
#Prédiction future 2
Xtest3 = copy.deepcopy(Xtest)
Xtest3.loc[:, 'x'] = np.arange(Xtest.loc[last, 'x'] + 1, Xtest.loc[last, 'x'] + 1 + len(Xtest))
reduce = -0.1
num = len(Xtest3)
diff = reduce / (num - 1)
Xtest3.loc[:, 'Shinjyuku_7'] = [Xtest.loc[last, 'Shinjyuku_7'] + diff * i for i in range(num)]
Xtest3.loc[:, 'Shinjyuku_8'] = [Xtest.loc[last, 'Shinjyuku_8'] + diff * i for i in range(num)]
Xtest3.loc[:, 'Shinjyuku_9'] = [Xtest.loc[last, 'Shinjyuku_9'] + diff * i for i in range(num)]
Xtest3.loc[:, 'Shibuya_7'] = [Xtest.loc[last, 'Shibuya_7'] + diff * i for i in range(num)]
Xtest3.loc[:, 'Shibuya_8'] = [Xtest.loc[last, 'Shibuya_8'] + diff * i for i in range(num)]
Xtest3.loc[:, 'Shibuya_9'] = [Xtest.loc[last, 'Shibuya_9'] + diff * i for i in range(num)]
Xtest3.loc[:, 'Tokyo_7'] = [Xtest.loc[last, 'Tokyo_7'] + diff * i for i in range(num)]
Xtest3.loc[:, 'Tokyo_8'] = [Xtest.loc[last, 'Tokyo_8'] + diff * i for i in range(num)]
Xtest3.loc[:, 'Tokyo_9'] = [Xtest.loc[last, 'Tokyo_9'] + diff * i for i in range(num)]
Ytest_pred3 = svm_confirmed.predict(Xtest3)
#terrain
plt.plot(np.arange(len(data_japan)), data_japan.loc[:, 'Confirmed'], label="confirmed", color='blue')
plt.plot(Xtrain['x'], Ytrain_pred, '--', label="train_pred", color='red')
plt.plot(Xtest['x'], Ytest_pred, label="test_pred", color='red', linewidth=1)
plt.plot(Xtest2['x'], Ytest_pred2, label="pred2", color='red', linewidth=3)
plt.plot(Xtest2['x'], Ytest_pred3, label="pred3", color='green', linewidth=3)
plt.legend()
plt.title('Japan')
plt.savefig('japan_redict2.png')
def main():
#Lecture des données de la personne infectée
data_japan = read_confirmed()
data_japan.to_csv('data_japan.csv', index=False)
plot1(data_japan)
#Prédiction 1
predict_svr1(data_japan)
#Lecture des données de la personne infectée
data_japan = read_subway(data_japan)
#Prédiction 2
predict_svr2(data_japan)
if __name__ == '__main__':
main()
Recommended Posts