← Blog
2026-05-02 · 10 min de lecture

« Votre rue est-elle sûre ? »
Construire une carte thermique de la criminalité au Luxembourg

Le Luxembourg publie les rapports de police sous forme de communiqués HTML en français et allemand. Nous les avons transformés en un score de sécurité géocodé, pondéré dans le temps, une carte thermique montrant où la criminalité se concentre et comment elle s’estompe. Voici la méthodologie, et les décisions étonnamment subtiles qu’elle a nécessitées.

Le problème des statistiques de criminalité

Les statistiques nationales vous disent que le Luxembourg est sûr. C’est vrai et inutile. Si vous choisissez entre deux appartements — l’un à Bonnevoie, l’autre au Limpertsberg — la moyenne nationale ne vous dit rien. Vous voulez savoir ce qui se passe dans votre rue.

Mais il n’existe pas d’API publique pour les données géolocalisées de criminalité au Luxembourg. La Police Grand-Ducale publie des communiqués sur police.public.lu : du HTML en texte libre, en français et allemand, avec des niveaux de détail géographique variables. Certains rapports nomment une rue. D’autres disent « à Esch-sur-Alzette ». D’autres ne donnent aucune localisation.

Nous avons construit un pipeline qui scrape ces rapports, les classifie, les géocode en trois niveaux de précision, et produit une surface de densité pondérée dans le temps — une carte thermique qui reflète où la criminalité se produit réellement, pondérée par la récence et la gravité.

Des communiqués de presse à une base de données

Le pipeline scrape police.public.lu toutes les deux semaines, récupérant environ 50 articles par exécution. Chaque article est parsé avec BeautifulSoup : titre, résumé, date de publication et texte intégral. La déduplication se fait par URL. Nous maintenons une fenêtre glissante de 12 mois — tout ce qui est plus ancien est supprimé.

La classification et l'extraction utilisent Claude Haiku, un modèle de langage léger. Le titre et le résumé de chaque article sont envoyés au modèle, qui extrait la catégorie de crime, la commune et le nom de rue en un seul appel. Les communiqués de police mélangent librement français et allemand, utilisent des formulations incohérentes, et décrivent parfois plusieurs incidents dans un seul article. Un modèle de langage gère naturellement cette ambiguïté.

Sept catégories, chacune avec un poids différent :

cambriolage1.5violence1.5drogue1.3vol1.2autre0.5circulation0.3arrestation0.2

Les poids encodent une perspective de sécurité résidentielle. Le cambriolage et la violence sont les plus pondérés car ils menacent directement la sécurité personnelle et du domicile. Les accidents de la route, bien que préoccupants, relèvent de la sécurité routière. Les arrestations ont le score le plus bas — paradoxalement, elles sont souvent un signal positif : un travail policier actif dans le secteur.

Rapports de police par categorie — fenetre glissante de 6 mois (hebdomadaire)
0510152025303540W44W48W52W04W08W12W16traffictheftburglaryviolencedrugarrestotherrapports

Le problème du géocodage : trois niveaux de certitude

La partie la plus difficile de ce pipeline n’est pas la classification — c’est de déterminer où un incident s’est produit. Les rapports de police varient énormément en spécificité géographique. Certains nomment une rue et un numéro. D’autres ne mentionnent qu’une commune. Certains ne donnent aucune localisation.

Nous extrayons la localisation en deux passes :

  1. Extraction de rue. Le modèle de langage extrait les noms de rue comme « Rue de Strasbourg », « Avenue de la Gare » ou « Route d’Arlon » du corps de l’article. Si trouvé, nous géocodons vers un point lat/lon sur cette rue.
  2. Extraction de commune. Si aucune rue n’est trouvée, nous cherchons les noms de commune (« à Bonnevoie », « in Esch », « zu Mamer »). Cela nous donne un centroïde de commune. Pour la Ville de Luxembourg, nous affinons avec une assignation point-dans-polygone à l’un des 25 quartiers.

Cela produit trois niveaux de précision. Chaque niveau détermine comment nous traitons l’incident en aval — spécifiquement, quelle largeur de « flou » nous appliquons en le plaçant sur la carte thermique.

?????theft · "in Bonnevoie"theft · Rue de Strasbourgtraffic · Route d'Arlon800 m200 mtheft (w 1.2)traffic (w 0.3)communetheftthefttrafficlowhighcombined density surface

Deux rayons de flou, une carte thermique

L’idée centrale : la taille du flou autour de chaque incident doit refléter notre degré de certitude sur sa localisation — pas simplement lisser le rendu.

La plupart des cartes thermiques utilisent le même flou pour chaque point. Nous en utilisons deux. Les incidents géolocalisés à la rue ont un flou serré avec un rayon de 200 m — nous savons à peu près où c’est arrivé, donc la chaleur reste concentrée autour de ce point. Les incidents au niveau commune ont un flou large avec un rayon de 800 m — « à Bonnevoie » peut signifier n’importe où dans le quartier, donc la chaleur est répartie sur toute la zone.

Les deux couches sont calculées sur une grille de 100 m couvrant le Luxembourg, puis additionnées. Le résultat : les rapports au niveau rue produisent des pics aigus et localisés, les rapports au niveau commune une lueur ambiante et diffuse — un fond doux plutôt qu’un faux point chaud.

Les rapports sans localisation extractible sont exclus de la carte thermique. Ils comptent dans les statistiques nationales, mais ils ne peuvent rien nous dire sur le « où ».

spread 200 m (street)spread 800 m (commune)0.00.20.40.60.81.002004006008001000120014001600incidentdensitydistance from incident (m)

Tous les crimes ne sont pas égaux, tous ne sont pas récents

Chaque incident entre dans la carte thermique avec un poids effectif qui combine deux facteurs : la gravité de la catégorie et la fraîcheur temporelle.

Décroissance de fraîcheur
si âge ≤ 30 jours : w = 1.0 (poids complet)
si 30 < âge ≤ 90 : w = 1.0 → 0.5 (linéaire)
si 90 < âge ≤ 180 : w = 0.5 → 0.0 (linéaire)
si âge > 180 : w = 0.0 (expiré)
full weightlinear decayfade-outburglary 12d — w=1.00theft 65d — w=0.71traffic 150d — w=0.17d=30, w=1.0d=90, w=0.5d=180, w=0.00.00.20.40.60.81.00306090120150180weightage (days)

Un cambriolage de la semaine dernière entre dans la carte à poids complet. Le même cambriolage trois mois plus tard ne contribue qu’à moitié. À six mois, il a disparu. La décroissance est linéaire par morceaux — plus simple qu’une exponentielle, plus facile à raisonner, et elle produit une fenêtre glissante nette de six mois plutôt qu’une queue asymptotique.

Poids effectif
poids_effectif = fraîcheur(âge) × poids_catégorie
Exemple : le poids en pratique
IncidentÂgeFraîcheurPoids cat.Effectif
Cambriolage, Rue de Strasbourg12 d1.001.51.50
Vol, Avenue de la Gare65 d0.711.20.85
Circulation, Route d'Arlon150 d0.170.30.05

Ainsi, un cambriolage d’il y a 12 jours entre à 1.0 × 1.5 = 1.50. Un accident de la route d’il y a 65 jours entre à 0.71 × 0.3 = 0.21. La carte thermique est simultanément pondérée par la récence et par la gravité.

Répartir le poids le long de la rue (prévu)

Quand un rapport de police dit « Rue de Strasbourg », l’incident ne s’est pas produit en un point magique unique — il s’est produit quelque part sur cette rue. Si nous plaçons tout le poids au centroïde du géocodeur, nous créons des points chauds artificiels aux emplacements des centroïdes.

L’amélioration prévue : lorsque nous disposons de la géométrie de la polyligne de la rue (depuis notre fichier de géométries), distribuer le poids de l’incident uniformément sur toute la longueur de la rue. Une rue avec 8 nœuds géométriques recevrait 1/8 du poids à chaque nœud. Le flou de la carte thermique lisserait ensuite ces points naturellement.

w = 1.0POINT: artificial hotspotw = 1/9POLYLINE: weight spread evenly

Cela éviterait un artefact courant en cartographie de la criminalité : des rues qui semblent dangereuses à leur point médian mais sûres à leurs extrémités, uniquement parce que le géocodeur renvoie le centroïde. La version actuelle utilise encore le placement en point unique ; la répartition le long de la polyligne est sur la feuille de route.

Disagrégation dasymétrique et vie privée

Les incidents au niveau commune posent un problème de distribution. « À Bonnevoie » ne signifie pas que le crime a autant de chances de s’être produit dans chaque rue de Bonnevoie. Les rues résidentielles denses sont des lieux plus probables que les parcs industriels ou les cimetières.

