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