[PYTHON] 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

en premier

Je ne suis pas un spécialiste des 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. Je m'intéresse à la manière dont le nombre de personnes infectées au Japon augmentera à l'avenir. Par conséquent, j'ai recherché des articles sur le modèle de prédiction des infections. Des modèles d'infection ont déjà été annoncés dans le monde entier, mais des paramètres tels que le taux d'infection et le taux d'isolement ont une grande influence sur la précision lors de la prédiction avec le modèle d'infection. Si ces paramètres diffèrent des valeurs réelles, la prédiction sera loin de la situation réelle.

L'autre jour, un chercheur chinois a annoncé un modèle prédictif du nombre de personnes infectées par le coronavirus. COVID-19 in Japan: What could happen in the future?

Dans cet article, nous prédisons que le nombre de personnes infectées peut être prédit avec précision en appliquant le modèle de prédiction à différentes parties de la Chine (Wuhan, Pékin, Shanghai ...), et que le nombre de personnes infectées augmentera à l'avenir en l'appliquant au Japon. Je suis. En outre, dans cet article, le taux d'infection et le taux d'isolement, qui sont les paramètres nécessaires à la prédiction, ont été annoncés (même s'il serait correct de dire que les paramètres ont été ajustés pour correspondre au nombre réel de personnes infectées).

Modèle prédictif

Les modèles SIR et SEIR sont utilisés dans le modèle des maladies infectieuses, mais cet article utilise un modèle légèrement différent. Nous l'appelons le modèle dynamique statistique de retard temporel.

model_picture.png

[Citation COVID-19 au Japon: que pourrait-il se passer dans le futur?]

La formule de calcul est la suivante. model.png t: jour I (t): nombre cumulé de personnes infectées J (t): nombre cumulé de personnes infectées (apparition confirmée à l'hôpital) G (t): personne infectée survenue à ce moment-là (valeur non cumulative, l'apparition n'est pas confirmée) I0 (t): Nombre d'infections potentielles (infectées mais non confirmées ou mises en quarantaine)       I0(t) = I(t) − J(t) − G(t) [Citation COVID-19 au Japon: que pourrait-il se passer dans le futur?]

Paramètres

Il existe des paramètres importants pour l'utilisation de ce modèle: l'incidence et l'hospitalisation. En ce qui concerne les paramètres, un exemple chinois a été décrit dans cet article.

zone Taux de croissance Taux d'infection l1 Taux d'infection l2 tl
Shanghai 0.3137 0.1713 0.6149 2020/1/16
Pékin 0.3125 0.1824 0.5880 2020/1/17
Wuhan 0.3019 0.1142 0.4567 2020/1/17

r Taux de croissance

Le taux de croissance est le taux auquel une personne infecte une autre. Cela a été établi comme suit sur la base des chiffres en Chine dans le document.   r = 0.3

l Taux d'isolement

Le taux de quarantaine est le taux auquel les personnes infectées sont mises en quarantaine. Cela a été établi comme suit sur la base des chiffres en Chine dans le document. l = 0,1 (jusqu'au 28/02/2020) l = 0,5 (à partir du 29 février 2020)

Taux d'incidence

f2 (t) Probabilité de transition de l'infection à l'apparition Cela n'a pas été mentionné dans le document. J'ai entendu la nouvelle que 70 à 80% des personnes ne développent pas la maladie même si elles sont infectées. De plus, comme il faut au plus 14 jours pour développer la maladie, nous la définissons comme suit.  f2(t) = 0.2/14 × t (t < 14)  f2(t) = 0.2 (t >= 14)

Taux d'hospitalisation

f4 (t) Probabilité de transition de l'infection à l'hospitalisation Le taux d'infection et d'hospitalisation est totalement inconnu. Par conséquent, en supposant que 1/4 des personnes touchées seront hospitalisées, les paramètres sont les suivants.  f4(t) = 0.05/14 × t (t < 14)  f4(t) = 0.05 (t >= 14)

programme

predict.py


from __future__ import print_function
import numpy as np
import pandas as pd

default_output  = 'predict.csv'

class  Corona():
    def __init__(self, max_day):
        self.r  = 0.3 #Taux de croissance
        self.tl = 15  #Date de début de l'isolement
        self.l1 = 0.1 #Taux d'isolement avant la date de début de l'isolement
        self.l2 = 0.5 #Taux d'isolement après la date de début de l'isolement
        self.i  = np.zeros(max_day + 1)
        self.i0 = np.zeros(max_day + 1)
        self.j  = np.zeros(max_day + 1)
        self.g  = np.zeros(max_day + 1)

    def set_start(self):
        # self.j[0]  = 11 # 2020/1/30
        self.j[0]  = 21 # 2020/2/14
        self.i[0]  = self.j[0] * 10
        self.g[0]  = 0
        self.i0[0] = self.func_i0(0)

    def f2(self, t):
        #Taux d'incidence
        if t < 14:
            a = 0.2/14.0
            b = 0.0
            y = a * t + b
        else:
            y = 0.2
        return y

    def f4(self, t):
        #Taux d'hospitalisation
        if t < 14:
            a = 0.05/14.0
            b = 0.0
            y = a * t + b
        else:
            y = 0.05
        return y

    def func_l(self, t):
        #Taux d'isolement
        if t < self.tl:
            return self.l1
        else:
            return self.l2

    def func_i(self, t):
        #Nombre cumulé de personnes infectées
        # I(t + 1) = I(t) + r I0(t),
        new_i = self.i[t] + self.r * self.i0[t]
        return new_i

    def func_j(self, t):
        #Nombre cumulé de personnes infectées(Confirmé à l'hôpital)
        # J(t + 1) = J(t) + r Σs<t f4(t - s) I0(s)
        sum1 = 0
        for s in range(t):
            sum1 += self.f4(t - s) * self.i0[s]
        new_j = self.j[t] + self.r * sum1
        return new_j

    def func_g(self, t):
        #Personne infectée survenue momentanément(Non confirmé être infecté à l'hôpital)
        # G(t + 1) = G(t) + f2(t) Σs<t f2(t - s) I0(s) - Σs<t f4(t - s) I0(s).
        sum1 = 0
        sum2 = 0
        for s in range(t):
            sum1 += self.f2(t - s) * self.i0[s]
        for s in range(t):
            sum2 += self.f4(t - s) * self.i0[s]
        new_g = self.g[t] + self.func_l(t) * sum1 - self.func_l(t) * sum2
        return new_g

    def func_i0(self, t):
        #Nombre d'infections potentielles(Infecté mais non confirmé ou mis en quarantaine)
        # I0(t) := I(t) - J(t) - G(t)
        new_i0 = self.i[t] - self.j[t] - self.g[t]
        if new_i0 < 0.0:
            new_i0 = 0.0
        return new_i0

    def predict(self, day):
        #Initialisation
        period = day + 1
        predict_data = np.zeros([period, 5])
        df_predict = pd.DataFrame(predict_data, columns=['day', 'I', 'J', 'G', 'I0'])
        self.set_start()

        #Prévoir
        for i in range(period - 1):
            self.i[i+1]  = self.func_i(i)
            self.j[i+1]  = self.func_j(i)
            self.g[i+1]  = self.func_g(i)
            self.i0[i+1] = self.func_i0(i)

            df_predict.loc[i, 'day'] = i+1
            df_predict.loc[i, 'I']   = self.i[i+1]
            df_predict.loc[i, 'J']   = self.j[i+1]
            df_predict.loc[i, 'G']   = self.g[i+1]
            df_predict.loc[i, 'I0']  = self.i0[i+1]

        return df_predict

def main():
    corona = Corona(25)
    predict = corona.predict(25)
    predict.to_csv(default_output, index=False)
 
if __name__ == "__main__":
    main()

résultat

Nombre de personnes infectées (celles dont l'infection a été confirmée à l'hôpital)

Nous avons obtenu le nombre de personnes infectées au début de la simulation à partir des matériaux publiés quotidiennement dans communiqué de presse du ministère de la Santé, du Travail et du Bien-être social. Prédiction à partir du 15/02 sur la base de 21 personnes infectées le 14/02/2020. Les résultats de la prédiction sont les suivants.

predict_japan1_20200303.png

Date Nombre de personnes infectées(Annoncé par le ministère de la Santé, du Travail et des Affaires sociales) Nombre de personnes infectées(Prévoir)
2020/2/14 21 21
2020/2/15 21 21
2020/2/16 21 21
2020/2/17 46 22
2020/2/18 53 23
2020/2/19 60 25
2020/2/20 70 29
2020/2/21 79 35
2020/2/22 90 43
2020/2/23 114 54
2020/2/24 126 69
2020/2/25 140 90
2020/2/26 149 118
2020/2/27 171 153
2020/2/28 195 200

L'erreur était grande sur le chemin, mais le 28/02, l'erreur n'était que de 5 personnes. (Peut-être que ça arrive ...)

Nombre d'infections potentielles (celles dont l'infection n'a pas été confirmée à l'hôpital)

Le nombre de personnes infectées ci-dessus correspond uniquement à ceux dont l'infection a été confirmée à l'hôpital. La simulation calcule également le nombre d'infections potentielles. Le résultat est illustré dans la figure ci-dessous. Orange: personnes confirmées infectées à l'hôpital (cumulatif) Bleu marine: personnes infectées cachées (cumulatif) dont l'infection n'a pas été confirmée à l'hôpital Il y a beaucoup plus de personnes infectées cachées que de personnes dont l'infection a été confirmée à l'hôpital, environ 10 fois plus.

predict_japan2_20200303.png

Impressions

Le ministère de la Santé, du Travail et des Affaires sociales mène-t-il également une telle simulation?

Les références

https://www.medrxiv.org/content/10.1101/2020.02.21.20026070v2

2020/03/3 changement

Modification du programme

D'autres ont écrit le blog Hatena en utilisant le programme de cet article.   https://kibashiri.hatenablog.com/entry/2020/03/02/171223 Il y avait une erreur dans le programme sur son blog. C'était certainement une erreur de code dans le calcul de func_g (). Programme et résultats fixes.

Résultat de la prédiction

On prévoit que le nombre de personnes infectées après le 29/29 augmentera de près de 100 chaque jour. Le ministère de la Santé, du Travail et du Bien-être a annoncé un nouveau nombre de personnes infectées (cas nationaux - à l'exclusion des rapatriés sur les vols charters), je l'ai donc comparé aux résultats prévus.

Date Nombre de personnes infectées(Annoncé par le ministère de la Santé, du Travail et des Affaires sociales) Nombre de personnes infectées(Prévoir) Nombre de testeurs PCR(En un jour)
2020/2/29 215 259 130
2020/3/1 224 334 178
2020/3/2 239 428 96
2020/3/3 253 546 71

La valeur prédite est significativement différente du nombre réel de personnes infectées, et il semble que les performances prévues après le 29/29 n'étaient pas bonnes. J'ai essayé de prédire le nombre de personnes infectées au Japon avec les mêmes paramètres qu'en Chine, mais j'ai trouvé que la situation est différente entre le Japon et la Chine, et il y a une limite à la prédiction avec les mêmes paramètres.

Selon les médias, la capacité de test PCR du Japon était de 3800 personnes / jour, mais le nombre réel de personnes testées par jour est de 130, 178, 96 et 71, ce qui est étonnamment faible.

Recommended Posts

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 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 au niveau national de la nouvelle corona avec un modèle mathématique
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"
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 classer le nombre de décès par habitant de COVID-19 (nouveau virus corona) par pays
J'ai essayé de prédire les ventes de logiciels de jeux avec VARISTA en me référant à l'article du Codexa
J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
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
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 trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé de trouver la tendance du nombre de navires dans la baie de Tokyo à partir d'images satellites.
J'ai essayé de décrire le trafic en temps réel avec WebSocket
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai fait apprendre à RNN la vague de péché et j'ai essayé de prédire
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 résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 1
J'ai essayé de vérifier l'identification du locuteur par l'API de reconnaissance du locuteur d'Azure Cognitive Services avec Python. # 2
J'ai essayé de résumer le contenu de chaque paquet enregistré par Python pip en une seule ligne
J'ai essayé d'adapter la fonction exponentielle et la fonction logistique au nombre de patients positifs au COVID-19 à Tokyo
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é de trouver l'itinéraire optimal du pays des rêves par recuit (quantique)
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
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é l'analyse de dimension fractale par la méthode de comptage de boîtes en 3 dimensions
[Linux] J'ai essayé de vérifier la méthode de confirmation sécurisée du FQDN (CentOS7)
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 vérifier le résultat du test A / B avec le test du chi carré
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 récupérer les données de l'ordinateur portable en le démarrant sur Ubuntu
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
J'ai essayé de prédire l'année prochaine avec l'IA