Nous utilisons la disagrégation dasymétrique : le poids de l’incident au niveau commune est distribué sur toutes les rues de la commune proportionnellement à leur densité d’adresses. Une rue avec 200 adresses reçoit 10× le poids d’une rue avec 20 adresses. C’est une technique standard en géographie de la population, appliquée ici à la densité criminelle.

La vie privée est assurée à deux niveaux. D’abord, tous les scores sont calculés au niveau du segment — des groupes de 20 numéros consécutifs, jamais des adresses individuelles. Ensuite, les rues avec moins de 5 incidents par an sont supprimées de la vue détaillée. Vous pouvez voir qu’un quartier a de la criminalité ; vous ne pouvez pas la localiser à un bâtiment précis.

Le score final : relatif, pas absolu

Le score de sécurité est un rang en percentile, pas une mesure absolue. La densité de la carte thermique de chaque segment est classée par rapport à tous les autres segments du Luxembourg. Les segments les plus sûrs obtiennent 100 ; les moins sûrs sont proches de 0.

C’est délibéré. Le Luxembourg est objectivement l’un des pays les plus sûrs d’Europe. Une échelle absolue de densité criminelle ne montrerait presque rien — la variation entre quartiers serait compressée dans une bande étroite près de zéro. Une échelle relative révèle la structure interne : quelles zones sont plus sûres que la moyenne, lesquelles ne le sont pas, et de combien.

Un avertissement crucial : un score de 0 ne signifie pas dangereux. Il signifie plus d'incidents déclarés que les autres rues du Luxembourg — un pays où la criminalité violente est exceptionnellement rare. Au cours des vingt dernières années, les meurtres au Luxembourg se comptent sur les doigts d'une main. La pire rue typique de nos données présente quelques vols et un cambriolage occasionnel, pas de crimes violents. Même une rue à score bas serait remarquablement sûre dans la plupart des villes européennes.

Cela signifie aussi que le classement est sensible aux événements rares. Si un seul incident grave survient dans une rue auparavant calme, son rang relatif peut basculer brusquement — non pas parce qu'elle est devenue fondamentalement dangereuse, mais parce qu'un seul point de données l'a fait passer devant des rues qui n'en avaient aucun. Le score reflète les tendances des incidents déclarés, pas un jugement permanent sur un quartier. D'une semaine à l'autre, un seul événement peut redistribuer les rangs d'une manière qui ne reflète pas un vrai changement de sécurité.

Score de sécurité
score_sécurité = 100 − rang_percentile(densité_carte_thermique)

Ce que cela ne capture pas

Limitations honnêtes, car la méthodologie n’est utile que si vous savez où elle échoue :

  • Biais de déclaration. Certaines zones sur-déclarent la criminalité ; d’autres sous-déclarent. Un quartier avec une veille de voisinage active peut générer plus de communiqués que celui où les incidents ne sont pas signalés. Nous mesurons la criminalité déclarée, pas la criminalité réelle.
  • Erreurs de classification. La classification par LLM est bonne mais imparfaite. Un article sur un cambriolage d’école utilisant une formulation inhabituelle peut atterrir dans « autre » au lieu de « cambriolage ». Nous auditons les erreurs de classification périodiquement mais le taux d’erreur est non nul.
  • Parcimonie temporelle. Le Luxembourg est un petit pays avec relativement peu d’incidents. Certaines communes n’ont que 2–3 incidents sur 12 mois. La KDE lisse cela, mais le signal est intrinsèquement bruité pour les zones à faible densité.
  • La fenêtre de 180 jours. Six mois de décroissance est un choix de jugement. Une fenêtre plus courte (90 jours) serait plus réactive mais plus bruyante. Une plus longue (365 jours) serait plus stable mais moins actuelle. Nous avons choisi 180 comme équilibre.
  • Événements extrêmes rares. Un classement en percentile fonctionne bien pour les types de crimes courants (vol, cambriolage) mais échoue pour les événements extrêmement rares comme un meurtre. Quand aucune rue n'a de meurtre, la catégorie ne contribue rien au classement. Si un seul meurtre survient, il peut dominer le score d'une rue et redistribuer l'ensemble du classement — même si un seul incident ne rend pas un quartier fondamentalement dangereux. Le scoring est conçu pour les tendances, pas les cas isolés.

Le score de sécurité est l’une des neuf métriques du système de scoring Wunnscheck. Pour la méthodologie complète — incluant la marchabilité, le bruit, le risque d’inondation et les transports publics — voir la documentation complète.

← Tous les articles