Ediashta/HaiMeds_Churn_Prediction
01
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 