Données INSEE#

Links: notebook, html, PDF, python, slides, GitHub

Prétraitement des données IRIS.

from jyquickhelper import add_notebook_menu
add_notebook_menu()

Données carroyées population avec longitude, latitude#

Les données carrroyées sont disponibles à l’adresse suivante Données carroyées à 200m sur la population sous la forme de shapefile. On suppose que les données ont été téléchargées et décompressées. Le code suivant montre comme les lire. Ces données ne contiennent que les données de populations de 2010.

import pandas
carr = pandas.read_csv("c:/temp/insee/carroyage_insee_metro.csv")
carr.head()
WKT idINSPIRE id idk ind_c nbcar men men_surf men_occ5 men_coll ... ind_age2 ind_age3 ind_age4 ind_age5 ind_age6 ind_age7 i_age7 ind_age8 i_age8 ind_srf
0 POLYGON((2.6529953850426 46.440123156379,2.655... CRS3035RES200mN2619600E3756800 LAEA200M_N13098E18784 N13090E18781-N13103E18788 4.0 13 24 2353 19 0 ... 3.0 2.0 1.0 2.5 45.0 11.0 0 9.0 0 1083644
1 POLYGON((6.679135345427 46.191522591301,6.6817... CRS3035RES200mN2569800E4064400 LAEA200M_N12849E20322 N12849E20321-N12849E20324 1.0 4 15 1162 5 7 ... 0.0 2.0 1.0 2.5 28.0 3.0 0 3.0 0 725512
2 POLYGON((-1.9122518974954 48.142412902797,-1.9... CRS3035RES200mN2852200E3438400 LAEA200M_N14261E17192 N14258E17191-N14261E17194 8.0 5 26 2866 19 0 ... 2.0 2.0 3.0 4.5 47.0 13.0 0 5.0 0 1384589
3 POLYGON((3.2312378220814 46.926350456766,3.233... CRS3035RES200mN2669200E3805800 LAEA200M_N13346E19029 N13345E19029-N13347E19031 6.0 5 28 2427 15 4 ... 1.0 2.0 3.0 8.5 49.0 12.0 0 7.0 0 1308697
4 POLYGON((6.6327096470269 47.992073373622,6.635... CRS3035RES200mN2769800E4069600 LAEA200M_N13849E20348 N13845E20348-N13849E20351 32.5 8 28 3244 17 5 ... 1.0 3.0 2.0 1.5 46.0 13.0 0 5.0 0 1517997

5 rows × 29 columns

On convertit le dataframe en geodataframe.

import geopandas as gpd
import shapely.wkt

geometry = carr['WKT'].map(shapely.wkt.loads)
carr = carr.drop('WKT', axis=1)
crs = {'init': 'epsg:4326'}
gcarr = gpd.GeoDataFrame(carr, crs=crs, geometry=geometry)
gcarr.head().T
0 1 2 3 4
idINSPIRE CRS3035RES200mN2619600E3756800 CRS3035RES200mN2569800E4064400 CRS3035RES200mN2852200E3438400 CRS3035RES200mN2669200E3805800 CRS3035RES200mN2769800E4069600
id LAEA200M_N13098E18784 LAEA200M_N12849E20322 LAEA200M_N14261E17192 LAEA200M_N13346E19029 LAEA200M_N13849E20348
idk N13090E18781-N13103E18788 N12849E20321-N12849E20324 N14258E17191-N14261E17194 N13345E19029-N13347E19031 N13845E20348-N13849E20351
ind_c 4 1 8 6 32.5
nbcar 13 4 5 5 8
men 24 15 26 28 28
men_surf 2353 1162 2866 2427 3244
men_occ5 19 5 19 15 17
men_coll 0 7 0 4 5
men_5ind 0 1 1 2 1
men_1ind 4 3 5 6 6
i_1ind 0 0 0 0 0
men_prop 19 8 20 22 21
i_prop 1 0 1 1 0
men_basr 5 4 2 2 1
i_basr 0 0 0 0 0
ind_r 62.5 39.5 66.5 72.5 67.5
ind_age1 3 3 2 3 4
ind_age2 3 0 2 1 1
ind_age3 2 2 2 2 3
ind_age4 1 1 3 3 2
ind_age5 2.5 2.5 4.5 8.5 1.5
ind_age6 45 28 47 49 46
ind_age7 11 3 13 12 13
i_age7 0 0 0 0 0
ind_age8 9 3 5 7 5
i_age8 0 0 0 0 0
ind_srf 1083644 725512 1384589 1308697 1517997
geometry POLYGON ((2.6529953850426 46.440123156379, 2.6... POLYGON ((6.679135345427 46.191522591301, 6.68... POLYGON ((-1.9122518974954 48.142412902797, -1... POLYGON ((3.2312378220814 46.926350456766, 3.2... POLYGON ((6.6327096470269 47.992073373622, 6.6...

Données IRIS population#

Les données IRIS fournissent d’autres informations sur un quadrillage plus gros du territoire français :

Contours#

import os
os.listdir("C:/temp/insee/iris_evol_pop_2013")
['iris-2013-01-01.dbf',
 'iris-2013-01-01.prj',
 'iris-2013-01-01.shp',
 'iris-2013-01-01.shx']
import geopandas
geoiris = geopandas.read_file("c:/temp/insee/iris_evol_pop_2013/iris-2013-01-01.shp")
geoiris.head()
DEPCOM NOM_COM IRIS DCOMIRIS NOM_IRIS TYP_IRIS ORIGINE geometry
0 97201 L' AJOUPA-BOUILLON 0000 972010000 L'AJOUPA-BOUILLON Z POLYGON ((-61.09797143533286 14.83121003588694...
1 97202 LES ANSES-D'ARLET 0000 972020000 LES ANSES-D'ARLET Z POLYGON ((-61.07379117657102 14.54040539807739...
2 97203 BASSE-POINTE 0000 972030000 BASSE-POINTE Z POLYGON ((-61.08307142985399 14.85248314985411...
3 97204 LE CARBET 0000 972040000 LE CARBET Z POLYGON ((-61.15649300614872 14.73308036750109...
4 97205 CASE-PILOTE 0000 972050000 CASE-PILOTE Z POLYGON ((-61.12423374731185 14.69020654340677...

CAF#

import pandas
var = pandas.read_excel("c:/temp/insee/beneficiaires_CAF_31-12-2016.xls",
                        skiprows=5, sheet_name="Variables")
var.head(n=15)
VAR_ID VAR_LIB VAR_LIB_LONG
0 CODGEO Code géographique Code du quartier prioritaire, de l'Iris, de la...
1 LIBGEO Libellé géographique Nom du quartier prioritaire, de l'Iris, de la ...
2 EPCI1 Code EPCI au 1er janvier 2015 Code EPCI au 1er janvier 2015
3 EPCI2 Code EPCI au 1er janvier 2015 Code EPCI au 1er janvier 2015 pour les QPV loc...
4 EPCI Code EPCI au 1er janvier 2015 Code EPCI au 1er janvier 2015 pour les commune...
5 UU Code de l'unité urbaine Code de l'unité urbaine
6 REG Code région Code région (nouvelles régions au 1er janvier ...
7 REG2 Code région Code région (nouvelles régions au 1er janvier ...
8 DEPCOM Code commune Code la commune (pour la table Iris)
9 LIBCOM Libellé de la commune Libellé de la commune (pour la table Iris)
10 NOTE Note de diffusion Note de diffusion (voir documentation)
11 A Nombre total d'allocataires Nombre total de foyers allocataires percevant ...
12 PERCOU Personnes couvertes Nombre de personnes couvertes par au moins une...
13 AI Allocataires isolés sans enfant Nombre d'allocataires isolés sans enfant
14 AM Allocataires mono-parent Nombre de familles monoparentales (allocataire...
caf = pandas.read_excel("c:/temp/insee/beneficiaires_CAF_31-12-2016.xls",
                        skiprows=5, sheet_name="IRIS")
caf.head().T.head(n=15)
0 1 2 3 4
CODGEO 010040101 010040102 010040201 010040202 010330101
LIBGEO Les Perouses-Triangle d'Activite Longeray-Gare Centre-St Germain-Vareilles Tiret-Les Allymes Coupy-Vanchy
DEPCOM 01004 01004 01004 01004 01033
LIBCOM Ambérieu-en-Bugey Ambérieu-en-Bugey Ambérieu-en-Bugey Ambérieu-en-Bugey Bellegarde-sur-Valserine
EPCI 2.40101e+08 2.40101e+08 2.40101e+08 2.40101e+08 2.40101e+08
REG 84 84 84 84 84
NOTE 0 0 0 0 0
A 397 929 883 740 221
PERCOU 983 2256 2252 2358 584
AI 174 371 317 146 77
AM 52 174 187 107 22
ACSSENF 26 71 55 25 28
ACAVENF 145 313 324 462 94
AC3ENF 55 97 92 115 25
ENF 419 950 1005 1143 242

Extraire les carreaux ou codegeo#

records = [
    dict(lieu='Paris', Lat=48.866667, Lon=2.333333),
    dict(lieu='Charleville', Lat=49.76208500000001, Lon=4.726095999999984),
]
df = pandas.DataFrame(records)
df
Lat Lon lieu
0 48.866667 2.333333 Paris
1 49.762085 4.726096 Charleville
from shapely.geometry import Point
geometry = [Point(xy) for xy in zip(df.Lon, df.Lat)]
df = df.drop(['Lon', 'Lat'], axis=1)
crs = {'init': 'epsg:4326'}
gdf = geopandas.GeoDataFrame(df, crs=crs, geometry=geometry)
gdf
lieu geometry
0 Paris POINT (2.333333 48.866667)
1 Charleville POINT (4.726095999999984 49.76208500000001)
fusion = geopandas.sjoin(gdf, geoiris)
fusion
lieu geometry index_right DEPCOM NOM_COM IRIS DCOMIRIS NOM_IRIS TYP_IRIS ORIGINE
0 Paris POINT (2.333333 48.866667) 400244 75101 PARIS 1ER ARRONDISSEMENT 0301 751010301 PALAIS ROYAL 1 H
0 Paris POINT (2.333333 48.866667) 451142 75101 PARIS 1ER ARRONDISSEMENT 0301 751010301 PALAIS ROYAL 1 H
0 Paris POINT (2.333333 48.866667) 145754 75101 PARIS 1ER ARRONDISSEMENT 0301 751010301 PALAIS ROYAL 1 H
0 Paris POINT (2.333333 48.866667) 349346 75101 PARIS 1ER ARRONDISSEMENT 0301 751010301 PALAIS ROYAL 1 H
0 Paris POINT (2.333333 48.866667) 502040 75101 PARIS 1ER ARRONDISSEMENT 0301 751010301 PALAIS ROYAL 1 H
0 Paris POINT (2.333333 48.866667) 196652 75101 PARIS 1ER ARRONDISSEMENT 0301 751010301 PALAIS ROYAL 1 H
0 Paris POINT (2.333333 48.866667) 298448 75101 PARIS 1ER ARRONDISSEMENT 0301 751010301 PALAIS ROYAL 1 H
0 Paris POINT (2.333333 48.866667) 94856 75101 PARIS 1ER ARRONDISSEMENT 0301 751010301 PALAIS ROYAL 1 H
0 Paris POINT (2.333333 48.866667) 43958 75101 PARIS 1ER ARRONDISSEMENT 0301 751010301 PALAIS ROYAL 1 H
0 Paris POINT (2.333333 48.866667) 247550 75101 PARIS 1ER ARRONDISSEMENT 0301 751010301 PALAIS ROYAL 1 H
1 Charleville POINT (4.726095999999984 49.76208500000001) 419050 08105 CHARLEVILLE-MEZIERES 0502 081050502 LES FAUBOURGS-SUD H
1 Charleville POINT (4.726095999999984 49.76208500000001) 368152 08105 CHARLEVILLE-MEZIERES 0502 081050502 LES FAUBOURGS-SUD H
1 Charleville POINT (4.726095999999984 49.76208500000001) 317254 08105 CHARLEVILLE-MEZIERES 0502 081050502 LES FAUBOURGS-SUD H
1 Charleville POINT (4.726095999999984 49.76208500000001) 469948 08105 CHARLEVILLE-MEZIERES 0502 081050502 LES FAUBOURGS-SUD H
1 Charleville POINT (4.726095999999984 49.76208500000001) 164560 08105 CHARLEVILLE-MEZIERES 0502 081050502 LES FAUBOURGS-SUD H
1 Charleville POINT (4.726095999999984 49.76208500000001) 113662 08105 CHARLEVILLE-MEZIERES 0502 081050502 LES FAUBOURGS-SUD H
1 Charleville POINT (4.726095999999984 49.76208500000001) 266356 08105 CHARLEVILLE-MEZIERES 0502 081050502 LES FAUBOURGS-SUD H
1 Charleville POINT (4.726095999999984 49.76208500000001) 62764 08105 CHARLEVILLE-MEZIERES 0502 081050502 LES FAUBOURGS-SUD H
1 Charleville POINT (4.726095999999984 49.76208500000001) 215458 08105 CHARLEVILLE-MEZIERES 0502 081050502 LES FAUBOURGS-SUD H
1 Charleville POINT (4.726095999999984 49.76208500000001) 11866 08105 CHARLEVILLE-MEZIERES 0502 081050502 LES FAUBOURGS-SUD H

Même chose avec les données carroyées. Ca prend un petit peu de temps.

fusion = geopandas.sjoin(gdf, gcarr)
fusion
lieu geometry index_right idINSPIRE id idk ind_c nbcar men men_surf ... ind_age2 ind_age3 ind_age4 ind_age5 ind_age6 ind_age7 i_age7 ind_age8 i_age8 ind_srf
0 Paris POINT (2.333333 48.866667) 2139268 CRS3035RES200mN2890600E3759400 LAEA200M_N14453E18797 N14453E18797-N14453E18797 543.0 1 285 16016 ... 6.0 18.0 17.0 21.0 420.0 99.0 0 55.0 0 13526488
1 Charleville POINT (4.726095999999984 49.76208500000001) 1355467 CRS3035RES200mN2974600E3941200 LAEA200M_N14873E19706 N14873E19705-N14873E19706 1.0 2 167 12657 ... 4.0 14.5 12.5 6.0 216.0 65.0 0 36.0 0 4826513

2 rows × 31 columns

On peut changer l’opérateur appliqué d’intersection à contenu (op='within') selon la fusion souhaitée. Le code passe par une double boucle sjoin qui utilise des boucles avec des index type R-tree.