[PYTHON] Visualisez les données d'infection corona à Tokyo avec matplotlib

introduction

Cette fois, je vais essayer de le visualiser avec matplotlib sur la base des données des personnes infectées par le virus corona à Tokyo.

Les données sur le nombre de personnes infectées par le virus corona de Tokyo sont ["Détails de l'annonce de nouveaux patients positifs au virus corona à Tokyo"](https://catalog.data.metro.tokyo.lg.jp/dataset/t000010d0000000068/resource/c2d997db-1450 -43fa-8037-ebb11ec28d4c) peut être téléchargé au format csv.

Import de la bibliothèque utilisée

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import os
import numpy as np
from matplotlib import dates as mdates
from matplotlib.ticker import MultipleLocator
from matplotlib.dates import DateFormatter
import seaborn as sns

Confirmation des données

Commencez par vérifier les données.


df = pd.read_csv('130001_tokyo_covid19_patients.csv')
print('------column-------')
print(df.columns.values)
print('----head values----')
print(df.head().values)
print('----tail values----')
print(df.tail().values)

#production

------column-------
['No' 'Code national des collectivités locales' 'Nom des préfectures' 'Nom de Ville' 'Publié_Date' 'journée' 'Début_Date' 'patient_résidence'
 'patient_Âge' 'patient_sexe' 'patient_attribut' 'patient_Statut' 'patient_Symptômes' 'patient_Drapeau d'histoire de voyage' 'Remarques' 'Drapeau déchargé']

----head values----
[[1 130001 'Tokyo' nan '2020-01-24' 'Argent' nan 'Ville de Wuhan, province du Hubei' 'Quarante' 'Masculin' nan nan nan
  nan nan 1.0]
 [2 130001 'Tokyo' nan '2020-01-25' 'sol' nan 'Ville de Wuhan, province du Hubei' '30 s' 'Femelle' nan nan nan
  nan nan 1.0]
 [3 130001 'Tokyo' nan '2020-01-30' 'bois' nan 'Ville de Changsha, province du Hunan' '30 s' 'Femelle' nan nan nan
  nan nan 1.0]
 [4 130001 'Tokyo' nan '2020-02-13' 'bois' nan 'À Tokyo' 'Années 70' 'Masculin' nan nan nan nan
  nan 1.0]
 [5 130001 'Tokyo' nan '2020-02-14' 'Argent' nan 'À Tokyo' 'Années 50' 'Femelle' nan nan nan nan
  nan 1.0]]

----tail values----
[[26064 130001 'Tokyo' nan '2020-10-02' 'Argent' nan nan 'Années 50' 'Masculin' nan nan nan
  nan nan nan]
 [26065 130001 'Tokyo' nan '2020-10-02' 'Argent' nan nan 'Années 50' 'Masculin' nan nan nan
  nan nan nan]
 [26066 130001 'Tokyo' nan '2020-10-02' 'Argent' nan nan 'Années 70' 'Femelle' nan nan nan
  nan nan nan]
 [26067 130001 'Tokyo' nan '2020-10-02' 'Argent' nan nan 'Années 50' 'Masculin' nan nan nan
  nan nan nan]
 [26068 130001 'Tokyo' nan '2020-10-02' 'Argent' nan nan 'Années 60' 'Masculin' nan nan nan
  nan nan nan]]

Il semble que la date, l'âge, le sexe, etc. soient résumés pour chaque ligne. Il semble qu'il y ait une personne par ligne, donc je vais la traiter pour qu'elle puisse être facilement agrégée plus tard. La partie date est convertie en date / heure.

df['qty'] = 1
df['Publié_Date'] = pd.to_datetime(df['Publié_Date'])

Créer un graphique de transition

Tracez le nombre de personnes infectées par date.


def plot_bar(df):
    df_pivot = pd.pivot_table(df, index='Publié_Date', values='qty', aggfunc=np.sum)
    labels = df_pivot.index.values
    vals = [i[0] for i in df_pivot.values]

    #Génération de figures
    fig, ax = plt.subplots(figsize=(10, 6))
    ax.bar(labels, height=vals, linewidth=1, color='orangered', alpha=0.8)
    plt.show()

bar_before.png

Cela semble un peu démodé à ce rythme, alors je vais le transformer en un bon sentiment.

    #Changer la couleur des tiques
    ax.tick_params(axis='y', colors='gray')
    ax.tick_params(axis='x', colors='dimgray')

    #Afficher la grille
    ax.grid(axis='y')

    #Définir ylabel et changer la couleur
    ax.set(ylabel='Nombre de personnes infectées', ylim=(0, 500))
    ax.yaxis.label.set_color('gray')

    #Effacer les lignes de graduation de l'axe y et de l'axe x
    ax.tick_params(bottom=False, left=False)

    #Affichage par mois
    ax.xaxis.set_major_locator(mdates.MonthLocator())
    #Notation d'étiquette x corrigée
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))

    #Suppression des frontières
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.spines['left'].set_visible(False)

    #définir le titre
    ax.set_title('tokyo covid19 patients-bar', color='gray')

    plt.tight_layout()
    plt.show()

