print("\n\n\nAPLICACIÓN: SEGMENTACIÓN DE CLIENTES")
print("=" * 70)
# Generar datos de clientes
np.random.seed(42)
n_clientes_seg = 1500
datos_clientes = pd.DataFrame({
'edad': np.random.randint(18, 80, n_clientes_seg),
'ingreso_mensual': np.random.uniform(1000, 20000, n_clientes_seg),
'gasto_mensual': np.random.uniform(500, 15000, n_clientes_seg),
'num_compras_mes': np.random.randint(0, 30, n_clientes_seg),
'antiguedad_meses': np.random.randint(1, 120, n_clientes_seg),
'ticket_promedio': np.random.uniform(20, 500, n_clientes_seg),
'visitas_web': np.random.randint(0, 100, n_clientes_seg)
})
# Calcular características adicionales
datos_clientes['frecuencia_compra'] = datos_clientes['num_compras_mes'] / 4
datos_clientes['ratio_gasto_ingreso'] = datos_clientes['gasto_mensual'] / datos_clientes['ingreso_mensual']
# Crear segmentos (0=Bronce, 1=Plata, 2=Oro, 3=Platino)
score_valor = (
datos_clientes['gasto_mensual'] * 0.0003 +
datos_clientes['num_compras_mes'] * 0.1 +
datos_clientes['ticket_promedio'] * 0.005 +
np.random.normal(0, 0.3, n_clientes_seg)
)
datos_clientes['segmento'] = pd.cut(
score_valor,
bins=4,
labels=['Bronce', 'Plata', 'Oro', 'Platino']
)
datos_clientes['segmento_num'] = datos_clientes['segmento'].map({
'Bronce': 0,
'Plata': 1,
'Oro': 2,
'Platino': 3
})
print(f"\nDistribución de segmentos:")
print(datos_clientes['segmento'].value_counts().sort_index())
# Preparar datos
features_seg = ['edad', 'ingreso_mensual', 'gasto_mensual', 'num_compras_mes',
'antiguedad_meses', 'ticket_promedio', 'visitas_web',
'frecuencia_compra', 'ratio_gasto_ingreso']
X_seg = datos_clientes[features_seg]
y_seg = datos_clientes['segmento_num']
X_train_seg, X_test_seg, y_train_seg, y_test_seg = train_test_split(
X_seg, y_seg, test_size=0.3, random_state=42, stratify=y_seg
)
# Entrenar Random Forest (mejor modelo típicamente)
print("\n\nMODELO DE SEGMENTACIÓN")
print("=" * 70)
rf_segmentacion = RandomForestClassifier(
n_estimators=200,
max_depth=12,
min_samples_split=20,
random_state=42
)
rf_segmentacion.fit(X_train_seg, y_train_seg)
# Evaluar
y_pred_seg = rf_segmentacion.predict(X_test_seg)
acc_seg = accuracy_score(y_test_seg, y_pred_seg)
print(f"Accuracy: {acc_seg:.4f} ({acc_seg*100:.1f}%)")
# Matriz de confusión
cm_seg = confusion_matrix(y_test_seg, y_pred_seg)
print(f"\nMatriz de confusión:")
print(f" Predicho")
print(f" Bronce Plata Oro Platino")
print(f"Real Bronce {cm_seg[0, 0]:4d} {cm_seg[0, 1]:4d} {cm_seg[0, 2]:4d} {cm_seg[0, 3]:4d}")
print(f" Plata {cm_seg[1, 0]:4d} {cm_seg[1, 1]:4d} {cm_seg[1, 2]:4d} {cm_seg[1, 3]:4d}")
print(f" Oro {cm_seg[2, 0]:4d} {cm_seg[2, 1]:4d} {cm_seg[2, 2]:4d} {cm_seg[2, 3]:4d}")
print(f" Platino {cm_seg[3, 0]:4d} {cm_seg[3, 1]:4d} {cm_seg[3, 2]:4d} {cm_seg[3, 3]:4d}")
# Características más importantes
print(f"\n\nCARACTERÍSTICAS MÁS IMPORTANTES PARA SEGMENTACIÓN")
print("=" * 70)
importancias_seg = pd.DataFrame({
'caracteristica': features_seg,
'importancia': rf_segmentacion.feature_importances_
}).sort_values('importancia', ascending=False)
for _, row in importancias_seg.iterrows():
barra = '█' * int(row['importancia'] * 100)
print(f" {row['caracteristica']:<25} {row['importancia']:.4f} {barra}")
print(f"\n\nAPLICACIÓN PRÁCTICA:")
print("Este modelo permite:")
print(" 1. Clasificar automáticamente nuevos clientes")
print(" 2. Personalizar ofertas según segmento")
print(" 3. Identificar clientes con potencial de upgrade")
print(" 4. Optimizar estrategias de retención")