CRM Analytics - RFM Segmentation
  • AI Chat
  • Code
  • Report
  • Beta
    Spinner

    Customer Relationship Management

    Main Topics

    • Customer Lifecycle/journey/funnel
    • Communication
    • New Customers Processes
    • Churn Management
    • Cross-sell - Up-sell
    • Customer Segmentation Processes

    Key Performance Indicators

    • Customer Acquisiton Rate
    • Customer Retention Rate
    • Customer Churn Rate
    • Conversion Rate
    • Growth Rate

    Cohort Analysis

    Analysis of a group of people with common characteristics on KPIs.

    RFM

    Recency

    How recent was the customer's last purchase ?

    Frequency

    How often did this customer make a purchase in a given period ?

    Monetary

    How much money did the customer spend in a given period ?

    RFM Segments

    RFM SEGMENTATION

    Importing Modules and Dataset

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    import datetime as dt
    pd.set_option("display.max_columns", None)
    pd.set_option("display.float_format", lambda x: "%.2f" % x)
    data2010 = pd.read_excel("online_retail_II.xlsx", sheet_name="Year 2009-2010")
    data2011 = pd.read_excel("online_retail_II.xlsx", sheet_name="Year 2010-2011")
    data = data2010.append(data2011)
    data.reset_index(drop = True, inplace=True)

    Exploratory Data Analysis

    Check Data

    def check(df, head = 5):
        print("**********************************HEAD**********************************")
        print(df.head(head))
        print("**********************************TAIL**********************************")
        print(df.tail(head))
        print("**********************************TYPES**********************************")
        print(df.dtypes)
        print("**********************************SHAPE**********************************")
        print(df.shape)
        print("**********************************NA**********************************")
        print(df.isnull().sum())
        print("**********************************QUANTILES**********************************")
        print(df.describe([0, 0.05, 0.5, 0.95]))
    check(data)

    Grab Columns

    def grab_col_names(dataframe, cat_th=10, car_th=20):
        """
    
        Veri setindeki kategorik, numerik ve kategorik fakat kardinal değişkenlerin isimlerini verir.
        Not: Kategorik değişkenlerin içerisine numerik görünümlü kategorik değişkenler de dahildir.
    
        Parameters
        ------
            dataframe: dataframe
                    Değişken isimleri alınmak istenilen dataframe
            cat_th: int, optional
                    numerik fakat kategorik olan değişkenler için sınıf eşik değeri
            car_th: int, optinal
                    kategorik fakat kardinal değişkenler için sınıf eşik değeri
    
        Returns
        ------
            cat_cols: list
                    Kategorik değişken listesi
            num_cols: list
                    Numerik değişken listesi
            cat_but_car: list
                    Kategorik görünümlü kardinal değişken listesi
    
        Examples
        ------
            import seaborn as sns
            df = sns.load_dataset("iris")
            print(grab_col_names(df))
    
    
        Notes
        ------
            cat_cols + num_cols + cat_but_car = toplam değişken sayısı
            num_but_cat cat_cols'un içerisinde.
            Return olan 3 liste toplamı toplam değişken sayısına eşittir: cat_cols + num_cols + cat_but_car = değişken sayısı
    
        """
    
        # cat_cols, cat_but_car
        cat_cols = [col for col in dataframe.columns if dataframe[col].dtypes == "O"]
        num_but_cat = [col for col in dataframe.columns if dataframe[col].nunique() < cat_th and
                       dataframe[col].dtypes != "O"]
        cat_but_car = [col for col in dataframe.columns if dataframe[col].nunique() > car_th and
                       dataframe[col].dtypes == "O"]
        cat_cols = cat_cols + num_but_cat
        cat_cols = [col for col in cat_cols if col not in cat_but_car]
    
        # num_cols
        num_cols = [col for col in dataframe.columns if dataframe[col].dtypes != "O"]
        num_cols = [col for col in num_cols if col not in num_but_cat]
    
        print(f"Observations: {dataframe.shape[0]}")
        print(f"Variables: {dataframe.shape[1]}")
        print(f'cat_cols: {len(cat_cols)}')
        print(f'num_cols: {len(num_cols)}')
        print(f'cat_but_car: {len(cat_but_car)}')
        print(f'num_but_cat: {len(num_but_cat)}')
        return cat_cols, num_cols, cat_but_car
    cats,nums,cards = grab_col_names(data)
    cards
    nums