Partie 1 Préparation et nettoyage des données

Author

NGUYEN Duc Hoang Viet

1 Base de données COVID-19

1.1 Importation des bibliothèques des COVID-19

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

print("Modules are imported.")
Modules are imported.

1.2 Importation des données

import os

for dirname, _, filenames in os.walk('Covid-19_from_John_Hopkins_University'):
    for filename in filenames:
        print(os.path.join(dirname, filename))
Covid-19_from_John_Hopkins_University/CONVENIENT_us_deaths.csv
Covid-19_from_John_Hopkins_University/CONVENIENT_us_metadata.csv
Covid-19_from_John_Hopkins_University/RAW_global_deaths.csv
Covid-19_from_John_Hopkins_University/CONVENIENT_global_metadata.csv
Covid-19_from_John_Hopkins_University/RAW_global_confirmed_cases.csv
Covid-19_from_John_Hopkins_University/CONVENIENT_us_confirmed_cases.csv
Covid-19_from_John_Hopkins_University/CONVENIENT_global_confirmed_cases.csv
Covid-19_from_John_Hopkins_University/CONVENIENT_global_deaths.csv
Covid-19_from_John_Hopkins_University/RAW_us_deaths.csv
Covid-19_from_John_Hopkins_University/RAW_us_confirmed_cases.csv
corona_dataset = pd.read_csv("Covid-19_from_John_Hopkins_University/RAW_global_confirmed_cases.csv")
corona_dataset.head()
Country/Region Province/State Lat Long 1/22/20 1/23/20 1/24/20 1/25/20 1/26/20 1/27/20 ... 2/28/23 3/1/23 3/2/23 3/3/23 3/4/23 3/5/23 3/6/23 3/7/23 3/8/23 3/9/23
0 Afghanistan NaN 33.93911 67.709953 0 0 0 0 0 0 ... 209322 209340 209358 209362 209369 209390 209406 209436 209451 209451
1 Albania NaN 41.15330 20.168300 0 0 0 0 0 0 ... 334391 334408 334408 334427 334427 334427 334427 334427 334443 334457
2 Algeria NaN 28.03390 1.659600 0 0 0 0 0 0 ... 271441 271448 271463 271469 271469 271477 271477 271490 271494 271496
3 Andorra NaN 42.50630 1.521800 0 0 0 0 0 0 ... 47866 47875 47875 47875 47875 47875 47875 47875 47890 47890
4 Angola NaN -11.20270 17.873900 0 0 0 0 0 0 ... 105255 105277 105277 105277 105277 105277 105277 105277 105288 105288

5 rows × 1147 columns

1.3 Vérification initiale

corona_dataset.shape
(289, 1147)

289 lignes (countries/regions) et 1147 colonnes (metadata + dates)

1.4 Nettoyage des données

1.4.1 Suppression des colonnes inutiles

corona_dataset_clean = corona_dataset.drop(["Lat", "Long"], axis=1)

1.4.2 Agrégation par pays

corona_dataset_aggregated = corona_dataset_clean.groupby('Country/Region').sum()
# Exportation des données agrégées par pays
corona_dataset_aggregated.to_csv("data/corona_dataset_aggregated.csv")

1.4.3 Vérification après agrégation

corona_dataset_aggregated.shape
(201, 1144)

1.4.4 Aperçu des données

corona_dataset_aggregated.head()
Province/State 1/22/20 1/23/20 1/24/20 1/25/20 1/26/20 1/27/20 1/28/20 1/29/20 1/30/20 ... 2/28/23 3/1/23 3/2/23 3/3/23 3/4/23 3/5/23 3/6/23 3/7/23 3/8/23 3/9/23
Country/Region
Afghanistan 0 0 0 0 0 0 0 0 0 ... 209322 209340 209358 209362 209369 209390 209406 209436 209451 209451
Albania 0 0 0 0 0 0 0 0 0 ... 334391 334408 334408 334427 334427 334427 334427 334427 334443 334457
Algeria 0 0 0 0 0 0 0 0 0 ... 271441 271448 271463 271469 271469 271477 271477 271490 271494 271496
Andorra 0 0 0 0 0 0 0 0 0 ... 47866 47875 47875 47875 47875 47875 47875 47875 47890 47890
Angola 0 0 0 0 0 0 0 0 0 ... 105255 105277 105277 105277 105277 105277 105277 105277 105288 105288

5 rows × 1144 columns

1.5 Vérification des données manquantes

