Icioola
Mon classement

Spécification de la méthode Icioola (v1.4)

Version 1.4 · publiée le 2026-08-16 (v1.0), révisée le 2026-08-28 (v1.1), le 2026-10-02 (v1.2, poids SR), le 2026-10-09 (v1.3, note publique en valeur) et le même soir (v1.4, le Français médian à 50, sécurité en trois parts), texte réaligné sur le code le 2026-09-18 · licence CC BY 4.0

Le nom du fichier reste SPEC-METHODE-v1.0.md pour que les liens déjà posés ne tombent pas ; la version en vigueur est celle écrite ci-dessus, et la même que la clé spec des vecteurs dorés.

Ce document décrit comment Icioola transforme des données publiques en notes, en classements et en lettres A–E. Il est écrit pour être réimplémenté : chaque formule est accompagnée d'un exemple numérique, et chaque exemple figure dans les vecteurs dorés (web/src/engine/golden/vecteurs.json), rejoués à chaque build côté TypeScript et côté Python.

Si vous réimplémentez cette spécification et que vous ne retrouvez pas ces nombres, l'un de nous deux a tort — et c'est vérifiable.

Ce que cette spec n'est pas. Ce n'est pas une justification. Les choix décrits ici sont défendables, pas neutres ; là où ils sont discutables, la section « Questions ouvertes » le dit plutôt que de le maquiller.

0. Vue d'ensemble

Icioola produit deux grandeurs différentes, et les confondre est l'erreur la plus courante :

Le matchLa note de qualité de vie
Répond à« où moi devrais-je vivre ? »« quelle est la qualité de cette commune ? »
Dépend devos priorités, votre budget, votre trajetrien — elle est la même pour tout le monde
Compare àtoutes les communes de Franceles communes de taille comparable (bande, §1.2)
Calculéedans le navigateur, à chaque changementune fois, au build
Publiée dansvotre classement personnelles palmarès, les fiches, l'API

Les deux partagent la même agrégation non compensatoire (§3) et la même conversion en percentiles (§2) ; elles diffèrent par la population de référence de ces percentiles.


1. Les entrées

1.1 Indicateurs

Un indicateur est une valeur publique rattachée à une commune, avec son millésime. Aucune valeur n'est estimée, interpolée ou imputée à la source : ce qui n'est pas publié reste absent.

Chaque indicateur porte un sens favorable. Pour la plupart, plus grand est meilleur ; pour certains, l'inverse — prix, loyers, délinquance enregistrée, bruit, NO₂, taxe foncière, distances (au grand espace naturel, à l'eau, aux urgences). Ce sens est déclaré, jamais deviné (schema.INDICATOR_INVERTED).

1.2 Population de référence : une bande continue

Une commune n'est comparable qu'à des communes de taille voisine pour la note de qualité de vie : un village n'a pas les équipements d'une métropole, et la délinquance _enregistrée_ par habitant dépend fortement de l'activité d'un centre-ville.

Depuis le 2026-08-19, cette comparaison se fait dans une bande de population continue : les pairs d'une commune sont celles dont la population va du tiers au triple de la sienne (normalize.PEER_RATIO = 3). Quand la bande compte moins de cinq communes, elle s'élargit aux plus proches voisines en taille jusqu'à en compter cinq (PAIRS_MIN = 5). Il n'y a donc aucun seuil brutal : 9 999 et 10 001 habitants ont des pairs presque identiques.

Les trois classes de taille ne servent plus qu'à publier. Il faut bien des listes : les palmarès et le rang national sont rangés en trois classes, aux bornes suivantes.

ClassePopulation
villagemoins de 10 000 habitants
moyenne10 000 à 49 999
grande50 000 et plus

Population inconnue ⇒ village. La classe range ; elle ne calcule aucun percentile.

Le match, lui, compare à toute la France (depuis le 2026-09-01) : quand vous demandez où vivre, la question porte sur la France, pas sur les communes de la taille de la vôtre. Pour ne voir que des villes, on règle la population.

1.3 Ce qui n'est jamais une entrée

