{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Échelles de service du JMP pour l'eau, l'assainissement et l'hygiène\n",
    "\n",
    "*Enquête ménage EAH, 2024 · R*\n",
    "\n",
    "Cassion · data-analysis.cassion.dev\n",
    "\n",
    "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/thecassion/cassion-learning-platform/blob/main/apps/data-analysis/public/datasets/examples/wash-household-survey-2024/jmp-ladders.r.fr.ipynb)"
   ],
   "id": "cell-000"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ce que produit ce document\n",
    "\n",
    "Les trois mêmes classifications que l'exemple Python, construites avec le\n",
    "`case_when` de dplyr. Python et R sont ici sur un pied d'égalité : vous hériterez\n",
    "de celui qu'utilisait la personne en poste avant vous.\n",
    "\n",
    "Tous les jeux de données de cette plateforme sont synthétiques. Aucun ménage réel\n",
    "n'est décrit.\n",
    "\n",
    "## Mise en place"
   ],
   "id": "cell-001"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#| message: false\n",
    "library(readr)\n",
    "library(dplyr)\n",
    "library(tidyr)\n",
    "\n",
    "URL <- paste0(\n",
    "  \"https://data-analysis.cassion.dev/datasets/files/\",\n",
    "  \"wash-household-survey-2024.v1.csv\"\n",
    ")\n",
    "\n",
    "wash <- read_csv(URL, col_types = cols(\n",
    "  household_id = col_character(),\n",
    "  district     = col_character(),\n",
    "  community    = col_character(),\n",
    "  .default     = col_guess()\n",
    "))\n",
    "\n",
    "glimpse(wash)"
   ],
   "id": "cell-002"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Normaliser le district avant de regrouper dessus\n",
    "\n",
    "Une équipe a orthographié Nord-Ouest de quatre manières. Six districts au lieu de\n",
    "trois, et le moins performant éclaté en morceaux trop petits pour se remarquer."
   ],
   "id": "cell-003"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "count(wash, district)"
   ],
   "id": "cell-004"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "wash <- wash |>\n",
    "  mutate(district = gsub(\" \", \"-\", tolower(trimws(district)), fixed = TRUE))\n",
    "\n",
    "count(wash, district)"
   ],
   "id": "cell-005"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Les trois échelles\n",
    "\n",
    "`case_when` évalue de haut en bas et s'arrête à la première correspondance, ce\n",
    "qui épouse exactement la forme d'une définition d'échelle : placez les conditions\n",
    "prioritaires en premier."
   ],
   "id": "cell-006"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "AMELIOREES <- c(\n",
    "  \"piped-into-dwelling\", \"piped-into-yard\", \"public-tap\", \"borehole\",\n",
    "  \"protected-well\", \"protected-spring\", \"tanker-truck\"\n",
    ")\n",
    "ASSAINISSEMENT_AMELIORE <- c(\n",
    "  \"flush-to-sewer\", \"flush-to-septic\", \"vip-latrine\", \"pit-latrine-with-slab\"\n",
    ")\n",
    "\n",
    "wash <- wash |>\n",
    "  mutate(\n",
    "    service_eau = case_when(\n",
    "      water_source == \"surface-water\"                ~ \"eau de surface\",\n",
    "      !water_source %in% AMELIOREES                  ~ \"non amelioree\",\n",
    "      is.na(round_trip_minutes)                      ~ \"amelioree, duree inconnue\",\n",
    "      round_trip_minutes <= 30                       ~ \"base\",\n",
    "      TRUE                                           ~ \"limite\"\n",
    "    ),\n",
    "    service_assainissement = case_when(\n",
    "      sanitation_facility == \"open-defecation\"       ~ \"defecation a l'air libre\",\n",
    "      !sanitation_facility %in% ASSAINISSEMENT_AMELIORE ~ \"non amelioree\",\n",
    "      shared_sanitation                              ~ \"limite\",\n",
    "      TRUE                                           ~ \"base\"\n",
    "    ),\n",
    "    service_hygiene = case_when(\n",
    "      handwashing_facility == \"no-facility\"          ~ \"aucune installation\",\n",
    "      soap_observed                                  ~ \"base\",\n",
    "      TRUE                                           ~ \"limite\"\n",
    "    )\n",
    "  )\n",
    "\n",
    "wash |> count(service_eau) |> mutate(pct = round(100 * n / sum(n), 1))"
   ],
   "id": "cell-007"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notez l'ordre dans l'échelle de l'eau. Une source améliorée dont la durée de\n",
    "collecte n'a pas été relevée ne peut pas être qualifiée de service de base :\n",
    "cette clause se place donc au-dessus de la comparaison temporelle. Sans quoi\n",
    "`NA <= 30` renvoie `NA`, la ligne bascule sur `TRUE`, et le ménage est\n",
    "silencieusement rapporté en service limité sans le moindre élément probant."
   ],
   "id": "cell-008"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "wash |> count(service_assainissement) |> mutate(pct = round(100 * n / sum(n), 1))\n",
    "wash |> count(service_hygiene) |> mutate(pct = round(100 * n / sum(n), 1))"
   ],
   "id": "cell-009"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La couverture par district"
   ],
   "id": "cell-010"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "couverture <- wash |>\n",
    "  group_by(district) |>\n",
    "  summarise(\n",
    "    menages                  = n(),\n",
    "    eau_de_base              = round(100 * mean(service_eau == \"base\"), 1),\n",
    "    assainissement_de_base   = round(100 * mean(service_assainissement == \"base\"), 1),\n",
    "    hygiene_de_base          = round(100 * mean(service_hygiene == \"base\"), 1),\n",
    "    defecation_air_libre     = round(\n",
    "      100 * mean(service_assainissement == \"defecation a l'air libre\"), 1\n",
    "    ),\n",
    "    .groups = \"drop\"\n",
    "  ) |>\n",
    "  arrange(eau_de_base)\n",
    "\n",
    "couverture"
   ],
   "id": "cell-011"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La quantité est un indicateur distinct"
   ],
   "id": "cell-012"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "MINIMUM_SPHERE <- 15\n",
    "\n",
    "wash |>\n",
    "  summarise(\n",
    "    sous_sphere = round(100 * mean(litres_per_person_day < MINIMUM_SPHERE, na.rm = TRUE), 1),\n",
    "    plus_30_min = round(100 * mean(round_trip_minutes > 30, na.rm = TRUE), 1)\n",
    "  )"
   ],
   "id": "cell-013"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "wash |>\n",
    "  count(service_eau, sous_sphere = litres_per_person_day < MINIMUM_SPHERE) |>\n",
    "  group_by(service_eau) |>\n",
    "  mutate(pct = round(100 * n / sum(n), 1)) |>\n",
    "  ungroup()"
   ],
   "id": "cell-014"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Des ménages en service de base passent tout de même sous le minimum Sphere.\n",
    "L'accès et la quantité répondent à des questions différentes et aucun ne tient\n",
    "lieu de l'autre.\n",
    "\n",
    "## Ce qu'il faut rapporter\n",
    "\n",
    "L'échelon, le dénominateur sur lequel il repose et l'indicateur de quantité\n",
    "séparément — ainsi que les ménages qui n'ont pas pu être classés. Un ménage sans\n",
    "durée de collecte relevée n'est pas en service de base : il est inconnu, et\n",
    "l'intégrer au décompte du service de base est la manière dont un chiffre de\n",
    "couverture dérive vers le haut sans que personne ne l'ait décidé."
   ],
   "id": "cell-015"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "R",
   "language": "R",
   "name": "ir"
  },
  "language_info": {
   "name": "R",
   "file_extension": ".r"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
