(10 min de lecture)

Dans mon précédent article, j’ai effectué une analyses de données sur le Covid-19 en vous expliquant toutes les étapes de cette analyse avec Python, NumPy et Pandas. Cet article en est la suite, et cette fois-ci, vous allez apprendre à créer de jolis visuels pour effectuer la visualisation de données du Covid-19. Vous trouverez tous le code et résultats sur ce notebook.

Si vous n’avez pas lu l’article précédent, veuillez le faire maintenant car certains des DataFrames utilisés dans cet article sont issus de cet article.

Techniques pour effectuer une visualisation de données du Covid-19

Afficher des diagrammes à barres pour les cas confirmés et les décès pour chaque pays

Le premier visuel que vous voulez tracer est une série de diagrammes à barres représentant le nombre total de cas confirmés et de décès pour chaque pays :

import matplotlib.pyplot as plt

plt.style.use('ggplot')
plt.rcParams["figure.figsize"] = (12,7)

for country, df_country in df_daily.groupby(level=1):    
    dates = list(df_country.index.get_level_values('Date'))
    confirmed = list(df_country.Confirmed)
    deaths = list(df_country.Deaths)

    plt.bar(dates, confirmed, color='lightblue', 
        label="Nombre total de cas confirmés")
    plt.bar(dates, deaths, color='red',
        label="Nombre total de décès signalés")
    plt.xlabel("Dates")
    plt.ylabel("Nombre de personnes")
    plt.title(country)
    plt.legend()
    plt.show()

Cela retournera des diagrammes à barres pour les différents pays.

Voici le premier :

Comme vous pouvez le voir, les barres bleu clair représentent le nombre de cas confirmés pour chaque jour, tandis que les barres rouges représentent le nombre de décès. Voici le graphique pour les Etas-Unis :

Notez que le nombre de cas pour chaque jour est cumulatif. Vous constaterez donc toujours que la tendance est à la hausse (au mieux, elle est égale s’il n’y a pas de nouveaux cas).

Pour les pays où le nombre de décès est faible par rapport aux cas confirmés, vous verrez littéralement des barres rouges très minuscules (si tant est qu’il y en ait). Singapour est l’un de ces cas :

La France, en revanche, a un taux de mortalité relativement élevé :

Créer des diagrammes circulaires

Le prochain visuel que je veux créer est un diagramme circulaire, aussi appelé camembert. Pour ce faire, je définis une fonction appelée plot_pie(df, column, title). Elle prend en entrée trois arguments : un DataFrame, le nom de la colonne à utiliser dans le DataFrame et le titre du camembert :

def plot_pie(df, column, title):
    labels = list(df.index)
    sizes = list(df[column])
    explode = [0 for n in range(10)]
    
    with plt.style.context(
        { "axes.prop_cycle" : plt.cycler("color", 
        plt.cm.tab20c.colors)}):
        fig1, ax1 = plt.subplots()
        ax1.pie(sizes, 
                explode=explode, 
                labels=labels, 
                autopct='%1.2f%%', 
                shadow=False, 
                startangle=0)
        ax1.axis('equal')  # Un rapport d'aspect égal garantit que le diagramme 
                           # sera dessiné en cercle.
        plt.legend()
        plt.title(title)
    
    centre_circle = plt.Circle((0,0),0.70,fc='white')
    fig = plt.gcf()
    fig.gca().add_artist(centre_circle)
    plt.show()

Afficher la répartition des 10 premiers pays pour le nombre de cas confirmés

Pour visualiser la répartition des 10 premiers pays où des cas ont été confirmés, traçons un graphique circulaire :

top10_countries_confirmed = df_most_confirmed_recent_sorted.head(10)
plot_pie(top10_countries_confirmed, 
         "Confirmed", 
         "Top 10 Pays pour les cas confirmés")

Vous verrez ce qui suit. Vous pouvez voir que parmi les 10 premiers pays, les États-Unis comptent un peu moins de la moitié du nombre total de cas confirmés.

Les 10 premières provinces de Chine avec des cas confirmés

Voyons maintenant les dix premières provinces de Chine où des cas ont été confirmés :

plot_pie(df_combined_china_most_recent_sorted, 
         "Confirmed", 
         "Top 10 provinces chinoises pour les cas confirmés")

Sans aucune surprise, le Hubei est l’épicentre de l’épidémie :

Les 10 premiers pays où des décès ont été signalés

Ensuite, on affiche les 10 premiers pays où des décès ont été signalés :

df_most_deaths_recent_sorted = df_most_deaths_recent_sorted.head(10)
plot_pie(df_most_deaths_recent_sorted, 
         "Deaths", 
         "Top 10 des pays pour les décès")

On obtient ceci :

Biens que la France se classe 9e pour le nombre de cas confirmés, elle se classe 4e en termes de décès signalés.

Aplatir les courbes

