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/ 05/20/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]:
(1246, 11)
In [5]:
df.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1246 entries, 2020-02-15 to 2020-05-13
Data columns (total 11 columns):
 #   Column                                              Non-Null Count  Dtype         
---  ------                                              --------------  -----         
 0   country_region_code                                 1246 non-null   object        
 1   country_region                                      1246 non-null   object        
 2   sub_region_1                                        1157 non-null   object        
 3   sub_region_2                                        0 non-null      object        
 4   date                                                1246 non-null   datetime64[ns]
 5   retail_and_recreation_percent_change_from_baseline  1246 non-null   float64       
 6   grocery_and_pharmacy_percent_change_from_baseline   1246 non-null   float64       
 7   parks_percent_change_from_baseline                  1246 non-null   float64       
 8   transit_stations_percent_change_from_baseline       1246 non-null   float64       
 9   workplaces_percent_change_from_baseline             1246 non-null   float64       
 10  residential_percent_change_from_baseline            1240 non-null   float64       
dtypes: datetime64[ns](1), float64(6), object(4)
memory usage: 116.8+ KB
In [6]:
df.isnull().sum()
Out[6]:
country_region_code                                      0
country_region                                           0
sub_region_1                                            89
sub_region_2                                          1246
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]:
Grand Est                     89
Hauts-de-France               89
Corsica                       89
France (General)              89
Normandy                      89
Auvergne-RhĂ´ne-Alpes          89
ĂŽle-de-France                 89
Centre-Val de Loire           89
Pays de la Loire              89
Brittany                      89
Bourgogne-Franche-Comté       89
Occitanie                     89
Provence-Alpes-CĂ´te d'Azur    89
Nouvelle-Aquitaine            89
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-09 2020-05-09 Provence-Alpes-CĂ´te d'Azur -75.0 -25.0 -68.0 -69.0 -39.0 19.0
2020-05-10 2020-05-10 Provence-Alpes-CĂ´te d'Azur -82.0 -51.0 -83.0 -77.0 -36.0 15.0
2020-05-11 2020-05-11 Provence-Alpes-CĂ´te d'Azur -45.0 -13.0 -37.0 -52.0 -45.0 17.0
2020-05-12 2020-05-12 Provence-Alpes-CĂ´te d'Azur -40.0 -4.0 12.0 -40.0 -43.0 15.0
2020-05-13 2020-05-13 Provence-Alpes-CĂ´te d'Azur -48.0 -10.0 -33.0 -48.0 -42.0 15.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 1246.000000 1246.000000 1246.000000 1246.000000 1246.000000 1240.000000
mean -53.341894 -25.101926 -34.081059 -50.548154 -42.381220 18.091935
std 36.925697 25.981180 37.141462 37.117815 27.809044 12.848955
min -92.000000 -93.000000 -89.000000 -92.000000 -91.000000 -3.000000
25% -83.000000 -43.000000 -62.000000 -80.000000 -66.000000 4.000000
50% -77.000000 -31.000000 -50.000000 -73.000000 -52.000000 21.000000
75% -6.000000 0.000000 -0.250000 -8.000000 -16.250000 29.000000
max 25.000000 53.000000 107.000000 60.000000 5.000000 45.000000

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 89.000000 89.000000 89.000000 89.000000 89.000000 89.000000
mean -54.044944 -24.629213 -36.887640 -51.606742 -43.539326 18.775281
std 37.056134 25.503289 36.841626 36.230518 28.566532 13.305632
min -91.000000 -87.000000 -82.000000 -88.000000 -89.000000 -1.000000
25% -83.000000 -42.000000 -66.000000 -80.000000 -68.000000 3.000000
50% -78.000000 -32.000000 -58.000000 -76.000000 -55.000000 22.000000
75% -6.000000 1.000000 1.000000 -6.000000 -14.000000 31.000000
max 8.000000 46.000000 45.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 0x2020221df28>

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 0x20202498eb8>

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 0x202025d8ba8>

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 0x2020284c278>

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 0x2020294af60>