[PYTHON] J'ai essayé de prédire le nombre de personnes infectées par le virus corona en tenant compte de l'effet de s'abstenir de sortir

en premier

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.

Algorithme de prédiction

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é.

Les données

Données sur le nombre de personnes infectées

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. japan_confirmed.png

Effet d'auto-retenue

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%
... ... ... ... ... ... ... ... ... ...

subway.png

Méthode d'évaluation

Prédiction simple

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. japan_redict1.png

Prédiction tenant compte de la maîtrise de soi de sortir

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. japan_redict2.png

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%.

japan_redict2A.png

À 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.

Les références

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/

programme

#!/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

J'ai essayé de prédire le nombre de personnes infectées par le virus corona en tenant compte de l'effet de s'abstenir de sortir
J'ai essayé de prédire le nombre de personnes infectées par le virus corona au Japon par la méthode du dernier article en Chine
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
Prédire le nombre de personnes infectées par COVID-19 avec Prophet
J'ai essayé de résumer les nouvelles personnes infectées par le virus corona dans la ville d'Ichikawa, préfecture de Chiba
J'ai essayé de visualiser les caractéristiques des nouvelles informations sur les personnes infectées par le virus corona avec wordcloud
Visualisons le nombre de personnes infectées par le virus corona avec matplotlib
J'ai essayé de trouver la tendance du nombre de navires dans la baie de Tokyo à partir d'images satellites.
J'ai essayé de trier les objets de l'image du plat de steak-② Tri des numéros de chevauchement
Compte tenu de la situation au Japon par le statisticien Nate Silver, "Le nombre de personnes infectées par le coronavirus n'a pas de sens"
[Version terminée] Essayez de connaître le nombre d'habitants de la ville à partir de la liste d'adresses avec Python
J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
Je voulais connaître le nombre de lignes dans plusieurs fichiers et j'ai essayé de l'obtenir avec une commande
J'ai essayé de trier les objets de l'image du plat de steak-④ Clustering
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de classer le nombre de décès par habitant de COVID-19 (nouveau virus corona) par pays
Analyse des émotions avec traitement du langage naturel! J'ai essayé de prédire l'évaluation à partir du texte de l'avis
J'ai essayé de prédire le genre de musique à partir du titre de la chanson sur le réseau neuronal récurrent
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé de trier les objets de l'image du plat de steak-① Détection d'objets
J'ai essayé de prédire les ventes de logiciels de jeux avec VARISTA en me référant à l'article du Codexa
Introduction à la création d'IA avec Python! Partie 1 J'ai essayé de classer et de prédire le nombre à partir de l'image du numéro manuscrit
J'ai essayé de décrire le trafic en temps réel avec WebSocket
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé de couper une image fixe de la vidéo
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé d'adapter la fonction exponentielle et la fonction logistique au nombre de patients positifs au COVID-19 à Tokyo
J'ai essayé de trier les objets de l'image du plat de steak --③ Image similaire Détection de carte de chaleur
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé d'apprendre l'angle du péché et du cos avec le chainer
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
J'ai essayé de refactoriser le code du modèle publié dans "Obtenir des images de l'API Flickr avec Python" (Partie 2)
J'ai essayé de trier les objets de l'image du plat de steak-⑤ Détection de point de fonction d'image similaire
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ①
Introduction à la création d'IA avec Python! Partie 2 J'ai essayé de prédire le prix de l'immobilier dans la ville de Boston avec un réseau neuronal
J'ai essayé de prédire la détérioration de la batterie lithium-ion en utilisant le SDK Qore
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
Créez un BOT qui affiche le nombre de personnes infectées dans le nouveau Corona
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
[Python] J'ai essayé le même calcul que la prédiction de LSTM à partir de zéro [Keras]
L'histoire de la fabrication de soracom_exporter (j'ai essayé de surveiller SORACOM Air avec Prometheus)
J'ai essayé d'afficher le degré d'infection par le virus corona sur la carte thermique Seaborn
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot