{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "id": "KTT5UnVuNqb7",
        "outputId": "f6469644-4a6d-48ac-b6d3-03dd0be9574f"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Clases: ['Alto' 'Bajo'] → encodings 0,1\n",
            "\n",
            "==================================================\n",
            "  Regresión Logística\n",
            "==================================================\n",
            "  Accuracy : 0.8433\n",
            "  Precision: 0.8175  (Alto riesgo)\n",
            "  Recall   : 0.8110  (Alto riesgo)\n",
            "  F1-Score : 0.8142  (Alto riesgo)\n",
            "  AUC-ROC  : 0.9293\n",
            "  CV F1    : 0.8452\n",
            "\n",
            "  Reporte completo:\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "        Alto       0.82      0.81      0.81       127\n",
            "        Bajo       0.86      0.87      0.86       173\n",
            "\n",
            "    accuracy                           0.84       300\n",
            "   macro avg       0.84      0.84      0.84       300\n",
            "weighted avg       0.84      0.84      0.84       300\n",
            "\n",
            "  Matriz de Confusión:\n",
            "[[103  24]\n",
            " [ 23 150]]\n",
            "\n",
            "  Importancia de variables:\n",
            "    Carga_Laboral: 1.2428\n",
            "    Conflicto_Rol: 1.2159\n",
            "    Estres: 1.2096\n",
            "    Apoyo_Liderazgo: 1.1840\n",
            "    Horas_Trabajo: 1.1804\n",
            "\n",
            "==================================================\n",
            "  Random Forest\n",
            "==================================================\n",
            "  Accuracy : 0.8200\n",
            "  Precision: 0.7967  (Alto riesgo)\n",
            "  Recall   : 0.7717  (Alto riesgo)\n",
            "  F1-Score : 0.7840  (Alto riesgo)\n",
            "  AUC-ROC  : 0.9099\n",
            "  CV F1    : 0.8322\n",
            "\n",
            "  Reporte completo:\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "        Alto       0.80      0.77      0.78       127\n",
            "        Bajo       0.84      0.86      0.85       173\n",
            "\n",
            "    accuracy                           0.82       300\n",
            "   macro avg       0.82      0.81      0.81       300\n",
            "weighted avg       0.82      0.82      0.82       300\n",
            "\n",
            "  Matriz de Confusión:\n",
            "[[ 98  29]\n",
            " [ 25 148]]\n",
            "\n",
            "  Importancia de variables:\n",
            "    Horas_Trabajo: 0.2655\n",
            "    Carga_Laboral: 0.1916\n",
            "    Apoyo_Liderazgo: 0.1835\n",
            "    Estres: 0.1809\n",
            "    Conflicto_Rol: 0.1785\n",
            "\n",
            "==================================================\n",
            "  XGBoost\n",
            "==================================================\n",
            "  Accuracy : 0.8233\n",
            "  Precision: 0.7846  (Alto riesgo)\n",
            "  Recall   : 0.8031  (Alto riesgo)\n",
            "  F1-Score : 0.7938  (Alto riesgo)\n",
            "  AUC-ROC  : 0.9093\n",
            "  CV F1    : 0.8282\n",
            "\n",
            "  Reporte completo:\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "        Alto       0.78      0.80      0.79       127\n",
            "        Bajo       0.85      0.84      0.85       173\n",
            "\n",
            "    accuracy                           0.82       300\n",
            "   macro avg       0.82      0.82      0.82       300\n",
            "weighted avg       0.82      0.82      0.82       300\n",
            "\n",
            "  Matriz de Confusión:\n",
            "[[102  25]\n",
            " [ 28 145]]\n",
            "\n",
            "  Importancia de variables:\n",
            "    Carga_Laboral: 0.2245\n",
            "    Conflicto_Rol: 0.2098\n",
            "    Estres: 0.2037\n",
            "    Apoyo_Liderazgo: 0.2023\n",
            "    Horas_Trabajo: 0.1596\n",
            "\n",
            "\n",
            "======================================================================\n",
            "  TABLA COMPARATIVA FINAL\n",
            "======================================================================\n",
            "Modelo                        Accuracy  Precision   Recall       F1      AUC\n",
            "----------------------------------------------------------------------\n",
            "Regresión Logística             0.8433     0.8175   0.8110   0.8142   0.9293\n",
            "Random Forest                   0.8200     0.7967   0.7717   0.7840   0.9099\n",
            "XGBoost                         0.8233     0.7846   0.8031   0.7938   0.9093\n",
            "Red Neuronal (MLP)              0.8300     0.8100   0.8400   0.8200    N/A  \n"
          ]
        },
        {
          "output_type": "error",
          "ename": "FileNotFoundError",
          "evalue": "[Errno 2] No such file or directory: '/home/claude/model_results.json'",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
            "\u001b[0;32m/tmp/ipykernel_18127/2722970189.py\u001b[0m in \u001b[0;36m<cell line: 0>\u001b[0;34m()\u001b[0m\n\u001b[1;32m    132\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    133\u001b[0m \u001b[0;31m# Guardar JSON para usar en PPTX\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 134\u001b[0;31m \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'/home/claude/model_results.json'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'w'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    135\u001b[0m     json.dump({\"results\": results, \"feature_importances\": feature_importances,\n\u001b[1;32m    136\u001b[0m                \"classes\": le.classes_.tolist()}, f, indent=2)\n",
            "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/home/claude/model_results.json'"
          ]
        }
      ],
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import json\n",
        "from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold\n",
        "from sklearn.preprocessing import StandardScaler, LabelEncoder\n",
        "from sklearn.linear_model import LogisticRegression\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.metrics import (accuracy_score, precision_score, recall_score,\n",
        "                             f1_score, roc_auc_score, confusion_matrix,\n",
        "                             classification_report)\n",
        "from xgboost import XGBClassifier\n",
        "import warnings\n",
        "warnings.filterwarnings('ignore')\n",
        "\n",
        "# ── 1. DATOS ──────────────────────────────────────────────\n",
        "df = pd.read_excel('/content/dataset_burnout_FINAL.xlsx',\n",
        "                   sheet_name='Dataset_Completo')\n",
        "\n",
        "top_variables = ['Carga_Laboral', 'Apoyo_Liderazgo', 'Conflicto_Rol', 'Estres', 'Horas_Trabajo']\n",
        "X = df[top_variables]\n",
        "y = df['Riesgo_Burnout']\n",
        "\n",
        "le = LabelEncoder()\n",
        "y_enc = le.fit_transform(y)   # Alto=0, Bajo=1  → verificar\n",
        "print(\"Clases:\", le.classes_, \"→ encodings 0,1\")\n",
        "\n",
        "X_train, X_test, y_train, y_test = train_test_split(\n",
        "    X, y_enc, test_size=0.2, random_state=42, stratify=y_enc)\n",
        "\n",
        "scaler = StandardScaler()\n",
        "X_train_s = scaler.fit_transform(X_train)\n",
        "X_test_s  = scaler.transform(X_test)\n",
        "\n",
        "cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\n",
        "\n",
        "# ── 2. MODELOS ─────────────────────────────────────────────\n",
        "models = {\n",
        "    \"Regresión Logística\": LogisticRegression(\n",
        "        class_weight='balanced', max_iter=1000, random_state=42),\n",
        "    \"Random Forest\": RandomForestClassifier(\n",
        "        n_estimators=200, class_weight='balanced',\n",
        "        max_depth=8, random_state=42, n_jobs=-1),\n",
        "    \"XGBoost\": XGBClassifier(\n",
        "        n_estimators=200, max_depth=5, learning_rate=0.05,\n",
        "        scale_pos_weight=(y_enc==0).sum()/(y_enc==1).sum(),\n",
        "        use_label_encoder=False, eval_metric='logloss',\n",
        "        random_state=42, verbosity=0),\n",
        "}\n",
        "\n",
        "results = {}\n",
        "feature_importances = {}\n",
        "\n",
        "for name, model in models.items():\n",
        "    print(f\"\\n{'='*50}\")\n",
        "    print(f\"  {name}\")\n",
        "    print('='*50)\n",
        "\n",
        "    # Usar datos escalados para RL, sin escalar para RF/XGB (ambos funcionan)\n",
        "    Xtr = X_train_s if name == \"Regresión Logística\" else X_train_s\n",
        "    Xte = X_test_s\n",
        "\n",
        "    model.fit(Xtr, y_train)\n",
        "    y_pred = model.predict(Xte)\n",
        "    y_prob = model.predict_proba(Xte)[:, 1]\n",
        "\n",
        "    # Métricas en test\n",
        "    acc   = accuracy_score(y_test, y_pred)\n",
        "    prec  = precision_score(y_test, y_pred, pos_label=0)   # pos_label=0 = \"Alto\"\n",
        "    rec   = recall_score(y_test, y_pred, pos_label=0)\n",
        "    f1    = f1_score(y_test, y_pred, pos_label=0)\n",
        "    auc   = roc_auc_score(y_test, y_prob)\n",
        "    cv_sc = cross_val_score(model, X_train_s, y_train, cv=cv,\n",
        "                            scoring='f1', n_jobs=-1).mean()\n",
        "\n",
        "    cm = confusion_matrix(y_test, y_pred)\n",
        "\n",
        "    print(f\"  Accuracy : {acc:.4f}\")\n",
        "    print(f\"  Precision: {prec:.4f}  (Alto riesgo)\")\n",
        "    print(f\"  Recall   : {rec:.4f}  (Alto riesgo)\")\n",
        "    print(f\"  F1-Score : {f1:.4f}  (Alto riesgo)\")\n",
        "    print(f\"  AUC-ROC  : {auc:.4f}\")\n",
        "    print(f\"  CV F1    : {cv_sc:.4f}\")\n",
        "    print(f\"\\n  Reporte completo:\")\n",
        "    print(classification_report(y_test, y_pred,\n",
        "          target_names=[c for c in le.classes_]))\n",
        "    print(f\"  Matriz de Confusión:\\n{cm}\")\n",
        "\n",
        "    results[name] = {\n",
        "        \"accuracy\": round(acc, 4),\n",
        "        \"precision_alto\": round(prec, 4),\n",
        "        \"recall_alto\": round(rec, 4),\n",
        "        \"f1_alto\": round(f1, 4),\n",
        "        \"auc_roc\": round(auc, 4),\n",
        "        \"cv_f1\": round(cv_sc, 4),\n",
        "        \"cm\": cm.tolist(),\n",
        "    }\n",
        "\n",
        "    # Feature importance\n",
        "    if hasattr(model, 'feature_importances_'):\n",
        "        fi = dict(zip(top_variables, model.feature_importances_))\n",
        "    elif hasattr(model, 'coef_'):\n",
        "        fi = dict(zip(top_variables, np.abs(model.coef_[0])))\n",
        "    else:\n",
        "        fi = {}\n",
        "    feature_importances[name] = fi\n",
        "    if fi:\n",
        "        print(\"\\n  Importancia de variables:\")\n",
        "        for var, imp in sorted(fi.items(), key=lambda x: -x[1]):\n",
        "            print(f\"    {var}: {imp:.4f}\")\n",
        "\n",
        "# Red Neuronal (resultados del notebook)\n",
        "results[\"Red Neuronal (MLP)\"] = {\n",
        "    \"accuracy\": 0.83,\n",
        "    \"precision_alto\": 0.81,\n",
        "    \"recall_alto\": 0.84,\n",
        "    \"f1_alto\": 0.82,\n",
        "    \"auc_roc\": None,\n",
        "    \"cv_f1\": None,\n",
        "    \"cm\": None,\n",
        "}\n",
        "\n",
        "# ── 3. TABLA RESUMEN ──────────────────────────────────────\n",
        "print(\"\\n\\n\" + \"=\"*70)\n",
        "print(\"  TABLA COMPARATIVA FINAL\")\n",
        "print(\"=\"*70)\n",
        "header = f\"{'Modelo':<28} {'Accuracy':>9} {'Precision':>10} {'Recall':>8} {'F1':>8} {'AUC':>8}\"\n",
        "print(header)\n",
        "print(\"-\"*70)\n",
        "for name, r in results.items():\n",
        "    auc_str = f\"{r['auc_roc']:.4f}\" if r['auc_roc'] else \"  N/A  \"\n",
        "    print(f\"{name:<28} {r['accuracy']:>9.4f} {r['precision_alto']:>10.4f} {r['recall_alto']:>8.4f} {r['f1_alto']:>8.4f} {auc_str:>8}\")\n",
        "\n",
        "# Guardar JSON para usar en PPTX\n",
        "with open('/home/claude/model_results.json', 'w') as f:\n",
        "    json.dump({\"results\": results, \"feature_importances\": feature_importances,\n",
        "               \"classes\": le.classes_.tolist()}, f, indent=2)\n",
        "\n",
        "print(\"\\n✅ Resultados guardados en model_results.json\")"
      ]
    }
  ]
}