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 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
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'])
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()
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()
Comme mentionné dans les nouvelles, vous pouvez voir qu'il s'est calmé une fois depuis mai et qu'il s'est à nouveau excité.
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()
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()
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.
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()
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()
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.
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()
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