import pandas as pd

import numpy as np

import statsmodels.formula.api as smf

import statsmodels.api as sm

from statsmodels.stats.outliers_influence import variance_inflation_factor

from sklearn.metrics import confusion_matrix

from sklearn.metrics import classification_report

bankloan = pd.read_csv("BANK LOAN.csv")

bankloan.columns = bankloan.columns.str.strip()

model_columns = ["DEFAULTER", "AGE", "EMPLOY", "ADDRESS", "DEBTINC", "CREDDEBT", "OTHDEBT"]

bankloan[model_columns] = bankloan[model_columns].apply(pd.to_numeric, errors="coerce")

bankloan = bankloan.dropna(subset=model_columns).copy()

if set(bankloan["DEFAULTER"].unique()) != {0, 1}:
    raise ValueError("DEFAULTER must contain both classes, encoded as 0 and 1.")

bankloan.head()

bankloan.info()

bankloan['AGE'] = bankloan['AGE'].astype('category')

bankloan.info()

riskmodel = smf.logit(formula = 'DEFAULTER ~ AGE + EMPLOY + ADDRESS + DEBTINC + CREDDEBT + OTHDEBT', data = bankloan).fit()

riskmodel.summary()

bankloan['DEFAULTER'].value_counts(normalize = True)

from patsy import dmatrices

y, X = dmatrices('DEFAULTER ~ AGE + EMPLOY + ADDRESS + DEBTINC + CREDDEBT + OTHDEBT', data=bankloan, return_type='dataframe')

vif_data = pd.DataFrame()

vif_data["Feature"] = X.columns

vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]

print(vif_data)

riskmodel2 = smf.logit(formula = 'DEFAULTER ~ EMPLOY + ADDRESS + DEBTINC + CREDDEBT', data = bankloan).fit()

print(riskmodel2.summary())

bankloan['Pred'] = riskmodel2.predict()

bankloan.head()

from sklearn.metrics import roc_curve, auc

fpr, tpr, thresholds = roc_curve(bankloan['DEFAULTER'], bankloan['Pred'])

roc_auc = auc(fpr, tpr)

import matplotlib.pyplot as plt

plt.figure()

lw = 2

plt.plot(fpr, tpr, color='darkorange', lw=lw,
         label='ROC curve (area = %0.2f)' % roc_auc)

plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')

plt.xlim([0.0, 1.0])

plt.ylim([0.0, 1.05])

plt.xlabel('False Positive Rate')

plt.ylabel('True Positive Rate')

plt.title('Receiver operating characteristic')

plt.legend(loc="lower right")

plt.show()

bankloan['Pred_class'] = np.where(bankloan['Pred'] >= 0.5, 1, 0)

cm1 = confusion_matrix(bankloan['DEFAULTER'], bankloan['Pred_class'], labels=[0, 1])

cm1

sensitivity = cm1[1,1] / (cm1[1,1] + cm1[1,0])

print(f'Sensitivity: {sensitivity.round(3)}')

specificity = cm1[0,0] / (cm1[0,0] + cm1[0,1])

print(f'Specificity: {specificity.round(3)}')

print(classification_report(bankloan['DEFAULTER'], bankloan['Pred_class'], zero_division=0))
