[PowerBi] COHORT Análisis

En anteriores posts vimos diferentes cálculos en DAX como por ejemplo conocer cuántos clientes habían efectuado su última compra hace 90 días, este cálculo permitía llegar a cierta segmentación de clientes leales, nuevos, inactivos y aquellos que se volvían a reactivar luego de un periodo de tiempo.

Estos análisis ayudan a detectar patrones en el comportamiento de los consumidores y así entender cómo se comporta nuestro producto, marca, servicio en el mercado.

Una de las variables dentro de la segmentación de consumidores son los nuevos clientes adquiridos, ahora bien, ¿cuántos de esos nuevos clientes son retenidos?, ¿vuelven a efectuar una compra? En caso de realizarla, ¿cuánto tiempo demoran en concretarla?

Todos estos interrogantes pueden ser visualizados y analizados mediante COHORT ANÁLISIS (Cohort Analysis).

En este post explicaremos cómo llevarlo a cabo en Power Bi.

Análisis General

El análisis permite estudiar los nuevos clientes (medida de análisis) agrupados por:

  • Unidad de tiempo: mensual y semanal
  • Unidad de medida: cantidad y porcentaje                                  
image
image

Para una mayor comprensión por parte del usuario se puede incluir una descripción de qué significan los meses y valores dentro de la matriz. En este caso, dentro del reporte se agregan, mediante bookmarks y formas, la presente explicación.

image

Como se observa, en el mes de enero (01/01/2007), del total de clientes nuevos (182) sólo 7 han vuelto a comprar en febrero.

Se estudia la cantidad de clientes que han adquirido nuestro producto/servicio por primera vez y luego vuelven a adquirirlo en los posteriores meses/semanas.

Modelo

image

El modelo cuenta con 2 tablas auxiliares "Mes Auxiliar" y "Semana Auxiliar" que no están relacionadas a las tablas Fecha (Dimensión) y Ventas (Hecho), esto se debe a que posteriormente, necesitaremos aplicar y controlar estas columnas dentro de las medidas correspondientes.

Tabla Auxiliar en Power Query para el análisis de meses:

let
   Source = List.Numbers(0, 12),
   #"Converted to Table" = Table.RenameColumns(Table.TransformColumnTypes(Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),{{"Column1", Int64.Type}}),{{"Column1", "valor"}}),
   #"Added Custom" = Table.AddColumn(#"Converted to Table", "Mes", each "Mes " & Number.ToText([valor]),type text)
in
   #"Added Custom"

Tabla Auxiliar en Power Query para el análisis de semanas:

let
   Source = List.Numbers(0, 53),
   #"Converted to Table" = Table.RenameColumns(Table.TransformColumnTypes(Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),{{"Column1", Int64.Type}}),{{"Column1", "valor"}}),
   #"Added Custom" = Table.AddColumn(#"Converted to Table", "Semana", each "Semana " & Number.ToText([valor]), type text)
in
   #"Added Custom"

Luego de cerrar y aplicar las tablas es importante recordar ordenar las columnas de "Mes" y "Semana" de manera ascendente para que se visualicen correctamente en el reporte.

image

Medidas y Filtros

La solución requiere de medidas mensuales y semanales.

Partiremos calculando la cantidad de clientes que fueron retenidos, es decir que luego de su primer mes/semana de compra volvieron a comprar en los periodos posteriores.

Retención de Clientes Mensual =
VAR __MesInicial =
   SELECTEDVALUE ( Fecha[MesAño] ) //Número de mes y año de la tabla dimensión Fecha
VAR __AuxMes =
   SELECTEDVALUE ( 'Mes Auxiliar'[valor] ) //Número de mes de la tabla auxiliar mensual
VAR __ClientesActuales =
   VALUES ( 'Fact Ventas'[CustomerKey] ) //Tabla con valores únicos para cada clave principal de cliente
VAR __ClientesPasados =
   CALCULATETABLE (
       VALUES ( 'Fact Ventas'[CustomerKey] ),
       ALL ( Fecha ),
       Fecha[MesAño] < __MesInicial
   ) //Tabla con valores únicos para cada clave principal de clientes con fecha de compra anterior a la actual
VAR __NuevosClientes =
   EXCEPT ( __ClientesActuales, __ClientesPasados ) //Tabla que contiene clientes actuales que no están en la tabla de clientes pasados
VAR __ClientesPosteriores =
   CALCULATETABLE (
       VALUES ( 'Fact Ventas'[CustomerKey] ),
       ALL ( Fecha ),
       Fecha[MesAño] = __MesInicial + __AuxMes
   ) //Tabla que contiene clientes con fecha de compra posterior a la actual
VAR __ClientesRetenidos =
   INTERSECT ( __NuevosClientes, __ClientesPosteriores ) //Tabla con aquellos nuevos clientes que también están en la tabla de clientes con fecha de compra posterior a la actual
RETURN
   COUNTROWS ( __ClientesRetenidos ) //Total de clientes retenidos

