// ----------------------------------------------------------------------------- // Lou-Ka — Agrégateur de logements à louer (province de Québec) // Auteur : Simon-Pierre Boucher — contact@spboucher.ai // pages/KaScores.tsx : « Comment sont calculés les KA Scores ? » // Méthodologie publique (transparence obligatoire du barème), couverture // du parc en direct, et réglage des priorités personnelles (les curseurs // repondèrent le KA Score global affiché sur les fiches). // ----------------------------------------------------------------------------- import { useEffect, useMemo, useState } from "react"; import { KA_DEFAULT_WEIGHTS, KaScoresStats, fetchKaScoresStats, kaWeights, } from "../api"; import { KaScoreCircle } from "../components/KaScoreBadge"; const SCORES: { key: string; nom: string; mesure: string; methode: string }[] = [ { key: "walk", nom: "KA Walk Score", mesure: "Tout faire à pied.", methode: "Distance de marche estimée au plus proche de chaque besoin " + "quotidien (épicerie, pharmacie, parc, café, école, clinique, garderie, " + "dépanneur, gym, bibliothèque), pondérée par son importance — une " + "épicerie pèse trois fois plus qu'un gym. Pleine note en deçà d'un " + "seuil par catégorie (ex. épicerie ≤ 400 m), décroissance linéaire " + "ensuite. Petit bonus quand le choix existe (3 épiceries ou cafés à " + "moins de 800 m).", }, { key: "transit", nom: "KA Transit Score", mesure: "La desserte en transport collectif.", methode: "Deux volets : la distance de marche au plus proche arrêt de bus " + "ou station de métro (OpenStreetMap), et la qualité de desserte du " + "secteur mesurée par Statistique Canada (base des mesures de " + "proximité 2021, percentile canadien). Un territoire sans arrêt à " + "distance de marche affiche « Non desservi », pas un 0 brut.", }, { key: "bike", nom: "KA Bike Score", mesure: "Le vélo au quotidien.", methode: "Kilomètres de voies cyclables (pistes et bandes OSM) à moins " + "de 1 km, plus l'accessibilité des besoins quotidiens à distance de " + "vélo. Le dénivelé n'est pas encore pris en compte (v1).", }, { key: "calme", nom: "KA Calme Score", mesure: "La tranquillité estimée du secteur.", methode: "Pénalités décroissantes selon la distance aux sources de bruit " + "cartographiées : autoroutes, artères principales, voies ferrées, " + "aéroports et héliports, zones industrielles, concentration de bars. " + "Bonus pour un parc tout proche. C'est une estimation basée sur " + "l'environnement, PAS une mesure sonore.", }, { key: "services", nom: "KA Services Score", mesure: "La richesse globale des services.", methode: "Comptage pondéré des points d'intérêt par famille — commerces " + "(1 km), santé (3 km), éducation (3 km), loisirs (1 km) — avec " + "rendement décroissant : passer de 0 à 3 épiceries compte beaucoup " + "plus que de 12 à 15.", }, ]; const NOMS_COURTS: Record = { walk: "Marche", transit: "Transport", bike: "Vélo", calme: "Calme", services: "Services", }; export default function KaScoresPage() { const [stats, setStats] = useState(null); const [weights, setWeights] = useState>(() => kaWeights()); useEffect(() => { fetchKaScoresStats().then(setStats).catch(() => {}); document.title = "KA Scores — méthodologie | Lou-Ka"; }, []); const somme = useMemo( () => Object.values(weights).reduce((a, b) => a + b, 0), [weights]); const setW = (k: string, v: number) => { const next = { ...weights, [k]: v }; setWeights(next); try { localStorage.setItem("louka_ks_poids", JSON.stringify(next)); } catch { /* privé */ } }; const reset = () => { setWeights(KA_DEFAULT_WEIGHTS); try { localStorage.removeItem("louka_ks_poids"); } catch { /* privé */ } }; return (
Transparence

Comment sont calculés les KA Scores ?

Cinq scores maison de 0 à 100 évaluent l'emplacement de chaque logement : marche, transport collectif, vélo, calme et services. Voici exactement comment — méthode, sources et limites.

{stats && (
{stats.couverture_pct.toLocaleString("fr-CA")} % du parc scoré ({stats.avec_score.toLocaleString("fr-CA")} annonces) {stats.moyennes.global?.moyenne != null && ( score global moyen {stats.moyennes.global.moyenne} )} barème {stats.version}
)}
{SCORES.map((s) => (

{s.nom}

Ce qu'il mesure : {s.mesure}

{s.methode}

{stats?.moyennes[s.key]?.moyenne != null && (

Moyenne du parc : {stats.moyennes[s.key]!.moyenne} —{" "} {stats.moyennes[s.key]!.n.toLocaleString("fr-CA")} immeubles évalués.

)}
))}

Vos priorités, votre score

Le KA Score global affiché partout est une moyenne pondérée des cinq scores. Réglez ici ce qui compte pour vous — les fiches afficheront votre score personnalisé à côté du score standard. Ces réglages restent sur votre appareil.

{Object.keys(KA_DEFAULT_WEIGHTS).map((k) => ( ))}

Sources, honnêteté et limites

  • Sources : points d'intérêt, routes, rails et voies cyclables © contributeurs OpenStreetMap (ODbL) ; desserte en transport : Base de données des mesures de proximité, Statistique Canada (2021).
  • Distances : à vol d'oiseau multipliées par 1,3 (facteur réseau usuel) — pas un routage piéton exact.
  • Données insuffisantes : un secteur mal cartographié (zone rurale) affiche « Données insuffisantes » plutôt qu'un score trompeur ; un territoire sans transport collectif affiche « Non desservi ».
  • Cohérence : les scores sont calculés par immeuble ; deux logements du même immeuble partagent exactement les mêmes scores.
  • Versionnage : le barème est versionné ; tout changement de méthode recalcule l'ensemble du parc et la date de calcul est affichée sur chaque fiche.
); }