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.
Le code Python de cet article a été testé à l'aide de Jupyter Lab sur une machine Windows 10 avec Anaconda installé.
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)
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
Maintenant, dessinons un graphique en Python en utilisant des données csv.
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é.
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? J'ai l'impression d'avoir convergé, mais je me demande ce qui va se passer à l'avenir. .. ..
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
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
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.
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
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.
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.
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)')
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.)
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
Â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 |
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. 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.
Et si vous le divisez en hommes et en femmes.
:boy_tone1: | :girl_tone1: |
---|---|
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.
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
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, 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
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>
Au moins pour les colonnes suivantes, tout semble vide (nan).
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
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.
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?
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.
Merci d'avoir lu jusqu'au bout.
Je continuerai de le mettre à jour pour améliorer mes compétences.
Recommended Posts