0% encontró este documento útil (0 votos)
7 vistas15 páginas

Análisis de Clustering en R para Tiendas

El documento describe un análisis de clustering realizado en R sobre una encuesta a 40 personas sobre características de tiendas de artículos de oficina. Se utilizan métodos de clustering jerárquico y k-means, junto con análisis de varianza para evaluar la significancia de las diferencias entre grupos. Además, se detallan los pasos para cargar datos, instalar paquetes y realizar visualizaciones en R.

Cargado por

Camilo Herrera
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
7 vistas15 páginas

Análisis de Clustering en R para Tiendas

El documento describe un análisis de clustering realizado en R sobre una encuesta a 40 personas sobre características de tiendas de artículos de oficina. Se utilizan métodos de clustering jerárquico y k-means, junto con análisis de varianza para evaluar la significancia de las diferencias entre grupos. Además, se detallan los pasos para cargar datos, instalar paquetes y realizar visualizaciones en R.

Cargado por

Camilo Herrera
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

#al utilizar gato "#" lo escrito queda como texto y no como código, para hacer correr línea por

línea
podemos

#utilizar para windows: ctrl + enter ; para mac: cmd + enter

#Para poder utilizar R deben estar conectados a internet o sino no podrán instalar los paquetes.

##El análisis que se realizará a continuación es sobre una ecuesta realizada a 40 personas, quienes

#Calificaron la importancia de algunas características de tiendas dedicadas a la venta de artículos de


oficina

#Se usará el análisis de cluster las observaciones de cada cluster,

#basadas en los encuestados.

#El análisis discriminante se usará para determinar si podemos predecir

#a qué grupo pertenecen los participantes

##Primero debemos elegir dónde guardaremos nuestros avances,

#Tener en cuenta que el archivo con los datos debe estar en la misma carpeta. En este caso el archivo
con los datos es el archivo excel

#que se descargó del aula de la carpeta trabajo de segmentación,

#Este código nos permite instalar el paquete pacman (para poder utilizar el código borren el gato "#"
que antecede

# al código y luego presionan ctrl + enter

#[Link]("pacman")
#en su defecto pueden cargar los paquetes desde la pestaña "Packages" que se encuentra en el cuadro
inferior D°

#en esa pestaña pueden clickear en "Install" para luego escribir el nombre cada uno de los paquetes a
instalar sin

#comillas, solo el nombre y luego un espacio para seguir escribiendo el resto de los paquetes,

#ya sea "pacman" o los paquetes que aparecen abajo como "tidyverse", "readxl", etc.

#### Cargamos paquetes a usar y datos

#No se instalarán nuevamente, pero el programa debe cargarlos que ya existen (una vez instalados los
paquetes)
#no es necesario usar este código y solo pueden saltar a library.

pacman::p_load("tidyverse", "readxl", "NbClust", "cluster", "psych", "car", "type3anova", "dplyr")

#Sin embargo, Se carga el paquete a utilizar

library(tidyverse)

library(readxl)

#ahora, exportamos la hoja del archivo excel a utilizar (archivo "Segmentation office" y la hoja
"Segmentationdata".

#Este archivo excel posee dos hojas, pero solo usaremos SegmentatioData.

#Cambiaremos el nombre de segmentation data por "equipment".

equipment <- read_excel("segmentation_office.xlsx","SegmentationData") # Import the Excel file

#podemos visualizar en el cuadro inferior (la consola) qué datos exporté. También podemos clickear en
el cuadro superior

#derecho (Enviroment) la palabra "equipment" y esto hará aparecer una pestaña arriba de este cuadro.

equipment
#%>% se utiliza para encadenar varias funciones, como por ejemplo: números mayores de 2 y luego
sumar esos números

#Toma un objeto llamado "equipment".

#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".

#Convierte la columna existente "respondent_id" en un factor.

#Agrega otra nueva columna llamada "professional" mediante la función factor()

#que convierte la columna existente "professional" en un factor y le asigna etiquetas a los niveles del
factor.

#En este caso, los niveles son "non-professional" y "professional".

equipment <- equipment %>%

mutate(respondent_id = factor(respondent_id),

professional = factor(professional, labels = c("non-professional","professional")))

#Toma un objeto llamado "equipment".

#Utiliza el operador "%>%" de la librería dplyr para encadenar operaciones de manera más clara y
sencilla.

#Utiliza la función select() de dplyr para seleccionar un subconjunto de columnas del objeto
"equipment".

#Las columnas seleccionadas son "variety_of_choice", "electronics", "furniture", "quality_of_service",

#"low_prices" y "return_policy".

#Los resultados de la operación se almacenan en un nuevo objeto llamado "[Link]".

[Link] <- equipment %>%

select(variety_of_choice, electronics, furniture, quality_of_service, low_prices, return_policy)

