trodrigx commited on
Commit
6899c12
·
verified ·
1 Parent(s): f2cd99c

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +112 -0
app.py ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import joblib
3
+ import pandas as pd
4
+
5
+ # --- 1. CARGAR MODELO ---
6
+ try:
7
+ modelo = joblib.load("modelo_churn.joblib")
8
+ print("✅ Modelo cargado correctamente.")
9
+ except:
10
+ modelo = None
11
+ print("❌ Error: No se encontró 'modelo_churn.joblib'. Asegúrate de ejecutar entrenar.py primero.")
12
+
13
+ # --- 2. LÓGICA DE PREDICCIÓN ---
14
+ def predecir(antiguedad, pago, contrato, internet, seguridad, soporte, factura):
15
+ if modelo is None:
16
+ return {"Error": 0}, "⚠ ALERTA: El sistema no encuentra el archivo del modelo."
17
+
18
+ # A. Transformar Inputs visuales a los CÓDIGOS que entiende el modelo
19
+
20
+ # Contrato
21
+ if contrato == "Mes a Mes": c_code = 0
22
+ elif contrato == "Un año": c_code = 1
23
+ else: c_code = 2 # Dos años
24
+
25
+ # Internet
26
+ if internet == "DSL": i_code = 0
27
+ elif internet == "Fibra Óptica": i_code = 1
28
+ else: i_code = 2 # Ninguno
29
+
30
+ # Checkboxes (True -> 1, False -> 0)
31
+ sec_code = 1 if seguridad else 0
32
+ sop_code = 1 if soporte else 0
33
+ pap_code = 1 if factura else 0
34
+
35
+ # B. Crear DataFrame con las columnas en el MISMO ORDEN que el entrenamiento
36
+ columnas = ['tenure', 'MonthlyCharges', 'Contract_Code', 'Internet_Code',
37
+ 'OnlineSecurity_Code', 'TechSupport_Code', 'Paperless_Code']
38
+
39
+ datos = pd.DataFrame([[antiguedad, pago, c_code, i_code, sec_code, sop_code, pap_code]], columns=columnas)
40
+
41
+ # C. Predicción
42
+ # predict_proba devuelve la probabilidad de [No irse, Sí irse]
43
+ proba = modelo.predict_proba(datos)[0]
44
+ prob_fuga = proba[1] # Probabilidad de que se vaya (Clase 1)
45
+
46
+ # D. Lógica de Negocio (Recomendaciones)
47
+ mensaje = ""
48
+ if prob_fuga < 0.30:
49
+ mensaje = (f"🟢 CLIENTE SEGURO (Riesgo: {int(prob_fuga*100)}%)\n"
50
+ "Este cliente está contento. Intenta venderle servicios adicionales (Upselling).")
51
+ elif prob_fuga < 0.60:
52
+ mensaje = (f"🟡 RIESGO MEDIO (Riesgo: {int(prob_fuga*100)}%)\n"
53
+ "El cliente duda. Ofrece un descuento del 10% si renueva por un año.")
54
+ else:
55
+ mensaje = (f"🔴 ALERTA DE FUGA (Riesgo: {int(prob_fuga*100)}%)\n"
56
+ "¡Acción Inmediata! Llama al cliente y ofrece una promoción agresiva para retenerlo.")
57
+
58
+ return {"Se queda 🏠": float(proba[0]), "Se va 🏃": float(proba[1])}, mensaje
59
+
60
+ # --- 3. DISEÑO VISUAL (DASHBOARD) ---
61
+ # He quitado 'theme=gr.themes.Soft()' para evitar el error en versiones antiguas
62
+ with gr.Blocks() as interfaz:
63
+ gr.Markdown("# 🔮 Predicción de Fuga de Clientes (Telco AI)")
64
+ gr.Markdown("Herramienta de Inteligencia Artificial para retención de clientes.")
65
+
66
+ with gr.Row():
67
+ # Columna 1: Datos Financieros
68
+ with gr.Column():
69
+ gr.Markdown("### 💰 Perfil Financiero")
70
+ in_contrato = gr.Dropdown(["Mes a Mes", "Un año", "Dos años"], label="Tipo de Contrato", value="Mes a Mes")
71
+ in_pago = gr.Slider(18, 120, value=70, label="Pago Mensual ($)")
72
+ in_factura = gr.Checkbox(label="Recibe Factura Digital", value=True)
73
+
74
+ # Columna 2: Datos Técnicos
75
+ with gr.Column():
76
+ gr.Markdown("### ⚙️ Servicios Contratados")
77
+ in_internet = gr.Dropdown(["DSL", "Fibra Óptica", "Ninguno"], label="Tipo de Internet", value="Fibra Óptica")
78
+ in_seguridad = gr.Checkbox(label="Tiene Seguridad Online", value=False)
79
+ in_soporte = gr.Checkbox(label="Tiene Soporte Técnico", value=False)
80
+
81
+ # Columna 3: Fidelidad y Acción
82
+ with gr.Column():
83
+ gr.Markdown("### ⏳ Historia del Cliente")
84
+ in_antiguedad = gr.Slider(0, 72, value=1, label="Meses con la empresa")
85
+ gr.Markdown("---")
86
+ btn = gr.Button("🚀 ANALIZAR RIESGO", variant="primary") # size="lg" quitado por seguridad en versiones viejas
87
+
88
+ # Sección de Resultados
89
+ gr.Markdown("### 📊 Resultados del Análisis")
90
+ with gr.Row():
91
+ out_grafica = gr.Label(label="Probabilidades")
92
+ out_texto = gr.Textbox(label="Recomendación Estratégica", lines=3)
93
+
94
+ # --- NOVEDAD: EJEMPLOS RÁPIDOS ---
95
+ gr.Markdown("### ⚡ Casos de Prueba Rápidos (Haz clic para probar)")
96
+ gr.Examples(
97
+ examples=[
98
+ [70, 25, "Dos años", "DSL", True, True, False], # Cliente Leal
99
+ [2, 95, "Mes a Mes", "Fibra Óptica", False, False, True], # Alto Riesgo
100
+ [12, 65, "Un año", "DSL", False, True, True] # Indeciso
101
+ ],
102
+ inputs=[in_antiguedad, in_pago, in_contrato, in_internet, in_seguridad, in_soporte, in_factura],
103
+ label="Ejemplos:"
104
+ )
105
+
106
+ # Conectar botón con función
107
+ btn.click(fn=predecir,
108
+ inputs=[in_antiguedad, in_pago, in_contrato, in_internet, in_seguridad, in_soporte, in_factura],
109
+ outputs=[out_grafica, out_texto])
110
+
111
+ # Lanzar App
112
+ interfaz.launch(share=True)