[PYTHON] [Introduction au graphique logarithmique] Prédire l'heure de fin de chaque pays à partir du graphique logarithmique des données sur le nombre d'infections ♬

Cette fois, nous prédirons l'heure du pic d'infection dans chaque pays par un graphique logarithmique.

Ce que j'ai fait

・ Un peu de théorie ・ Prévisions de chaque pays ・ Explication du code ・ Théorie supplémentaire ・ Prévisions de chaque pays II

・ Un peu de théorie

La dernière fois, l'équation suivante a été dérivée.

I =  I_0\exp(\gamma (\frac{\beta}{\gamma} \frac{S}{N} - 1)t)\\

Si vous prenez le logarithme des deux côtés,

\ln I =  \ln I_0+\gamma (\frac{\beta}{\gamma} \frac{S}{N} - 1)t\\

Est obtenu. Autrement dit, si vous dessinez un graphique avec $ \ ln I $ sur l'axe vertical et le temps $ t $ sur l'axe horizontal, la pente sera

\gamma (\frac{\beta}{\gamma} \frac{S}{N} - 1)\\

Peut tracer une ligne droite. Ici, ce gradient dépend de $ S $ et correspond au nombre de personnes non infectées qui diminue avec le temps. Et ce dégradé peut être réécrit comme suit en utilisant le nombre de reproduction effectif $ R $ introduit la dernière fois.

\gamma (R - 1)\\
R = R_0 \frac{S}{N}\\
R_0 = \frac{\beta}{\gamma}\\

Par conséquent, ce gradient devient 0 à R = 1, c'est-à-dire le nombre de reproductions = 0, et le nombre de personnes infectées n'augmente plus, de sorte que l'infection culmine. Cette fois, sur la base de cette théorie, je voudrais tracer les données de chaque pays dans $ \ log I \ vs \ t $ et voir l'heure du pic d'infection dans chaque pays.

De plus, à partir de la pente montante, $ S \ Fallingdotseq N $, et $ \ gamma (R_0 -1) $ peuvent être obtenus. En ajustant le graphe obtenu avec ceci comme valeur initiale, il semble que $ \ gamma $, $ \ beta $, $ R_0 $ puissent être obtenus.

・ Prévisions de chaque pays

・ Situation de la Corée du Sud, Diamond Princess, Italie

Il peut sembler méfiant que l'Italie soit incluse, mais les résultats sont les suivants: logmulti_Italy_.png Si vous regardez ces trois pays côte à côte, vous pouvez voir qu'ils sont très différents. Autrement dit, si les axes x et y sont déplacés en parallèle, ils sont susceptibles de se chevaucher. En d'autres termes, vous pouvez voir qu'il existe des zones avec la même inclinaison. Dans chaque graphique, vous pouvez voir ** une section qui augmente 10 fois en près de 10 jours **. Oui, le DP est susceptible de saturer d'abord la courbe du nombre d'infections, puis la Corée du Sud, puis l'Italie. Le graphique ci-dessous trace la pente. Autrement dit, quand il atteint 0, cela signifie qu'il est saturé. Ainsi, vous pouvez voir ce qui précède à partir de ce graphique. Quand je parle de l'Italie, on m'a beaucoup parlé, mais je pense qu'elle atteindra son apogée dans environ 10 jours.

・ Situation des pays européens

Le même graphique est affiché pour l'Espagne, l'Allemagne, la Suisse, le Royaume-Uni et les Pays-Bas autres que l'Italie. logmulti_United Kingdom_.png Chevauchement, l'Angleterre est un peu en retrait, mais les autres ont des courbes similaires. L'axe vertical diffère selon chaque situation (population, etc.), mais la pente change à peu près de la même manière. Et, si vous regardez le diagramme de la pente, il semble qu'elle sera saturée tous ensemble dans environ 2 semaines **.

・ Un petit pays décevant

