# &s &CADRAGE_RECAP - Tableau récap pondéré pop Paris+PC vs Marseille
build_recap_row <- function(df, label) {
pop <- sum(df$P22_POP, na.rm = TRUE)
n_com <- n_distinct(df$COM)
wmean <- function(col) {
v <- df[[col]]; p <- df$P22_POP
ok <- !is.na(v) & !is.na(p) & p > 0
if (sum(ok) == 0) return(NA_real_)
sum(v[ok] * p[ok]) / sum(p[ok])
}
tibble(
perimetre = label,
pop = pop, n_com = n_com, n_iris = nrow(df),
tcam_pop = wmean("dm_pop_vtcam_1622"),
cadres_pct = wmean("dsp_csp_cadres_pct_22"),
cadres_evol = wmean("dsp_csp_cadres_vdifp_1622"),
ouvriers_pct = wmean("dsp_csp_ouvriers_pct_22"),
ouvriers_evol = wmean("dsp_csp_ouvriers_vdifp_1622"),
proprio_pct = wmean("log_prop_pct_22"),
proprio_evol = wmean("log_prop_vdifp_1622"),
emmenrec_pct = wmean("log_emmenrec_pct_22"),
emmenrec_evol = wmean("log_emmenrec_vdifp_1622"),
px_appt = mean(df$logd_px2q2_appt_24, na.rm = TRUE),
px_evol = mean(df$logd_px2_appt_vevol_1924, na.rm = TRUE),
rev_med = wmean("rev_med_21"),
rev_evol = wmean("rev_med_vevol_1921"),
txpauv = wmean("rev_txpauv_21"),
txpauv_evol = wmean("rev_txpauv_vdifp_1921"),
d1 = wmean("rev_d1_21"),
d9 = wmean("rev_d9_21"),
imm_pct = wmean("dm_imm_pct_22"),
imm_evol = wmean("dm_imm_pct_vdifp_1622")
)
}
recap_paris <- build_recap_row(df_paris, "Paris+PC")
recap_mars <- build_recap_row(df_mars, "Marseille")
recap <- bind_rows(recap_paris, recap_mars)
# Pivoter en format indicateur × territoire
indic_labels <- c(
"Population", "Communes / ARM", "IRIS",
"TCAM pop 16-22 (%/an)",
"Part cadres (%)", "Évol. cadres (pts %)",
"Part ouvriers (%)", "Évol. ouvriers (pts %)",
"Part propriétaires (%)", "Évol. propriétaires (pts %)",
"Part emménagés récents (%)", "Évol. emménagés (pts %)",
"Prix m² appt (€)", "Évol. prix appt (%)",
"Revenu médian (€/an)", "Évol. revenu médian (%)",
"Taux pauvreté (%)", "Évol. tx pauvreté (pts %)",
"D1 revenu (€)", "D9 revenu (€)",
"Part immigrés (%)", "Évol. immigrés (pts %)"
)
indic_section <- c(
rep("Contexte", 4),
rep("Composantes idx", 10),
rep("Complémentaires", 8)
)
vals_paris <- c(
format(recap$pop[1], big.mark = " "), as.character(recap$n_com[1]), format(recap$n_iris[1], big.mark = " "),
sprintf("%+.2f", recap$tcam_pop[1]),
sprintf("%.1f", recap$cadres_pct[1]), sprintf("%+.1f", recap$cadres_evol[1]),
sprintf("%.1f", recap$ouvriers_pct[1]), sprintf("%+.1f", recap$ouvriers_evol[1]),
sprintf("%.1f", recap$proprio_pct[1]), sprintf("%+.1f", recap$proprio_evol[1]),
sprintf("%.1f", recap$emmenrec_pct[1]), sprintf("%+.1f", recap$emmenrec_evol[1]),
format(round(recap$px_appt[1]), big.mark = " "), sprintf("%+.1f", recap$px_evol[1]),
format(round(recap$rev_med[1]), big.mark = " "), sprintf("%+.1f", recap$rev_evol[1]),
sprintf("%.1f", recap$txpauv[1]), sprintf("%+.1f", recap$txpauv_evol[1]),
format(round(recap$d1[1]), big.mark = " "), format(round(recap$d9[1]), big.mark = " "),
sprintf("%.1f", recap$imm_pct[1]), sprintf("%+.1f", recap$imm_evol[1])
)
vals_mars <- c(
format(recap$pop[2], big.mark = " "), as.character(recap$n_com[2]), format(recap$n_iris[2], big.mark = " "),
sprintf("%+.2f", recap$tcam_pop[2]),
sprintf("%.1f", recap$cadres_pct[2]), sprintf("%+.1f", recap$cadres_evol[2]),
sprintf("%.1f", recap$ouvriers_pct[2]), sprintf("%+.1f", recap$ouvriers_evol[2]),
sprintf("%.1f", recap$proprio_pct[2]), sprintf("%+.1f", recap$proprio_evol[2]),
sprintf("%.1f", recap$emmenrec_pct[2]), sprintf("%+.1f", recap$emmenrec_evol[2]),
format(round(recap$px_appt[2]), big.mark = " "), sprintf("%+.1f", recap$px_evol[2]),
format(round(recap$rev_med[2]), big.mark = " "), sprintf("%+.1f", recap$rev_evol[2]),
sprintf("%.1f", recap$txpauv[2]), sprintf("%+.1f", recap$txpauv_evol[2]),
format(round(recap$d1[2]), big.mark = " "), format(round(recap$d9[2]), big.mark = " "),
sprintf("%.1f", recap$imm_pct[2]), sprintf("%+.1f", recap$imm_evol[2])
)
tbl_recap <- tibble(
Section = indic_section,
Indicateur = indic_labels,
`Paris+PC` = vals_paris,
Marseille = vals_mars
)
reactable(tbl_recap,
pagination = FALSE, compact = TRUE,
groupBy = "Section",
defaultExpanded = TRUE,
columns = list(
Section = colDef(width = 140),
Indicateur = colDef(width = 250),
`Paris+PC` = colDef(width = 130, align = "right",
style = list(fontWeight = "600", fontFamily = "JetBrains Mono, monospace", fontSize = "0.85em")),
Marseille = colDef(width = 130, align = "right",
style = list(fontWeight = "600", fontFamily = "JetBrains Mono, monospace", fontSize = "0.85em"))
),
theme = reactableTheme(
headerStyle = list(borderBottom = "2px solid #1696d2", fontSize = "0.85em"),
groupHeaderStyle = list(fontWeight = "bold", color = "#1696d2", fontSize = "0.9em")
))
# &e