Saltar al contenido

# aprendizaje-automatico-no-supervisado-con-python

Aprendizaje Automático No Supervisado con Python

Volver a la portada del curso
Proyecto

Proyecto Final: Análisis de Datos Sin Supervisión

Sección 4 · Proyecto Final y Evaluación

Proyecto final: segmentación de visitantes de PyShop

Durante el curso agrupaste sesiones con K-means y con clustering jerárquico, elegiste k, dibujaste el mapa de PCA y descubriste temas con SVD. Ahora vas a juntar todo en una segmentación completa, con nombres para cada grupo y una recomendación de negocio que el equipo de PyShop pueda usar. Se usan Python 3.12 o superior, scikit-learn 1.8, pandas, SciPy y matplotlib. El notebook proyecto-segmentacion-visitantes contiene una solución de referencia: consúltalo al terminar, no antes.

Contexto

El sitio de PyShop recibe visitas muy distintas: gente que entra un minuto y se va, gente que compara durante media hora, gente que solo busca ofertas y gente que llega, agrega y paga. Hoy todas ven la misma página de inicio y reciben los mismos correos. El equipo de marketing quiere saber qué tipos de visitante hay, cuántos son de cada tipo y qué haría con cada uno. Nadie etiquetó las sesiones: el problema es no supervisado.

Datos

Copia la función generar_sesiones y la lista COLUMNAS de la primera celda de cualquier notebook del curso. Para el extra de temas copia también generar_vistas y CATEGORIAS. Genera las sesiones así:

df = generar_sesiones(n=1500, semilla=42)
print(df.shape)
print(df["dispositivo"].value_counts().to_dict())
# (1500, 9)
# {'movil': 847, 'escritorio': 653}

Si no obtienes esas cifras, revisa que copiaste la función completa. Las 8 columnas de COLUMNAS describen el comportamiento de la sesión: paginas, minutos, productos_vistos, busquedas, resenas_leidas, agregados_carrito, pct_ofertas (fracción de páginas de ofertas) y monto_carrito_mxn. dispositivo es contexto: no entra al clustering, pero sirve para describir los grupos al final. No uses con_tipo=True hasta el último extra.

Requisitos mínimos

  1. Exploración. Estadísticas descriptivas de las 8 columnas, sus varianzas y al menos dos histogramas. Explica por qué hay que escalar, con cifras.
  2. Escalado. StandardScaler sobre df[COLUMNAS]. Guarda el escalador: lo necesitarás para interpretar los centros y para clasificar sesiones nuevas.
  3. Elegir k. Recorre k de 2 a 8 con KMeans(n_init=10, random_state=42). Grafica la inercia (codo) y el silhouette promedio, y justifica tu elección con ambos criterios.
  4. K-means. Ajusta el modelo con el k elegido. Reporta tamaños, inercia y silhouette.
  5. Jerárquico y comparación. Ajusta AgglomerativeClustering con linkage="ward" y el mismo k. Dibuja un dendrograma de una muestra de 30 a 50 sesiones. Compara con K-means usando adjusted_rand_score y una tabla cruzada (pd.crosstab).
  6. Mapa con PCA. Proyecta las sesiones escaladas en 2 componentes, reporta la varianza explicada, interpreta las cargas de PC1 y PC2 y grafica el mapa coloreado por grupo de K-means.
  7. Perfilar y nombrar. Lleva los centros a unidades originales con inverse_transform, presenta una tabla de perfiles y ponle un nombre a cada grupo justificado con al menos dos cifras. Cruza los grupos con dispositivo.
  8. Recomendación de negocio. Una acción concreta por grupo (qué mostrar, qué enviar, qué medir), ligada a su perfil.
  9. Estabilidad. Repite K-means con cinco valores de random_state y, aparte, con init="random", n_init=1. Compara las particiones con ARI y comenta qué tan estables son tus grupos.
  10. Sesiones nuevas. Inventa tres sesiones con perfiles distintos, escálalas con transform y clasifícalas con predict. Explica si el grupo asignado tiene sentido.

Pistas de implementación

from sklearn.metrics import silhouette_score

filas = []
for k in range(2, 9):
    km = KMeans(n_clusters=k, n_init=10, random_state=42).fit(Xs)
    sil = silhouette_score(Xs, km.labels_)
    filas.append((k, round(km.inertia_, 1), round(sil, 3)))
tabla_k = pd.DataFrame(filas, columns=["k", "inercia", "silhouette"])

centros = pd.DataFrame(sc.inverse_transform(km_final.cluster_centers_),
                       columns=COLUMNAS).round(1)

Para el dendrograma usa scipy.cluster.hierarchy.linkage y dendrogram sobre la muestra; con las 1500 sesiones el dibujo es ilegible. Para cortar el árbol completo a una altura, fcluster(Z, t=altura, criterion="distance").

Extras opcionales

  • Temas de interés con SVD. Genera la matriz de vistas con generar_vistas(), aplica TruncatedSVD(n_components=3, random_state=42), interpreta cada componente por sus cargas y explica por qué su explained_variance_ratio_ no viene ordenado.
  • DBSCAN. Prueba al menos tres valores de eps sobre los datos escalados y reporta cuántos grupos y cuántos puntos de ruido salen.
  • Comprobación con el tipo oculto. Al final, y solo al final, genera los datos con con_tipo=True, calcula el ARI de tu K-means contra la columna tipo y revisa qué tipos se mezclan. En un proyecto real esta columna no existe: úsala solo para aprender qué tan bien funcionó tu proceso.

Entregables

  1. proyecto.ipynb, ejecutado de principio a fin sin errores, con las gráficas a la vista.
  2. INFORME.md (una página): el k elegido y por qué, la tabla de perfiles con los nombres, el mapa de PCA, la recomendación por grupo, el resultado de estabilidad y dos limitaciones de la segmentación. Los datos son sintéticos: describe lo que ves sin inventarle causas.

Rúbrica (100 puntos, más 10 de extras)

  • Exploración y escalado (10 puntos): varianzas reportadas, justificación del escalado con cifras, dispositivo fuera del clustering.
  • Elección de k (15 puntos): codo y silhouette graficados, decisión argumentada.
  • K-means y jerárquico (20 puntos): ambos ajustados con el mismo k, dendrograma legible, comparación con ARI y tabla cruzada.
  • PCA (15 puntos): varianza explicada, cargas interpretadas, mapa coloreado por grupo.
  • Perfiles y nombres (20 puntos): centros en unidades originales, nombres respaldados con cifras, cruce con dispositivo.
  • Recomendaciones y sesiones nuevas (10 puntos): una acción concreta por grupo, tres sesiones clasificadas con el escalador correcto.
  • Estabilidad e informe (10 puntos): comparación de semillas e inicializaciones con ARI, conclusiones con cifras y limitaciones honestas.
  • Extras (hasta 10 puntos): SVD de temas, DBSCAN o comprobación con el tipo oculto bien interpretados.

Recursos