Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

TP2 : Sélections, jointures et relations avec GeoPandas

Open in Colab Open in Kaggle Launch on Renku

Exécution dans le cloud : ce notebook peut aussi tourner dans le cloud (Colab, Kaggle, Renku). Avant de lancer les cellules, télécharge tp2.gpkg depuis le dossier OneDrive du cours et dépose-les dans le répertoire de travail du notebook (Colab : panneau 📁 → Upload ; Kaggle : File → Upload ; Renku : déjà dans le projet). Procédure complète : docs/cloud-badges.md.

TP2 : Sélections, jointures et relations avec GeoPandas

Ce TP est le pendant Python du TP QGIS 02. L’objectif est de travailler avec le même fichier tp2.gpkg et d’effectuer les mêmes opérations — sélections attributaires, requêtes spatiales, jointures et cartographie — mais en Python avec la librairie GeoPandas.


1. Chargement et exploration des données

Toutes les données sont stockées dans le fichier tp2.gpkg que tu peux trouver dans le dossier OneDrive du cours. Ce fichier contient les couches géographiques et les tables attributaires suivantes :

Couche / TableTypeDescription
CommunesPolygone382 communes vaudoises
geology_VDPolygoneCarte géologique du canton de Vaud
LI_Accident_tectoLigneAccidents tectoniques
BatimentsUNILPolygoneBâtiments du campus UNIL
ParcellesPolygoneParcelles cadastrales
Communes_CHPolygoneCommunes suisses (niveau national) — géométries pour la §6.7
VoituresPlusTableVéhicules / 1 000 hab. par commune (2010)
ProprietairesTablePropriétaires de parcelles
Proprietaire_ParcelleTableTable de relation parcelles ↔ propriétaires

Les couches géographiques se différencient des tables attributaires car elles possèdent une colonne de géométrie contenant la forme et la localisation de chaque objet géométrique. Pour pouvoir être manipulées en Python, les couches géométriques sont téléchargées sous forme de GeoDataFrame et les tables attributaires sous forme de DataFrame.

1.1 - Chargement et exploration des couches géographiques

Communes                   (382, 8)      CRS: EPSG:21781  geom: MultiPolygon
geology_VD                 (784, 23)     CRS: EPSG:21781  geom: MultiPolygon
LI_Accident_tecto          (12740, 7)    CRS: EPSG:21781  geom: MultiLineString
BatimentsUNIL              (24, 6)       CRS: EPSG:21781  geom: MultiPolygon
Parcelles                  (146, 9)      CRS: EPSG:21781  geom: MultiPolygon
<Figure size 1000x800 with 1 Axes>

1.2 - Chargement et exploration des tables attributaires

VoituresPlus          : (319, 6)  cols=['fid', 'OBJECTID', 'Communes', 'Voitures_de_tourisme', 'Motocycles', 'Voitures_de_tourisme__1000_hab']
Proprietaires         : (10, 4)  cols=['fid', 'OBJECTID', 'NO_PROPRI', 'NOM_PROPRI']
Proprietaire_Parcelle : (166, 4)  cols=['fid', 'OBJECTID', 'NO_IMM', 'NO_PROPRI']

Loading...

2. Requêtes attributaires

Les requêtes attributaires permettent de sélectionner des entités (lignes) en fonction de la valeur de leurs attributs. C’est l’équivalent Python des sélections par expression dans QGIS.

2.1 Sélection simple

La sélection simple permet de sélectionner les entités dont un attribut est égal à une certaine valeur. Elle peut être réalisée en utilisant l’expression gdf[gdf['col'] == valeur].

🗺️ Parallèle QGIS : Select Features by Value sur le champ LEG_TEC_3.

Expression QGIS équivalente :

"LEG_TEC_3" = 'Nappe de Morcles (Chaine des Aravis incl.)'
Entités sélectionnées : 15
Surface totale        : 25.2 km²
<Figure size 1000x700 with 1 Axes>

2.2 Sélection par intervalle

La sélection par intervalle permet de sélectionner les entités dont un attribut appartient à une plage de valeur spécifique. Elle peut être réalisée en utilisant l’expression gdf[(gdf['col'] >= min) & (gdf['col'] <= max)].