Ces données sont affichées sur les fiches, comme faits bruts, et n'entrent dans aucun score, aucun classement, aucun filtre :

La ligne de partage. Est notable un risque attaché au territoire, publié par l'État, avec information obligatoire de l'acquéreur ou du locataire : inondation, Seveso, nucléaire, argiles, rupture de barrage, arrêtés de catastrophe naturelle. Est interdite toute caractérisation des habitants : la scorer reviendrait à noter une commune sur qui y vit.

Un test exécuté à chaque build lit le code source du moteur et échoue si l'une de ces clés y apparaît. La liste est aussi publiée dans les vecteurs dorés (exclusions.jamaisScore).


2. Normalisation : de la valeur au percentile

Une valeur brute n'est pas comparable d'un indicateur à l'autre (2 100 €/m² contre 11,3/20). Chaque indicateur est donc converti en percentile 0–100 où 100 est toujours favorable.

  1. Pairs : la bande de population de la commune (§1.2) pour la note de qualité de vie ; toutes les communes de France pour le match.
  2. Rang parmi les valeurs présentes des pairs, ex æquo au rang moyen : p = round((inférieures + (égales − 1) / 2) / (n − 1) × 100).
  3. Inversion si l'indicateur est de sens inverse : p ← 100 − p.
  4. Moins de deux valeurs parmi les pairs ⇒ percentile absent. Jamais 50, qui se lirait « exactement médian » là où l'on veut dire « indéterminé ».
  5. Valeur absente ⇒ percentile absent, jamais 0.
  6. Bande saturée : quand les pairs ne se départagent pas sur un indicateur (tous au même niveau, ou une dispersion trop serrée pour être autre chose que du bruit), son percentile vaut 50 pour chacun. L'indicateur reste dans le calcul — le cadre est fixe pour toutes les communes — et la saturation est publiée sur la fiche.

Il n'y a plus de winsorisation (retirée le 2026-08-31) : un rang n'est pas sensible aux valeurs extrêmes, qui ne font que prendre la première ou la dernière place.

Taux à faibles effectifs. Les taux de délinquance sont d'abord lissés par Bayes empirique (modèle Gamma-Poisson) : un taux mesuré sur peu d'exposition est rétréci vers la moyenne de sa classe de taille. Sans ce lissage, les micro-communes où presque rien n'est enregistré occupent mécaniquement les premières places de « la plus sûre ».

2.1 Critères composés

