J'ai dessiné un graphique Python en utilisant des données publiques sur le nombre de nouveaux patients positifs au coronavirus (COVID-19) à Tokyo + avec un lien vers la version nationale des données de pratique

Objectif

J'ai dessiné un graphique Python en utilisant les données de nouveaux patients positifs au coronavirus (COVID-19) publiées par le gouvernement métropolitain de Tokyo.

Il est écrit avec le minimum de code nécessaire, j'espère donc qu'il sera utile pour ceux qui envisagent d'effectuer une analyse de données en utilisant Python à partir de maintenant.

Étant donné que les données publiques au format csv, mises à jour quotidiennement par le gouvernement métropolitain de Tokyo, sont directement lues, il n'est pas nécessaire de télécharger les fichiers csv un par un.

Si vous copiez le code Python suivant dans votre propre environnement d'exécution (Jupyter Notebook, etc.), vous pouvez dessiner le dernier graphique d'informations à chaque fois.

De plus, j'ai ajouté un lien vers la version nationale japonaise des données csv plus loin dans cet article, donc je pense qu'il vous sera plus facile d'acquérir des compétences si vous vous entraînez à l'utiliser.

Environnement d'exécution Python

Le code Python de cet article a été testé à l'aide de Jupyter Lab sur une machine Windows 10 avec Anaconda installé.

La source de données

données csv

Les données représentées graphiquement cette fois sont les données csv suivantes. Les résultats jusqu'à la veille sont mis à jour quotidiennement. Tokyo _ Détails de l'annonce du patient positif pour le nouveau virus Corona (format CSV)

page d'accueil

Ce qui suit est la page d'accueil avec des liens vers des données csv. Tokyo _ Détails de l'annonce du patient positif pour le nouveau virus Corona image.png

Graphisme avec Python

Maintenant, dessinons un graphique en Python en utilisant des données csv.

Tout d'abord, lisez les données

Tout d'abord, utilisez le code Python ci-dessous pour vous connecter à la page d'accueil de Tokyo, obtenir les dernières données (format csv) et les convertir en pandas DataFlame.

Le point ici est que le fichier csv n'est pas enregistré dans le dossier local, mais directement converti en pandas DataFlame (df). Cela vous évite d'avoir à ouvrir un navigateur et de télécharger la dernière version du fichier csv, qui est mis à jour quotidiennement, simplement en exécutant le code ci-dessous.

import requests
import pandas as pd
import io

#Importez le csv directement dans le dataframe pandas
url = 'https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv'
r = requests.get(url).content
df = pd.read_csv(io.StringIO(r.decode('utf-8')))
df

Lorsque les données sont chargées avec succès, le contenu de DataFrame (df) doit être affiché. image.png

Graphique de transition des personnes nouvellement infectées

Je vais dessiner un graphique en utilisant le DataFrame (df) lu ci-dessus. Premièrement, l'axe horizontal est la date et l'axe vertical est le graphique à barres du nombre de personnes infectées. Continuons à exécuter le code suivant.

((5/15 postscript)) Puisque l'ordre des données d'origine csv n'est plus dans l'ordre chronologique, j'ai ajouté une ligne de code pour trier les données dans l'ordre de publication_date près du centre du code ci-dessous.

#Matplotlib pour dessiner des graphiques.Importer pyplot et seaborn
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

#Ecrire un graphique
plt.figure(figsize=(13,7))                   #Définir la taille du graphique

sns.set(font='Yu Gothic', font_scale = 1.2)  #Spécifiez la police car les caractères japonais sont déformés

df = df.sort_values('Publié_Date')           #Publié_Dateの順番にデータを並び替える(5/15 post-scriptum)

sns.countplot(data=df, x='Publié_Date')      #Créez un graphique agrégé du nombre de personnes infectées utilisant Seaborn.

