Análisis de Tópicos Ocultos en Reseñas de Clientes de Tiendas MASS Perú

Contexto

Eres un analista de marketing en Tiendas MASS Perú. La gerencia te ha asignado analizar 500 reseñas de clientes para descubrir los temas principales que preocupan o satisfacen a tus consumidores. Debes identificar los 4 tópicos clave y proponer estrategias de marketing basadas en estos hallazgos.

Preguntas a desarrollar:

  1. ¿Cuáles son los 4 tópicos principales que emergen de las reseñas de clientes?

  2. ¿Qué palabras clave definen cada tópico?

  3. ¿Qué estrategias de marketing podemos desarrollar basadas en estos tópicos?

# Cargar las librerías necesarias
library(tidytext)
library(tm)
## Cargando paquete requerido: NLP
library(topicmodels)
library(ggplot2)
## 
## Adjuntando el paquete: 'ggplot2'
## The following object is masked from 'package:NLP':
## 
##     annotate
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(stringr)

📝 Paso 1: Carga de Datos

# Cargar la base de datos

reseñas = read.csv(file.choose(), sep=",")
# Mostrar primeras 10 reseñas
cat("PRIMERAS 10 RESEÑAS:\n")
## PRIMERAS 10 RESEÑAS:
head(reseñas, 10) %>% 
  knitr::kable() %>% 
  kableExtra::kable_styling()
id reseña
1 Las ofertas de MASS son excelentes
2 La calidad de las marcas es buena pero podría mejorar en algunos artículos
3 Compré una lavadora que funciona perfecto
4 Precios competitivos en muebles
5 Excelentes precios en electrodomésticos ahorré mucho
6 Excelentes precios en línea blanca precio imbatible
7 Atención personalizada en el departamento de deportes
8 Atención rápida en el departamento de deportes
9 Atención rápida en el departamento de hogar
10 Los vendedores conocen bien los productos pero necesitan mejor actitud

🧹 Paso 2: Limpieza de Texto

  • Minúsculas: Uniformidad en el análisis

  • Remover puntuación: Caracteres no relevantes

  • Remover números: No aportan al análisis temático

  • Espacios: Limpieza de formato

# PASO 2: LIMPIEZA DEL TEXTO
# Explicación: Preparamos el texto para análisis removiendo elementos no esenciales
cat("\n🔧 PASO 2: LIMPIANDO EL TEXTO...\n")
## 
## 🔧 PASO 2: LIMPIANDO EL TEXTO...
texto_limpio <- reseñas$reseña %>%
  str_to_lower() %>%     # Convertir a minúsculas (uniformidad)
  str_replace_all("[[:punct:]]", "") %>%  # Remover puntuación 
  str_replace_all("\\d+", "") %>%   # Remover números 
  str_replace_all("\\s+", " ") %>%    # Remover espacios extras
  str_trim()                 # Remover espacios al inicio/final

📊 Paso 3: Matriz Documento-Término

  • Corpus: Colección de documentos organizada

  • Stopwords: Eliminamos palabras comunes sin significado

  • DTM: Matriz que cuenta frecuencia de palabras por documento

# PASO 3: CREAR CORPUS Y MATRIZ DOCUMENTO-TÉRMINO (DTM)
# Explicación: Convertimos el texto en una matriz numérica para análisis
cat("📊 PASO 3: CREANDO MATRIZ DOCUMENTO-TÉRMINO...\n")
## 📊 PASO 3: CREANDO MATRIZ DOCUMENTO-TÉRMINO...
corpus <- Corpus(VectorSource(texto_limpio)) %>%
  tm_map(removeWords, stopwords("spanish")) %>%  # Remover palabras vacías (el, la, de, etc.) 
  tm_map(stripWhitespace)     # Remover espacios blancos extras
## Warning in tm_map.SimpleCorpus(., removeWords, stopwords("spanish")):
## transformation drops documents
## Warning in tm_map.SimpleCorpus(., stripWhitespace): transformation drops
## documents
# Crear Document-Term Matrix
dtm <- DocumentTermMatrix(corpus)
dtm <- dtm[rowSums(as.matrix(dtm)) > 0, ]  # Remover documentos vacíos (sin palabras después de limpieza)

cat("📈 Dimensión de la matriz DTM:", dim(dtm), "\n")
## 📈 Dimensión de la matriz DTM: 500 98

🔍 Paso 4: Algoritmo LDA

  • k=4: Buscamos 4 temas ocultos

  • seed=1234: Para resultados reproducibles

  • No supervisado: El algoritmo descubre patrones por sí mismo

