Step1. Load libraries

library(ISLR)
library(ggplot2)
library(dplyr)
library(pROC)

Step2: Data Preprocessing

# Load the Default dataset from ISLR
data("Default")

# Preview the dataset
head(Default)

# Summary of the dataset
summary(Default)
 default    student       balance           income     
 No :9667   No :7056   Min.   :   0.0   Min.   :  772  
 Yes: 333   Yes:2944   1st Qu.: 481.7   1st Qu.:21340  
                       Median : 823.6   Median :34553  
                       Mean   : 835.4   Mean   :33517  
                       3rd Qu.:1166.3   3rd Qu.:43808  
                       Max.   :2654.3   Max.   :73554  
# Structure of the dataset
str(Default)
'data.frame':   10000 obs. of  4 variables:
 $ default: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ student: Factor w/ 2 levels "No","Yes": 1 2 1 1 1 2 1 2 1 1 ...
 $ balance: num  730 817 1074 529 786 ...
 $ income : num  44362 12106 31767 35704 38463 ...
# Convert target variable 'default' to a binary numeric variable (1 for 'Yes', 0 for 'No')
Default <- Default %>%
  mutate(default = ifelse(default == "Yes", 1, 0))

# Check the conversion
table(Default$default)

Step3:Train-Test split

# Set seed for reproducibility
set.seed(123)

# Split the dataset
train_idx <- sample(1:nrow(Default), 0.8 * nrow(Default))
train_data <- Default[train_idx, ]
test_data <- Default[-train_idx, ]

Step 4: Logistic Regression Model

# Train the logistic regression model
logit_model <- glm(
  default ~ balance + income + student,
  data = train_data,
  family = binomial(link = "logit")
)

# Summary of the model
summary(logit_model)

Step 5: Model Evaluation

# Make predictions on the test data
test_data$predicted_prob <- predict(logit_model, newdata = test_data, type = "response")

# Convert probabilities to binary predictions
test_data$predicted_class <- ifelse(test_data$predicted_prob > 0.5, 1, 0)

# Confusion Matrix
conf_matrix <- table(Predicted = test_data$predicted_class, Actual = test_data$default)
print(conf_matrix)
         Actual
Predicted    0    1
        0 1928   46
        1    6   20
# Calculate Accuracy
accuracy <- sum(diag(conf_matrix)) / sum(conf_matrix)
print(paste("Accuracy:", round(accuracy, 4)))
[1] "Accuracy: 0.974"
# Calculate AUC
roc_curve <- roc(test_data$default, test_data$predicted_prob)
Setting levels: control = 0, case = 1
Setting direction: controls < cases
auc_value <- auc(roc_curve)
print(paste("AUC:", round(auc_value, 4)))
[1] "AUC: 0.9458"
# Plot the ROC curve
plot(roc_curve, main = "ROC Curve", col = "blue", lwd = 2)

Step 6: Visualizing Results

# Visualize the relationship between balance and default
ggplot(Default, aes(x = balance, fill = factor(default))) +
  geom_histogram(binwidth = 500, position = "dodge") +
  labs(title = "Balance vs Default", x = "Balance", y = "Count", fill = "Default") +
  theme_minimal()


# Visualize the relationship between income and default
ggplot(Default, aes(x = income, fill = factor(default))) +
  geom_histogram(binwidth = 5000, position = "dodge") +
  labs(title = "Income vs Default", x = "Income", y = "Count", fill = "Default") +
  theme_minimal()

Observations: The model performs well, with high accuracy and AUC scores. Balance is the strongest predictor of default, with a clear separation between the two classes. Income shows a weaker relationship with default.

Conclusion:

This analysis demonstrates the application of logistic regression for credit risk prediction. The results indicate that the customer’s balance is the most significant factor in predicting default.

