Escolar Documentos
Profissional Documentos
Cultura Documentos
0.1 Contexto
Suponhamos que temos um conjunto de dados de uma empresa de e-commerce com registros de
compras com os seguintes atributos: descrição do produto, quantidade comprada, data da compra,
o valor unitário do produto, o id do cliente e o país do cliente. O chefe dessa empresa gostaria de
conhecer os seus clientes para criar estratégias e campanhas de fidelização.
Uma das formas simples para isso é utilizando o RFM.
-> O RFM análise a Recência, Frequência de compra e a Monetaridade de cada cliente, possibili-
tando mapear e classificar os clientes.
-> Recência: é há quantos dias foi a última compra do cliente.
-> Frequência: quantidade de compra que o cliente fez na sua empresa.
-> Monetaridade: é o quanto o cliente gasto na empresa.
Forma de calcular:
1. Ordene os clientes por Recência (menor para o maior)
2. Divide a base de clientes em 5 partes iguais, dando notas de 1 a 5.
3. Ordene por Frequência. (maior para o menor)
4. Divide a base de clientes em 5 partes iguais, dando notas de 1 a 5.
5. Ordene por Monetaridade.(maior para o menor)
6. Divide a base de clientes em 5 partes iguais, dando notas de 1 a 5.
Exemplo: Recência menor pontuação maior, Frequencia de compra maior nota maior e Monetariade
maior nota alta.
Fique assim:
cliente R F M
01 1 2 4
05 2 5 5
08 5 5 5
1
0.2 Importando bibliotecas
[1]: import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings("ignore")
[3]: df_raw.head()
Quantidade de linhas:541909
Quantidade de colunas:8
[5]: InvoiceNo 0
StockCode 0
Description 1454
Quantity 0
InvoiceDate 0
2
UnitPrice 0
CustomerID 135080
Country 0
dtype: int64
[7]: df1.isna().sum()
[7]: InvoiceNo 0
StockCode 0
Description 0
Quantity 0
InvoiceDate 0
UnitPrice 0
CustomerID 0
Country 0
dtype: int64
[10]: # duplicates
print(f'Total de linhas duplicadas: {df1[df1.duplicated].shape[0]}')
[13]: df1.columns
3
[14]: df1['CustomerID'] = df1['CustomerID'].astype(int)
# data referencia
df_ref = df1.drop(['InvoiceNo', 'StockCode', 'Description', 'Quantity',␣
↪'InvoiceDate',
aux1 = df1[['CustomerID','Monetary']].groupby('CustomerID').sum().reset_index()
# merge
[17]: # frequency
aux2 = df1[['CustomerID', 'InvoiceNo']].groupby('CustomerID').count().
↪reset_index()
# merge
df_ref = pd.merge(df_ref, aux2, on='CustomerID', how='left')
[18]: # recency
df1['InvoiceDate'] = pd.to_datetime(df1['InvoiceDate'], format='%m/%d/%Y %H:%M')
# merge
df_ref = pd.merge(df_ref, aux3, on='CustomerID', how='left')
[19]: df_ref.head()
4
[19]: CustomerID Monetary Frequency Recency
0 17850 5303.48 309 301
1 13047 3079.10 196 31
2 12583 7187.34 251 2
3 13748 948.25 28 95
4 15100 635.10 6 329
[21]: # Monetary
# labels
niveis_m = range(1,6)
# quintis
df_rfm['M'] = pd.qcut(df_rfm['Monetary'], q=5, labels=niveis_m)
df_rfm['M'] = df_rfm['M'].astype(int)
[22]: # Frequency
# labels
niveis_m = range(1,6)
# quintis
df_rfm['F'] = pd.qcut(df_rfm['Frequency'], q=5, labels=niveis_m)
df_rfm['F'] = df_rfm['F'].astype(int)
[23]: # Recency
# labels
niveis_m = range(5,0,-1)
# quintis
df_rfm['R'] = pd.qcut(df_rfm['Recency'], q=5, labels=niveis_m)
df_rfm['R'] = df_rfm['R'].astype(int)
[24]: df_rfm.head()
5
0.5.1 RFM - Score
[25]: df_rfm['RFMscore'] = round( ( (df_rfm[ ['F','M', 'R'] ].sum(axis=1) ) / 3 ), 1 )
df_rfm.sort_values(by='RFMscore', ascending=False).head()
É através do RFM score que podemos listar os melhor clientes da empresa em primeiro da lista.
rfm_pivot = rfm_pivot.loc[[5,4,3,2,1],[1,2,3,4,5]]
[30]: rfm_pivot
[30]: R 1 2 3 4 5
FM_mean
5 8 33 88 169 319
4 77 233 273 349 325
3 74 156 129 122 82
2 432 317 275 198 114
1 284 121 92 66 36
6
[31]: #Visualizando em um mapa de calor
plt.figure(figsize=(12,6))
# heatmap
plot = sns.heatmap(rfm_pivot, annot=True, fmt='d', linewidths=10,
cmap='crest', annot_kws={"fontsize":10})
plot.set_xlabel('Recência', fontsize=12)
plot.set_ylabel('Média de Frequência e Valor Monetário', fontsize=12)
plt.show();
Através do heatmap é possível visualizar a distribuição dos clientes de acordo com a Recência e a
média de frequencia e monetaridade.
Classificando os clientes
[32]: def classificar(df):
if (4 <= df['FM_mean'] <= 5) and (4 <= df['R'] <= 5):
return 'Champions'
elif (3 <= df['FM_mean'] <= 5) and (2 <= df['R'] <= 5):
return 'Loyal Customers'
elif (1 <= df['FM_mean'] <= 3) and (3 <= df['R'] <= 5):
return 'Potential Loyalist'
elif (0 <= df['FM_mean'] <= 1) and (3 <= df['R'] <= 4):
return 'New Customers'
7
elif (0 <= df['FM_mean'] <= 1) and (3 <= df['R'] <= 4):
return 'Promising'
elif (2 <= df['FM_mean'] <= 3) and (2 <= df['R'] <= 3):
return 'Customers Needing Attention'
elif (0 <= df['FM_mean'] <= 2) and (2 <= df['R'] <= 3):
return 'About to Sleep'
elif (2 <= df['FM_mean'] <= 5) and (0 <= df['R'] <= 2):
return 'At Risk'
elif (4 <= df['FM_mean'] <= 5) and (0 <= df['R'] <= 1):
return 'Can´t Lose Them'
elif (1 <= df['FM_mean'] <= 2) and (1 <= df['R'] <= 2):
return 'Hibernating'
elif (0 <= df['FM_mean'] <= 2) and (0 <= df['R'] <= 2):
return 'Lost'
Classe
0 At Risk
1 Champions
2 Champions
3 Loyal Customers
4 At Risk
␣
↪ ascending=False)
plt.figure(figsize=(12,6))
8
Através dessa classificação dos meus clintes é possivel responder as seguintes perguntas:
-> Quam são os melhores clientes?
-> Quais clientes são próximos de churn?
-> Quais os potenciais clientes para entrar no programa de Fidelização?
-> Quais clientes são mais provaveis de responder as campanhas de marketing?
Referências:
Comunidade DS
Artigo no Medium - O que é RFM e como aplicá-lo ao seu time de Customer Success
https://medium.com/maxmilhas-tech/o-que-%C3%A9-rfm-e-como-aplic%C3%A1-lo-ao-seu-time-de-custome
Artigo no Notify - What is RFM Analysis?
https://www.notifyvisitors.com/blog/rfm-analysis/