TYHM 2026

MACHINE LEARNING

El machine learning (aprendizaje automático) es una rama de la inteligencia artificial (IA) que capacita a las computadoras para aprender de los datos y mejorar su rendimiento sin ser programadas explícitamente para cada tarea.

Utiliza algoritmos estadísticos para identificar patrones, realizar predicciones y tomar decisiones autónomas

Los algoritmos analizan grandes conjuntos de datos (entrenamiento) para construir modelos que permiten predecir o clasificar nueva información.

Claves del Machine Learning

Fromas de aprendizaje

  • Aprendizaje Supervisado: El modelo se entrena con datos etiquetados (datos de entrada con su respuesta correcta).
  • Aprendizaje No Supervisado: El algoritmo encuentra estructuras o patrones ocultos en datos no etiquetados. Kmeans
  • Aprendizaje por Refuerzo: Basado en sistemas de recompensas y castigos para lograr un objetivo.

Kmeans

Es un algoritmo de aprendizaje automático no supervisado que: - agrupa datos sin etiquetas en clústeres, - minimizando la distancia (generalmente euclidiana) entre los puntos y el centroide de su grupo.

Es eficiente para segmentación, iterando entre asignar puntos al centroide más cercano y recalcular centroides.

Instalación de los paquetes

  • install.packages(“rattle”) Para los datos

  • install.packages(“NbClust”) Para determinar el número de clústeres

  • install.packages(“ggplot2”) Para visualización

  • install.packages(“tictoc”) Para medir el tiempo de ejecución

  • install.packages(“factoextra”) Para mejorar la visualización

Luego cargamos las bibliotecas

  • library (rattle)

  • library (NbClust)

  • library (ggplot2)

  • library (tictoc)

Inicio del algoritmo

Cargamos un conjunto de datos famoso llamado Wine.

data(wine, package='rattle')
  • Contiene resultados de un análisis químico de vinos cultivados en una región de Italia.

  • Tiene 13 variables (alcohol, magnesio, color, etc.) para cada vino.

Eliminamos la primera columna, categoría real, para entrenamiento “no supervisado”

Esta es la parte más importante del concepto de Aprendizaje No Supervisado. El dataset original tiene una columna llamada Type (que dice si el vino es tipo 1, 2 o 3). Con [-1], le estamos diciendo a R: “Quita la primera columna”.

wine_data <- wine[-1]
  • Porque queremos que el algoritmo K-means agrupe los vinos por sus características químicas, “sin saber” a qué categoría pertenecen.

  • Queremos que él descubra los grupos solo.

Escalado de los datos (Indispensable para K-means)

Esta línea es obligatoria para K-means se llama Escalado o Normalización. K-means usa distancias para agrupar.

wine_scaled <- scale(wine_data)

Una variable es el “Alcohol” (va de 11 a 14) y otra es el “Magnesio” (va de 70 a 160). - Es importante escalar yq ue si no escalamos, el algoritmo pensará que el Magnesio es mucho más importante solo porque sus números son más grandes. - scale() pone a todas las variables en la misma “escala” (promedio 0 y desviación 1), para que el alcohol y el magnesio pesen lo mismo en la decisión.

Ejecución y validación del modelo

Una vez que los datos están listos (escalados y limpios), el código hace tres cosas fundamentales:

1-Encuentra el número ideal de grupos

2-Entrena el algoritmo

3- Verifica si acertó

K-means tenemos que decirle de antemano cuántos grupos (K) quieres. Si no lo sabemos, usamos una herramienta como NbClust.

1. Análisis para determinar cantidad de clusters K

set.seed(1234)
nc <- NbClust(wine_scaled, min.nc=2, max.nc=15, method="kmeans") 

## *** : The Hubert index is a graphical method of determining the number of clusters.
##                 In the plot of Hubert index, we seek a significant knee that corresponds to a 
##                 significant increase of the value of the measure i.e the significant peak in Hubert
##                 index second differences plot. 
## 

## *** : The D index is a graphical method of determining the number of clusters. 
##                 In the plot of D index, we seek a significant knee (the significant peak in Dindex
##                 second differences plot) that corresponds to a significant increase of the value of
##                 the measure. 
##  
## ******************************************************************* 
## * Among all indices:                                                
## * 2 proposed 2 as the best number of clusters 
## * 19 proposed 3 as the best number of clusters 
## * 1 proposed 14 as the best number of clusters 
## * 1 proposed 15 as the best number of clusters 
## 
##                    ***** Conclusion *****                            
##  
## * According to the majority rule, the best number of clusters is  3 
##  
##  
## *******************************************************************