Rappelez-vous que j’ai mentionné précédemment que les chiffres enregistrés (cas confirmés et décès) sont tous cumulatifs ? Et parce qu’ils sont cumulatifs, il serait difficile de savoir si la situation dans un pays s’améliore ou empire. Il serait donc utile que nous puissions “dérouler” les chiffres afin d’obtenir les nouveaux chiffres déclarés pour chaque jour. C’est donc ce que nous allons faire :

plt.rcParams["figure.figsize"] = (12,7)
# pour chaque pays
for country, df_country in df_daily.groupby(level=1):    
    # obtenir la liste des dates
    dates = list(df_country.index.get_level_values('Date'))
    
    # obtenir le nombre de cas confirmés
    confirmed = list(df_country.Confirmed)
    
    # obtenir le nombre des décès
    deaths = list(df_country.Deaths)
    
    # construire un nouveau DataFrame pour le pays concerné
    df = pd.DataFrame(dates)
    df["Confirmed"] = confirmed
    df["Deaths"] = deaths

    # dérouler (somme cumulée inversée) les colonnes - cas confirmés et décès   
    df_unrolled = df.diff().fillna(df)    
    df_unrolled[0] = dates
    
    # tracer les graphiques linéaires
    plt.plot(dates, df_unrolled["Confirmed"], color='blue', 
             label="Cas confirmés par jour")
    plt.plot(dates, df_unrolled["Deaths"], color='red', 
             label="Décès par jour")
    plt.xlabel("Dates")
    plt.ylabel("Nombre de personnes")
    plt.title(country)
    plt.legend()
    plt.show()

Dans l’extrait de code ci-dessus, on extrait les nombres quotidiens de chaque pays pour former un nouveau DataFrame. Nous utilisons ensuite la fonction diff() pour dérouler les nombres accumulés. Une fois les chiffres déroulés, nous traçons un graphique linéaire pour chaque pays.

En voici un exemple :

Comme vous pouvez le voir, la Nouvelle-Zélande a presque vaincu le virus :

Alors que l’Afrique du Sud mène toujours un combat difficile :

Vous pouvez également constater que certains pays ont des “pics” qui tombent en dessous de 0 :

Cela est probablement dû aux ajustements apportés aux chiffres. Par exemple, un jour, le nombre enregistré peut être de 5000, mais le lendemain, le nombre (cumulé) peut être ajusté à la baisse à 4000 (peut-être en raison d’erreurs dans les tests, les enregistrements, etc).

Afficher tous les cas confirmés sur la carte du monde

Enfin, ne serait-il pas bien que nous puissions afficher tous les cas sur une carte du monde ? Nous tracerions des cercles sur la carte du monde et utiliserions le rayon des cercles pour représenter la gravité du pays. Nous utiliserions un cercle vert pour représenter les cas confirmés et le rouge pour représenter les cas de décès :

import folium

# obtenir la date la plus récente du DataFrame
most_recent_date = df_combined['Date'].max()

# obtenir toutes les données de cette date la plus récente
df_latest_day = df_combined[df_combined.Date==most_recent_date]

# créer une carte
folium_map = folium.Map(location=[40.738, -73.98], zoom_start=4)
color="#E37222"
scale = 5000
for place in df_latest_day.index:
    lat = df_latest_day.loc[place]["Lat"]
    lng = df_latest_day.loc[place]["Long"]    
    confirmed = df_latest_day.loc[place]["Confirmed"]
    deaths    = df_latest_day.loc[place]["Deaths"]

    # Cas Confirmés
    # dessiner un cercle sur la province/état/région/pays
    marker_confirmed = folium.CircleMarker(location=[lat, lng],
                                 radius=confirmed/scale,
                                 color="green",
                                 fill=True)
    marker_confirmed.add_to(folium_map)
    
    # Cas Décès
    # dessiner un cercle sur la province/état/région/pays
    radius = deaths/scale if deaths>0 else 0.000000001
    marker_deaths = folium.CircleMarker(location=[lat, lng],
                                 radius=radius,
                                 color="red",
                                 fill=True)
    marker_deaths.add_to(folium_map)

folium_map.save("Covid-19 Map.html")

Pour la carte, j’utilise la bibliothèque Folium. Folium est une puissante bibliothèque Python qui vous aide à créer plusieurs types de cartes de type “Leaflet”. Leaflet est la principale bibliothèque JavaScript open-source pour les cartes interactives adaptées aux téléphones portables.

La carte utilisée est OpenStreetMap. Pour installer Folium, tapez ceci : pip install folium

Et voici la carte !

Visualisation de données du Covid-19

Conclusion

La visualisation des données est un outil très puissant pour donner vie aux résultats de vos analyses de données. Au lieu de regarder les chiffres, l’utilisation de tableaux et de graphiques peut souvent faciliter la transmission de données importantes.
J’espère que vous avez trouvé cet article utile !

Visualisation de données du Covid-19