CoolFace
Modelpublic

Ediashta/HaiMeds_Churn_Prediction

sourceHugging Faceupdated 3y agoView on Hugging Face
0likes1downloads
eda.py195 linesDownload Raw Back to root
1import streamlit as st2import pandas as pd3import seaborn as sns4import matplotlib.pyplot as plt5 6st.set_page_config(7    page_title="Laptop Price Regression",8    layout="wide",9    initial_sidebar_state="expanded",10)11 12# dataset13dataset = "https://raw.githubusercontent.com/ediashta/p2-ftds020-rmt-m1/main/churn.csv"14data = pd.read_csv(dataset)15 16 17def distribution():18    # distribution plot19    st.title("HaiMeds Customer Distribution")20    col1, col2 = st.columns(2)21 22    hist_plot_1 = col1.selectbox(23        "Choose Table",24        ("Age", "Last Login (Days)", "Avg. Time Spent"),25    )26    hist_plot(hist_plot_1, col1)27 28    hist_plot_2 = col2.selectbox(29        "Choose Table",30        ("Avg. Transaction", "Avg. Login Frequency (Days)", "Points"),31    )32    hist_plot(hist_plot_2, col2)33 34    col1, col2 = st.columns(2)35    bar_plot_1 = col1.selectbox(36        "Choose Table",37        ("Gender", "Region", "Membership", "Referral", "Preferred Offer", "Devices"),38    )39    bar_plot(bar_plot_1, col1)40 41    bar_plot_2 = col2.selectbox(42        "Choose Table",43        (44            "Internet",45            "Used Discount",46            "Offer Application Preference",47            "Past Complaint",48            "Complaint Status",49            "Feedback",50        ),51    )52    bar_plot(bar_plot_2, col2)53 54    st.subheader("Churn Risk Score Distribution")55    churn_score()56 57 58def corr_matrix():59    # distribution plot60    st.title("Features Correlation")61    col1, col2 = st.columns([7, 5])62 63    # correlation for numerical64    fig = plt.figure(figsize=(10, 10))65    corr_matrix = data[66        [67            "age",68            "days_since_last_login",69            "avg_time_spent",70            "avg_transaction_value",71            "avg_frequency_login_days",72            "points_in_wallet",73            "churn_risk_score",74        ]75    ].corr(method="spearman")76    sns.heatmap(corr_matrix, annot=True, cmap="mako", square=True)77    plt.xticks(rotation=45)78    plt.yticks(rotation=45)79    col1.pyplot(fig)80 81    feature_importance_info = """82        **Feature Importance:**83 84        - **gender:** 0.085        - **region_category:** 0.022386        - **membership_category:** 0.785987        - **joining_date:** 0.088        - **joined_through_referral:** 0.035589        - **preferred_offer_types:** 0.043490        - **medium_of_operation:** 0.021891        - **internet_option:** 0.002592        - **last_visit_time:** 0.060493        - **used_special_discount:** 0.009294        - **offer_application_preference:** 0.017995        - **past_complaint:** 0.007296        - **complaint_status:** 0.005497        - **feedback:** 0.456198        """99    col2.markdown(feature_importance_info)100 101 102def bar_plot(var, col):103    # ram storage dist104    col.write("Distribusi " + var + " terbanyak")105    var_old = var106 107    if var == "Gender":108        var = "gender"109    elif var == "Region":110        var = "region_category"111    elif var == "Membership":112        var = "membership_category"113    elif var == "Referral":114        var = "joined_through_referral"115    elif var == "Preferred Offer":116        var = "preferred_offer_types"117    elif var == "Devices":118        var = "medium_of_operation"119    elif var == "Internet":120        var = "internet_option"121    elif var == "Used Discount":122        var = "used_special_discount"123    elif var == "Offer Application Preference":124        var = "offer_application_preference"125    elif var == "Past Complaint":126        var = "past_complaint"127    elif var == "Complaint Status":128        var = "complaint_status"129    elif var == "Feedback":130        var = "feedback"131 132    fig = plt.figure(figsize=(10, 5))133    ax1 = sns.countplot(134        data=data,135        x=var,136        palette="mako",137    )138    plt.xlabel(var_old)139    ax1.bar_label(container=ax1.containers[0], labels=data[var].value_counts().values)140    col.pyplot(fig)141 142 143def hist_plot(var, col):144    # check price distribution145    col.write("Distribusi " + var)146    var_old = var147 148    if var == "Age":149        var = "age"150    elif var == "Last Login (Days)":151        var = "days_since_last_login"152    elif var == "Avg. Time Spent":153        var = "avg_time_spent"154    elif var == "Avg. Transaction":155        var = "avg_transaction_value"156    elif var == "Avg. Login Frequency (Days)":157        var = "avg_frequency_login_days"158    elif var == "Points":159        var = "points_in_wallet"160    else:161        var = var162 163    fig = plt.figure(figsize=(10, 5))164 165    palette = sns.color_palette("mako_r", 50)166    plt.xlabel(var_old)167    plot = sns.histplot(data=data, x=var, kde=True, bins=50, color="teal")168 169    for bin_, i in zip(plot.patches, palette):170        bin_.set_facecolor(i)171 172    col.pyplot(fig)173 174 175def churn_score():176    fig = plt.figure(figsize=(20, 5))177    plt.ylabel("Churn Risk Score")178 179    sorted_scores = data["churn_risk_score"].value_counts().sort_index(ascending=False)180    ax = sns.countplot(181        data=data, y="churn_risk_score", palette="mako", order=sorted_scores.index182    )183    # Get the value counts for each category of 'churn_risk_score'184    value_counts = data["churn_risk_score"].value_counts()185 186    # Add labels on top of each bar187    for idx, count in enumerate(value_counts):188        ax.text(count + 5, idx, str(count), va="center")189 190    st.pyplot(fig)191 192 193if __name__ == "__main__":194    distribution()195