Según la regla de la mayoría, el número óptimo es 3

set.seed(1234) sirve para que, cada vez que corras el código, el resultado sea el mismo (bloquea la aleatoriedad inicial

nc <- NbClust(wine_scaled, min.nc=2, max.nc=15, method=“kmeans”) prueba simultáneamente hasta 26 índices estadísticos diferentes para ver cuál es el mejor número de clústeres entre 2 y 15.

2. Ejecución y Tiempo (tic y toc)

Miden cuántos segundos tarda la computadora en procesar el algoritmo.tic() y toc() Son como un cronómetro.

tic("Ejecución K-means")
fit.km <- kmeans(wine_scaled, centers=3, nstart=25)
toc()
## Ejecución K-means: 0.004 sec elapsed

centers=3: Le ordenas crear 3 grupos (basado en lo que dijo NbClust).

nstart=25: El algoritmo intenta 25 configuraciones iniciales diferentes y elige la mejor. Esto evita que el modelo se quede “atrapado” en una mala solución por puro azar.

3. Ver los resultados.

Al imprimir el tamaño de los grupos, estás viendo cuántos elementos cayeron en cada clúster. No basta con que la computadora haga los cálculos; necesitamos extraer la información para poder interpretarla y cuantificar el éxito.

## [1] 51 65 62

No basta con que la computadora haga los cálculos; necesitamos extraer la información para poder interpretarla y cuantificar el éxito.

4. Comparación con las categorías originales del dataset.

Como el dataset wine es un dataset de ejemplo, nosotros sí sabemos qué vino es cuál (la columna que borramos al principio). Esto te permite auditar al algoritmo:

  • table(wine\(Type, fit.km\)cluster): Crea una tabla cruzada.

  • conf_matrix: Crea una matriz

Matriz de Confusión (conf_matrix)

  • En las filas tienes la categoría real (Vino 1, 2, 3).
  • En las columnas tienes lo que el algoritmo asignó (Cluster 1, 2, 3).
conf_matrix <- table(wine$Type, fit.km$cluster)
print(conf_matrix)
##    
##      1  2  3
##   1  0  0 59
##   2  3 65  3
##   3 48  0  0

Si los números más grandes están en la diagonal de la tabla, significa que el algoritmo fue muy preciso.

Visualización estética

En la representación visual para ver cómo el algoritmo de Machine Learning agrupó los datos se utilia un *Gráfico de Clusters que se ven como Elipses de Confianza o Cascos Convexos, cuya función es agrupar puntos que el algoritmo considera similares.

  • Cercanía: Los puntos que están muy cerca en el gráfico son vinos que se parecen mucho químicamente.

  • Separación: Si los círculos (elipses) no se enciman unos con otros, significa que los grupos están bien definidos. Si se enciman mucho, significa que los vinos de esos grupos son muy parecidos entre sí y al algoritmo le costó diferenciarlos.

Llamo a la biblioteca

library(factoextra)

Esta biblioteca hace todo en una sola línea de código:

  • Dibuja los puntos. Crea las elipses (los círculos) que encierran a los grupos automáticamente. Colorea los grupos de forma estética.

  • Hace el cálculo matemático (PCA) internamente y decide qué poner en los ejes Dim1 y Dim2 para que la separación de los grupos se vea lo mejor posible.

  • Está construida sobre ggplot2 el cual hace que los gráficos sean más bonitos y modernos, se pueden personalizar fácilmente (colores, temas, títulos) y tienen una calidad de resolución mucho mayor para documentos PDF o presentaciones.

## Welcome to factoextra!
## Want to learn more? See two factoextra-related books at https://www.datanovia.com/en/product/practical-guide-to-principal-component-methods-in-r/

Visualización estética

Código de agrupamiento de Kmeans

fviz_cluster(fit.km, data = wine_scaled,
             
             palette = c("#2E9FDF", "#00AFBB", "#E7B800"), 
             
             # Colores modernos
             
             geom = "point",
             
             ellipse.type = "convex", 
             
             # Dibuja una figura alrededor de los puntos
             
             ggtheme = theme_minimal(),
             
             main = "Agrupamiento K-means de Vinos Italianos")

Visualización estética