Les trois pays que sont le Japon, l'Iran et Bahreïn ont également des courbes très similaires dans un sens. logmulti_Bahrain_.png Puisque la situation croissante est différente, l'axe y est complètement différent, donc je pense que la situation du système médical est différente. Cependant, l'inclinaison après le lever est assez similaire, et bien qu'ils aient été presque saturés ces derniers jours, l'Iran et le Japon ont de nouveau augmenté. Bahreïn a également une inclinaison négative, mais il est redevenu positif. Les gradients de ces trois pays sont ** 10 fois / 30 jours, ce qui est un gradient doux qui semble saturé à tout moment après sa stabilisation. Ces pays sont toujours infectés et doivent être contenus avec des tensions dans toute la société.

・ Situation américaine rumeur

J'ai essayé de tracer la Suède et les États-Unis de la même manière. logmulti_Sweden_.png

Comme vous pouvez le voir en un coup d'œil, la hausse est similaire. Cependant, la Suède a une pente plus petite du milieu. Cependant, en regardant le graphique de la pente inférieure, il est presque parallèle à l'axe des x ces jours-ci, et il ne semble pas qu'il se dirige vers zéro. En d'autres termes, il ne semble pas saturer dans un proche avenir. Cependant, aux États-Unis, les données du 58e au 65e sont disponibles, et il semble que la pente s'approche rapidement de 0. Si vous prolongez cela, vous pouvez voir que ** il est possible que l'infection atteigne un pic dans environ 10 jours **. On peut voir que le gradient maximal des deux pays est d'environ 25 fois / 20 jours, ce qui est plus grand que le gradient précédent.

・ Explication du code

La bibliothèque à utiliser et la lecture des données sont les mêmes que la dernière fois. Les données sur le nombre de décès sont également traitées, mais elles sont supprimées car elles ne sont pas utilisées ci-dessous.

import numpy as np
from scipy.integrate import odeint
from scipy.optimize import minimize
import matplotlib.pyplot as plt
import pandas as pd

#Lisez les données CSV avec les pandas.
data = pd.read_csv('COVID-19/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv')
data_r = pd.read_csv('COVID-19/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv')

Ci-dessous, la fonction de traitement des données renvoie les données de numéro d'infection et de gradient traitées.

def data_city(city):
    #Données de processus
    t_cases = 0
    t_recover = 0
    t_deaths = 0
    for i in range(0, len(data_r), 1):
        if (data_r.iloc[i][1] == city): #for country/region
        #if (data_r.iloc[i][0] == city):  #for province:/state  
            print(str(data_r.iloc[i][0]) + " of " + data_r.iloc[i][1])
            for day in range(4, len(data.columns), 1):            
                confirmed_r[day - 4] += data_r.iloc[i][day]
            t_recover += data_r.iloc[i][day]      
    for i in range(0, len(data), 1):
        if (data.iloc[i][1] == city): #for country/region
        #if (data.iloc[i][0] == city):  #for province:/state  
            print(str(data.iloc[i][0]) + " of " + data.iloc[i][1])
            for day in range(4, len(data.columns), 1):
                confirmed[day - 4] += data.iloc[i][day] -  confirmed_r[day - 4]
                diff_confirmed[day - 4] += confirmed[day-4] /  confirmed_r[day - 4]

    tl_confirmed = 0
    dlog_confirmed = [0] * (len(data.columns) - 4)
    dlog_confirmed[0]=np.log(confirmed[0])
    dlog_confirmed[1]=np.log(confirmed[1])-np.log(confirmed[0])
    for i in range(2, len(confirmed)-2, 1):
        if confirmed[i] > 0:
            dlog_confirmed[i]=(np.log(confirmed[i+1])-np.log(confirmed[i-1]))/2
        else:
            continue
    tl_confirmed = confirmed[len(confirmed)-1] + confirmed_r[len(confirmed)-1] + confirmed_d[len(confirmed)-1]
    t_cases = tl_confirmed
            
    return confirmed, dlog_confirmed       

Ce qui suit est utilisé pour tracer plusieurs pays sur le même diagramme. Entrez le pays que vous souhaitez dessiner dans city_list. Utilisez la fonction de traitement des données ci-dessus pour obtenir les données du nombre d'infection et son gradient un-à-un. Dessinez ceci. Donc fig, (ax1, ax2) =. .. .. La définition de est définie en dehors de l'instruction for. Enfin, je vais les afficher tous ensemble. Je n'ose pas définir la couleur, mais elle est automatiquement sélectionnée.

