Power BI : exploración de datos de ventas en SQL | Análisis RFM
Este artículo es parte de un proyecto personal realizado para mi portafolio integrando Microsoft SQL Server y Power BI para hacer un breve análisis RFM.
El conjunto de datos y el tutorial de este proyecto se pueden encontrar en Angelica Frimpong Channel , más específicamente en este video: Exploración de datos de ventas en SQL y Tableau | Análisis RFM en SQL | Proyectos de analistas de datos | Proyectos SQL
Mi objetivo es presentar al lector una introducción básica a RFM y un ejemplo de análisis y conclusiones que se pueden extraer de él utilizando SQL y PowerBI
El código fuente se puede encontrar en el siguiente repositorio de GitHub:
#Add enlace de código fuente más tarde
Table of Contents
Toggle¿Qué es RFM?
RFM, acrónimo de Recency, Frequency y Monetary, es una metodología empleada para categorizar el comportamiento de los clientes. Evalúa qué tan reciente fue la última compra de un cliente (Antigüedad), con qué frecuencia el cliente interactúa con nuestros productos o servicios (Frecuencia) y la cantidad promedio o total que el cliente gasta con nosotros (Monetaria).
¿Por qué las empresas lo utilizan?
Las empresas utilizan RFM para obtener información sobre el comportamiento de los clientes, lo que les permite adaptar enfoques personalizados. Esta categorización facilita la implementación de campañas de marketing especializadas, la creación de programas especiales que atienden a clientes de alto valor y la entrega de un servicio al cliente personalizado. Al comprender estos aspectos clave de la participación del cliente, las empresas pueden mejorar sus estrategias para satisfacer mejor las necesidades y preferencias individuales de los clientes.
¿Qué información se necesita para realizar un análisis RFM?
Para un análisis RFM, toda la información necesaria es una tabla de pedidos que debe contener, al menos:
- Identificación del cliente
- Cantidad gastada por el cliente
- Última fecha de compra/uso del servicio
- Recuento de pedidos de cada cliente
Ejemplo:
En nuestro conjunto de datos de muestra tenemos 25 columnas, pero solo necesitamos 4 de ellas:
SELECT TOP(5)
CUSTOMERNAME as Customer,
ORDERNUMBER as Order_id,
SALES AS Amount,
ORDERDATE AS Date
FROM Project.dbo.sales_data_sample
Podemos utilizar funciones básicas de agregación SQL, un operador de fecha y agrupar nuestros resultados por el Cliente para crear gradualmente CTE’S que nos llevarán a nuestro resultado final.
Primer CTE:
WITH rfm AS (
SELECT
CUSTOMERNAME,
SUM(Sales) AS MonetaryValue,
COUNT(ORDERNUMBER) AS Frequency,
MAX(ORDERDATE) AS Last_order_date,
DATEDIFF(DD,MAX(ORDERDATE),(SELECT MAX(ORDERDATE) FROM Project.dbo.sales_data_sample)) AS Recency
FROM
Project.dbo.sales_data_sample
GROUP BY
CUSTOMERNAME
)
Podemos asignar números a nuestros clientes en función de las métricas que creamos (monetarias, frecuencias y antigüedades) para clasificarlos en función de cómo se comparan con los demás clientes. SQL Server tiene una función de partición llamada NTile que permite agrupar a los usuarios por asociación y luego un número dependiendo de un orden en particular.
En este caso, quiero dividir a mis usuarios en 4 grupos por cada métrica, cada uno representando su valor del 1 al 4.
Los usuarios que pertenezcan al 25% superior de los números pedidos recibirán un número (4) como marcador, mientras que los usuarios del 25% inferior recibirán un (1)
RFM_Calc as (
select r.*,
NTILE(4) OVER (ORDER BY Recency DESC) rfm_Recency,
NTILE(4) OVER (ORDER BY Frequency) rfm_Frequency,
NTILE(4) OVER (ORDER BY MonetaryValue) rfm_Monetary
FROM
rfm r
)
A partir de aquí, ya podemos clasificar a los usuarios en función de diferentes métricas y agruparlos según nuestros esfuerzos de marketing o servicio al cliente, pero podemos ir aún más lejos agregando su puntuación en un valor total (de 1 a 12) o marcando luego agregando sus puntuaciones en un formato de texto ( 111 — usuario de muy bajo valor, 411- cliente reciente con bajo número de pedidos y bajo gasto)
Creación de la RFM_Total (entero 1-12) y RFM_String (Texto, marcador) para su posterior clasificación:
SELECT c.*,
rfm_Recency + rfm_Monetary + rfm_frequency as RFM_Total,
CAST(rfm_Recency as varchar) + CAST(rfm_Frequency as varchar) + CAST(rfm_Monetary as varchar) AS RFM_String
INTO
#RFM
from RFM_Calc c
Como tenemos ambos marcadores (Puntuación y texto) para la clasificación de esos clientes, podemos usar expresiones CASE WHEN para categorizar a los usuarios:
DROP TABLE IF EXISTS Customer_RFM;
SELECT
CUSTOMERNAME, rfm_Frequency, rfm_Monetary, rfm_Recency,
CASE
WHEN RFM_String in (111, 112, 121, 122, 132, 211, 212, 114, 141) THEN ‘lost customers’ — lost customers
WHEN RFM_String in (133, 134, 143, 244, 334, 343, 344, 144) THEN ‘slipping away high value’ — big spenders who had not ordered recently
WHEN RFM_String in (311, 411, 331) THEN ‘new customers’
WHEN RFM_String in (222, 223, 233, 322) THEN ‘potential churners’
WHEN RFM_String in (323, 333, 321, 422, 332, 432) THEN ‘active’ — Customers who buy often and recently, but at low price points
WHEN RFM_String in (433, 434, 443, 444) THEN ‘loyal’
END rfm_segment
INTO
Project.dbo.Customer_RFM
FROM #RFM
Bien, ya hemos hecho todo eso, ¿qué sigue?
Transforme su información según sea necesario y preséntela a las partes interesadas en función de las preguntas comerciales que esté tratando de resolver.
Ejemplo de información que puedes extraer de esto: