UN ANALISIS DE CLUSTER BASICO CON POCOS DATOS EN R Y PYTHON

Usaremos el conjunto de datos , con 4 puntos en un espacio bidimensional:

Estos puntos representan ubicaciones en un plano cartesiano.

# Paso 1: Crear los datos
# Creamos un data frame con los puntos A, B, C y D
datos <- data.frame(
  x1 = c(1, 2, 5, 6),  # Coordenadas x
  x2 = c(2, 3, 8, 9)   # Coordenadas y
)
rownames(datos) <- c("A", "B", "C", "D")  # Nombres de los puntos
# Paso 2: Aplicar el algoritmo K-means
# Usamos kmeans() con k = 2 (dos clústeres)
set.seed(123)  # Fijamos la semilla para reproducibilidad
resultado_kmeans <- kmeans(datos, centers = 2)
# Paso 3: Ver los resultados
# Mostramos los centroides de los clústeres
print("Centroides de los clústeres:")
[1] "Centroides de los clústeres:"
print(resultado_kmeans$centers)
   x1  x2
1 1.5 2.5
2 5.5 8.5
# Mostramos la asignación de cada punto a un clúster
print("Asignación de puntos a clústeres:")
[1] "Asignación de puntos a clústeres:"
print(resultado_kmeans$cluster)
A B C D 
1 1 2 2 
library(ggplot2)

# Creamos un gráfico de dispersión con los clústeres
datos$cluster <- as.factor(resultado_kmeans$cluster)  # Agregamos la asignación de clústeres
ggplot(datos, aes(x = x1, y = x2, color = cluster)) +
  geom_point(size = 4) +
  geom_point(data = as.data.frame(resultado_kmeans$centers), aes(x = x1, y = x2), 
             color = "black", size = 5, shape = 8) +
  labs(title = "Clústeres generados por K-means", x = "x1", y = "x2") +
  theme_minimal()

# Paso 1: Importar las librerías necesarias
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# Paso 2: Crear los datos
# Creamos un DataFrame con los puntos A, B, C y D
datos = pd.DataFrame({
    'x1': [1, 2, 5, 6],  # Coordenadas x
    'x2': [2, 3, 8, 9]   # Coordenadas y
}, index=['A', 'B', 'C', 'D'])
# Paso 3: Aplicar el algoritmo K-means
# Usamos KMeans de scikit-learn con k = 2
kmeans = KMeans(n_clusters=2, random_state=123)  # Fijamos la semilla para reproducibilidad
kmeans.fit(datos)  # Ajustamos el modelo a los datos
KMeans(n_clusters=2, random_state=123)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
# Paso 4: Ver los resultados
# Mostramos los centroides de los clústeres
print("Centroides de los clústeres:")
Centroides de los clústeres:
print(kmeans.cluster_centers_)
[[5.5 8.5]
 [1.5 2.5]]
# Paso 5: Visualizar los clústeres
# Agregamos la asignación de clústeres al DataFrame
datos['cluster'] = kmeans.labels_
print(datos)
   x1  x2  cluster
A   1   2        1
B   2   3        1
C   5   8        0
D   6   9        0
# Creamos un gráfico de dispersión
plt.figure(figsize=(8, 6))
for cluster in range(2):
    cluster_data = datos[datos['cluster'] == cluster]
    plt.scatter(cluster_data['x1'], cluster_data['x2'], label=f'Clúster {cluster + 1}', s=100)

# Graficamos los centroides
centroides = kmeans.cluster_centers_
plt.scatter(centroides[:, 0], centroides[:, 1], color='black', marker='X', s=200, label='Centroides')

# Configuración del gráfico
plt.title("Clústeres generados por K-means")
plt.xlabel("x1")
plt.ylabel("x2")
plt.legend()
plt.grid()
plt.show()

# Crear los datos
datos <- data.frame(
  x1 = c(1, 2, 5, 6),
  x2 = c(2, 3, 8, 9)
)
rownames(datos) <- c("A", "B", "C", "D")  # Nombres de los puntos

# Calcular la matriz de distancias euclídeas
distancias <- dist(datos, method = "euclidean")
print("Matriz de distancias euclídeas:")
[1] "Matriz de distancias euclídeas:"
print(as.matrix(distancias))
         A        B        C        D
A 0.000000 1.414214 7.211103 8.602325
B 1.414214 0.000000 5.830952 7.211103
C 7.211103 5.830952 0.000000 1.414214
D 8.602325 7.211103 1.414214 0.000000
# Clustering con el método del vecino más cercano
single_linkage <- hclust(distancias, method = "single")

# Visualizar el dendrograma
plot(single_linkage, main = "Dendrograma - Vecino más cercano (Single Linkage)",
     xlab = "", sub = "", cex = 0.8)

# Clustering con el método del vecino más lejano
complete_linkage <- hclust(distancias, method = "complete")

# Visualizar el dendrograma
plot(complete_linkage, main = "Dendrograma - Vecino más lejano (Complete Linkage)",
     xlab = "", sub = "", cex = 0.8)

# Clustering con el método de distancia promedio
average_linkage <- hclust(distancias, method = "average")

# Visualizar el dendrograma
plot(average_linkage, main = "Dendrograma - Distancia promedio (Average Linkage)",
     xlab = "", sub = "", cex = 0.8)

# Clustering con el método de Ward
ward_linkage <- hclust(distancias, method = "ward.D2")

# Visualizar el dendrograma
plot(ward_linkage, main = "Dendrograma - Método de Ward",
     xlab = "", sub = "", cex = 0.8)

# Clustering con el método de la mediana
median_linkage <- hclust(distancias, method = "median")

# Visualizar el dendrograma
plot(median_linkage, main = "Dendrograma - Método de la mediana",
     xlab = "", sub = "", cex = 0.8)

import numpy as np
import pandas as pd
from scipy.spatial.distance import pdist, squareform
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt

# Crear los datos
datos = pd.DataFrame({
    'x1': [1, 2, 5, 6],
    'x2': [2, 3, 8, 9]
}, index=['A', 'B', 'C', 'D'])

# Calcular la matriz de distancias euclídeas
distancias = pdist(datos, metric='euclidean')
print("Matriz de distancias euclídeas:")
Matriz de distancias euclídeas:
print(squareform(distancias))
[[0.         1.41421356 7.21110255 8.60232527]
 [1.41421356 0.         5.83095189 7.21110255]
 [7.21110255 5.83095189 0.         1.41421356]
 [8.60232527 7.21110255 1.41421356 0.        ]]
# Clustering con el método del vecino más cercano
single_linkage = linkage(distancias, method='single')

# Visualizar el dendrograma
plt.figure(figsize=(8, 5))
dendrogram(single_linkage, labels=datos.index)
{'icoord': [[5.0, 5.0, 15.0, 15.0], [25.0, 25.0, 35.0, 35.0], [10.0, 10.0, 30.0, 30.0]], 'dcoord': [[0.0, np.float64(1.4142135623730951), np.float64(1.4142135623730951), 0.0], [0.0, np.float64(1.4142135623730951), np.float64(1.4142135623730951), 0.0], [np.float64(1.4142135623730951), np.float64(5.830951894845301), np.float64(5.830951894845301), np.float64(1.4142135623730951)]], 'ivl': ['A', 'B', 'C', 'D'], 'leaves': [0, 1, 2, 3], 'color_list': ['C1', 'C2', 'C0'], 'leaves_color_list': ['C1', 'C1', 'C2', 'C2']}
plt.title("Dendrograma - Vecino más cercano (Single Linkage)")
plt.xlabel("Puntos")
plt.ylabel("Distancia")
plt.show()

# Clustering con el método del vecino más lejano
complete_linkage = linkage(distancias, method='complete')

# Visualizar el dendrograma
plt.figure(figsize=(8, 5))
dendrogram(complete_linkage, labels=datos.index)
{'icoord': [[5.0, 5.0, 15.0, 15.0], [25.0, 25.0, 35.0, 35.0], [10.0, 10.0, 30.0, 30.0]], 'dcoord': [[0.0, np.float64(1.4142135623730951), np.float64(1.4142135623730951), 0.0], [0.0, np.float64(1.4142135623730951), np.float64(1.4142135623730951), 0.0], [np.float64(1.4142135623730951), np.float64(8.602325267042627), np.float64(8.602325267042627), np.float64(1.4142135623730951)]], 'ivl': ['A', 'B', 'C', 'D'], 'leaves': [0, 1, 2, 3], 'color_list': ['C1', 'C2', 'C0'], 'leaves_color_list': ['C1', 'C1', 'C2', 'C2']}
plt.title("Dendrograma - Vecino más lejano (Complete Linkage)")
plt.xlabel("Puntos")
plt.ylabel("Distancia")
plt.show()

# Clustering con el método de distancia promedio
average_linkage = linkage(distancias, method='average')

# Visualizar el dendrograma
plt.figure(figsize=(8, 5))
dendrogram(average_linkage, labels=datos.index)
{'icoord': [[5.0, 5.0, 15.0, 15.0], [25.0, 25.0, 35.0, 35.0], [10.0, 10.0, 30.0, 30.0]], 'dcoord': [[0.0, np.float64(1.4142135623730951), np.float64(1.4142135623730951), 0.0], [0.0, np.float64(1.4142135623730951), np.float64(1.4142135623730951), 0.0], [np.float64(1.4142135623730951), np.float64(7.213870565935971), np.float64(7.213870565935971), np.float64(1.4142135623730951)]], 'ivl': ['A', 'B', 'C', 'D'], 'leaves': [0, 1, 2, 3], 'color_list': ['C1', 'C2', 'C0'], 'leaves_color_list': ['C1', 'C1', 'C2', 'C2']}
plt.title("Dendrograma - Distancia promedio (Average Linkage)")
plt.xlabel("Puntos")
plt.ylabel("Distancia")
plt.show()

# Clustering con el método de Ward
ward_linkage = linkage(distancias, method='ward')

# Visualizar el dendrograma
plt.figure(figsize=(8, 5))
dendrogram(ward_linkage, labels=datos.index)
{'icoord': [[5.0, 5.0, 15.0, 15.0], [25.0, 25.0, 35.0, 35.0], [10.0, 10.0, 30.0, 30.0]], 'dcoord': [[0.0, np.float64(1.4142135623730951), np.float64(1.4142135623730951), 0.0], [0.0, np.float64(1.4142135623730951), np.float64(1.4142135623730951), 0.0], [np.float64(1.4142135623730951), np.float64(10.198039027185569), np.float64(10.198039027185569), np.float64(1.4142135623730951)]], 'ivl': ['A', 'B', 'C', 'D'], 'leaves': [0, 1, 2, 3], 'color_list': ['C1', 'C2', 'C0'], 'leaves_color_list': ['C1', 'C1', 'C2', 'C2']}
plt.title("Dendrograma - Método de Ward")
plt.xlabel("Puntos")
plt.ylabel("Distancia")
plt.show()

# Clustering con el método de la mediana
median_linkage = linkage(distancias, method='median')

