title

Google Mobility Reports: quels impacts sur le comportement des Français face au Covid-19.

Cette statistique montre l'impact de l'épidémie de coronavirus sur le comportement social des Français à partir des données des Google LLC "Google COVID-19 Community Mobility Reports https://www.google.com/covid19/mobility/ 25/05/2020.

Cette fois, nous allons extraire les données du rapport mondial et représenter graphiquement les tendances de chaque secteur pour découvrir des informations intéressantes sur le comportement social et l'évolution de la période de confinement sur le marché.

Deux dates importantes sont mises en Ă©vidence dans les graphiques:

1- En rouge le premier décÚs de COVID19 - 25/02/2020

2- En noir le début des mesures de confinement - 17/03/2020

3- En vert le début du déconfinemen - 11/05/2020

Configurer les modules et les packages en python

In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns

Scrapping

In [2]:
#URL="https://www.gstatic.com/covid19/mobility/Global_Mobility_Report.csv"
#df=pd.read_csv(URL, low_memory=False) 
df=pd.read_csv('Global_Mobility_Report.csv', low_memory=False) 

Nettoyage et manipulation des données

In [3]:
df=df[df.country_region_code=='FR']
df['date'] =  pd.to_datetime(df['date'])
df.set_index(pd.DatetimeIndex(df['date']), inplace=True)
df.head()
Out[3]:
country_region_code country_region sub_region_1 sub_region_2 date retail_and_recreation_percent_change_from_baseline grocery_and_pharmacy_percent_change_from_baseline parks_percent_change_from_baseline transit_stations_percent_change_from_baseline workplaces_percent_change_from_baseline residential_percent_change_from_baseline
date
2020-02-15 FR France NaN NaN 2020-02-15 -2.0 -1.0 23.0 12.0 -2.0 -1.0
2020-02-16 FR France NaN NaN 2020-02-16 6.0 2.0 9.0 7.0 -1.0 -1.0
2020-02-17 FR France NaN NaN 2020-02-17 1.0 2.0 16.0 -6.0 -15.0 4.0
2020-02-18 FR France NaN NaN 2020-02-18 5.0 2.0 36.0 -4.0 -14.0 3.0
2020-02-19 FR France NaN NaN 2020-02-19 -4.0 -3.0 18.0 -6.0 -12.0 2.0
In [4]:
df.shape
Out[4]:
(1414, 11)
In [5]:
df.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1414 entries, 2020-02-15 to 2020-05-25
Data columns (total 11 columns):
 #   Column                                              Non-Null Count  Dtype         
---  ------                                              --------------  -----         
 0   country_region_code                                 1414 non-null   object        
 1   country_region                                      1414 non-null   object        
 2   sub_region_1                                        1313 non-null   object        
 3   sub_region_2                                        0 non-null      object        
 4   date                                                1414 non-null   datetime64[ns]
 5   retail_and_recreation_percent_change_from_baseline  1414 non-null   float64       
 6   grocery_and_pharmacy_percent_change_from_baseline   1414 non-null   float64       
 7   parks_percent_change_from_baseline                  1414 non-null   float64       
 8   transit_stations_percent_change_from_baseline       1414 non-null   float64       
 9   workplaces_percent_change_from_baseline             1414 non-null   float64       
 10  residential_percent_change_from_baseline            1408 non-null   float64       
dtypes: datetime64[ns](1), float64(6), object(4)
memory usage: 132.6+ KB
In [6]:
df.isnull().sum()
Out[6]:
country_region_code                                      0
country_region                                           0
sub_region_1                                           101
sub_region_2                                          1414
date                                                     0
retail_and_recreation_percent_change_from_baseline       0
grocery_and_pharmacy_percent_change_from_baseline        0
parks_percent_change_from_baseline                       0
transit_stations_percent_change_from_baseline            0
workplaces_percent_change_from_baseline                  0
residential_percent_change_from_baseline                 6
dtype: int64
In [7]:
df.drop('sub_region_2',1,inplace=True)
In [8]:
null_columns=df.columns[df.isnull().any()]
print(df[df.isnull().any(axis=1)][null_columns].head(63)) #The null values
           sub_region_1  residential_percent_change_from_baseline
date                                                             
2020-02-15          NaN                                      -1.0
2020-02-16          NaN                                      -1.0
2020-02-17          NaN                                       4.0
2020-02-18          NaN                                       3.0
2020-02-19          NaN                                       2.0
...                 ...                                       ...
2020-04-13          NaN                                      38.0
2020-04-14          NaN                                      31.0
2020-04-15          NaN                                      29.0
2020-04-16          NaN                                      31.0
2020-04-17          NaN                                      35.0