Plusieurs critères réunissent plusieurs mesures à poids explicites (la sécurité : cambriolages, vols et dégradations, violences hors cadre familial, 30 / 30 / 40 % depuis le 11/10 ; la nature : surface à portée, part boisée, distance à l'eau, variété des milieux…). Le percentile du critère est la moyenne pondérée des percentiles de ses mesures présentes, renormalisée sur ce qui est mesuré. Un critère dont moins de la moitié du poids est mesurée n'a pas de valeur (PART_MESUREE_MIN = 0,5) : on ne note pas une nature sur la seule distance à l'eau.

Puis la moyenne est re-classée (v1.2). Une moyenne de percentiles se resserre vers le milieu — écart-type 21,7 en santé contre 28,9 pour un percentile simple, aucune commune au-dessus de 93 en commerces — et un critère resserré pèse moins que son poids dans une moyenne géométrique. La moyenne est donc relue sur une courbe de rang : les 51 quantiles de sa distribution sur la France entière, publiés par le pipeline (web/src/engine/rangComposites.json), avec une interpolation linéaire entre deux quantiles voisins (vecteurs dorés courbe). C'est la règle des indices composites (manuel OCDE/JRC, Niche) : on agrège, puis on re-classe. Le calme fait exception : ses mesures ont leur échelle propre (ci-dessous). La mesure de secours d'un critère, déjà un percentile simple, n'est pas re-classée.

Le calme : 100 hors carte, les communes exposées classées entre elles (v1.2). Les cartes de bruit de la directive 2002/49/CE couvrent toutes les grandes routes, voies ferrées et aéroports de métropole. Une commune métropolitaine qu'aucune zone ne touche compte donc 0 % de territoire exposé — sauf dans le Grand Paris, cartographié rue par rue, où une absence est un trou. Avec trois communes sur quatre à zéro, un percentile ordinaire mettrait la première commune exposée au 27ᵉ rang ; le score vaut donc 100 sans exposition, et les communes exposées se classent entre elles de 0 (la plus exposée) à 99.


3. Agrégation : la moyenne géométrique pondérée

C'est le cœur de la méthode.

match = exp( Σ wᵢ · ln(sᵢ) / Σ wᵢ )

où sᵢ est le score 0–100 du critère i et wᵢ son poids.

Trois règles de bord :

Pourquoi géométrique

Parce qu'un point faible ne doit pas être rachetable. Sur le vecteur doré « NON-COMPENSATOIRE » — poids 0,6 / 0,3 / 0,1, scores 0 / 100 / 100 :

MéthodeRésultat
Moyenne arithmétique pondérée40,0 — « moyen »
Moyenne géométrique pondérée6,31 — « rédhibitoire »

Une commune catastrophique sur ce qui compte le plus au demandeur ne doit pas ressortir « moyenne ». C'est ce qui sépare Icioola d'un score additif, où tout se rachète.

Couverture

En même temps que le match, on calcule :

couverture = Σ wᵢ des critères AVEC donnée / Σ wᵢ demandés

Puisqu'une commune non mesurée sur un critère priorisé est écartée, la couverture d'une commune classée n'est inférieure à 1 que par les critères « non couverts ici » de l'exception ci-dessus. Elle est affichée, et le fait que la priorité n°1 soit dans ce cas est signalé séparément — c'est le cas où le résultat est le plus trompeur.


4. Les poids : d'un ordre à des nombres

L'utilisateur classe ses critères ; il ne saisit pas de pourcentages. Les poids en sont dérivés par la méthode SR (Sum-Reciprocal, Danielson & Ekenberg 2017), qui mêle la règle des inverses de rang et celle des rangs linéaires :

wᵢ ∝ 1/i + (n + 1 − i)/n        (i compté à partir de 1, n = nombre de critères classés)

puis normalisés à somme 1.

npoids
11
20,6667 · 0,3333
30,5217 · 0,3043 · 0,1739
50,3785 · 0,2461 · 0,1767 · 0,1230 · 0,0757

Pourquoi SR et plus ROC (v1.2). Jusqu'en v1.1 les poids venaient de la méthode ROC (Rank-Order Centroid, Barron & Barrett 1996) : 0,6111 · 0,2778 · 0,1111 à trois critères. Mesuré sur des profils types, la priorité n°1 portait alors 55 à 88 % de la variance du classement, et le cinquième critère d'une liste de cinq ne pesait que 4 % — classé, mais presque sans effet. Les comparaisons par simulation (Danielson & Ekenberg 2017, Roszkowska 2013) placent SR parmi les règles les plus robustes quand l'ordre est sûr mais l'écart entre les rangs inconnu, ce qui est exactement notre situation. Le passage déplace deux à trois communes du top 10 et laisse l'ordre d'ensemble presque intact (corrélation de rang 0,986 à 0,993).

La somme vaut 1 par construction.

Pourquoi pas des pourcentages éditables, alors que c'est la demande spontanée : parce qu'ils doivent sommer à 100 (bouger l'un déplace tous les autres), parce que 13 % contre 15 % ne veut rien dire perceptivement, et surtout parce qu'ils entrent en conflit avec le classement — si l'on édite un pourcentage puis qu'on reclasse un critère, l'un des deux gestes doit être ignoré. Le pourcentage reste affiché, toujours dérivé, jamais saisi.

Un multiplicateur à trois crans (×0,5, ×1, ×2) module un critère sans toucher à l'ordre. Les poids sont ensuite renormalisés à somme 1 : sans cette renormalisation, un même « ×2 » n'aurait pas le même effet selon le nombre de critères classés.


5. Budget et trajet : le budget filtre, le trajet filtre et se classe

Budget — un filtre pur, en toutes circonstances : une commune dont le prix estimé dépasse le budget est écartée, pas « mal notée ». Il n'entre jamais dans la moyenne. Un score de budget est calculé et publié dans les vecteurs dorés, pour l'affichage :

score = clamp01( (budget − prix) / (0,35 × budget) ) × 100

Trajet — un filtre d'abord : au-delà du temps maximum accepté, la commune est écartée. Et, dès qu'un lieu de travail est renseigné, un critère classé : il prend place dans l'ordre des priorités et reçoit son poids SR selon cette place. On le déplace comme les autres, mais on ne le retire pas — pour ne plus le compter, on passe en « Sans trajet ». Les jours de présence fixent seulement sa place de départ. Son score, plein jusqu'à un palier puis décroissant linéairement :

palier = min(30, 0,6 × max)                (en minutes — v1.1, 2026-08-28)
score  = 100                                si minutes ≤ palier
       = 0                                  si minutes ≥ max
       = (max − minutes) / (max − palier) × 100   entre les deux

Le palier évite la falaise « 30 minutes parfait, 31 minutes nul » sans demander un second réglage ; son plafond de trente minutes empêche une tolérance large d'aplatir ce qui est proche (v1.1 : à 120 minutes de tolérance, l'ancienne règle mettait 93 des 435 communes retenues à égalité parfaite). Le trajet retenu est le temps porte-à-porte brut, jamais dilué par le télétravail : un seuil « ≤ 75 min » qui laisse passer des trajets réels de trois heures deux jours par semaine est un seuil qui ment.

Comment le temps est calculé. Porte-à-porte sur les horaires publiés (réseaux urbains, TER, cars régionaux) dans les 22 éditions locales, marche comprise à 4,8 km/h ; un itinéraire routier calculé commune par commune partout ailleurs en France métropolitaine. Jamais une distance à vol d'oiseau convertie en minutes.

Le temps ne se monétise jamais. Un trajet est exprimé en heures de vie, jamais converti en euros. Une heure de trajet ne vaut pas le même prix pour tout le monde, et prétendre le contraire transformerait un arbitrage personnel en calcul objectif qu'il n'est pas.

6. La note globale de qualité de vie

Fixe, identique pour tout le monde, publiée sur chaque fiche et dans les palmarès.

6.1 De la mesure à la note sur 100 : l'échelle en valeur (v1.3)

Chaque mesure est notée sur sa valeur réelle, France entière — plus sur un rang. Un rang grossit le milieu d'une distribution serrée et écrase ses queues : Annecy, 7,0 cambriolages pour 1 000 logements contre 6,4 pour la médiane (+10 %), tombait au rang 30 ; Lyon, Grenoble et Marseille, de 3 à 4 fois la médiane en délinquance de rue, étaient toutes à 0. Le barème est écrit une fois : pipeline/src/boussole_pipeline/echelle_valeur.py (BAREME), repères gelés.

MesureÉchelleRepère
cambriolages, vols, violencesécart au Français médian, en log50 au Français médian (6,0 · 20,1 · 5,1), −20 par doublement
brevet du collège de secteurlinéaire0 à 8,5/20, 100 à 13,5/20
accessibilité aux médecinslinéaire, seuil officiel0 sans médecin, 100 à 5
temps vers les urgenceslinéaire100 à 5 min, 0 à 55 min
indices d'accès, marche, dessertedéjà sur 100tels quels
bruit de jour et de nuitpart exposée100 sans exposition, 0 à 60 % (jour) et 45 % (nuit)
nature à portée, part boiséeracine100 à 2 500 ha et à 80 %
distance à l'eau, variété des milieuxlinéaire100 au bord de l'eau, 0 à 3 km · 33 par milieu
risque(x) = borne_0_100( 50 − 20 · log2(x / Français médian) )

Le 50 de chaque mesure est le Français médian (v1.4). La note brute du barème est ramenée à 50 pour la valeur sous laquelle vit la moitié de la population (médiane pondérée par les habitants, comme les moyennes nationales « pour 1 000 habitants »), par deux pentes : 0 et 100 ne bougent pas, l'ordre et les vrais chiffres sont gardés.

recentré(s) = 50 · s / m              si s ≤ m
            = 50 + 50 · (s − m) / (100 − m)   sinon      (m : note brute du Français médian)

Les Français médians sont mesurés une fois par an (scripts/mesurer_francais_median.py) et gelés dans echelle_valeur.FRANCAIS_MEDIAN. Exceptions écrites : les accès que la plupart des Français ont déjà en entier (pharmacie, commerces, panier de courses), le brevet du privé, le dénivelé (un filtre) et le prix (pas une qualité) gardent leur barème brut.

Exemple. Annecy, 7,0 cambriolages pour 1 000 logements : 50 − 20 · log2(7,0 / 6,0) = 46. Lyon, 73,2 vols et dégradations pour 1 000 habitants présents : 50 − 20 · log2(73,2 / 20,1) = 13. Annecy, 13,3 % d'habitants exposés au bruit de jour : note brute 77,8, Français médian 87 → 50 · 77,8 / 87 = 45.

6.2 Six familles, dix-neuf mesures, pondérées par les Français

La note porte sur six familles. Chaque famille est la moyenne pondérée des notes de ses mesures présentes, renormalisée sur ce qui est mesuré ; chaque famille pèse ensuite selon son poids propre, quel que soit son nombre de mesures. Les poids viennent du sondage OpinionWay 2026 qui sert au palmarès « Villes et villages où il fait bon vivre » : chaque famille pèse la part des répondants qui citent la catégorie correspondante, ramenée à une somme de six (une version par an, ponderation_sondage.py). Source unique : global_score.py (FAMILLES, POIDS_FAMILLES), miroir TS web/src/engine/familles.ts.

FamillePoidsPartMesures (poids dans la famille)
Sécurité1,3322,2 %cambriolages / 1 000 résidences principales secu_chez_soi (0,30) · vols et dégradations secu_vols (0,30) · violences hors cadre familial secu_violences (0,40), ces deux-là pour 1 000 habitants présents
Écoles0,6510,8 %brevet du collège de secteur school_dnb (1)
Santé0,915,0 %accessibilité aux médecins health_apl (0,55) · temps vers les urgences er_min (0,30) · pharmacie à portée acces_pharma (0,15)
Accès au quotidien0,8313,8 %commerces : nombre à 20 min à pied acces_shops_n (0,125) · panier complet acces_panier (0,125) · culture acces_culture (0,25) · marche walk (0,25) · médecins généralistes acces_gp (0,25)
Environnement1,4424,0 %calme : bruit de jour noise_pct60 (0,30) · bruit de nuit noise_nuit_pct55 (0,20) — nature : surface à portée nature_ha (0,20) · part boisée foret_pct (0,15) · distance à l'eau hydro_km (0,10) · variété des milieux milieux_n (0,05)
Mobilité0,8514,2 %desserte en transports transit_quality (1)

Les poids des familles somment à six : monter une famille sans en baisser d'autre adoucirait mécaniquement la pénalité d'un point faible, ce qui contredirait §3.

famille_f = Σ_{m mesurée} a_m · n_m / Σ_{m mesurée} a_m
note      = min( 100, exp( Σ_f P_f · ln(max(1, famille_f)) / Σ_f P_f ) )

Exemple (vecteur doré « les six familles mesurées »). Sécurité 80, écoles 70, santé 60, accès 47,5 (les commerces, la culture et la marche à 50, acces_gp à 40), environnement 40, mobilité 30 :

note = exp( (1,33·ln 80 + 0,65·ln 70 + 0,9·ln 60 + 0,83·ln 47,5 + 1,44·ln 40 + 0,85·ln 30) / 6 ) = 51,78

Et une famille au plancher plombe la note malgré cinq maximums : sécurité 0 (ramenée à 1), tout le reste à 100 ⇒ 100^(1 − 1,33/6) = 36,03.

Là où le bruit n'est pas mesuré — deux tiers des communes classées : les cartes de bruit ne couvrent que les agglomérations —, l'environnement se renormalise sur la nature seule : on note ce qu'on sait, jamais ce qu'on ignore.

6.3 Le prix n'y entre pas

Un logement cher n'est pas un défaut de qualité de vie : c'est un coût, et ce coût dépend du budget de chacun. Mélanger les deux produit des classements absurdes dans les deux sens. Le prix est affiché à côté de la note, jamais fondu dedans.

6.4 Éligibilité explicite

Une commune est classée si — et seulement si :

  1. chacune des six familles a au moins une mesure présente ; et
  2. ses taux sont statistiquement exploitables (au moins 200 habitants).

Sinon elle garde sa fiche et n'apparaît dans aucun classement. Elle n'est pas dernière : elle est absente. Sans cette règle, le « n°1 de France » serait un hameau où aucun fait n'a jamais été enregistré. Le nombre de communes classées est publié sur le site, calculé à chaque build ; il n'est pas recopié ici, où il vieillirait.

6.5 Le rang national suit la note

Depuis la v1.3, la note est nationale : deux communes à 70 vivent la même qualité mesurée, où qu'elles soient. Le rang national se calcule donc sur la note ; le rang dans la classe de taille (village, ville moyenne, grande ville) sert les palmarès par taille. Jusqu'à la v1.2, la note était un rang de bande, et le rang national passait par le rang relatif dans la classe pour neutraliser l'effet de la taille des pelotons.

6.6 Ex æquo

Deux communes au même score partagent le même rang (« 1, 2, 2, 4 »). Les départager par l'ordre alphabétique ou par celui du fichier publierait un ordre indéfendable.

Dans le classement personnalisé, où les scores tiennent sur un octet et où les égalités sont massives, les ex æquo sont départagés d'abord par la couverture (à score égal, la commune mesurée sur le plus de critères passe devant — c'est une mesure de confiance, pas de qualité), puis par un mélange de bits du code INSEE. Ce dernier n'affirme rien : il évite seulement que l'ordre du fichier fasse sortir cinq communes consécutives du même département, ce qui, lui, affirmait quelque chose de faux.


