nickuperdana commited on
Commit
27752c7
1 Parent(s): 68e7f67

commit initial model deploy

Browse files

upload first version of the model

Files changed (6) hide show
  1. P1G5_Set_1_nicku_perdana.csv +0 -0
  2. app.py +10 -0
  3. eda.py +100 -0
  4. model.pkl +3 -0
  5. model.py +88 -0
  6. requirements.txt +5 -0
P1G5_Set_1_nicku_perdana.csv ADDED
The diff for this file is too large to render. See raw diff
 
app.py ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import eda
3
+ import model
4
+
5
+ navigationBar = st.sidebar.selectbox('Pilih halaman:', {'EDA', 'Model Prediksi'})
6
+
7
+ if navigationBar == 'EDA':
8
+ eda.run()
9
+ else:
10
+ model.run()
eda.py ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st # untuk streamlit
2
+ import pandas as pd # untuk membaca tabel
3
+
4
+ # untuk visualisasi
5
+ import matplotlib.pyplot as plt
6
+ import seaborn as sns
7
+
8
+ def run():
9
+ st.title('Default Credit Card Payment Prediction') # judul streamlit
10
+ st.markdown('Model ini bertujuan untuk memprediksi status pembayaran seseorang di bulan mendatang dengan simbol 1=gagal bayar dan 0=kredit lancar.')
11
+ st.markdown('Model dikelola oleh Nicku R. Perdana (HCK-012)')
12
+ st.image('https://img.freepik.com/free-photo/online-shopping-cheerful-asian-girl-holding-credit-card-smartphone-paying-order-with-mobile-phone-standing-yellow-background_1258-93224.jpg?w=1380&t=st=1706441175~exp=1706441775~hmac=daf53df3a74b11c7abb0a3099d93afa158ed12b1d30ff6fdd5b84a390c4d8c44')
13
+ st.markdown('Sumber Gambar: Freepik')
14
+ st.markdown('---')
15
+
16
+ #EDA
17
+ st.markdown('# Exploratory Data Analysis')
18
+ st.markdown('## 1. Dataframe Credit Card Payment Log (BigQuery)')
19
+ st.markdown('Bagian ini bertujuan untuk menampilkan tabel (300 entri data teratas) yang telah digunakan untuk melatih model')
20
+ data = pd.read_csv('P1G5_Set_1_nicku_perdana.csv')
21
+ st.dataframe(data=data.head(300))
22
+ st.markdown('## 2. Distribusi data')
23
+ st.markdown('Bagian ini menampilkan informasi visualisasi seputar tabel bahan pelatihan model. ')
24
+ st.markdown('### 2A. Distribusi "limit_balance"')
25
+ canvas = plt.figure(figsize=(10,5))
26
+ sns.histplot(data=data, x=data['limit_balance'], kde=True).set(ylabel='Frekuensi')
27
+ st.pyplot(canvas)
28
+ st.markdown('Deskripsi: Grafik di atas menjelaskan sebaran distribusi limit kartu kredit yang dimiliki oleh nasabah dalam satuan USD.')
29
+
30
+ st.markdown('### 2B. Distribusi "sex"')
31
+ canvas = plt.figure(figsize=(10,5))
32
+ sns.countplot(data=data, x=data['sex']).set(ylabel='Frekuensi')
33
+ st.pyplot(canvas)
34
+ st.markdown('Deskripsi: Grafik di atas menjelaskan komposisi nasabah berdasarkan jenis kelamin dengan legenda berupa 1=laki-laki, 2=perempuan.')
35
+
36
+ st.markdown('### 2C. Distribusi "education_level"')
37
+ canvas = plt.figure(figsize=(10,5))
38
+ sns.countplot(data=data, x=data['education_level']).set(ylabel='Frekuensi')
39
+ st.pyplot(canvas)
40
+ st.markdown('Deskripsi: Grafik di atas menjelaskan komposisi nasabah berdasarkan jenjang pendidikan yang ditempuh terakhir kali dengan legenda berupa 0=lainnya, 1=Pascasarjana, 2=Sekolah Tinggi/Universitas, 3=Sekolah Menengah, 4=lainnya, 5=lainnya, 6=lainnya.')
41
+
42
+ st.markdown('### 2D. Distribusi "marital_status"')
43
+ canvas = plt.figure(figsize=(10,5))
44
+ sns.countplot(data=data, x=data['marital_status']).set(ylabel='Frekuensi')
45
+ st.pyplot(canvas)
46
+ st.markdown('Deskripsi: Grafik di atas menjelaskan komposisi nasabah berdasarkan status perkawinan dengan legenda berupa 0=lainnya, 1=menikah, 2=lajang, 3=cerai.')
47
+
48
+ st.markdown('### 2E. Distribusi "age"')
49
+ canvas = plt.figure(figsize=(10,5))
50
+ sns.histplot(data=data, x=data['age'], kde=True).set(ylabel='Frekuensi')
51
+ st.pyplot(canvas)
52
+ st.markdown('Deskripsi: Grafik di atas menjelaskan sebaran distribusi usia nasabah.')
53
+
54
+ st.markdown('### 2F. Distribusi Status Pembayaran')
55
+
56
+ opsiPay = st.selectbox(
57
+ 'Pilih status berdasarkan periodenya.', # judulnya
58
+ ('pay_0', 'pay_2', 'pay_3', 'pay_4', 'pay_5', 'pay_6'),# daftar opsinya
59
+ index=None, placeholder='Pilih periode...' )
60
+ if opsiPay != None:
61
+ st.markdown(f'#### Distribusi "{opsiPay}"')
62
+ canvas = plt.figure(figsize=(10,5))
63
+ sns.countplot(data=data, x=data[opsiPay]).set(ylabel='Frekuensi')
64
+ st.pyplot(canvas)
65
+ st.markdown(f'Deskripsi: Grafik di atas menjelaskan komposisi nasabah berdasarkan status pembayaran pada periode {opsiPay} dengan legenda berupa -2=Tagihan lunas dan tidak ada transaksi (inactive), -1=Tagihan lunas; ada transaksi yang belum dibayarkan karena tagihan belum muncul, 0=Tagihan kartu kredit telah dibayarkan jumlah minimal, 1=Terlambat bayar 1 bulan, 2=Terlambat bayar 2 bulan, 3=Terlambat bayar 3 bulan, 4=Terlambat bayar 4 bulan, 5=Terlambat bayar 5 bulan, 6=Terlambat bayar 6 bulan, 7=Terlambat bayar 7 bulan, 8=Terlambat bayar 8 bulan, 9=Terlambat bayar 9 bulan.')
66
+
67
+ st.markdown('### 2G. Distribusi Jumlah Tagihan Kartu Kredit')
68
+
69
+ opsiBillAmt = st.selectbox(
70
+ 'Pilih periode tagihan.', # judulnya
71
+ ('bill_amt_0', 'bill_amt_2', 'bill_amt_3', 'bill_amt_4', 'bill_amt_5', 'bill_amt_6'),# daftar opsinya
72
+ index=None, placeholder='Pilih periode...' )
73
+ if opsiBillAmt != None:
74
+ st.markdown(f'#### Distribusi "{opsiBillAmt}"')
75
+ canvas = plt.figure(figsize=(10,5))
76
+ sns.histplot(data=data, x=data[opsiBillAmt], kde=True).set(ylabel='Frekuensi')
77
+ st.pyplot(canvas)
78
+ st.markdown(f'Deskripsi: GDeskripsi: Grafik di atas menjelaskan sebaran tagihan kartu kredit nasabah pada periode {opsiBillAmt} dalam satuan USD.')
79
+
80
+ st.markdown('### 2H. Distribusi Jumlah Tagihan Kartu Kredit yang Terbayarkan')
81
+
82
+ opsiPayAmt = st.selectbox(
83
+ 'Pilih periode tagihan.', # judulnya
84
+ ('pay_amt_0', 'pay_amt_2', 'pay_amt_3', 'pay_amt_4', 'pay_amt_5', 'pay_amt_6'),# daftar opsinya
85
+ index=None, placeholder='Pilih periode...' )
86
+ if opsiPayAmt != None:
87
+ st.markdown(f'#### Distribusi "{opsiPayAmt}"')
88
+ canvas = plt.figure(figsize=(10,5))
89
+ sns.histplot(data=data, x=data[opsiPayAmt], kde=True).set(ylabel='Frekuensi')
90
+ st.pyplot(canvas)
91
+ st.markdown(f'Deskripsi: GDeskripsi: Grafik di atas menjelaskan sebaran tagihan kartu kredit nasabah yang telah terbayarkan pada periode {opsiPayAmt} dalam satuan USD.')
92
+
93
+ st.markdown('### 2I. Distribusi "default_payment_next_month"')
94
+ canvas = plt.figure(figsize=(10,5))
95
+ sns.countplot(data=data, x=data['default_payment_next_month']).set(ylabel='Frekuensi')
96
+ st.pyplot(canvas)
97
+ st.markdown('Deskripsi: Grafik di atas menjelaskan komposisi nasabah berdasarkan status pembayaran kartu kredit dengan legenda berupa 0=kredit lancar, 1=gagal bayar.')
98
+
99
+ if __name__ == '__main__':
100
+ run()
model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4287dd45ae70d1497e3fac7de91fa3de81260c19048da1115163343edfc6ec47
3
+ size 149996
model.py ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+
4
+ import pickle
5
+
6
+ with open('model.pkl', 'rb') as file_1:
7
+ model = pickle.load(file_1)
8
+
9
+ def run():
10
+ st.title('Default Credit Card Payment Prediction') # judul streamlit
11
+ st.markdown('Model ini bertujuan untuk memprediksi status pembayaran seseorang di bulan mendatang dengan simbol 1=gagal bayar dan 0=kredit lancar.')
12
+ st.markdown('Model dikelola oleh Nicku R. Perdana (HCK-012)')
13
+ st.image('https://img.freepik.com/free-photo/online-shopping-cheerful-asian-girl-holding-credit-card-smartphone-paying-order-with-mobile-phone-standing-yellow-background_1258-93224.jpg?w=1380&t=st=1706441175~exp=1706441775~hmac=daf53df3a74b11c7abb0a3099d93afa158ed12b1d30ff6fdd5b84a390c4d8c44')
14
+ st.markdown('Sumber Gambar: Freepik')
15
+ st.markdown('---')
16
+
17
+ st.markdown('# Prediksi Pembayaran')
18
+ st.markdown('## A. Input Data')
19
+ with st.form('myForm'):
20
+ limitBalance = st.number_input('Limit saldo kartu kredit saat ini:', min_value=10000, max_value=800000, step=1)
21
+ sex = st.slider('Jenis kelamin \n(1=Laki-laki; 2=Perempuan)', min_value=1, max_value=2, step=1)
22
+ educationLevel = st.number_input('Tingkat pendidikan terakhir (0=Lainnya; 1=Pascasarjana, 2=Universitas; 3=Sekolah Menengah; 4=Lainnya; 5=Lainnya; 6=Lainnya):', min_value=0, max_value=6, step=1)
23
+ maritalStatus = st.number_input('Status perkawinan (0=Lainnya; 1=Menikah; 2=Lajang, 3=Cerai):', min_value=0, max_value=3, step=1)
24
+ age = st.slider('Usia', min_value=21, max_value=69)
25
+
26
+ pay0 = st.number_input('Status pembayaran di bulan September (-2=Tagihan lunas dan tidak ada transaksi (inactive); -1=Tagihan lunas dan ada transaksi yang belum dibayarkan karena tagihan belum muncul; 0=Tagihan kartu kredit telah dibayarkan jumlah minimal; 1=Terlambat bayar 1 bulan; 2=Terlambat bayar 2 bulan; 3=Terlambat bayar 3 bulan; 4=Terlambat bayar 4 bulan; 5=Terlambat bayar 5 bulan; 6=Terlambat bayar 6 bulan; 7=Terlambat bayar 7 bulan; 8=Terlambat bayar 8 bulan; 9=Terlambat bayar 9 bulan):', min_value=-2, max_value=9, step=1)
27
+ pay2 = st.number_input('Status pembayaran di bulan Agustus (-2=Tagihan lunas dan tidak ada transaksi (inactive); -1=Tagihan lunas dan ada transaksi yang belum dibayarkan karena tagihan belum muncul; 0=Tagihan kartu kredit telah dibayarkan jumlah minimal; 1=Terlambat bayar 1 bulan; 2=Terlambat bayar 2 bulan; 3=Terlambat bayar 3 bulan; 4=Terlambat bayar 4 bulan; 5=Terlambat bayar 5 bulan; 6=Terlambat bayar 6 bulan; 7=Terlambat bayar 7 bulan; 8=Terlambat bayar 8 bulan; 9=Terlambat bayar 9 bulan):', min_value=-2, max_value=9, step=1)
28
+ pay3 = st.number_input('Status pembayaran di bulan Juli (-2=Tagihan lunas dan tidak ada transaksi (inactive); -1=Tagihan lunas dan ada transaksi yang belum dibayarkan karena tagihan belum muncul; 0=Tagihan kartu kredit telah dibayarkan jumlah minimal; 1=Terlambat bayar 1 bulan; 2=Terlambat bayar 2 bulan; 3=Terlambat bayar 3 bulan; 4=Terlambat bayar 4 bulan; 5=Terlambat bayar 5 bulan; 6=Terlambat bayar 6 bulan; 7=Terlambat bayar 7 bulan; 8=Terlambat bayar 8 bulan; 9=Terlambat bayar 9 bulan):', min_value=-2, max_value=9, step=1)
29
+ pay4 = st.number_input('Status pembayaran di bulan Juni (-2=Tagihan lunas dan tidak ada transaksi (inactive); -1=Tagihan lunas dan ada transaksi yang belum dibayarkan karena tagihan belum muncul; 0=Tagihan kartu kredit telah dibayarkan jumlah minimal; 1=Terlambat bayar 1 bulan; 2=Terlambat bayar 2 bulan; 3=Terlambat bayar 3 bulan; 4=Terlambat bayar 4 bulan; 5=Terlambat bayar 5 bulan; 6=Terlambat bayar 6 bulan; 7=Terlambat bayar 7 bulan; 8=Terlambat bayar 8 bulan; 9=Terlambat bayar 9 bulan):', min_value=-2, max_value=9, step=1)
30
+ pay5 = st.number_input('Status pembayaran di bulan Mei (-2=Tagihan lunas dan tidak ada transaksi (inactive); -1=Tagihan lunas dan ada transaksi yang belum dibayarkan karena tagihan belum muncul; 0=Tagihan kartu kredit telah dibayarkan jumlah minimal; 1=Terlambat bayar 1 bulan; 2=Terlambat bayar 2 bulan; 3=Terlambat bayar 3 bulan; 4=Terlambat bayar 4 bulan; 5=Terlambat bayar 5 bulan; 6=Terlambat bayar 6 bulan; 7=Terlambat bayar 7 bulan; 8=Terlambat bayar 8 bulan; 9=Terlambat bayar 9 bulan):', min_value=-2, max_value=9, step=1)
31
+ pay6 = st.number_input('Status pembayaran di bulan April (-2=Tagihan lunas dan tidak ada transaksi (inactive); -1=Tagihan lunas dan ada transaksi yang belum dibayarkan karena tagihan belum muncul; 0=Tagihan kartu kredit telah dibayarkan jumlah minimal; 1=Terlambat bayar 1 bulan; 2=Terlambat bayar 2 bulan; 3=Terlambat bayar 3 bulan; 4=Terlambat bayar 4 bulan; 5=Terlambat bayar 5 bulan; 6=Terlambat bayar 6 bulan; 7=Terlambat bayar 7 bulan; 8=Terlambat bayar 8 bulan; 9=Terlambat bayar 9 bulan):', min_value=-2, max_value=9, step=1)
32
+
33
+ billAmt1 = st.number_input('Tagihan untuk bulan September:', min_value=-11545, max_value=613860, step=1, placeholder=0)
34
+ billAmt2 = st.number_input('Tagihan untuk bulan Agustus:', min_value=-67526, max_value=512650, step=1, placeholder=0)
35
+ billAmt3 = st.number_input('Tagihan untuk bulan Juli:', min_value=-25443, max_value=578971, step=1, placeholder=0)
36
+ billAmt4 = st.number_input('Tagihan untuk bulan Juni:', min_value=-46627, max_value=488808, step=1, placeholder=0)
37
+ billAmt5 = st.number_input('Tagihan untuk bulan Mei:', min_value=-46627, max_value=488808, step=1, placeholder=0)
38
+ billAmt6 = st.number_input('Tagihan untuk bulan April:', min_value=-73895, max_value=441981, step=1, placeholder=0)
39
+
40
+ payAmt1 = st.number_input('Tagihan yang dibayar pada bulan September:', min_value=0, max_value=493358, step=1)
41
+ payAmt2 = st.number_input('Tagihan yang dibayar pada bulan Agustus:', min_value=0, max_value=1227082, step=1)
42
+ payAmt3 = st.number_input('Tagihan yang dibayar pada bulan Juli:', min_value=0, max_value=199209, step=1)
43
+ payAmt4 = st.number_input('Tagihan yang dibayar pada bulan Juni:', min_value=0, max_value=202076, step=1)
44
+ payAmt5 = st.number_input('Tagihan yang dibayar pada bulan Mei:', min_value=0, max_value=388071, step=1)
45
+ payAmt6 = st.number_input('Tagihan yang dibayar pada bulan April:', min_value=0, max_value=403500, step=1)
46
+
47
+ submit = st.form_submit_button('Prediksikan!')
48
+
49
+ data = {'limit_balance': limitBalance,
50
+ 'sex': sex,
51
+ 'education_level': educationLevel,
52
+ 'marital_status': maritalStatus,
53
+ 'age': age,
54
+ 'pay_0': pay0,
55
+ 'pay_2': pay2,
56
+ 'pay_3': pay3,
57
+ 'pay_4': pay4,
58
+ 'pay_5': pay5,
59
+ 'pay_6': pay6,
60
+ 'bill_amt_1': billAmt1,
61
+ 'bill_amt_2': billAmt2,
62
+ 'bill_amt_3': billAmt3,
63
+ 'bill_amt_4': billAmt4,
64
+ 'bill_amt_5': billAmt5,
65
+ 'bill_amt_6': billAmt6,
66
+ 'pay_amt_1': payAmt1,
67
+ 'pay_amt_2': payAmt2,
68
+ 'pay_amt_3': payAmt3,
69
+ 'pay_amt_4': payAmt4,
70
+ 'pay_amt_5': payAmt5,
71
+ 'pay_amt_6': payAmt6,
72
+ }
73
+
74
+ df = pd.DataFrame(data=[data])
75
+ st.markdown('## B. Preview Input')
76
+ st.dataframe(df)
77
+
78
+ st.markdown('## C. Hasil Prediksi')
79
+
80
+ if submit:
81
+ classification = model.predict(df)
82
+ if classification != 1:
83
+ st.write('Anda masih dalam kategori kreditur dengan kredit lancar. Pertahankan dengan selalu tepat waktu dalam melunasi tagihan anda secara rutin.')
84
+ else:
85
+ st.write('Maaf. Anda berpotensi gagal bayar di periode berikutnya dan berisiko terputus dengan layanan kami. Hindari risiko gagal bayar dengan selalu rutin dan disiplin dalam melunasi tagihan Anda setiap saat.')
86
+
87
+ if __name__ == '__main__':
88
+ run()
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ pandas
2
+ seaborn
3
+ matplotlib
4
+ pickle
5
+ scikit-learn==1.3.0