plt.title('COVID-19 Changements dans le nombre de personnes nouvellement infectées à Tokyo')
plt.xticks(rotation=90, fontsize=10)         #Étant donné que la date et l'heure du chevauchement de l'axe x, il est tourné de 90 ° et affiché.
plt.ylabel('Nombre de personnes infectées(Homme)')                   #étiquette de l'axe y'Nombre de personnes infectées'S'affiche comme

Avez-vous dessiné un graphique comme celui ci-dessous? countplot_H.png J'ai l'impression d'avoir convergé, mais je me demande ce qui va se passer à l'avenir. .. ..

Graphique du nombre de personnes infectées par jour

En passant, si vous utilisez le même graphique à barres et divisez l'axe horizontal par jour,

#Dessinez un graphique du nombre de personnes infectées par jour
sns.countplot(data=df, x="journée")            #Dessinez un graphique
plt.title('Nombre de personnes nouvellement infectées par jour à Tokyo')    #Afficher le titre du graphique
plt.ylabel('Nombre de personnes infectées(Homme)')                  #Afficher le titre sur l'axe vertical

countplot_weekday.png C'était facile à dessiner, mais l'ordre des jours est étrange.

Pour trier les jours, essayez de réécrire comme suit.

#Réorganisez l'axe horizontal du graphique et dessinez à nouveau le graphique
list_weekday = ['Mois','Feu','eau','bois','Argent','sol','journée']     #Faites une liste montrant l'ordre de l'axe horizontal
sns.countplot(data=df, x="journée",order=list_weekday)     #Dessinez un graphique
plt.title('Nombre de personnes nouvellement infectées par jour à Tokyo')    #Afficher le titre du graphique
plt.ylabel('Nombre de personnes infectées(Homme)')                  #Afficher le titre sur l'axe vertical

countplot_weekday_sort.png Il a été trié en toute sécurité par ordre du jour. Il semble que le nombre de vendredis et samedis le week-end soit élevé, et le nombre de dimanches et lundis est faible.

Graphique du nombre d'hommes et de femmes infectés

Ensuite, le rapport hommes-femmes est ...

#Dessinez un graphique du nombre de personnes infectées par sexe
sns.countplot(data=df, x="patient_sexe")      #Dessinez un graphique
plt.title('Nombre de personnes nouvellement infectées par sexe à Tokyo')    #Afficher le titre du graphique
plt.ylabel('Nombre de personnes infectées(Homme)')                 #Afficher le titre sur l'axe vertical

countplot_sex.png Comme rapporté chaque jour, il y a plus d'hommes ici, mais ... Il a été constaté que les données comprenaient des éléments "sous enquête" et "inconnus" en plus des éléments "homme" et "femme". Ces découvertes inattendues sont courantes dans l'analyse des données, Juste au cas où, agrégons les données patient_gender avec pivot_table. Il peut être agrégé à partir des données d'origine dans la ligne suivante.

#patient_Données agrégées par sexe
df.pivot_table(index='patient_sexe',aggfunc='size').sort_values(ascending=False)

Je pense que les résultats d'agrégation suivants (nombre d'éléments) apparaîtront. image.png

En d'autres termes, dans l'item patient_gender, En plus des «hommes» et des «femmes», il semble que six «inconnus» et un «sous enquête» soient mélangés.

C'est une histoire courante que des éléments inattendus sont inclus lors de l'analyse des données, donc Il est très important de se souvenir non seulement de la visualisation des graphiques, mais également des techniques d'agrégation de données et de prétraitement.

Graphique du nombre de personnes infectées par âge

Ensuite, par groupe d'âge ...

list_age = ['Moins de 10 ans','10 ans','20 ans','30 s','Quarante','Années 50','Années 60','Années 70','Années 80','Années 90','100 ans et plus','inconnue']
sns.countplot(data=df, x="patient_Âge", order=list_age)
plt.xticks(rotation=90)
plt.ylabel('Nombre de personnes infectées(Homme)') 