corona_dataset_aggregated.isnull().sum().sum()
np.int64(0)

La fonction isnull() est utilisée pour vérifier la présence de valeurs manquantes dans le DataFrame corona_dataset_aggregated. La méthode sum() est appliquée deux fois pour obtenir le nombre total de valeurs manquantes dans l’ensemble du DataFrame. Si le résultat est 0, cela signifie qu’il n’y a aucune valeur manquante dans les données agrégées par pays. Et avec la fonction sum() permet de compter le nombre de valeurs manquantes pour chaque colonne en additionnant les valeurs True (1) et False (0) dans chaque colonne. En appliquant sum() à l’ensemble du DataFrame, on obtient le nombre total de valeurs manquantes dans toutes les colonnes combinées.

Et, on obient np.int64(0) qui indique qu’il n’y a aucune valeur manquante dans le DataFrame corona_dataset_aggregated après l’agrégation par pays. Cela signifie que toutes les données sont complètes et qu’il n’y a pas de valeurs manquantes à traiter dans ce DataFrame agrégé. Par conséquent, on peut procéder à l’analyse des données sans se soucier des valeurs manquantes.

1.6 Vérification des doublons

corona_dataset_aggregated.duplicated().sum()
np.int64(0)

la fonction duplicated() qui retoure un table de booléens indiquant si une ligne est un doublon ou non. En appliquant sum() à ce résultat, on obtient le nombre total de lignes dupliquées dans le DataFrame corona_dataset_aggregated. Si le résultat est 0, cela signifie qu’il n’y a aucune ligne dupliquée dans les données agrégées par pays. Cela indique que chaque pays est représenté une seule fois dans le DataFrame, ce qui est important pour garantir l’intégrité des données et éviter les biais dans l’analyse.

1.7 Transformation en série temporelle

covid_clean = corona_dataset_aggregated.copy() # Création d'une copie du DataFrame pour éviter de modifier l'original

covid_clean = covid_clean.drop(columns=["Lat", "Long"], errors="ignore") # Suppression des colonnes "Lat" et "Long" si elles existent, sinon ignorer l'erreur

covid_ts = covid_clean.T # Transposition du DataFrame pour que les dates deviennent les index et les pays deviennent les colonnes

covid_ts.index = pd.to_datetime(covid_ts.index, errors="coerce") # Conversion de l'index en format datetime, en ignorant les erreurs de conversion

covid_ts = covid_ts[~covid_ts.index.isna()] # Suppression des lignes dont l'index n'a pas pu être converti en datetime (si nécessaire)

covid_ts.head()
Country/Region Afghanistan Albania Algeria Andorra Angola Antarctica Antigua and Barbuda Argentina Armenia Australia ... Uruguay Uzbekistan Vanuatu Venezuela Vietnam West Bank and Gaza Winter Olympics 2022 Yemen Zambia Zimbabwe
2020-01-22 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2020-01-23 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 2 0 0 0 0 0
2020-01-24 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 2 0 0 0 0 0
2020-01-25 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 2 0 0 0 0 0
2020-01-26 0 0 0 0 0 0 0 0 0 4 ... 0 0 0 0 2 0 0 0 0 0

5 rows × 201 columns

covid_ts.to_csv("data/covid_timeseries.csv")

Le jeu de données a ensuite été exporté au format CSV afin de faciliter sa réutilisation dans les étapes ultérieures de l’analyse exploratoire des données (EDA) et de garantir la reproductibilité du projet.

2 Base de données World Happiness Report 2021

2.1 Importation des données

happiness_report = pd.read_csv("World_Happiness_Report/world-happiness-report-2021.csv")
happiness_report.head()
Country name Regional indicator Ladder score Standard error of ladder score upperwhisker lowerwhisker Logged GDP per capita Social support Healthy life expectancy Freedom to make life choices Generosity Perceptions of corruption Ladder score in Dystopia Explained by: Log GDP per capita Explained by: Social support Explained by: Healthy life expectancy Explained by: Freedom to make life choices Explained by: Generosity Explained by: Perceptions of corruption Dystopia + residual
0 Finland Western Europe 7.842 0.032 7.904 7.780 10.775 0.954 72.0 0.949 -0.098 0.186 2.43 1.446 1.106 0.741 0.691 0.124 0.481 3.253
1 Denmark Western Europe 7.620 0.035 7.687 7.552 10.933 0.954 72.7 0.946 0.030 0.179 2.43 1.502 1.108 0.763 0.686 0.208 0.485 2.868
2 Switzerland Western Europe 7.571 0.036 7.643 7.500 11.117 0.942 74.4 0.919 0.025 0.292 2.43 1.566 1.079 0.816 0.653 0.204 0.413 2.839
3 Iceland Western Europe 7.554 0.059 7.670 7.438 10.878 0.983 73.0 0.955 0.160 0.673 2.43 1.482 1.172 0.772 0.698 0.293 0.170 2.967
4 Netherlands Western Europe 7.464 0.027 7.518 7.410 10.932 0.942 72.4 0.913 0.175 0.338 2.43 1.501 1.079 0.753 0.647 0.302 0.384 2.798