#Como ya tenemos un objeto creado previamente denominado [Link] y ahora trabajaremos sobre
él.
#Toma un objeto llamado "[Link]" que contiene un conjunto de datos que se utilizarán para realizar

#un análisis de clustering(agrupamiento)

#Utiliza la función dist() para calcular la matriz de distancia entre los puntos en "[Link]".

#Esta matriz de distancia mide la distancia o similitud entre cada par de observaciones en el conjunto de
datos.

#Utiliza la función hclust() para realizar un análisis de clustering jerárquico aglomerativo

#a partir de la matriz de distancia previamente calculada.

#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.

#Los resultados del análisis de clustering se almacenan en un nuevo objeto llamado


"[Link]".

[Link] <- hclust(dist([Link]), method = "ward.D")

#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

#qué objetos agrupar juntos en cada paso.

#El método de Ward minimiza la varianza total dentro de cada grupo y trata de minimizar el efecto

#de los valores atípicos.

#Toma un objeto llamado "[Link]" que contiene los resultados de un análisis de


clustering jerárquico

#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

#de los clusters generados por el análisis.

#En el dendrograma, cada hoja representa una observación en el conjunto de datos,

#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([Link])

#cargamos el paquete "NbClust"

library(NbClust)

#Toma un objeto llamado "[Link]" que contiene los datos a utilizar en el análisis de clustering.

#Utiliza la función NbClust() del paquete "NbClust" para calcular diferentes índices

#de calidad del clustering para un número creciente de clusters,

#desde 1 hasta un número máximo especificado en "[Link]".

#El parámetro "distance" especifica la medida de distancia a utilizar en el cálculo de la matriz

#de distancia entre los puntos.

#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.

#El parámetro "index" especifica el índice de calidad de clustering a utilizar en el cálculo.

#En este caso, se calculan los índices "duda" y "pseudot2".

#Los resultados de los cálculos se almacenan en los objetos "duda" y "pseudot2".

duda <- NbClust([Link], distance = "euclidean", method = "ward.D2", [Link] = 9, index = "duda")

pseudot2 <- NbClust([Link], distance = "euclidean", method = "ward.D2", [Link] = 9, index =


"pseudot2")
# La medida de Duda evalúa la dispersión intra-clúster (dispersión dentro de cada clúster) y la dispersión

#inter-clúster (dispersión entre los diferentes clústeres) y genera un valor que representa la relación
entre

#estas dos dispersiones.

# Por lo tanto, cuanto menor sea el valor de Duda, mejor será la calidad del agrupamiento/clú[Link]
embargo,

#el número óptimo de clusters se determina por una combinación de la interpretación de los patrones

#encontrados en los datos y los valores de índice para diferentes números de clusters.

duda$[Link]

#El índice de pseudot2 busca lo mismo que duda, pero con distinto cálculo

#Es necesario realizar varias evaluación si el cluster es bueno o no, ya que estas medidas no son
perfectas.

pseudot2$[Link]

#El signo "$" se utiliza para acceder a una variable dentro de un objeto.

#En este caso, duda$[Link] accede a la variable "[Link]" dentro del objeto "duda".

#La variable "[Link]" contiene el número óptimo de clusters sugerido por el índice de calidad

#de clustering seleccionado.

#Si el número óptimo de clusters no está claro o es ambiguo, "[Link]" puede contener varios valores,

#por ejemplo, si hay un empate entre diferentes valores óptimos.

duda$[Link]

pseudot2$[Link]
#Ahora realizaremos una agrupación no jerárquica utilizando 3 clusters, siguiendo el análisis jerárquico
previo

# existe aleatoriedad en el análisis de cluster

# por lo tanto, no siempre obtendrás el mismo resultado cada vez que hagas clustering

#por ejemplo: tengo números de 1 a 100. Si saco 5 números al azar, obtendré 2 50 6 35 76, si no utilizo
una semilla,

# y vuelvo a sacar 5 números al azar, obtedré, probablemente, 5 números nuevos perdiendo la


consistencia en los

#resultados. Ahora si pongo una semilla, esta me permitirá obtener siempre el mismo resultado.

# Si siempre quieres tener el mismo resultado necesitas arreglar el generador de números aleatoreos de
r

#eso lo logras con "[Link]" command y se puede utilizar cualquier número entero, en el libro se usa 1.

[Link](1)

#[Link]: esta es la variable a la que se asigna la salida de la función kmeans().

#En este caso, estamos creando una nueva variable llamada [Link].

#kmeans(): esta es la función que se utiliza para realizar un análisis de clusterización k-means.

#Se especifican tres argumentos dentro de la función:

#a. [Link]: este es el conjunto de datos que se utilizará para la clusterización.

#b. 3: este es el número de clusters que se desea crear.

#En este caso, se especifica que se deben crear tres clusters.


#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.