bar_after.png

Comme mentionné dans les nouvelles, vous pouvez voir qu'il s'est calmé une fois depuis mai et qu'il s'est à nouveau excité.

Tracez le nombre de personnes infectées par jour

Tracons le nombre de personnes infectées par jour.

def plot_barh(df):
    df_pivot = pd.pivot_table(df, index='journée', values='qty', aggfunc=np.sum)
    week_days = df_pivot.index.values
    #Lister le nombre de personnes infectées par jour
    vals = [val[0] for val in df_pivot.values]
    #Génération de graphes
    fig, ax = plt.subplots(figsize=(10, 6))
    ax.barh(week_days, vals, color='tomato')
    plt.show()

barh_before.png

J'ai pu le tracer en toute sécurité, mais la disposition des jours est différente, je vais donc jouer avec l'apparence de cela également.


def plot_barh(df):
    df_pivot = pd.pivot_table(df, index='journée', values='qty', aggfunc=np.sum)
    #Trier les jours
    df_pivot = df_pivot.reindex(index=['Lune', 'Feu', 'eau', 'bois', 'Argent', 'sol', 'journée'])

    week_days = df_pivot.index.values
    
    #Lister le nombre de personnes infectées par jour
    vals = [val[0] for val in df_pivot.values]

    #Génération de graphes
    fig, ax = plt.subplots(figsize=(10, 6))
    ax.barh(week_days, vals, color='tomato')

    #changer la couleur de l'étiquette y
    ax.tick_params(axis='y', colors='dimgray')

    #Le dimanche sera au top, alors triez
    ax.invert_yaxis()

    #Effacer la ligne de graduation
    ax.tick_params(bottom=False, left=False)

    #Effacer la bordure
    ax.spines['bottom'].set_visible(False)
    ax.spines['top'].set_visible(False)
    ax.spines['left'].set_visible(False)
    ax.spines['right'].set_visible(False)

    #x Retirer l'étiquette
    ax.set_xticklabels([])

    #Afficher un nombre à droite de la barre
    vmax = np.array(vals).max()
    for i, val in enumerate(vals):
        ax.text(val + vmax * 0.02, i, f'{val:,}', fontsize='x-large', va='center', color='darkred')

    #Donnez un titre
    ax.set_title('tokyo covid19 patients-barh(day of week count)', color='dimgray')

    plt.show()

barh_after.png

J'ai pu tracer proprement et en toute sécurité. Je pense qu'il y a beaucoup d'éditeurs du jeudi au samedi, mais peut-être que l'objectif est de freiner les gens qui sortent le week-end. Eh bien, je pense que le nombre de personnes subissant des tests PCR est biaisé par jour.