🗺️ Parallèle QGIS :

"AREA" >= 100000 AND "AREA" <= 500000

> Sélectionne les unités géologiques dont la surface est comprise entre 0.1 km² et 0.5 km².

Entités sélectionnées : 257
Surface min / max     : 0.101 – 0.499 km²

Top 8 unités les plus grandes dans la sélection :
 OBJECTID                              LEG_TEC_3         AREA
      371 Nappe des Prealpes medianes plastiques 499113.76660
       59        Molasse du plateau non deformee 497617.47903
      597 Nappe des Prealpes medianes plastiques 497112.90123
      405 Nappe des Prealpes medianes plastiques 495606.51972
      416                                        493335.01153
      121        Molasse du plateau non deformee 488855.05078
      675        Molasse du plateau non deformee 483708.52763
      684                                        483411.69578

2.3 Sélection multiple

La sélection multiple permet de sélectionner les entités dont un attribut est égal à une des valeurs présentes dans une liste. Elle peut être réalisée en utilisant l’expression gdf[gdf[col].isin(liste_val)].

🗺️ Parallèle QGIS :

"PRODUCTIV" IN ('Peu productifs, dans les moraines',
                'Productif, a productivite variable ou faible')
Entités sélectionnées : 334

Répartition par classe :
PRODUCTIV
Productif, a productivite variable ou faible    177
Peu productifs, dans les moraines               157
<Figure size 1000x700 with 1 Axes>

2.4 La méthode .query()

.query() permet d’exprimer des conditions sous forme de chaîne de caractères, proche de la syntaxe SQL utilisée dans QGIS.

# Condition simple
gdf.query("col == 'valeur'")

# Intervalle
gdf.query("col >= 100 and col <= 500")

# Variable externe (préfixe @)
seuil = 1000
gdf.query("col > @seuil")
Nappe de Morcles         : 15 entités
Petites unités (0.1–0.5 km²) : 257 entités
Grandes unités (1–10 km²): 270 entités
Molasse (> 1 km²)        : 101 entités

3. Requêtes spatiales

Une requête spatiale sélectionne des entités en fonction de leur relation géométrique avec d’autres entités.

En Python, les requêtes spatiales peuvent être réalisées en utilisant l’expression gpd.sjoin(gdf1, gdf2, predicate='intersects').

🗺️ Parallèle QGIS : Sélection par localisation (Select by Location)

Dans l’exemple ci-dessous, on combine :

  1. Filtrage attributaire (cf Section 2) — ne garder que les chevauchements principaux alpins

  2. Filtrage spatial — parmi ceux-ci, ne conserver que ceux qui intersectent le territoire vaudois (couche Communes)

Chevauchements alpins (total dataset)  : 6965
Type
Chevauchement principal alpin (certain)     5069
Chevauchement principal alpin (probable)    1896

Chevauchements dans Vaud               : 235
<Figure size 1000x700 with 1 Axes>

4. Jointures

Les jointures permettent de combiner deux tables sur la base d’un attribut commun (jointure attributaire) ou d’une relation géométrique (jointure spatiale).

4.1 Jointure attributaire

Une jointure attributaire peut être réalisée en utilisant l’expression df1.merge(df2, left_on=col_df1, right_on=col_df2).

🗺️ Parallèle QGIS : Jointures dans les propriétés de la couche.

Dans l’exemple ci-dessous, on veut répondre à la question : Quelles sont les communes où il y a le plus de voitures ? Pour y répondre, on joint la table VoituresPlus (véhicules / 1 000 hab.) à la couche Communes via leurs colonnes respectives NAME et Communes.

Loading...
Loading...
Résultat : (382, 11)
Communes sans données  : 82 / 382

Top 10 communes — véhicules / 1 000 hab. :
                NAME  Voitures_de_tourisme  Voitures_de_tourisme__1000_hab
            Bursinel                 509.0                     1043.032787
