plazaVea ha observado que durante los últimos meses algunos clientes han reducido su frecuencia de compra, mientras que otros continúan realizando compras de manera constante y con tickets elevados.
El área de Marketing busca identificar segmentos de clientes utilizando la metodología RFM (Recency, Frequency, Monetary) para diseñar campañas diferenciadas que permitan:
Incrementar la recompra.
Recuperar clientes inactivos.
Fidelizar a los clientes más valiosos.
Optimizar la inversión promocional.
Para ello se dispone de una muestra de transacciones registradas durante los últimos 12 meses con las siguientes variables :
| Variable | Descripción |
|---|---|
| id_ticket | Identificador de compra |
| fecha_compra | Fecha de compra |
| id_cliente | Cliente |
| sexo | M/F |
| edad | Edad |
| distrito | Distrito residencia |
| canal | Tienda / Ecommerce |
| categoria_principal | Categoría comprada |
| metodo_pago | Medio de pago |
| monto_compra | Importe ticket |
| items | Cantidad de productos |
Los estudiantes deberán:
# Carga de datos
library(tidyverse)
library(lubridate)
library(scales)
datos <- read.csv("plazavea_transacciones.csv")
head(datos)
## id_ticket fecha_compra id_cliente sexo edad distrito canal
## 1 TK000001 2025-08-04 CLI_1415 F 37 La Molina Tienda
## 2 TK000002 2025-02-25 CLI_1463 M 65 La Molina Tienda
## 3 TK000003 2025-03-12 CLI_1179 M 36 San Isidro Tienda
## 4 TK000004 2025-08-29 CLI_1526 M 33 Surco Tienda
## 5 TK000005 2025-03-02 CLI_1195 M 32 San Borja Tienda
## 6 TK000006 2025-01-10 CLI_1938 M 28 Miraflores Tienda
## categoria_principal metodo_pago monto_compra items
## 1 Frescos Tarjeta 37.07 16
## 2 Bebidas Plin 104.46 7
## 3 Abarrotes Tarjeta 53.63 8
## 4 Abarrotes Tarjeta 53.15 7
## 5 Abarrotes Tarjeta 81.16 4
## 6 Abarrotes Efectivo 75.01 11
# Exploración Inicial
## Cantidad de registros
nrow(datos)
## [1] 10000
## Cantidad de clientes únicos
n_distinct(datos$id_cliente)
## [1] 1985
## Estadísticas del monto de compra
summary(datos$monto_compra)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.53 44.54 67.13 80.40 99.56 662.59
ggplot(datos,
aes(x = monto_compra)) +
geom_histogram(
bins = 40,
fill = "#E41E2B",
color = "white"
) +
theme_minimal() +
labs(
title = "Distribución de los montos de compra",
x = "Monto",
y = "Frecuencia"
)
## Preparación de fechas
datos$fecha_compra <- as.Date(datos$fecha_compra)
fecha_analisis <- max(datos$fecha_compra)
## Construcción de indicadores
rfm <- datos %>%
group_by(id_cliente) %>%
summarise(
Recency =
as.numeric(fecha_analisis -
max(fecha_compra)),
Frequency =
n(),
Monetary =
sum(monto_compra)
)
head(rfm)
## # A tibble: 6 × 4
## id_cliente Recency Frequency Monetary
## <chr> <dbl> <int> <dbl>
## 1 CLI_1001 44 6 596.
## 2 CLI_1002 58 6 924.
## 3 CLI_1003 96 5 298.
## 4 CLI_1004 13 5 349.
## 5 CLI_1005 74 7 378.
## 6 CLI_1006 56 2 128.
# Estadísticas de los Indicadores RFM
summary(rfm)
## id_cliente Recency Frequency Monetary
## Length:1985 Min. : 0.00 Min. : 1.000 Min. : 12.8
## Class :character 1st Qu.: 20.00 1st Qu.: 3.000 1st Qu.: 244.4
## Mode :character Median : 47.00 Median : 5.000 Median : 375.3
## Mean : 67.66 Mean : 5.038 Mean : 405.0
## 3rd Qu.: 93.00 3rd Qu.: 6.000 3rd Qu.: 531.4
## Max. :352.00 Max. :15.000 Max. :1454.1
rfm <- rfm %>%
mutate(
R_Score =
ntile(-Recency,5),
F_Score =
ntile(Frequency,5),
M_Score =
ntile(Monetary,5)
)
rfm <- rfm %>%
mutate(
RFM_Score =
paste0(R_Score,
F_Score,
M_Score)
)
Segmentar clientes
La lógica utilizada busca identificar comportamientos de compra relevantes para Plaza Vea:
Son los clientes más valiosos de la empresa.
Características:
En términos de negocio, representan el grupo de clientes que plazaVea debería proteger y fidelizar prioritariamente, ya que constituyen una parte importante de los ingresos de la compañía.
Condición utilizada:
Son clientes con una relación sólida con la empresa.
Características:
Estos clientes representan una oportunidad para desarrollar estrategias de fidelización, programas de beneficios y acciones de cross-selling.
Condición utilizada:
Son clientes que muestran señales de abandono.
Características:
Aunque actualmente presentan una baja actividad, podrían ser recuperados mediante campañas específicas de reactivación.
Condición utilizada:
Corresponden a todos aquellos clientes que no encajan claramente en las categorías anteriores.
Este grupo suele contener clientes nuevos, ocasionales o en proceso de desarrollo, sobre los cuales pueden aplicarse estrategias diferenciadas según sus características futuras.
rfm <- rfm %>%
mutate(
Segmento = case_when(
R_Score >=4 &
F_Score >=4 &
M_Score >=4 ~ "Campeones", # Clientes de mayor valor para Plaza Vea
F_Score >=4 &
M_Score >=4 ~ "Leales", # Clientes frecuentes y con alto gasto
R_Score <=2 &
F_Score <=2 ~ "En Riesgo", # Clientes con señales de abandono
TRUE ~ "Potencial" # Resto de clientes
)
)
table(rfm$Segmento)
##
## Campeones En Riesgo Leales Potencial
## 304 440 320 921
library(ggplot2)
rfm %>%
count(Segmento) %>%
ggplot(aes(x=reorder(Segmento,n),
y=n,
fill=Segmento))+
geom_col()+
coord_flip()+
theme_minimal(base_size = 14)+
labs(
title="Distribución de Clientes por Segmento RFM",
x="",
y="Clientes"
)
¿Está de acuerdo con esta clasificación?
# Participación de Ventas por Segmento
ventas_segmento <- rfm %>%
group_by(Segmento) %>%
summarise(
Ventas = sum(Monetary) # Suma el gasto total generado por los clientes
) %>%
mutate(
# Calcula la participación de cada segmento
# respecto al total de ventas
Porcentaje_Ventas =
round(Ventas / sum(Ventas) * 100,2)
)
ventas_segmento
## # A tibble: 4 × 3
## Segmento Ventas Porcentaje_Ventas
## <chr> <dbl> <dbl>
## 1 Campeones 197795. 24.6
## 2 En Riesgo 97536. 12.1
## 3 Leales 202304. 25.2
## 4 Potencial 306330. 38.1
Identifique los clientes de mayor score RFM Campeones y determine:
Evaluar si existe una alta concentración de ventas en un grupo reducido de clientes.
# =====================================================
# ANÁLISIS DEL SEGMENTO CAMPEONES
# =====================================================
# Filtramos únicamente los clientes clasificados
# como "Campeones"
campeones <- rfm %>%
filter(Segmento == "Campeones")
# =====================================================
# PREGUNTA 1
# ¿Cuántos clientes pertenecen a este grupo?
# =====================================================
# nrow() cuenta la cantidad de filas
# En este caso, cada fila representa un cliente
cantidad_campeones <- nrow(campeones)
cantidad_campeones
## [1] 304
# =====================================================
# PREGUNTA 2
# ¿Cuánto gastan en total?
# =====================================================
# Sumamos el gasto acumulado (Monetary)
# de todos los clientes campeones
ventas_campeones <- sum(campeones$Monetary)
ventas_campeones
## [1] 197795.3
# =====================================================
# PREGUNTA 3
# ¿Qué porcentaje de clientes representan?
# =====================================================
# Calculamos la cantidad total de clientes
# existentes en la base RFM
total_clientes <- nrow(rfm)
# Calculamos la participación de los Campeones
# sobre el total de clientes
pct_clientes_campeones <-
cantidad_campeones /
total_clientes * 100
pct_clientes_campeones
## [1] 15.31486
# =====================================================
# PREGUNTA 4
# ¿Qué porcentaje de ventas generan?
# =====================================================
# Calculamos las ventas totales de todos
# los clientes de la base
ventas_totales <- sum(rfm$Monetary)
# Calculamos la participación de ventas
# generada por los Campeones
pct_ventas_campeones <-
ventas_campeones /
ventas_totales * 100
pct_ventas_campeones
## [1] 24.60247
Analice el segmento En Riesgo.
Diseñar campañas de recuperación.
# =====================================================
# ANÁLISIS DEL SEGMENTO EN RIESGO
# =====================================================
# Filtramos únicamente los clientes clasificados
# como "En Riesgo"
riesgo <- rfm %>%
filter(Segmento == "En Riesgo")
# =====================================================
# PREGUNTA 1
# ¿Cuántos clientes existen?
# =====================================================
# nrow() cuenta la cantidad de filas
# En este caso, cada fila representa un cliente
cantidad_riesgo <- nrow(riesgo)
cantidad_riesgo
## [1] 440
# =====================================================
# PREGUNTA 2
# ¿Cuánto gastaron históricamente?
# =====================================================
# Sumamos el gasto acumulado de todos
# los clientes en riesgo
ventas_riesgo <- sum(riesgo$Monetary)
ventas_riesgo
## [1] 97536.16
# =====================================================
# PARTICIPACIÓN DEL SEGMENTO
# SOBRE LAS VENTAS TOTALES
# =====================================================
# Ventas totales de toda la base
ventas_totales <- sum(rfm$Monetary)
# Porcentaje de ventas que representan
# los clientes en riesgo
pct_ventas_riesgo <-
ventas_riesgo /
ventas_totales * 100
pct_ventas_riesgo
## [1] 12.13189
# =====================================================
# PARTICIPACIÓN DEL SEGMENTO
# SOBRE EL TOTAL DE CLIENTES
# =====================================================
# Total de clientes de la base
total_clientes <- nrow(rfm)
# Porcentaje de clientes en riesgo
pct_clientes_riesgo <-
cantidad_riesgo /
total_clientes * 100
pct_clientes_riesgo
## [1] 22.16625
Los clientes en riesgo presentan un gasto promedio elevado.
Aunque actualmente han reducido su actividad, existe una oportunidad de recuperación mediante campañas personalizadas.
Compare:
¿A qué segmento invertiría el presupuesto y por qué?
Justifique utilizando los resultados obtenidos.
rfm %>%
group_by(Segmento) %>% # agrupa registros
summarise( # genera métricas por grupo
Clientes = n(),
Venta_Total = sum(Monetary),
Venta_Promedio = mean(Monetary)
) %>%
arrange(desc(Venta_Total)) # ordena resultados
## # A tibble: 4 × 4
## Segmento Clientes Venta_Total Venta_Promedio
## <chr> <int> <dbl> <dbl>
## 1 Potencial 921 306330. 333.
## 2 Leales 320 202304. 632.
## 3 Campeones 304 197795. 651.
## 4 En Riesgo 440 97536. 222.
El gerente de Marketing desea entender si las ventas de plazaVea se distribuyen de manera homogénea entre todos los clientes o si existen segmentos que generan una contribución significativamente mayor.
Utilizando los resultados obtenidos mediante el análisis RFM:
A partir de los resultados obtenidos:
| Segmento | Clientes | Venta Total |
|---|---|---|
| Potencial | 921 | S/ 306,330 |
| Leales | 320 | S/ 202,304 |
| Campeones | 304 | S/ 197,795 |
| En Riesgo | 440 | S/ 97,536 |
Los segmentos Leales y Campeones generan conjuntamente:
202304 + 197795
## [1] 400099
equivalente aproximadamente al:
400099 / 803965 * 100
## [1] 49.76572
de las ventas totales.
Sí.
Aunque los segmentos Leales y Campeones representan aproximadamente:
(320 + 304) / 1985 * 100
## [1] 31.43577
de los clientes, generan cerca del 50% de las ventas totales.
Además, presentan los mayores niveles de gasto promedio:
| Segmento | Venta Promedio |
|---|---|
| Campeones | S/ 650.64 |
| Leales | S/ 632.20 |
| Potencial | S/ 332.61 |
| En Riesgo | S/ 221.67 |
Esto demuestra que no todos los clientes tienen el mismo valor económico para plazaVea.
Se recomienda una estrategia diferenciada:
| Segmento | Estrategia |
|---|---|
| Campeones | Fidelización VIP |
| Leales | Cross-selling y crecimiento |
| Potencial | Desarrollo y maduración |
| En Riesgo | Reactivación selectiva |
La mayor inversión debería concentrarse en Campeones y Leales, debido a su elevada contribución económica.
La pérdida de clientes Campeones y Leales podría generar una reducción significativa en las ventas, ya que estos segmentos aportan aproximadamente la mitad de los ingresos totales.
Por ello, la empresa debe monitorear continuamente su comportamiento y diseñar estrategias que fortalezcan la relación con estos clientes.