2.2 Vérification structure

happiness_report.shape
(149, 20)

2.3 Nettoyage des données

2.3.1 Suppression des colonnes inutiles

happiness_report_clean = happiness_report.drop(["Standard error of ladder score", "upperwhisker", "lowerwhisker"],axis=1)

2.3.2 Vérification après nettoyage

happiness_report.shape
(149, 20)

2.4 Vérification des données manquantes

happiness_report_clean.isnull().sum().sum()
np.int64(0)

2.5 Vérification des doublons

happiness_report_clean.duplicated().sum()
np.int64(0)

2.6 Aperçu final

happiness_report_clean.head()
Country name Regional indicator Ladder score Logged GDP per capita Social support Healthy life expectancy Freedom to make life choices Generosity Perceptions of corruption Ladder score in Dystopia Explained by: Log GDP per capita Explained by: Social support Explained by: Healthy life expectancy Explained by: Freedom to make life choices Explained by: Generosity Explained by: Perceptions of corruption Dystopia + residual
0 Finland Western Europe 7.842 10.775 0.954 72.0 0.949 -0.098 0.186 2.43 1.446 1.106 0.741 0.691 0.124 0.481 3.253
1 Denmark Western Europe 7.620 10.933 0.954 72.7 0.946 0.030 0.179 2.43 1.502 1.108 0.763 0.686 0.208 0.485 2.868
2 Switzerland Western Europe 7.571 11.117 0.942 74.4 0.919 0.025 0.292 2.43 1.566 1.079 0.816 0.653 0.204 0.413 2.839
3 Iceland Western Europe 7.554 10.878 0.983 73.0 0.955 0.160 0.673 2.43 1.482 1.172 0.772 0.698 0.293 0.170 2.967
4 Netherlands Western Europe 7.464 10.932 0.942 72.4 0.913 0.175 0.338 2.43 1.501 1.079 0.753 0.647 0.302 0.384 2.798

3 Préparation pour analyse croisée (COVID vs Happiness)

3.1 Vérification mismatch country names

set(happiness_report_clean["Country name"]) - set(corona_dataset_aggregated.index)
{'Czech Republic',
 'Hong Kong S.A.R. of China',
 'Ivory Coast',
 'Myanmar',
 'North Cyprus',
 'Palestinian Territories',
 'South Korea',
 'Swaziland',
 'Taiwan Province of China',
 'Turkmenistan',
 'United States'}
happiness_report_clean.shape
(149, 17)

3.2 Harmonisation des noms de pays

merged_data = happiness_report_clean.merge(
    corona_dataset_aggregated,
    left_on="Country name",
    right_index=True,
    how="inner"
)

merged_data.head()
Country name Regional indicator Ladder score Logged GDP per capita Social support Healthy life expectancy Freedom to make life choices Generosity Perceptions of corruption Ladder score in Dystopia ... 2/28/23 3/1/23 3/2/23 3/3/23 3/4/23 3/5/23 3/6/23 3/7/23 3/8/23 3/9/23
0 Finland Western Europe 7.842 10.775 0.954 72.0 0.949 -0.098 0.186 2.43 ... 1462169 1462169 1462976 1462976 1462976 1462976 1462976 1462976 1462976 1463644
1 Denmark Western Europe 7.620 10.933 0.954 72.7 0.946 0.030 0.179 2.43 ... 3449989 3450101 3450223 3450336 3450336 3450336 3450587 3450757 3450897 3451036
2 Switzerland Western Europe 7.571 11.117 0.942 74.4 0.919 0.025 0.292 2.43 ... 4412439 4412439 4412439 4412439 4412439 4412439 4412439 4413911 4413911 4413911
3 Iceland Western Europe 7.554 10.878 0.983 73.0 0.955 0.160 0.673 2.43 ... 209093 209093 209093 209093 209093 209093 209093 209137 209137 209137
4 Netherlands Western Europe 7.464 10.932 0.942 72.4 0.913 0.175 0.338 2.43 ... 8708982 8709011 8709011 8710897 8710897 8710897 8710897 8712835 8712835 8712835

