[PYTHON] Une histoire qui a vérifié si le nombre de coronas augmente vraiment rapidement chez les jeunes

introduction

La source de données

Vous pouvez déposer les données ici. https://catalog.data.metro.tokyo.lg.jp/dataset/t000010d0000000068/resource/c2d997db-1450-43fa-8037-ebb11ec28d4c Bien qu'il soit au format csv et qu'il y ait de nombreuses colonnes qui ne contiennent rien, je pense que les données sont propres et faciles à manipuler. Au moment de la rédaction de cet article, il semble y avoir des données allant jusqu'à 7/9.

environnement

Cette fois, j'ai créé un environnement d'analyse sur Jupyter mis en place avec Docker. C'est tout à fait approprié, mais veuillez noter que je ne fais que réutiliser ce que j'ai utilisé ailleurs (je n'en ai pas besoin autant).

FROM python:3.8.2
USER root

EXPOSE 9999

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN mkdir /code
WORKDIR /code

RUN apt-get update && apt-get -y install locales default-mysql-client && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
ADD ./requirements_python.txt /code
RUN pip install --upgrade pip
RUN pip install -r /code/requirements_python.txt
WORKDIR /root
RUN jupyter notebook --generate-config
RUN echo c.NotebookApp.port = 9999 >> ~/.jupyter/jupyter_notebook_config.py
RUN echo c.NotebookApp.token = \'jupyter\' >> ~/.jupyter/jupyter_notebook_config.py
CMD jupyter lab --no-browser --ip=0.0.0.0 --allow-root

requirement_python.txt


glob2
json5
jupyterlab
numpy
pandas
pyOpenSSL
scikit-learn
scipy
setuptools
tqdm
urllib3
matplotlib
xlrd

la mise en oeuvre

De là, nous décrirons l'implémentation.

1. importer et importer

Commencez par charger les packages et fichiers requis. Cette fois, je n'utilise que matplotlib et pandas. Concernant la date de publication, changez-la en type datetime à ce moment.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl

%matplotlib inline
df_patient = pd.read_csv('./data/130001_tokyo_covid19_patients.csv')
df_patient['Publié_Date'] = pd.to_datetime(df_patient['Publié_Date'])
df_patient.head()

2. Récupération et traitement des données

Pour ce traitement de données, nous le ferons comme suit.

  1. Comptez le nombre de personnes nouvellement infectées par âge
  2. Comptez sur une moyenne mobile de 7 jours pour éliminer des facteurs tels que le nombre de tests par jour.

2-1 Comptez le nombre de personnes nouvellement infectées par groupe d'âge

Ce n'est pas si difficile avec Group by. Aussi, ne laissez que les colonnes nécessaires à ce moment.

df_patient_day = df_patient.groupby(['Publié_Date','patient_Âge']).count().reset_index()[['Publié_Date','patient_Âge','No']]
df_patient_day

De plus, s'il y a du japonais dans la description de l'âge, les caractères seront déformés dans la partie de matplotlib (il est difficile à gérer en réutilisant l'environnement comme décrit ci-dessus), remplacez-le comme suit.

genes_dict = {'Moins de 10 ans':'under 10',\
         '10 ans': '10', \
         '20 ans': '20', \
         '30 s': '30', \
         'Quarante': '40', \
         'Années 50': '50', \
         'Années 60': '60', \
         'Années 70': '70', \
         'Années 80': '80', \
         'Années 90': '90', \
         '100 ans et plus': 'over 100', \
         "'-": '-',
         'inconnue': 'unknown'
        }

df_patient_day['patient_Âge'] = [genes_dict[x] for x in df_patient_day['patient_Âge'].values.tolist()]
df_patient_day

Il y a un problème dans le cas ci-dessus, et si le nombre de personnes nouvellement infectées n'existe pas ce jour-là et cet âge, il n'y a pas de données, et ce sera un problème lors de la prise d'une moyenne mobile plus tard, donc ici ces données sont dans la fourchette de l'âge ci-dessus × Créez un produit direct de toute la plage de dates et combinez-le avec le DataFrame ci-dessus (s'il vous plaît laissez-moi savoir si vous connaissez un meilleur moyen ici!).

genes = ['under 10',\
         '10', \
         '20', \
         '30', \
         '40', \
         '50', \
         '60', \
         '70', \
         '80', \
         '90', \
         'over 100', \
         '-',
         'unknown'
        ]
days = pd.date_range(start=df_patient['Publié_Date'].min(), end=df_patient['Publié_Date'].max(), freq='D')
data = [[x, y] for x in days for y in genes]

df_data = pd.DataFrame(data, columns=['Publié_Date', 'patient_Âge'])
df_data = pd.merge(df_data, df_patient_day, on=['Publié_Date', 'patient_Âge'], how='left').fillna(0)
df_data = df_data.rename(columns={'No':'Nombre de personnes'})
df_data

2-2 Faites une moyenne mobile pour chaque groupe d'âge

Prenez une moyenne mobile pour chaque groupe d'âge. Vous pouvez facilement obtenir une moyenne mobile avec la fonction de pandas. Pour une moyenne mobile sur 7 jours, faites simplement rouler (7). Si vous voulez prendre la moyenne, faites rouler (7) .mean (). Et puisque les 6 premiers jours seront nan, supprimez-le avec dropna (). Cette fois, pour une implémentation ultérieure, je vais en faire un DataFrame pour chaque âge et le stocker dans le dictionnaire. C'est tout ce qu'on peut en dire!

result_diff = {}
for x in genes:
    df = df_data[df_data['patient_Âge'] == x]
    df = pd.Series(df['Nombre de personnes'].values.tolist(), index=df['Publié_Date'].values)
    result_diff[x] = df.rolling(7).mean().dropna()

3. Visualisez

Visualisez enfin.

fig, axe = plt.subplots()
for x in genes:
    df_diff = result_diff[x]
    axe.plot(df_diff.index, df_diff.values, label=x)
    
axe.legend()
axe.set_ylim([0,65])

résultat

Enfin, j'afficherai le résultat. スクリーンショット 2020-07-12 15.05.14.png

Des années 20 aux années 50, il a été confirmé que les âges ont changé par ordre de plus jeune âge. Même ainsi, comment augmenter le nombre de personnes dans la vingtaine est incroyable. L'annonce de Tokyo n'était pas un mensonge.

Résumé

Je ne veux pas dire quels sont les facteurs ici, mais vous pouvez vérifier rapidement le contenu du rapport avec des données publiques comme celle-ci, alors pourquoi ne pas l'essayer également comme pratique? Il y a encore beaucoup de choses qui peuvent être étudiées en comparant cela avec la distribution réelle de la population, et je pense que c'est un bon matériel pédagogique pour pratiquer réellement le traitement des données.

Recommended Posts

Une histoire qui a vérifié si le nombre de coronas augmente vraiment rapidement chez les jeunes
Créez un BOT qui affiche le nombre de personnes infectées dans le nouveau Corona
Une histoire qui réduit l'effort de fonctionnement / maintenance
[Python] Un programme qui compte le nombre de vallées
Le problème Zip 4 Gbyte est une histoire du passé
Une histoire qui a analysé la livraison de Nico Nama.
Un serveur qui renvoie le nombre de personnes devant la caméra avec bottle.py et OpenCV
Une petite histoire addictive avec les permissions du répertoire spécifié par expdp (pour les débutants)
L'histoire de la création d'un site qui répertorie les dates de sortie des livres
Un programme qui détermine si un nombre entré en Python est un nombre premier
L'histoire de la création d'un module qui ignore le courrier avec python
Langage de programmation dont les jeunes auront besoin à l'avenir
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
L'histoire de l'exportation d'un programme
Une histoire sur la création d'un programme qui augmentera le nombre d'abonnés Instagram de 0 à 700 en une semaine
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
[Python] Un programme qui calcule le nombre de chaussettes jumelées
L'histoire du développement d'une application WEB qui génère automatiquement des copies de capture [MeCab]
L'histoire de la création d'un package qui accélère le fonctionnement de Juman (Juman ++) & KNP
J'ai essayé de confirmer si l'estimation impartiale de l'écart-type était vraiment impartiale en "jetant des pièces 10 000 fois"
[python] [meta] Le type de python est-il un type?
L'histoire du traitement A du blackjack (python)
L'histoire de l'adresse IPv6 que je souhaite conserver au minimum
L'histoire de la fabrication d'une boîte qui interconnecte la mémoire AL de Pepper et MQTT
L'histoire de la création d'une application Web qui enregistre des lectures approfondies avec Django
L'histoire de Django créant une bibliothèque qui pourrait être un peu plus utile
[Python] Un programme qui calcule le nombre de mises à jour des enregistrements les plus élevés et les plus faibles
Y a-t-il une contradiction entre le parti qui protège le peuple de la NHK et le parti qui protège la NHK du peuple?
L'histoire de la création d'un Line Bot qui nous raconte le calendrier de la programmation du concours
L'apprentissage en profondeur! L'histoire des données elles-mêmes qui sont lues lorsqu'elles ne suivent pas après la reconnaissance des nombres manuscrits