Analyse de l'évolution du Coronavirus 2019

Dernière mise à jour : 7 mars 2020

Afin de mieux comprendre l'évolution de l'épidémie de coronavirus qui nous frappe actuellement, nous nous sommes procuré les données relatives à son évolution recensée jour par jour depuis le 22/01/2020 à travers le monde.

Dans cet article, nous ne nous risquerons pas en la réalisation d'une prédiction sur son évolution à l'aide d'algorithmes dédiés à l'apprentissage, mais nous réaliserons une simple analyse des données qui nous permettra d'apprécier la réalité des faits de cette épidémie.

COLLECTE, PREPARATION, IMPORTATION DES DONNEES

Collecte

In [106]:
#Lien officiel (John Hopkins) : https://github.com/CSSEGISandData/COVID-19
import requests

path = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/"
casConfirmes = "time_series_19-covid-Confirmed.csv"
casDecedes = "time_series_19-covid-Deaths.csv"
casGueris = "time_series_19-covid-Recovered.csv"

url = path+casConfirmes
print(url)
fichier = requests.get(url)
open('C:/DEVELOPPEMENT/JUPYTER_NOTEBOOK/20200305 - CoronaVirus/datas/time_series_19-covid-Confirmed.csv', 'wb').write(fichier.content)

url = path+casDecedes
fichier = requests.get(url)
open('C:/DEVELOPPEMENT/JUPYTER_NOTEBOOK/20200305 - CoronaVirus/datas/time_series_19-covid-Deaths.csv', 'wb').write(fichier.content)

url = path+casGueris
fichier = requests.get(url)
open('C:/DEVELOPPEMENT/JUPYTER_NOTEBOOK/20200305 - CoronaVirus/datas/time_series_19-covid-Recovered.csv', 'wb').write(fichier.content)

print("Telechargement terminé")
https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv
Telechargement terminé

Préparation

In [107]:
from datetime import datetime

#----> Cas confirmés
import pandas as pnd
#Chargement du fichier
datasConfirmes = pnd.read_csv('datas/time_series_19-covid-Confirmed.csv')
#Conversion des intitulés de colonnes (dates) en ligne
datasConfirmes = pnd.melt(datasConfirmes, id_vars=['Province/State','Country/Region','Lat','Long'], var_name='ObservationDate')
#Ajout de la colonne SNo
datasConfirmes.insert(0, 'SNo', range(0, len(datasConfirmes)))
#Formattage de la date
datasConfirmes['ObservationDate'] = pnd.to_datetime(datasConfirmes.ObservationDate, format='%m/%d/%y')
datasConfirmes['ObservationDate'] = datasConfirmes["ObservationDate"].dt.strftime("%m/%d/%Y")
#On renomme la colonne value en "Confirmed"
datasConfirmes = datasConfirmes.rename(columns={"value": "Confirmed"})

#----> Cas decedes
datasDecedes = pnd.read_csv('datas/time_series_19-covid-Deaths.csv')
datasDecedes = pnd.melt(datasDecedes, id_vars=['Province/State','Country/Region','Lat','Long'], var_name='ObservationDate')
datasDecedes.insert(0, 'SNo', range(0, len(datasDecedes)))
datasDecedes = datasDecedes.rename(columns={"value": "Deaths"})

#----> Cas gueris
datasGueris = pnd.read_csv('datas/time_series_19-covid-Recovered.csv')
datasGueris = pnd.melt(datasGueris, id_vars=['Province/State','Country/Region','Lat','Long'], var_name='ObservationDate')
datasGueris.insert(0, 'SNo', range(0, len(datasGueris)))
datasGueris = datasGueris.rename(columns={"value": "Recovered"})

#On fusionne les dataFrames
datasFusion = pnd.concat([datasConfirmes, datasDecedes['Deaths'],datasGueris['Recovered']], axis=1, join='inner')

#On sauvegarde le fichier 
datasFusion.to_csv('datas/covid_19_datas.csv', index=False)

Import

In [108]:
#Les données sont en libre téléchargement sur notre repository GitHub
#https://github.com/QSTOM-IT/datascience/tree/master/CORONAVIRUS-2019

#Lien officiel (John Hopkins) : https://github.com/CSSEGISandData/COVID-19

import pandas as pnd
datas = pnd.read_csv('datas/covid_19_datas.csv')

PRISE DE CONNAISSANCE DES DONNEES

In [109]:
#Nombre d'observations et de caractéristiques
datas.shape
Out[109]:
(10350, 9)
In [110]:
#Informations sur le nom des colonnes
datas.columns
Out[110]:
Index(['SNo', 'Province/State', 'Country/Region', 'Lat', 'Long',
       'ObservationDate', 'Confirmed', 'Deaths', 'Recovered'],
      dtype='object')