Villars-Sainte-Croix                 620.0                      925.373134
              Aclens                 435.0                      921.610169
  Chavannes-de-Bogis                 835.0                      877.100840
        Signy-Avenex                 372.0                      865.116279
                Mies                1410.0                      852.994555
              Cuarny                 144.0                      842.105263
           Bremblens                 398.0                      830.897704
       Bougy-Villars                 366.0                      824.324324
           Echandens                1756.0                      801.460520

4.2 Jointure spatiale

Une jointure spatiale peut être réalisée en utilisant l’expression gpd.sjoin(gdf1, gdf2, predicate='intersects').

🗺️ Parallèle QGIS : Join Attributes by Location (outil de géotraitement).

Dans l’exemple ci-dessous, on veut savoir dans quelle commune se trouve chaque bâtiment du campus UNIL. Utiliser gpd.sjoin() permet de comparer les géométries des deux couches et associe les attributs de la commune au bâtiment qui s’y trouve.

Résultat : (24, 9)

Commune de chaque bâtiment UNIL :
                            name          amenity                  NAME  BEZIRK
              Château de Dorigny       university Chavannes-près-Renens    2209
    Bibliothèque Edouard Fleuret       university Chavannes-près-Renens    2209
             Archives Cantonales       university Chavannes-près-Renens    2209
             Ferme de la Mouline       university Chavannes-près-Renens    2209
                        Geopolis       university Chavannes-près-Renens    2209
               Grange de Dorigny       university Chavannes-près-Renens    2209
                        Bergerie       university Chavannes-près-Renens    2209
                Ferme de Dorigny       university Chavannes-près-Renens    2209
                        Internef       university Chavannes-près-Renens    2209
                      Anthropole       university Chavannes-près-Renens    2209
                       Unicentre       university         Ecublens (VD)    2209
                          Serres       university         Ecublens (VD)    2209
                       Amphipole       university         Ecublens (VD)    2209
Institut Suisse de Droit Comparé       university         Ecublens (VD)    2209
                        Amphimax       university         Ecublens (VD)    2209
                       Unithèque          library         Ecublens (VD)    2209
                        Biophore       university         Ecublens (VD)    2209
                        Genopode       university         Ecublens (VD)    2209
                       Batochime       university         Ecublens (VD)    2209
                  La Maison Rose       university         Ecublens (VD)    2209
                Villa des Sports       university    Saint-Sulpice (VD)    2209
                      Vestiaires       university    Saint-Sulpice (VD)    2209
                 Centre Nautique       university    Saint-Sulpice (VD)    2209
          Chapelle Sainte-Claire place_of_worship    Saint-Sulpice (VD)    2209

4.3 Relations plusieurs-à-plusieurs (N-N)

🗺️ Parallèle QGIS : Relations dans les propriétés du projet QGIS.

Une relation N-N permet d’associer plusieurs attributs d’une entité à plusieurs attributs d’une autre entité. Par exemple, elle permet d’associer plusieurs propriétaires à une même parcelle (et vice-versa), via une table intermédiaire :

Parcelles ──(NO_IMM)──► Proprietaire_Parcelle ──(NO_PROPRI)──► Proprietaires

En Python, on enchaîne deux merge().

Résultat : (172, 6)
(une ligne par couple parcelle–propriétaire)

Parcelles avec plusieurs propriétaires :
NO_IMM  SURFACE_RF  NO_PROPRI     NOM_PROPRI
  1228       994.0          1       Aristote
  1228       994.0          3      Descartes
  1228       994.0          5         Thalès
  1228       994.0          7      Pythagore
   414      1700.0          7      Pythagore
   414      1700.0          1       Aristote
   437       761.0          6        Euclide
   437       761.0          1       Aristote
   457       608.0          7      Pythagore
   457       608.0          3      Descartes
   457       608.0          2       Ptolémée
   468      1787.0          9    Ératosthène
   468      1787.0          8         Pascal
   537       960.0          4         Platon
   537       960.0          9    Ératosthène
   537       960.0          8         Pascal
   559       657.0          7      Pythagore
   559       657.0          2       Ptolémée
   559       657.0          6        Euclide
   559       657.0          1       Aristote
   577       427.0          9    Ératosthène
   577       427.0          5         Thalès
   577       427.0          4         Platon
   577       427.0          1       Aristote
   577       427.0          6        Euclide
   577       427.0          5         Thalès
   585       480.0          2       Ptolémée
   585       480.0          3      Descartes
   652     10228.0          1       Aristote
   652     10228.0          5         Thalès
   652     10228.0          7      Pythagore
  DP 1       541.0         10 Domaine public
  DP 1       541.0         10 Domaine public
  DP 1      1530.0         10 Domaine public
  DP 1      1530.0         10 Domaine public
  DP 1      2418.0         10 Domaine public
  DP 1      2418.0         10 Domaine public
  DP 2      1354.0         10 Domaine public
  DP 2       999.0         10 Domaine public
  DP 2       999.0         10 Domaine public
  DP 2      1354.0         10 Domaine public