countplot_age.png En regardant les choses de cette façon, il semble que le nombre de personnes infectées dans la vingtaine et la trentaine soit important pour la population, sans parler de la proportion de personnes âgées dans la soixantaine et plus. (Il peut être préférable d'exprimer que le ratio de personnes dans la quarantaine et la cinquantaine est faible pour la population.)

Graphique de la population par tranche d'âge à Tokyo (référence)

A titre de référence, le graphique [^ 1] de la population de Tokyo par tranche d'âge (au 1er janvier, 2ème année de Reiwa) est présenté ci-dessous. [^ 1]: D'après les ménages et la population de Tokyo (par ville et par âge) d'après le registre de base des résidents

barplot_people.png

Âge Population totale Population masculine Population féminine
Moins de 10 ans 1,048,921 536,920 512,001
10 ans 1,029,680 526,065 503,615
20 ans 1,557,966 779,053 778,913
30 s 1,842,086 939,710 902,376
Quarante 2,177,935 1,108,561 1,069,374
Années 50 1,832,946 946,158 886,788
Années 60 1,373,395 688,654 684,741
Années 70 1,414,012 645,774 768,238
Années 80 794,805 304,309 490,496
90 ans et plus 185,849 47,609 138,240
inconnue 1 0 1

Nombre de personnes infectées par population et par groupe d'âge (total pour hommes et femmes)

Et le graphique ci-dessous compare le nombre de personnes infectées pour 100 000 personnes en divisant le nombre de personnes infectées par groupe d'âge par la population par groupe d'âge. countplot_age_ratio_all.png J'étais un peu surpris. .. .. Il semble que les personnes âgées de 90 ans et plus soient écrasantes, suivies de celles de 20, 30 et 40 à 80 ans.

Nombre de personnes infectées par population et par groupe d'âge (par sexe)

Et si vous le divisez en hommes et en femmes.

:boy_tone1: :girl_tone1:
countplot_age_ratio_male.png countplot_age_ratio_female.png

C'est aussi un résultat surprenant. Je me demandais s'il y avait beaucoup de personnes infectées dans la vingtaine, mais ce sont les femmes qui avaient tendance à avoir plus de personnes infectées entre 20 et 30 ans. Je ne connais pas la cause, mais c'est un résultat un peu inquiétant.

Carte thermique par âge et date

Et si vous regardez la carte thermique par âge et date, ...

#Publié_Date et patient_Créer un tableau croisé dynamique avec des colonnes d'âge
df_pivot = df[['Publié_Date','patient_Âge']].pivot_table(index='Publié_Date',columns='patient_Âge',aggfunc='size')

#patient_Listez chaque élément de l'âge (utilisé sur l'axe vertical de la carte de chaleur)
list_age = ['Moins de 10 ans','10 ans','20 ans','30 s','Quarante','Années 50','Années 60','Années 70','Années 80','Années 90','100 ans et plus','inconnue']

plt.figure(figsize=(6,16))                         #Définir la taille du graphique
plt.yticks(fontsize = 10)                          #Définir la taille de la police de l'axe y

sns.heatmap(df_pivot[list_age], annot = True, annot_kws={"size": 10}, linewidth = .1)    #Dessinez une carte thermique

heatmap.png Cela ressemble à ça, mais c'est comme "c'est pourquoi". .. .. (-_-;) Puisqu'il semble que d'autres informations puissent être extraites, je continuerai l'analyse petit à petit.

À propos du découpage des données

À propos, je n'ai pas du tout vérifié le contenu des données brutes (csv), mais comme les données csv ont été converties en DataFrame (df) dans le code au début, affichons à nouveau le contenu des données avec la commande suivante. Faisons le.

df

image.png Il y a 4883 lignes de données (au 12 mai 2020), mais il semble qu'il y ait beaucoup de nans qui indiquent des blancs. Pour être prudent, examinons les valeurs uniques contenues dans chaque colonne. Essayez d'exécuter le code ci-dessous.

#Trame de données contenant des données csv(df)Extrayez le nom de la colonne et la valeur unique stockée dans chaque colonne.
for i in df.columns:                                       #Répétez pour chaque colonne
    print('Nom de colonne:' + i)                                    #Imprimer le nom de la colonne
    print('Nombre de valeurs uniques:' + str(len(df[i].unique())))    #Comptez le nombre de valeurs uniques dans chaque colonne
    print('Valeur unique:' + str(df[i].unique()))             #Extraire des valeurs uniques pour chaque colonne
    print('///////////////////////////////////////////')   #Séparateur

Le résultat étant long, je l'ai plié ci-dessous et je l'ai stocké.

<détails>

Résultat de l'exécution (clic) </ summary> Nom de la colonne: Non Nombre de valeurs uniques: 4987 Valeur unique: [1 2 3 ... 10109 10110 10111] /////////////////////////////////////////// Nom de la colonne: code national du gouvernement local Nombre de valeurs uniques: 1 Valeur unique: [130001] /////////////////////////////////////////// Nom de colonne: nom de la préfecture Nombre de valeurs uniques: 1 Valeur unique: ['Tokyo'] /////////////////////////////////////////// Nom de colonne: nom de la ville Nombre de valeurs uniques: 1 Valeur unique: [nan] /////////////////////////////////////////// Nom de la colonne: Published_Date Nombre de valeurs uniques: 84 Valeur unique: ['2020-01-24' '2020-01-25' '2020-01-30' '2020-02-13' '2020-02-14' '2020-02-15' '2020-02-16' '2020-02-18' '2020-02-19' '2020-02-21' '2020-02-22' '2020-02-24' '2020-02-26' '2020-02-27' '2020-02-29' '2020-03-01' '2020-03-03' '2020-03-04' '2020-03-05' '2020-03-06' '2020-03-07' '2020-03-10' '2020-03-11' '2020-03-12' '2020-03-13' '2020-03-14' '2020-03-15' '2020-03-17' '2020-03-18' '2020-03-19' '2020-03-20' '2020-03-21' '2020-03-22' '2020-03-23' '2020-03-24' '2020-03-25' '2020-03-26' '2020-03-27' '2020-03-28' '2020-03-29' '2020-03-30' '2020-03-31' '2020-04-01' '2020-04-02' '2020-04-03' '2020-04-04' '2020-04-05' '2020-04-06' '2020-04-07' '2020-04-08' '2020-04-09' '2020-04-10' '2020-04-11' '2020-04-12' '2020-04-13' '2020-04-14' '2020-04-15' '2020-04-16' '2020-04-17' '2020-04-18' '2020-04-19' '2020-04-20' '2020-04-21' '2020-04-22' '2020-04-23' '2020-04-24' '2020-04-25' '2020-04-26' '2020-04-27' '2020-04-28' '2020-04-29' '2020-04-30' '2020-05-01' '2020-05-02' '2020-05-03' '2020-05-04' '2020-05-05' '2020-05-06' '2020-05-07' '2020-05-08' '2020-05-09' '2020-05-10' '2020-05-11' '2020-05-12'] /////////////////////////////////////////// Nom de la colonne: Jour Nombre de valeurs uniques: 7 Valeurs uniques: ['Fri', 'Sat', 'Thu', 'Sun', 'Tue', 'Wed', 'Mon'] /////////////////////////////////////////// Nom de la colonne: Onset_date Nombre de valeurs uniques: 1 Valeur unique: [nan] /////////////////////////////////////////// Nom de la colonne: Patient_Residence Nombre de valeurs uniques: 7 Valeur unique: ['Wuhan City, Hubei Province', 'Changsha City, Hunan Province', 'Inside Tokyo', 'Outside of Tokyo' nan'Under Investigation '' '-'] /////////////////////////////////////////// Nom de colonne: Patient_age Nombre de valeurs uniques: 13 Valeurs uniques: ['40s' '30s' '70s' '50s' '80s' '60s' '20s''under 10s' '90s''teens' '100s and over' 'Inconnue''-'] /////////////////////////////////////////// Nom de colonne: Patient_Gender Nombre de valeurs uniques: 4 Valeur unique: ['Men''Women' 'Under investigation''Unknown'] /////////////////////////////////////////// Nom de colonne: Patient_attribute Nombre de valeurs uniques: 1 Valeur unique: [nan] /////////////////////////////////////////// Nom de la colonne: Patient_Status Nombre de valeurs uniques: 1 Valeur unique: [nan] /////////////////////////////////////////// Nom de la colonne: Patient_Symptoms Nombre de valeurs uniques: 1 Valeur unique: [nan] /////////////////////////////////////////// Nom de la colonne: Patient_ Indicateur d'historique de voyage Nombre de valeurs uniques: 1 Valeur unique: [nan] /////////////////////////////////////////// Nom de la colonne: Remarques Nombre de valeurs uniques: 1 Valeur unique: [nan] /////////////////////////////////////////// Nom de la colonne: indicateur déchargé Nombre de valeurs uniques: 2 Valeur unique: [1. nan] ///////////////////////////////////////////

