{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "minimo-0",
      "metadata": {},
      "source": [
        "# Un scorecard con German Credit\n",
        "\n",
        "Ejemplo mínimo de bayesrisk. Instala el entorno indicado en la guía y extrae la descarga completa. Los datos ya preparados conservan el índice original y excluyen la evaluación exterior agrupada. Autor: Hans Hofmann; UCI, CC BY 4.0. El target original 1/2 se transforma a 0/1, con 1 como malo.\n",
        "\n",
        "Esta corrida usa únicamente el complemento de la evaluación; el Holdout interno es diagnóstico. Ningún resultado elige el modelo automáticamente. El anexo separado contiene el benchmark completo y sus límites."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "minimo-1",
      "metadata": {
        "execution": {
          "iopub.execute_input": "2026-10-19T15:29:44.574079Z",
          "iopub.status.busy": "2026-10-19T15:29:44.574079Z",
          "iopub.status.idle": "2026-10-19T15:29:58.023358Z",
          "shell.execute_reply": "2026-10-19T15:29:58.023358Z"
        }
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "── Datos y muestras ──\n",
            "Archivo: .\\prepared\\german\\input.parquet (copia en ../h10-work\\notebook-runs\\german\\input\\data-43ea3502f6d24b11.parquet)\n",
            "750 filas · 221 malos (29,47 %) · 21 columnas\n",
            "Muestras: Desarrollo 598 (28,09 %) · Holdout 152 (34,87 %) — partición aleatoria: 80 % desarrollo y 20 % holdout, sin muestra fuera de tiempo\n",
            "Se infirió: esquema de 21 columnas (8 numéricas o de fecha, 13 de texto); 20 predictoras (13 categóricas); fuera: target (define el incumplimiento, sería una fuga de información)\n",
            "Identificador: sin identificador declarado: se usa el índice del archivo\n",
            "Evidencia de la corrida: ../h10-work\\notebook-runs\\german\\run\n",
            "── Análisis exploratorio ──\n",
            "Tasa de malos: 28,09 %\n",
            "Tasa de malos en el tiempo: no evaluable (el archivo no trae columna de fecha ni cohorte declarada)\n",
            "20 columnas descritas frente al incumplimiento\n",
            "Marcas de calidad del archivo: ninguna\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "── Tramos y WoE ──\n",
            "20 de 20 variables tramificadas\n",
            "Categorías con muy pocas operaciones agrupadas para poder calcular su WoE: «x4» (nivel A48: 3 operaciones, ninguna incumplida)\n",
            "Poder predictivo (IV): fuerte: x1 · medio: x2, x3, x4, x5, x6, x7, x12, x15 · débil: x8, x13, x14, x17, x19 · sin poder: x9, x10, x11, x16, x18, x20\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "── Selección de variables ──\n",
            "Entran 14 de 20 variables candidatas\n",
            "Salen: x10 (IV insuficiente), x11 (IV insuficiente), x16 (IV insuficiente), x18 (IV insuficiente), x20 (ser constante o no finita), x9 (IV insuficiente)\n",
            "Correlación máxima entre las finales 0,5695 y VIF máximo 1,75\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "── Modelo ──\n",
            "Variables finales (11): x1, x14, x15, x19, x2, x3, x4, x5, x6, x7, x8\n",
            "Stepwise bidireccional: 11 iteraciones, 11 entradas y 0 salidas\n",
            "Ajuste en Desarrollo: pseudo-R² de McFadden 0,2398 · AIC 563,9 · p-valor del test de razón de verosimilitud < 0,001 · convergió\n",
            "⚠ Concentra más del 90 % del IV del modelo: x1\n",
            "── Tarjeta de puntuación ──\n",
            "Escala: 20 puntos por duplicar las odds, 600 puntos a odds 50:1 (factor 28,85, desplazamiento 487,12)\n",
            "Puntajes observados: de 401 a 641 (media 525,2)\n",
            "11 variables con puntos; un puntaje más alto indica menor riesgo\n",
            "── Calibración ──\n",
            "Método: desplazamiento del intercepto (intercept offset); ancla a través del ciclo (TTC): la tasa de incumplimiento observada en Desarrollo = 28,09 %\n",
            "PD media en Desarrollo: cruda 28,09 % → calibrada 28,09 % (desplazamiento del intercepto 0,0000)\n",
            "Orden de riesgo preservado\n",
            "── Desempeño ──\n",
            "Desarrollo: AUC 0,823 · Gini 0,645 · KS 0,505\n",
            "Holdout: AUC 0,824 · Gini 0,647 · KS 0,554\n",
            "Caída Desarrollo → Holdout: AUC +0,00098 (0,1 %) · KS +0,049 (9,6 %)\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "── Estabilidad ──\n",
            "Desarrollo vs. Holdout: peor PSI 0,0764 (score) → Estable\n",
            "CSI más alto: x3 (0,0444)\n",
            "── Validación formal ──\n",
            "Estado técnico: Pasa\n",
            "1 prueba con veredicto, 0 fallidas; familias: discriminación, calibración y estabilidad\n",
            "El estado técnico es una síntesis del motor; el veredicto lo firma un validador\n",
            "── Escala maestra ──\n",
            "5 tramos de puntaje, del 1, de menor riesgo, al 5; cada uno con al menos el 5 % de Desarrollo y una tasa de malos distinta de la de sus vecinos.\n",
            "PD del tramo de 5,44 % a 73,80 %; su promedio en Desarrollo es el ancla de la calibración, 28,09 %.\n",
            "En Holdout la tasa de malos sigue el orden de los tramos con contraste y ninguno subestima su PD.\n",
            "El tramo mayor tiene el 38,0 % de Desarrollo (tramo 1); índice de concentración 0,246.\n",
            "Sin corte declarado: la tabla de cortes muestra, para cada límite, cuánto se aprueba, la tasa de malos, los malos evitados y los buenos rechazados.\n",
            "La PD de cada tramo es su tasa de malos de Desarrollo llevada al ancla de la calibración; en una cartera de aprobados, la tabla mide a quien pasó la política anterior.\n",
            "⚠ En Holdout, los tramos 3, 4 y 5 tienen menos de 30 operaciones con desenlace: sin contraste.\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "── Informe y ficha ──\n",
            "Informe HTML: ../h10-work\\notebook-runs\\german\\reports\\scorecard_report.html\n",
            "Informe Word: ../h10-work\\notebook-runs\\german\\reports\\scorecard_report.docx\n",
            "Informe PDF: no se generó (falta el extra de PDF o su motor nativo)\n",
            "Registro de auditoría: ../h10-work\\notebook-runs\\german\\run\\audit_trail.jsonl\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Ejecución: completada\n",
            "Validación técnica: Pasa\n"
          ]
        },
        {
          "data": {
            "text/html": [
              "<div class=\"bayesrisk-summary\"><h2>Resumen del scorecard</h2><p><b>Ejecución:</b> completada</p><p><b>Validación técnica:</b> Pasa</p><table><tbody><tr><th>AUC en Holdout</th><td>0,824</td></tr><tr><th>Gini en Holdout</th><td>0,647</td></tr><tr><th>KS en Holdout</th><td>0,554</td></tr><tr><th>Caída del AUC Desarrollo → Holdout</th><td>0,00098 (0,1 %)</td></tr><tr><th>Peor PSI entre score y PD</th><td>0,0764 (Desarrollo vs. Holdout) → Estable</td></tr></tbody></table><h4>Qué revisar</h4><ul><li>⚠ Modelo: Concentra más del 90 % del IV del modelo: x1</li><li>⚠ Escala maestra: En Holdout, los tramos 3, 4 y 5 tienen menos de 30 operaciones con desenlace: sin contraste.</li></ul><h4>Decisiones humanas registradas</h4><ul><li>Ninguna decisión humana registrada; lo que se decidió vive en el config de la corrida.</li></ul><h4>Dónde quedó cada archivo</h4><ul><li>Carpeta del proyecto: <code>../h10-work\\notebook-runs\\german</code></li><li>Config vigente: <code>../h10-work\\notebook-runs\\german\\config.yaml</code></li><li>Evidencia de la corrida: <code>../h10-work\\notebook-runs\\german\\run</code></li><li>Registro de auditoría: <code>../h10-work\\notebook-runs\\german\\run\\audit_trail.jsonl</code></li><li>Informe HTML: <code>../h10-work\\notebook-runs\\german\\reports\\scorecard_report.html</code></li><li>Informe Word: <code>../h10-work\\notebook-runs\\german\\reports\\scorecard_report.docx</code></li></ul></div>"
            ],
            "text/plain": [
              "Scorecard(name='german', project_dir='../h10-work\\\\notebook-runs\\\\german', estado='done')"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from bayesrisk import Scorecard\n",
        "\n",
        "sc = Scorecard(\n",
        "    \"prepared/german/input.parquet\",\n",
        "    target=\"target\",\n",
        "    partition=\"random\",\n",
        "    name=\"german\",\n",
        "    run_dir=\"../h10-work/notebook-runs\",\n",
        "    formats=[\"html\", \"docx\"],\n",
        ")\n",
        "sc.run(raise_on_error=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "minimo-2",
      "metadata": {},
      "source": [
        "## Leer una etapa\n",
        "\n",
        "La tabla y el resumen salen de los mismos artefactos del motor. Desarrollo ajusta; Holdout diagnostica."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "minimo-3",
      "metadata": {
        "execution": {
          "iopub.execute_input": "2026-10-19T15:29:58.025447Z",
          "iopub.status.busy": "2026-10-19T15:29:58.025447Z",
          "iopub.status.idle": "2026-10-19T15:29:58.033503Z",
          "shell.execute_reply": "2026-10-19T15:29:58.033503Z"
        }
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div class=\"bayesrisk-summary\"><h3>Datos y muestras</h3><ul><li>Archivo: .\\prepared\\german\\input.parquet (copia en ../h10-work\\notebook-runs\\german\\input\\data-43ea3502f6d24b11.parquet)</li><li>750 filas · 221 malos (29,47 %) · 21 columnas</li><li>Muestras: Desarrollo 598 (28,09 %) · Holdout 152 (34,87 %) — partición aleatoria: 80 % desarrollo y 20 % holdout, sin muestra fuera de tiempo</li><li>Se infirió: esquema de 21 columnas (8 numéricas o de fecha, 13 de texto); 20 predictoras (13 categóricas); fuera: target (define el incumplimiento, sería una fuga de información)</li><li>Identificador: sin identificador declarado: se usa el índice del archivo</li><li>Evidencia de la corrida: ../h10-work\\notebook-runs\\german\\run</li></ul><table class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th>Muestra</th>\n",
              "      <th>Filas</th>\n",
              "      <th>Malos</th>\n",
              "      <th>Tasa de malos</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <td>Desarrollo</td>\n",
              "      <td>598</td>\n",
              "      <td>168</td>\n",
              "      <td>28,09 %</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>Holdout</td>\n",
              "      <td>152</td>\n",
              "      <td>53</td>\n",
              "      <td>34,87 %</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table></div>"
            ],
            "text/plain": [
              "StageSummary(stage='data', label='Datos y muestras', lines=('Archivo: .\\\\prepared\\\\german\\\\input.parquet (copia en ../h10-work\\\\notebook-runs\\\\german\\\\input\\\\data-43ea3502f6d24b11.parquet)', '750 filas · 221 malos (29,47 %) · 21 columnas', 'Muestras: Desarrollo 598 (28,09 %) · Holdout 152 (34,87 %) — partición aleatoria: 80 % desarrollo y 20 % holdout, sin muestra fuera de tiempo', 'Se infirió: esquema de 21 columnas (8 numéricas o de fecha, 13 de texto); 20 predictoras (13 categóricas); fuera: target (define el incumplimiento, sería una fuga de información)', 'Identificador: sin identificador declarado: se usa el índice del archivo', 'Evidencia de la corrida: ../h10-work\\\\notebook-runs\\\\german\\\\run'), alerts=(), table=      Muestra  Filas  Malos  Tasa de malos\n",
              "0  Desarrollo    598    168       0.280936\n",
              "1     Holdout    152     53       0.348684, formats={'Filas': 'int', 'Malos': 'int', 'Tasa de malos': 'pct'})"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "sc.summary(\"data\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "minimo-4",
      "metadata": {
        "execution": {
          "iopub.execute_input": "2026-10-19T15:29:58.035508Z",
          "iopub.status.busy": "2026-10-19T15:29:58.035508Z",
          "iopub.status.idle": "2026-10-19T15:29:58.056401Z",
          "shell.execute_reply": "2026-10-19T15:29:58.056401Z"
        }
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div class=\"bayesrisk-summary\"><h2>Resumen del scorecard</h2><p><b>Ejecución:</b> completada</p><p><b>Validación técnica:</b> Pasa</p><table><tbody><tr><th>AUC en Holdout</th><td>0,824</td></tr><tr><th>Gini en Holdout</th><td>0,647</td></tr><tr><th>KS en Holdout</th><td>0,554</td></tr><tr><th>Caída del AUC Desarrollo → Holdout</th><td>0,00098 (0,1 %)</td></tr><tr><th>Peor PSI entre score y PD</th><td>0,0764 (Desarrollo vs. Holdout) → Estable</td></tr></tbody></table><h4>Qué revisar</h4><ul><li>⚠ Modelo: Concentra más del 90 % del IV del modelo: x1</li><li>⚠ Escala maestra: En Holdout, los tramos 3, 4 y 5 tienen menos de 30 operaciones con desenlace: sin contraste.</li></ul><h4>Decisiones humanas registradas</h4><ul><li>Ninguna decisión humana registrada; lo que se decidió vive en el config de la corrida.</li></ul><h4>Dónde quedó cada archivo</h4><ul><li>Carpeta del proyecto: <code>../h10-work\\notebook-runs\\german</code></li><li>Config vigente: <code>../h10-work\\notebook-runs\\german\\config.yaml</code></li><li>Evidencia de la corrida: <code>../h10-work\\notebook-runs\\german\\run</code></li><li>Registro de auditoría: <code>../h10-work\\notebook-runs\\german\\run\\audit_trail.jsonl</code></li><li>Informe HTML: <code>../h10-work\\notebook-runs\\german\\reports\\scorecard_report.html</code></li><li>Informe Word: <code>../h10-work\\notebook-runs\\german\\reports\\scorecard_report.docx</code></li></ul></div>"
            ],
            "text/plain": [
              "FinalSummary(execution='completada', validation='Pasa', figures=(('AUC en Holdout', '0,824'), ('Gini en Holdout', '0,647'), ('KS en Holdout', '0,554'), ('Caída del AUC Desarrollo → Holdout', '0,00098 (0,1 %)'), ('Peor PSI entre score y PD', '0,0764 (Desarrollo vs. Holdout) → Estable')), review=('Modelo: Concentra más del 90 % del IV del modelo: x1', 'Escala maestra: En Holdout, los tramos 3, 4 y 5 tienen menos de 30 operaciones con desenlace: sin contraste.'), decisions=(), files=(('Carpeta del proyecto', '../h10-work\\\\notebook-runs\\\\german'), ('Config vigente', '../h10-work\\\\notebook-runs\\\\german\\\\config.yaml'), ('Evidencia de la corrida', '../h10-work\\\\notebook-runs\\\\german\\\\run'), ('Registro de auditoría', '../h10-work\\\\notebook-runs\\\\german\\\\run\\\\audit_trail.jsonl'), ('Informe HTML', '../h10-work\\\\notebook-runs\\\\german\\\\reports\\\\scorecard_report.html'), ('Informe Word', '../h10-work\\\\notebook-runs\\\\german\\\\reports\\\\scorecard_report.docx')), stages=(StageSummary(stage='data', label='Datos y muestras', lines=('Archivo: .\\\\prepared\\\\german\\\\input.parquet (copia en ../h10-work\\\\notebook-runs\\\\german\\\\input\\\\data-43ea3502f6d24b11.parquet)', '750 filas · 221 malos (29,47 %) · 21 columnas', 'Muestras: Desarrollo 598 (28,09 %) · Holdout 152 (34,87 %) — partición aleatoria: 80 % desarrollo y 20 % holdout, sin muestra fuera de tiempo', 'Se infirió: esquema de 21 columnas (8 numéricas o de fecha, 13 de texto); 20 predictoras (13 categóricas); fuera: target (define el incumplimiento, sería una fuga de información)', 'Identificador: sin identificador declarado: se usa el índice del archivo', 'Evidencia de la corrida: ../h10-work\\\\notebook-runs\\\\german\\\\run'), alerts=(), table=      Muestra  Filas  Malos  Tasa de malos\n",
              "0  Desarrollo    598    168       0.280936\n",
              "1     Holdout    152     53       0.348684, formats={'Filas': 'int', 'Malos': 'int', 'Tasa de malos': 'pct'}), StageSummary(stage='eda', label='Análisis exploratorio', lines=('Tasa de malos: 28,09 %', 'Tasa de malos en el tiempo: no evaluable (el archivo no trae columna de fecha ni cohorte declarada)', '20 columnas descritas frente al incumplimiento', 'Marcas de calidad del archivo: ninguna'), alerts=(), table=None, formats={}), StageSummary(stage='binning', label='Tramos y WoE', lines=('20 de 20 variables tramificadas', 'Categorías con muy pocas operaciones agrupadas para poder calcular su WoE: «x4» (nivel A48: 3 operaciones, ninguna incumplida)', 'Poder predictivo (IV): fuerte: x1 · medio: x2, x3, x4, x5, x6, x7, x12, x15 · débil: x8, x13, x14, x17, x19 · sin poder: x9, x10, x11, x16, x18, x20'), alerts=(), table=   Variable        Tipo  Tramos        IV Banda de IV    Tendencia\n",
              "0        x1  categórica       4  0.453564      fuerte            —\n",
              "1        x2    numérica       6  0.285661       medio   ascendente\n",
              "2        x3  categórica       4  0.275734       medio            —\n",
              "3        x4  categórica       7  0.177021       medio            —\n",
              "4        x5    numérica       4  0.141978       medio   ascendente\n",
              "5        x6  categórica       5  0.169899       medio            —\n",
              "6        x7  categórica       5  0.104430       medio            —\n",
              "7        x8    numérica       4  0.064408       débil   ascendente\n",
              "8        x9  categórica       3  0.017493   sin poder            —\n",
              "9       x10  categórica       2  0.005800   sin poder            —\n",
              "10      x11    numérica       3  0.003735   sin poder   ascendente\n",
              "11      x12  categórica       4  0.162721       medio            —\n",
              "12      x13    numérica       3  0.056583       débil  descendente\n",
              "13      x14  categórica       3  0.098632       débil            —\n",
              "14      x15  categórica       3  0.114894       medio            —\n",
              "15      x16    numérica       2  0.007919   sin poder  descendente\n",
              "16      x17  categórica       3  0.023900       débil            —\n",
              "17      x18    numérica       2  0.001800   sin poder   ascendente\n",
              "18      x19  categórica       2  0.022935       débil            —\n",
              "19      x20  categórica       1  0.000000   sin poder            —, formats={'Tramos': 'int', 'IV': 'num3'}), StageSummary(stage='selection', label='Selección de variables', lines=('Entran 14 de 20 variables candidatas', 'Salen: x10 (IV insuficiente), x11 (IV insuficiente), x16 (IV insuficiente), x18 (IV insuficiente), x20 (ser constante o no finita), x9 (IV insuficiente)', 'Correlación máxima entre las finales 0,5695 y VIF máximo 1,75'), alerts=(), table=   Variable Entra                     Motivo        IV       AUC        KS  \\\n",
              "0        x1    sí                  inclusión  0.453564  0.677409  0.305814   \n",
              "1       x10    no            IV insuficiente  0.005800  0.508749  0.017497   \n",
              "2       x11    no            IV insuficiente  0.003735  0.510244  0.020487   \n",
              "3       x12    sí                  inclusión  0.162721  0.604499  0.146678   \n",
              "4       x13    sí                  inclusión  0.056583  0.561503  0.099336   \n",
              "5       x14    sí                  inclusión  0.098632  0.565407  0.128876   \n",
              "6       x15    sí                  inclusión  0.114894  0.577547  0.146069   \n",
              "7       x16    no            IV insuficiente  0.007919  0.521193  0.042386   \n",
              "8       x17    sí                  inclusión  0.023900  0.537805  0.046539   \n",
              "9       x18    no            IV insuficiente  0.001800  0.507752  0.015504   \n",
              "10      x19    sí                  inclusión  0.022935  0.537057  0.074114   \n",
              "11       x2    sí                  inclusión  0.285661  0.640767  0.196955   \n",
              "12      x20    no  ser constante o no finita  0.000000  0.500000  0.000000   \n",
              "13       x3    sí                  inclusión  0.275734  0.625000  0.169989   \n",
              "14       x4    sí                  inclusión  0.177021  0.611116  0.161766   \n",
              "15       x5    sí                  inclusión  0.141978  0.586496  0.160770   \n",
              "16       x6    sí                  inclusión  0.169899  0.596795  0.169823   \n",
              "17       x7    sí                  inclusión  0.104430  0.587908  0.133084   \n",
              "18       x8    sí                  inclusión  0.064408  0.561773  0.097757   \n",
              "19       x9    no            IV insuficiente  0.017493  0.533721  0.064563   \n",
              "\n",
              "   Correlación máxima       VIF  IV Desarrollo  IV Holdout  \n",
              "0                None  1.102854       0.453564    0.857345  \n",
              "1                None       NaN         0.0058    0.016877  \n",
              "2                None       NaN       0.003735    0.011026  \n",
              "3                None  1.748812       0.162721    0.182478  \n",
              "4                None  1.123869       0.056583    0.125973  \n",
              "5                None  1.084671       0.098632    0.047913  \n",
              "6                None  1.514559       0.114894    0.100734  \n",
              "7                None       NaN       0.007919    0.001517  \n",
              "8                None  1.287751         0.0239    0.025837  \n",
              "9                None       NaN         0.0018     0.00689  \n",
              "10               None  1.278766       0.022935    0.001385  \n",
              "11               None  1.603855       0.285661    0.499001  \n",
              "12               None       NaN            0.0         0.0  \n",
              "13               None  1.134714       0.275734    0.381273  \n",
              "14               None  1.041678       0.177021    0.237876  \n",
              "15               None  1.733692       0.141978    0.420404  \n",
              "16               None  1.050693       0.169899    0.552936  \n",
              "17               None  1.120054        0.10443    0.053673  \n",
              "18               None  1.245530       0.064408    0.019329  \n",
              "19               None       NaN       0.017493    0.003348  , formats={'IV': 'num3', 'AUC': 'num3', 'KS': 'num3', 'Correlación máxima': 'num3', 'VIF': 'num2', 'IV Desarrollo': 'num3', 'IV Holdout': 'num3'}), StageSummary(stage='model', label='Modelo', lines=('Variables finales (11): x1, x14, x15, x19, x2, x3, x4, x5, x6, x7, x8', 'Stepwise bidireccional: 11 iteraciones, 11 entradas y 0 salidas', 'Ajuste en Desarrollo: pseudo-R² de McFadden 0,2398 · AIC 563,9 · p-valor del test de razón de verosimilitud < 0,001 · convergió'), alerts=('Concentra más del 90 % del IV del modelo: x1',), table=      Variable  Coeficiente  Error estándar       p-valor Signo esperado  \\\n",
              "0   intercepto    -0.968357        0.110349  1.702752e-18              —   \n",
              "1           x1    -0.816107        0.163856  6.337453e-07             sí   \n",
              "2          x14    -0.687082        0.334414  3.991940e-02             sí   \n",
              "3          x15    -0.670871        0.310087  3.050352e-02             sí   \n",
              "4          x19    -1.860485        0.765148  1.503488e-02             sí   \n",
              "5           x2    -0.637368        0.239035  7.666304e-03             sí   \n",
              "6           x3    -0.708901        0.208623  6.787908e-04             sí   \n",
              "7           x4    -0.963025        0.257628  1.854561e-04             sí   \n",
              "8           x5    -1.206649        0.368893  1.071698e-03             sí   \n",
              "9           x6    -0.890464        0.284110  1.723097e-03             sí   \n",
              "10          x7    -1.046900        0.335002  1.777713e-03             sí   \n",
              "11          x8    -1.730249        0.492564  4.435089e-04             sí   \n",
              "\n",
              "          IV  Contribución al IV  \n",
              "0        NaN                 NaN  \n",
              "1   0.453564            0.237573  \n",
              "2   0.098632            0.051663  \n",
              "3   0.114894            0.060180  \n",
              "4   0.022935            0.012013  \n",
              "5   0.285661            0.149627  \n",
              "6   0.275734            0.144427  \n",
              "7   0.177021            0.092722  \n",
              "8   0.141978            0.074367  \n",
              "9   0.169899            0.088992  \n",
              "10  0.104430            0.054700  \n",
              "11  0.064408            0.033736  , formats={'Coeficiente': 'num', 'Error estándar': 'num', 'p-valor': 'pvalor', 'IV': 'num3', 'Contribución al IV': 'pct'}), StageSummary(stage='scorecard', label='Tarjeta de puntuación', lines=('Escala: 20 puntos por duplicar las odds, 600 puntos a odds 50:1 (factor 28,85, desplazamiento 487,12)', 'Puntajes observados: de 401 a 641 (media 525,2)', '11 variables con puntos; un puntaje más alto indica menor riesgo'), alerts=(), table=   Variable               Tramo       WoE  Puntos\n",
              "0        x1                 A14  0.896390      68\n",
              "1        x1                 A13  0.328690      55\n",
              "2        x1                 A12 -0.276527      40\n",
              "3        x1                 A11 -0.735521      30\n",
              "4        x1  Valores especiales  0.000000      47\n",
              "..      ...                 ...       ...     ...\n",
              "72       x8       ≥ 1,5 y < 2,5  0.103221      52\n",
              "73       x8       ≥ 2,5 y < 3,5  0.025260      48\n",
              "74       x8               ≥ 3,5 -0.194306      37\n",
              "75       x8  Valores especiales  0.000000      47\n",
              "76       x8           Faltantes  0.000000      47\n",
              "\n",
              "[77 rows x 4 columns], formats={'WoE': 'num3', 'Puntos': 'int'}), StageSummary(stage='calibration', label='Calibración', lines=('Método: desplazamiento del intercepto (intercept offset); ancla a través del ciclo (TTC): la tasa de incumplimiento observada en Desarrollo = 28,09 %', 'PD media en Desarrollo: cruda 28,09 % → calibrada 28,09 % (desplazamiento del intercepto 0,0000)', 'Orden de riesgo preservado'), alerts=(), table=      Muestra  Filas  PD media cruda  PD media calibrada  \\\n",
              "0  Desarrollo    598        0.280936            0.280936   \n",
              "1     Holdout    152        0.291642            0.291642   \n",
              "\n",
              "   Tasa de malos observada  \n",
              "0                 0.280936  \n",
              "1                 0.348684  , formats={'Filas': 'int', 'PD media cruda': 'pct', 'PD media calibrada': 'pct', 'Tasa de malos observada': 'pct'}), StageSummary(stage='performance', label='Desempeño', lines=('Desarrollo: AUC 0,823 · Gini 0,645 · KS 0,505', 'Holdout: AUC 0,824 · Gini 0,647 · KS 0,554', 'Caída Desarrollo → Holdout: AUC +0,00098 (0,1 %) · KS +0,049 (9,6 %)'), alerts=(), table=       Muestra  Decil  Filas  Malos  Tasa de malos  PD media  Puntaje medio  \\\n",
              "0   Desarrollo      1     60     43       0.716667  0.758478     452.683333   \n",
              "1   Desarrollo      2     60     39       0.650000  0.582673     478.066667   \n",
              "2   Desarrollo      3     60     26       0.433333  0.438317     495.016667   \n",
              "3   Desarrollo      4     60     19       0.316667  0.326647     508.533333   \n",
              "4   Desarrollo      5     60     15       0.250000  0.235484     521.600000   \n",
              "5   Desarrollo      6     60     13       0.216667  0.174641     532.416667   \n",
              "6   Desarrollo      7     60      3       0.050000  0.124508     544.050000   \n",
              "7   Desarrollo      8     60      3       0.050000  0.086381     555.800000   \n",
              "8   Desarrollo      9     59      7       0.118644  0.052582     571.440678   \n",
              "9   Desarrollo     10     59      0       0.000000  0.021524     600.576271   \n",
              "10     Holdout      1     16     13       0.812500  0.823477     440.250000   \n",
              "11     Holdout      2     16     11       0.687500  0.581027     478.187500   \n",
              "12     Holdout      3     15     10       0.666667  0.390922     500.266667   \n",
              "13     Holdout      4     15      5       0.333333  0.312428     510.400000   \n",
              "14     Holdout      5     15      4       0.266667  0.244878     520.133333   \n",
              "15     Holdout      6     15      5       0.333333  0.196076     528.533333   \n",
              "16     Holdout      7     15      0       0.000000  0.139794     540.200000   \n",
              "17     Holdout      8     15      3       0.200000  0.090532     554.200000   \n",
              "18     Holdout      9     15      1       0.066667  0.057593     568.800000   \n",
              "19     Holdout     10     15      1       0.066667  0.024947     596.866667   \n",
              "\n",
              "    Captura acumulada de malos  KS en el decil  \n",
              "0                     0.255952        0.216417  \n",
              "1                     0.488095        0.399723  \n",
              "2                     0.642857        0.475415  \n",
              "3                     0.755952        0.493162  \n",
              "4                     0.845238        0.477796  \n",
              "5                     0.922619        0.445875  \n",
              "6                     0.940476        0.331174  \n",
              "7                     0.958333        0.216473  \n",
              "8                     1.000000        0.137209  \n",
              "9                     1.000000        0.000000  \n",
              "10                    0.245283        0.214980  \n",
              "11                    0.452830        0.372022  \n",
              "12                    0.641509        0.510196  \n",
              "13                    0.735849        0.503526  \n",
              "14                    0.811321        0.467886  \n",
              "15                    0.905660        0.461216  \n",
              "16                    0.905660        0.309701  \n",
              "17                    0.962264        0.245092  \n",
              "18                    0.981132        0.122546  \n",
              "19                    1.000000        0.000000  , formats={'Decil': 'int', 'Filas': 'int', 'Malos': 'int', 'Tasa de malos': 'pct', 'PD media': 'pct', 'Puntaje medio': 'num2', 'Captura acumulada de malos': 'pct', 'KS en el decil': 'num3'}), StageSummary(stage='stability', label='Estabilidad', lines=('Desarrollo vs. Holdout: peor PSI 0,0764 (score) → Estable', 'CSI más alto: x3 (0,0444)'), alerts=(), table=          Métrica             Comparación       Variable     Valor    Banda\n",
              "0   PSI del score  Desarrollo vs. Holdout          score  0.076373  Estable\n",
              "1    PSI de la PD  Desarrollo vs. Holdout  pd_calibrated  0.061193  Estable\n",
              "2             CSI  Desarrollo vs. Holdout    x14__points  0.010532  Estable\n",
              "3             CSI  Desarrollo vs. Holdout    x15__points  0.004450  Estable\n",
              "4             CSI  Desarrollo vs. Holdout    x19__points  0.002432  Estable\n",
              "5             CSI  Desarrollo vs. Holdout     x1__points  0.039580  Estable\n",
              "6             CSI  Desarrollo vs. Holdout     x2__points  0.028657  Estable\n",
              "7             CSI  Desarrollo vs. Holdout     x3__points  0.044424  Estable\n",
              "8             CSI  Desarrollo vs. Holdout     x4__points  0.041958  Estable\n",
              "9             CSI  Desarrollo vs. Holdout     x5__points  0.026409  Estable\n",
              "10            CSI  Desarrollo vs. Holdout     x6__points  0.005389  Estable\n",
              "11            CSI  Desarrollo vs. Holdout     x7__points  0.011394  Estable\n",
              "12            CSI  Desarrollo vs. Holdout     x8__points  0.016675  Estable, formats={'Valor': 'num'}), StageSummary(stage='validation', label='Validación formal', lines=('Estado técnico: Pasa', '1 prueba con veredicto, 0 fallidas; familias: discriminación, calibración y estabilidad', 'El estado técnico es una síntesis del motor; el veredicto lo firma un validador'), alerts=(), table=           Familia                        Prueba                 Muestra  \\\n",
              "0   Discriminación                           AUC              Desarrollo   \n",
              "1   Discriminación                           AUC                 Holdout   \n",
              "2      Calibración               Hosmer-Lemeshow              Desarrollo   \n",
              "3      Calibración              Puntaje de Brier              Desarrollo   \n",
              "4      Calibración               Hosmer-Lemeshow                 Holdout   \n",
              "5      Calibración              Puntaje de Brier                 Holdout   \n",
              "6      Estabilidad         PSI del score · score  Desarrollo vs. Holdout   \n",
              "7      Estabilidad  PSI de la PD · pd_calibrated  Desarrollo vs. Holdout   \n",
              "8      Estabilidad                     CSI · x14  Desarrollo vs. Holdout   \n",
              "9      Estabilidad                     CSI · x15  Desarrollo vs. Holdout   \n",
              "10     Estabilidad                     CSI · x19  Desarrollo vs. Holdout   \n",
              "11     Estabilidad                      CSI · x1  Desarrollo vs. Holdout   \n",
              "12     Estabilidad                      CSI · x2  Desarrollo vs. Holdout   \n",
              "13     Estabilidad                      CSI · x3  Desarrollo vs. Holdout   \n",
              "14     Estabilidad                      CSI · x4  Desarrollo vs. Holdout   \n",
              "15     Estabilidad                      CSI · x5  Desarrollo vs. Holdout   \n",
              "16     Estabilidad                      CSI · x6  Desarrollo vs. Holdout   \n",
              "17     Estabilidad                      CSI · x7  Desarrollo vs. Holdout   \n",
              "18     Estabilidad                      CSI · x8  Desarrollo vs. Holdout   \n",
              "\n",
              "        Valor   p-valor                                          Veredicto  \n",
              "0    0.822730       NaN                                           Evaluada  \n",
              "1    0.823709       NaN                                           Evaluada  \n",
              "2   12.180564  0.143328                                               Pasa  \n",
              "3    0.146990       NaN                                      Sin veredicto  \n",
              "4         NaN       NaN  Sin veredicto (un grupo de PD quedó bajo el mí...  \n",
              "5    0.166535       NaN                                      Sin veredicto  \n",
              "6    0.076373       NaN                                     Pasa (Estable)  \n",
              "7    0.061193       NaN                                     Pasa (Estable)  \n",
              "8    0.010532       NaN                                     Pasa (Estable)  \n",
              "9    0.004450       NaN                                     Pasa (Estable)  \n",
              "10   0.002432       NaN                                     Pasa (Estable)  \n",
              "11   0.039580       NaN                                     Pasa (Estable)  \n",
              "12   0.028657       NaN                                     Pasa (Estable)  \n",
              "13   0.044424       NaN                                     Pasa (Estable)  \n",
              "14   0.041958       NaN                                     Pasa (Estable)  \n",
              "15   0.026409       NaN                                     Pasa (Estable)  \n",
              "16   0.005389       NaN                                     Pasa (Estable)  \n",
              "17   0.011394       NaN                                     Pasa (Estable)  \n",
              "18   0.016675       NaN                                     Pasa (Estable)  , formats={'Valor': 'num', 'p-valor': 'pvalor'}), StageSummary(stage='master_scale', label='Escala maestra', lines=('5 tramos de puntaje, del 1, de menor riesgo, al 5; cada uno con al menos el 5 % de Desarrollo y una tasa de malos distinta de la de sus vecinos.', 'PD del tramo de 5,44 % a 73,80 %; su promedio en Desarrollo es el ancla de la calibración, 28,09 %.', 'En Holdout la tasa de malos sigue el orden de los tramos con contraste y ninguno subestima su PD.', 'El tramo mayor tiene el 38,0 % de Desarrollo (tramo 1); índice de concentración 0,246.', 'Sin corte declarado: la tabla de cortes muestra, para cada límite, cuánto se aprueba, la tasa de malos, los malos evitados y los buenos rechazados.', 'La PD de cada tramo es su tasa de malos de Desarrollo llevada al ancla de la calibración; en una cartera de aprobados, la tabla mide a quien pasó la política anterior.'), alerts=('En Holdout, los tramos 3, 4 y 5 tienen menos de 30 operaciones con desenlace: sin contraste.',), table=   Tramo              Puntaje  PD del tramo  Participación Desarrollo  \\\n",
              "0      1     desde 541 puntos      0.054447                  0.379599   \n",
              "1      2  de 517 a 540 puntos      0.206119                  0.204013   \n",
              "2      3  de 503 a 516 puntos      0.342946                  0.122074   \n",
              "3      4  de 472 a 502 puntos      0.507520                  0.177258   \n",
              "4      5     hasta 471 puntos      0.738026                  0.117057   \n",
              "\n",
              "   Tasa de malos Desarrollo Semáforo Desarrollo  Participación Holdout  \\\n",
              "0                  0.052863               Verde               0.348684   \n",
              "1                  0.204918               Verde               0.223684   \n",
              "2                  0.342466               Verde               0.151316   \n",
              "3                  0.509434               Verde               0.138158   \n",
              "4                  0.742857               Verde               0.138158   \n",
              "\n",
              "   Tasa de malos Holdout Semáforo Holdout  \n",
              "0               0.094340            Verde  \n",
              "1               0.235294            Verde  \n",
              "2               0.391304    Sin contraste  \n",
              "3               0.666667    Sin contraste  \n",
              "4               0.809524    Sin contraste  , formats={'Tramo': 'int', 'PD del tramo': 'pct', 'Participación Desarrollo': 'pct', 'Tasa de malos Desarrollo': 'pct', 'Participación Holdout': 'pct', 'Tasa de malos Holdout': 'pct'}), StageSummary(stage='report', label='Informe y ficha', lines=('Informe HTML: ../h10-work\\\\notebook-runs\\\\german\\\\reports\\\\scorecard_report.html', 'Informe Word: ../h10-work\\\\notebook-runs\\\\german\\\\reports\\\\scorecard_report.docx', 'Informe PDF: no se generó (falta el extra de PDF o su motor nativo)', 'Registro de auditoría: ../h10-work\\\\notebook-runs\\\\german\\\\run\\\\audit_trail.jsonl'), alerts=(), table=None, formats={})))"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "sc.summary()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "minimo-5",
      "metadata": {},
      "source": [
        "## Conservar y abrir en pantalla\n",
        "\n",
        "El YAML y la copia del input permiten ejecutar la puerta completa y la pantalla. El archivo original de datos sigue intacto. Los libros Excel son opcionales; el informe HTML y Word ya queda en ../h10-work/notebook-runs/german/reports.\n",
        "\n",
        "Cinco conceptos de bayesrisk: Scorecard, run, summary, to_yaml, export_excel. El anexo agrega preparación, referentes, métricas, controles y repeticiones; no forma parte de este mínimo."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "minimo-6",
      "metadata": {
        "execution": {
          "iopub.execute_input": "2026-10-19T15:29:58.057915Z",
          "iopub.status.busy": "2026-10-19T15:29:58.057915Z",
          "iopub.status.idle": "2026-10-19T15:30:02.172448Z",
          "shell.execute_reply": "2026-10-19T15:30:02.172448Z"
        }
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Excel por etapa: 12 libros en ../h10-work\\notebook-runs\\german\\excel\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "(WindowsPath('../h10-work/notebook-runs/german/excel/01 Datos y muestras.xlsx'),\n",
              " WindowsPath('../h10-work/notebook-runs/german/excel/02 Análisis exploratorio.xlsx'),\n",
              " WindowsPath('../h10-work/notebook-runs/german/excel/03 Tramos y WoE.xlsx'),\n",
              " WindowsPath('../h10-work/notebook-runs/german/excel/04 Selección de variables.xlsx'),\n",
              " WindowsPath('../h10-work/notebook-runs/german/excel/05 Modelo.xlsx'),\n",
              " WindowsPath('../h10-work/notebook-runs/german/excel/06 Tarjeta de puntuación.xlsx'),\n",
              " WindowsPath('../h10-work/notebook-runs/german/excel/07 Calibración.xlsx'),\n",
              " WindowsPath('../h10-work/notebook-runs/german/excel/08 Desempeño.xlsx'),\n",
              " WindowsPath('../h10-work/notebook-runs/german/excel/09 Estabilidad.xlsx'),\n",
              " WindowsPath('../h10-work/notebook-runs/german/excel/10 Validación formal.xlsx'),\n",
              " WindowsPath('../h10-work/notebook-runs/german/excel/11 Escala maestra.xlsx'),\n",
              " WindowsPath('../h10-work/notebook-runs/german/excel/12 Decisiones.xlsx'))"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from pathlib import Path\n",
        "\n",
        "Path(\"../h10-work/german.yaml\").write_text(sc.to_yaml(), encoding=\"utf-8\")\n",
        "sc.export_excel()"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3 (H10)",
      "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.10"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}