5. Cartographie choroplèthe

Une carte choroplèthe colore les polygones en fonction d’un attribut numérique. On visualise la densité de voitures par commune, issue de la jointure attributaire réalisée à la section 4.1.

5.1 Carte simple

<Figure size 1200x900 with 1 Axes>

5.2 Méthodes de discrétisation

Le choix de la méthode de discrétisation (classification) influence fortement la lecture de la carte.

Méthode (scheme=)Description
'quantiles'Classes contenant le même nombre d’entités
'equal_interval'Classes de même amplitude (intervalle de valeurs)
'natural_breaks' (Jenks)Minimise la variance intra-classe
<Figure size 1800x600 with 3 Axes>
<Figure size 1200x1000 with 1 Axes>

6. Régression linéaire et validation

Jusqu’ici, ce TP s’est concentré sur les géotraitements vectoriels. Cette dernière partie ouvre un fil conducteur qui se poursuit au TP03 et au TP04 : construire un modèle prédictif qui permette d’extrapoler à partir des observations. Pour ce faire, posons trois questions qui nous serviront de boussole au cours des prochains TPs et qu’il est nécessaire d’avoir en tête au début d’un projet de recherche en modélisation :

  1. Quel modèle choisir ?

  2. Comment le valider ?

  3. Comment quantifier son incertitude ?

Dans ce premier exercice, on combine des données attributaires (résultats de votation) et les géométries des communes suisses pour répondre à une question prédictive concrète :

Peut-on prédire le résultat de l’Initiative 10 millions (2026) à partir du vote pour la Loi Climat (2023) ?

VotationDateDescription courteRésultat national
Loi Climat (LCI)juin 2023Loi sur la protection du climat et l’innovation énergétiqueacceptée (59 %)
Initiative 10 millionsjuin 2026Initiative pour la durabilité démographiquerejetée (39 %)

Ces deux votations mobilisent des clivages politiques similaires (économie vs écologie, urbain vs rural). On s’attend donc à une corrélation forte à l’échelle communale — qu’on va quantifier, modéliser et valider.

6.1 Chargement et préparation des données

Communes retenues : 2099
  LCI — taux OUI : moy=50.6%  [7.5 – 82.4%]
  10M — taux OUI : moy=52.1%  [16.3 – 90.4%]
Loading...

6.2 Corrélation et visualisation

Avant de modéliser, on quantifie le lien linéaire entre les deux variables avec le coefficient de Pearson

r=∑i(xi−xˉ)(yi−yˉ)∑i(xi−xˉ)2∑i(yi−yˉ)2r = \frac{\sum_i (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_i (x_i - \bar{x})^2}\sqrt{\sum_i (y_i - \bar{y})^2}}

qui varie de −1 (corrélation négative parfaite) à +1 (corrélation positive parfaite), 0 indiquant l’absence de lien linéaire.

Le coefficient de détermination R2R^2 mesure la proportion de variance de yy expliquée par le modèle :

R2=1−SSresSStot=1−∑i(yi−y^i)2∑i(yi−yˉ)2R^2 = 1 - \frac{SS_{res}}{SS_{tot}} = 1 - \frac{\sum_i (y_i - \hat{y}_i)^2}{\sum_i (y_i - \bar{y})^2}

