# Paso 1: Crear los datos
# Creamos un data frame con los puntos A, B, C y D
<- data.frame(
datos 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
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 2: Aplicar el algoritmo K-means
# Usamos kmeans() con k = 2 (dos clústeres)
set.seed(123) # Fijamos la semilla para reproducibilidad
<- kmeans(datos, centers = 2) resultado_kmeans
# 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
$cluster <- as.factor(resultado_kmeans$cluster) # Agregamos la asignación de clústeres
datosggplot(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
= pd.DataFrame({
datos 'x1': [1, 2, 5, 6], # Coordenadas x
'x2': [2, 3, 8, 9] # Coordenadas y
=['A', 'B', 'C', 'D']) }, index
# Paso 3: Aplicar el algoritmo K-means
# Usamos KMeans de scikit-learn con k = 2
= KMeans(n_clusters=2, random_state=123) # Fijamos la semilla para reproducibilidad
kmeans # Ajustamos el modelo a los datos kmeans.fit(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.
KMeans(n_clusters=2, random_state=123)
# 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
'cluster'] = kmeans.labels_
datos[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
=(8, 6))
plt.figure(figsizefor cluster in range(2):
= datos[datos['cluster'] == cluster]
cluster_data 'x1'], cluster_data['x2'], label=f'Clúster {cluster + 1}', s=100)
plt.scatter(cluster_data[
# Graficamos los centroides
= kmeans.cluster_centers_
centroides 0], centroides[:, 1], color='black', marker='X', s=200, label='Centroides')
plt.scatter(centroides[:,
# Configuración del gráfico
"Clústeres generados por K-means")
plt.title("x1")
plt.xlabel("x2")
plt.ylabel(
plt.legend()
plt.grid() plt.show()
# Crear los datos
<- data.frame(
datos 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
<- dist(datos, method = "euclidean")
distancias 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
<- hclust(distancias, method = "single")
single_linkage
# 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
<- hclust(distancias, method = "complete")
complete_linkage
# 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
<- hclust(distancias, method = "average")
average_linkage
# Visualizar el dendrograma
plot(average_linkage, main = "Dendrograma - Distancia promedio (Average Linkage)",
xlab = "", sub = "", cex = 0.8)
# Clustering con el método de Ward
<- hclust(distancias, method = "ward.D2")
ward_linkage
# 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
<- hclust(distancias, method = "median")
median_linkage
# 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
= pd.DataFrame({
datos 'x1': [1, 2, 5, 6],
'x2': [2, 3, 8, 9]
=['A', 'B', 'C', 'D'])
}, index
# Calcular la matriz de distancias euclídeas
= pdist(datos, metric='euclidean')
distancias 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
= linkage(distancias, method='single')
single_linkage
# Visualizar el dendrograma
=(8, 5))
plt.figure(figsize=datos.index) dendrogram(single_linkage, labels
{'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']}
"Dendrograma - Vecino más cercano (Single Linkage)")
plt.title("Puntos")
plt.xlabel("Distancia")
plt.ylabel( plt.show()
# Clustering con el método del vecino más lejano
= linkage(distancias, method='complete')
complete_linkage
# Visualizar el dendrograma
=(8, 5))
plt.figure(figsize=datos.index) dendrogram(complete_linkage, labels
{'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']}
"Dendrograma - Vecino más lejano (Complete Linkage)")
plt.title("Puntos")
plt.xlabel("Distancia")
plt.ylabel( plt.show()
# Clustering con el método de distancia promedio
= linkage(distancias, method='average')
average_linkage
# Visualizar el dendrograma
=(8, 5))
plt.figure(figsize=datos.index) dendrogram(average_linkage, labels
{'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']}
"Dendrograma - Distancia promedio (Average Linkage)")
plt.title("Puntos")
plt.xlabel("Distancia")
plt.ylabel( plt.show()
# Clustering con el método de Ward
= linkage(distancias, method='ward')
ward_linkage
# Visualizar el dendrograma
=(8, 5))
plt.figure(figsize=datos.index) dendrogram(ward_linkage, labels
{'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']}
"Dendrograma - Método de Ward")
plt.title("Puntos")
plt.xlabel("Distancia")
plt.ylabel( plt.show()
# Clustering con el método de la mediana
= linkage(distancias, method='median')
median_linkage
# Visualizar el dendrograma
=(8, 5))
plt.figure(figsize=datos.index) dendrogram(median_linkage, labels
{'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']}
"Dendrograma - Método de la mediana")
plt.title("Puntos")
plt.xlabel("Distancia")
plt.ylabel( 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
<- data.frame(
datos 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
<- dist(datos, method = "euclidean")
distancias
# Realizar el clustering jerárquico con el método de Ward
<- hclust(distancias, method = "ward.D2")
hc_ward
# Cortar el dendrograma para obtener 2 clústeres
<- cutree(hc_ward, k = 2)
grupos 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
= pd.DataFrame({
datos 'x1': [1, 2, 5, 6],
'x2': [2, 3, 8, 9]
=['A', 'B', 'C', 'D'])
}, index
# Calcular la matriz de distancias
= pdist(datos, metric='euclidean')
distancias
# Realizar el clustering jerárquico con el método de Ward
= linkage(distancias, method='ward')
hc_ward
# Cortar el dendrograma para obtener 2 clústeres
= fcluster(hc_ward, t=2, criterion='maxclust')
grupos 'cluster'] = grupos
datos[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):
= Ellipse((np.mean(x), np.mean(y)), width=ancho, height=alto,
elipse =color, facecolor='none', linewidth=2)
edgecolor
ax.add_patch(elipse)
# Crear el gráfico
=(8, 6))
plt.figure(figsize= plt.gca()
ax
# Dibujar los puntos de cada clúster
= ['#2E9FDF', '#00AFBB']
colores for cluster in np.unique(datos['cluster']):
= datos[datos['cluster'] == cluster]
cluster_data 'x1'], cluster_data['x2'], label=f'Clúster {cluster}',
plt.scatter(cluster_data[=100, color=colores[cluster - 1])
s# Dibujar una elipse alrededor del clúster
'x1'], cluster_data['x2'], ax, color=colores[cluster - 1])
dibujar_elipse(cluster_data[
# Configuración del gráfico
"Clústeres con elipses (Método de Ward)")
plt.title("x1")
plt.xlabel("x2")
plt.ylabel(
plt.legend()
plt.grid() plt.show()