<jupyter_start><jupyter_text>Segmentation RFM Introduction    __Buts de la mission:__    Fournir aux équipes d'OLIST, entreprise du e-commerce, une __segmentation des clients__ afin qu'elles puissent l'utiliser dans leurs campagnes de communication :    - Comprendre les différents types d'utilisateurs (comportements, données personnelles)- Fournir une description actionable de la segmentation- Proposer un contrat de maintenance Sommaire_____1.__ __Chargement__ de la table RFM_____2.__ __Création de la table de segmentation RFM__    __2_1.__ __Détermination__ des quantiles_____2_2.__ __Création__ de la table de segmentation RFM___ __3.__ __Visualisation__ de la segmentation_____3_1.__ __Diagramme__ en barres_____3_2.__ __Squarify plot_____     __4.__ __Stabilité__ de la clientèle sur 6 mois_____4_1.__ __Création__ des segments clients sur 6 mois_____4_2.__ __Visualisation__ Sankey diagram_____4_2_1__ __Stabilité sur 1 mois juillet à août 18__ Sankey diagram _____4_2_2__ __Stabilité sur 3 mois mai à août 18__ Sankey diagram_____4_2_3__ __Stabilité sur 6 mois mars à août 18__ Sankey diagram   _____4_2_4__ __Stabilité par morceaux PARTIE 1 : mars à mai 18__ Sankey diagram _____4_2_5__ __Stabilité par morceaux PARTIE 2 : mai à juillet 18__ Sankey diagram    _____4_2_6__ __Stabilité par morceaux VUE D'ENSEMBLE : mars/ mai/ juillet/ août 18__ Sankey diagram _____4_2_6__ __Stabilité des VIP, VUE D'ENSEMBLE : mars/ mai/ juillet/ août 18__ Sankey diagram___    __5.__ __Contrat de maintenance :__ cas des nouveaux clients, action à envisager avant MAJ___            1. Chargement de la table RFM  Score RFM- __Récence__ : Nombre de jours depuis le dernier achat du client- __Fréquence__ : Nombre de commandes réalisées par le client- __Montant__ : Nombre d'argent dépensé par transaction<jupyter_code># chargement de la table RFM
df_rfm = pd.read_csv('data_RFM_olist.csv')
df_rfm.head()
df_rfm.shape
client_1 = df_rfm[df_rfm['customer_unique_id']=='000fbf0473c10fc1ab6f8d2d286ce20c']
client_1<jupyter_output><empty_output><jupyter_text>2. Création de la table de segmentation RFM __Répartition des clients en 4 segments__ (choisis au hasard)Récence/Fréquence/Valeur monétaire : Niveau 4 > Niveau 3> Niveau 2 > Niveau 1- Plus le niveau de récence est bas, plus le niveau de récence est élevé- Plus le nombre de commandes est élevé, plus le niveau de fréquence est élevé- Plus la valeur monétaire est élevée, plus le niveau de la valeur monétaire est élevé   2.1 Détermination des quantiles<jupyter_code>quantiles = df_rfm.quantile(q=[0.25,0.5,0.75])
quantiles.head()
quantiles = quantiles.to_dict() # Transformation en dictionnaire, plus facile à utiliser<jupyter_output><empty_output><jupyter_text>2.2 Création de la table de segmentation RFM<jupyter_code>df_rfm_segmentation = df_rfm.copy()<jupyter_output><empty_output><jupyter_text>__Segmentation__<jupyter_code># Arguments (x = value, p = recency, monetary_value, frequency, d = quartiles dict)
# 1 ceux qui ont commandé récemment, 4 ceux qui n'ont pas commandé depuis longtemps
def RScore(x,p,d):
    if x <= d[p][0.25]:
        return 1
    elif x <= d[p][0.50]:
        return 2
    elif x <= d[p][0.75]: 
        return 3
    else:
        return 4 # > 0.75
    
# Arguments (x = value, p = recency, monetary_value, frequency, d = quartiles dict)
#1 ceux qui dépensent le plus, 4 ceux qui dépensent le moins
def FMScore(x,p,d):
    if x <= d[p][0.25]:
        return 4
    elif x <= d[p][0.50]:
        return 3
    elif x <= d[p][0.75]: 
        return 2
    else:
        return 1
df_rfm_segmentation['R_Quartile'] = df_rfm_segmentation['récence'].apply(RScore, args=('récence',quantiles))
df_rfm_segmentation['F_Quartile'] = df_rfm_segmentation['fréquence'].apply(FMScore, args=('fréquence', quantiles))
df_rfm_segmentation['M_Quartile'] = df_rfm_segmentation['valeur_monétaire'].apply(FMScore, args=('valeur_monétaire',quantiles))<jupyter_output><empty_output><jupyter_text>Score RFM Maintenant que nous avons le score de chaque client, nous pouvons représenter notre segmentation de la clientèle. Tout d'abord, nous devons __combiner les scores (R_Quartile, F_Quartile,M_Quartile).__<jupyter_code>df_rfm_segmentation['RFMScore'] = df_rfm_segmentation.R_Quartile.map(str) \
                            + df_rfm_segmentation.F_Quartile.map(str) \
                            + df_rfm_segmentation.M_Quartile.map(str)
df_rfm_segmentation.head(10)
df_rfm_segmentation.to_csv('df_rfm_segmentation_olist.csv')<jupyter_output><empty_output><jupyter_text>- __Meilleure score de récence__ = 1 : ceux dont le dernier achat est parmi les plus récents. - __Meilleur score de fréquence__ = 1 : ceux dont les achats sont les plus fréquents. - __Meilleur score de valeur_monétaire__ = 1 : ceux qui dépensent le plus.  Segmentation clientèle en fonction du score :- Meilleurs clients VIP : __RFMSCore : 111__- Clients fidèles : __F_Quartile = 1__- Clients dépensiers : __M_quartile = 1__- VIP presque perdus : __RFMScore : 311__- VIP clients perdus : __RFMScore 411__- Clients non intéressés perdus : __RFMScore : 444__<jupyter_code>#https://www.blastanalytics.com/blog/rfm-analysis-boosts-sales
print("Meilleurs clients: ",len(df_rfm_segmentation[df_rfm_segmentation['RFMScore']=='111']))
print('Clients fidèles: ',len(df_rfm_segmentation[df_rfm_segmentation['F_Quartile']==1]))
print("Gros dépensiers: ",len(df_rfm_segmentation[df_rfm_segmentation['M_Quartile']==1]))
print('Meilleurs clients presque perdus: ', len(df_rfm_segmentation[df_rfm_segmentation['RFMScore']=='311']))
print('Meilleurs clients perdus: ',len(df_rfm_segmentation[df_rfm_segmentation['RFMScore']=='411']))
print('Clients non intéressés perdus : ',len(df_rfm_segmentation[df_rfm_segmentation['RFMScore']=='444']))
#10 meilleurs clients
df_rfm_segmentation[df_rfm_segmentation['RFMScore']=='111'].sort_values('valeur_monétaire', ascending=False).head(10);<jupyter_output><empty_output><jupyter_text>Ajout d'une colonne indicatrice "Segment" pour la visualisation:- Meilleurs clients VIP- Clients presque perdus- Clients perdus- Clients non intéressés perdus- clients fidèles- Clients dépensiers- Autres clients<jupyter_code>#Ajout de segments clients 
df_rfm_segmentation['segment'] = ""
mask1 = df_rfm_segmentation['RFMScore'] == '111'# vip
mask2 = df_rfm_segmentation['RFMScore'] == '311'#clients vip presque perdus
mask3 = df_rfm_segmentation['RFMScore'] == '411'# clients vip perdus
mask4 = df_rfm_segmentation['RFMScore'] == '444'# clients non intéressés perdus
mask5 = df_rfm_segmentation['RFMScore'] == '144'# nouveaux clients
# Autres clients
mask6 = (df_rfm_segmentation['RFMScore'] != '444') & (df_rfm_segmentation['RFMScore'] != '411') & (df_rfm_segmentation['RFMScore'] != '311') & (df_rfm_segmentation['RFMScore'] != '111') & (df_rfm_segmentation['RFMScore'] != '144')
# Clients fidèles dans autres clients
mask7 = (df_rfm_segmentation['F_Quartile'] == 1) & (df_rfm_segmentation['RFMScore'] != '444') & (df_rfm_segmentation['RFMScore'] != '411') & (df_rfm_segmentation['RFMScore'] != '311') & (df_rfm_segmentation['RFMScore'] != '111') & (df_rfm_segmentation['RFMScore'] != '144')
# Clients dépensiers dans autres clients
mask8 = (df_rfm_segmentation['M_Quartile'] == 1) & (df_rfm_segmentation['RFMScore'] != '444') & (df_rfm_segmentation['RFMScore'] != '411') & (df_rfm_segmentation['RFMScore'] != '311') & (df_rfm_segmentation['RFMScore'] != '111') & (df_rfm_segmentation['RFMScore'] != '144')

df_rfm_segmentation.loc[mask1, 'segment'] = 'Meilleurs clients VIP'
df_rfm_segmentation.loc[mask2, 'segment'] = 'Clients VIP presque perdus'
df_rfm_segmentation.loc[mask3, 'segment'] = 'Clients VIP perdus'
df_rfm_segmentation.loc[mask4, 'segment'] = 'Clients non intéressés perdus'
df_rfm_segmentation.loc[mask5, 'segment'] = 'Nouveaux clients'
df_rfm_segmentation.loc[mask6, 'segment'] = 'Autres clients'
df_rfm_segmentation.loc[mask7, 'segment'] = 'Clients fidèles'
df_rfm_segmentation.loc[mask8, 'segment'] = 'Clients dépensiers'
# create new dataframe with transformed values
df_rfm_segmentation_t = df_rfm_segmentation.copy()

ss = StandardScaler()
df_rfm_segmentation_t['récence'] = ss.fit_transform(df_rfm_segmentation['récence'].values.reshape(-1,1))
df_rfm_segmentation_t['fréquence'] = ss.fit_transform(df_rfm_segmentation['fréquence'].values.reshape(-1,1))
df_rfm_segmentation_t['valeur_monétaire'] = ss.fit_transform(df_rfm_segmentation['valeur_monétaire'].values.reshape(-1,1))
#### Pairplot avec 3 colonnes, selon segments clientèle
sns.pairplot(df_rfm_segmentation_t, vars = ['récence','fréquence','valeur_monétaire'], hue="segment")
df_rfm_segmentation[df_rfm_segmentation['segment'] == 'Clients non intéressés perdus'];
df_rfm_segmentation.to_csv('data_rfm_olist.csv')<jupyter_output><empty_output><jupyter_text>3. Visualisation de la segmentation   3.1 Visualisation : Diagramme en barres<jupyter_code>#Visualisation segmentation diagramme en barres
segmentation = df_rfm_segmentation.groupby('segment')['customer_unique_id'].nunique().sort_values(ascending = False).reset_index()
segmentation.drop([0], inplace = True) # Suppression ligne "Autres clients" 
# On ne garde que les clients identifiés dans les segments qui nous intéressent (VIP, perdus, presque perdus...)
plt.figure(figsize = (14,8))
sns.barplot(data = segmentation, x = 'segment', y = 'customer_unique_id', palette = 'viridis')<jupyter_output><empty_output><jupyter_text>3.2 Visualisation : Squarify plot<jupyter_code>#Visualisation : squarify plot
# Manually Entering Colors
colors = ["#248af1", "#eb5d50", "#8bc4f6", "#8c5c94", "#a170e8", "#fba521", "#75bc3f"]
# min and max value
mini = min(segmentation['customer_unique_id']) 
maxi = max(segmentation['customer_unique_id']) 
# Trouver des couleurs pour chaque segment
norm = matplotlib.colors.Normalize(vmin = mini, vmax = maxi)
# Plotting
fig = plt.gcf()
ax = fig.add_subplot()
fig.set_size_inches(14,10)
squarify.plot(sizes = segmentation['customer_unique_id'], label = segmentation.segment, alpha = 1, color = colors)
# Supprimer l'axe
plt.axis('off')
# Title
plt.title("Segmentation RFM Olist", fontsize=24, color="rebeccapurple")
# Title Positioning
ttl = ax.title
ttl.set_position([.5, 1.05])
plt.show()<jupyter_output><empty_output><jupyter_text>4. Stabilité de la clientèle sur 6 mois MARS à AOUT 2018<jupyter_code>df = pd.read_csv('data_clients_sankeys.csv')
df.head()<jupyter_output><empty_output><jupyter_text>4.1 Création des segments clients sur 6 mois  Segments clients 1 mois avant la fin de l'historique (30/07/18)<jupyter_code># Conversion de la colonne 'order_purchase_timestamp' au format datetime pour calculs ultérieurs
df['order_purchase_timestamp'] = pd.to_datetime(df['order_purchase_timestamp'], format='%Y-%m-%d %H:%M:%S')

# dataframe arrêté 1 mois avant la fin de l'historique
df_1 = df[df.order_purchase_timestamp <= '2018-07-30 15:00:37']

#Vérification min max historique
print('Min : {}, Max : {}'.format(min(df_1.order_purchase_timestamp), max(df_1.order_purchase_timestamp)))

#Date de référence fixée au lendemain de la dernière date enregistrée dans la table 
date_reference_1 = max(df_1.order_purchase_timestamp) + dt.timedelta(1)
print('date_reference_1 : {}'.format(date_reference_1))

#Table RFM 1 mois avant fin historique
df1_rfm = df_1.groupby('customer_unique_id').agg(
                                            {'order_purchase_timestamp' : lambda x: (date_reference_1 - x.max()).days, # Récence
                                             'order_id' : 'count', # Fréquence
                                             'payment_value' : 'sum'}   # Valeur monétaire
                                              )
df1_rfm.rename(columns={'order_purchase_timestamp': 'récence', 
                          'order_id': 'fréquence', 
                          'payment_value': 'valeur_monétaire'}, inplace=True)

#Détermination des quantiles
quantiles_1 = df1_rfm.quantile(q=[0.25,0.5,0.75])

df1_rfm['R_Quartile'] = df1_rfm['récence'].apply(RScore, args=('récence',quantiles_1))
df1_rfm['F_Quartile'] = df1_rfm['fréquence'].apply(FMScore, args=('fréquence', quantiles_1))
df1_rfm['M_Quartile'] = df1_rfm['valeur_monétaire'].apply(FMScore, args=('valeur_monétaire',quantiles_1))

#RFMScore
df1_rfm['RFMScore'] = df1_rfm.R_Quartile.map(str) + df1_rfm.F_Quartile.map(str) + df1_rfm.M_Quartile.map(str)

#Ajout de segments clients 
df1_rfm['segment1'] = ""
mask1 = df1_rfm['RFMScore'] == '111'# vip
mask2 = df1_rfm['RFMScore'] == '311'#clients vip presque perdus
mask3 = df1_rfm['RFMScore'] == '411'# clients vip perdus
mask4 = df1_rfm['RFMScore'] == '444'# clients non intéressés perdus
mask5 = df1_rfm['RFMScore'] == '144'# nouveaux clients
# Autres clients
mask6 = (df1_rfm['RFMScore'] != '444') & (df1_rfm['RFMScore'] != '411') & (df1_rfm['RFMScore'] != '311') & (df1_rfm['RFMScore'] != '111') & (df1_rfm['RFMScore'] != '144')
# Clients fidèles dans autres clients
mask7 = (df1_rfm['F_Quartile'] == 1) & (df1_rfm['RFMScore'] != '444') & (df1_rfm['RFMScore'] != '411') & (df1_rfm['RFMScore'] != '311') & (df1_rfm['RFMScore'] != '111') & (df1_rfm['RFMScore'] != '144')
# Clients dépensiers dans autres clients
mask8 = (df1_rfm['M_Quartile'] == 1) & (df1_rfm['RFMScore'] != '444') & (df1_rfm['RFMScore'] != '411') & (df1_rfm['RFMScore'] != '311') & (df1_rfm['RFMScore'] != '111') & (df1_rfm['RFMScore'] != '144')

df1_rfm.loc[mask1, 'segment1'] = 'Meilleurs clients VIP'
df1_rfm.loc[mask2, 'segment1'] = 'Clients VIP presque perdus'
df1_rfm.loc[mask3, 'segment1'] = 'Clients VIP perdus'
df1_rfm.loc[mask4, 'segment1'] = 'Clients non intéressés perdus'
df1_rfm.loc[mask5, 'segment1'] = 'Nouveaux clients'
df1_rfm.loc[mask6, 'segment1'] = 'Autres clients'
df1_rfm.loc[mask7, 'segment1'] = 'Clients fidèles'
df1_rfm.loc[mask8, 'segment1'] = 'Clients dépensiers'

df1_rfm.head();
#On garde les clients qui étaient dans la base de données en juillet
df1_rfm.reset_index(inplace = True)
df_rfm_segmentation = df_rfm_segmentation[df_rfm_segmentation.customer_unique_id.isin(df1_rfm.customer_unique_id)]
print(df_rfm_segmentation.shape)
print(df1_rfm.shape)

from sklearn import metrics
#Calcul ARI
ARI_rfm_1_mois = metrics.adjusted_rand_score(df_rfm_segmentation.RFMScore, df1_rfm.RFMScore)
print(ARI_rfm_1_mois)

#Ajout ARI dans le tableau de résultats
resultats_rfm = pd.DataFrame({})
resultats_rfm = resultats_rfm.append(pd.DataFrame({
    'Periode' : ['1 mois_Juillet_août'],
    'ARI' : [ARI_rfm_1_mois]}))
resultats_rfm<jupyter_output>(84644, 9)
(84644, 9)
0.734341624818032<jupyter_text>Segments clients 3 mois avant la fin de l'historique (30/05/18)<jupyter_code># Conversion de la colonne 'order_purchase_timestamp' au format datetime pour calculs ultérieurs
df['order_purchase_timestamp'] = pd.to_datetime(df['order_purchase_timestamp'], format='%Y-%m-%d %H:%M:%S')

# dataframe arrêté 3 mois avant la fin de l'historique
df_3 = df[df.order_purchase_timestamp <= '2018-05-30 15:00:37']

#Vérification min max historique
print('Min : {}, Max : {}'.format(min(df_3.order_purchase_timestamp), max(df_3.order_purchase_timestamp)))

#Date de référence fixée au lendemain de la dernière date enregistrée dans la table 
date_reference_3 = max(df_3.order_purchase_timestamp) + dt.timedelta(1)
print('date_reference_3 : {}'.format(date_reference_3))

