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