Réseau de refuges de Toronto — tableau de bord du mois en cours
Portrait mensuel interactif du réseau de refuges de Toronto — dénombrements de l’itinérance active, indicateurs de flux et répartitions par groupe de population pour tout mois depuis janvier 2018.
Auteur(-trice)
Miriam Marling
data =FileAttachment("../data/shelter_flow.json").json()
MON = ["janv.","févr.","mars","avr.","mai","juin","juill.","août","sept.","oct.","nov.","déc."]fmtN = d => d.toLocaleString("fr-CA")reportingMonthOptions = data.filter(d => d.population_group==="All Population").sort((a, b) => b.flow_date.localeCompare(a.flow_date)).map(d => {const [y, m] = d.flow_date.split("-").map(Number)return {label:newDate(y, m -1,15).toLocaleString("fr-CA", {month:"long",year:"numeric"}),value: d.flow_date } })
La Ville de Toronto publie mensuellement des données sur son réseau de refuges, et ses propres tableaux de bord présentent bien les chiffres principaux. Cette section va plus loin : filtres interactifs sur chaque graphique, une note explicite sur ce que les données couvrent et ce qu’elles excluent, et des conclusions qui restent habituellement enfouies dans la documentation technique.
Les données couvrent chaque mois de janvier 2018 au mois le plus récemment publié, directement issues du jeu de données Flux du réseau de refuges de la Ville de Toronto. Les nouvelles données se chargent automatiquement chaque mois, généralement vers le 15, après que la Ville publie les chiffres du mois précédent.
viewof reportingDate = Inputs.select(reportingMonthOptions, {label:"Mois de référence",format: d => d.label,value: reportingMonthOptions[0]})
html`<div class="kpi-hero"> <div class="kpi-box"> <div class="kpi-label">Personnes en situation d'itinérance active au cours des 3 derniers mois</div> <div class="kpi-value">${activelyHomeless.toLocaleString("fr-CA")}</div> </div></div>`
html`<div class="kpi-row"> <div class="kpi-card" style="background:var(--bq-kpi-inflow-bg);"> <div class="kpi-label">Entrées dans le réseau de refuges</div> <div class="kpi-value" style="color:var(--bq-kpi-inflow);">+${inflowTotal.toLocaleString("fr-CA")}</div> </div> <div class="kpi-card" style="background:${netChange >0?'var(--bq-kpi-net-pos-bg)': netChange <0?'var(--bq-kpi-net-neg-bg)':'var(--bq-kpi-net-zero-bg)'};"> <div class="kpi-label">Variation (Entrées − Sorties)</div> <div class="kpi-value" style="color:${netChange >0?'var(--bq-kpi-net-pos)': netChange <0?'var(--bq-kpi-net-neg)':'var(--bq-kpi-net-zero)'};">${netChange >=0?'+':''}${netChange.toLocaleString("fr-CA")} </div> </div> <div class="kpi-card" style="background:var(--bq-kpi-outflow-bg);"> <div class="kpi-label">Sorties du réseau de refuges</div> <div class="kpi-value" style="color:var(--bq-kpi-outflow);">−${outflowTotal.toLocaleString("fr-CA")}</div> </div></div>`
Itinérance chronique
Note : Oracle APEX affiche ce graphique sous forme de donut. Observable Plot ne prend pas en charge les graphiques circulaires nativement — présenté ici sous forme de barre de pourcentage avec les mêmes données et couleurs.
Ce tableau de bord est également disponible en tant que tableau de bord Oracle APEX reposant sur la même base de données — utile pour voir comment les mêmes données s’affichent dans la plateforme native à faible code d’Oracle, ou pour explorer le SQL et la configuration APEX sous-jacents.
Comment lire ces données
Ces chiffres reflètent le réseau de refuges, et non l’ensemble du phénomène de l’itinérance. Les données recensent les personnes ayant utilisé un service d’hébergement de nuit financé par la Ville au moins une fois au cours des trois derniers mois. Elles n’incluent pas les personnes qui dorment à l’extérieur, dans des refuges non financés par la Ville, ou qui séjournent temporairement chez des amis ou de la famille. La Ville estime qu’environ 18 % des personnes en situation d’itinérance absolue à Toronto ne sont pas reflétées dans ces chiffres. Les tendances présentées ici reflètent les changements dans le réseau de refuges spécifiquement — et non dans l’ensemble de l’itinérance dans la ville.
Définitions clés
Les tableaux de bord utilisent quelques termes ayant des significations précises qu’il vaut la peine de connaître avant de lire les graphiques.
Itinérance active. Une personne ayant utilisé les services d’hébergement financés par la Ville au moins une fois au cours des trois derniers mois et dont le déménagement vers un logement permanent n’a pas été enregistré. C’est le chiffre principal de chaque tableau de bord. Comme il remonte à trois mois en arrière, ce dénombrement inclut des personnes qui peuvent ne pas être en refuge un soir donné.
Itinérance chronique. La définition fédérale : une personne ayant passé au moins 180 nuits en refuge au cours de l’année écoulée, ou au moins 546 nuits au cours des trois dernières années. Une personne peut satisfaire à cette définition tout en étant encore dans le réseau de refuges — elle n’a pas besoin d’être partie et revenue.
Catégories d’entrées (personnes intégrant le réseau de refuges ce mois-ci) :
Nouvellement repérés. Personnes entrant dans le réseau de refuges pour la première fois. Exception pour le groupe « Chronique » : dans ce cas, cette colonne comptabilise les personnes devenues en situation d’itinérance chronique au cours du mois de référence, quelle que soit la durée de leur utilisation antérieure du réseau.
Retour du logement permanent. Personnes ayant précédemment accédé à un logement permanent et revenues dans le réseau de refuges.
Retour au refuge. Personnes qui étaient dans le réseau, ne l’ont pas utilisé pendant au moins trois mois, et y sont revenues.
Catégories de sorties (personnes quittant le réseau de refuges ce mois-ci) :
Accès au logement permanent. Personnes ayant quitté le réseau de refuges pour un logement permanent.
Devenus inactifs. Personnes n’ayant pas utilisé les services d’hébergement au cours des trois derniers mois, y compris le mois de référence.
html`<div class="crisis-hero"> <div class="hero-number">${_ratio}×</div> <div class="hero-text"> <div class="hero-label">plus d'<strong>hommes</strong> que de femmes en situation d'itinérance active dans les refuges de Toronto</div> <div class="hero-sub"><strong>${_menCount.toLocaleString("fr-CA")} hommes</strong> · ${_womenCount.toLocaleString("fr-CA")} femmes · ${_transCount.toLocaleString("fr-CA")} personnes trans, non binaires ou bispirituelles · ${_flowMonth}</div> </div></div>`
_genderStats = [ {label:"Hommes",mean: _menMean,ci_lo: _menMean -1.96* _menSE,ci_hi: _menMean +1.96* _menSE,isFocus:true}, {label:"Femmes",mean: _womenMean,ci_lo: _womenMean -1.96* _womenSE,ci_hi: _womenMean +1.96* _womenSE,isFocus:false}, {label:"Trans/NB/2S",mean: _transMean,ci_lo: _transMean -1.96* _transSE,ci_hi: _transMean +1.96* _transSE,isFocus:false}].sort((a, b) => b.mean- a.mean)Plot.plot({ width,height:300,marginBottom:36,marginLeft:70,marginRight:20,title:`Nombre mensuel moyen de personnes en itinérance active, par genre — ${_yearRange} (${_n1} mois)`,caption:"Les barres d'erreur indiquent les intervalles de confiance à 95 % de la moyenne mensuelle. Source : Données sur les flux du réseau de refuges de Toronto (open.toronto.ca).",x: {label:null,domain: _genderStats.map(d => d.label)},y: {label:"Moyenne d'individus en itinérance active / mois",grid:true,tickFormat: d => d.toLocaleString("fr-CA"),domain: [0,Math.max(..._genderStats.map(d => d.ci_hi)) *1.12]},marks: [ Plot.barY(_genderStats, {x:"label",y:"mean",fill: d => d.isFocus?"#ff3b30":"#4a6fa5",fillOpacity: d => d.isFocus?1:0.55 }), Plot.ruleY(_genderStats, {x:"label",y1:"ci_lo",y2:"ci_hi",stroke: _chartStroke,strokeWidth:1.8 }), Plot.tickY(_genderStats, {x:"label",y:"ci_hi",stroke: _chartStroke,strokeWidth:1.8,insetLeft:18,insetRight:18 }), Plot.tickY(_genderStats, {x:"label",y:"ci_lo",stroke: _chartStroke,strokeWidth:1.8,insetLeft:18,insetRight:18 }), Plot.text(_genderStats, {x:"label",y:"ci_hi",text: d =>Math.round(d.mean).toLocaleString("fr-CA"),dy:-10,textAnchor:"middle",fontSize:13,fill: d => d.isFocus?"#cc1f15": _chartFg,fontWeight:"600" }), Plot.ruleY([0]) ]})
{const bg = bayesian_genderconst rr = bg.rate_ratiosconst pd = bg.pairwise_diffsconst diag = bg.diagnosticsconst fmt1 = x =>Number(x).toFixed(1)const fmtN = x =>Math.round(x).toLocaleString("fr-CA")const bayesPairs = [ {comp:"Hommes c. femmes",rr: rr.men_vs_women,diff: pd.men_vs_women,note:false}, {comp:"Hommes c. Trans/NB/2S",rr: rr.men_vs_transnb2s,diff: pd.men_vs_transnb2s,note:true}, {comp:"Femmes c. Trans/NB/2S",rr: rr.women_vs_transnb2s,diff: pd.women_vs_transnb2s,note:true} ]const bayesRows = bayesPairs.map(p =>html`<tr> <td style="padding:3px 10px 3px 0">${p.comp}${p.note?html`<sup> †</sup>`:""}</td> <td style="padding:3px 10px;text-align:right;font-variant-numeric:tabular-nums">${fmt1(p.rr.median)}× (${fmt1(p.rr.hdi[0])}–${fmt1(p.rr.hdi[1])}) </td> <td style="padding:3px 0;text-align:right;font-variant-numeric:tabular-nums;font-weight:${p.note?"400":"700"}">${fmtN(p.diff.median)} (${fmtN(p.diff.hdi[0])}–${fmtN(p.diff.hdi[1])}) </td> </tr>`)returnhtml`<div class="bq-bayes"> <p style="margin:0 0 0.3rem"> <strong>Analyse bayésienne (régression binomiale négative, ajustée avec <code>brms</code> ${bg.brms_version} sur ${bg.n_months} mois de données) :</strong> Des a priori faiblement informatifs ont été utilisés. Diagnostics d'échantillonnage : R̂ ${diag.max_rhat}, ESS ${diag.min_ess_bulk.toLocaleString("fr-CA")},${diag.n_divergent} transition(s) divergente(s). </p> <table> <thead><tr> <th style="text-align:left;padding:3px 10px 3px 0;font-weight:600">Comparaison</th> <th style="text-align:right;padding:3px 10px;font-weight:600">Rapport de taux (IDC 95 %)</th> <th style="text-align:right;padding:3px 0;font-weight:600">Différence de décompte (IDC 95 %)</th> </tr></thead> <tbody>${bayesRows}</tbody> </table> <p class="bq-note" style="margin:0 0 0.5rem"> † Le groupe Trans/NB/2S représente en moyenne ~${Math.round(_transMean)} personnes par mois, un effectif réduit qui est également susceptible d'être sous-déclaré dans les dossiers administratifs des refuges. Les tests impliquant ce groupe doivent être interprétés avec prudence. </p> <p style="margin:0 0 0.3rem"> <strong>Hommes c. femmes :</strong> Le décompte mensuel attendu des hommes est d'environ <strong>${fmt1(rr.men_vs_women.median)}× celui des femmes</strong> (IDC 95 % ${fmt1(rr.men_vs_women.hdi[0])}–${fmt1(rr.men_vs_women.hdi[1])}×), soit un écart moyen d'environ <strong>${fmtN(pd.men_vs_women.median)} personnes par mois</strong> (IDC 95 % ${fmtN(pd.men_vs_women.hdi[0])}–${fmtN(pd.men_vs_women.hdi[1])}). Pour une large gamme d'a priori raisonnables, la probabilité a posteriori que le vrai décompte mensuel moyen des hommes dépasse celui des femmes est indiscernable de 1. </p> <div class="plain-eng"> <div class="pe-label">En clair</div> Une probabilité a posteriori indiscernable de 1 signifie que la probabilité estimée est proche de 100 % que le vrai décompte mensuel des hommes dépasse celui des femmes. L'IDC à 95 % indique également que l'écart est constamment élevé — le décompte des hommes représente environ ${fmt1(rr.men_vs_women.median)}× celui des femmes, soit environ ${fmtN(pd.men_vs_women.median)} personnes de plus par mois. <strong>Les hommes constituent le groupe le plus nombreux et le plus systématiquement sur-représenté dans le réseau de refuges de Toronto.</strong> </div> </div>`}
md`Les hommes ont représenté au moins **${_menShareMinPct} %** de la population en itinérance active de Toronto chaque mois depuis le début de l'enregistrement des données (${_recordStartYear} à ${_recordEndYear}). Ce chiffre correspond à la **part mensuelle la plus faible jamais observée pour les hommes sur l'ensemble de la période** ; dans la plupart des mois, cette part est plus élevée. L'écart mensuel moyen entre les hommes et tous les autres (femmes, personnes trans, non binaires et bispirituelles confondues) est d'environ **${_gapAvgStr} personnes**, et il a à peine bougé à mesure que le total augmentait et diminuait. Ce schéma n'est ni nouveau, ni subtil, ni caché dans les données. Pourtant, il fait rarement la une des journaux, et peu de conversations publiques sur l'itinérance dans la ville s'ouvrent sur ce constat.`
Comment lire ces données
Ces chiffres reflètent le réseau de refuges, et non l’ensemble du phénomène de l’itinérance. Les données recensent les personnes ayant utilisé un service d’hébergement de nuit financé par la Ville au moins une fois au cours des trois derniers mois. Elles n’incluent pas les personnes qui dorment à l’extérieur, dans des refuges non financés par la Ville, ou qui séjournent temporairement chez des amis ou de la famille. La Ville estime qu’environ 18 % des personnes en situation d’itinérance absolue à Toronto ne sont pas reflétées dans ces chiffres. Les tendances présentées ici reflètent les changements dans le réseau de refuges spécifiquement — et non dans l’ensemble de l’itinérance dans la ville.