#Table RFM 3 mois avant fin historique
df3_rfm = df_3.groupby('customer_unique_id').agg(
                                            {'order_purchase_timestamp' : lambda x: (date_reference_3 - x.max()).days, # Récence
                                             'order_id' : 'count', # Fréquence
                                             'payment_value' : 'sum'}   # Valeur monétaire
                                              )
df3_rfm.rename(columns={'order_purchase_timestamp': 'récence', 
                          'order_id': 'fréquence', 
                          'payment_value': 'valeur_monétaire'}, inplace=True)

#Détermination des quantiles
quantiles_3 = df3_rfm.quantile(q=[0.25,0.5,0.75])

df3_rfm['R_Quartile'] = df3_rfm['récence'].apply(RScore, args=('récence',quantiles_3))
df3_rfm['F_Quartile'] = df3_rfm['fréquence'].apply(FMScore, args=('fréquence', quantiles_3))
df3_rfm['M_Quartile'] = df3_rfm['valeur_monétaire'].apply(FMScore, args=('valeur_monétaire',quantiles_3))

# RFMScore
df3_rfm['RFMScore'] = df3_rfm.R_Quartile.map(str) + df3_rfm.F_Quartile.map(str) + df3_rfm.M_Quartile.map(str)

#Ajout de segments clients 
df3_rfm['segment3'] = ""
mask1 = df3_rfm['RFMScore'] == '111'# vip
mask2 = df3_rfm['RFMScore'] == '311'#clients vip presque perdus
mask3 = df3_rfm['RFMScore'] == '411'# clients vip perdus
mask4 = df3_rfm['RFMScore'] == '444'# clients non intéressés perdus
mask5 = df3_rfm['RFMScore'] == '144'# nouveaux clients
# Autres clients
mask6 = (df3_rfm['RFMScore'] != '444') & (df3_rfm['RFMScore'] != '411') & (df3_rfm['RFMScore'] != '311') & (df3_rfm['RFMScore'] != '111') & (df3_rfm['RFMScore'] != '144')
# Clients fidèles dans autres clients
mask7 = (df3_rfm['F_Quartile'] == 1) & (df3_rfm['RFMScore'] != '444') & (df3_rfm['RFMScore'] != '411') & (df3_rfm['RFMScore'] != '311') & (df3_rfm['RFMScore'] != '111') & (df3_rfm['RFMScore'] != '144')
# Clients dépensiers dans autres clients
mask8 = (df3_rfm['M_Quartile'] == 1) & (df3_rfm['RFMScore'] != '444') & (df3_rfm['RFMScore'] != '411') & (df3_rfm['RFMScore'] != '311') & (df3_rfm['RFMScore'] != '111') & (df3_rfm['RFMScore'] != '144')

df3_rfm.loc[mask1, 'segment3'] = 'Meilleurs clients VIP'
df3_rfm.loc[mask2, 'segment3'] = 'Clients VIP presque perdus'
df3_rfm.loc[mask3, 'segment3'] = 'Clients VIP perdus'
df3_rfm.loc[mask4, 'segment3'] = 'Clients non intéressés perdus'
df3_rfm.loc[mask5, 'segment3'] = 'Nouveaux clients'
df3_rfm.loc[mask6, 'segment3'] = 'Autres clients'
df3_rfm.loc[mask7, 'segment3'] = 'Clients fidèles'
df3_rfm.loc[mask8, 'segment3'] = 'Clients dépensiers'

df3_rfm.head();
#On garde les clients qui étaient dans la base de données en mai
df3_rfm.reset_index(inplace = True)
df_rfm_segmentation = df_rfm_segmentation[df_rfm_segmentation.customer_unique_id.isin(df3_rfm.customer_unique_id)]
print(df_rfm_segmentation.shape)
print(df3_rfm.shape)

#Calcul ARI
ARI_rfm_3_mois = metrics.adjusted_rand_score(df_rfm_segmentation.RFMScore, df3_rfm.RFMScore)
print(ARI_rfm_3_mois)

#Ajout ARI dans le tableau de résultats
resultats_rfm = resultats_rfm.append(pd.DataFrame({
    'Periode' : ['3 mois_Mai_août'],
    'ARI' : [ARI_rfm_3_mois]}))
resultats_rfm<jupyter_output>(73249, 9)
(73249, 9)
0.5638628949569655<jupyter_text>Segments clients 6 mois avant la fin de l'historique (01/03/18)<jupyter_code># Conversion de la colonne 'order_purchase_timestamp' au format datetime pour calculs ultérieurs
df['order_purchase_timestamp'] = pd.to_datetime(df['order_purchase_timestamp'], format='%Y-%m-%d %H:%M:%S')

# dataframe arrêté 6 mois avant la fin de l'historique
df_6 = df[df.order_purchase_timestamp <= '2018-02-28 15:00:37']

#Vérification min max historique
print('Min : {}, Max : {}'.format(min(df_6.order_purchase_timestamp), max(df_6.order_purchase_timestamp)))

#Date de référence fixée au lendemain de la dernière date enregistrée dans la table 
date_reference_6 = max(df_6.order_purchase_timestamp) + dt.timedelta(1)
print('date_reference_3 : {}'.format(date_reference_6))

#Table RFM 3 mois avant fin historique
df6_rfm = df_6.groupby('customer_unique_id').agg(
                                            {'order_purchase_timestamp' : lambda x: (date_reference_6 - x.max()).days, # Récence
                                             'order_id' : 'count', # Fréquence
                                             'payment_value' : 'sum'}   # Valeur monétaire
                                              )
df6_rfm.rename(columns={'order_purchase_timestamp': 'récence', 
                          'order_id': 'fréquence', 
                          'payment_value': 'valeur_monétaire'}, inplace=True)

#Détermination des quantiles
quantiles_6 = df6_rfm.quantile(q=[0.25,0.5,0.75])

df6_rfm['R_Quartile'] = df6_rfm['récence'].apply(RScore, args=('récence',quantiles_6))
df6_rfm['F_Quartile'] = df6_rfm['fréquence'].apply(FMScore, args=('fréquence', quantiles_6))
df6_rfm['M_Quartile'] = df6_rfm['valeur_monétaire'].apply(FMScore, args=('valeur_monétaire',quantiles_6))

# RFMScore
df6_rfm['RFMScore'] = df6_rfm.R_Quartile.map(str) + df6_rfm.F_Quartile.map(str) + df6_rfm.M_Quartile.map(str)

#Ajout de segments clients 
df6_rfm['segment6'] = ""
mask1 = df6_rfm['RFMScore'] == '111'# vip
mask2 = df6_rfm['RFMScore'] == '311'#clients vip presque perdus
mask3 = df6_rfm['RFMScore'] == '411'# clients vip perdus
mask4 = df6_rfm['RFMScore'] == '444'# clients non intéressés perdus
mask5 = df6_rfm['RFMScore'] == '144'# nouveaux clients
# Autres clients
mask6 = (df6_rfm['RFMScore'] != '444') & (df6_rfm['RFMScore'] != '411') & (df6_rfm['RFMScore'] != '311') & (df6_rfm['RFMScore'] != '111') & (df6_rfm['RFMScore'] != '144')
# Clients fidèles dans autres clients
mask7 = (df6_rfm['F_Quartile'] == 1) & (df6_rfm['RFMScore'] != '444') & (df6_rfm['RFMScore'] != '411') & (df6_rfm['RFMScore'] != '311') & (df6_rfm['RFMScore'] != '111') & (df6_rfm['RFMScore'] != '144')
# Clients dépensiers dans autres clients
mask8 = (df6_rfm['M_Quartile'] == 1) & (df6_rfm['RFMScore'] != '444') & (df6_rfm['RFMScore'] != '411') & (df6_rfm['RFMScore'] != '311') & (df6_rfm['RFMScore'] != '111') & (df6_rfm['RFMScore'] != '144')

df6_rfm.loc[mask1, 'segment6'] = 'Meilleurs clients VIP'
df6_rfm.loc[mask2, 'segment6'] = 'Clients VIP presque perdus'
df6_rfm.loc[mask3, 'segment6'] = 'Clients VIP perdus'
df6_rfm.loc[mask4, 'segment6'] = 'Clients non intéressés perdus'
df6_rfm.loc[mask5, 'segment6'] = 'Nouveaux clients'
df6_rfm.loc[mask6, 'segment6'] = 'Autres clients'
df6_rfm.loc[mask7, 'segment6'] = 'Clients fidèles'
df6_rfm.loc[mask8, 'segment6'] = 'Clients dépensiers'

df6_rfm.head();
#On garde les clients qui étaient dans la base de données en mars
df6_rfm.reset_index(inplace = True)
df_rfm_segmentation = df_rfm_segmentation[df_rfm_segmentation.customer_unique_id.isin(df6_rfm.customer_unique_id)]
print(df_rfm_segmentation.shape)
print(df6_rfm.shape)

#Calcul ARI
ARI_rfm_6_mois = metrics.adjusted_rand_score(df_rfm_segmentation.RFMScore, df6_rfm.RFMScore)
print(ARI_rfm_6_mois)

#Ajout ARI dans le tableau de résultats
resultats_rfm = resultats_rfm.append(pd.DataFrame({
    'Periode' : ['6 mois_Mars_août'],
    'ARI' : [ARI_rfm_6_mois]}))