# Visualizar el dendrograma
plt.figure(figsize=(8, 5))
dendrogram(median_linkage, labels=datos.index)
{'icoord': [[5.0, 5.0, 15.0, 15.0], [25.0, 25.0, 35.0, 35.0], [10.0, 10.0, 30.0, 30.0]], 'dcoord': [[0.0, np.float64(1.4142135623730951), np.float64(1.4142135623730951), 0.0], [0.0, np.float64(1.4142135623730951), np.float64(1.4142135623730951), 0.0], [np.float64(1.4142135623730951), np.float64(7.211102550927978), np.float64(7.211102550927978), np.float64(1.4142135623730951)]], 'ivl': ['A', 'B', 'C', 'D'], 'leaves': [0, 1, 2, 3], 'color_list': ['C1', 'C2', 'C0'], 'leaves_color_list': ['C1', 'C1', 'C2', 'C2']}
plt.title("Dendrograma - Método de la mediana")
plt.xlabel("Puntos")
plt.ylabel("Distancia")
plt.show()

# Cargar las librerías
library(factoextra)
Warning: package 'factoextra' was built under R version 4.4.3
Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(cluster)
# Crear los datos
datos <- data.frame(
  x1 = c(1, 2, 5, 6),
  x2 = c(2, 3, 8, 9)
)
rownames(datos) <- c("A", "B", "C", "D")  # Nombres de los puntos

# Calcular la matriz de distancias
distancias <- dist(datos, method = "euclidean")

# Realizar el clustering jerárquico con el método de Ward
hc_ward <- hclust(distancias, method = "ward.D2")

# Cortar el dendrograma para obtener 2 clústeres
grupos <- cutree(hc_ward, k = 2)
print("Asignación de puntos a clústeres:")
[1] "Asignación de puntos a clústeres:"
print(grupos)
A B C D 
1 1 2 2 
# Visualizar los clústeres con elipses
fviz_cluster(list(data = datos, cluster = grupos),
             geom = "point",  # Mostrar los puntos
             ellipse.type = "convex",  # Dibujar elipses convexas
             palette = c("#2E9FDF", "#00AFBB"),  # Colores de los clústeres
             ggtheme = theme_minimal(),  # Tema minimalista
             main = "Clústeres con elipses (Método de Ward)")

import numpy as np
import pandas as pd
from scipy.cluster.hierarchy import linkage, fcluster
from scipy.spatial.distance import pdist
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.patches import Ellipse

# Crear los datos
datos = pd.DataFrame({
    'x1': [1, 2, 5, 6],
    'x2': [2, 3, 8, 9]
}, index=['A', 'B', 'C', 'D'])

# Calcular la matriz de distancias
distancias = pdist(datos, metric='euclidean')

# Realizar el clustering jerárquico con el método de Ward
hc_ward = linkage(distancias, method='ward')

# Cortar el dendrograma para obtener 2 clústeres
grupos = fcluster(hc_ward, t=2, criterion='maxclust')
datos['cluster'] = grupos
print("Asignación de puntos a clústeres:")
Asignación de puntos a clústeres:
print(datos)
   x1  x2  cluster
A   1   2        1
B   2   3        1
C   5   8        2
D   6   9        2
# Función para dibujar una elipse
def dibujar_elipse(x, y, ax, color, ancho=3, alto=3):
    elipse = Ellipse((np.mean(x), np.mean(y)), width=ancho, height=alto,
                     edgecolor=color, facecolor='none', linewidth=2)
    ax.add_patch(elipse)

# Crear el gráfico
plt.figure(figsize=(8, 6))
ax = plt.gca()

# Dibujar los puntos de cada clúster
colores = ['#2E9FDF', '#00AFBB']
for cluster in np.unique(datos['cluster']):
    cluster_data = datos[datos['cluster'] == cluster]
    plt.scatter(cluster_data['x1'], cluster_data['x2'], label=f'Clúster {cluster}',
                s=100, color=colores[cluster - 1])
    # Dibujar una elipse alrededor del clúster
    dibujar_elipse(cluster_data['x1'], cluster_data['x2'], ax, color=colores[cluster - 1])

# Configuración del gráfico
plt.title("Clústeres con elipses (Método de Ward)")
plt.xlabel("x1")
plt.ylabel("x2")
plt.legend()
plt.grid()
plt.show()