In [111]:
#Affichage des 5 premières observations
datas.head(5)
Out[111]:
SNo Province/State Country/Region Lat Long ObservationDate Confirmed Deaths Recovered
0 0 Anhui Mainland China 31.8257 117.2264 01/22/2020 1 0 0
1 1 Beijing Mainland China 40.1824 116.4142 01/22/2020 14 0 0
2 2 Chongqing Mainland China 30.0572 107.8740 01/22/2020 6 0 0
3 3 Fujian Mainland China 26.0789 117.9874 01/22/2020 1 0 0
4 4 Gansu Mainland China 36.0611 103.8343 01/22/2020 0 0 0
In [112]:
#Affichage des 5 dernières observations
datas.tail(5)
Out[112]:
SNo Province/State Country/Region Lat Long ObservationDate Confirmed Deaths Recovered
10345 10345 Pierce County, WA US 47.0676 -122.1295 03/07/2020 1 0 0
10346 10346 Plymouth County, MA US 42.1615 -70.7928 03/07/2020 1 0 0
10347 10347 Santa Cruz County, CA US 36.9741 -122.0308 03/07/2020 1 0 0
10348 10348 Tulsa County, OK US 36.1593 -95.9410 03/07/2020 1 0 0
10349 10349 Montgomery County, TX US 30.3213 -95.4778 03/07/2020 0 0 0
In [113]:
#Informations sur les types de caractéristiques dont nous disposons
datas.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10350 entries, 0 to 10349
Data columns (total 9 columns):
SNo                10350 non-null int64
Province/State     6026 non-null object
Country/Region     10350 non-null object
Lat                10350 non-null float64
Long               10350 non-null float64
ObservationDate    10350 non-null object
Confirmed          10350 non-null int64
Deaths             10350 non-null int64
Recovered          10350 non-null int64
dtypes: float64(2), int64(4), object(3)
memory usage: 727.9+ KB
In [114]:
#On renomme certaines caracteristiques pour une facilité de manipulation ultérieure
datas = datas.rename(columns={"ObservationDate": "Date", "Province/State": "ProvinceState","Country/Region":"Country","Last Update":"LastUpdate"})
In [115]:
#Combien de données manquantes ?
datas.isnull().sum()
Out[115]:
SNo                 0
ProvinceState    4324
Country             0
Lat                 0
Long                0
Date                0
Confirmed           0
Deaths              0
Recovered           0
dtype: int64

Certaines observations ne semblent pas posséder d'informations concernant la province ou l'état ce qui paraît logique car tous les pays n'ont pas de province ou d'état

In [116]:
#Conversion de la feature Date au format Date
datas['Date']= pnd.to_datetime(datas['Date']) 
In [117]:
#Type de caractéristiques
datas.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10350 entries, 0 to 10349
Data columns (total 9 columns):
SNo              10350 non-null int64
ProvinceState    6026 non-null object
Country          10350 non-null object
Lat              10350 non-null float64
Long             10350 non-null float64
Date             10350 non-null datetime64[ns]
Confirmed        10350 non-null int64
Deaths           10350 non-null int64
Recovered        10350 non-null int64
dtypes: datetime64[ns](1), float64(2), int64(4), object(2)
memory usage: 727.9+ KB
In [118]:
#Liste des pays
datas["Country"].unique()
Out[118]:
array(['Mainland China', 'Thailand', 'Japan', 'South Korea', 'Taiwan',
       'US', 'Macau', 'Hong Kong', 'Singapore', 'Vietnam', 'France',
       'Nepal', 'Malaysia', 'Canada', 'Australia', 'Cambodia',
       'Sri Lanka', 'Germany', 'Finland', 'United Arab Emirates',
       'Philippines', 'India', 'Italy', 'UK', 'Russia', 'Sweden', 'Spain',
       'Belgium', 'Others', 'Egypt', 'Iran', 'Lebanon', 'Iraq', 'Oman',
       'Afghanistan', 'Bahrain', 'Kuwait', 'Algeria', 'Croatia',
       'Switzerland', 'Austria', 'Israel', 'Pakistan', 'Brazil',
       'Georgia', 'Greece', 'North Macedonia', 'Norway', 'Romania',
       'Denmark', 'Estonia', 'Netherlands', 'San Marino', 'Belarus',
       'Iceland', 'Lithuania', 'Mexico', 'New Zealand', 'Nigeria',
       'Ireland', 'Luxembourg', 'Monaco', 'Qatar', 'Ecuador',
       'Azerbaijan', 'Czech Republic', 'Armenia', 'Dominican Republic',
       'Indonesia', 'Portugal', 'Andorra', 'Latvia', 'Morocco',
       'Saudi Arabia', 'Senegal', 'Argentina', 'Chile', 'Jordan',
       'Ukraine', 'Saint Barthelemy', 'Hungary', 'Faroe Islands',
       'Gibraltar', 'Liechtenstein', 'Poland', 'Tunisia', 'Palestine',
       'Bosnia and Herzegovina', 'Slovenia', 'South Africa', 'Bhutan',
       'Cameroon', 'Colombia', 'Costa Rica', 'Peru', 'Serbia', 'Slovakia',
       'Togo', 'Vatican City', 'French Guiana', 'Malta', 'Martinique'],
      dtype=object)
