Clustering en R
Clustering en R
##Primero debemos elegir dónde guardaremos nuestros avances, #40 participantes que dan oponión
sobre los materiales de ofina que compraron#
#tener en cuenta que el archivo con los datos, en este caso excel
#debe estar en la misma carpeta, además, deben cambiar las separaciones al lado contrario /
setwd("C:/Users/calar/Desktop/Ingeniería Comercial/mkt/R")
install.packages("pacman")
# Cada vez que iniciemos nuevamente el código debemos hacer funcionar pacman,
library(tidyverse)
library(readxl)
#ahora, exportamos la hoja del archivo excel a utilizar.
#Este archivo excel posee dos hojas, pero solo usaremos SegmentatioData que ahora llamaremos
equipment
#Luego podemos visualizar en el cuadro inferior qué datos exporté. Una manera de visualizar lo que
#contiene equipment, es mencionarlo y dar a ctrl + enter
equipment
#%>% se utiliza para encadenar varias funciones, como por ejemplo: números mayores de 2 y luego
sumar esos números
#Utiliza el operador %>% de la librería dplyr para encadenar operaciones de manera más clara y sencilla.
#Utiliza la función mutate() de dplyr para agregar nuevas columnas o modificar las existentes en el
objeto "equipment".
#que convierte la columna existente "professional" en un factor y le asigna etiquetas a los niveles del
factor.
mutate(respondent_id = factor(respondent_id),
#Utiliza la función select() de dplyr para seleccionar un subconjunto de columnas del objeto
"equipment".
#"low_prices" y "return_policy".
#ya tenemos un objeto creado previamente denominado Cluster.data y ahora trabajaremos sobre él.
#Toma un objeto llamado "cluster.data" que contiene un conjunto de datos que se utilizará para realizar
#Utiliza la función dist() para calcular la matriz de distancia entre los puntos en "cluster.data".
#Esta matriz de distancia mide la distancia o similitud entre cada par de observaciones en el conjunto de
datos.
#El parámetro "method" especifica el método utilizado para medir la distancia entre los clusters...
#...en el análisis de clustering jerárquico aglomerativo. En este caso, se utiliza el método de "ward.D"...
#...que minimiza la varianza total dentro de cada cluster al unir los clusters.
#En R, el método "ward.D" es un algoritmo de clustering jerárquico aglomerativo que se utiliza para
agrupar objetos
#en función de su similitud, con el objetivo de crear grupos cohesivos y bien separados.
#En este método, se mide la distancia entre los objetos utilizando la distancia euclidiana
#y se utiliza la suma de cuadrados mínima (SSM) como criterio de fusión para decidir
#El método de Ward minimiza la varianza total dentro de cada grupo y trata de minimizar el efecto
#aglomerativo.
#Utiliza la función plot() para visualizar la jerarquía de clusters generada por el análisis de clustering.
#La visualización producida por la función plot() es un dendrograma, que muestra la estructura
jerárquica
#y las uniones de las hojas representan los clusters que se han formado durante el análisis.
#La altura de cada unión en el dendrograma representa la distancia entre los clusters que se están
uniendo.
#Cuanto mayor sea la altura de la unión, mayor será la distancia entre los clusters que se están uniendo.
plot(hierarchical.clustering)
#Toma un objeto llamado "cluster.data" que contiene los datos a utilizar en el análisis de clustering.
#Utiliza la función NbClust() del paquete "NbClust" para calcular diferentes índices
#El parámetro "method" especifica el método utilizado para medir la distancia entre los clusters
#en el análisis de clustering jerárquico aglomerativo.
duda <- NbClust(cluster.data, distance = "euclidean", method = "ward.D2", max.nc = 9, index = "duda")
# El índice de duda evalúa la separación entre los clusters y la compacidad de cada cluster.
#El valor del índice de duda oscila entre 0 y 1, donde 0 indica una mala calidad del clustering
duda$All.index
#y la separación entre los clusters. El valor del índice de pseudot2 oscila entre 0 y 1,
#donde 0 indica una mala calidad del clustering y 1 indica una alta calidad del clustering.
pseudot2$All.index
#El signo "$" se utiliza para acceder a una variable dentro de un objeto.
#En este caso, duda$Best.nc accede a la variable "Best.nc" dentro del objeto "duda".
#La variable "Best.nc" contiene el número óptimo de clusters sugerido por el índice de calidad
#Si el número óptimo de clusters no está claro o es ambiguo, "Best.nc" puede contener varios valores,
#Ahora realizaremos una agrupación no jerárquica utilizando 3 clusters, siguiendo el análisis jerárquico
previo
# por lo tanto, no siempre obtendrás el mismo resultado cada vez que hagas clustering
# Si siempre quieres tener el mismo resultado necesitas arreglar el generador de números aleatoreos de
r
set.seed(1)
#En este caso, estamos creando una nueva variable llamada kmeans.clustering.
#kmeans(): esta es la función que se utiliza para realizar un análisis de clusterización k-means.
#c. nstart = 25: este es un parámetro opcional que especifica el número de conjuntos aleatorios de
#centroides iniciales que se generarán. En este caso, se especifica que se deben generar 25 conjuntos
aleatorios.
kmeans.clustering <- kmeans(cluster.data, 3, nstart = 25)
#AL igual que en la línea 34, realizaremos una nueva columna mediante la función "mutate()" a los datos
contenidos
#Luego, la función "factor()" convierte los valores, obtenidos previamente en la línea 148, de
kmeans.clustering$cluster" en factores y lso etiqueta como
#que contiene las etiquetas de grupo resultantes de la clusterización k-means realizada previamente.
#lo que significa que el conjunto de datos se pasa a través de la primera operación, group_by(),
#La función group_by() se utiliza para agrupar el conjunto de datos por la columna km.group.
#La función summarise() se utiliza para calcular varias estadísticas resumidas de las columnas
group_by(km.group) %>%
summarise(count = n(),
variety = mean(variety_of_choice),
electronics = mean(electronics),
furniture = mean(furniture),
service = mean(quality_of_service),
prices = mean(low_prices),
return = mean(return_policy))
#para poder usar "Type3anova" necesitas instalar el paquete "remotes" y el paquete "car"
#El paquete type3anova proporciona funciones para realizar análisis de varianza (ANOVA)
#Aquí, se realiza un análisis de varianza utilizando la función type3anova() con un modelo lineal (lm())
#que tiene la variable respuesta "variety_of_choice" y la variable predictor "km.group" como entrada.
#El análisis de varianza se utiliza para evaluar la diferencia entre los grupos creados
#en la media de la variable variety_of_choice entre los grupos creados por la clusterización k-means,
#En este caso, el modelo de ANOVA tiene la variable respuesta "variety_of_choice" y la variable
predictor "km.group".
#La prueba de comparaciones múltiples de Tukey calcula una estadística de prueba y un intervalo de
confianza
#para todas las posibles combinaciones de grupos. Esto permite evaluar si la diferencia en la media entre
cada
"km.group")
#"equipment %>%" toma el conjunto de datos equipment y se pasa a la siguiente función usando el
operador "%>%".
#"group_by(km.group) %>%" Agrupa los datos por "km.group", que es una variable creada
anteriormente
#el promedio de cada variable numérica (income, age y professional) dentro de cada grupo definido por
km.group.
#ya que originalmente era una variable categórica con valores "non-professional" y "professional".
#El resultado es una tabla que resume la información de ingresos (income), edad (age)
equipment %>%
group_by(km.group) %>% # Group equipment by cluster.
summarize(income = mean(income),
age = mean(age),
professional = mean(as.numeric(professional)-1))
library("MASS")
#Este código hace un LDA, utilizando las variables de ingresos, edad y profesionalismo para predecir
#"lda.cluster3" ajusta el modelo LDA y usa la variable km.group como variable de respuesta
#La opción "CV = TRUE" se utiliza para realizar validación cruzada y evaluar la precisión del modelo LDA.
#En la siguiente línea, se agrega una nueva variable llamada class al conjunto de datos equipment
usando mutate().
#La variable class se basa en las predicciones de clasificación de LDA y se asigna con
#muestra cuantas observaciones de cada cluster fueron predichas correctamente por el LDA
ct
#calculamos la frecuencia relativa
prop.table(ct)
#contingencia "ct" creada previamente, la cual contiene el número de respuestas correctas predichas
por el modelo.
#Luego, divide este número por el total de respuestas en la tabla de contingencia para obtener
sum(diag(prop.table(ct)))
#Digamos ahora que queremos predecir la membresia de un nuevo grupo de personas de las que solo
tenemos, ingreso,
#"lda.cluster3.formula" es una variable que almacenará un modelo de análisis discriminante lineal (LDA)
#mientras que "income", "age" y "professional" son las variables independientes (o variables
predictoras).
#"data=equipment" especifica que los datos utilizados para ajustar el modelo se encuentran en el objeto
equipment.
#Este objeto contiene información sobre el modelo LDA ajustado, incluyendo los valores de los
coeficientes
lda.cluster3.formula
# Para definir una variable dentro de los datos, primero debemos entregar el nombre la variable, por
ejmplo(income)
professional = c("professional","non-professional","non-professional","professional"))
new_data
#Ahora creamos una nueva columna llamda predicción en el nuevo marco de datos y lo almacenamos en
predección.
#accedido por $clase, para los nuevos_datos basados en la fórmula de la LDA que está basada en los
datos antiguos
#revisemos la predicción
new_data