city_list={ "Spain","Germany","Switzerland","United Kingdom", "Netherlands" }
fig, (ax1,ax2) = plt.subplots(2,1,figsize=(1.6180 * 4, 4*2))
for city in city_list:
    confirmed = [0] * (len(data.columns) - 4)
    confirmed_r = [0] * (len(data_r.columns) - 4)
    confirmed_d = [0] * (len(data_d.columns) - 4)
    diff_confirmed = [0] * (len(data.columns) - 4)
    days_from_22_Jan_20 = np.arange(0, len(data.columns) - 4, 1)
    days_from_22_Jan_20_ = np.arange(0, len(data.columns) - 4, 1)
    recovered_rate = [0] * (len(data_r.columns) - 4)
    deaths_rate = [0] * (len(data_d.columns) - 4)
    
    confirmed, dlog_confirmed = data_city(city)
    #dessin matplotlib
    lns1=ax1.semilogy(days_from_22_Jan_20, confirmed, ".-", label = str(city))
    lns4=ax2.plot(days_from_22_Jan_20_, dlog_confirmed, ".-",label = str(city))

ax1.set_xlabel("days from 22, Jan, 2020")
ax1.set_ylabel("casas ")
ax2.set_ylabel("slopes ")
ax1.legend(loc=0)
ax2.legend(loc=0)
ax1.grid()
ax2.grid()

plt.pause(1)
plt.savefig('./fig/logmulti_{}_.png'.format(city)) 
plt.close()

・ Théorie supplémentaire

En fait, on peut imaginer que la transition de la courbe du nombre de guérison sera similaire à la courbe du nombre d'infection, bien qu'il y ait un retard dans la récupération. Alors, j'ai essayé d'en parler ci-dessous. Premièrement, la substitution de $ I $ dans la troisième équation du modèle SIR donne ce qui suit.

\frac{dr}{dt} =  \gamma I_0\exp(\gamma (R - 1)t) \\

Par conséquent, si vous prenez le logarithme des deux côtés

\ln (\frac{dr}{dt}) =  \ln \gamma + \ln I_0 + \gamma (R - 1)t \\

Sera. Autrement dit, on peut s'attendre à ce que la différenciation temporelle (pente) du taux de récupération ait la même courbe que l'équation ci-dessus, et les sections y diffèrent de $ \ ln \ gamma $. Cependant, cela semble difficile à gérer en raison de la grande erreur, je vais donc le changer un peu.

Autrement dit, lorsque R est constamment intégré (bien que non analytiquement correct), l'équation suivante est obtenue.

r =  \frac{I_0}{(R-1)}\exp(\gamma (R - 1)t) + r_0\\

Par conséquent, si vous prenez le logarithme des deux côtés

\ln r =  \ln I_0 -\ln (R-1) + \gamma (R - 1)t +\ln r_0

Peut être écrit. Par conséquent, on peut s'attendre à ce qu'une courbe qui est presque parallèle et a une section y de $ -ln (R-1) + \ ln r_0 $ soit différente de la formule ci-dessus de $ \ ln I $.

・ Prévisions de chaque pays II

・ Situation de Wuhan

Une belle courbe a été obtenue comme indiqué ci-dessous. Comme prévu, la courbe du nombre d'infection et la courbe du nombre de guérison commencent en parallèle et se croisent après le pic du nombre d'infection. Parallèlement à cela, la différence entre les deux courbes ($ \ log (A / B) = \ log A- \ log B $) passe linéairement par $ 10 ^ 0 $. log_Hubei_.png

・ Situation en Italie

Les deux courbes sont parallèles, et j'ai conclu ci-dessus que le nombre d'infections est susceptible de culminer dans environ 10 jours, mais après cela, il semble qu'elles ne se croisent pas facilement. Après cela, on considère qu'ils vont s'approcher et se croiser, mais les données du nombre de guérison peuvent être suspectes. log_Italy_.png

・ La situation en Espagne au nom de l'Europe