resultats_rfm
# Table RFM à la fin de l'historique (30/07/18)
df_rfm = pd.read_csv('data_rfm_olist.csv')
df_rfm.drop('Unnamed: 0', axis = 1, inplace = True)
#Table RFM 6 mois, 3 mois, 1 mois, jusqu'à la fin de l'historique
df_sankey_1 = pd.merge(df_rfm, df1_rfm, on = 'customer_unique_id', how = 'left')
df_sankey_2 = pd.merge(df_sankey_1, df3_rfm, on = 'customer_unique_id', how = 'left')
df_sankey_3 = pd.merge(df_sankey_2, df6_rfm, on = 'customer_unique_id', how = 'left')
#Création table pour visualisation segments clients
colonnes = ['customer_unique_id','segment6', 'segment3', 'segment1', 'segment']
df_sankey = df_sankey_3[colonnes]
df_sankey.head()
# Créer la table pour tracer le Sankey diagram
#1 mois
df_sankey_1seg = df_sankey.groupby(by = ['segment1', 'segment']).agg({'segment' : 'count'})
df_sankey_1seg.rename(columns={'segment' : 'value_1'}, inplace=True)
df_sankey_1 = df_sankey_1seg.reset_index()
#3 mois
df_sankey_2seg = df_sankey.groupby(by = ['segment3', 'segment']).agg({'segment' : 'count'})
df_sankey_2seg.rename(columns={'segment' : 'value_2'}, inplace=True)
df_sankey_2 = df_sankey_2seg.reset_index()
#6 mois
df_sankey_3seg = df_sankey.groupby(by = ['segment6', 'segment']).agg({'segment' : 'count'})
df_sankey_3seg.rename(columns={'segment' : 'value_3'}, inplace=True)
df_sankey_3 = df_sankey_3seg.reset_index()<jupyter_output><empty_output><jupyter_text>4.2 Visualisation : Sankey Diagrams Le diagramme de Sankey est une forme d'organigramme dans lequel la largeur des flèches de débit est proportionnelle à la quantité de débit. C'est un outil visuel parfait pour visualiser la répartition entre un pot initial et des pots plus petits suivants.    4.2.1 Stabilité sur 1 mois : juillet 18 à août 18    __Vue d'ensemble de tous les segments clients__<jupyter_code>#Sankey vue d'ensemble
source = [0, 0, 0,        # Autres clients
          1, 1, 1,        # Clients VIP perdus  
          2, 2, 2, 2,     # Clients VIP presque perdus
          3, 3, 3, 3,     # Clients dépensiers 
          4, 4, 4, 4, 4,  # Clients fidèles 
          5, 5,           # Clients non intéressés perdus
          6, 6, 6,        # Meilleurs clients VIP    
          7, 7]           # Nouveaux clients

target = [ 32, 29, 28,
          22, 30 , 31,
          22, 23, 30, 31,
          23, 29, 30, 31,
          22, 23, 29, 30, 31,
          32, 28,
          29, 30, 31,
          32, 33]         

value = [48613, 1256, 358,
         1942, 316, 19,
         146, 2016, 316, 15,
         306, 13327, 333, 18, 
         46, 46, 52, 3124, 46, 
         157, 5182,
         486, 313, 1759,
         1214, 3886]

label = ['Autres clients',#0
         'Clients VIP perdus', #1
         'Clients VIP presque perdus',#2
         'Clients dépensiers',#3
         'Clients fidèles', #4
         'Clients non intéressés perdus',#5
         'Meilleurs clients VIP', #6
         'Nouveaux clients',#7
         
         'Autres clients',#32                  # Autres clients
         'Clients dépensiers',#29
         'Clients non intéressés perdus',#28
         
         'Clients VIP perdus', #22            # Clients VIP perdus
         'Clients fidèles',#30 
         'Meilleurs clients VIP',#31
         
         'Clients VIP perdus', #22            # Clients VIP presque perdus
         'Clients VIP presque perdus',#23
         'Clients fidèles',#30
         'Meilleurs clients VIP', #31
         
         'Clients VIP presque perdus',#23    # Clients dépensiers
         'Clients dépensiers',#29
         'Clients fidèles',#30
         'Meilleurs clients VIP',#31
         
         'Clients VIP perdus', #22            # Clients fidèles
         'Clients VIP presque perdus',#23 
         'Clients dépensiers',#29
         'Clients fidèles',#30
         'Meilleurs clients VIP',#31
         
         'Autres clients',#32                  # Clients non intéressés perdus
         'Clients non intéressés perdus',#28
                     
         'Clients dépensiers',#29             # Meilleurs clients VIP
         'Clients fidèles',#30
         'Meilleurs clients VIP',#31
         
         'Autres clients',#32
         'Nouveaux clients',#33               # Nouveaux clients
        ]

# Node data
color_node = ['#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', 
              '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96']
         
# link data
color_link = ['#A6E3D7', '#A6E3D7', '#A6E3D7', 
              '#EBBAB5', '#EBBAB5', '#EBBAB5', 
              '#FEF3C7', '#FEF3C7', '#FEF3C7', '#FEF3C7',
              '#CBB4D5', '#CBB4D5', '#CBB4D5', '#CBB4D5',
              '#FF90A1', '#FF90A1', '#FF90A1', '#FF90A1', '#FF90A1',
              '#8FF9FF', '#8FF9FF',
              '#FFE18F', '#FFE18F', '#FFE18F', 
              '#B6BAF5', '#B6BAF5']

# data to dict, dict to sankey
link = dict(source = source, target = target, value = value, color=color_link)
node = dict(label = label, pad=25, thickness=5, color=color_node)
data = go.Sankey(link = link, node=node, arrangement= 'freeform')

# plot
fig = go.Figure(data)
fig.update_layout(
    hovermode = 'x',
    title="Segmentation RFM clientèle OLIST --- JUILLET à AOUT 18 --- 1 mois",
    font=dict(size = 14, color = 'white'),
    paper_bgcolor='#5B5958',
)
fig.show()<jupyter_output><empty_output><jupyter_text>__Visualisation du groupe des meilleurs clients stabilité sur 1 mois__<jupyter_code>#Sankey meilleurs clients 1 mois
node_label = ['Meilleurs clients VIP', 'Meilleurs clients VIP ', 'Clients dépensiers','Clients fidèles']
node_dict = {y:x for x, y in enumerate(node_label)}
node_dict

source = ['Meilleurs clients VIP', 'Meilleurs clients VIP','Meilleurs clients VIP', 'Meilleurs clients VIP']
target = ['Meilleurs clients VIP ', 'Clients dépensiers','Clients fidèles'] 
values = [ 1759 , 486, 313]

source_node = [node_dict[x] for x in source]
target_node = [node_dict[x] for x in target]

# link data
color_link = ['#FF90A1','#A6E3D7', '#CBB4D5'] # rouge, vert, violet
# Node data
color_node = ['#D1D0C9','#D1D0C9', '#D1D0C9', '#D1D0C9'] # gris clair

fig = go.Figure(
    data=[go.Sankey(
        node = dict(
            label = node_label,
            color = color_node
        ),
        link = dict(
            source = source_node,
            target = target_node,
            value = values,
            color = color_link
        ))])
fig.update_layout(
    hovermode = 'x',
    title="Stabilité meilleurs clients OLIST sur 1 mois",
    font=dict(size = 14, color = 'white'),
    paper_bgcolor='#5B5958')

plot(fig,
     image_filename='sankey_plot_1', 
     image='png', 
     image_width=1000, 
     image_height=600    
)
fig.show()<jupyter_output><empty_output><jupyter_text>4.2.2 Stabilité sur 3 mois : mai 18 à août 18    __Vue d'ensemble de tous les segments clients__<jupyter_code>#Sankey vue d'ensemble
source = [0, 0, 0,        # Autres clients
          1, 1, 1,        # Clients VIP perdus  
          2, 2, 2, 2,     # Clients VIP presque perdus
          3, 3, 3, 3,     # Clients dépensiers 
          4, 4, 4, 4, 4,  # Clients fidèles 
          5, 5,           # Clients non intéressés perdus
          6, 6, 6,        # Meilleurs clients VIP    
          7, 7]           # Nouveaux clients

target = [ 32, 29, 28,
          22, 30 , 31,
          22, 23, 30, 31,
          23, 29, 30, 31,
          22, 23, 29, 30, 31,
          32, 28,
          29, 30, 31,
          32, 33]         

value = [41183, 1092, 1030,
         1655, 280, 45,
         433, 1452, 275, 52,
         870, 10826, 279, 57, 
         46, 46, 52, 2803, 53, 
         128, 4510,
         1320, 289, 617,
         3283, 1122]

label = ['Autres clients',#0
         'Clients VIP perdus', #1
         'Clients VIP presque perdus',#2
         'Clients dépensiers',#3
         'Clients fidèles', #4
         'Clients non intéressés perdus',#5
         'Meilleurs clients VIP', #6
         'Nouveaux clients',#7
         
         'Autres clients',#32                  # Autres clients
         'Clients dépensiers',#29
         'Clients non intéressés perdus',#28
         
         'Clients VIP perdus', #22            # Clients VIP perdus
         'Clients fidèles',#30 
         'Meilleurs clients VIP',#31
         
         'Clients VIP perdus', #22            # Clients VIP presque perdus
         'Clients VIP presque perdus',#23
         'Clients fidèles',#30
         'Meilleurs clients VIP', #31
         
         'Clients VIP presque perdus',#23    # Clients dépensiers
         'Clients dépensiers',#29
         'Clients fidèles',#30
         'Meilleurs clients VIP',#31
         
         'Clients VIP perdus', #22            # Clients fidèles
         'Clients VIP presque perdus',#23 
         'Clients dépensiers',#29
         'Clients fidèles',#30
         'Meilleurs clients VIP',#31
         
         'Autres clients',#32                  # Clients non intéressés perdus
         'Clients non intéressés perdus',#28
                     
         'Clients dépensiers',#29             # Meilleurs clients VIP
         'Clients fidèles',#30
         'Meilleurs clients VIP',#31
         
         'Autres clients',#32
         'Nouveaux clients',#33               # Nouveaux clients
        ]