Ahora veamos la medida semanal

Retención de Clientes Semanal =
VAR __SemanaInicial =
   SELECTEDVALUE ( Fecha[Año Semana] ) //Número de semana en el año de la tabla dimensión Fecha
VAR __AuxSemana =
   SELECTEDVALUE ( 'Semana Auxiliar'[valor] ) //Número de semana de la tabla auxiliar semanal
VAR __ClientesActuales =
   VALUES ( 'Fact Ventas'[CustomerKey] ) //Tabla con valores únicos para cada clave principal de cliente
VAR __ClientesPasados =
   CALCULATETABLE (
       VALUES ( 'Fact Ventas'[CustomerKey] ),
       ALL ( Fecha ),
       Fecha[Año Semana]  < __SemanaInicial
   ) //Tabla con valores únicos para cada clave principal de clientes con fecha de compra anterior a la semana actual
VAR __NuevosClientes =
   EXCEPT ( __ClientesActuales, __ClientesPasados ) //Tabla que contiene clientes actuales que no están en la tabla de clientes pasados
VAR __ClientesPosteriores =
   CALCULATETABLE (
       VALUES ( 'Fact Ventas'[CustomerKey] ),
       ALL ( Fecha ),
       Fecha[Año Semana]  = __SemanaInicial + __AuxSemana
   ) //Tabla que contiene clientes con fecha de compra posterior a la actual
VAR __ClientesRetenidos =
   INTERSECT ( __NuevosClientes, __ClientesPosteriores )
  //Tabla con aquellos nuevos clientes que también están en la tabla de clientes con fecha de compra posterior a la actual
RETURN
   COUNTROWS ( __ClientesRetenidos ) //Total de clientes retenidos

Así como obtuvimos la cantidad, es importante también, conocer los valores en porcentaje, en relación con los nuevos clientes del primer periodo analizado.

Retención de Clientes Mensual % =
DIVIDE (
   [Retención de Clientes Mensual],
   CALCULATE (
       [Retención de Clientes Mensual],
       ALL ( 'Mes Auxiliar' ),
       'Mes Auxiliar'[valor] = 0
   )
)
//Porcentaje de nuevos clientes que vuelven a comprar en los meses posteriores a su primera compra

Retención de Clientes Semanal % =
DIVIDE (
   [Retención de Clientes Semanal],
   CALCULATE (
       [Retención de Clientes Semanal],
       ALL ( 'Semana Auxiliar' ),
       'Semana Auxiliar'[valor] = 0
   )
)
//Porcentaje de nuevos clientes que vuelven a comprar en las semanas posteriores a su primera compra

A la hora de presentar los resultados, en cuanto a la unidad de medida, se crea una tabla auxiliar "Auxiliar Unidad" con las siguientes opciones de selección para incorporar la columna de "Unidad" a la visualización de Slicer.

image

Tabla Auxiliar de Unidad de Medida en Power Query:

 let
   Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45Wck7MK8lMSUxR0lEyVIrViVYKyC9KTs0rScxKBQoZKcXGAgA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Unidad = _t, #"Index Unidad" = _t]),
   #"Changed Type" = Table.TransformColumnTypes(Source,{{"Unidad", type text}, {"Index Unidad", Int64.Type}})
in
   #"Changed Type"

Mediante nuestras medidas se asignan los valores que calculamos con anterioridad a cada unidad de medida con sus distintos formatos:

Retención de Clientes Mensual - Unidad =
VAR _Unidad =
   SELECTEDVALUE ( 'Auxiliar Unidad'[Index Unidad] )
RETURN
   IF (
       _Unidad = 1,
       [Retención de Clientes Mensual],
       IF ( _Unidad = 2, FORMAT ( [Retención de Clientes Mensual %], "0.00%") )
   )

Retención de Clientes Semanal - Unidad =
VAR _Unidad =
   SELECTEDVALUE ( 'Auxiliar Unidad'[Index Unidad] )
RETURN
   IF (
       _Unidad = 1,
       [Retención de Clientes Semanal],
       IF ( _Unidad = 2, FORMAT ( [Retención de Clientes Semanal %], "0.00%") )
   )

Debido a que cada matriz requiere distintas filas y columnas según la opción de visualización, sea mensual o semanal, se opta por el uso de bookmarks para hacer dinámico el periodo de tiempo.

image

Visualización de Matriz:

Filas: Mes en formato de fecha / Semana en formato de fecha

Columnas: Columna de Mes en tabla "Mes Auxiliar" / Columna de Semana en tabla "Semana Auxiliar"

Valores:  Retención de Clientes Mensual – Unidad / Retención de Clientes Semanal – Unidad

¡Es así como llegamos a completar el análisis!

En GitHub se encuentra el archivo Power Bi Desktop a modo de ejemplo.

Espero les sea de utilidad para poder implementarlo, obtener información y llevar a cabo diferentes acciones.

Escrito por Nazarena Tossolini