Les deux courbes se rapprochent régulièrement, et après le nombre maximal d'infections, elles se croisent et la fin est visible. log_Spain_.png

・ Situation au Japon

Au Japon, les deux courbes se rapprochent progressivement, et l'écart se dirige vers 0, mais l'écart s'est creusé en raison de l'augmentation récente du nombre d'infections. Ainsi, comme pour ce qui précède, nous pouvons conclure que la propagation de l'infection se poursuit et qu'il est nécessaire de la supprimer. log_Japan_.png

Résumé

・ Le nombre d'infections dans chaque pays a été tracé de manière logarithmique et classé, et le moment du nombre maximal d'infections a été prévu. ・ L'heure de la fin a été prédite en traçant simultanément le nombre d'infections et le nombre de guérisons.

・ Je veux suivre l'évolution de la situation chaque jour ・ La théorie de la partie supplémentaire étant suspecte, je vais l'organiser un peu plus et la connecter à la détermination des paramètres.

Recommended Posts

[Introduction au graphique logarithmique] Prédire l'heure de fin de chaque pays à partir du graphique logarithmique des données sur le nombre d'infections ♬
[Introduction à matplotlib] Lire l'heure de fin à partir des données COVID-19 ♬
De l'introduction de pyethapp à l'exécution du contrat
Une introduction à l'analyse de données à l'aide de Python - Pour augmenter le nombre de vues vidéo -
L'histoire de la copie de données de S3 vers TeamDrive de Google
[Introduction au modèle de maladie infectieuse] En regardant le graphique logarithmique. .. .. Une semaine après "C'est la deuxième vague"!
Apprenez les données comptables et essayez de prédire les comptes à partir du contenu de la description lors de la saisie des journaux
Bases de Seaborn pour les débutants ① Graphique agrégé du nombre de données (Countplot)
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
Je veux connaître la population de chaque pays du monde.
Obtenez le nombre de visites sur chaque page avec ReportingAPI + Cloud Functions
[Introduction to Data Scientist] Bases du calcul scientifique, du traitement des données et comment utiliser la bibliothèque de dessins graphiques ♬ Construction d'environnement
Résumé de vtkThreshold (mis à jour de temps en temps)
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
Introduction à Scapy ① (De l'installation à l'exécution de Scapy)
[Introduction au Data Scientist] Bases de Python ♬
[Python] De l'analyse morphologique des données CSV à la sortie CSV et à l'affichage graphique [GiNZA]
Introduction à la modélisation statistique pour l'analyse des données Élargissement de la gamme d'applications de GLM
[Vérification] LevelDB prend-il du temps pour enregistrer les données lorsque la quantité de données augmente? ??
[Introduction au modèle de maladie infectieuse] En regardant le graphique logarithmique. .. .. C'est la deuxième vague! ??
Lien vers les points de données du graphe créé par jupyterlab & matplotlib
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Introduction au Deep Learning pour la première fois (Chainer) Reconnaissance de caractères japonais Chapitre 4 [Amélioration de la précision de la reconnaissance en développant les données]
Récapitulatif des options gcc (mises à jour de temps en temps)
Convertissez les données avec la forme (nombre de données, 1) en (nombre de données,) avec numpy.
Modifiez le point décimal de la journalisation de, à.
[Introduction à cx_Oracle] (5e) Gestion des données japonaises
Transition du baseball vue à partir des données
Histoire de passer de Pipenv à la poésie
Examinons le temps de convergence de la tendance mondiale du nombre de reproduction effectif du nouveau virus corona
Essayez de créer une table d'enregistrement de bataille avec matplotlib à partir des données de "Schedule-kun"
Résumé du début au chapitre 1 de l'introduction aux modèles de conception appris en langage Java
[Python] Représentation du nombre de plaintes des compagnies d'assurance-vie dans un graphique à barres
Je voulais juste extraire les données de la date et de l'heure souhaitées avec Django
Comment compter le nombre d'occurrences de chaque élément de la liste en Python avec poids
Vérifiez le temps de traitement et le nombre d'appels pour chaque processus avec python (cProfile)
Il est temps de réfléchir sérieusement à la définition et aux compétences des data scientists
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