# Node data
color_node = ['#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', 
              '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96']
         
# link data
color_link = ['#A6E3D7', '#A6E3D7', '#A6E3D7', 
              '#EBBAB5', '#EBBAB5', '#EBBAB5', 
              '#FEF3C7', '#FEF3C7', '#FEF3C7', '#FEF3C7',
              '#CBB4D5', '#CBB4D5', '#CBB4D5', '#CBB4D5',
              '#FF90A1', '#FF90A1', '#FF90A1', '#FF90A1', '#FF90A1',
              '#8FF9FF', '#8FF9FF',
              '#FFE18F', '#FFE18F', '#FFE18F', 
              '#B6BAF5', '#B6BAF5']

# data to dict, dict to sankey
link = dict(source = source, target = target, value = value, color=color_link)
node = dict(label = label, pad=25, thickness=5, color=color_node)
data = go.Sankey(link = link, node=node, arrangement= 'freeform')

# plot
fig = go.Figure(data)
fig.update_layout(
    hovermode = 'x',
    title="Segmentation RFM clientèle OLIST --- MAI à AOUT 18 --- 3 mois",
    font=dict(size = 14, color = 'white'),
    paper_bgcolor='#5B5958',
)
fig.show()<jupyter_output><empty_output><jupyter_text>__Visualisation du groupe des meilleurs clients stabilité sur 3 mois__<jupyter_code>#Sankey meilleurs clients 3 mois
node_label = ['Meilleurs clients VIP', 'Meilleurs clients VIP ', 'Clients dépensiers','Clients fidèles']
node_dict = {y:x for x, y in enumerate(node_label)}
node_dict

source = ['Meilleurs clients VIP', 'Meilleurs clients VIP','Meilleurs clients VIP']
target = ['Meilleurs clients VIP ', 'Clients dépensiers', 'Clients fidèles'] 
values = [ 617, 1320, 289]

source_node = [node_dict[x] for x in source]
target_node = [node_dict[x] for x in target]

# link data
color_link = ['#FF90A1','#A6E3D7', '#CBB4D5'] # rouge, vert, violet
# Node data
color_node = ['#D1D0C9','#D1D0C9', '#D1D0C9', '#D1D0C9'] # gris clair

fig = go.Figure(
    data=[go.Sankey(
        node = dict(
            label = node_label,
            color = color_node
        ),
        link = dict(
            source = source_node,
            target = target_node,
            value = values,
            color = color_link
        ))])
fig.update_layout(
    hovermode = 'x',
    title="Stabilité meilleurs clients OLIST sur 3 mois",
    font=dict(size = 14, color = 'white'),
    paper_bgcolor='#5B5958')

plot(fig,
     image_filename='sankey_plot_1', 
     image='png', 
     image_width=1000, 
     image_height=600    
)
fig.show()<jupyter_output><empty_output><jupyter_text>4.2.3 Stabilité sur 6 mois : mars 18 à août 18__Vue d'ensemble de tous les segments clients__<jupyter_code>#Sankey vue d'ensemble
source = [0, 0, 0,        # Autres clients
          1, 1, 1, 1,     # Clients VIP perdus  
          2, 2, 2, 2, 2,  # Clients VIP presque perdus
          3, 3, 3, 3,     # Clients dépensiers 
          4, 4, 4, 4, 4,  # Clients fidèles 
          5, 5,           # Clients non intéressés perdus
          6, 6, 6, 6,     # Meilleurs clients VIP    
          7]              # Nouveaux clients

target = [35, 32, 30,
          24, 32 , 33, 34,
          24, 31, 32, 33, 34,
          31, 32, 33, 34,
          24, 31, 32, 33, 34,
          35, 30,
          31, 32, 33, 34,
          35]         

value = [28331, 807, 2216,
         1172, 23, 204, 41,
         916, 389, 25, 227, 53,
         1396, 7165, 201, 45, 
         46, 48, 48, 2189, 36, 
         67, 3324,
         535, 886, 221, 60, 
         3563]

label = ['Autres clients',#0
         'Clients VIP perdus', #1
         'Clients VIP presque perdus',#2
         'Clients dépensiers',#3
         'Clients fidèles', #4
         'Clients non intéressés perdus',#5
         'Meilleurs clients VIP', #6
         'Nouveaux clients',#7
         
         'Autres clients',#35                 # Autres clients
         'Clients dépensiers',#32
         'Clients non intéressés perdus',#30
         
         'Clients VIP perdus', #24            # Clients VIP perdus
         'Clients dépensiers',#32
         'Clients fidèles',#33 
         'Meilleurs clients VIP',#34
         
         'Clients VIP perdus', #24            # Clients VIP presque perdus
         'Clients VIP presque perdus',#31
         'Clients dépensiers',#32
         'Clients fidèles',#33
         'Meilleurs clients VIP', #34
         
         'Clients VIP presque perdus',#31     # Clients dépensiers
         'Clients dépensiers',#32
         'Clients fidèles',#33
         'Meilleurs clients VIP',#34
         
         'Clients VIP perdus', #24            # Clients fidèles
         'Clients VIP presque perdus',#31 
         'Clients dépensiers',#32
         'Clients fidèles',#33
         'Meilleurs clients VIP',#34
         
         'Autres clients',#35                  # Clients non intéressés perdus
         'Clients non intéressés perdus',#30
                     
         'Clients VIP presque perdus',#31
         'Clients dépensiers',#32             # Meilleurs clients VIP
         'Clients fidèles',#33
         'Meilleurs clients VIP',#34
         
         'Autres clients',#35                # Nouveaux clients
        ]

# Node data
color_node = ['#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', 
              '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96']
         
# link data
color_link = ['#A6E3D7', '#A6E3D7', '#A6E3D7', 
              '#EBBAB5', '#EBBAB5', '#EBBAB5', '#EBBAB5', 
              '#FEF3C7', '#FEF3C7', '#FEF3C7', '#FEF3C7', '#FEF3C7',
              '#CBB4D5', '#CBB4D5', '#CBB4D5', '#CBB4D5',
              '#FF90A1', '#FF90A1', '#FF90A1', '#FF90A1', '#FF90A1',
              '#8FF9FF', '#8FF9FF',
              '#FFE18F', '#FFE18F', '#FFE18F', '#FFE18F',
              '#B6BAF5']

# data to dict, dict to sankey
link = dict(source = source, target = target, value = value, color=color_link)
node = dict(label = label, pad=25, thickness=5, color=color_node)
data = go.Sankey(link = link, node=node, arrangement= 'freeform')

# plot
fig = go.Figure(data)
fig.update_layout(
    hovermode = 'x',
    title="Segmentation RFM clientèle OLIST --- FEVRIER à AOUT 18 --- 6 mois",
    font=dict(size = 14, color = 'white'),
    paper_bgcolor='#5B5958',
)
fig.show()<jupyter_output><empty_output><jupyter_text>__Visualisation du segment des meilleurs clients : stabilité sur 6 mois__<jupyter_code>#Sankey meilleurs clients
node_label = ['Meilleurs clients VIP', 'Meilleurs clients VIP ', 'Clients VIP presque perdus','Clients dépensiers','Clients fidèles']
node_dict = {y:x for x, y in enumerate(node_label)}
node_dict

source = ['Meilleurs clients VIP', 'Meilleurs clients VIP','Meilleurs clients VIP', 'Meilleurs clients VIP']
target = ['Meilleurs clients VIP ', 'Clients VIP presque perdus','Clients dépensiers','Clients fidèles'] 
values = [ 60, 535, 886, 221]

source_node = [node_dict[x] for x in source]
target_node = [node_dict[x] for x in target]

# link data
color_link = ['#FF90A1','#A6E3D7', '#CBB4D5', '#FFEE8F'] # rouge, vert, violet, jaune
# Node data
color_node = ['#D1D0C9','#D1D0C9', '#D1D0C9', '#D1D0C9', '#D1D0C9'] # gris clair

fig = go.Figure(
    data=[go.Sankey(
        node = dict(
            label = node_label,
            color = color_node
        ),
        link = dict(
            source = source_node,
            target = target_node,
            value = values,
            color = color_link
        ))])
fig.update_layout(
    hovermode = 'x',
    title="Stabilité meilleurs clients OLIST sur 6 mois",
    font=dict(size = 14, color = 'white'),
    paper_bgcolor='#5B5958')

plot(fig,
     image_filename='sankey_plot_1', 
     image='png', 
     image_width=1000, 
     image_height=600    
)
fig.show()<jupyter_output><empty_output><jupyter_text>4.2.4 Stabilité par morceaux : PARTIE 1. De mars à mai 18<jupyter_code>#Sankey vue d'ensemble
source = [0, 0, 0,        # Autres clients
          1, 1, 1,        # Clients VIP perdus  
          2, 2, 2, 2,     # Clients VIP presque perdus
          3, 3, 3,        # Clients dépensiers 
          4, 4, 4, 4, 4,  # Clients fidèles 
          5,              # Clients non intéressés perdus
          6, 6,           # Meilleurs clients VIP    
          7]              # Nouveaux clients

