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.
¿Cuáles son los 4 tópicos principales que emergen de las reseñas de clientes?
¿Qué palabras clave definen cada tópico?
¿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)
# 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 |
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
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
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
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"
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)
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)
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
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
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))
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)
Interpretación: Convertir datos en insights
Recomendaciones: Estrategias accionables basadas en evidencia
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
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
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
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
🎯 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
📊 PRIORIDAD MEDIA-ALTA (Tópico 1 - 24.2%):
Mantener esfuerzos sostenidos
Implementar mejoras incrementales
Comunicar avances a clientes
⚖️ PRIORIDAD MEDIA (Tópico 4 - 22.2%):
Desarrollar proyectos a mediano plazo
Buscar diferenciación competitiva
Medir impacto de cambios implementados
📋 PRIORIDAD MEDIA-BAJA (Tópico 2 - 21.0%):
No descuidar este aspecto
Implementar mejoras de bajo costo
Monitorear tendencias