Au moins pour les colonnes suivantes, tout semble vide (nan).

  • "Nom de Ville"
  • "Onset_date"
  • "Patient_attribute"
  • "État_patient"
  • "Patient_symptom"
  • "Indicateur d'historique Patient_travel"
  • "Remarques"

De plus, le «code national des collectivités locales» et le «nom de la préfecture» ont tous la même valeur, ce qui n'a aucun sens dans l'analyse des données. Il est souhaitable de supprimer ces données inutiles des données à l'avance. Créez un nouveau bloc de données (df_extract) en extrayant uniquement les éléments nécessaires. Exécutez le code suivant.

#Couper les colonnes inutiles (extraire uniquement les colonnes nécessaires)
df_extract = df[['No','Publié_Date','journée','patient_résidence','patient_Âge','patient_sexe','Drapeau déchargé']]
df_extract = df_extract.set_index('No')     #Définissez la colonne «Non» à indexer.
df_extract

image.png C'est assez rafraîchissant. Je pense que le travail de rognage, qui évalue correctement et exclut les données inutiles lors de l'analyse des données, est également une compétence très importante.

Données de pratique

Cette fois, c'était des données de Tokyo, Jag Japan Co., Ltd. a publié la version nationale des données csv. https://dl.dropboxusercontent.com/s/6mztoeb6xf78g5w/COVID-19.csv Il y a beaucoup de données et je pense que c'est parfait pour pratiquer l'analyse de données en utilisant Python. La procédure est presque la même, alors si vous êtes intéressé, pourquoi ne pas l'essayer vous-même?