target = [29, 27, 26,
          21, 27 ,28,
          21, 22, 27, 28,
          22, 27, 28,
          21, 22, 27, 24, 28,
          26,
          27, 28,
          29]         

value = [30089, 18, 1247,
         1398, 4, 38,
         581, 980, 4, 45,
         1229, 7531, 47, 
         1, 3, 12, 2246, 105, 
         3391,
         1612, 90, 
         3563]

label = ['Autres clients',#0
         'Clients VIP perdus', #1
         'Clients VIP presque perdus',#2
         'Clients dépensiers',#3
         'Clients fidèles', #4
         'Clients non intéressés perdus',#5
         'Meilleurs clients VIP', #6
         'Nouveaux clients',#7
         
         'Autres clients',#29                 # Autres clients
         'Clients dépensiers',#27
         'Clients non intéressés perdus',#26
         
         'Clients VIP perdus', #21           # Clients VIP perdus
         'Clients dépensiers',#27
         'Meilleurs clients VIP',#28
         
         'Clients VIP perdus', #21           # Clients VIP presque perdus
         'Clients VIP presque perdus',#22
         'Clients dépensiers',#27
         'Meilleurs clients VIP', #28
         
         'Clients VIP presque perdus',#22     # Clients dépensiers
         'Clients dépensiers',#27
         'Meilleurs clients VIP',#28
         
         'Clients VIP perdus', #21            # Clients fidèles
         'Clients VIP presque perdus',#22 
         'Clients dépensiers',#27
         'Clients fidèles',#24
         'Meilleurs clients VIP',#28
                          
         'Clients non intéressés perdus',#26  # Clients non intéressés perdus
                     
         'Clients dépensiers',#27             # Meilleurs clients VIP
         'Meilleurs clients VIP',#28
         
         'Autres clients',#29                 # Nouveaux clients
        ]

# Node data
color_node = ['#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', 
              '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96']
         
# link data
color_link = ['#A6E3D7', '#A6E3D7', '#A6E3D7', 
              '#EBBAB5', '#EBBAB5', '#EBBAB5', 
              '#FEF3C7', '#FEF3C7', '#FEF3C7', '#FEF3C7', 
              '#CBB4D5', '#CBB4D5', '#CBB4D5', 
              '#FF90A1', '#FF90A1', '#FF90A1', '#FF90A1', '#FF90A1',
              '#8FF9FF', 
              '#FFE18F', '#FFE18F', 
              '#B6BAF5']

# data to dict, dict to sankey
link = dict(source = source, target = target, value = value, color=color_link)
node = dict(label = label, pad=25, thickness=5, color=color_node)
data = go.Sankey(link = link, node=node, arrangement= 'freeform')

# plot
fig = go.Figure(data)
fig.update_layout(
    hovermode = 'x',
    title="Segmentation RFM clientèle OLIST --- MARS à MAI 18 --- PARTIE 1",
    font=dict(size = 14, color = 'white'),
    paper_bgcolor='#5B5958',
)
fig.show()<jupyter_output><empty_output><jupyter_text>4.2.5 Stabilité par morceaux : PARTIE 2. De mai à juillet 18<jupyter_code>#Sankey vue d'ensemble
source = [0, 0, 0, 0,       # Autres clients
          1, 1,             # Clients VIP perdus  
          2, 2, 2,          # Clients VIP presque perdus
          3, 3, 3,          # Clients dépensiers 
          4, 4,             # Clients fidèles 
          5,                # Clients non intéressés perdus
          6, 6,             # Meilleurs clients VIP    
          7, 7]             # Nouveaux clients

target = [25, 23, 22, 26,
          14, 24,
          14, 17, 24,
          17, 23, 24,
          20, 24,
          22,
          23, 24,
          25, 26]         

value = [42559, 42, 701, 3,
         1948, 32,
         329, 1839, 44,
         654, 11332, 46, 
         2913, 87,  
         4638,
         985, 1241, 
         2139, 2266]

label = ['Autres clients',#0
         'Clients VIP perdu', #1
         'Clients VIP presque perdus',#2
         'Clients dépensiers',#3
         'Clients fidèles', #4
         'Clients non intéressés perdus',#5
         'Meilleurs clients VIP', #6
         'Nouveaux clients',#7
         
         'Autres clients',#25                 # Autres clients
         'Clients dépensiers',#23
         'Clients non intéressés perdus',#22
         'Nouveaux clients',#26
         
         'Clients VIP perdus', #14           # Clients VIP perdus
         'Meilleurs clients VIP',#24
         
         'Clients VIP perdus', #14          # Clients VIP presque perdus
         'Clients VIP presque perdus',#17
         'Meilleurs clients VIP', #24
         
         'Clients VIP presque perdus',#17     # Clients dépensiers
         'Clients dépensiers',#23
         'Meilleurs clients VIP',#24
                
         'Clients fidèles',#20                # Clients fidèles
         'Meilleurs clients VIP',#24
                          
         'Clients non intéressés perdus',#22  # Clients non intéressés perdus
                     
         'Clients dépensiers',#23            # Meilleurs clients VIP
         'Meilleurs clients VIP',#24
         
         'Autres clients',#25                 # Nouveaux clients
         'Nouveaux clients'#26
        ]

# Node data
color_node = ['#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', 
              '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96']
         
# link data
color_link = ['#A6E3D7', '#A6E3D7', '#A6E3D7', '#A6E3D7',
              '#EBBAB5', '#EBBAB5',  
              '#FEF3C7', '#FEF3C7', '#FEF3C7',  
              '#CBB4D5', '#CBB4D5', '#CBB4D5', 
              '#FF90A1', '#FF90A1', 
              '#8FF9FF', 
              '#FFE18F', '#FFE18F', 
              '#B6BAF5', '#B6BAF5']

# data to dict, dict to sankey
link = dict(source = source, target = target, value = value, color=color_link)
node = dict(label = label, pad=25, thickness=5, color=color_node)
data = go.Sankey(link = link, node=node, arrangement= 'freeform')

# plot
fig = go.Figure(data)
fig.update_layout(
    hovermode = 'x',
    title="Segmentation RFM clientèle OLIST --- MAI à JUILLET 18 --- PARTIE 2",
    font=dict(size = 14, color = 'white'),
    paper_bgcolor='#5B5958',
)
fig.show()<jupyter_output><empty_output><jupyter_text>4.2.6 Stabilité par morceaux : 3. VUE D'ENSEMBLE de mars à août 18<jupyter_code>#Sankey vue d'ensemble
source = [0, 0, 0,        # Autres clients
          1, 1, 1,        # Clients VIP perdus  
          2, 2, 2, 2,     # Clients VIP presque perdus
          3, 3, 3,        # Clients dépensiers 
          4, 4, 4, 4, 4,  # Clients fidèles 
          5,              # Clients non intéressés perdus
          6, 6,           # Meilleurs clients VIP    
          7,              # Nouveaux clients
          
          29, 29, 29, 29,       # Autres clients
          21, 21,               # Clients VIP perdus  
          22, 22, 22,           # Clients VIP presque perdus
          27, 27, 27,           # Clients dépensiers 
          24, 24,               # Clients fidèles 
          26,                   # Clients non intéressés perdus
          28, 28,               # Meilleurs clients VIP    
          30, 30,               # Nouveaux clients
          
          48, 48, 48,                  # Autres clients
          37, 37, 37,                  # Clients VIP perdus  
          40, 40, 40, 40,              # Clients VIP presque perdus
          46, 46, 46, 46,              # Clients dépensiers 
          43, 43, 43, 43, 43,          # Clients fidèles 
          45, 45,                      # Clients non intéressés perdus
          47, 47, 47,                  # Meilleurs clients VIP    
          49, 49]                      # Nouveaux clients
          

target = [29, 27, 26,
          21, 27 ,28,
          21, 22, 27, 28,
          22, 27, 28,
          21, 22, 27, 24, 28,
          26,
          27, 28,
          29,
          
          48, 46, 45, 49,
          37, 47,
          37, 40, 47,
          40, 46, 47,
          43, 47,
          45,
          46, 47,
          48, 49,
          
          74, 71, 70,
          64, 72, 73,
          64, 65, 72, 73,
          65, 71, 72, 73,
          64, 65, 71, 72, 73,
          74, 70,
          71, 72, 73,
          74, 75]
                  

value = [30089, 18, 1247,
         1398, 4, 38,
         581, 980, 4, 45,
         1229, 7531, 47, 
         1, 3, 12, 2246, 105, 
         3391,
         1612, 90, 
         3563,
         42559, 42, 701, 3,
         1948, 32,
         329, 1839, 44,
         654, 11332, 46, 
         2913, 87,  
         4638,
         985, 1241, 
         2139, 2266,
         48613, 1256, 358,
         1942, 316, 19,
         146, 2016, 316, 15,
         306, 13327, 333, 18, 
         46, 46, 52, 3124, 46, 
         157, 5182,
         486, 313, 1759,
         1214, 3886]