5 rows × 1161 columns

print("Nombre de pays dans Happiness Report :", len(happiness_report_clean))
print("Nombre de pays après fusion :", len(merged_data))
Nombre de pays dans Happiness Report : 149
Nombre de pays après fusion : 138

3.3 Vérification des incohérences entre les noms de pays

happiness_report_clean["Country name"] = happiness_report_clean["Country name"].replace({
    "United States": "US",
    "South Korea": "Korea, South",
    "Czech Republic": "Czechia",
    "Myanmar": "Burma",
    "Swaziland": "Eswatini",
    "Ivory Coast": "Cote d'Ivoire",
    "Palestinian Territories": "West Bank and Gaza"
})

happiness_report_clean.to_csv("data/happiness_report_clean.csv", index=False)

last_date = corona_dataset_aggregated.columns[-1]

corona_dataset_aggregated["Total Cases"] = corona_dataset_aggregated[last_date]

merged_data = happiness_report_clean.merge(
    corona_dataset_aggregated,
    left_on="Country name",
    right_index=True,
    how="inner"
)
merged_data.to_csv("data/merged_data.csv", index=False)
merged_data.head()
Country name Regional indicator Ladder score Logged GDP per capita Social support Healthy life expectancy Freedom to make life choices Generosity Perceptions of corruption Ladder score in Dystopia ... 3/1/23 3/2/23 3/3/23 3/4/23 3/5/23 3/6/23 3/7/23 3/8/23 3/9/23 Total Cases
0 Finland Western Europe 7.842 10.775 0.954 72.0 0.949 -0.098 0.186 2.43 ... 1462169 1462976 1462976 1462976 1462976 1462976 1462976 1462976 1463644 1463644
1 Denmark Western Europe 7.620 10.933 0.954 72.7 0.946 0.030 0.179 2.43 ... 3450101 3450223 3450336 3450336 3450336 3450587 3450757 3450897 3451036 3451036
2 Switzerland Western Europe 7.571 11.117 0.942 74.4 0.919 0.025 0.292 2.43 ... 4412439 4412439 4412439 4412439 4412439 4412439 4413911 4413911 4413911 4413911
3 Iceland Western Europe 7.554 10.878 0.983 73.0 0.955 0.160 0.673 2.43 ... 209093 209093 209093 209093 209093 209093 209137 209137 209137 209137
4 Netherlands Western Europe 7.464 10.932 0.942 72.4 0.913 0.175 0.338 2.43 ... 8709011 8709011 8710897 8710897 8710897 8710897 8712835 8712835 8712835 8712835

5 rows × 1162 columns

print("Nombre de pays dans Happiness Report :", len(happiness_report_clean))
print("Nombre de pays après fusion :", len(merged_data))
Nombre de pays dans Happiness Report : 149
Nombre de pays après fusion : 145
remaining_mismatch = set(happiness_report_clean["Country name"]) - set(corona_dataset_aggregated.index)

print("Nombre de pays non correspondants :", len(remaining_mismatch))
print(remaining_mismatch)
Nombre de pays non correspondants : 4
{'Taiwan Province of China', 'Hong Kong S.A.R. of China', 'Turkmenistan', 'North Cyprus'}
print(sorted(remaining_mismatch))
['Hong Kong S.A.R. of China', 'North Cyprus', 'Taiwan Province of China', 'Turkmenistan']

Une analyse des noms de pays a révélé quelques divergences entre les deux bases de données. Après harmonisation des principales correspondances, 145 pays ont pu être fusionnés. Quatre territoires (Hong Kong S.A.R. of China, Taiwan Province of China, North Cyprus et Turkmenistan) n’ont pas pu être associés directement en raison de différences de nomenclature ou de l’absence de données correspondantes dans la base COVID-19.

V

MADE BY NGUYEN DUC HOANG VIET

PROJET COVID-19 DATA ANALYST

© 2026 NGUYEN Duc Hoang Viet — Tous droits réservés.
Projet COVID-19 Data Analyst using Python
Toute reproduction, diffusion ou utilisation sans autorisation est interdite.