Graphique à barres empilées

Tracez le nombre de personnes infectées par groupe d'âge et sexe. Étant donné que les colonnes de sexe et d'âge contiennent des données telles que "Inconnu", "-", "-", etc., nettoyez-les à l'avance.

def plot_stacked_bar(df):
    #nettoyage
    #Unifié d'homme en homme
    df = df.replace({'patient_sexe': {'Homme': 'Homme性'}})

    #Supprimer les enregistrements de sexe et d'âge inconnus
    df = df[df['patient_sexe'] != 'inconnue']
    df = df[df['patient_sexe'] != '―']
    df = df[df['patient_sexe'] != '-']
    df = df[df['patient_Âge'] != '-']
    df = df[df['patient_Âge'] != 'inconnue']

    #Agrégé par sexe et âge
    df_pivot = pd.pivot_table(df, index='patient_Âge', columns='patient_sexe', values='qty', aggfunc=np.sum)

    #Réorganise
    df_pivot = df_pivot.reindex(index=['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'])

    #Obtenez le numéro de chaque homme et femme avec une trancheuse
    men_qty = df_pivot.values[:, 0]
    women_qty = df_pivot.values[:, 1]

    labels = ['Masculin', 'Femelle']
    ages = df_pivot.index.values

    # figure,génération de hache
    fig, ax = plt.subplots(figsize=(10, 6))

    #Graphique à barres empilées
    width = 0.6
    ax.bar(ages, men_qty, width, label=labels[0], color='skyblue')
    ax.bar(ages, women_qty, width, label=labels[1], color='pink', bottom=men_qty)
  
  plt.show() 

stacked_bar_before.png

Cela sera également modifié.

 #Effacer la ligne de graduation
    ax.tick_params(bottom=False, left=False)

    #Effacer la frontière
    ax.spines['top'].set_visible(False)
    ax.spines['left'].set_visible(False)
    ax.spines['right'].set_visible(False)

    # y,Définir xlabel et changer la couleur
    ax.set(ylabel='Nombre de personnes infectées')
    ax.yaxis.label.set_color('gray')
    ax.set(xlabel='Âge')
    ax.xaxis.label.set_color('gray')

    #Changer la couleur de l'étiquette y / x
    ax.tick_params(axis='y', colors='dimgray')
    ax.tick_params(axis='x', colors='dimgray')

    #Afficher la légende
    ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1.0,), borderaxespad=0, frameon=False)

    #Affichage de la grille
    ax.grid(axis='y')

    #Changer la largeur d'affichage de l'axe y tous les 2000
    ax.yaxis.set_major_locator(MultipleLocator(2000))

    #Mettez une virgule dans le nombre
    ax.yaxis.set_major_formatter('{x:,.0f}')

    #Donnez un titre
    ax.set_title('tokyo covid19 patients-stacked bar(age,sex,count)', color='dimgray')

    plt.show()

stacked_bar_after.png

Je crains qu'il y ait une grande différence entre les adolescents et les 20 ans. Étant donné que ma condition physique ne se détériore pas, je n'ai peut-être pas été examinée en premier lieu. De plus, comme il y a beaucoup d'élèves, cela peut indiquer que l'épidémie d'infection peut être évitée en fermant l'école.

Graphique de la carte thermique

Créez des cartes thermiques par tranche d'âge et par mois. C'est facile à décrire, donc je vais le tracer en utilisant seaborn.

