Sujet 3 : L'épidémie de choléra à Londres en 1854

En 1854, le quartier de Soho à Londres a vécu une des pires épidémies de choléra du Royaume-Uni, avec 616 morts. Cette épidémie est devenue célèbre à cause de l'analyse détaillée de ses causes réalisée par le médecin John Snow. Ce dernier a notamment montré que le choléra est transmis par l'eau plutôt que par l'air, ce qui était la théorie dominante de l'époque.
Un élément clé de cette analyse était une carte sur laquelle John Snow avait marqué les lieux des décès et les endroits où se trouvaient les pompes à eau publiques. Ces données sont aujourd'hui disponibles sous forme numérique. Nous vous proposons de les utiliser pour recréer la carte de John Snow dans un document computationnel réplicable.

Importation des données

Les données du nombre de morts du Choléra à Londres en 1854 ainsi que leurs localisations et la position des pompes dans la ville sont disponibles sur le site Web http://blog.rtwilson.com/john-snows-cholera-data-in-more-formats/. Pour nous protéger contre une éventuelle disparition ou modification du site faisons une copie locale de ce jeux de données que nous préservons avec notre analyse. Il est inutile et même risquée de télécharger les données à chaque exécution, car dans le cas d'une panne nous pourrions remplacer nos données par un fichier défectueux. Pour cette raison, nous téléchargeons les données seulement si la copie locale n'existe pas.

In [2]:
data_url = "http://rtwilson.com/downloads/SnowGIS_SHP.zip"
data_file = "SnowGIS_SHP.zip"

# Import data from url 
import os
import urllib.request
if not os.path.exists(data_file):
    urllib.request.urlretrieve(data_url, data_file)
In [3]:
# Unzip file 
import zipfile
zip = zipfile.ZipFile("SnowGIS_SHP.zip")
zip.extractall()
In [4]:
# Install geopandas
# ! python3 -m pip install geopandas
# Convert shapefile to GEOJSON
import geopandas 
shp_Cholera_Deaths = geopandas.read_file('SnowGIS_SHP/Cholera_Deaths.shp')
shp_Cholera_Deaths.to_file('SnowGIS_SHP/Cholera_Deaths.geojson', driver='GeoJSON')
shp_Pumps = geopandas.read_file('SnowGIS_SHP/Pumps.shp')
shp_Pumps.to_file('SnowGIS_SHP/Pumps.geojson', driver='GeoJSON')

Représentation des données

Ancienne carte de Londre

On représente sur une ancienne carte de Londres les pompes à eau publiques par des points bleus et les décès dûs au cholera par de points de taille proportionnelle à leur nombre à chaque position.

In [40]:
import matplotlib.pyplot as plt
%matplotlib inline 
# plots both elements
# Install rasterio
#! python3 -m pip install rasterio
import rasterio
import rasterio.plot as rsplot

# Import maps
London_map = rasterio.open('SnowGIS_SHP/OSMap_Grayscale.tif')

# coordinates and scaling factors
scale_x = London_map.transform[4]
scale_y = London_map.transform[0]
x0 = London_map.transform[2]
y0 = London_map.transform[5]

# translates back shapefile
shp_Pumps = geopandas.read_file('SnowGIS_SHP/Pumps.shp')
shp_Pumps.geometry = shp_Pumps.translate(-x0, -y0)
shp_Pumps.geometry = shp_Pumps.scale(-1.0/scale_x, -1.0/scale_y, origin=(0, 0, 0))
shp_Cholera_Deaths = geopandas.read_file('SnowGIS_SHP/Cholera_Deaths.shp')
shp_Cholera_Deaths.geometry = shp_Cholera_Deaths.translate(-x0, -y0)
shp_Cholera_Deaths.geometry = shp_Cholera_Deaths.scale(-1.0/scale_x, -1.0/scale_y, origin=(0, 0, 0))
# representation
fig, ax = plt.subplots(figsize=(12,12))
ax = rsplot.show(London_map.read(), with_bounds=True, ax=ax, cmap="gray")
shp_Pumps.plot(ax=ax, markersize=50)
shp_Cholera_Deaths.plot(ax=ax, color='red', markersize=shp_Cholera_Deaths['Count']*6)
ax.legend(labels=["pompes","morts du cholera"])
Out[40]:
<matplotlib.legend.Legend at 0x7ff049082dd8>

Par la suite on représente ces points sur la carte réalisée par John Snow en 1854 qui avait marqué les lieux des décès et les endroits où se trouvaient les pompes à eau publiques.

In [41]:
# Overlay it on John Snow’s original map
Snow_map = rasterio.open('SnowGIS_SHP/SnowMap.tif')
# coordinates and scaling factors
scale_x = Snow_map.transform[4]
scale_y = Snow_map.transform[0]
x0 = Snow_map.transform[2]
y0 = Snow_map.transform[5]

# translates back shapefile
shp_Pumps = geopandas.read_file('SnowGIS_SHP/Pumps.shp')
shp_Pumps.geometry = shp_Pumps.translate(-x0, -y0)
shp_Pumps.geometry = shp_Pumps.scale(-1.0/scale_x, -1.0/scale_y, origin=(0, 0, 0))
shp_Cholera_Deaths = geopandas.read_file('SnowGIS_SHP/Cholera_Deaths.shp')
shp_Cholera_Deaths.geometry = shp_Cholera_Deaths.translate(-x0, -y0)
shp_Cholera_Deaths.geometry = shp_Cholera_Deaths.scale(-1.0/scale_x, -1.0/scale_y, origin=(0, 0, 0))

fig, ax = plt.subplots(figsize=(12,12))
ax=rsplot.show(Snow_map.read(),with_bounds=True, ax=ax, cmap="gray")
shp_Pumps.plot(ax=ax,markersize=50)
shp_Cholera_Deaths.plot(ax=ax, color='red', markersize=shp_Cholera_Deaths['Count']*6)
ax.legend(labels=["pompes","morts du cholera"])
Out[41]:
<matplotlib.legend.Legend at 0x7ff0546a1c88>

On constate comme John Snow l'avait fait à l'époque que les décès dûs au Cholera se concentre autour de la pompe de la pompe de Broad Street dont l'eau était certainement contaminée.

Carte de Londres récente et interactive (OpenStreetMap)

Pour finir on utilise folium pour représenter sur une carte interactive de Londres, d'une part les pompes d'eau publiques par un icône goutte d'eau et d'autre part les morts du Cholera par des icônes noire avec une croix qui se regroupent sous la forme d'icônes circulaire indiquant le nombre de décès lorsque on dézoome la carte.

In [42]:
# Intsall folium module
#! python3 -m pip install folium
import numpy
import pandas
import folium
from folium.plugins import MarkerCluster
map = folium.Map(location=[51.5130, -0.1380], zoom_start=16)
Cholera_Deaths = geopandas.read_file('SnowGIS_SHP/Cholera_Deaths.geojson')
Pumps = geopandas.read_file('SnowGIS_SHP/Pumps.geojson')
marker_cluster = MarkerCluster().add_to(map)
folium.GeoJson(Cholera_Deaths, name="deaths", marker=folium.Marker(icon=folium.Icon(color='black', icon="times", prefix='fa'))).add_to(marker_cluster)
folium.GeoJson(Pumps, name="pumps", marker=folium.Marker(icon=folium.Icon(color='blue',icon='tint'))).add_to(map)
map
Out[42]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Cette carte met en évidence que la pompe de Broad Street est au centre de l'épidémie, en effet la densité des décès dans ce quartier est bien plus importante que dans le reste de la ville.