[Link] <- kmeans([Link], 3, nstart = 25)

[Link]
#AL igual que en la línea 49, realizaremos una nueva columna mediante la función "mutate()" a los datos
contenidos

#en "equipment", esta nueva columna se denominará "[Link]".

#Luego, la función "factor()" convierte los valores, obtenidos previamente en la línea 148, de
[Link]$cluster" en factores y lso etiqueta como

#"cl1", "cl2" y "cl3"

equipment <- equipment %>%

mutate([Link] = factor([Link]$cluster, labels=c("cl1","cl2","cl3")))

equipment

#Ahora, agrupamos el conjunto de datos "equipment" por la columna "[Link]",

#que contiene las etiquetas de grupo resultantes de la clusterización k-means realizada previamente.

#A continuación, se realiza un resumen estadístico de las columnas restantes utilizando la función


summarise().

#El operador %>% se utiliza para encadenar las operaciones juntas,

#lo que significa que el conjunto de datos se pasa a través de la primera operación, group_by(),

#y luego el resultado se pasa a la siguiente operación, summarise().

#La función group_by() se utiliza para agrupar el conjunto de datos por la columna [Link].

#La función summarise() se utiliza para calcular varias estadísticas resumidas de las columnas

#restantes del conjunto de datos, incluyendo:

#count: número de observaciones en cada grupo

#variety: media de la columna variety_of_choice en cada grupo

#electronics: media de la columna electronics en cada grupo

#furniture: media de la columna furniture en cada grupo

#service: media de la columna quality_of_service en cada grupo

#prices: media de la columna low_prices en cada grupo

#return: media de la columna return_policy en cada grupo

equipment %>%

group_by([Link]) %>%
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))

#remotes::install_github("samuelfranssens/type3anova") # usamos este código para instalar type3anova

#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)

#y pruebas de hipótesis utilizando el enfoque de tipo III.

#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 "[Link]" como entrada.

#El análisis de varianza se utiliza para evaluar la diferencia entre los grupos creados

#por la clusterización k-means en términos de su impacto en la variable respuesta.

#Un análisis de varianza (ANOVA) es una técnica estadística utilizada para comparar la media de tres o
más grupos.

#El objetivo del análisis de varianza es determinar si existe una diferencia estadísticamente significativa
entre

#las medias de los grupos.

#El análisis de varianza descompone la variabilidad total en los datos en dos componentes:

#la variabilidad entre los grupos y la variabilidad dentro de los grupos.

#Luego, se utiliza una prueba estadística para comparar la variabilidad entre los grupos con la
variabilidad dentro

#de los grupos. Si la variación entre los grupos es significativamente mayor que la variación dentro de los
grupos,
#se puede concluir que hay una diferencia significativa entre las medias de los grupos.

library(type3anova)#se carga el paquete

#al correr este código aparecerá una tabla que mostrará

#"term" que indica el nombre de cada término del modelo, que en este caso son el intercepto
(constante)

#y la variable "[Link]".

#"ss" indica la suma de cuadrados de cada término.

#"df1" y "df2" indican los grados de libertad correspondientes a cada término y al error,
respectivamente.

#"f" indica la estadística F para cada término, que se utiliza para evaluar la significancia estadística de
cada término

#en el modelo.

#"pvalue" indica el valor p para cada término, que indica la probabilidad de observar una estadística

#F igual o mayor que la observada bajo la hipótesis nula de que el término no tiene efecto en el modelo

type3anova(lm(variety_of_choice ~ [Link], data=equipment))

#los resultados obtenidos de en la tabla se interpretan de la siguiente manera:

#La variable "[Link]" es significativa en el modelo, ya que tiene un valor F alto (38.5)

#y un valor p muy bajo (0), lo que indica que hay diferencias estadísticamente significativas

#entre los grupos definidos por "[Link]".

#El modelo en su conjunto es altamente significativo, ya que el valor F del intercepto es muy alto (1335)

#y el valor p es muy bajo (0), lo que indica que el modelo explica una gran cantidad de la variabilidad en
los datos.

#La suma de cuadrados de los residuos (error) es relativamente pequeña en comparación

#con la suma de cuadrados totales, lo que indica que el modelo explica la mayor parte de la variabilidad
en los datos.
#es una prueba estadística que se utiliza para comparar las medias de varios grupos y determinar si hay

#diferencias significativas entre ellos. La prueba compara todas las combinaciones posibles de medias de
grupos

#y ajusta los resultados para controlar el error de tipo I global (tasa de falsos positivos)prueba de

#comparaciones múltiples de Tukey para evaluar si hay diferencias significativas

#en este caso es la comparación entre la media de la variable variety_of_choice y "[Link]".

#La función TukeyHSD() requiere dos argumentos.

#El primer argumento es un modelo de análisis de varianza (ANOVA) ajustado utilizando la función aov().