In [119]:
#On renomme le pays "Mainland China" en "China"
datas = datas.replace('Mainland China', 'China')

EXPLORATION DES DONNEES

In [120]:
#Date minimale des observations
datas["Date"].min()
Out[120]:
Timestamp('2020-01-22 00:00:00')
In [121]:
#Date maximale des observations
datas["Date"].max()
Out[121]:
Timestamp('2020-03-07 00:00:00')
In [122]:
#Pour connaitre le nombre de cas à la date maximale l'erreur serait de faire la somme de la colonne Confirmed, car il s'agit
#d'une donnée cumulée chaque jour !
#Il faut donc extraire les données à la date souhaitée et de réaliser ensuite les différents calculs

#On extrait les données à la derniere date la plus récente
datasDerniereDate = datas[datas['Date'] == max(datas['Date'])].reset_index()
In [123]:
#Frequence des relevés (on constate un relevé journalier)
datas["Date"].unique()
Out[123]:
array(['2020-01-22T00:00:00.000000000', '2020-01-23T00:00:00.000000000',
       '2020-01-24T00:00:00.000000000', '2020-01-25T00:00:00.000000000',
       '2020-01-26T00:00:00.000000000', '2020-01-27T00:00:00.000000000',
       '2020-01-28T00:00:00.000000000', '2020-01-29T00:00:00.000000000',
       '2020-01-30T00:00:00.000000000', '2020-01-31T00:00:00.000000000',
       '2020-02-01T00:00:00.000000000', '2020-02-02T00:00:00.000000000',
       '2020-02-03T00:00:00.000000000', '2020-02-04T00:00:00.000000000',
       '2020-02-05T00:00:00.000000000', '2020-02-06T00:00:00.000000000',
       '2020-02-07T00:00:00.000000000', '2020-02-08T00:00:00.000000000',
       '2020-02-09T00:00:00.000000000', '2020-02-10T00:00:00.000000000',
       '2020-02-11T00:00:00.000000000', '2020-02-12T00:00:00.000000000',
       '2020-02-13T00:00:00.000000000', '2020-02-14T00:00:00.000000000',
       '2020-02-15T00:00:00.000000000', '2020-02-16T00:00:00.000000000',
       '2020-02-17T00:00:00.000000000', '2020-02-18T00:00:00.000000000',
       '2020-02-19T00:00:00.000000000', '2020-02-20T00:00:00.000000000',
       '2020-02-21T00:00:00.000000000', '2020-02-22T00:00:00.000000000',
       '2020-02-23T00:00:00.000000000', '2020-02-24T00:00:00.000000000',
       '2020-02-25T00:00:00.000000000', '2020-02-26T00:00:00.000000000',
       '2020-02-27T00:00:00.000000000', '2020-02-28T00:00:00.000000000',
       '2020-02-29T00:00:00.000000000', '2020-03-01T00:00:00.000000000',
       '2020-03-02T00:00:00.000000000', '2020-03-03T00:00:00.000000000',
       '2020-03-04T00:00:00.000000000', '2020-03-05T00:00:00.000000000',
       '2020-03-06T00:00:00.000000000', '2020-03-07T00:00:00.000000000'],
      dtype='datetime64[ns]')

INFORMATIONS AU NIVEAU MONDIAL

In [124]:
#MONDIAL = Combien de cas : confirmés ? décédés ? Guerris ?
confirmes = datasDerniereDate["Confirmed"].sum()
decedes = datasDerniereDate["Deaths"].sum()
gueris = datasDerniereDate["Recovered"].sum()

print("NIVEAU MONDIAL EN DATE DU : "+max(datas['Date']).strftime("%d/%m/%Y"))
print("  Confirmes : "+str(confirmes))
print("  Decedes : "+str(decedes))
print("  Gueris : "+str(gueris))
print("  Taux mortalité (%): "+str(round((decedes/confirmes)*100,2)))

#Pour utilisation dans la synthèse
confirmesMondial = confirmes
decedesMondial = decedes
guerisMondial = gueris
mortaliteMondial = round((decedes/confirmes)*100,2)
NIVEAU MONDIAL EN DATE DU : 07/03/2020
  Confirmes : 105836
  Decedes : 3558
  Gueris : 58359
  Taux mortalité (%): 3.36

EN CHINE

In [125]:
#Date de début de l'épidémie en Chine (Cas confirmé > 0)
datasChine = datas[datas['Country'] == 'China'].reset_index()
datasChine = datasChine[datasChine.Confirmed > 0]
print("Date du premier cas = "+(min(datasChine['Date']).strftime("%d/%m/%Y")))
Date du premier cas = 22/01/2020
In [126]:
#En Chine
datasChine = datasDerniereDate[datasDerniereDate['Country']=="China"].reset_index()