où yiy_i représente la valeur observée, y^i\hat{y}_i la valeur prédite par le modèle, et yˉ\bar{y} la moyenne de toutes les valeurs observées de yy. SSresSS_{res} est la somme des carrés des résidus (l’erreur du modèle) et SStotSS_{tot} la variance totale de yy autour de sa moyenne. R2=1R^2 = 1 signifie un ajustement parfait ; R2=0R^2 = 0 signifie que le modèle ne fait pas mieux que prédire systématiquement la moyenne yˉ\bar{y}. Pour une régression linéaire simple à un seul prédicteur, R2=r2R^2 = r^2. Pour un modèle à plusieurs prédicteurs (TP03), R2R^2 reste défini par cette formule générale, même si rr n’a plus de sens univarié.

Une corrélation négative est attendue ici : les communes qui ont massivement voté OUI à la Loi Climat (sensibilité environnementale élevée) ont tendance à rejeter l’Initiative 10 millions (perçue comme anti-immigration ou anti-croissance), et vice-versa.

r = -0.891   p-value = 0.00e+00
→ Corrélation forte et négative (R² = 0.794)
<Figure size 800x600 with 1 Axes>

6.3 Régression OLS — intervalles de confiance et de prédiction

La régression OLS (Ordinary Least Squares) ajuste une droite y^=a⋅x+b\hat{y} = a \cdot x + b qui minimise la somme des carrés des résidus.

statsmodels fournit deux types d’intervalles autour de cette droite :

IntervalleSignificationLargeur
Intervalle de confiance (IC)Incertitude sur la moyenne de yy pour une valeur de xx donnéeÉtroit
Intervalle de prédiction (IP)Incertitude sur une observation individuelle pour la même valeur de xxLarge (inclut la variance résiduelle)

En pratique : l’IC s’applique pour estimer la tendance centrale, l’IP pour prédire une commune spécifique.

===============================================================================
                  coef    std err          t      P>|t|      [0.025      0.975]
-------------------------------------------------------------------------------
Intercept      98.0527      0.524    187.212      0.000      97.026      99.080
oui_pct_lci    -0.9072      0.010    -89.831      0.000      -0.927      -0.887
===============================================================================

R² = 0.794
<Figure size 900x600 with 1 Axes>

6.4 Surapprentissage (overfitting)

Un modèle avec trop de paramètres libres par rapport au nombre d’observations peut coller presque parfaitement aux données d’entraînement — bruit compris. Il mémorise l’échantillon au lieu d’apprendre la tendance réelle, et généralise mal à de nouvelles données : c’est le surapprentissage (overfitting).

Pour le voir concrètement, on compare une droite (peu flexible, 2 paramètres) à un polynôme de degré 6 (très flexible, 7 paramètres), tous deux ajustés sur un petit échantillon de 15 communes. Avec aussi peu de points, un modèle flexible a la place d’onduler entre chaque observation plutôt que de suivre la tendance générale.

On évalue ensuite les deux modèles sur les communes restantes, jamais vues lors de l’ajustement.

<Figure size 900x600 with 1 Axes>
Degré   R² (entraînement, n=15)   R² (reste, jamais vu)   
1       0.643                     0.786                   
6       0.719                     -114.627                

Le polynôme de degré 6 explique mieux les 15 points d'entraînement que la droite,
mais généralise beaucoup plus mal (R² très négatif, bien pire que de prédire la
moyenne) : il a appris le bruit de cet échantillon précis, pas la tendance réelle.

6.5 Validation — séparation entraînement / test

La démonstration précédente (§6.4) montre le symptôme du surapprentissage dans un cas extrême. En pratique, on ne compare pas visuellement des courbes : on mesure la capacité de généralisation avec un protocole systématique, applicable à n’importe quel modèle — même un modèle aussi simple qu’une droite OLS.

