trodrigx commited on
Commit
ccf3aa9
·
verified ·
1 Parent(s): 16c0659

Upload 3 files

Browse files
Files changed (3) hide show
  1. app.py +100 -0
  2. modelo_churn.joblib +3 -0
  3. requirements.txt +4 -0
app.py ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import joblib
3
+ import pandas as pd
4
+
5
+ # --- 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'. Ejecuta entrenar.py primero.")
12
+
13
+ # --- 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
+ # 1. Transformar Inputs visuales a los CÓDIGOS que entiende el modelo
19
+ # (Esta lógica debe ser IDÉNTICA a entrenar.py)
20
+
21
+ # Contrato
22
+ if contrato == "Mes a Mes": c_code = 0
23
+ elif contrato == "Un año": c_code = 1
24
+ else: c_code = 2 # Dos años
25
+
26
+ # Internet
27
+ if internet == "DSL": i_code = 0
28
+ elif internet == "Fibra Óptica": i_code = 1
29
+ else: i_code = 2 # Ninguno
30
+
31
+ # Checkboxes (True -> 1, False -> 0)
32
+ sec_code = 1 if seguridad else 0
33
+ sop_code = 1 if soporte else 0
34
+ pap_code = 1 if factura else 0
35
+
36
+ # 2. Crear DataFrame con las columnas en el MISMO ORDEN que el entrenamiento
37
+ columnas = ['tenure', 'MonthlyCharges', 'Contract_Code', 'Internet_Code',
38
+ 'OnlineSecurity_Code', 'TechSupport_Code', 'Paperless_Code']
39
+
40
+ datos = pd.DataFrame([[antiguedad, pago, c_code, i_code, sec_code, sop_code, pap_code]], columns=columnas)
41
+
42
+ # 3. Predicción
43
+ # predict_proba devuelve [[prob_no, prob_si]]
44
+ proba = modelo.predict_proba(datos)[0]
45
+ prob_fuga = proba[1] # Probabilidad de que se vaya (Clase 1)
46
+
47
+ # 4. Lógica de Negocio (Recomendaciones)
48
+ mensaje = ""
49
+ if prob_fuga < 0.30:
50
+ mensaje = (f"🟢 CLIENTE SEGURO (Riesgo: {int(prob_fuga*100)}%)\n"
51
+ "Este cliente está contento. Intenta venderle servicios adicionales (Upselling).")
52
+ elif prob_fuga < 0.60:
53
+ mensaje = (f"🟡 RIESGO MEDIO (Riesgo: {int(prob_fuga*100)}%)\n"
54
+ "El cliente duda. Ofrece un descuento del 10% si renueva por un año.")
55
+ else:
56
+ mensaje = (f"🔴 ALERTA DE FUGA (Riesgo: {int(prob_fuga*100)}%)\n"
57
+ "¡Acción Inmediata! Llama al cliente y ofrece una promoción agresiva para retenerlo.")
58
+
59
+ return {"Se queda 🏠": float(proba[0]), "Se va 🏃": float(proba[1])}, mensaje
60
+
61
+ # --- DISEÑO VISUAL (DASHBOARD) ---
62
+ with gr.Blocks(theme=gr.themes.Soft()) 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")
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
+ # Conectar botón con función
95
+ btn.click(fn=predecir,
96
+ inputs=[in_antiguedad, in_pago, in_contrato, in_internet, in_seguridad, in_soporte, in_factura],
97
+ outputs=[out_grafica, out_texto])
98
+
99
+ # Lanzar App
100
+ interfaz.launch()
modelo_churn.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:352fbd7fc45df8be79357666ce3807c59f01c90e5a9ba11e2f6b1f8609701e7e
3
+ size 10681
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ scikit-learn
2
+ pandas
3
+ joblib
4
+ gradio