confirmes = datasChine["Confirmed"].sum()
decedes = datasChine["Deaths"].sum()
gueris = datasChine["Recovered"].sum()

print("EN CHINE EN DATE DU : "+max(datas['Date']).strftime("%d/%m/%Y"))
print("  Confirmes : "+str(confirmes))
print("  Decedes : "+str(decedes))
print("  Gueris : "+str(gueris))
print("  Taux mortalité (%): "+str(round((decedes/confirmes)*100,2)))

confirmesChine = confirmes
decedesChine = decedes
guerisChine = gueris
mortaliteChine = round((decedes/confirmes)*100,2)
EN CHINE EN DATE DU : 07/03/2020
  Confirmes : 80652
  Decedes : 3070
  Gueris : 55478
  Taux mortalité (%): 3.81
In [127]:
#Chronogramme de l'évolution de l'épidémie en chine

#Représentation des différents cas
#La courbe de mortalité semble plate, mais cela est dû à un nombre peu élevé de mortalité par rapport aux autres valeures ()

#Groupement par date en réalisant la somme de chaque feature
datasEvolutionChine = datas[datas['Country'] == 'China'].reset_index()
datasEvolutionChine = datasEvolutionChine.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()

import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

plt.plot(datasEvolutionChine['Date'],datasEvolutionChine['Confirmed'],color='black',label='Cas confirmés')
plt.plot(datasEvolutionChine['Date'],datasEvolutionChine['Recovered'],color='green',label='Cas guéris')
plt.plot(datasEvolutionChine['Date'],datasEvolutionChine['Deaths'],color='red',label='Cas décédés')
plt.title('Evolution du coronavirus Covid-19 en Chine en date du '+max(datas['Date']).strftime("%d/%m/%Y"))
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()

EN FRANCE

In [128]:
#Date de début de l'épidémie en France (Cas confirmé > 0)
datasFrance = datas[datas['Country'] == 'France'].reset_index()
datasFrance = datasFrance[datasFrance.Confirmed > 0]
print("Date du premier cas = "+(min(datasFrance['Date']).strftime("%d/%m/%Y")))
Date du premier cas = 24/01/2020
In [129]:
#En France
datasFrance = datasDerniereDate[datasDerniereDate['Country']=="France"].reset_index()

confirmes = datasFrance["Confirmed"].sum()
decedes = datasFrance["Deaths"].sum()
gueris = datasFrance["Recovered"].sum()

print("EN FRANCE EN DATE DU : "+max(datas['Date']).strftime("%d/%m/%Y"))
print("  Confirmes : "+str(confirmes))
print("  Decedes : "+str(decedes))
print("  Gueris : "+str(gueris))
print("  Taux mortalité (%): "+str(round((decedes/confirmes)*100,2)))

confirmesFrance = confirmes
decedesFrance = decedes
guerisFrance = gueris
mortaliteFrance = round((decedes/confirmes)*100,2)
EN FRANCE EN DATE DU : 07/03/2020
  Confirmes : 949
  Decedes : 11
  Gueris : 12
  Taux mortalité (%): 1.16
In [130]:
#Chronogramme de l'évolution de l'épidémie en France
#Représentation des différents cas

#Groupement par date en réalisant la somme de chaque feature
datasEvolutionFrance = datas[datas['Country'] == 'France'].reset_index()
datasEvolutionFrance = datasEvolutionFrance.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()

import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

plt.plot(datasEvolutionFrance['Date'],datasEvolutionFrance['Confirmed'],color='black',label='Cas confirmés')
plt.plot(datasEvolutionFrance['Date'],datasEvolutionFrance['Recovered'],color='green',label='Cas guéris')
plt.plot(datasEvolutionFrance['Date'],datasEvolutionFrance['Deaths'],color='red',label='Cas décédés')
plt.title('Evolution du coronavirus Covid-19 en France en date du '+max(datas['Date']).strftime("%d/%m/%Y"))
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()
In [131]:
#Date de début d'accroissement de l'épidémie
#25/02/2020 pour la France de 18 cas à 38 cas
import datetime
dateDebutFrance = datetime.datetime(2020 ,2, 25)

datasFrance = datas[datas['Country'] == 'France'].reset_index()
datasFrance['Date'] = pnd.to_datetime(datasFrance['Date']) 
filtre = (datasFrance['Date'] > dateDebutFrance) & (datasFrance['Date'] <= (max(datas['Date'])))
datasFrance = datasFrance.loc[filtre]
datasEvolutionFrance = datasFrance.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()

from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