# PASO 4: MODELADO DE TÓPICOS CON LDA
# Explicación: Algoritmo que descubre temas ocultos en los documentos
cat("🔍 PASO 4: EJECUTANDO ALGORITMO LDA...\n")
## 🔍 PASO 4: EJECUTANDO ALGORITMO LDA...
lda_model <- LDA(dtm, k = 4, control = list(seed = 1234))  # 4 tópicos, semilla para reproducibilidad

📝 Paso 5: Palabras Clave

  • Terms(): Extrae las palabras más relevantes por tópico

  • Beta: Mide la importancia de cada palabra en cada tópico

# PASO 5: EXTRAER PALABRAS CLAVE POR TÓPICO
cat("📝 PASO 5: EXTRAYENDO PALABRAS CLAVE...\n")
## 📝 PASO 5: EXTRAYENDO PALABRAS CLAVE...
topicos <- terms(lda_model, 8)  # Top 8 palabras por tópico
cat("\n🎯 PALABRAS CLAVE POR TÓPICO:\n")
## 
## 🎯 PALABRAS CLAVE POR TÓPICO:
print(topicos)
##      Topic 1           Topic 2      Topic 3        Topic 4        
## [1,] "compra"          "excelentes" "competitivos" "productos"    
## [2,] "proceso"         "precios"    "precios"      "atención"     
## [3,] "ofertas"         "línea"      "calidad"      "departamento" 
## [4,] "eficiente"       "blanca"     "mejorar"      "especialmente"
## [5,] "tienda"          "tiendas"    "podría"       "vendedores"   
## [6,] "estacionamiento" "faltan"     "compré"       "hogar"        
## [7,] "mass"            "parqueo"    "artículos"    "necesitan"    
## [8,] "rápido"          "ahorré"     "marcas"       "profesional"

TÓPICO 1: EXPERIENCIA DE COMPRA

Palabras clave: compra, proceso, ofertas, eficiente, tienda, estacionamiento, mass, rápido

Interpretación: Los clientes hablan sobre el proceso de compra en las tiendas MASS. Mencionan aspectos como:

  • La eficiencia del proceso

  • Las ofertas disponibles

  • Problemas con el estacionamiento

  • La experiencia en tienda

  • Velocidad del servicio (rápido)

TÓPICO 2: PRECIOS Y OFERTAS

Palabras clave: excelentes, precios, línea, blanca, tiendas, faltan, parqueo, ahorré

Interpretación: Este tópico se centra en los aspectos económicos:

  • Excelentes precios (valoración positiva)

  • Productos de línea blanca (enfriadoras, lavadoras, etc.)

  • Ahorro económico

  • Críticas sobre lo que faltan (productos o servicios)

  • Mención de parqueo (posiblemente relacionado con accesibilidad)

TÓPICO 3: CALIDAD Y MEJORA

Palabras clave: competitivos, precios, calidad, mejorar, podría, compré, artículos, marcas

Interpretación: Tópico mixto que combina:

  • Precios competitivos

  • Preocupación por la calidad

  • Sugerencias de mejora (“mejorar”, “podría”)

  • Experiencias personales de compra

  • Referencia a artículos y marcas específicas

TÓPICO 4: ATENCIÓN Y SERVICIO

Palabras clave: productos, atención, departamento, especialmente, vendedores, hogar, necesitan, profesional

Interpretación: Enfocado en el servicio al cliente:

  • Atención recibida

  • Vendedores y su desempeño

  • Departamentos específicos de la tienda

  • Productos para el hogar

  • Necesidades de mejora (“necesitan”)

  • Expectativa de servicio profesional

📈 Paso 6: Visualización

  • Gráficos: Facilitan la interpretación de resultados

  • Facet_wrap: Muestra cada tópico por separado

  • Coord_flip: Mejora la lectura de palabras

# PASO 6: VISUALIZACIÓN DE RESULTADOS
cat("📊 PASO 6: CREANDO VISUALIZACIONES...\n")
## 📊 PASO 6: CREANDO VISUALIZACIONES...
# Convertir resultados a formato tidy para ggplot
topic_terms <- tidy(lda_model, matrix = "beta")  # Beta = importancia de palabra en tópico

# Top 10 palabras por tópico
top_terms <- topic_terms %>%
  group_by(topic) %>%
  top_n(10, beta) %>%
  ungroup() %>%
  arrange(topic, -beta)

# Gráfico de palabras clave por tópico
ggplot(top_terms, aes(x = reorder(term, beta), y = beta, fill = as.factor(topic))) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~ topic, scales = "free") +
  coord_flip() +
  labs(title = "PALABRAS CLAVE POR TÓPICO EN RESEÑAS",
       subtitle = "Análisis LDA de 500 reseñas - Tiendas MASS Perú",
       x = "PALABRA",
       y = "RELEVANCIA (Beta)") +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold", size = 14),
        axis.text = element_text(size = 10))

