{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f64eabcb",
   "metadata": {},
   "source": [
    "# 05 — From Analytics to Decision-Support\n",
    "\n",
    "**Development dimensions, hazard context, policy signals, dan batas klaim**\n",
    "\n",
    "Notebook ini adalah POC portfolio yang dapat dijalankan ulang dari artefak lokal Pasuruan Lens. Kode produksi tetap berada di `python/scripts/` dan `python/src/pasuruan365/`; notebook berfungsi sebagai narasi analitik yang ringkas, transparan, dan mudah dipresentasikan."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0c4e57f8",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-04T06:27:37.851290Z",
     "iopub.status.busy": "2026-09-04T06:27:37.851125Z",
     "iopub.status.idle": "2026-09-04T06:27:39.418758Z",
     "shell.execute_reply": "2026-09-04T06:27:39.418206Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Project root: PASURUAN365\n",
      "Python: 3.12.6\n"
     ]
    }
   ],
   "source": [
    "from pathlib import Path\n",
    "import json\n",
    "import sys\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "\n",
    "def find_project_root(start: Path | None = None) -> Path:\n",
    "    start = (start or Path.cwd()).resolve()\n",
    "    for candidate in (start, *start.parents):\n",
    "        if (candidate / \"package.json\").exists() and (candidate / \"data\").exists():\n",
    "            return candidate\n",
    "    raise RuntimeError(\"Root Pasuruan Lens tidak ditemukan. Jalankan notebook dari repository ini.\")\n",
    "\n",
    "\n",
    "ROOT = find_project_root()\n",
    "sys.path.insert(0, str(ROOT / \"python\" / \"src\"))\n",
    "\n",
    "pd.set_option(\"display.max_columns\", 100)\n",
    "pd.set_option(\"display.max_colwidth\", 100)\n",
    "sns.set_theme(style=\"whitegrid\", context=\"notebook\")\n",
    "COLORS = {\"A\": \"#2563eb\", \"B\": \"#f59e0b\", \"C\": \"#10b981\"}\n",
    "\n",
    "print(f\"Project root: {ROOT}\")\n",
    "print(f\"Python: {sys.version.split()[0]}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5d3cd51a",
   "metadata": {},
   "source": [
    "## Prinsip produk\n",
    "\n",
    "Tidak semua indikator layak digabung menjadi satu angka. Pasuruan Lens memisahkan tiga pertanyaan: variasi dimensi pembangunan, kejadian bahaya yang terdokumentasi, dan policy opportunity yang dapat ditelaah. Pemisahan ini mencegah cluster, hazard, dan service availability berubah menjadi ranking semu."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "deff0ac2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-04T06:27:39.421331Z",
     "iopub.status.busy": "2026-09-04T06:27:39.421052Z",
     "iopub.status.idle": "2026-09-04T06:27:39.476335Z",
     "shell.execute_reply": "2026-09-04T06:27:39.475822Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>rows</th>\n",
       "      <th>villages</th>\n",
       "      <th>categories</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>development</th>\n",
       "      <td>2555</td>\n",
       "      <td>365.0</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>hazard</th>\n",
       "      <td>1460</td>\n",
       "      <td>365.0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>policy</th>\n",
       "      <td>1825</td>\n",
       "      <td>365.0</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>spatial components</th>\n",
       "      <td>33</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    rows  villages  categories\n",
       "development         2555     365.0           7\n",
       "hazard              1460     365.0           4\n",
       "policy              1825     365.0           5\n",
       "spatial components    33       NaN           5"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dimensions = pd.read_csv(ROOT / \"data/analytics/development_dimension_profiles.csv\", dtype={\"village_id\": str})\n",
    "hazards = pd.read_csv(ROOT / \"data/analytics/hazard_exposure_profiles.csv\", dtype={\"village_id\": str})\n",
    "policy = pd.read_csv(ROOT / \"data/analytics/policy/village_policy_profiles.csv\", dtype={\"village_id\": str})\n",
    "components = pd.read_csv(ROOT / \"data/analytics/policy/policy_spatial_components.csv\")\n",
    "\n",
    "pd.DataFrame({\n",
    "    \"rows\": [len(dimensions), len(hazards), len(policy), len(components)],\n",
    "    \"villages\": [dimensions.village_id.nunique(), hazards.village_id.nunique(), policy.village_id.nunique(), np.nan],\n",
    "    \"categories\": [dimensions.dimension_id.nunique(), hazards.hazard_id.nunique(), policy.policy_lens.nunique(), components.policyLens.nunique()],\n",
    "}, index=[\"development\", \"hazard\", \"policy\", \"spatial components\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "29619955",
   "metadata": {},
   "source": [
    "## POC 1 — Dimension readiness, bukan composite score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "fdb6addc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-04T06:27:39.478445Z",
     "iopub.status.busy": "2026-09-04T06:27:39.478243Z",
     "iopub.status.idle": "2026-09-04T06:27:39.491183Z",
     "shell.execute_reply": "2026-09-04T06:27:39.490710Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>dimension_id</th>\n",
       "      <th>dimension_status</th>\n",
       "      <th>villages</th>\n",
       "      <th>numeric_values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>BASIC_SERVICE_AVAILABILITY</td>\n",
       "      <td>INDICATOR_PROFILE</td>\n",
       "      <td>365</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>BASIC_UTILITIES</td>\n",
       "      <td>INDICATOR_PROFILE</td>\n",
       "      <td>365</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>DIGITAL_COMMUNICATION_CONNECTIVITY</td>\n",
       "      <td>INSUFFICIENT_INDICATOR_COVERAGE</td>\n",
       "      <td>15</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>DIGITAL_COMMUNICATION_CONNECTIVITY</td>\n",
       "      <td>PUBLIC_RELATIVE_POSITION</td>\n",
       "      <td>350</td>\n",
       "      <td>350</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>ECONOMIC_SERVICE_INFRASTRUCTURE</td>\n",
       "      <td>INDICATOR_PROFILE</td>\n",
       "      <td>365</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>EDUCATION_SERVICE_AVAILABILITY</td>\n",
       "      <td>NOT_AVAILABLE</td>\n",
       "      <td>365</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>INSTITUTIONAL_PUBLIC_SERVICE_CAPACITY</td>\n",
       "      <td>DESCRIPTIVE_ONLY</td>\n",
       "      <td>365</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>TRANSPORT_SERVICE_AVAILABILITY</td>\n",
       "      <td>INDICATOR_PROFILE</td>\n",
       "      <td>365</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                            dimension_id                 dimension_status  \\\n",
       "0             BASIC_SERVICE_AVAILABILITY                INDICATOR_PROFILE   \n",
       "1                        BASIC_UTILITIES                INDICATOR_PROFILE   \n",
       "2     DIGITAL_COMMUNICATION_CONNECTIVITY  INSUFFICIENT_INDICATOR_COVERAGE   \n",
       "3     DIGITAL_COMMUNICATION_CONNECTIVITY         PUBLIC_RELATIVE_POSITION   \n",
       "4        ECONOMIC_SERVICE_INFRASTRUCTURE                INDICATOR_PROFILE   \n",
       "5         EDUCATION_SERVICE_AVAILABILITY                    NOT_AVAILABLE   \n",
       "6  INSTITUTIONAL_PUBLIC_SERVICE_CAPACITY                 DESCRIPTIVE_ONLY   \n",
       "7         TRANSPORT_SERVICE_AVAILABILITY                INDICATOR_PROFILE   \n",
       "\n",
       "   villages  numeric_values  \n",
       "0       365               0  \n",
       "1       365               0  \n",
       "2        15               0  \n",
       "3       350             350  \n",
       "4       365               0  \n",
       "5       365               0  \n",
       "6       365               0  \n",
       "7       365               0  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dimension_status = (\n",
    "    dimensions.groupby([\"dimension_id\", \"dimension_status\"])\n",
    "    .agg(villages=(\"village_id\", \"nunique\"), numeric_values=(\"dimension_value_if_applicable\", \"count\"))\n",
    "    .reset_index()\n",
    ")\n",
    "dimension_status"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "203e1de4",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-04T06:27:39.493173Z",
     "iopub.status.busy": "2026-09-04T06:27:39.492962Z",
     "iopub.status.idle": "2026-09-04T06:27:39.495922Z",
     "shell.execute_reply": "2026-09-04T06:27:39.495518Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "✓ Dataset memublikasikan profil per dimensi tanpa overall development score atau ranking.\n"
     ]
    }
   ],
   "source": [
    "assert not any(\"overall\" in c.lower() or \"rank\" in c.lower() for c in dimensions.columns)\n",
    "print(\"✓ Dataset memublikasikan profil per dimensi tanpa overall development score atau ranking.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c83c8425",
   "metadata": {},
   "source": [
    "## POC 2 — Hazard tetap berupa kejadian biner terpisah"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "fae8e06c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-04T06:27:39.497964Z",
     "iopub.status.busy": "2026-09-04T06:27:39.497753Z",
     "iopub.status.idle": "2026-09-04T06:27:39.509989Z",
     "shell.execute_reply": "2026-09-04T06:27:39.509486Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>hazard_id</th>\n",
       "      <th>hazard_name</th>\n",
       "      <th>documented_occurrence</th>\n",
       "      <th>coverage</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>EARTHQUAKE</td>\n",
       "      <td>Gempa Bumi</td>\n",
       "      <td>30</td>\n",
       "      <td>365</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>FLOOD</td>\n",
       "      <td>Banjir</td>\n",
       "      <td>64</td>\n",
       "      <td>365</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>LANDSLIDE</td>\n",
       "      <td>Tanah Longsor</td>\n",
       "      <td>24</td>\n",
       "      <td>365</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>TORNADO</td>\n",
       "      <td>Angin Puyuh</td>\n",
       "      <td>48</td>\n",
       "      <td>365</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    hazard_id    hazard_name  documented_occurrence  coverage\n",
       "0  EARTHQUAKE     Gempa Bumi                     30       365\n",
       "1       FLOOD         Banjir                     64       365\n",
       "2   LANDSLIDE  Tanah Longsor                     24       365\n",
       "3     TORNADO    Angin Puyuh                     48       365"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hazard_counts = (\n",
    "    hazards.groupby([\"hazard_id\", \"hazard_name\"], as_index=False)\n",
    "    .agg(documented_occurrence=(\"documented_occurrence\", \"sum\"), coverage=(\"village_id\", \"nunique\"))\n",
    ")\n",
    "hazard_counts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b3a58a72",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-04T06:27:39.511841Z",
     "iopub.status.busy": "2026-09-04T06:27:39.511657Z",
     "iopub.status.idle": "2026-09-04T06:27:39.730988Z",
     "shell.execute_reply": "2026-09-04T06:27:39.730490Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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Z8/Kz89P5cuXV/Xq1TV16lTFx8dbsdqXBwEinQgODtbXX3+tUaNGafHixUpISFCnTp0UExNj7dJeaeHh4Zo6darFsmvXrql9+/YqXLiwli9fLn9/fwUFBWn58uXWKfIV1adPH+3du1eTJ0/W8uXLVbp0aXXs2FEnT57UiRMn5OfnJ29vb0VEROijjz5SQECAduzYYe2yXxn+/v76+++/FRoaqmXLlsnR0VHt2rVTdHQ074E0Fhsbq379+unOnTvmZYxB2jhy5IgyZsyobdu26ZdffjH/1K1blzFIA99//70GDRqkli1bavXq1apfv775syE2NlYdO3aUJC1evFjDhw/XN998o1mzZlm56pdDBmsXgOcvJiZG8+fPV79+/VSzZk1J0pQpU+Tt7a3169erfv361i3wFXTx4kUNGzZMO3fulLOzs8V9S5culb29vUaOHKkMGTKoePHi5h2tpk2bWqfgV8zff/+t7du36+uvv9Zbb70lSRoyZIi2bdumVatW6cqVK3JxcVHv3r0lScWLF9ehQ4c0b948ValSxZqlvxJu3LihN954Q35+fipZsqQkqVu3bmrUqJGOHTumHTt28B5IQzNmzFCWLFkslvF7KG0cPXpUzs7OypMnT5L7vvzyS8bgOTKZTJo2bZratGmjli1bSpI+/fRTRUZGateuXfrnn3907tw5LV26VNmzZ1fJkiV15coVff755+ratascHBysvAUvNo5ApANHjhzRf//9Z7FjlC1bNpUpU0a///67FSt7df3555+yt7fXypUr5eHhYXFfZGSkKlWqpAwZ/j+/V65cWadOndLly5fTutRX0muvvabQ0FC5ubmZl9nY2MjGxkY3b95UZGRkkqBQuXJl7d69WyaTKa3LfeVkz55dkyZNMoeHq1evasGCBcqXL59KlCjBeyAN/f7771qyZInGjx9vsZwxSBt//fWXihcvnux9jMHzFRUVpX/++UcNGjSwWB4WFiY/Pz9FRkaqbNmyyp49u/m+ypUr6/bt2zp8+HBal/vSIUCkAxcuXJAk5c+f32J5njx5zPchdfn6+mrGjBkqVKhQkvsuXLigfPnyWSxL/Hbq/PnzaVLfqy5btmyqUaOGxTdI69at099//y1vb+9HjkHi9BqkniFDhqhKlSpavXq1xowZo0yZMvEeSCM3b95UQECABg8enOT3P2OQNo4e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f39duHAh2TaCgoIUHBysZs2aad68eRo1apSuX7+uzz77TNHR0RbrDh06VO3atdPs2bOVL18+BQYGJhsIEm3atEk9e/aUi4uLZs2apffff1//+9//LNa5d++e2rZtq40bN6p3796aOXOm8uXLp06dOplDxJkzZ9StWze5urpq9uzZGjNmjKKiotSlSxclJCSkaDu2bt0qLy8vZcyYMUm9a9as0ZAhQ9StWzf5+/tLkqKiotS8eXNduXJFEyZM0JgxY3TmzBl98sknunLlioFRerT4+HjNnz9fY8aM0YABA1S8ePFUG49///1XLVu2VHR0tMaPH6+5c+eqXr16+uqrr7Rw4UKLdqZMmaKEhARNnjxZAQEB+vnnnzV27Nhn2jYAL4cM1i4AAJC2EhIS1LVrV3300UeSpJs3b6p3795q27at2rdvL0nKmjWrmjZtqoMHDypfvnxJ2vj333/Vu3dvi2/MM2bMqB49euivv/5SuXLlzMtHjx5tPnegcOHCeu+997Rr1y6VKlUq2fpmzZold3d3TZw4UZLk7e0tSZo0aZJ5ne+//15HjhzR0qVL5eHhIUl6++231bp1awUFBWn58uXav3+/7t69Kz8/P+XNm1eSlC9fPm3cuFF37txRlixZDG/H1q1b9f777yep9eeff1ZAQIC6dOminj17mpfPnDlTTk5OWrBggbJkySJJqlKlit59913NmzdP/fv3T3bbjUoMe4lSazyOHj2q0qVLa9q0aea6q1atqu3bt2vnzp3q0qWLuZ2SJUtq3Lhx5tv79+/Xjz/++EzbBeDlQIAAgHTI09PT/P+cOXNKknlHXJJy5Mgh6X64SE7izvzVq1d18uRJ/f333/r5558lSTExMRbrVqhQwfz/ggULPrbdu3fv6s8//9Rnn31msfz999+3CBA7duxQ7ty5VbZsWcXFxZmX+/j46PPPP9eNGzfk4eGhjBkz6sMPP1SdOnX09ttvy8vLS+7u7inajlu3bmnv3r0WO8uS9Oeff2rNmjXKkydPknp/++03VapUSY6Ojub6smTJogoVKujXX39NdttTonTp0ha3U2s8qlevrurVqys2NlbHjx/X33//raNHj+rq1avm10SiB0OJdD+cPXy0A8CriQABAOlQ4rfLD3JycjL8+AMHDmjEiBE6cOCAnJycVKJECRUoUECSZDKZLNbNlCmT+f+2trbJrpPoxo0bMplMeu211yyW58mTx+L29evXdenSJZUtWzbZdi5duqQSJUpo0aJFCg0N1bJly7Rw4UJly5ZNLVq0UK9evWRjY2NoO3755RcVLlxYhQoVsniOo0ePqmbNmtq8ebPCw8Mtvv2/fv261qxZozVr1iSp7fXXX0+25pR4sE+l1BuPxClJ4eHhunPnjvLnzy93d/dkp249/HqxtbV95LgCeLUQIADgJZA4PaRPnz7KkOH+r+74+PgkO3bx8fEWt+/cuZPqtdy+fVudOnWSi4uLVq9erWLFisnW1lZbtmzRunXrnqntHDlyyNbWNsnJuNevX7e4nTVrVjk7OysoKCjZdhK/WXd3d9fMmTMVExOj3bt3a8mSJQoJCVGpUqXk7e1taDu2bt2a7NWXvL29NWfOHPXu3VuTJ0/Wu+++q/z585vrq1q1qnlK2IMSxy85TzN+qTkeoaGhWrBggUaMGKFatWopa9askqQPP/wwRe0AeLVxEjUAvASOHz+usLAwiz86dv78eYvzE7JkyZLkpOfdu3enei0nT57U9evX1aZNG5UoUcL8LfbWrVslyXyC8tPImDGjPD09tX79eotvszdt2mSxXqVKlXT+/HnlzJlTbm5u5p/t27dr3rx5srOz04IFC+Tj46OYmBg5ODioSpUqGjVqlCTp3LlzhrbDZDJp27Ztyf79h1y5ckmSBgwYIDs7Ow0fPtyivuPHj6t06dLm2lxdXbVgwQL99NNPyW77045fao7H7t27VaJECTVt2tQcHi5evKijR48+07gCeLVwBAIAXgLVqlVTpkyZNGrUKHXs2FFRUVFas2aNOnToYF7Hx8dHmzZt0rhx4+Tr66vIyEhDl0xNqaJFiypLliwKCQlRhgwZlCFDBq1bt07Lli2TpGeeB9+nTx+1bdtW3bt3V7NmzRQVFaWQkBCLdZo0aaJFixapffv26tq1q/Lnz69ff/1Vc+fOVatWrWRvb6/KlSsrKChI/v7+atWqlezs7LR48WI5ODjIx8dHuXPnfuJ2HDp0SP/995/FeQMPy5Mnj3r37q2RI0fqhx9+UP369dWtWzc1b95cfn5++uSTT5QxY0YtWbJEGzZs0PTp05Nt52nHLzXHw93dXcHBwQoNDVW5cuX0999/a86cOYqJieH8BgBmHIEAgJdA3rx5FRwcrBs3bqhbt26aPXu22rVrp+7du5vXadq0qTp37qwffvhBXbp00d69ex+5s/ossmbNquDgYJlMJn322WcKCAjQuXPntGjRImXOnFmRkZHP1H6FChU0d+5cXbx4Ud27d9eSJUuSXB40U6ZMCg8P11tvvaWJEyeqc+fOWr9+vfr27asBAwZIkkqVKqWQkBDdvn1bffr0Uffu3XX9+nXNnz9fxYoVM7QdW7duVZUqVeTg4PDYmj/55BO5u7trzJgxunbtmkqVKqXw8HDZ2NgoICBAPXv21KVLlzRr1izVqlUr2TaedvxSczwSA8/ChQvVuXNnhYWFqVGjRurevbuOHTv2yJPfAaQvNibOeAIAAABgEEcgAAAAABhGgAAAAABgGAECAAAAgGEECAAAAACGESAAAAAAGEaAAAAAAGAYAQIAAACAYQQIAAAAAIYRIAAAAAAYRoAAAAAAYBgBAgAAAIBhBAgAAAAAhv0fcPeoZO3fM5AAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ax = hazard_counts.sort_values(\"documented_occurrence\").plot.barh(\n",
    "    x=\"hazard_name\", y=\"documented_occurrence\", legend=False, figsize=(8, 4), color=\"#ef4444\"\n",
    ")\n",
    "ax.set(title=\"Unit dengan kejadian terdokumentasi (referensi 2024)\", xlabel=\"Jumlah desa/kelurahan\", ylabel=\"\")\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "77d5bd89",
   "metadata": {},
   "source": [
    "## POC 3 — Policy signal dan konsentrasi spasial"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9a8cd9b6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-04T06:27:39.733412Z",
     "iopub.status.busy": "2026-09-04T06:27:39.733201Z",
     "iopub.status.idle": "2026-09-04T06:27:39.747293Z",
     "shell.execute_reply": "2026-09-04T06:27:39.746781Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>policy_lens</th>\n",
       "      <th>signals</th>\n",
       "      <th>spatially_concentrated</th>\n",
       "      <th>data_limited</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>BASIC_SERVICE_AVAILABILITY</td>\n",
       "      <td>291</td>\n",
       "      <td>278</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>BASIC_UTILITIES</td>\n",
       "      <td>289</td>\n",
       "      <td>277</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>DIGITAL_COMMUNICATION_CONNECTIVITY</td>\n",
       "      <td>87</td>\n",
       "      <td>56</td>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>ECONOMIC_SERVICE_INFRASTRUCTURE</td>\n",
       "      <td>310</td>\n",
       "      <td>305</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>TRANSPORT_SERVICE_AVAILABILITY</td>\n",
       "      <td>91</td>\n",
       "      <td>58</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                          policy_lens  signals  spatially_concentrated  \\\n",
       "0          BASIC_SERVICE_AVAILABILITY      291                     278   \n",
       "1                     BASIC_UTILITIES      289                     277   \n",
       "2  DIGITAL_COMMUNICATION_CONNECTIVITY       87                      56   \n",
       "3     ECONOMIC_SERVICE_INFRASTRUCTURE      310                     305   \n",
       "4      TRANSPORT_SERVICE_AVAILABILITY       91                      58   \n",
       "\n",
       "   data_limited  \n",
       "0             0  \n",
       "1             0  \n",
       "2            15  \n",
       "3             7  \n",
       "4             3  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "policy_summary = (\n",
    "    policy.groupby(\"policy_lens\", as_index=False)\n",
    "    .agg(\n",
    "        signals=(\"is_opportunity_signal\", \"sum\"),\n",
    "        spatially_concentrated=(\"spatial_gap_status\", lambda s: s.eq(\"SPATIALLY_CONCENTRATED_GAP\").sum()),\n",
    "        data_limited=(\"evidence_strength\", lambda s: s.eq(\"LIMITED_EVIDENCE\").sum()),\n",
    "    )\n",
    ")\n",
    "policy_summary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "6d0ff667",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-04T06:27:39.749325Z",
     "iopub.status.busy": "2026-09-04T06:27:39.749121Z",
     "iopub.status.idle": "2026-09-04T06:27:39.762596Z",
     "shell.execute_reply": "2026-09-04T06:27:39.761977Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>policyLens</th>\n",
       "      <th>components</th>\n",
       "      <th>largest_component</th>\n",
       "      <th>cross_district_components</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>ECONOMIC_SERVICE_INFRASTRUCTURE</td>\n",
       "      <td>2</td>\n",
       "      <td>308</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>BASIC_SERVICE_AVAILABILITY</td>\n",
       "      <td>3</td>\n",
       "      <td>288</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>BASIC_UTILITIES</td>\n",
       "      <td>3</td>\n",
       "      <td>286</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>DIGITAL_COMMUNICATION_CONNECTIVITY</td>\n",
       "      <td>9</td>\n",
       "      <td>62</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>TRANSPORT_SERVICE_AVAILABILITY</td>\n",
       "      <td>16</td>\n",
       "      <td>47</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           policyLens  components  largest_component  \\\n",
       "3     ECONOMIC_SERVICE_INFRASTRUCTURE           2                308   \n",
       "0          BASIC_SERVICE_AVAILABILITY           3                288   \n",
       "1                     BASIC_UTILITIES           3                286   \n",
       "2  DIGITAL_COMMUNICATION_CONNECTIVITY           9                 62   \n",
       "4      TRANSPORT_SERVICE_AVAILABILITY          16                 47   \n",
       "\n",
       "   cross_district_components  \n",
       "3                          1  \n",
       "0                          1  \n",
       "1                          1  \n",
       "2                          3  \n",
       "4                          4  "
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "component_summary = (\n",
    "    components.groupby(\"policyLens\", as_index=False)\n",
    "    .agg(\n",
    "        components=(\"componentId\", \"count\"),\n",
    "        largest_component=(\"componentSize\", \"max\"),\n",
    "        cross_district_components=(\"crossDistrict\", \"sum\"),\n",
    "    )\n",
    "    .sort_values(\"largest_component\", ascending=False)\n",
    ")\n",
    "component_summary"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b947ede5",
   "metadata": {},
   "source": [
    "## POC 4 — Satu desa, evidence yang tetap terpisah"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "e7e29d20",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-04T06:27:39.765173Z",
     "iopub.status.busy": "2026-09-04T06:27:39.764884Z",
     "iopub.status.idle": "2026-09-04T06:27:39.782180Z",
     "shell.execute_reply": "2026-09-04T06:27:39.781048Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>village_name</th>\n",
       "      <th>district_name</th>\n",
       "      <th>policy_lens</th>\n",
       "      <th>signal_basis</th>\n",
       "      <th>policy_signal</th>\n",
       "      <th>evidence_strength</th>\n",
       "      <th>spatial_gap_status</th>\n",
       "      <th>typology</th>\n",
       "      <th>hazard_context</th>\n",
       "      <th>reference_period</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Gerbo</td>\n",
       "      <td>Purwodadi</td>\n",
       "      <td>DIGITAL_COMMUNICATION_CONNECTIVITY</td>\n",
       "      <td>RELATIVE_PERCENTILE</td>\n",
       "      <td>NO_RELATIVE_GAP_DETECTED</td>\n",
       "      <td>STRONG_EVIDENCE</td>\n",
       "      <td>NOT_APPLICABLE</td>\n",
       "      <td>C</td>\n",
       "      <td>[]</td>\n",
       "      <td>primarily 2024</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Gerbo</td>\n",
       "      <td>Purwodadi</td>\n",
       "      <td>TRANSPORT_SERVICE_AVAILABILITY</td>\n",
       "      <td>VALIDATED_ABSOLUTE_CONDITION</td>\n",
       "      <td>NO_ABSOLUTE_GAP_DETECTED</td>\n",
       "      <td>MODERATE_EVIDENCE</td>\n",
       "      <td>NOT_APPLICABLE</td>\n",
       "      <td>C</td>\n",
       "      <td>[]</td>\n",
       "      <td>primarily 2024</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Gerbo</td>\n",
       "      <td>Purwodadi</td>\n",
       "      <td>BASIC_SERVICE_AVAILABILITY</td>\n",
       "      <td>VALIDATED_ABSOLUTE_CONDITION</td>\n",
       "      <td>NO_ABSOLUTE_GAP_DETECTED</td>\n",
       "      <td>MODERATE_EVIDENCE</td>\n",
       "      <td>NOT_APPLICABLE</td>\n",
       "      <td>C</td>\n",
       "      <td>[]</td>\n",
       "      <td>primarily 2024</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Gerbo</td>\n",
       "      <td>Purwodadi</td>\n",
       "      <td>ECONOMIC_SERVICE_INFRASTRUCTURE</td>\n",
       "      <td>VALIDATED_ABSOLUTE_CONDITION</td>\n",
       "      <td>ABSOLUTE_GAP</td>\n",
       "      <td>MODERATE_EVIDENCE</td>\n",
       "      <td>SPATIALLY_CONCENTRATED_GAP</td>\n",
       "      <td>C</td>\n",
       "      <td>[]</td>\n",
       "      <td>primarily 2024</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Gerbo</td>\n",
       "      <td>Purwodadi</td>\n",
       "      <td>BASIC_UTILITIES</td>\n",
       "      <td>VALIDATED_ABSOLUTE_CONDITION</td>\n",
       "      <td>ABSOLUTE_GAP</td>\n",
       "      <td>MODERATE_EVIDENCE</td>\n",
       "      <td>SPATIALLY_CONCENTRATED_GAP</td>\n",
       "      <td>C</td>\n",
       "      <td>[]</td>\n",
       "      <td>primarily 2024</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  village_name district_name                         policy_lens  \\\n",
       "0        Gerbo     Purwodadi  DIGITAL_COMMUNICATION_CONNECTIVITY   \n",
       "1        Gerbo     Purwodadi      TRANSPORT_SERVICE_AVAILABILITY   \n",
       "2        Gerbo     Purwodadi          BASIC_SERVICE_AVAILABILITY   \n",
       "3        Gerbo     Purwodadi     ECONOMIC_SERVICE_INFRASTRUCTURE   \n",
       "4        Gerbo     Purwodadi                     BASIC_UTILITIES   \n",
       "\n",
       "                   signal_basis             policy_signal  evidence_strength  \\\n",
       "0           RELATIVE_PERCENTILE  NO_RELATIVE_GAP_DETECTED    STRONG_EVIDENCE   \n",
       "1  VALIDATED_ABSOLUTE_CONDITION  NO_ABSOLUTE_GAP_DETECTED  MODERATE_EVIDENCE   \n",
       "2  VALIDATED_ABSOLUTE_CONDITION  NO_ABSOLUTE_GAP_DETECTED  MODERATE_EVIDENCE   \n",
       "3  VALIDATED_ABSOLUTE_CONDITION              ABSOLUTE_GAP  MODERATE_EVIDENCE   \n",
       "4  VALIDATED_ABSOLUTE_CONDITION              ABSOLUTE_GAP  MODERATE_EVIDENCE   \n",
       "\n",
       "           spatial_gap_status typology hazard_context reference_period  \n",
       "0              NOT_APPLICABLE        C             []   primarily 2024  \n",
       "1              NOT_APPLICABLE        C             []   primarily 2024  \n",
       "2              NOT_APPLICABLE        C             []   primarily 2024  \n",
       "3  SPATIALLY_CONCENTRATED_GAP        C             []   primarily 2024  \n",
       "4  SPATIALLY_CONCENTRATED_GAP        C             []   primarily 2024  "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sample = policy.loc[policy.is_opportunity_signal].iloc[0]\n",
    "sample_profile = policy.loc[\n",
    "    policy.village_id.eq(sample.village_id),\n",
    "    [\"village_name\", \"district_name\", \"policy_lens\", \"signal_basis\", \"policy_signal\", \"evidence_strength\", \"spatial_gap_status\", \"typology\", \"hazard_context\", \"reference_period\"],\n",
    "]\n",
    "sample_profile"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4a47a315",
   "metadata": {},
   "source": [
    "## Kesimpulan\n",
    "\n",
    "`Actionable` di sini berarti evidence dapat ditelusuri dan layak ditelaah, bukan instruksi alokasi anggaran. Lima policy lens menggunakan rule yang sesuai dengan semantik indikator; hazard dan tipologi tetap menjadi konteks terpisah. Overall priority memerlukan objective, bobot normatif, data outcome/equity/accessibility, serta proses governance yang belum tersedia."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.6"
  },
  "pasuruan_lens": {
   "slug": "analytics-to-decision-support",
   "type": "portfolio_poc"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