Les métriques calculées sur l’ensemble complet (model_ols.rsquared) restent optimistes, pour la même raison que ci-dessus : le modèle a été ajusté sur exactement ces données, donc il les « connaît » déjà. Pour estimer la capacité prédictive réelle (généralisation), on évalue le modèle sur des données qu’il n’a jamais vues :

  1. On divise aléatoirement en entraînement (80 %) et test (20 %).

  2. On ajuste le modèle uniquement sur l’entraînement.

  3. On évalue sur le test.

La §6.6 revient en détail sur les métriques utilisées pour évaluer ce modèle, et sur la question — trop souvent négligée — de savoir si le résultat obtenu est réellement bon.

Entraînement : 1679 communes   Test : 420 communes
R² (test) = 0.763

6.6 Métriques d’évaluation et benchmarking

Le R² calculé en §6.5 résume la performance en un seul chiffre, mais un projet de modélisation a généralement besoin d’un ensemble de métriques adaptées à différents usages, et surtout d’un point de comparaison pour savoir si ce chiffre est bon.

Trois métriques, trois usages différents :

MétriqueFormuleUnitéUsage
R²
1−SSres/SStot1 - SS_{res}/SS_{tot}
sans unité, ∈ ]−∞, 1]Comparer des modèles entre eux, même sur des variables cibles différentes
MAE (Mean Absolute Error)
1n∑i∣yi−y^i∣\frac{1}{n}\sum_i \lvert y_i - \hat{y}_i \rvert
même unité que yy (points de %)Erreur « typique », facile à expliquer à un public non technique
RMSE (Root Mean Square Error)
1n∑i(yi−y^i)2\sqrt{\frac{1}{n}\sum_i (y_i - \hat{y}_i)^2}
même unité que yy (points de %)Comme MAE, mais pénalise davantage les grosses erreurs (utile si
une grosse erreur coûte disproportionnellement plus cher)

RMSE ≥ MAE toujours (égalité seulement si toutes les erreurs ont la même amplitude) : un grand écart entre les deux signale quelques erreurs très importantes plutôt qu’une erreur uniformément répartie.

Le benchmarking : un chiffre seul ne veut rien dire. Un MAE de quelques points de % est-il bon ? Impossible à dire sans point de comparaison. Le plus simple est un modèle naïf (benchmark) qui ignore le prédicteur et prédit toujours la moyenne d’entraînement — c’est exactement la situation R2=0R^2 = 0 (§6.2). Un modèle qui ne fait pas mieux que ce benchmark n’apporte aucune information utile, quel que soit son R² en apparence raisonnable sur le papier. On calcule ci-dessous les trois métriques pour ce benchmark et pour le modèle OLS (§6.5), sur le même jeu de test, pour une comparaison directe.

💡 Bonne pratique : dans un projet réel, définis ton benchmark avant de regarder les résultats de ton modèle. Choisir un point de comparaison après coup risque de le sélectionner, consciemment ou non, pour flatter le modèle qu’on a déjà.

Métrique  Benchmark (moyenne)   Modèle OLS  
R²        -0.003                0.763       
MAE       9.10                  3.86        
RMSE      11.22                 5.45        

Le benchmark a un R² ≈ 0 : sans surprise, « toujours prédire la moyenne » n'explique
aucune variance (§7.2). Le modèle OLS réduit le MAE de 58 % par rapport à ce benchmark.
Interprétation : en moyenne, l'erreur de prédiction du modèle est ±3.9 points de %,
contre ±9.1 points de % pour le benchmark — le modèle apporte une information réelle,
pas seulement un ajustement qui a l'air raisonnable sur le papier.

6.7 Sélection géographique vs aléatoire

Le split aléatoire de la §6.5 disperse les communes test sur tout le territoire : chaque commune test a des voisines dans l’entraînement, ce qui aide implicitement le modèle. En pratique, on souhaite souvent prédire pour une région entière — un canton, une zone linguistique — à partir des autres. C’est un changement de contexte d’apprentissage : le modèle doit généraliser à une population différente de celle sur laquelle il a été entraîné, pas seulement à de nouvelles observations de la même population.