plt.plot(datasEvolutionFrance['Date'],datasEvolutionFrance['Confirmed'],color='black',label='Cas confirmés')
plt.plot(datasEvolutionFrance['Date'],datasEvolutionFrance['Recovered'],color='green',label='Cas guéris')
plt.plot(datasEvolutionFrance['Date'],datasEvolutionFrance['Deaths'],color='red',label='Cas décédés')
plt.title('Evolution du coronavirus Covid-19 en France en date du '+max(datas['Date']).strftime("%d/%m/%Y"))
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()

EN ITALIE

In [132]:
#Date de début de l'épidémie en Italie (Cas confirmé > 0)
datasItalie = datas[datas['Country'] == 'Italy'].reset_index()
datasItalie = datasItalie[datasItalie.Confirmed > 0]
print("Date du premier cas = "+(min(datasItalie['Date']).strftime("%d/%m/%Y")))
Date du premier cas = 31/01/2020
In [133]:
#En Italie
datasItalie = datasDerniereDate[datasDerniereDate['Country']=="Italy"].reset_index()

confirmes = datasItalie["Confirmed"].sum()
decedes = datasItalie["Deaths"].sum()
gueris = datasItalie["Recovered"].sum()

print("EN ITALIE EN DATE DU : "+max(datas['Date']).strftime("%d/%m/%Y"))
print("  Confirmes : "+str(confirmes))
print("  Decedes : "+str(decedes))
print("  Gueris : "+str(gueris))
print("  Taux mortalité (%): "+str(round((decedes/confirmes)*100,2)))

confirmesItalie = confirmes
decedesItalie = decedes
guerisItalie = gueris
mortaliteItalie = round((decedes/confirmes)*100,2)
EN ITALIE EN DATE DU : 07/03/2020
  Confirmes : 5883
  Decedes : 233
  Gueris : 589
  Taux mortalité (%): 3.96
In [134]:
#Chronogramme de l'évolution de l'épidémie en Italie

#Groupement par date en réalisant la somme de chaque feature
datasEvolutionItalie = datas[datas['Country'] == 'Italy'].reset_index()
datasEvolutionItalie = datasEvolutionItalie.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()

import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

plt.plot(datasEvolutionItalie['Date'],datasEvolutionItalie['Confirmed'],color='black',label='Cas confirmés')
plt.plot(datasEvolutionItalie['Date'],datasEvolutionItalie['Recovered'],color='green',label='Cas guéris')
plt.plot(datasEvolutionItalie['Date'],datasEvolutionItalie['Deaths'],color='red',label='Cas décédés')
plt.title('Evolution du coronavirus Covid-19 en Italie en date du '+max(datas['Date']).strftime("%d/%m/%Y"))
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()
In [135]:
#Date de début d'accroissement de l'épidémie
#21/02/2020 pour l'Italie de 3 cas à  20 cas
dateDebutItalie = datetime.datetime(2020 ,2, 21)

datasItalie = datas[datas['Country'] == 'Italy'].reset_index()
datasItalie['Date'] = pnd.to_datetime(datasItalie['Date']) 
filtre = (datasItalie['Date'] > dateDebutItalie) & (datasItalie['Date'] <= (max(datas['Date'])))
datasItalie = datasItalie.loc[filtre]
datasEvolutionItalie = datasItalie.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()

from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

plt.plot(datasEvolutionItalie['Date'],datasEvolutionItalie['Confirmed'],color='black',label='Cas confirmés')
plt.plot(datasEvolutionItalie['Date'],datasEvolutionItalie['Recovered'],color='green',label='Cas guéris')
plt.plot(datasEvolutionItalie['Date'],datasEvolutionItalie['Deaths'],color='red',label='Cas décédés')
plt.title('Evolution du coronavirus Covid-19 en Italie en date du '+max(datas['Date']).strftime("%d/%m/%Y"))
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()

SUPERPOSITION DES COURBES D'EVOLUTIONS PAR PAYS