label = [
    
# Partie 1 mars à mai
    
         'Autres clients',#0
         'Clients VIP perdus', #1
         'Clients VIP presque perdus',#2
         'Clients dépensiers',#3
         'Clients fidèles', #4
         'Clients non intéressés perdus',#5
         'Meilleurs clients VIP', #6
         'Nouveaux clients',#7
         
         'Autres clients',#29                 # Autres clients
         'Clients dépensiers',#27
         'Clients non intéressés perdus',#26
         
         'Clients VIP perdus', #21           # Clients VIP perdus
         'Clients dépensiers',#27
         'Meilleurs clients VIP',#28
         
         'Clients VIP perdus', #21           # Clients VIP presque perdus
         'Clients VIP presque perdus',#22
         'Clients dépensiers',#27
         'Meilleurs clients VIP', #28
         
         'Clients VIP presque perdus',#22     # Clients dépensiers
         'Clients dépensiers',#27
         'Meilleurs clients VIP',#28
         
         'Clients VIP perdus', #21            # Clients fidèles
         'Clients VIP presque perdus',#22 
         'Clients dépensiers',#27
         'Clients fidèles',#24
         'Meilleurs clients VIP',#28
                          
         'Clients non intéressés perdus',#26  # Clients non intéressés perdus
                     
         'Clients dépensiers',#27             # Meilleurs clients VIP
         'Meilleurs clients VIP',#28
         
         'Autres clients',#29                 # Nouveaux clients
    

# Partie 2 mai à juillet 
         
         #'Autres clients',
         #'Clients VIP perdu', 
         #'Clients VIP presque perdus',
         #'Clients dépensiers',
         #'Clients fidèles', 
         #'Clients non intéressés perdus',
         #'Meilleurs clients VIP', 
         'Nouveaux clients',#30
    
         'Autres clients',#48                 # Autres clients
         'Clients dépensiers',#46
         'Clients non intéressés perdus',#45
         'Nouveaux clients',#49
         
         'Clients VIP perdus', #37           # Clients VIP perdus
         'Meilleurs clients VIP',#47
         
         'Clients VIP perdus', #37          # Clients VIP presque perdus
         'Clients VIP presque perdus',#40
         'Meilleurs clients VIP', #47
         
         'Clients VIP presque perdus',#40     # Clients dépensiers
         'Clients dépensiers',#46
         'Meilleurs clients VIP',#47
                
         'Clients fidèles',#43                # Clients fidèles
         'Meilleurs clients VIP',#47
                          
         'Clients non intéressés perdus',#45  # Clients non intéressés perdus
                     
         'Clients dépensiers',#46            # Meilleurs clients VIP
         'Meilleurs clients VIP',#47
         
         'Autres clients',#48                 # Nouveaux clients
         'Nouveaux clients',#49
    
# Partie 3 juillet à août    
         
         #'Autres clients',#57
         #'Clients VIP perdus', #58
         #'Clients VIP presque perdus',#59
         #'Clients dépensiers',#60
         #'Clients fidèles', #61
         #'Clients non intéressés perdus',#62
         #"'Meilleurs clients VIP', #63
         #'Nouveaux clients',#64  
    
         
         'Autres clients',#74                  # Autres clients
         'Clients dépensiers',#71
         'Clients non intéressés perdus',#70
         
         'Clients VIP perdus', #64           # Clients VIP perdus
         'Clients fidèles',#72 
         'Meilleurs clients VIP',#73
         
         'Clients VIP perdus', #64            # Clients VIP presque perdus
         'Clients VIP presque perdus',#65
         'Clients fidèles',#72
         'Meilleurs clients VIP', #73
         
         'Clients VIP presque perdus',#65    # Clients dépensiers
         'Clients dépensiers',#71
         'Clients fidèles',#72
         'Meilleurs clients VIP',#73
         
         'Clients VIP perdus', #64            # Clients fidèles
         'Clients VIP presque perdus',#65 
         'Clients dépensiers',#71
         'Clients fidèles',#72
         'Meilleurs clients VIP',#73
         
         'Autres clients',#74                  # Clients non intéressés perdus
         'Clients non intéressés perdus',#70
                     
         'Clients dépensiers',#71             # Meilleurs clients VIP
         'Clients fidèles',#72
         'Meilleurs clients VIP',#73
         
         'Autres clients',#74
         'Nouveaux clients',#75               # Nouveaux clients
        ]

# Node data
color_node = ['#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', 
              '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96',
              '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', 
              '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96']
         
# link data
color_link = ['#A6E3D7', '#A6E3D7', '#A6E3D7', 
              '#EBBAB5', '#EBBAB5', '#EBBAB5', 
              '#FEF3C7', '#FEF3C7', '#FEF3C7', '#FEF3C7', 
              '#CBB4D5', '#CBB4D5', '#CBB4D5', 
              '#FF90A1', '#FF90A1', '#FF90A1', '#FF90A1', '#FF90A1',
              '#8FF9FF', 
              '#FFE18F', '#FFE18F', 
              '#B6BAF5',
              
              '#A6E3D7', '#A6E3D7', '#A6E3D7', '#A6E3D7',
              '#EBBAB5', '#EBBAB5', 
              '#FEF3C7', '#FEF3C7', '#FEF3C7',  
              '#CBB4D5', '#CBB4D5', '#CBB4D5', 
              '#FF90A1', '#FF90A1', 
              '#8FF9FF', 
              '#FFE18F', '#FFE18F', 
              '#B6BAF5', '#B6BAF5',
             
              '#A6E3D7', '#A6E3D7', '#A6E3D7', 
              '#EBBAB5', '#EBBAB5', '#EBBAB5', 
              '#FEF3C7', '#FEF3C7', '#FEF3C7', '#FEF3C7', 
              '#CBB4D5', '#CBB4D5', '#CBB4D5', '#CBB4D5',
              '#FF90A1', '#FF90A1', '#FF90A1', '#FF90A1', '#FF90A1',
              '#8FF9FF', '#8FF9FF',
              '#FFE18F', '#FFE18F', '#FFE18F',
              '#B6BAF5', '#B6BAF5'
             ]

# data to dict, dict to sankey
link = dict(source = source, target = target, value = value, color=color_link)
node = dict(label = label, pad=25, thickness=5, color=color_node)
data = go.Sankey(link = link, node=node, arrangement= 'freeform')

# plot
fig = go.Figure(data)
fig.update_layout(
    hovermode = 'x',
    title="Segmentation RFM clientèle OLIST --- MARS à AOUT 18 --- VUE D'ENSEMBLE",
    font=dict(size = 12, color = 'white'),
    paper_bgcolor='#5B5958')
plot(fig,
     image_filename='sankey_total', 
     image='png', 
     image_width=1000, 
     image_height=600    
)
fig.show()<jupyter_output><empty_output><jupyter_text>4.2.7 Stabilité VIP par morceaux : VUE D'ENSEMBLE de mars à août 18<jupyter_code># Conversion de la colonne 'order_purchase_timestamp' au format datetime pour calculs ultérieurs
df['order_purchase_timestamp'] = pd.to_datetime(df['order_purchase_timestamp'], format='%Y-%m-%d %H:%M:%S')

# dataframe arrêté en juin 2018
df_juin = df[df.order_purchase_timestamp <= '2018-06-30 15:00:37']

#Vérification min max historique
print('Min : {}, Max : {}'.format(min(df_juin.order_purchase_timestamp), max(df_juin.order_purchase_timestamp)))

#Date de référence fixée au lendemain de la dernière date enregistrée dans la table 
date_reference_juin = max(df_juin.order_purchase_timestamp) + dt.timedelta(1)
print('date_reference_3 : {}'.format(date_reference_juin))

#Table RFM juin 2018 
dfjuin_rfm = df_juin.groupby('customer_unique_id').agg(
                                            {'order_purchase_timestamp' : lambda x: (date_reference_juin - x.max()).days, # Récence
                                             'order_id' : 'count', # Fréquence
                                             'payment_value' : 'sum'}   # Valeur monétaire
                                              )
dfjuin_rfm.rename(columns={'order_purchase_timestamp': 'récence', 
                          'order_id': 'fréquence', 
                          'payment_value': 'valeur_monétaire'}, inplace=True)

#Détermination des quantiles
quantiles_juin = dfjuin_rfm.quantile(q=[0.25,0.5,0.75])

dfjuin_rfm['R_Quartile'] = dfjuin_rfm['récence'].apply(RScore, args=('récence',quantiles_juin))
dfjuin_rfm['F_Quartile'] = dfjuin_rfm['fréquence'].apply(FMScore, args=('fréquence', quantiles_juin))
dfjuin_rfm['M_Quartile'] = dfjuin_rfm['valeur_monétaire'].apply(FMScore, args=('valeur_monétaire',quantiles_juin))

# RFMScore
dfjuin_rfm['RFMScore'] = dfjuin_rfm.R_Quartile.map(str) + dfjuin_rfm.F_Quartile.map(str) + dfjuin_rfm.M_Quartile.map(str)