prime

En fait, vous pouvez faire presque la même chose avec Excel (et relativement facilement)

Vous trouverez ci-dessous un graphique croisé dynamique dessiné dans Excel en utilisant les mêmes données. En fait, vous pouvez facilement faire presque la même chose avec Excel, y compris la carte thermique présentée dans cet article. J'adore aussi Python, et j'ai beaucoup de sentiments à l'idée de faire quoi que ce soit avec Python, mais quand je pense à quoi sert l'analyse de données et pour qui l'analyse de données, ce que Excel peut faire, c'est ce qu'Excel peut faire, ce qu'Excel peut faire. Chaque jour, je pense que le style de base ne doit pas être fait en Python.

Graphique de transition des personnes nouvellement infectées dessiné dans Excel

image.png

Carte thermique dessinée dans Excel (Modoki)

Merci d'avoir lu jusqu'au bout.

Je continuerai de le mettre à jour pour améliorer mes compétences.

Recommended Posts

J'ai dessiné un graphique Python en utilisant des données publiques sur le nombre de nouveaux patients positifs au coronavirus (COVID-19) à Tokyo + avec un lien vers la version nationale des données de pratique
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo
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'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Publié le nombre de nouveaux positifs corona à Tokyo sur Slack (déployés sur Heroku)
J'ai essayé de classer le nombre de décès par habitant de COVID-19 (nouveau virus corona) par pays
Comment connaître le nombre de GPU de python ~ Remarques sur l'utilisation du multitraitement avec pytorch ~
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
[Homologie] Comptez le nombre de trous dans les données avec Python
[Python] Introduction à la création de graphiques à l'aide de données de virus corona [Pour les débutants]
J'ai essayé d'utiliser "Asciichart Py" qui peut dessiner un beau graphique sur la console avec Python.
J'ai essayé d'utiliser des données PDF de soins médicaux en ligne basés sur la propagation d'une nouvelle infection à coronavirus
Obtenez le nombre de lecteurs d'articles sur Mendeley en Python
Comment exécuter le code pratique du livre "Making Profitable AI with Python" sur Google Colaboratory
J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins
[Version terminée] Essayez de connaître le nombre d'habitants de la ville à partir de la liste d'adresses avec Python
Utilisons Python pour représenter la fréquence des données binaires contenues dans une trame de données dans un graphique à barres unique.
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
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
Je voulais connaître le nombre de lignes dans plusieurs fichiers et j'ai essayé de l'obtenir avec une commande
J'ai installé Pygame avec Python 3.5.1 dans l'environnement de pyenv sur OS X
Lien vers les points de données du graphe créé par jupyterlab & matplotlib
J'ai recherché les compétences nécessaires pour devenir ingénieur web avec Python
Alignez le nombre d'échantillons entre les classes de données pour l'apprentissage automatique avec Python
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
Comment obtenir une liste de fichiers dans le même répertoire avec python
J'ai créé une fonction pour récupérer les données de la colonne de base de données par colonne en utilisant sql avec sqlite3 de python [sqlite3, sql, pandas]
Une histoire dont je voulais afficher le résultat de la division (%) sur HTML avec une application utilisant django [Débutant apprend python avec un livre de référence dans une main]
[Exemple d'amélioration de Python] Apprentissage des bases de Python sur un site gratuit en 2 semaines
Python pratique 100 coups J'ai essayé de visualiser l'arbre de décision du chapitre 5 en utilisant graphviz
Consolider un grand nombre de fichiers CSV dans des dossiers avec python (données sans en-tête)
Un moyen simple de remplir le début de 0 en fonction du nombre de chiffres dans le nombre [Python]
J'ai créé un graphique à barres empilées avec matplotlib de Python et ajouté une étiquette de données
Le concept de référence en Python s'est effondré un instant, j'ai donc expérimenté un peu.
Je souhaite prendre une capture d'écran du site sur Docker en utilisant n'importe quelle police
J'ai essayé de visualiser les caractéristiques des nouvelles informations sur les personnes infectées par le virus corona avec wordcloud
[First data science ⑥] J'ai essayé de visualiser le prix du marché des restaurants à Tokyo
Trouvez une ligne directrice pour le nombre de processus / threads à définir sur le serveur d'applications
Comment compter le nombre d'occurrences de chaque élément de la liste en Python avec poids
J'ai aimé écrire avec un seul trait sur la marche aléatoire d'auto-évitement ~ Utiliser python en référence à la physique computationnelle I (Asakura Shoten) ~
Depuis que le stock a plongé en raison de l'influence du nouveau virus corona, j'ai essayé de visualiser les performances de ma fiducie d'investissement avec Python.
J'ai créé un programme en Python qui change les données de 1 minute de FX en une heure arbitraire (1 heure, etc.)
J'ai essayé de créer un Discord Bot sur Docker qui signale le nombre de personnes infectées par corona à Tokyo à un moment spécifié
[Python] Je veux être une personne gourmande [Approche basée sur les données] Choisir un magasin pour les fêtes de fin d'année et du Nouvel An
J'ai essayé de représenter graphiquement les packages installés en Python
Comment obtenir le nombre de chiffres en Python
Je veux travailler avec un robot en python.
Utilisez le hachage pour alléger le jugement de collision d'environ 1000 balles en Python (lié au nouveau virus corona)
Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python