Azrieldr
commited on
Commit
•
4a965b7
1
Parent(s):
49b7e3a
inital commit
Browse files- Prediction.py +87 -0
- app.py +10 -0
- churn_model.h5 +3 -0
- eda.py +88 -0
- final_pipeline.pkl +3 -0
- image.png +0 -0
Prediction.py
ADDED
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import pickle
|
3 |
+
import pandas as pd
|
4 |
+
from tensorflow.keras.models import load_model
|
5 |
+
import numpy as np
|
6 |
+
# from sklearn.pipeline import make_pipeline
|
7 |
+
# from sklearn.preprocessing import StandardScaler, OneHotEncoder
|
8 |
+
# from sklearn.svm import SVC
|
9 |
+
# from sklearn.linear_model import LogisticRegression
|
10 |
+
# from sklearn.tree import DecisionTreeClassifier
|
11 |
+
# from sklearn.ensemble import RandomForestClassifier
|
12 |
+
|
13 |
+
|
14 |
+
# Load the Models
|
15 |
+
|
16 |
+
with open('final_pipeline.pkl', 'rb') as file_1:
|
17 |
+
model_pipeline = pickle.load(file_1)
|
18 |
+
|
19 |
+
model_ann = load_model('churn_model.h5')
|
20 |
+
|
21 |
+
def run():
|
22 |
+
with st.form(key='form_prediksi'):
|
23 |
+
name = st.text_input('Nama', value='')
|
24 |
+
sex = st.radio('Kelamin', ('Perempuan', 'Laki-Laki'))
|
25 |
+
if sex=='Laki-Laki':
|
26 |
+
gender='M'
|
27 |
+
else: gender='F'
|
28 |
+
age= st.number_input('Umur', min_value=16, max_value=80, value=50, step=1)
|
29 |
+
regcat=st.selectbox('Kategori Daerah: ',('Village','Town', 'City'))
|
30 |
+
memcat=st.selectbox('Kategori Membership: ',('No Membership','Basic Membership', 'Gold Membership', 'Premium Membership','Platinum Membership'))
|
31 |
+
ref = st.radio('apakah bergabung melalui referal?', ('Yes', 'No'))
|
32 |
+
medium=st.selectbox('Medium Akses: ',('Smartphone','Desktop', 'Both'))
|
33 |
+
preferensi=st.selectbox('Preferensi Penawaran: ',('Credit/Debit Card Offers', 'Gift Vouchers/Coupons','Without Offers'))
|
34 |
+
internet=st.selectbox('Preferensi Penawaran: ',('Fiber_Optic', 'Wi-Fi', 'Mobile_Data'))
|
35 |
+
daylast= st.number_input('Hari dari login terakhir', min_value=0, max_value=100, value=50, step=1)
|
36 |
+
avgday= st.number_input('Waktu pemakaiwn rata rata', min_value=0, max_value=100, value=50, step=1)
|
37 |
+
avgtran= st.number_input('Rata rata jumlah transaksi', min_value=0, max_value=50000, value=10000, step=1)
|
38 |
+
avgfreq= st.number_input('Hari dari login terakhit', min_value=0, max_value=30, value=10, step=1)
|
39 |
+
point= st.number_input('Point dalam Wallet', min_value=0, max_value=2000, value=50, step=1)
|
40 |
+
diskon= st.radio('Pernah menggunakan diskon spesial?', ('Yes', 'No'))
|
41 |
+
offer= st.radio('offer aplication prefrence?', ('Yes', 'No'))
|
42 |
+
past=st.radio('Pernah komplain?', ('Yes', 'No'))
|
43 |
+
complain= st.selectbox('Preferensi Penawaran: ',('Not Applicable', 'Unsolved', 'Solved', 'No Information Available','Solved in Follow-up'))
|
44 |
+
feedback= st.selectbox('Preferensi Penawaran: ',('Too many ads', 'No reason specified', 'Reasonable Price','Quality Customer Care', 'Poor Website', 'Poor Customer Service','Poor Product Quality', 'User Friendly Website', 'Products always in Stock'))
|
45 |
+
|
46 |
+
submitted = st.form_submit_button('Predict')
|
47 |
+
|
48 |
+
data_inf = {
|
49 |
+
'age': age,
|
50 |
+
'gender': gender,
|
51 |
+
'region_category':regcat,
|
52 |
+
'membership_category':memcat,
|
53 |
+
'joined_through_referral':ref,
|
54 |
+
'preferred_offer_types':preferensi,
|
55 |
+
'medium_of_operation':medium,
|
56 |
+
'internet_option':internet,
|
57 |
+
'days_since_last_login':daylast,
|
58 |
+
'avg_time_spent':avgday,
|
59 |
+
'avg_transaction_value': avgtran,
|
60 |
+
'avg_frequency_login_days':avgfreq,
|
61 |
+
'points_in_wallet':point,
|
62 |
+
'used_special_discount':diskon,
|
63 |
+
'offer_application_preference':offer,
|
64 |
+
'past_complaint':past,
|
65 |
+
'complaint_status':complain,
|
66 |
+
'feedback': feedback
|
67 |
+
}
|
68 |
+
|
69 |
+
|
70 |
+
|
71 |
+
if submitted:
|
72 |
+
data_inf = pd.DataFrame([data_inf])
|
73 |
+
# Transform Inference-Set
|
74 |
+
|
75 |
+
data_inf_transform = model_pipeline.transform(data_inf)
|
76 |
+
data_inf_transform
|
77 |
+
y_pred_inf = model_ann.predict(data_inf_transform)
|
78 |
+
y_pred_inf = np.where(y_pred_inf >= 0.5, 1, 0)
|
79 |
+
value = y_pred_inf[0][0]
|
80 |
+
print(value)
|
81 |
+
if value==1:
|
82 |
+
result= "Pelanggan diprediksi akan Churn"
|
83 |
+
else: result= "Pelanggan diprediksi tidak akan Churn"
|
84 |
+
st.write(result)
|
85 |
+
|
86 |
+
if __name__== '__main__':
|
87 |
+
run()
|
app.py
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import Prediction
|
3 |
+
import eda
|
4 |
+
|
5 |
+
navigation = st.sidebar.selectbox('Pilih Halaman: ', ('EDA','Prediction'))
|
6 |
+
|
7 |
+
if navigation == 'EDA':
|
8 |
+
eda.run()
|
9 |
+
else:
|
10 |
+
Prediction.run()
|
churn_model.h5
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:689b2bfd7af593f5b2de3704a57a9377eb7cbccc4bfb7afeef5be38c7fb19707
|
3 |
+
size 115392
|
eda.py
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import pandas as pd
|
3 |
+
import seaborn as sns
|
4 |
+
import matplotlib.pyplot as plt
|
5 |
+
import plotly.express as px
|
6 |
+
from PIL import Image
|
7 |
+
|
8 |
+
st.set_page_config(
|
9 |
+
page_title= 'Prediksi Churn Pelanggan',
|
10 |
+
layout='wide',
|
11 |
+
initial_sidebar_state='expanded'
|
12 |
+
)
|
13 |
+
|
14 |
+
def run():
|
15 |
+
image = Image.open('image.png')
|
16 |
+
resized_image = image.resize((605, 212))
|
17 |
+
st.image(resized_image, caption='Churn')
|
18 |
+
|
19 |
+
st.title('Prediksi Churn Pelanggan')
|
20 |
+
df = pd.read_csv('https://raw.githubusercontent.com/Azrieldr/latihan/master/churn.csv')
|
21 |
+
st.dataframe(df)
|
22 |
+
|
23 |
+
data=df.dropna()
|
24 |
+
|
25 |
+
#menggroupkan churn berdasarkan membership
|
26 |
+
churnMember =data.groupby('membership_category')['churn_risk_score'].mean()*100
|
27 |
+
|
28 |
+
# buat dictionary untuk mapping nama index yang baru
|
29 |
+
new_index = {}
|
30 |
+
for index in churnMember.index:
|
31 |
+
new_index[index] = index.replace('Membership', '')
|
32 |
+
|
33 |
+
# rename index dengan dictionary new_index
|
34 |
+
churnMember = churnMember.rename(index=new_index)
|
35 |
+
churnMember = churnMember.sort_values()
|
36 |
+
|
37 |
+
# plot bar chart
|
38 |
+
plt.bar(churnMember.index, churnMember.values, color='#89cff0')
|
39 |
+
|
40 |
+
# tambahkan judul dan label sumbu
|
41 |
+
plt.title('Rata-Rata Churn Risk Score per Kategori Membership')
|
42 |
+
plt.xlabel('Kategori Membership')
|
43 |
+
plt.ylabel('Rata-Rata Churn Risk Score (%)')
|
44 |
+
|
45 |
+
# simpan plot ke dalam variabel fig
|
46 |
+
fig = plt.gcf()
|
47 |
+
|
48 |
+
# tampilkan plot pada Streamlit
|
49 |
+
st.pyplot(fig)
|
50 |
+
|
51 |
+
# menggroupkan churn berdasarkan Complaint
|
52 |
+
churnCom = data.groupby('past_complaint')['churn_risk_score'].mean()*100
|
53 |
+
|
54 |
+
# plot bar chart
|
55 |
+
fig, ax = plt.subplots()
|
56 |
+
ax.bar(churnCom.index, churnCom.values, color='#89cff0')
|
57 |
+
|
58 |
+
# tambahkan judul dan label sumbu
|
59 |
+
ax.set_title('Rata-Rata Churn Risk Score berdasarkan pernahnya complaint')
|
60 |
+
ax.set_xlabel('Past Complaint')
|
61 |
+
ax.set_ylabel('Rata-Rata Churn Risk Score (%)')
|
62 |
+
|
63 |
+
# menampilkan plot pada Streamlit
|
64 |
+
st.pyplot(fig)
|
65 |
+
|
66 |
+
|
67 |
+
# membuat dataframe copy dari dataframe awal
|
68 |
+
df1 = data.copy()
|
69 |
+
|
70 |
+
# mengelompokkan data pada kolom AGE menjadi 10 kelompok
|
71 |
+
df1['group'] = pd.cut(df1['age'], bins=8)
|
72 |
+
|
73 |
+
# menghitung nilai rata-rata pada kolom LUNG_CANCER untuk setiap kelompok
|
74 |
+
result = df1.groupby('group')['churn_risk_score'].mean()*100
|
75 |
+
|
76 |
+
# plot hasilnya menggunakan seaborn dengan barplot berwarna pink
|
77 |
+
sns.set_style('whitegrid')
|
78 |
+
ax = sns.barplot(x=result.index, y=result, color='pink')
|
79 |
+
ax.set(xlabel='AGE Group', ylabel='churn risk score (YES)')
|
80 |
+
|
81 |
+
# mengatur font size pada axis x
|
82 |
+
ax.tick_params(axis='x', labelsize=7.5)
|
83 |
+
|
84 |
+
# menampilkan plot pada streamlit
|
85 |
+
st.pyplot(plt)
|
86 |
+
|
87 |
+
if __name__== '__main__':
|
88 |
+
run()
|
final_pipeline.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:6b831d1fc631ad1d90ddec4c9f227480c17c875158fad80208f8ea54249d4102
|
3 |
+
size 3104
|
image.png
ADDED
![]() |