Nous allons définir pour chaque pays la date d'accroissement de l'épidémie (c'est à dire la date où le nombre de cas confirmés a augmenté significativement).
Puis nous allons comparer pour chaque pays l'évolution de l'épidémie sur une période comportant un nombre de jours identiques.

Analyse des cas confirmés

In [136]:
#Date de début d'accroissement de l'épidémie pour chaque pays (obtenues via observations des données)
#22/01/2020 pour la Chine passage (début des relevés)
#25/02/2020 pour la France de 18 cas à 38 cas
#21/02/2020 pour l'Italie de 3 cas à  20 cas
import datetime

#Création des dates de début
dateDebutChine = datetime.datetime(2020, 1, 22)
dateDebutFrance = datetime.datetime(2020, 2, 25)
dateDebutItalie = datetime.datetime(2020 ,2, 21)

#Comme la France a démarrée aprés la chine et l'italie, on calcul le nombre de jours d'observations en France
nbjoursObservationsFrance = (max(datas['Date'])-dateDebutFrance).days

#Calcul des dates de fin
dateFinFrance = dateDebutFrance + datetime.timedelta(days=nbjoursObservationsFrance)
dateFinChine = dateDebutChine + datetime.timedelta(days=nbjoursObservationsFrance)
dateFinItalie = dateDebutItalie + datetime.timedelta(days=nbjoursObservationsFrance)
In [137]:
#Extraction des données en Chine
datasChine = datas[datas['Country'] == 'China'].reset_index()
datasChine['Date'] = pnd.to_datetime(datasChine['Date']) 
filtre = (datasChine['Date'] > dateDebutChine) & (datasChine['Date'] <= dateFinChine)
datasChine = datasChine.loc[filtre]
datasEvolutionChine = datasChine.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()

#Extraction des données en Italie
datasItalie = datas[datas['Country'] == 'Italy'].reset_index()
datasItalie['Date'] = pnd.to_datetime(datasItalie['Date']) 
filtre = (datasItalie['Date'] > dateDebutItalie) & (datasItalie['Date'] <= dateFinItalie)
datasItalie = datasItalie.loc[filtre]
datasEvolutionItalie = datasItalie.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()


#Extraction des données en France
datasFrance = datas[datas['Country'] == 'France'].reset_index()
datasFrance['Date'] = pnd.to_datetime(datasFrance['Date']) 
filtre = (datasFrance['Date'] > dateDebutFrance) & (datasFrance['Date'] <= dateFinFrance)
datasFrance = datasFrance.loc[filtre]
datasEvolutionFrance = datasFrance.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()
In [138]:
from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

#Creation d'un tableau comportant le nombre de jours pour l'affichage sur le graphique
jours = [i for i in range(nbjoursObservationsFrance)]

plt.plot(jours,datasEvolutionChine['Confirmed'],color='black',label='Cas confirmés en Chine')
plt.plot(jours,datasEvolutionFrance['Confirmed'],color='blue',label='Cas confirmés en France')
plt.plot(jours,datasEvolutionItalie['Confirmed'],color='orange',label='Cas confirmés en Italie')

plt.title('Vitesse d\'évolution du Coronavirus en Chine, Italie et France')
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()

On constate une évolution plus rapide du coronavirus en Italie qu'en France sur une même période de jours. Le jour de la date de départ a été choisie comme suit :

  • 22/01/2020 Pour la Chine (date de début de l'épidémie)
  • 25/02/2020 pour la France passant de 18 cas à 38 cas
  • 21/02/2020 pour l'Italie passant de 3 cas à 20 cas

Analyse des cas décèdés

In [139]:
from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

#Creation d'un tableau comportant le nombre de jours pour l'affichage sur le graphique
jours = [i for i in range(nbjoursObservationsFrance)]

plt.plot(jours,datasEvolutionChine['Deaths'],color='black',label='Décès en Chine')
plt.plot(jours,datasEvolutionFrance['Deaths'],color='blue',label='Décès en France')
plt.plot(jours,datasEvolutionItalie['Deaths'],color='orange',label='Décès en Italie')

plt.title('Nombre de décès en Chine, Italie et France sur une période donnée')
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()

EVOLUTION DU NOMBRE DE CAS CONFIRMES JOURNALIER

En chine

In [140]:
datasChine = datas[datas['Country'] == 'China'].reset_index()
datasEvolutionChine = datasChine.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()
In [141]:
valeurPrecedente = 0
listeEvolution = []
for index, observation in datasEvolutionChine.iterrows():
    evolution = observation['Confirmed'] - valeurPrecedente
    valeurPrecedente = observation['Confirmed']
    listeEvolution.append(evolution)

datasEvolutionChine['Evolution'] = listeEvolution 
In [142]:
from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

plt.bar(datasEvolutionChine['Date'],datasEvolutionChine['Evolution'],color='black',label='Nombre de nouveaux cas par jour')

plt.title('Nombre de nouveaux cas par jour en Chine')
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()
In [143]:
#Evolution sur les X derniers jours
nbJours = 5
from datetime import datetime, timedelta
dateMaximale = max(datasEvolutionChine['Date'])
#Le plus 1 sert à caluler le nombre de cas pour le premier jour en fonction du jour précédent
#Ce jour précédent sera ensuite supprimé
dateAuparavant = dateMaximale - timedelta(days=nbJours+1)

#Extraction des données
datasChine = datas[datas['Country'] == 'China'].reset_index()
filtre = (datasChine['Date'] > dateAuparavant) & (datasChine['Date'] <= dateMaximale)
datasChine = datasChine.loc[filtre]
datasEvolutionChine = datasChine.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()


#Calcul du nombre de nouveau cas et ajout d'une nouvelle colonne au dataFrame
valeurPrecedente = 0
listeEvolution = []
for index, observation in datasEvolutionChine.iterrows():
    evolution = observation['Confirmed'] - valeurPrecedente
    valeurPrecedente = observation['Confirmed']
    listeEvolution.append(evolution)


#On supprime la premiere ligne
import numpy as np
listeEvolution = np.array(listeEvolution)
listeEvolution = np.delete(listeEvolution, 0, 0)
datasEvolutionChine = datasEvolutionChine.drop(datasEvolutionChine.index[0]) 
datasEvolutionChine['Evolution'] = listeEvolution


from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

plt.plot(datasEvolutionChine['Date'],datasEvolutionChine['Evolution'],color='black',label='Nombre de nouveaux cas ces '+str(nbJours)+' derniers jours')

plt.title('Nombre de nouveaux cas ces '+str(nbJours)+' derniers jours en Chine')
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()
In [144]:
#Tendance
X = [i for i in range(0, len(listeEvolution))]

X = np.array(X).reshape((-1, 1))
Y = np.array(datasEvolutionChine['Evolution'])


from sklearn import linear_model
regr = linear_model.LinearRegression()
regr.fit(X, Y)
coef =  regr.coef_
if (coef == 0 ):
    evolutionChine = "Stable"

if (coef > 0 ):
    evolutionChine = "Augmentation"
    
if (coef < 0 ):
    evolutionChine = "Diminution"
    
print("Tendance = "+evolutionChine)
Tendance = Diminution

En Italie

In [145]:
datasItalie = datas[datas['Country'] == 'Italy'].reset_index()
datasEvolutionItalie = datasItalie.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()

valeurPrecedente = 0
listeEvolution = []
for index, observation in datasEvolutionItalie.iterrows():
    evolution = observation['Confirmed'] - valeurPrecedente
    valeurPrecedente = observation['Confirmed']
    listeEvolution.append(evolution)

datasEvolutionItalie['Evolution'] = listeEvolution 

from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

plt.bar(datasEvolutionItalie['Date'],datasEvolutionItalie['Evolution'],color='black',label='Nombre de nouveaux cas par jour')

plt.title('Nombre de nouveaux cas par jour en Italie')
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()
In [146]:
#Evolution sur les X derniers jours
nbJours = 5
from datetime import datetime, timedelta
dateMaximale = max(datasEvolutionChine['Date'])
#Le plus 1 sert à caluler le nombre de cas pour le premier jour en fonction du jour précédent
#Ce jour précédent sera ensuite supprimé
dateAuparavant = dateMaximale - timedelta(days=nbJours+1)

#Extraction des données
datasItalie = datas[datas['Country'] == 'Italy'].reset_index()
datasItalie['Date'] = pnd.to_datetime(datasItalie['Date']) 
filtre = (datasItalie['Date'] > dateAuparavant) & (datasItalie['Date'] <= dateMaximale)
datasItalie = datasItalie.loc[filtre]
datasEvolutionItalie = datasItalie.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()

#Calcul du nombre de nouveau cas et ajout d'une nouvelle colonne au dataFrame
valeurPrecedente = 0
listeEvolution = []
for index, observation in datasEvolutionItalie.iterrows():
    evolution = observation['Confirmed'] - valeurPrecedente
    valeurPrecedente = observation['Confirmed']
    listeEvolution.append(evolution)

#On supprime la premiere ligne
import numpy as np
listeEvolution = np.array(listeEvolution)
listeEvolution = np.delete(listeEvolution, 0, 0)
datasEvolutionItalie = datasEvolutionItalie.drop(datasEvolutionItalie.index[0]) 
datasEvolutionItalie['Evolution'] = listeEvolution


from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

plt.plot(datasEvolutionItalie['Date'],datasEvolutionItalie['Evolution'],color='black',label='Nombre de nouveaux cas ces '+str(nbJours)+' derniers jours')

plt.title('Nombre de nouveaux cas ces '+str(nbJours)+' derniers jours en Italie')
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()
In [147]:
#Tendance
X = [i for i in range(0, len(listeEvolution))]

X = np.array(X).reshape((-1, 1))
Y = np.array(datasEvolutionItalie['Evolution'])


from sklearn import linear_model
regr = linear_model.LinearRegression()
regr.fit(X, Y)
coef =  regr.coef_
if (coef == 0 ):
    evolutionItalie = "Stable"

if (coef > 0 ):
    evolutionItalie = "Augmentation"
    
if (coef < 0 ):
    evolutionItalie = "Diminution"
    
print("Tendance = "+evolutionItalie)
Tendance = Augmentation

En France

In [148]:
datasFrance = datas[datas['Country'] == 'France'].reset_index()
datasEvolutionFrance = datasFrance.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()

valeurPrecedente = 0
listeEvolution = []
for index, observation in datasEvolutionFrance.iterrows():
    evolution = observation['Confirmed'] - valeurPrecedente
    valeurPrecedente = observation['Confirmed']
    listeEvolution.append(evolution)

datasEvolutionFrance['Evolution'] = listeEvolution 

from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

plt.bar(datasEvolutionFrance['Date'],datasEvolutionFrance['Evolution'],color='black',label='Nombre de nouveaux cas par jour')

plt.title('Nombre de nouveaux cas par jour en France')
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()
In [149]:
#Evolution sur les X derniers jours
nbJours = 5
from datetime import datetime, timedelta
dateMaximale = max(datasEvolutionChine['Date'])
#Le plus 1 sert à caluler le nombre de cas pour le premier jour en fonction du jour précédent
#Ce jour précédent sera ensuite supprimé
dateAuparavant = dateMaximale - timedelta(days=nbJours+1)

#Extraction des données
datasFrance = datas[datas['Country'] == 'France'].reset_index()
datasFrance['Date'] = pnd.to_datetime(datasFrance['Date']) 
filtre = (datasFrance['Date'] > dateAuparavant) & (datasFrance['Date'] <= dateMaximale)
datasFrance = datasFrance.loc[filtre]
datasEvolutionFrance = datasFrance.groupby('Date')['Confirmed', 'Deaths', 'Recovered'].sum().reset_index()

#Calcul du nombre de nouveau cas et ajout d'une nouvelle colonne au dataFrame
valeurPrecedente = 0
listeEvolution = []
for index, observation in datasEvolutionFrance.iterrows():
    evolution = observation['Confirmed'] - valeurPrecedente
    valeurPrecedente = observation['Confirmed']
    listeEvolution.append(evolution)

#On supprime la premiere ligne
import numpy as np
listeEvolution = np.array(listeEvolution)
listeEvolution = np.delete(listeEvolution, 0, 0)
datasEvolutionFrance = datasEvolutionFrance.drop(datasEvolutionFrance.index[0]) 
datasEvolutionFrance['Evolution'] = listeEvolution


from matplotlib.pyplot import figure
figure(num=None, figsize=(12, 3), dpi=80, facecolor='w', edgecolor='k')

plt.plot(datasEvolutionFrance['Date'],datasEvolutionFrance['Evolution'],color='black',label='Nombre de nouveaux cas ces '+str(nbJours)+' derniers jours')

plt.title('Nombre de nouveaux cas ces '+str(nbJours)+' derniers jours en France')
plt.ylabel('Nombre de cas')
plt.xlabel('Dates')
plt.legend()
plt.show()
In [150]:
#Tendance
X = [i for i in range(0, len(listeEvolution))]

X = np.array(X).reshape((-1, 1))
Y = np.array(datasEvolutionFrance['Evolution'])


from sklearn import linear_model
regr = linear_model.LinearRegression()
regr.fit(X, Y)
coef =  regr.coef_
if (coef == 0 ):
    evolutionFrance = "Stable"

if (coef > 0 ):
    evolutionFrance = "Augmentation"
    
if (coef < 0 ):
    evolutionFrance = "Diminution"
    
print("Tendance = "+evolutionFrance)
Tendance = Augmentation

SYNTHESE

In [151]:
datasSynthese = [
            ["MONDE",confirmesMondial,decedesMondial,guerisMondial,mortaliteMondial,"-"],
            ["CHINE",confirmesChine,decedesChine,guerisChine,mortaliteChine,evolutionChine],
            ["ITALIE",confirmesItalie,decedesItalie,guerisItalie,mortaliteItalie,evolutionItalie],
            ["FRANCE",confirmesFrance,decedesFrance,guerisFrance,mortaliteFrance,evolutionFrance]
        ]
synthese = pnd.DataFrame (datasSynthese, columns = ['ZONE','NB CONFIRMES','NB DECEDES','NB GUERIS','TAUX MORTALITE','EVOLUTION'])
synthese
Out[151]:
ZONE NB CONFIRMES NB DECEDES NB GUERIS TAUX MORTALITE EVOLUTION
0 MONDE 105836 3558 58359 3.36 -
1 CHINE 80652 3070 55478 3.81 Diminution
2 ITALIE 5883 233 589 3.96 Augmentation
3 FRANCE 949 11 12 1.16 Augmentation
In [152]:
import folium

carteDuMonde = folium.Map(location=[0, 0], tiles='cartodbpositron',
               min_zoom=1.5, max_zoom=4, zoom_start=1.5)


for i in range(0, len(datas)):
    folium.Circle(
        location=[datas.iloc[i]['Lat'], datas.iloc[i]['Long']],
        color='crimson', 
        tooltip =   '<li><bold>Pays : '+str(datas.iloc[i]['Country'])+
                    '<li><bold>Province : '+str(datas.iloc[i]['ProvinceState'])+
                    '<li><bold>Confirmes : '+str(datas.iloc[i]['Confirmed'])+
                    '<li><bold>Decedes : '+str(datas.iloc[i]['Deaths'])+
                    '<li><bold>Gueris : '+str(datas.iloc[i]['Recovered']),
        radius=int(datas.iloc[i]['Confirmed'])).add_to(carteDuMonde)

#Affichage de la carte (cela prend un peu de temps)  
carteDuMonde
Out[152]: