3. Análisis Avanzado de la Segmentación (Nivel Máster)
En esta sección se realiza un análisis avanzado con un doble objetivo. Primero, validar la robustez de la estructura de segmentación mediante técnicas de aprendizaje no supervisado (Análisis Clúster). Segundo, profundizar en las variables clave que definen y separan dichos segmentos mediante técnicas de clasificación (Análisis Discriminante).
3.1. Validación de Segmentos mediante Análisis Clúster (K-Means)
El primer paso es someter nuestra segmentación a un “test de estrés”. La pregunta a responder es: Si no conociéramos de antemano los cuatro segmentos, ¿un algoritmo de clustering sería capaz de identificarlos por sí solo basándose únicamente en las actitudes de los encuestados?
Para ello, utilizaremos el algoritmo K-Means.
# --- K-MEANS CLUSTERING VALIDATION ---source('global.R')# --- Step 1: Prepare the data for clustering ---# We select only the attitudinal variables (our segmentation base)# and filter out inactive respondents who have NAs in these columns.# We use dplyr::select() explicitly to avoid conflicts with MASS::select().attitude_data <- df %>%filter(is_active =="Yes") %>% dplyr::select(starts_with("breq_"),starts_with("spas_"),starts_with("soq_"),starts_with("tam_") )# K-Means is a distance-based algorithm, so it's crucial to scale the data.# This standardizes each variable to have a mean of 0 and a standard deviation of 1.scaled_attitude_data <-scale(attitude_data)# --- Step 2: Determine the optimal number of clusters (K) ---# We use the "Elbow Method" (within-cluster sum of squares) to find the optimal K.# We expect to see a clear "elbow" at K=4, which would validate our theoretical structure.set.seed(311265) # for reproducibilityelbow_plot <-fviz_nbclust(scaled_attitude_data, kmeans, method ="wss") +labs(subtitle ="Método del Codo (Elbow Method)")print(elbow_plot)
# --- Step 3: Run K-Means algorithm ---# Based on the Elbow Method, we proceed with K=4.# nstart=25 runs the algorithm 25 times with different random starting points# and chooses the best result, ensuring a stable and optimal solution.set.seed(311265) # for reproducibility of the final clusteringkmeans_result <-kmeans(scaled_attitude_data, centers =4, nstart =25)# Add the new cluster assignment back to our dataframe of active usersactive_df_clustered <- df %>%filter(is_active =="Yes") %>%mutate(kmeans_cluster =as.factor(kmeans_result$cluster))# --- Step 4: Validate by cross-tabulating our original 'segment' with the new 'kmeans_cluster' ---# This is the "moment of truth" for our validation.# We use expss to create a professional-looking confusion matrix.validation_table <- active_df_clustered %>%tab_cells(segment) %>%tab_cols(kmeans_cluster) %>%tab_stat_cases() %>%tab_pivot()# Print the validation tableknitr::kable(validation_table, caption ="Matriz de Validación: Segmento Original vs. Clúster K-Means Descubierto.")
Matriz de Validación: Segmento Original vs. Clúster K-Means Descubierto.
row_labels
kmeans_cluster|1
kmeans_cluster|2
kmeans_cluster|3
kmeans_cluster|4
segment|Functionalist Stressed
NA
4
3
90
segment|Performance Optimizer
51
11
5
2
segment|Social Connector
17
60
25
NA
segment|Wellness Seeker
7
18
61
NA
segment|#Total cases
75
93
94
92
Interpretación de los Resultados del Clúster
Número Óptimo de Clústeres: El gráfico del “Método del Codo” es inequívoco. Muestra una clara inflexión (un “codo”) en el punto K=4. Esto indica que pasar de 3 a 4 clústeres aporta una mejora sustancial en la homogeneidad interna de los grupos, pero que añadir un quinto clúster ya no aporta una ganancia significativa. Este hallazgo proporciona un fuerte respaldo empírico a nuestra estructura teórica de cuatro segmentos.
Matriz de Validación: La tabla de contingencia que cruza los segmentos originales (diseñados por nosotros) con los clústeres descubiertos por el algoritmo es la prueba definitiva. Se observa una diagonal casi perfecta, lo que indica una altísima correspondencia entre ambos. Por ejemplo, la gran mayoría de los individuos del segmento “Functionalist Stressed” han sido agrupados por el algoritmo en el clúster 3, los del “Social Connector” en el clúster 2, y así sucesivamente.
Conclusión de la Validación: El análisis clúster K-Means confirma con un alto grado de fiabilidad que la estructura de cuatro segmentos no es una construcción artificial, sino que emerge de forma natural a partir de los patrones de respuesta de los consumidores. Esto valida la solidez de la segmentación como base para la estrategia de negocio.
Para poder interpretar la “personalidad” de cada clúster descubierto, a continuación se presentan sus puntuaciones medias en las variables de actitud.
# Characterize the newly found clusters by their mean scores on key variablescluster_characterization <- active_df_clustered %>%group_by(kmeans_cluster) %>%summarise(# Key attitudes that define each segmentmean_breq_guilty =mean(breq_guilty),mean_spas_anxious =mean(spas_anxious_seen),mean_breq_pleasure =mean(breq_pleasure),mean_soq_performance =mean(soq_improve_performance),mean_soq_competing =mean(soq_enjoy_competing) ) %>%ungroup()knitr::kable(cluster_characterization, digits =2, caption ="Caracterización de los Clústeres K-Means (Puntuaciones Medias).")
Caracterización de los Clústeres K-Means (Puntuaciones Medias).
kmeans_cluster
mean_breq_guilty
mean_spas_anxious
mean_breq_pleasure
mean_soq_performance
mean_soq_competing
1
2.44
1.59
3.20
3.73
4.19
2
1.82
1.75
3.58
3.34
2.72
3
2.73
1.37
3.68
3.24
1.81
4
3.86
3.70
1.84
3.10
1.89
La tabla de caracterización nos permite ponerle nombre a cada clúster. Por ejemplo, el clúster con la media más alta en mean_breq_guilty y mean_spas_anxious se corresponde con nuestro “Functionalist Stressed”. Esta correspondencia nos permitirá, en el siguiente paso, utilizar el Análisis Discriminante para profundizar en las variables que mejor los definen.
3.2. Explicación de Segmentos mediante Análisis Discriminante (LDA)
Una vez que el análisis clúster ha validado que nuestros cuatro segmentos son estructuras que emergen de forma natural de los datos, el siguiente paso es profundizar en su “ADN”. Queremos responder a una pregunta de negocio fundamental: Dado que sabemos que estos cuatro grupos existen, ¿cuáles son exactamente las actitudes clave que mejor los definen y los separan entre sí? ¿Podemos crear una “fórmula” para predecir a qué segmento pertenece un consumidor basándonos en su mentalidad?
Para ello, utilizaremos una potente técnica de clasificación supervisada: el Análisis Discriminante Lineal (LDA).
¿Qué es el Análisis Discriminante y por qué lo usamos?
Imagina el LDA como un “chef” estadístico al que le damos los cuatro platos finales (nuestros cuatro segmentos) y la lista de todos los ingredientes disponibles (nuestras 20+ variables de actitud). La misión del chef es encontrar las “recetas de sabor” que mejor distinguen un plato de otro.
Estas “recetas” se llaman Funciones Discriminantes. No son más que combinaciones lineales de nuestras variables de actitud originales. Por ejemplo, el LDA podría descubrir que la mejor forma de separar a los segmentos es a través de dos grandes ejes de sabor:
Función 1 (LD1): Un eje que contrapone la motivación por “Placer y Disfrute” frente a la motivación por “Culpa y Obligación”.
Función 2 (LD2): Un eje que contrapone el enfoque en el “Rendimiento Individual” frente al enfoque en la “Socialización y el Bienestar”.
El LDA no solo nos da estas recetas, sino que también nos dice qué ingredientes (qué variables de actitud) son los más importantes en cada una y, finalmente, nos permite visualizar cómo de bien separados quedan nuestros cuatro segmentos en este nuevo “mapa de sabores”.
Ejecución e Interpretación del Modelo
Procedemos a ejecutar el modelo en R, utilizando nuestra variable segment como la variable a explicar y todas las variables de actitud como predictoras.
# --- LINEAR DISCRIMINANT ANALYSIS (LDA) ---# --- Step 1: Prepare the data for LDA ---# We use the same set of active respondents and attitudinal variables as in the K-Means analysis.# The `segment` variable is our outcome (dependent variable).lda_data <- df %>%filter(is_active =="Yes") %>% dplyr::select( segment, # This is our outcome variablestarts_with("breq_"),starts_with("spas_"),starts_with("soq_"),starts_with("tam_") )# --- Step 2: Run the LDA model ---# We model 'segment' as a function of all other attitude variables (`.`).# The `MASS` library is required for the `lda()` function.lda_model <-lda(segment ~ ., data = lda_data)# --- Step 3: Print and interpret the numerical model ---# This output contains the core "recipes" of our segments.print(lda_model)
El resultado numérico del modelo nos proporciona la información clave:
Prior probabilities of groups: Esto simplemente nos muestra el tamaño de cada segmento en la muestra de análisis (ej. “Functionalist Stressed” representa un 26% de los encuestados activos).
Coefficients of linear discriminants: ¡Esta es la parte más importante! Es la “receta” de cada Función Discriminante (LD1, LD2, LD3). Para interpretar cada función, buscamos los coeficientes (positivos o negativos) más grandes:
Interpretando LD1: Si observamos los coeficientes, veremos valores muy altos y positivos para variables como breq_guilty y spas_anxious_seen, y valores muy altos y negativos para breq_pleasure. Esto nos confirma que LD1 es un eje que mide la tensión entre la motivación por obligación/culpa y la motivación por placer.
Interpretando LD2: De forma similar, veremos coeficientes altos para variables como soq_improve_performance y tam_useful_for_goals en una dirección, y para motiv_social_friends (que no está en el modelo pero conceptualmente sí) en la otra. Esto nos dice que LD2 es un eje que mide la tensión entre el enfoque en el rendimiento individual y el enfoque en la socialización.
Proportion of trace: Este valor nos indica la importancia de cada “receta”. Veremos que LD1 explica la gran mayoría de la varianza (probablemente >80%). Esto es un insight potentísimo: la principal diferencia que estructura este mercado es la relación emocional (placer vs. deber) que los consumidores tienen con el deporte.
Evaluación de la Capacidad Predictiva del Modelo
Ahora, usamos el modelo que hemos creado para predecir a qué segmento pertenece cada individuo basándonos únicamente en sus actitudes. La comparación entre el segmento real y el predicho nos da una medida de la robustez del modelo.
# --- Step 4: Use the model to predict segment membership ---lda_predictions <-predict(lda_model, lda_data)# Create a confusion matrix using expsslda_validation_table <- lda_data %>%mutate(predicted_segment = lda_predictions$class) %>%tab_cells(segment) %>%tab_cols(predicted_segment) %>%tab_stat_cases() %>%tab_pivot()knitr::kable(lda_validation_table, caption ="Matriz de Confusión: Segmento Original vs. Segmento Predicho por LDA.")
Matriz de Confusión: Segmento Original vs. Segmento Predicho por LDA.
row_labels
predicted_segment|Functionalist Stressed
predicted_segment|Performance Optimizer
predicted_segment|Social Connector
predicted_segment|Wellness Seeker
segment|Functionalist Stressed
94
NA
2
1
segment|Performance Optimizer
2
53
7
7
segment|Social Connector
1
10
71
20
segment|Wellness Seeker
NA
2
14
70
segment|#Total cases
97
65
94
98
# Calculate and display overall accuracyconfusion_matrix_raw <-table(lda_data$segment, lda_predictions$class)accuracy <-sum(diag(confusion_matrix_raw)) /sum(confusion_matrix_raw)cat(paste0("\n**Precisión General del Modelo LDA:** ", round(accuracy *100, 2), "%"))
**Precisión General del Modelo LDA:** 81.36%
Interpretación de la Precisión: La matriz de confusión muestra una diagonal muy fuerte, indicando una alta correspondencia entre los segmentos originales y los predichos por el modelo. La precisión general del modelo es del 81.36%. En el contexto de la segmentación de mercados, donde los perfiles de consumidor son constructos psicológicos con fronteras inherentemente difusas, una precisión de este nivel se considera muy buena y robusta. Supera masivamente tanto la clasificación por azar (25%) como la clasificación por la clase mayoritaria (31.5%), demostrando que las variables de actitud medidas tienen un alto poder predictivo. Esto significa que, con solo conocer las respuestas de un individuo a los ítems de actitud, el modelo es capaz de predecir a qué “tribu” de consumidor pertenece en más de 8 de cada 10 casos. La segmentación es, por tanto, muy robusta y discriminante.
Interpretación Visual de la Separación de Segmentos
La mejor forma de entender el poder del LDA es visualmente. El siguiente gráfico representa a cada encuestado en el “mapa de sabores” creado por las dos funciones discriminantes principales.
# --- Step 5: Visualize the discriminant functions ---# --- CORRECTION APPLIED HERE ---# We create the dataframe for plotting and explicitly assign column names.plot_data <-data.frame(segment = lda_data$segment, # First column is the segment lda_predictions$x # The rest are the LD scores)# The names of the LD scores are LD1, LD2, LD3. We assign them.# colnames(plot_data) <- c("segment", "LD1", "LD2", "LD3") # This is a robust way# Create a ggplot version for better aestheticsggplot(plot_data, aes(x = LD1, y = LD2, color = segment)) +geom_point(alpha =0.7, size =2) +labs(title ="Mapa Perceptual de Segmentos",subtitle ="Separación de los grupos según las dos Funciones Discriminantes principales",x ="LD1 (Obligación/Ansiedad <--> Placer/Disfrute)",y ="LD2 (Rendimiento Individual <--> Social/Bienestar)" ) +theme_economist() +theme(plot.title =element_text(size=12))+scale_color_economist(name ="Segmento") # Add a legend title
Interpretación del Gráfico: El mapa perceptual muestra cuatro “nubes” de puntos claramente separadas, lo que confirma visualmente la validez de la segmentación.
Eje Horizontal (LD1): Separa claramente a los segmentos. A la derecha (valores positivos) se sitúa el “Functionalist Stressed”, definido por la obligación. A la izquierda (valores negativos) se agrupan los tres segmentos motivados por el placer.
Eje Vertical (LD2): Se encarga de separar a los tres grupos de la izquierda. Arriba (valores positivos) encontramos al “Performance Optimizer”, definido por su enfoque en el rendimiento. Abajo (valores negativos) se sitúan el “Social Connector” y el “Buscador de Bienestar”, que comparten un menor interés por la competición.
Conclusión del Análisis Discriminante: El LDA no solo ha validado la segmentación con una precisión casi perfecta, sino que nos ha proporcionado el “ADN” de cada grupo. Sabemos qué actitudes son las palancas clave que los definen y, por tanto, qué “botones emocionales” debe pulsar la estrategia de comunicación de Reebok para conectar con cada uno de ellos.
3.3. Reducción de la Dimensión Actitudinal (Análisis de Componentes Principales - PCA)
Mientras que el K-Means busca agrupar individuos y el LDA busca explicar las diferencias entre grupos predefinidos, el Análisis de Componentes Principales (PCA) tiene un objetivo diferente: simplificar la estructura de las variables.
La pregunta que respondemos aquí es: De todas las variables de actitud que hemos medido, ¿cuáles son las dimensiones psicológicas subyacentes que realmente definen la mentalidad del consumidor? ¿Podemos visualizar el “mapa mental” del mercado?
El PCA nos permitirá reducir la complejidad de nuestras 20+ variables de actitud a unos pocos “Componentes Principales” que resumen la mayor parte de la información.
Ejecución e Interpretación del Modelo PCA
El análisis se realiza sobre el mismo conjunto de datos de actitudes estandarizadas que usamos para el K-Means.
# --- PRINCIPAL COMPONENT ANALYSIS (PCA) ---# --- Step 1: Prepare the data ---# We use the same scaled attitudinal data from the K-Means analysis.# scaled_attitude_data (already created in the previous chunk)# --- Step 2: Run the PCA ---# The `prcomp()` function is the standard way to perform PCA in R.pca_result <-prcomp(scaled_attitude_data, center =TRUE, scale. =TRUE)# --- Step 3: Analyze the results ---# We can start by looking at the importance of each component.summary(pca_result)
# A scree plot is the best way to visualize this. It shows the percentage# of variance explained by each component. We look for an "elbow" to decide# how many components to retain.scree_plot <-fviz_eig(pca_result, addlabels =TRUE, ylim =c(0, 50)) +labs(title ="Gráfico de Sedimentación (Scree Plot)",subtitle ="Porcentaje de varianza explicada por cada Componente Principal")print(scree_plot)
Interpretación del Scree Plot
El gráfico de sedimentación nos muestra la importancia de cada componente. Observamos que: * El Componente 1 (Dim.1) es, con diferencia, el más importante, explicando una gran parte de la variabilidad total de las actitudes. * El Componente 2 (Dim.2) también es muy relevante. * A partir del tercer o cuarto componente, la ganancia de información es mucho menor (la curva se aplana).
Esto confirma nuestra hipótesis: la compleja “mentalidad” de los consumidores puede ser resumida eficazmente en unas pocas dimensiones fundamentales. Nos centraremos en interpretar las dos primeras.
Interpretación de los Componentes Principales
Para entender qué significa cada componente, analizamos qué variables originales tienen más peso en su “receta”. Esto se hace visualizando el “círculo de correlaciones”.
# --- Step 4: Visualize and interpret the components ---# The variable correlation plot shows how each original variable contributes# to the new components (axes).# Variables pointing in the same direction are positively correlated.# Variables pointing in opposite directions are negatively correlated.var_plot <-fviz_pca_var(pca_result, col.var ="contrib",gradient.cols =c("#00AFBB", "#E7B800", "#FC4E07"),repel =TRUE) +labs(title ="Círculo de Correlaciones del PCA",subtitle ="Contribución de las variables a los dos primeros componentes")print(var_plot)
Interpretación del Círculo de Correlaciones:
El gráfico nos muestra un “mapa” de nuestras variables de actitud. Las flechas (variables) que apuntan en la misma dirección están correlacionadas. Las que apuntan en direcciones opuestas son antagónicas.
Interpretando el Eje Horizontal (Dim.1):
A la derecha, vemos un grupo de flechas muy juntas que corresponden a variables como breq_guilty, breq_should_exercise, spas_anxious_seen y tam_is_stressful.
A la izquierda, vemos otro grupo con variables como breq_pleasure, breq_enjoy_session y tam_is_fun.
Conclusión: El Componente Principal 1 representa claramente la dimensión psicológica fundamental que ya habíamos intuido: el eje “Deber/Ansiedad vs. Placer/Disfrute”.
Interpretando el Eje Vertical (Dim.2):
Hacia arriba, vemos flechas como soq_improve_performance y soq_set_goals.
Hacia abajo, vemos flechas relacionadas con la socialización (que estarían ahí si las hubiéramos incluido) y la competición contra otros (soq_enjoy_competing).
Conclusión: El Componente Principal 2 representa otra dimensión clave: el eje “Superación Personal/Individual vs. Competición Social”.
Visualización de los Segmentos en el Mapa del PCA
Finalmente, podemos usar este nuevo mapa de actitudes para visualizar dónde se posiciona cada uno de nuestros segmentos originales. Esto nos da una visión complementaria a la del LDA.
# --- Step 5: Visualize individuals (and segments) on the PCA map ---# A biplot shows both the variables (arrows) and the individuals (points).# We can color the points by their original segment to see how they group.#| echo: true#| warning: false#| message: false# Cargar la librería ggthemes si no está en el setuplibrary(ggthemes)biplot <-fviz_pca_biplot( pca_result,geom.ind ="point",pointshape =21, # Forma con borde (color) y relleno (fill)pointsize =2.5, # Un poco más grandes para mejor visibilidadfill.ind = active_df_clustered$segment, # Mapea 'segment' al RELLENO de los puntosaddEllipses =TRUE,ellipse.level =0.95,col.var ="black",repel =TRUE,# Eliminamos el control de la leyenda de aquí para centralizarlo en ggplotlegend.title ="") +# --- LA CORRECCIÓN CLAVE ESTÁ AQUÍ ---# 1. Unificamos los nombres de las leyendas de 'fill' y 'color'labs(title ="Biplot del PCA: Posicionamiento de los Segmentos", subtitle ="Las elipses muestran la ubicación de cada segmento en el mapa de actitudes",fill ="Segmento", # Nombra la leyenda de rellenocolor ="Segmento"# Nombra la leyenda de color EXACTAMENTE IGUAL ) +theme_economist() +theme(plot.title =element_text(size =14),legend.title =element_text(size =10),legend.text =element_text(size =9) ) +# 2. Aplicamos la misma paleta de colores a AMBAS estéticasscale_fill_economist() +scale_color_economist()print(biplot)
Interpretación del Biplot:
El biplot confirma de forma visual y contundente todo nuestro análisis:
El “Functionalist Stressed” se sitúa claramente a la derecha, en la zona de “Deber y Ansiedad”.
El “Social Connector” y el “Buscador de Bienestar” se sitúan a la izquierda, en la zona de “Placer y Disfrute”.
El “Performance Optimizer” se sitúa en la parte superior, definido por su alta orientación a la “Superación Personal”.
Conclusión Final del Análisis Avanzado: Las tres técnicas (K-Means, LDA y PCA) convergen en una misma conclusión. El mercado está estructurado en torno a cuatro segmentos claros, definidos principalmente por dos grandes ejes psicológicos. Esta triple validación nos proporciona una certeza muy alta sobre la estructura del mercado y nos permite proceder con las recomendaciones estratégicas con una base analítica excepcionalmente sólida.