[63 rows x 2 columns]
In [9]:
list(df)
Out[9]:
['country_region_code',
 'country_region',
 'sub_region_1',
 'date',
 'retail_and_recreation_percent_change_from_baseline',
 'grocery_and_pharmacy_percent_change_from_baseline',
 'parks_percent_change_from_baseline',
 'transit_stations_percent_change_from_baseline',
 'workplaces_percent_change_from_baseline',
 'residential_percent_change_from_baseline']

Sélection des données

In [10]:
df.rename(columns={'sub_region_1': 'Province',
                   'retail_and_recreation_percent_change_from_baseline': 'Retail_and_Recreation', 
                   'grocery_and_pharmacy_percent_change_from_baseline':'Grocery_and_Pharmacy', 
                   'parks_percent_change_from_baseline':'Parks',
                   'transit_stations_percent_change_from_baseline': 'Transit_Stations',
                   'workplaces_percent_change_from_baseline':'Workplaces',
                   'residential_percent_change_from_baseline': 'Residences',
                   'date':'Date'},inplace=True)
In [11]:
df=df[['Date',
 'Province',
 'Retail_and_Recreation',
 'Grocery_and_Pharmacy',
 'Parks',
 'Transit_Stations',
 'Workplaces',
 'Residences']]
In [12]:
df.Province=df.Province.replace(np.nan, 'France (General)')
In [13]:
df.Province.value_counts()
Out[13]:
Nouvelle-Aquitaine            101
Bourgogne-Franche-Comté       101
France (General)              101
Île-de-France                 101
Normandy                      101
Provence-Alpes-CĂŽte d'Azur    101
Centre-Val de Loire           101
Auvergne-RhĂŽne-Alpes          101
Corsica                       101
Brittany                      101
Grand Est                     101
Pays de la Loire              101
Occitanie                     101
Hauts-de-France               101
Name: Province, dtype: int64
In [14]:
df.tail()
Out[14]:
Date Province Retail_and_Recreation Grocery_and_Pharmacy Parks Transit_Stations Workplaces Residences
date
2020-05-21 2020-05-21 Provence-Alpes-CĂŽte d'Azur -46.0 -27.0 61.0 -55.0 -73.0 20.0
2020-05-22 2020-05-22 Provence-Alpes-CĂŽte d'Azur -32.0 3.0 39.0 -46.0 -51.0 16.0
2020-05-23 2020-05-23 Provence-Alpes-CĂŽte d'Azur -44.0 -10.0 7.0 -40.0 -17.0 8.0
2020-05-24 2020-05-24 Provence-Alpes-CĂŽte d'Azur -46.0 -14.0 4.0 -39.0 -7.0 3.0
2020-05-25 2020-05-25 Provence-Alpes-CĂŽte d'Azur -29.0 -9.0 23.0 -40.0 -38.0 13.0

Nous avons classé nos dossiers selon les régions de France pour rendre notre étude plus spécifique

In [15]:
df.describe()
Out[15]:
Retail_and_Recreation Grocery_and_Pharmacy Parks Transit_Stations Workplaces Residences
count 1414.000000 1414.000000 1414.000000 1414.000000 1414.000000 1408.00000
mean -52.118812 -23.244696 -28.038190 -50.248939 -41.462518 17.46733
std 34.957583 25.239537 40.557805 34.953091 27.199084 12.34860
min -92.000000 -93.000000 -89.000000 -92.000000 -91.000000 -3.00000
25% -82.000000 -42.000000 -61.000000 -79.000000 -65.000000 4.00000
50% -71.000000 -24.000000 -45.000000 -69.000000 -48.000000 18.00000
75% -8.000000 0.000000 5.000000 -10.000000 -17.000000 28.00000
max 25.000000 53.000000 191.000000 60.000000 5.000000 45.00000

Nous créons notre DataFrame

In [16]:
df_FR=df[df.Province=='France (General)']
In [17]:
df_FR.describe()
Out[17]:
Retail_and_Recreation Grocery_and_Pharmacy Parks Transit_Stations Workplaces Residences
count 101.000000 101.000000 101.000000 101.000000 101.000000 101.000000
mean -53.009901 -22.861386 -31.584158 -51.287129 -42.792079 18.168317
std 34.963551 24.688066 38.333606 34.042719 27.778523 12.745250
min -91.000000 -87.000000 -82.000000 -88.000000 -89.000000 -1.000000
25% -83.000000 -40.000000 -64.000000 -80.000000 -68.000000 3.000000
50% -72.000000 -23.000000 -52.000000 -71.000000 -49.000000 19.000000
75% -8.000000 0.000000 5.000000 -6.000000 -14.000000 30.000000
max 8.000000 46.000000 66.000000 14.000000 1.000000 42.000000