LS0tCnRpdGxlOiAiQ3JlZGl0IFJpc2sgQW5hbHlzaXMgdXNpbmcgSVNMUidzIERlZmF1bHQgRGF0YXNldCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKClN0ZXAxLiBMb2FkIGxpYnJhcmllcyAKYGBge3J9CmxpYnJhcnkoSVNMUikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHBST0MpCmBgYAoKU3RlcDI6IERhdGEgUHJlcHJvY2Vzc2luZyAKCmBgYHtyfQojIExvYWQgdGhlIERlZmF1bHQgZGF0YXNldCBmcm9tIElTTFIKZGF0YSgiRGVmYXVsdCIpCgojIFByZXZpZXcgdGhlIGRhdGFzZXQKaGVhZChEZWZhdWx0KQoKIyBTdW1tYXJ5IG9mIHRoZSBkYXRhc2V0CnN1bW1hcnkoRGVmYXVsdCkKCiMgU3RydWN0dXJlIG9mIHRoZSBkYXRhc2V0CnN0cihEZWZhdWx0KQoKYGBgCgoKYGBge3J9CiMgQ29udmVydCB0YXJnZXQgdmFyaWFibGUgJ2RlZmF1bHQnIHRvIGEgYmluYXJ5IG51bWVyaWMgdmFyaWFibGUgKDEgZm9yICdZZXMnLCAwIGZvciAnTm8nKQpEZWZhdWx0IDwtIERlZmF1bHQgJT4lCiAgbXV0YXRlKGRlZmF1bHQgPSBpZmVsc2UoZGVmYXVsdCA9PSAiWWVzIiwgMSwgMCkpCgojIENoZWNrIHRoZSBjb252ZXJzaW9uCnRhYmxlKERlZmF1bHQkZGVmYXVsdCkKYGBgCgoKU3RlcDM6VHJhaW4tVGVzdCBzcGxpdCAKYGBge3J9CiMgU2V0IHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eQpzZXQuc2VlZCgxMjMpCgojIFNwbGl0IHRoZSBkYXRhc2V0CnRyYWluX2lkeCA8LSBzYW1wbGUoMTpucm93KERlZmF1bHQpLCAwLjggKiBucm93KERlZmF1bHQpKQp0cmFpbl9kYXRhIDwtIERlZmF1bHRbdHJhaW5faWR4LCBdCnRlc3RfZGF0YSA8LSBEZWZhdWx0Wy10cmFpbl9pZHgsIF0KYGBgCgpTdGVwIDQ6IExvZ2lzdGljIFJlZ3Jlc3Npb24gTW9kZWwKYGBge3J9CiMgVHJhaW4gdGhlIGxvZ2lzdGljIHJlZ3Jlc3Npb24gbW9kZWwKbG9naXRfbW9kZWwgPC0gZ2xtKAogIGRlZmF1bHQgfiBiYWxhbmNlICsgaW5jb21lICsgc3R1ZGVudCwKICBkYXRhID0gdHJhaW5fZGF0YSwKICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikKKQoKIyBTdW1tYXJ5IG9mIHRoZSBtb2RlbApzdW1tYXJ5KGxvZ2l0X21vZGVsKQpgYGAKClN0ZXAgNTogTW9kZWwgRXZhbHVhdGlvbgoKYGBge3J9CiMgTWFrZSBwcmVkaWN0aW9ucyBvbiB0aGUgdGVzdCBkYXRhCnRlc3RfZGF0YSRwcmVkaWN0ZWRfcHJvYiA8LSBwcmVkaWN0KGxvZ2l0X21vZGVsLCBuZXdkYXRhID0gdGVzdF9kYXRhLCB0eXBlID0gInJlc3BvbnNlIikKCiMgQ29udmVydCBwcm9iYWJpbGl0aWVzIHRvIGJpbmFyeSBwcmVkaWN0aW9ucwp0ZXN0X2RhdGEkcHJlZGljdGVkX2NsYXNzIDwtIGlmZWxzZSh0ZXN0X2RhdGEkcHJlZGljdGVkX3Byb2IgPiAwLjUsIDEsIDApCgojIENvbmZ1c2lvbiBNYXRyaXgKY29uZl9tYXRyaXggPC0gdGFibGUoUHJlZGljdGVkID0gdGVzdF9kYXRhJHByZWRpY3RlZF9jbGFzcywgQWN0dWFsID0gdGVzdF9kYXRhJGRlZmF1bHQpCnByaW50KGNvbmZfbWF0cml4KQoKIyBDYWxjdWxhdGUgQWNjdXJhY3kKYWNjdXJhY3kgPC0gc3VtKGRpYWcoY29uZl9tYXRyaXgpKSAvIHN1bShjb25mX21hdHJpeCkKcHJpbnQocGFzdGUoIkFjY3VyYWN5OiIsIHJvdW5kKGFjY3VyYWN5LCA0KSkpCgojIENhbGN1bGF0ZSBBVUMKcm9jX2N1cnZlIDwtIHJvYyh0ZXN0X2RhdGEkZGVmYXVsdCwgdGVzdF9kYXRhJHByZWRpY3RlZF9wcm9iKQphdWNfdmFsdWUgPC0gYXVjKHJvY19jdXJ2ZSkKcHJpbnQocGFzdGUoIkFVQzoiLCByb3VuZChhdWNfdmFsdWUsIDQpKSkKCiMgUGxvdCB0aGUgUk9DIGN1cnZlCnBsb3Qocm9jX2N1cnZlLCBtYWluID0gIlJPQyBDdXJ2ZSIsIGNvbCA9ICJibHVlIiwgbHdkID0gMikKYGBgClN0ZXAgNjogVmlzdWFsaXppbmcgUmVzdWx0cwoKYGBge3J9CiMgVmlzdWFsaXplIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBiYWxhbmNlIGFuZCBkZWZhdWx0CmdncGxvdChEZWZhdWx0LCBhZXMoeCA9IGJhbGFuY2UsIGZpbGwgPSBmYWN0b3IoZGVmYXVsdCkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDAsIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGxhYnModGl0bGUgPSAiQmFsYW5jZSB2cyBEZWZhdWx0IiwgeCA9ICJCYWxhbmNlIiwgeSA9ICJDb3VudCIsIGZpbGwgPSAiRGVmYXVsdCIpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgVmlzdWFsaXplIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbmNvbWUgYW5kIGRlZmF1bHQKZ2dwbG90KERlZmF1bHQsIGFlcyh4ID0gaW5jb21lLCBmaWxsID0gZmFjdG9yKGRlZmF1bHQpKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwMCwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgbGFicyh0aXRsZSA9ICJJbmNvbWUgdnMgRGVmYXVsdCIsIHggPSAiSW5jb21lIiwgeSA9ICJDb3VudCIsIGZpbGwgPSAiRGVmYXVsdCIpICsKICB0aGVtZV9taW5pbWFsKCkKCmBgYApPYnNlcnZhdGlvbnM6ClRoZSBtb2RlbCBwZXJmb3JtcyB3ZWxsLCB3aXRoIGhpZ2ggYWNjdXJhY3kgYW5kIEFVQyBzY29yZXMuCkJhbGFuY2UgaXMgdGhlIHN0cm9uZ2VzdCBwcmVkaWN0b3Igb2YgZGVmYXVsdCwgd2l0aCBhIGNsZWFyIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgdHdvIGNsYXNzZXMuCkluY29tZSBzaG93cyBhIHdlYWtlciByZWxhdGlvbnNoaXAgd2l0aCBkZWZhdWx0LgoKQ29uY2x1c2lvbjoKClRoaXMgYW5hbHlzaXMgZGVtb25zdHJhdGVzIHRoZSBhcHBsaWNhdGlvbiBvZiBsb2dpc3RpYyByZWdyZXNzaW9uIGZvciBjcmVkaXQgcmlzayBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lcidzIGJhbGFuY2UgaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZmFjdG9yIGluIHByZWRpY3RpbmcgZGVmYXVsdC4=