On compare, à effectif d’entraînement identique (même nombre de communes des deux côtés, pour une comparaison équitable — pas le split 80/20 de la §6.5, dont les proportions diffèrent) :

  • Split aléatoire : entraînement sur un tirage aléatoire de communes, test sur le reste, mélangés sur tout le territoire.

  • Split géographique : entraînement uniquement sur la Suisse alémanique, test sur la Romandie et le Tessin — une région entière, jamais vue à l’entraînement.

C’est une autre facette du surapprentissage (§6.4) : même un modèle aussi simple qu’une droite OLS peut « surapprendre » le contexte particulier de ses données d’entraînement (ici, une région du pays), sans que cela se voie dans un split aléatoire classique.

Comment lire la figure ci-dessous. La rangée du haut montre la géographie de chaque séparation — quelles communes servent à l’entraînement (gris) et lesquelles au test (orange) : dispersées sur tout le pays à gauche, regroupées en un bloc contigu à droite. La rangée du bas montre les résidus correspondants sur le jeu de test. On surveille surtout le biais moyen annoté sous chaque carte : proche de zéro pour le split aléatoire (les erreurs se compensent d’une région à l’autre), mais nettement décalé pour le split géographique — le modèle se trompe systématiquement sur une région entière qu’il n’a jamais vue, ce qu’un simple R² global masquerait.


Récapitulatif

Parties 1–5 — Géotraitements vectoriels avec GeoPandas

Opération QGISCode Python
Sélection par expressiongdf[gdf['col'] == val], .isin(), .query()
Sélection par localisationgpd.sjoin(predicate='intersects')
Jointure attributairedf.merge(other, left_on=..., right_on=...)
Relation N-Ndouble merge() via table intermédiaire
Carte choroplèthe.plot(column=..., scheme=..., cmap=...)

Partie 6 — Régression linéaire et validation

ÉtapeCode clé
Corrélation de Pearsonscipy.stats.pearsonr(x, y)
OLS avec intervallessmf.ols(...).fit() + .get_prediction().summary_frame()
Démonstration du surapprentissagenp.polyfit(x, y, deg=6) sur un petit échantillon
Split entraînement/testtrain_test_split(X, y, test_size=0.2)
Métriquesr2_score, mean_absolute_error, RMSE via np.sqrt(np.mean((y_true - y_pred)**2))
Benchmarkcomparer aux métriques d’un modèle naïf (prédire la moyenne d’entraînement)
Split géographiqueentraîner sur un sous-ensemble régional, évaluer sur le reste

Points clés à retenir :

  • R2=1−SSres/SStotR^2 = 1 - SS_{res}/SS_{tot} ; pour une régression simple à un prédicteur, R2=r2R^2 = r^2.

  • R² est sans unité (comparer des modèles) ; MAE et RMSE sont dans l’unité de yy (interpréter une erreur concrète) ; RMSE ≥ MAE toujours, l’écart entre les deux révèle des erreurs ponctuellement grandes.

🎯 Bonnes pratiques ML — niveau 1 : les fondamentaux

PrincipeOù on l’a vu
Ne jamais évaluer un modèle sur les données qui ont servi à l’entraîner, la performance mesurée est alors malhonnête. Quand une partie des données d’évaluation sont incluses dans l’entraînement, on parle alors de “data leakage” (fuite de données) et c’est un concept auquel il faut être particulièrement attentif lorsqu’on code en utilisant des chatbots.§6.4 (surapprentissage), §6.5 (train/test)
Toujours comparer à un benchmark, un chiffre de performance seul ne veut rien dire, même s’il « a l’air raisonnable »§6.6
Choisir la métrique adaptée à la question : R² pour comparer des modèles, MAE/RMSE pour une erreur directement interprétable§6.6
Réfléchir à qui compose le jeu de test, pas seulement à sa taille : un split aléatoire peut cacher un échec de généralisation qu’un split structuré (ici, géographique) révèle§6.7

Ces quatre principes sont les fondations de tout projet de modélisation, indépendamment du modèle utilisé.


📝 Quiz Moodle

Une fois ce TP terminé, teste tes connaissances avec le quiz Moodle du TP2 :

👉 Ouvrir le quiz du TP2 sur Moodle (accès réservé aux étudiant·e·s UNIL)