EVALUACIÓN PRÁCTICA PROGRESO 3
Carga de datos
import pandas as pd
from sklearn.preprocessing import StandardScaler
import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# Cargar el dataset
df = pd.read_csv('CC GENERAL.csv')
# Mostrar información general del conjunto de datos
print(df.info())
print(df.head())
Run to view results
# Eliminar la columna CUST_ID
df.drop(columns=['CUST_ID'], inplace=True)
# Reemplazar valores nulos con la mediana
df.fillna(df.median(), inplace=True)
# Normalización de datos
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
print("Datos preprocesados correctamente.")
Run to view results
Construcción del autoencoder
# Definición del autoencoder
input_dim = df_scaled.shape[1]
# Modelo de Autoencoder
encoder = models.Sequential([
layers.InputLayer(input_shape=(input_dim,)),
layers.Dense(16, activation='relu'),
layers.Dense(8, activation='relu'),
layers.Dense(2, activation='relu') # Espacio latente en 2D para visualización
])
decoder = models.Sequential([
layers.Dense(8, activation='relu', input_shape=(2,)),
layers.Dense(16, activation='relu'),
layers.Dense(input_dim, activation='sigmoid')
])
# Autoencoder completo
autoencoder = models.Sequential([encoder, decoder])
# Compilación del modelo
autoencoder.compile(optimizer='adam', loss='mse')
# Entrenamiento del modelo
autoencoder.fit(df_scaled, df_scaled, epochs=50, batch_size=32, validation_split=0.2, verbose=1)
print("Entrenamiento finalizado.")
Run to view results
Visualización del espacio latente
# Extraer la representación latente
encoded_data = encoder.predict(df_scaled)
# Visualizar el espacio latente en 2D
plt.figure(figsize=(8, 6))
plt.scatter(encoded_data[:, 0], encoded_data[:, 1], alpha=0.5)
plt.title("Visualización del Espacio Latente después del Entrenamiento")
plt.xlabel("Latent Dimension 1")
plt.ylabel("Latent Dimension 2")
plt.show()
Run to view results
Segmentación de clientes
# Definir número óptimo de clusters usando el método del codo
inertia = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=42).fit(encoded_data)
inertia.append(kmeans.inertia_)
# Visualización del método del codo
plt.figure(figsize=(8, 6))
plt.plot(range(1, 11), inertia, marker='o')
plt.title("Método del Codo para Determinar K")
plt.xlabel("Número de Clusters")
plt.ylabel("Inertia")
plt.show()
# Seleccionar el número óptimo de clusters y realizar segmentación
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(encoded_data)
# Añadir los clusters al dataframe
df['Cluster'] = clusters
# Visualizar clusters en el espacio latente
plt.figure(figsize=(8, 6))
plt.scatter(encoded_data[:, 0], encoded_data[:, 1], c=clusters, cmap='viridis', alpha=0.5)
plt.title("Segmentación de Clientes en el Espacio Latente")
plt.xlabel("Latent Dimension 1")
plt.ylabel("Latent Dimension 2")
plt.colorbar(label="Cluster")
plt.show()
Run to view results
Identificación de características claves
import numpy as np
import matplotlib.pyplot as plt
# Asegurar que cluster_summary está definido
cluster_summary = df.groupby('Cluster').mean()
# Definir características relevantes para el gráfico de radar
features = ['BALANCE', 'PURCHASES', 'CASH_ADVANCE', 'CREDIT_LIMIT', 'PAYMENTS']
# Normalización de datos para ajustar el rango 0-1
normalized_data = (cluster_summary[features] - cluster_summary[features].min()) / \
(cluster_summary[features].max() - cluster_summary[features].min())
# Configuración del gráfico
categories = features
N = len(categories)
angles = np.linspace(0, 2 * np.pi, N, endpoint=False).tolist()
angles += angles[:1] # Cierre del gráfico
# Crear el gráfico de radar para cada cluster
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
for cluster in range(len(cluster_summary)):
values = normalized_data.iloc[cluster].tolist()
values += values[:1] # Cierre del gráfico
ax.fill(angles, values, alpha=0.25, label=f'Cluster {cluster}')
ax.plot(angles, values, linewidth=1, linestyle='solid')
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
plt.title('Análisis de Clusters en Gráfico de Radar')
plt.legend()
plt.show()
Run to view results