Nous allons maintenant découvrir la mobilité des utilisateurs en fonction des lieux qu'ils ont visités pour elle, nous allons la classer par secteurs et la représenter graphiquement au cours de l'évolution de la période de confinement

title

Commerce de Détail et les Loisirs

Tendances de mobilité pour des endroits comme les restaurants, les cafés, les centres commerciaux, les parcs à thÚme, les musées, les bibliothÚques et les cinémas.

Analyse pour toute la France

In [18]:
df_FR['Retail_and_Recreation'].plot(figsize=(15,6))
plt.axvline(pd.Timestamp('2020-03-17'), color='black')
plt.axvline(pd.Timestamp('2020-02-25'), color='red')
plt.axvline(pd.Timestamp('2020-05-11'), color='green')
Out[18]:
<matplotlib.lines.Line2D at 0x21eea6c7cc0>

Analyse des séries chronologiques par les provinces sur la mobilité: le commerce de détail et les loisirs

In [19]:
plt.figure(figsize=(20,15))
RR=sns.lineplot(x="Date", y="Retail_and_Recreation", hue='Province', data=df)
sns.set(style="whitegrid")
RR.axes.set_title("Commerce de détail et les loisirs",fontsize=20)
RR.set_xlabel("Date",fontsize=15)
RR.set_ylabel("Commerce de détail et les loisirs: changement de mobilité",fontsize=15)
RR.tick_params(labelsize=12)
plt.xticks(rotation=85)
plt.setp(RR.get_legend().get_texts(), fontsize='15')
plt.setp(RR.get_legend().get_title(), fontsize='15') 
plt.axvline(pd.Timestamp('2020-03-17'), color='black')
plt.axvline(pd.Timestamp('2020-02-25'), color='red')
plt.axvline(pd.Timestamp('2020-05-11'), color='green')
Out[19]:
<matplotlib.lines.Line2D at 0x21eea591b70>

title

Épicerie et pharmacie

Tendances de mobilité pour des endroits comme les marchés d'épicerie, les entrepÎts alimentaires, les marchés de producteurs, les magasins d'alimentation spécialisés, les pharmacies et les pharmacies.

Analyse pour toute la France

In [20]:
df_FR['Grocery_and_Pharmacy'].plot(figsize=(15,6))
plt.axvline(pd.Timestamp('2020-03-17'), color='black')
plt.axvline(pd.Timestamp('2020-02-25'), color='red')
plt.axvline(pd.Timestamp('2020-05-11'), color='green')
Out[20]:
<matplotlib.lines.Line2D at 0x21eea67dc50>

Analyse des séries chronologiques par les provinces sur la mobilité: Épiceries et pharmacies

In [21]:
plt.figure(figsize=(20,15))
RR=sns.lineplot(x="Date", y="Grocery_and_Pharmacy", hue='Province', data=df)
sns.set(style="whitegrid")
RR.axes.set_title("Épiceries et pharmacies",fontsize=20)
RR.set_xlabel("Date",fontsize=15)
RR.set_ylabel("Épiceries et pharmacies: changement de mobilitĂ©",fontsize=15)
RR.tick_params(labelsize=12)
plt.xticks(rotation=85)
plt.setp(RR.get_legend().get_texts(), fontsize='15')
plt.setp(RR.get_legend().get_title(), fontsize='15') 
plt.axvline(pd.Timestamp('2020-03-17'), color='black')
plt.axvline(pd.Timestamp('2020-02-25'), color='red')
plt.axvline(pd.Timestamp('2020-05-11'), color='green')
Out[21]:
<matplotlib.lines.Line2D at 0x21eea9dca90>

title

Parcs

Tendances de mobilité pour des endroits comme les parcs locaux, les parcs nationaux, les plages publiques, les marinas, les parcs à chiens, les places et les jardins publics.

Analyse pour toute la France

In [22]:
df_FR['Parks'].plot(figsize=(15,6))
plt.axvline(pd.Timestamp('2020-03-17'), color='black')
plt.axvline(pd.Timestamp('2020-02-25'), color='red')
plt.axvline(pd.Timestamp('2020-05-11'), color='green')
Out[22]:
<matplotlib.lines.Line2D at 0x21eeaaf4710>

Analyse des séries chronologiques par les provinces sur la mobilité: Parcs

In [23]:
plt.figure(figsize=(20,15))
P=sns.lineplot(x="Date", y="Parks", hue='Province', data=df)
sns.set(style="whitegrid")
P.axes.set_title("Parcs",fontsize=20)
P.set_xlabel("Date",fontsize=15)
P.set_ylabel("Parcs: changement de mobilité",fontsize=15)
P.tick_params(labelsize=12)
plt.xticks(rotation=85)
plt.setp(P.get_legend().get_texts(), fontsize='15')
plt.setp(P.get_legend().get_title(), fontsize='15') 
plt.axvline(pd.Timestamp('2020-03-17'), color='black')
plt.axvline(pd.Timestamp('2020-02-25'), color='red')
plt.axvline(pd.Timestamp('2020-05-11'), color='green')
Out[23]:
<matplotlib.lines.Line2D at 0x21eea5e3d68>