7. Les lettres A–E

Note globale : A ≥ 57   ·   B ≥ 50   ·   C ≥ 40   ·   D ≥ 32   ·   E < 32
Chaque critère : A ≥ 63   ·   B ≥ 56   ·   C ≥ 45   ·   D ≥ 36   ·   E < 36

Depuis la v1.3, la lettre se lit sur la note, avec des seuils gelés : ils ont été calés une fois sur les communes classées de 2026 pour donner une cloche — 9 % de A, 20 % de B, 40 % de C, 21 % de D, 10 % de E —, puis figés, comme le Nutri-Score ou le DPE. Depuis la v1.4, la note globale et les critères ont chacun leur table : un critère met le Français médian à 50, au cœur de la bande C ; la note globale, moyenne géométrique de critères recentrés, est descendue avec eux et garde sa cloche sur des seuils regelés. Une commune change de lettre quand ses chiffres changent, jamais parce que les autres ont bougé ; si la France s'améliore, les lettres montent. Jusqu'à la v1.2, la lettre découpait le rang relatif dans la classe en cinquièmes : 20 % de E par construction, quoi qu'il arrive. Source unique : echelle_valeur.SEUILS_NOTE (note globale) et SEUILS_LETTRES (critères), miroirs TS web/src/domain/lettreNote.ts.


Versionnage : toute évolution du moteur qui change un vecteur doré est un changement de méthode. Elle exige un incrément de version et une note de changement — pas une correction discrète du fichier de vecteurs.

Versions

Errata


Licence

Cette spécification est publiée sous Creative Commons Attribution 4.0 (CC BY 4.0) : vous pouvez la reprendre, l'adapter et l'implémenter, y compris commercialement, à condition de citer Icioola.

Les données relèvent d'une licence distincte : ODbL 1.0 (voir /donnees).