Segmentación

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 reproducibility
elbow_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 clustering
kmeans_result <- kmeans(scaled_attitude_data, centers = 4, nstart = 25)

# Add the new cluster assignment back to our dataframe of active users
active_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 table
knitr::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

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

  2. 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 variables
cluster_characterization <- active_df_clustered %>%
  group_by(kmeans_cluster) %>%
  summarise(
    # Key attitudes that define each segment
    mean_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:

  1. 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”.
  2. 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 variable
    starts_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)
Call:
lda(segment ~ ., data = lda_data)

Prior probabilities of groups:
Functionalist Stressed  Performance Optimizer       Social Connector 
             0.2740113              0.1949153              0.2881356 
       Wellness Seeker 
             0.2429379 

Group means:
                       breq_pleasure breq_enjoy_session breq_part_of_me
Functionalist Stressed      1.824742           2.865979        2.917526
Performance Optimizer       2.927536           3.130435        3.739130
Social Connector            3.960784           3.931373        3.049020
Wellness Seeker             3.546512           3.965116        3.709302
                       breq_consistent_values breq_value_benefits breq_guilty
Functionalist Stressed               2.969072            2.938144    3.701031
Performance Optimizer                3.521739            3.637681    2.652174
Social Connector                     3.147059            2.921569    1.794118
Wellness Seeker                      3.779070            2.662791    2.779070
                       breq_should_exercise spas_anxious_seen spas_judged
Functionalist Stressed             3.865979          3.721649    3.731959
Performance Optimizer              2.898551          1.478261    2.753623
Social Connector                   3.039216          1.686275    3.107843
Wellness Seeker                    2.976744          1.348837    3.000000
                       spas_self_conscious spas_avoidance soq_enjoy_competing
Functionalist Stressed            3.680412       3.731959            1.845361
Performance Optimizer             2.826087       2.608696            4.057971
Social Connector                  2.931373       2.882353            3.029412
Wellness Seeker                   2.941860       3.267442            1.662791
                       soq_seek_competition soq_winning_is_important
Functionalist Stressed             2.845361                 2.804124
Performance Optimizer              3.753623                 3.927536
Social Connector                   3.137255                 3.166667
Wellness Seeker                    3.279070                 3.046512
                       soq_set_goals soq_improve_performance
Functionalist Stressed      2.979381                3.010309
Performance Optimizer       3.739130                3.724638
Social Connector            3.137255                3.166667
Wellness Seeker             3.941860                3.593023
                       tam_useful_for_goals tam_is_easy tam_is_fun
Functionalist Stressed             2.020619    3.092784   1.938144
Performance Optimizer              3.884058    2.927536   3.086957
Social Connector                   2.598039    3.107843   3.205882
Wellness Seeker                    2.895349    2.930233   3.651163
                       tam_is_stressful
Functionalist Stressed         3.670103
Performance Optimizer          1.710145
Social Connector               1.421569
Wellness Seeker                1.302326

Coefficients of linear discriminants:
                                 LD1         LD2          LD3
breq_pleasure             0.29021004  0.10978097 -0.342588610
breq_enjoy_session        0.11742924  0.19723330 -0.112498051
breq_part_of_me           0.03689321  0.01428520  0.235439012
breq_consistent_values    0.04207902  0.08135061  0.169843456
breq_value_benefits       0.02961238 -0.21927800 -0.005164503
breq_guilty              -0.15654447  0.06676618  0.427875714
breq_should_exercise     -0.14286307  0.01921791 -0.073693474
spas_anxious_seen        -0.58875178 -0.13794999 -0.181142255
spas_judged              -0.08135116  0.01618971 -0.121209603
spas_self_conscious      -0.06157555  0.03150715 -0.076331497
spas_avoidance           -0.05858277  0.10188494 -0.021102208
soq_enjoy_competing       0.19250600 -0.70030776 -0.231366205
soq_seek_competition      0.04854611 -0.11237444  0.165703459
soq_winning_is_important  0.11514815 -0.10134761  0.069326916
soq_set_goals             0.04971488  0.10185262  0.267550427
soq_improve_performance   0.04253720 -0.06512739  0.147495502
tam_useful_for_goals      0.11983014 -0.22773486  0.264211581
tam_is_easy              -0.07076094 -0.09851873 -0.030799049
tam_is_fun                0.24465588  0.14031592  0.090957741
tam_is_stressful         -0.57995848 -0.16913269  0.043335909

Proportion of trace:
   LD1    LD2    LD3 
0.7560 0.1574 0.0865 

Interpretación del Modelo Numérico

El resultado numérico del modelo nos proporciona la información clave:

  1. 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).

  2. 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.
  3. 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 expss
lda_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 accuracy
confusion_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 aesthetics
ggplot(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)
Importance of components:
                          PC1     PC2     PC3     PC4     PC5     PC6     PC7
Standard deviation     1.7734 1.23977 1.13915 1.11775 1.07117 1.03115 1.00961
Proportion of Variance 0.1572 0.07685 0.06488 0.06247 0.05737 0.05316 0.05097
Cumulative Proportion  0.1572 0.23410 0.29898 0.36145 0.41882 0.47198 0.52295
                           PC8     PC9    PC10   PC11    PC12    PC13    PC14
Standard deviation     0.99593 0.95832 0.94635 0.9348 0.89897 0.88111 0.85134
Proportion of Variance 0.04959 0.04592 0.04478 0.0437 0.04041 0.03882 0.03624
Cumulative Proportion  0.57254 0.61846 0.66324 0.7069 0.74734 0.78616 0.82240
                         PC15    PC16    PC17    PC18    PC19    PC20
Standard deviation     0.8414 0.80959 0.78399 0.77262 0.74393 0.65085
Proportion of Variance 0.0354 0.03277 0.03073 0.02985 0.02767 0.02118
Cumulative Proportion  0.8578 0.89057 0.92130 0.95115 0.97882 1.00000
# 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 setup
library(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 visibilidad
    fill.ind = active_df_clustered$segment, # Mapea 'segment' al RELLENO de los puntos
    addEllipses = TRUE,
    ellipse.level = 0.95,
    col.var = "black",
    repel = TRUE,
    # Eliminamos el control de la leyenda de aquí para centralizarlo en ggplot
    legend.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 relleno
        color = "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éticas
    scale_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.