title

Stations de transport

Tendances de mobilité pour des endroits comme les plaques tournantes des transports publics tels que les stations de métro, de bus et de train.

Analyse pour toute la France

In [24]:
df_FR['Transit_Stations'].plot(figsize=(15,6))
plt.axvline(pd.Timestamp('2020-03-17'), color='black')
plt.axvline(pd.Timestamp('2020-02-25'), color='red')
plt.axvline(pd.Timestamp('2020-05-11'), color='green')
Out[24]:
<matplotlib.lines.Line2D at 0x21eeadd5ba8>

Analyse des séries chronologiques par les provinces sur la mobilité: Stations de transport

In [25]:
plt.figure(figsize=(20,15))
T=sns.lineplot(x="Date", y="Transit_Stations", hue='Province', data=df)
sns.set(style="whitegrid")
T.axes.set_title("Stations de transport",fontsize=20)
T.set_xlabel("Date",fontsize=15)
T.set_ylabel("Parcs: changement de mobilité",fontsize=15)
T.tick_params(labelsize=12)
plt.xticks(rotation=85)
plt.setp(T.get_legend().get_texts(), fontsize='15')
plt.setp(T.get_legend().get_title(), fontsize='15') 
plt.axvline(pd.Timestamp('2020-03-17'), color='black')
plt.axvline(pd.Timestamp('2020-02-25'), color='red')
plt.axvline(pd.Timestamp('2020-05-11'), color='green')
Out[25]:
<matplotlib.lines.Line2D at 0x21eeb99b6d8>

title

Lieux de travail

Tendance de la mobilité pour les lieux de travail

Analyse pour toute la France

In [26]:
df_FR['Workplaces'].plot(figsize=(15,6))
plt.axvline(pd.Timestamp('2020-03-17'), color='black')
plt.axvline(pd.Timestamp('2020-02-25'), color='red')
plt.axvline(pd.Timestamp('2020-05-11'), color='green')
Out[26]:
<matplotlib.lines.Line2D at 0x21eebef5780>

Analyse des séries chronologiques par les provinces sur la mobilité: Lieux de travail

In [27]:
plt.figure(figsize=(20,15))
W=sns.lineplot(x="Date", y="Workplaces", hue='Province', data=df)
sns.set(style="whitegrid")
W.axes.set_title("Lieux de travail",fontsize=20)
W.set_xlabel("Date",fontsize=15)
W.set_ylabel("Lieux de travail: changement de mobilité",fontsize=15)
W.tick_params(labelsize=12)
plt.xticks(rotation=85)
plt.setp(W.get_legend().get_texts(), fontsize='15')
plt.setp(W.get_legend().get_title(), fontsize='15') 
plt.axvline(pd.Timestamp('2020-03-17'), color='black')
plt.axvline(pd.Timestamp('2020-02-25'), color='red')
plt.axvline(pd.Timestamp('2020-05-11'), color='green')
Out[27]:
<matplotlib.lines.Line2D at 0x21eebf48240>

title

Résidences

Tendances de mobilité pour les lieux de résidence.

Analyse pour toute la France

In [28]:
df_FR['Residences'].plot(figsize=(15,6))
plt.axvline(pd.Timestamp('2020-03-17'), color='black')
plt.axvline(pd.Timestamp('2020-02-25'), color='red')
plt.axvline(pd.Timestamp('2020-05-11'), color='green')
Out[28]:
<matplotlib.lines.Line2D at 0x21eec075cc0>

Analyse des séries chronologiques par les provinces sur la mobilité: Résidences

In [29]:
plt.figure(figsize=(20,15))
R=sns.lineplot(x="Date", y="Residences", hue='Province', data=df)
sns.set(style="whitegrid")
R.axes.set_title("RĂ©sidences",fontsize=20)
R.set_xlabel("Date",fontsize=15)
R.set_ylabel("Résidences: changement de mobilité",fontsize=15)
R.tick_params(labelsize=12)
plt.xticks(rotation=85)
plt.setp(R.get_legend().get_texts(), fontsize='15')
plt.setp(R.get_legend().get_title(), fontsize='15') 
plt.axvline(pd.Timestamp('2020-03-17'), color='black')
plt.axvline(pd.Timestamp('2020-02-25'), color='red')
plt.axvline(pd.Timestamp('2020-05-11'), color='green')
Out[29]:
<matplotlib.lines.Line2D at 0x21eec0c2f60>