nickuperdana
commited on
Commit
•
27752c7
1
Parent(s):
68e7f67
commit initial model deploy
Browse filesupload first version of the model
- P1G5_Set_1_nicku_perdana.csv +0 -0
- app.py +10 -0
- eda.py +100 -0
- model.pkl +3 -0
- model.py +88 -0
- 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
|