Está en la página 1de 13

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

#### Cargamos paquetes a usar

install.packages("pacman")

# Cada vez que iniciemos nuevamente el código debemos hacer funcionar pacman,

#No se instalarán nuevamente, pero el programa debe revisar que ya existen

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

# Si bien en el capítulo 7 aparece library, en este caso no es necesario

#puesto que lo hemos cargado previamente con 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

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


#Una vez cargado y nombrado el archivo, este nos aparecerá en la pantalla ‘Environment’
#Pueden dar click allí para ver el contenido que usaremos del archivo de manera completa.

#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

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

#Agrega una nueva columna llamada "respondent_id" mediante la función factor()

#que 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 "cluster.data".

cluster.data <- equipment %>%

select(variety_of_choice, electronics, furniture, quality_of_service, low_prices, 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

#un análisis de clustering.

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

#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


"hierarchical.clustering".

hierarchical.clustering <- hclust(dist(cluster.data), 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 "hierarchical.clustering" 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(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

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

#desde 1 hasta un número máximo especificado en "max.nc".

#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(cluster.data, distance = "euclidean", method = "ward.D2", max.nc = 9, index = "duda")

pseudot2 <- NbClust(cluster.data, distance = "euclidean", method = "ward.D2", max.nc = 9, index =


"pseudot2")

# 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

#y 1 indica una alta calidad del clustering.

duda$All.index

#El índice de pseudot2 se basa en la distancia de Mahalanobis y evalúa la coherencia

#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

#de clustering seleccionado.

#Si el número óptimo de clusters no está claro o es ambiguo, "Best.nc" puede contener varios valores,

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


duda$Best.nc

#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

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

#eso lo logras con "set.seed" command

set.seed(1)

#kmeans.clustering: 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 kmeans.clustering.

#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. cluster.data: 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.
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

#en "equipment", esta nueva columna se denominará "km.group".

#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

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

equipment <- equipment %>%

mutate(km.group = factor(kmeans.clustering$cluster, labels=c("cl1","cl2","cl3")))

#Ahora, agrupamos el conjunto de datos "equipment" por la columna "km.group",

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

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

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

library(type3anova)#se carga el paquete

type3anova(lm(variety_of_choice ~ km.group, data=equipment))

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

#en la media de la variable variety_of_choice entre los grupos creados por la clusterización k-means,

#utilizando la función TukeyHSD().

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

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

TukeyHSD(aov(variety_of_choice ~ km.group, data=equipment),

"km.group")

#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(km.group) %>%" Agrupa los datos por "km.group", 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(as.numeric(professional)-


1))" Calcula

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

#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 as.numeric(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 km.group.

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

equipment %>%
group_by(km.group) %>% # Group equipment by cluster.

summarize(income = mean(income),

age = mean(age),

professional = mean(as.numeric(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 km.group 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(km.group ~ 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$km.group, equipment$class)

ct
#calculamos la frecuencia relativa

prop.table(ct)

#El código específico "sum(diag(prop.table(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(prop.table(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.

#"lda.cluster3.formula" 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.


#"km.group ~ income + age + professional" es la fórmula de modelo especificada.

#En esta fórmula, "km.group" 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 "lda.cluster3.formula" 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.

lda.cluster3.formula <- lda(km.group ~ income + age + professional, data=equipment, CV=FALSE) # CV =


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

lda.cluster3.formula

# Con la función tibble podemos crear nueva información

# Para definir una variable dentro de los datos, primero debemos entregar el nombre la variable, por
ejmplo(income)

# y luego dar lo valores

new_data <- tibble(income = c(65, 65, 35, 35),

age = c(20, 35, 45, 60),

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

# revisamos los datos

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

#(utilice la LDA donde CV = FALSO).

new_data <- new_data %>%

mutate(prediction = predict(lda.cluster3.formula, new_data)$class)

#revisemos la predicción
new_data

#buscar probabilidad de última tabla

También podría gustarte