#Ajout de segments clients 
dfjuin_rfm['segmentJuin'] = ""
mask1 = dfjuin_rfm['RFMScore'] == '111'# vip
mask2 = dfjuin_rfm['RFMScore'] == '311'#clients vip presque perdus
mask3 = dfjuin_rfm['RFMScore'] == '411'# clients vip perdus
mask4 = dfjuin_rfm['RFMScore'] == '444'# clients non intéressés perdus
mask5 = dfjuin_rfm['RFMScore'] == '144'# nouveaux clients
# Autres clients
mask6 = (dfjuin_rfm['RFMScore'] != '444') & (dfjuin_rfm['RFMScore'] != '411') & (dfjuin_rfm['RFMScore'] != '311') & (dfjuin_rfm['RFMScore'] != '111') & (dfjuin_rfm['RFMScore'] != '144')
# Clients fidèles dans autres clients
mask7 = (dfjuin_rfm['F_Quartile'] == 1) & (dfjuin_rfm['RFMScore'] != '444') & (dfjuin_rfm['RFMScore'] != '411') & (dfjuin_rfm['RFMScore'] != '311') & (dfjuin_rfm['RFMScore'] != '111') & (dfjuin_rfm['RFMScore'] != '144')
# Clients dépensiers dans autres clients
mask8 = (dfjuin_rfm['M_Quartile'] == 1) & (dfjuin_rfm['RFMScore'] != '444') & (dfjuin_rfm['RFMScore'] != '411') & (dfjuin_rfm['RFMScore'] != '311') & (dfjuin_rfm['RFMScore'] != '111') & (dfjuin_rfm['RFMScore'] != '144')

dfjuin_rfm.loc[mask1, 'segmentJuin'] = 'Meilleurs clients VIP'
dfjuin_rfm.loc[mask2, 'segmentJuin'] = 'Clients VIP presque perdus'
dfjuin_rfm.loc[mask3, 'segmentJuin'] = 'Clients VIP perdus'
dfjuin_rfm.loc[mask4, 'segmentJuin'] = 'Clients non intéressés perdus'
dfjuin_rfm.loc[mask5, 'segmentJuin'] = 'Nouveaux clients'
dfjuin_rfm.loc[mask6, 'segmentJuin'] = 'Autres clients'
dfjuin_rfm.loc[mask7, 'segmentJuin'] = 'Clients fidèles'
dfjuin_rfm.loc[mask8, 'segmentJuin'] = 'Clients dépensiers'

dfjuin_rfm.head()
#Table RFM mai, juin, juillet, jusqu'à la fin de l'historique
df_sankey_1 = pd.merge(df_rfm, df1_rfm, on = 'customer_unique_id', how = 'left')
df_sankey_2 = pd.merge(df_sankey_1, df3_rfm, on = 'customer_unique_id', how = 'left')
df_sankey_3 = pd.merge(df_sankey_2, df6_rfm, on = 'customer_unique_id', how = 'left')
df_sankey_4 = pd.merge(df_sankey_3, dfjuin_rfm, on = 'customer_unique_id', how = 'left')
#Création table pour visualisation segments clients
colonnes = ['customer_unique_id','segment6', 'segment3', 'segment1', 'segment', 'segmentJuin']
df_sankey_VIP = df_sankey_4[colonnes]
df_sankey_VIP.head()
# Créer la table pour tracer le Sankey diagram
# Mai à Juin 2018
df_sankey_juin_seg = df_sankey_VIP.groupby(by = ['segment3', 'segmentJuin']).agg({'segmentJuin' : 'count'})
df_sankey_juin_seg.rename(columns={'segmentJuin' : 'value_Juin'}, inplace=True)
df_sankey_juin = df_sankey_juin_seg.reset_index()
df_sankey_juin
# Créer la table pour tracer le Sankey diagram
# Juin à Juillet 2018
df_sankey_juin2_seg = df_sankey_VIP.groupby(by = ['segmentJuin', 'segment1']).agg({'segment1' : 'count'})
df_sankey_juin2_seg.rename(columns={'segment1' : 'value_Juillet'}, inplace=True)
df_sankey_juin2 = df_sankey_juin2_seg.reset_index()
df_sankey_juin2
# Créer la table pour tracer le Sankey diagram
# Juillet à Août 2018
df_sankey_juillet_seg = df_sankey_VIP.groupby(by = ['segment1', 'segment']).agg({'segment' : 'count'})
df_sankey_juillet_seg.rename(columns={'segment' : 'value_Aout'}, inplace=True)
df_sankey_juillet = df_sankey_juillet_seg.reset_index()
df_sankey_juillet
#Sankey vue d'ensemble
source = [0, 0,           # Meilleurs clients VIP mars 18    
          2, 2,           # Meilleurs clients VIP mai 18 
          4, 4, 4]        # Meilleurs clients VIP juillet 18                       

target = [1, 2,
          3, 4,
          5, 6, 7]
                  
value = [482, 1714, 
         493, 1935,
         490, 293, 1743]

label = [
    
# Partie 1 mai à juin
    
         'Meilleurs clients VIP', #0          # Mai 18 source
         
         'Clients dépensiers',#1             # Meilleurs clients VIP juin 2018 target
         'Meilleurs clients VIP',#2  

# Partie 2 juin à juillet 
         
         'Clients dépensiers',#3            # Meilleurs clients VIP
         'Meilleurs clients VIP',#4
         
# Partie 3 juillet à août    
              
         'Clients dépensiers',#5             # Meilleurs clients VIP
         'Clients fidèles',#6
         'Meilleurs clients VIP',#7
        ]

# Node data
color_node = ['#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96']
         
# link data
color_link = ['#A6E3D7', '#A6E3D7', 
              '#EBBAB5', '#EBBAB5', 
              '#FEF3C7', '#FEF3C7', '#FEF3C7'
             ]

# data to dict, dict to sankey
link = dict(source = source, target = target, value = value, color=color_link)
node = dict(label = label, pad=25, thickness=5, color=color_node)
data = go.Sankey(link = link, node=node, arrangement= 'freeform')

# plot
fig = go.Figure(data)
fig.update_layout(
    hovermode = 'x',
    title="Segmentation RFM clientèle VIP OLIST --- JUIN à AOUT 18 --- VUE D'ENSEMBLE",
    font=dict(size = 16, color = 'white'),
    paper_bgcolor='#5B5958')
plot(fig,
     image_filename='sankey_total', 
     image='png', 
     image_width=1000, 
     image_height=600    
)
fig.show()
#Sankey vue d'ensemble
source = [0, 0,           # Meilleurs clients VIP mars 18    
          2, 2,           # Meilleurs clients VIP mai 18 
          4, 4, 4]        # Meilleurs clients VIP juillet 18                       

target = [1, 2,
          3, 4,
          5, 6, 7]
                  
value = [1612, 90, 
         985, 1241,
         486, 313, 1759]

label = [
    
# Partie 1 mars à mai
    
         'Meilleurs clients VIP', #0          # Mars 18 source
         
         'Clients dépensiers',#1             # Meilleurs clients VIP mai 2018 target
         'Meilleurs clients VIP',#2  

# Partie 2 mai à juillet 
         
         'Clients dépensiers',#3            # Meilleurs clients VIP
         'Meilleurs clients VIP',#4
         
# Partie 3 juillet à août    
              
         'Clients dépensiers',#5             # Meilleurs clients VIP
         'Clients fidèles',#6
         'Meilleurs clients VIP',#7
        ]

# Node data
color_node = ['#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96', '#808B96']
         
# link data
color_link = ['#A6E3D7', '#A6E3D7', 
              '#EBBAB5', '#EBBAB5', '#EBBAB5', 
              '#FEF3C7', '#FEF3C7', '#FEF3C7'
             ]

# data to dict, dict to sankey
link = dict(source = source, target = target, value = value, color=color_link)
node = dict(label = label, pad=25, thickness=5, color=color_node)
data = go.Sankey(link = link, node=node, arrangement= 'freeform')

# plot
fig = go.Figure(data)
fig.update_layout(
    hovermode = 'x',
    title="Segmentation RFM clientèle VIP OLIST --- MARS à AOUT 18 --- VUE D'ENSEMBLE",
    font=dict(size = 16, color = 'white'),
    paper_bgcolor='#5B5958')
plot(fig,
     image_filename='sankey_total', 
     image='png', 
     image_width=1000, 
     image_height=600    
)
fig.show()<jupyter_output><empty_output><jupyter_text>5. Contrat de maintenance : cas des nouveaux clients entre 2 MAJ, actions à envisager La durée entre 2 mises à jour sera de __3 mois__ puisque nous avons pu constater une bonne stabilité de la clientèle.Néanmoins, il faudra veiller à s'occuper des nouveaux clients, en particulier de certains types de nouveaux clients, à fort potentiel. En particulier :- nouveaux clients à fort potentiel immédiat : 111, à privilégier.- nouveaux clients presque VIP : 112, à consolider- nouveaux clients à potentiel, mais pour l'heure peu dépensiers ou peu actifs : 113, 114, 141, 142, 143, 144, 211, 212, 213, 214, à stimuler.<jupyter_code>df_nouveaux_clients = df_rfm.filter(items = ['customer_unique_id','RFMScore'])
df_nouveaux_clients.set_index('customer_unique_id')
bornes = [110, 111, 112, 222, 444]
noms = ['Offre très avantageuse', 'Offre avantageuse', 'Offre promotionnelle', 'Aucune offre']

df_nouveaux_clients['Action à prévoir'] = pd.cut(df_nouveaux_clients['RFMScore'], bornes, labels=noms)
df_nouveaux_clients.head()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1327194015695033, 'fraction_numerical': 0.06608434932921325, 'mean_word_length': 2.8095571095571095, 'pattern_counts': {'":': 0, '<': 105, '<?xml version=': 0, '>': 99, 'https://': 1, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 57, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '24', 'dir': 'jupyter-structured-clean-dedup', 'id': '302585', 'license': 'MIT', 'n_tokens_mistral': 26321, 'n_tokens_neox': 23989, 'n_words': 5462, 'path': 'POLIST_02_notebookSegmentationRFM.ipynb', 'repo_name': 'Rabenco/P5_Segmentation_client', 'size': '65371'}