def plot_heatmap(df):
    df = df.set_index('Publié_Date')
    df['month'] = df.index.month
    months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct']

    #Supprimer les enregistrements de sexe et d'âge inconnus
    df = df[df['patient_sexe'] != 'inconnue']
    df = df[df['patient_sexe'] != '―']
    df = df[df['patient_sexe'] != '-']
    df = df[df['patient_Âge'] != '-']
    df = df[df['patient_Âge'] != 'inconnue']

    #Agrégé par mois et par âge
    df_pivot = pd.pivot_table(df, index='patient_Âge', columns='month', values='qty', aggfunc=np.sum)

    #Réorganise
    df_pivot = df_pivot.reindex(index=['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'])

    fig, ax = plt.subplots(figsize=(10, 6))

    #Terrain avec seaborn
    ax = sns.heatmap(df_pivot, annot=True, fmt="1.0f", cmap='YlGnBu')

    ax.tick_params(bottom=False, left=False)
    ax.set_xticklabels(months)
    ax.set_title('tokyo covid19 heatmap(month,age count)', color='gray')
    #Changer la couleur de l'étiquette de graduation y / x
    ax.tick_params(axis='y', colors='dimgray')
    ax.tick_params(axis='x', colors='dimgray')
    # y,x Effacer l'étiquette
    ax.set(ylabel='', xlabel='')

    plt.show()

heatmap.png

en conclusion

Si vous visualisez les données, vous pourrez lire les tendances. Les graphiques par défaut dans matplotlib semblent gênants, je voudrais donc continuer à étudier les techniques de création de graphiques propres.

Recommended Posts

Visualisez les données d'infection corona à Tokyo avec matplotlib
Graphique des données Excel avec matplotlib (1)
Graphique des données Excel avec matplotlib (2)
Essayez de gratter les données COVID-19 Tokyo avec Python
Traçage de données polyvalent avec pandas + matplotlib
Heatmap avec dendrogramme en Python + matplotlib
Implémentez "Data Visualization Design # 2" avec matplotlib
Obtenez des données supplémentaires vers LDAP avec python
Essayez de travailler avec des données binaires en Python
Séparation de la conception et des données dans matplotlib
Tracer CSV de données de séries temporelles avec une valeur unixtime en Python (matplotlib)
Écraser les données dans RDS avec AWS Glue
Gérez les structures de données 3D avec les pandas
[Calcul scientifique / technique par Python] Tracer, visualiser, matplotlib des données 2D avec barre d'erreur
Lire les données csv Python avec Pandas ⇒ Graphique avec Matplotlib
Supprimer des données dans un modèle avec Redis Cluster
Visualisons l'état de l'infection par le virus corona avec Plotly [pour les débutants]
Visualisez les données de la carte Yugioh avec Python --Yugiou Data Science 1. EDA Edition
Lire les données de la table dans un fichier PDF avec Python
Implémentez "Data Visualization Design # 3" avec pandas et matplotlib
Visualisez de manière interactive les données avec Treasure Data, Pandas et Jupyter.
Folium: Visualisez les données sur une carte avec Python
Visualisez le comportement de l'algorithme de tri avec matplotlib
Visualiser grib2 sur une carte avec python (matplotlib)
J'ai créé un graphique à barres empilées avec matplotlib de Python et ajouté une étiquette de données
Animation avec matplotlib
[First data science ⑥] J'ai essayé de visualiser le prix du marché des restaurants à Tokyo
Japonais avec matplotlib
Animation avec matplotlib
histogramme avec matplotlib
Faire une animation avec matplotlib
Comment appliquer des marqueurs uniquement à des données spécifiques avec matplotlib
Entraînez les données MNIST avec PyTorch en utilisant un réseau neuronal
Mettez les données AWS dans Google Spreadsheet avec boto + gspread
Visualisez les données d'itinéraires ferroviaires sous forme de graphique avec Cytoscape 2
Environ 200 données de latitude et de longitude pour les hôpitaux de Tokyo
Challenge classification des images par TensorFlow2 + Keras 3 ~ Visualiser les données MNIST ~
Visualisez les mots-clés dans les documents avec TF-IDF et Word Cloud
Visualisez les fluctuations des nombres sur les sites Web avec Datadog
Trier les données de publication dans l'ordre inverse avec ListView de Django