🎯 Paso 7: Distribución de Tópicos

  • Gamma: Probabilidad de que documento pertenezca a tópico

  • Frecuencia: Cuántas reseñas tratan cada tema

# PASO 7: ASIGNAR TÓPICOS A DOCUMENTOS
cat("📋 PASO 7: ASIGNANDO TÓPICOS A RESEÑAS...\n")
## 📋 PASO 7: ASIGNANDO TÓPICOS A RESEÑAS...
doc_topics <- tidy(lda_model, matrix = "gamma")  # Gamma = probabilidad de documento en tópico

# Encontrar el tópico principal para cada documento
doc_topics_wide <- doc_topics %>%
  group_by(document) %>%
  slice_max(gamma) %>%
  ungroup()

# Contar frecuencia de tópicos
frecuencia_topicos <- doc_topics_wide %>%
  count(topic, name = "frecuencia") %>%
  mutate(porcentaje = round(frecuencia/sum(frecuencia)*100, 1))

cat("\n📈 DISTRIBUCIÓN DE TÓPICOS:\n")
## 
## 📈 DISTRIBUCIÓN DE TÓPICOS:
print(frecuencia_topicos)
## # A tibble: 4 × 3
##   topic frecuencia porcentaje
##   <int>      <int>      <dbl>
## 1     1        121       24.2
## 2     2        105       21  
## 3     3        163       32.6
## 4     4        111       22.2
# Gráfico de distribución de tópicos
ggplot(frecuencia_topicos, aes(x = as.factor(topic), y = porcentaje, fill = as.factor(topic))) +
  geom_col(alpha = 0.8) +
  labs(title = "DISTRIBUCIÓN DE TÓPICOS EN RESEÑAS",
       x = "TÓPICO",
       y = "PORCENTAJE (%)") +
  theme_minimal() +
  geom_text(aes(label = paste0(porcentaje, "%")), vjust = -0.5)

Paso 8: Aplicación de Marketing

  • Interpretación: Convertir datos en insights

  • Recomendaciones: Estrategias accionables basadas en evidencia

🎯 INTERPRETACIÓN DE LA DISTRIBUCIÓN:

TÓPICO 3: EL MÁS RELEVANTE (32.6%)

Interpretación: Este es el tema más frecuente en las reseñas, cubriendo casi un tercio de todos los comentarios. Esto indica que:

  • Es la principal preocupación de los clientes

  • Podría representar la fortaleza o debilidad más significativa

  • Merece máxima prioridad en las estrategias de marketing

TÓPICO 1: SEGUNDO EN IMPORTANCIA (24.2%)

Interpretación: Casi una cuarta parte de las reseñas se enfoca en este tema, lo que sugiere:

  • Un aspecto muy relevante para la experiencia del cliente

  • Un área que requiere atención constante

  • Potencial para diferenciación competitiva

TÓPICO 4: TERCERA PRIORIDAD (22.2%)

Interpretación: Aunque menos frecuente, aún representa una porción significativa:

  • Un tema consistente en las opiniones de clientes

  • Área que podría convertirse en ventaja competitiva si se mejora

TÓPICO 2: MENOS FRECUENTE (21.0%)

Interpretación: Aunque es el menos mencionado, sigue siendo importante:

  • Representa las expectativas del 21% de los clientes

  • No debe ser ignorado en la estrategia general

📈 SIGNIFICADO ESTRATÉGICO PARA MARKETING:

PRIORIZACIÓN DE ACCIONES:

  1. 🎯 PRIORIDAD ALTA (Tópico 3 - 32.6%):

    • Asignar más recursos y atención a este tema

    • Desarrollar campañas específicas para abordarlo

    • Monitorear constantemente las mejoras en esta área

  2. 📊 PRIORIDAD MEDIA-ALTA (Tópico 1 - 24.2%):

    • Mantener esfuerzos sostenidos

    • Implementar mejoras incrementales

    • Comunicar avances a clientes

  3. ⚖️ PRIORIDAD MEDIA (Tópico 4 - 22.2%):

    • Desarrollar proyectos a mediano plazo

    • Buscar diferenciación competitiva

    • Medir impacto de cambios implementados

  4. 📋 PRIORIDAD MEDIA-BAJA (Tópico 2 - 21.0%):

    • No descuidar este aspecto

    • Implementar mejoras de bajo costo

    • Monitorear tendencias