#En este caso, el modelo de ANOVA tiene la variable respuesta "variety_of_choice" y la variable
predictor "[Link]".

#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

#par de grupos es estadísticamente significativa, ajustando para las comparaciones múltiples.

TukeyHSD(aov(variety_of_choice ~ [Link], data=equipment),

"[Link]")

#al correr el código, en la tabla aparecerán los valores que se interpretan de la siguiente forma:

#La tabla muestra las diferencias de medias (diff) entre los grupos, el intervalo de confianza del 95% para

#la diferencia de medias (lwr y upr) y el valor p ajustado para controlar la tasa de error global (p adj).

#La primera fila indica que la diferencia de medias entre cl2 y cl1 es de 2.182540,

#con un intervalo de confianza del 95% que va desde 1.184332 a 3.1807470.

#El valor p ajustado es muy pequeño (0.0000145), lo que sugiere que esta diferencia es estadísticamente
significativa

#y que es poco probable que se deba al azar.

#De manera similar, la segunda fila muestra que la diferencia de medias entre cl3 y cl1 es de -1.928571,

#con un intervalo de confianza que no incluye el cero (-3.170076 a -0.6870668) y un valor p ajustado de
0.0015154,
#lo que sugiere una diferencia significativa entre estos grupos.

#La tercera fila muestra que la diferencia de medias entre cl3 y cl2 es de -4.111111,

#con un intervalo de confianza que no incluye el cero (-5.301397 a -2.9208248) y

#un valor p ajustado muy pequeño (0.0000000), lo que indica una diferencia estadísticamente
significativa

#entre estos grupos.

#ahora haremos un análisis discriminante lineal

#"equipment %>%" toma el conjunto de datos equipment y se pasa a la siguiente función usando el
operador "%>%".

#"group_by([Link]) %>%" Agrupa los datos por "[Link]", que es una variable creada
anteriormente

#la que indica a qué cluster pertenece cada observación.

#"summarize(income = mean(income), age = mean(age), professional = mean([Link](professional)-


1))" Calcula

#el promedio de cada variable numérica (income, age y professional) dentro de cada grupo definido por
[Link].

#Los nombres de las variables se especifican como argumentos en la función summarize().

#La variable professional se convierte a un valor numérico binario usando [Link](professional)-1,

#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)

#y nivel profesional (professional) de cada grupo definido por [Link].

#o sea, comparamos las características de distintos grupos obtenidos

equipment %>%

group_by([Link]) %>% # Group equipment by cluster.

summarize(income = mean(income),

age = mean(age),
professional = mean([Link](professional)-1))

#se debe instalar el paquete "MASS"

library("MASS")

#Este código hace un LDA, utilizando las variables de ingresos, edad y profesionalismo para predecir

#el grupo de clúster asignado por el modelo de K-means previamente construido.

#"lda.cluster3" ajusta el modelo LDA y usa la variable [Link] como variable de respuesta

#y "income", "age" y "professional" como variables predictoras.

#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

#etiquetas "lda1", "lda2" y "lda3" según la clase de clúster correspondiente.

lda.cluster3 <- lda([Link] ~ income + age + professional, data=equipment, CV=TRUE)

equipment <- equipment %>%

mutate(class = factor(lda.cluster3$class, labels = c("lda1","lda2","lda3")))

#muestra cuantas observaciones de cada cluster fueron predichas correctamente por el LDA

ct <- table(equipment$[Link], equipment$class)

ct

#calculamos la frecuencia relativa

[Link](ct)
#El código específico "sum(diag([Link](ct)))" calcula la suma de la diagonal de la tabla de

#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

#la proporción de respuestas correctamente predichas.

sum(diag([Link](ct)))

#Digamos ahora que queremos predecir la membresia de un nuevo grupo de personas de las que solo
tenemos, ingreso,

#edad y si es profesional o no. Podríamos utilizar la fórmula obtenida de LDA.

#"[Link]" es una variable que almacenará un modelo de análisis discriminante lineal (LDA)

#que se va a ajustar utilizando la fórmula especificada en la siguiente línea.

#"lda()" es la función que ajusta el modelo LDA.

#"[Link] ~ income + age + professional" es la fórmula de modelo especificada.

#En esta fórmula, "[Link]" es la variable dependiente (o variable a predecir),

#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.

#"CV=FALSE" especifica que no se realiza validación cruzada.

#La última línea simplemente muestra el objeto "[Link]" en la consola de R.


#Este objeto contiene información sobre el modelo LDA ajustado, incluyendo los valores de los
coeficientes

#para cada variable predictora y las estadísticas del modelo.

[Link] <- lda([Link] ~ income + age + professional, data=equipment, CV=FALSE) # CV


= FALSE ensures that we view the formula that we can use for prediction

[Link]

También podría gustarte