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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +95 -111
app.py CHANGED
@@ -1,112 +1,96 @@
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)
 
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
+
95
+ # Lanzar App
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  interfaz.launch(share=True)