# aprendizaje-automatico-no-supervisado-con-python
Aprendizaje Automático No Supervisado con Python
Volver a la portada del cursoProyecto 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
- Exploración. Estadísticas descriptivas de las 8 columnas, sus varianzas y al menos dos histogramas. Explica por qué hay que escalar, con cifras.
- Escalado.
StandardScalersobredf[COLUMNAS]. Guarda el escalador: lo necesitarás para interpretar los centros y para clasificar sesiones nuevas. - Elegir k. Recorre
kde 2 a 8 conKMeans(n_init=10, random_state=42). Grafica la inercia (codo) y el silhouette promedio, y justifica tu elección con ambos criterios. - K-means. Ajusta el modelo con el
kelegido. Reporta tamaños, inercia y silhouette. - Jerárquico y comparación. Ajusta
AgglomerativeClusteringconlinkage="ward"y el mismok. Dibuja un dendrograma de una muestra de 30 a 50 sesiones. Compara con K-means usandoadjusted_rand_scorey una tabla cruzada (pd.crosstab). - 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.
- 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 condispositivo. - Recomendación de negocio. Una acción concreta por grupo (qué mostrar, qué enviar, qué medir), ligada a su perfil.
- Estabilidad. Repite K-means con cinco valores de
random_statey, aparte, coninit="random", n_init=1. Compara las particiones con ARI y comenta qué tan estables son tus grupos. - Sesiones nuevas. Inventa tres sesiones con perfiles distintos, escálalas con
transformy clasifícalas conpredict. 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(), aplicaTruncatedSVD(n_components=3, random_state=42), interpreta cada componente por sus cargas y explica por qué suexplained_variance_ratio_no viene ordenado. - DBSCAN. Prueba al menos tres valores de
epssobre 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 columnatipoy revisa qué tipos se mezclan. En un proyecto real esta columna no existe: úsala solo para aprender qué tan bien funcionó tu proceso.
Entregables
proyecto.ipynb, ejecutado de principio a fin sin errores, con las gráficas a la vista.INFORME.md(una página): elkelegido 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,
dispositivofuera 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.