Azrieldr commited on
Commit
4a965b7
1 Parent(s): 49b7e3a

inital commit

Browse files
Files changed (6) hide show
  1. Prediction.py +87 -0
  2. app.py +10 -0
  3. churn_model.h5 +3 -0
  4. eda.py +88 -0
  5. final_pipeline.pkl +3 -0
  6. 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