import streamlit as st import pandas as pd import joblib import numpy as np import matplotlib.pyplot as plt import seaborn as sns from imblearn.pipeline import Pipeline as imbpipe APP_ICON_URL = "credit-card.png" # Setup web page st.set_page_config( page_title="CREDIT CARD APPROVAL APP", page_icon=APP_ICON_URL, layout="wide", ) st.markdown(""" """, unsafe_allow_html=True) with st.container(): col1,col2,_,_ = st.columns([1,14,1,1],gap="large") with col1: st.image(APP_ICON_URL, width=80) with col2: st.header(f"Credit Card Prediction App") st.caption(f"App developed by [Alsello](https://github.com/AlselloDM)") st.write(f"This application predicts whether your credit card application is **Approved** or **Not Approved**.") st.markdown("___") @st.cache_data def fetch_data(): df = pd.read_csv('Application_Data.csv') return df df = fetch_data() st.sidebar.title("Approval App ๐Ÿ“‹") st.sidebar.write('Please choose the page') #make two pages for EDA and Prediction page = st.sidebar.selectbox('Choose a page', ['EDA', 'Approval Form๐Ÿ“‹']) if page == 'EDA': st.subheader('Approval Status') st.write('Approval Status is the target variable with value of 0 (not approved) and 1 (approved).') sns.countplot(x='Status', data=df) plt.xticks([0, 1]) st.pyplot(plt) st.write('The data is imbalanced.') st.subheader('Correlation between Years Employed and Total Income') st.write('Years Employed and Total Income usually has correlation.') plt.figure(figsize=(8, 6)) plt.scatter(df['Years_of_Working'], df['Total_Income'], alpha=0.5) plt.xlabel('Years Employed') plt.ylabel('Total Income') plt.title('Correlation between Years Employed and Total Income') st.pyplot(plt) st.write('We can see that the longer the Years Employed, it does not increase the Total Income.') st.write('') st.subheader('Correlation of the Features') st.write("One of the many Feature Selection Methods is Pearson's Heatmap Correlation Method.") plt.figure(figsize=(15,15)) sns.heatmap(df.corr(), annot=True) plt.show() st.pyplot(plt) st.write("There are no good enough features to choose so I used another method called 'SelectKBest'.") st.write('') else: st.sidebar.title("Applicant's Profile") st.sidebar.write('Please enter the needed profile here') def user_input_features(): # Applicant ID id = st.number_input("ID of the applicant (7 Digits of your ID)") # Male or Female sex = st.selectbox('Gender',('M','F')) # Car Ownership car_ownership = st.selectbox('Car Ownership (1 : Yes | 0 : No)',(1,0)) # Property Ownership property_ownership = st.selectbox('Property Ownership (1 : Yes | 0 : No)',(1,0)) # Total Children total_children = st.slider('Number of Children?',0,5,0) # Income income = st.number_input('Yearly Income',27000,1575000) # Income Type income_type = st.selectbox("Employment Status",('Working','Commercial associate ','State servant','Pensioner','Student')) # Education Level education = st.selectbox("Education Level",('Lower secondary','Secondary / secondary special','Incomplete higher ','Higher education ','Academic degree')) # Marriage Status marriage_status = st.selectbox("Marriage Status",('Single / not married','Married','Civil marriage','Separated','Widow')) # Residence residence = st.selectbox('Residency',('House / apartment','With parents','Municipal apartment','Rented apartment','Office apartment','Co-op apartment')) # Mobile Phone Ownership mobile_phone = st.selectbox('Mobile Phone Ownership (1 : True | 0 : False)',(1,0)) # Work Phone Ownership work_phone = st.selectbox('Work Phone Ownership (1 : True | 0 : False)',(1,0)) # Phone Ownership phone = st.selectbox('Phone Ownership (1 : True | 0 : False)',(1,0)) # Email Ownership email = st.selectbox('Email Ownership (1 : True | 0 : False)',(1,0)) # Job Title job_title = st.selectbox('Job Title',('Laborers','Core staff','Sales staff','Managers','Drivers','High skill tech staff','Accountants','Medicine staff','Cooking staff','Security staff','Cleaning staff','Private service staff','Low-skill Laborers','Waiters/barmen staff','Secretaries','HR staff','Realty agents','IT staff')) # Total Family Member total_family = st.slider('Number of Family Member',1,7,1) # Applicant Age age = st.number_input("Age") # Years of Working years_of_working = st.number_input("Years of Work") # Total Bad Debt total_bad_debt = st.slider('Total of Bad Debt',0,49,0)\ # Total Good Debt total_good_debt = st.slider('Total of Good Debt',1,61,1) data = {'Applicant_ID': id,'Applicant_Gender':sex,'Owned_Car':car_ownership, 'Owned_Realty':property_ownership,'Total_Children':total_children, 'Total_Income':income,'Income_Type':income_type, 'Education_Type':education,'Family_Status':marriage_status, 'Housing_Type':residence,'Owned_Mobile_Phone':mobile_phone,'Owned_Work_Phone':work_phone, 'Owned_Phone':phone,'Owned_Email':email,'Job_Title':job_title,'Total_Family_Members':total_family, 'Applicant_Age':age,'Years_of_Working':years_of_working, 'Total_Bad_Debt':total_bad_debt,'Total_Good_Debt':total_good_debt} # features = pd.DataFrame(data,index=[0]) return features input_df = user_input_features() st.subheader('Applicant Data๐Ÿ“‹') st.write(input_df) load_model = joblib.load("model") if st.button('Predict'): try: prediction = load_model.predict(input_df) prediction_proba = load_model.predict_proba(input_df) st.subheader('APPROVAL') for i in range(len(prediction)): if prediction[i] == 0: st.error("This applicant is not **Approved**") else: st.success("This applicant is **Approved**") st.subheader('Probability') st.write("0 : No | 1 : Yes") st.write(prediction_proba) except ValueError: st.header("Insufficient Applicant Data")