Clusterización de datos

Se aplica el algoritmo k-medias para agrupar las flores en clústeres basados en características como longitud y anchura del sépalo y del pétalo. Se visualizan los clústeres mediante gráficos de dispersión y se presentan tablas con información detallada sobre la asignación de especies a cada clúster y los centroides de los clústeres.

El conjunto de datos contiene muestras de cada una de tres especies de Iris (Iris setosa, Iris virginica e Iris versicolor). En esos datos se describen cuatro rasgos de cada muestra: el largo y ancho del sépalo y pétalo, en centímetros. Basado en la combinación de estos cuatro rasgos, se desarrolló un modelo discriminante lineal para distinguir entre una especie y otra.

# Instalar y cargar los paquetes

install.packages("ggplot")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
## Warning: package 'ggplot' is not available for this version of R
## 
## A version of this package for your version of R might be available elsewhere,
## see the ideas at
## https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages
install.packages("cluster")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
# Cargar la librería necesaria
library(ggplot2)
library(cluster)

# Cargar la base de datos iris
data(iris)

# Preparar los datos para la clusterización
iris_data <- iris[, -5]  # Eliminar la columna de especies
set.seed(123)  # Fijar una semilla para reproducibilidad

# Realizar la clusterización utilizando el algoritmo k-medias
k <- 3  # Número de clústeres
kmeans_model <- kmeans(iris_data, centers = k, nstart = 25)

# Añadir el resultado de la clusterización a los datos originales
iris_clustered <- cbind(iris_data, cluster = kmeans_model$cluster)

Representación gráfica según especie y característica

La base de datos iris es un conjunto de datos clásico en el campo de la estadística y el aprendizaje automático. Fue introducido por el biólogo británico Ronald Fisher en su artículo de 1936 “The Use of Multiple Measurements in Taxonomic Problems” como un ejemplo de análisis discriminante lineal. El conjunto de datos consta de 150 observaciones de flores de iris, 50 de cada una de las tres especies; Iris setosa, Iris virginica e Iris versicolor.
# Visualizar los clústeres con tamaño de punto proporcional al ancho del pétalo
ggplot(iris_clustered, aes(x = Sepal.Length, y = Sepal.Width, color = factor(cluster), size = Petal.Width)) +
  geom_point() +
  labs(title = "Clusterización de flores Iris",
       x = "Longitud del sépalo",
       y = "Anchura del sépalo",
       color = "Cluster",
       size = "Anchura del pétalo") +
  theme_minimal()

# Obtener colores únicos para cada especie
species_colors <- c("setosa" = "red", "versicolor" = "green", "virginica" = "blue")

# Asignar colores de especie al gráfico de pares
pairs(iris[, -5], col = species_colors[iris$Species], pch = 20)

# Crear una tabla de contingencia de especies por cluster
cluster_species_table <- table(iris$Species, kmeans_model$cluster)

# Imprimir la tabla
print(cluster_species_table)
##             
##               1  2  3
##   setosa     50  0  0
##   versicolor  0 48  2
##   virginica   0 14 36
Estos números representan una tabla de contingencia que muestra la distribución de las especies de iris en cada uno de los clusters obtenidos mediante la clusterización. Cada fila representa una especie de iris, mientras que cada columna representa un cluster.
# Obtener los centroides de cada clúster
centroides <- kmeans_model$centers

# Crear una tabla con los centroides
centroides_df <- as.data.frame(centroides)

rownames(centroides_df) <- paste("Cluster", 1:k)

# Mostrar la tabla
print(centroides_df)
##           Sepal.Length Sepal.Width Petal.Length Petal.Width
## Cluster 1     5.006000    3.428000     1.462000    0.246000
## Cluster 2     5.901613    2.748387     4.393548    1.433871
## Cluster 3     6.850000    3.073684     5.742105    2.071053
Estos datos representan los centroides de cada cluster obtenidos mediante el algoritmo de k-medias. Cada fila corresponde a un cluster, y cada columna muestra el valor promedio de las características de los datos en ese cluster
# Calcular el promedio de longitud y anchura del sépalo y del pétalo por especie
species_means <- aggregate(. ~ Species, data = iris, FUN = mean)

# Imprimir la tabla de promedios por especie
print(species_means)
##      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     setosa        5.006       3.428        1.462       0.246
## 2 versicolor        5.936       2.770        4.260       1.326
## 3  virginica        6.588       2.974        5.552       2.026
Estos datos muestran el promedio de las características de las flores iris para cada especie según, longitud y ancho promedio del sépalo y del pétalo.