# Recensement 2021 — tables « aires de diffusion » (staging-recensement.db) Construit le 2026-08-08 par `scripts/build_recensement.py`. Livrable : `data/staging-recensement.db` (tables `da_poly`, `da_stats`, `meta`). ## Sources | Donnée | Source | URL | |---|---|---| | Polygones des AD | Statistique Canada, Fichiers des limites **cartographiques** 2021 (92-160-X), aires de diffusion, `lda_000b21a_e.zip` (197 Mo, shapefile) | https://www12.statcan.gc.ca/census-recensement/2021/geo/sip-pis/boundary-limites/files-fichiers/lda_000b21a_e.zip | | Statistiques | Profil du recensement 2021, **98-401-X2021006**, fichier « Québec » au niveau des aires de diffusion (CSV français, 6,5 Go décompressé) | https://www12.statcan.gc.ca/census-recensement/2021/dp-pd/prof/details/download-telecharger/comp/GetFile.cfm?Lang=F&FILETYPE=CSV&GEONO=006_Quebec | Attribution (licence ouverte de Statistique Canada) : **« Statistique Canada, Recensement de la population de 2021 »**. ## Méthodologie ### Polygones (`da_poly`) - Lecture du shapefile avec **pyshp** ; le fichier StatCan est projeté en Lambert conforme conique « NAD83 Statistics Canada Lambert » (**EPSG:3347**), reprojeté vers **WGS84 (EPSG:4326)** avec pyproj. - Filtres : `PRUID = 24` (Québec), puis intersection de la bbox WGS84 de chaque AD avec la zone de couverture des annonces Lou-Ka : **lat 44,9–47,7 / lng −74,6–−70,2** (Québec, Lévis, Grand Montréal + périphérie). Pré-filtre grossier sur la bbox projetée pour éviter de reprojeter les géométries hors zone. - `poly` = JSON, liste d'anneaux `[[lng, lat], …]` ; le 1er anneau d'un polygone shapefile est l'anneau extérieur, les suivants sont les trous ou les autres parties (multi-polygones). Un test point-dans-polygone **pair/impair sur l'ensemble des anneaux** gère correctement trous et multi-parties. Coordonnées arrondies à 6 décimales (~10 cm). ### Statistiques (`da_stats`) Le CSV de 6,5 Go est **streamé** (module `csv`, encodage latin-1, jamais chargé en mémoire). Les `ID_CARACTÉRISTIQUE` sont découverts dynamiquement en scannant la liste des caractéristiques de la première géographie du fichier (robuste aux renumérotations) ; les noms ambigus (« Français », « Locataire », « Baccalauréat ou grade supérieur » apparaissent plusieurs fois) sont résolus par position : première occurrence après la ligne « Total » de leur section. Variables retenues (valeur = colonne `C1_CHIFFRE_TOTAL`) : | Colonne | Caractéristique du profil (ID 2021) | Calcul | |---|---|---| | `population` | Population, 2021 (**1**) | direct | | `densite` | Densité de la population au kilomètre carré (**6**) | direct | | `age_median` | Âge médian de la population (**40**) | direct | | `revenu_median` | Revenu total médian des ménages en 2020 ($) (**243**) | direct | | `pct_locataires` | Locataire (**1416**) / Total ménages privés selon le mode d'occupation (**1414**) | 100 × 1416 ÷ 1414 | | `loyer_moyen` | Frais de logement mensuels moyens pour les logements occupés par un ménage locataire ($) (**1495**) | direct | | `pct_francais` | Français (**739**) / Total langue parlée le plus souvent à la maison (**735**) | 100 × 739 ÷ 735 | | `pct_univ` | Baccalauréat ou grade supérieur (**2024**) / Total plus haut certificat, diplôme ou grade, 25–64 ans (**2014**) | 100 × 2024 ÷ 2014 | Notes : - `loyer_moyen` = « frais de logement mensuels moyens » des ménages locataires (loyer + électricité/chauffage/services municipaux, définition StatCan) ; c'est la mesure standard du coût mensuel des logements loués dans le profil. - Valeurs supprimées par StatCan (confidentialité : symboles `x`, `F`, `..`, `...`) → **NULL** ; les pourcentages dont le numérateur ou le dénominateur est supprimé ou nul → **NULL**. Rien n'est imputé. - Revenu et scolarité proviennent des **données-échantillon (25 %)** ; population, âge et langue des données intégrales (100 %). ## Validations (exécutées le 2026-08-08, toutes réussies) - **11 317 AD** dans `da_poly` (sur 13 805 AD au Québec) — dans la fourchette attendue (8 000–13 000). Population couverte : **7 186 380** habitants. - **Couverture `da_stats` : 11 317 / 11 317 = 100 %** des DAUID de `da_poly`. - **Point de contrôle** : (46.8139, −71.2329) → DAUID **24231035** ✓ (identique au résultat de l'API ArcGIS StatCan, `geo.statcan.gc.ca/geo_wa/rest/services/2021/Cartographic_boundary_files/MapServer/12`). - **Échantillon de plausibilité** (point-dans-polygone puis lecture des stats, colonnes : revenu_median / pct_locataires / loyer_moyen / pct_francais / pct_univ) : | Secteur | DAUID | Revenu médian | % locataires | Loyer moyen | % français | % univ | |---|---|---|---|---|---|---| | Saint-Roch (Québec) | 24231032 | 65 000 $ | **79,3 %** | 1 136 $ | 93,3 % | 68,0 % | | Sillery (Québec) | 24230224 | **137 000 $** | **14,8 %** | 1 200 $ | 93,6 % | 61,7 % | | Plateau Mont-Royal (Mtl) | 24661965 | 57 200 $ | 76,7 % | 1 230 $ | 63,6 % | 76,6 % | Cohérent : Saint-Roch et le Plateau très locatifs, Sillery aisé et propriétaire, français plus faible sur le Plateau. - **Valeurs manquantes (suppression StatCan)** : revenu_median NULL pour 234 AD, loyer_moyen NULL pour 2 095 AD (AD avec peu ou pas de locataires), pct_locataires/pct_univ NULL pour 118 AD — laissées NULL, rien d'imputé. - Taille du livrable : `data/staging-recensement.db` ≈ **45 Mo**. Note : certaines AD rurales très étendues qui intersectent la zone débordent au nord (lat_max jusqu'à ~49,0) — comportement attendu du filtre par intersection de bbox. ## Reproduire ```bash # 1) télécharger les deux sources dans /tmp (URLs ci-dessus), dézipper # 2) construire : .venv/bin/python scripts/build_recensement.py \ --shp /tmp/louka-recensement/lda/lda_000b21a_e.shp \ --csv /tmp/louka-recensement/profil/98-401-X2021006_Francais_CSV_data_Quebec.csv \ --db data/staging-recensement.db --etape tout ```