Wstęp

Opis problemu

Celem niniejszego opracowania jest budowa klasyfikatora, który pozwoli możliwie dokładnie przewidzieć decyzję dotyczącą przyznania pożyczki klientom pewnej firmy pożyczkowej.

Baza danych

Podstawą analizy jest baza danych klientów firmy pożyczkowej.

# Wczytanie danych
pozyczki <- read.csv("pozyczki.csv", na.strings = "")
dane<-data.frame(pozyczki)
head(dane[1:13],4)
##    Loan_ID Gender Married Dependents    Education Self_Employed ApplicantIncome CoapplicantIncome LoanAmount Loan_Amount_Term Credit_History
## 1 LP001002   Male      No          0     Graduate            No            5849                 0         NA              360              1
## 2 LP001003   Male     Yes          1     Graduate            No            4583              1508        128              360              1
## 3 LP001005   Male     Yes          0     Graduate           Yes            3000                 0         66              360              1
## 4 LP001006   Male     Yes          0 Not Graduate            No            2583              2358        120              360              1
##   Property_Area Loan_Status
## 1         Urban           Y
## 2         Rural           N
## 3         Urban           Y
## 4         Urban           Y
str(dane)
## 'data.frame':    614 obs. of  13 variables:
##  $ Loan_ID          : chr  "LP001002" "LP001003" "LP001005" "LP001006" ...
##  $ Gender           : chr  "Male" "Male" "Male" "Male" ...
##  $ Married          : chr  "No" "Yes" "Yes" "Yes" ...
##  $ Dependents       : chr  "0" "1" "0" "0" ...
##  $ Education        : chr  "Graduate" "Graduate" "Graduate" "Not Graduate" ...
##  $ Self_Employed    : chr  "No" "No" "Yes" "No" ...
##  $ ApplicantIncome  : int  5849 4583 3000 2583 6000 5417 2333 3036 4006 12841 ...
##  $ CoapplicantIncome: num  0 1508 0 2358 0 ...
##  $ LoanAmount       : int  NA 128 66 120 141 267 95 158 168 349 ...
##  $ Loan_Amount_Term : int  360 360 360 360 360 360 360 360 360 360 ...
##  $ Credit_History   : int  1 1 1 1 1 1 1 0 1 1 ...
##  $ Property_Area    : chr  "Urban" "Rural" "Urban" "Urban" ...
##  $ Loan_Status      : chr  "Y" "N" "Y" "Y" ...

Czyszcznie danych

Zmienne

# Nazwy zmiennych objaśniających
data.frame(zmienna = names(dane)[2:12])
##              zmienna
## 1             Gender
## 2            Married
## 3         Dependents
## 4          Education
## 5      Self_Employed
## 6    ApplicantIncome
## 7  CoapplicantIncome
## 8         LoanAmount
## 9   Loan_Amount_Term
## 10    Credit_History
## 11     Property_Area

Pierwsza kolumna w bazie danych (Loan_ID) określa numer identyfikacyjny, ją możemy pominąć.

# Usunięcie pierwszej kolumny i dodatnie kolumny pomocniczej
dane <- dane %>%
  select(-1)
dane$TotalIncome <- rowSums(dane[, c("ApplicantIncome", "CoapplicantIncome")], na.rm = TRUE)
dane <- dane %>%
  mutate(ID = 1:n())

#Walidacja danych

#Walidacja danych
rules <- validator(
  ApplicantIncome + CoapplicantIncome == TotalIncome
  , Gender %in% c("Male", "Female")
  , Married %in% c("Yes", "No")
  , Self_Employed %in% c("Yes", "No")
  , Loan_Status %in% c("Y", "N")
  , Credit_History %in% c("0", "1")
  , LoanAmount >=0
  , Loan_Amount_Term > 0
  , ApplicantIncome >= 0
)

cf <- confront(dane, rules, key="ID")
summary(cf)
##   name items passes fails nNA error warning                                                      expression
## 1   V1   614    614     0   0 FALSE   FALSE abs(ApplicantIncome + CoapplicantIncome - TotalIncome) <= 1e-08
## 2   V2   614    601     0  13 FALSE   FALSE                                Gender %vin% c("Male", "Female")
## 3   V3   614    611     0   3 FALSE   FALSE                                    Married %vin% c("Yes", "No")
## 4   V4   614    582     0  32 FALSE   FALSE                              Self_Employed %vin% c("Yes", "No")
## 5   V5   614    614     0   0 FALSE   FALSE                                   Loan_Status %vin% c("Y", "N")
## 6   V6   614    564     0  50 FALSE   FALSE                                Credit_History %vin% c("0", "1")
## 7   V7   614    592     0  22 FALSE   FALSE                                        LoanAmount - 0 >= -1e-08
## 8   V8   614    600     0  14 FALSE   FALSE                                            Loan_Amount_Term > 0
## 9   V9   614    614     0   0 FALSE   FALSE                                   ApplicantIncome - 0 >= -1e-08
barplot(cf, main="dane")
## Warning: The 'barplot' method for confrontation objects is deprecated. Use 'plot' instead

as.data.frame(cf) %>% head()
##   ID name value                                                      expression
## 1  1   V1  TRUE abs(ApplicantIncome + CoapplicantIncome - TotalIncome) <= 1e-08
## 2  2   V1  TRUE abs(ApplicantIncome + CoapplicantIncome - TotalIncome) <= 1e-08
## 3  3   V1  TRUE abs(ApplicantIncome + CoapplicantIncome - TotalIncome) <= 1e-08
## 4  4   V1  TRUE abs(ApplicantIncome + CoapplicantIncome - TotalIncome) <= 1e-08
## 5  5   V1  TRUE abs(ApplicantIncome + CoapplicantIncome - TotalIncome) <= 1e-08
## 6  6   V1  TRUE abs(ApplicantIncome + CoapplicantIncome - TotalIncome) <= 1e-08

Po zwalidowaniu danych nie występują żadne błędy. Można jedynie zauważyć, że w niektórych zmiennych występują braki danych.

#Usunięcie wierszy zawierających NA 

dane1 <- na.omit(dane)

Zdecydowaliśmy się na usunięcie wierszy zawierających braki (NA); braki występowały głównie w zmiennych jakościowych. Zastąpienie NA losowymi wartościami mogłoby negatywnie wpłynąć na wynik analizy.

#Brakujące obserwacje 
sum(is.na(dane1))
## [1] 0

##Obserwacje odstające

boxplot(dane1$ApplicantIncome, main="Rozkład Wartości Przychodów Klientów")

boxplot(dane1$LoanAmount, main="Rozkład Wartości Wielkości Kwoty Pożyczki")

plot(dane1$LoanAmount)

boxplot(dane1$LoanAmount ~ dane1$Credit_History, main="Rozkład Wartości wysokości pożyczki w zależności od histori kredytowej'", xlab="Credit_History", ylab="LoanAmount")

boxplot(dane1$TotalIncome ~ dane1$Loan_Status, main="Rozkład Wartości statusu uznania pozyczki do wielkości całego przychodu'", ylab="TotalIncome", xlab="Loan_Status")

Wielkości całego przychodu dla większości zminnych są w przedziale <44000. Występuje natomiast jedna wartość odstająca, która nas niepokoi i może wplywać negatywnie na wynik analizy. Dla efektywniejszej analizy zdecydowaliśmy się usunąć zmienną odstającą, ID = 410.

##Usunięcie zmiennej odstającej

dane1 <- dane1[dane1$ID != 410, ]
boxplot(dane1$TotalIncome ~ dane1$Loan_Status, main="Rozkład Wartości statusu uznania pozyczki do wielkości całego przychodu'", ylab="TotalIncome", xlab="Loan_Status")

Po usunięciu odstającej zmiennej dane są bardziej spójne.

dane <- dane1

Wizaulizacja danych

Decyzja pożyczkowa

Zmienna Loan_Status to zmienna jakościowa wyrażona na skali nominalnej.

tab <- as.data.frame(100*prop.table(table(dane$Loan_Status)))
ggplot(tab, aes(x = Var1, y = Freq)) + 
  geom_col(fill = "#FFFF99", colour = "black") +
  geom_text(aes(label = paste0(round(Freq,1),"%")), 
            stat = "identity", size = 5, 
            fontface = "bold", position = position_stack(vjust = 0.5)) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  labs(title = "Decyzja pożyczkowa",
       y = "%")

Większośc wnioskujących uzyskała pozytywna decyzję pożyczkową, prawie 70%.

Płeć

tab <- as.data.frame(100*prop.table(table(dane$Gender)))
ggplot(tab, aes(x = Var1, y = Freq)) + 
  geom_col(fill = "#FFFF99", colour = "black") +
  geom_text(aes(label = paste0(round(Freq,1),"%")), 
            stat = "identity", size = 4, 
            fontface = "bold", position = position_stack(vjust = 0.5)) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  labs(title = "Płeć",
       y = "%")

Dominującą grupę wnioskujących stanowili mężczyźni. Zaledwie 18% wniosków złożyły kobiety.

ggplot(dane, aes(x = Loan_Status, fill = Gender)) +
  geom_bar(position = "stack") +
  geom_text(stat = "count", aes(label = ..count.., y = ..count..),
            position = position_stack(vjust = 0.5), size = 4, fontface = "bold") +
  scale_fill_manual(values = c("Female" = "red", "Male" = "lightblue")) +
  labs(title = "Decyzja pożyczkowa a Płeć", y = "Liczba decyzji", x = "Decyzja pożyczkowa", fill = "Płeć") +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  facet_wrap(~Gender, scales = "free_x")
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.

Z wykresu można zaobserwować, że pomimo liczniejszej grupy meżczyzn to oni w większym stopniu dostawali pozytywną decyzję.

Małżeństwo

tab <- as.data.frame(100*prop.table(table(dane$Married)))
ggplot(tab, aes(x = Var1, y = Freq)) + 
  geom_col(fill = "#FFFF99", colour = "black") +
  geom_text(aes(label = paste0(round(Freq,1),"%")), 
            stat = "identity", size = 4, 
            fontface = "bold", position = position_stack(vjust = 0.5)) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  labs(title = "Małżeństwo",
       y = "%")

Zdecydowana większość wnioskujących to osoby w związku małżeńskim.

filtered_data <- dane[dane$Loan_Status == "Y", ]

tab <- as.data.frame(100*prop.table(table(filtered_data$Married)))
ggplot(tab, aes(x = Var1, y = Freq)) + 
  geom_col(fill = "#FFFF99", colour = "black") +
  geom_text(aes(label = paste0(round(Freq,1),"%")), 
            stat = "identity", size = 4, 
            fontface = "bold", position = position_stack(vjust = 0.5)) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  labs(title = "Małżeństwo",
       y = "%")

Filtrując na osoby, które otrzymały pozytywną decyzję pożyczkowa dominują osoby w związu małżeńskim. Co ciekawe przy filtrze pozytywna decyzja pożyczkowa urósł procent udziału osób w związku małżeńskim co może znaczyć, że osoby z tym statusem z większym prawdopodobieństwem mogą otrzymać pożyczkę.

Osoby na utrzymaniu

tab <- as.data.frame(100*prop.table(table(dane$Dependents)))
ggplot(tab, aes(x = Var1, y = Freq)) + 
  geom_col(fill = "#FFFF99", colour = "black") +
  geom_text(aes(label = paste0(round(Freq,1),"%")), 
            stat = "identity", size = 3, 
            fontface = "bold", position = position_stack(vjust = 0.5)) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  labs(title = "Oosby na utrzymaniu",
       y = "%")

Dominującą grupą są osoby, które poza sobą nie mają nikogo na utrzymaniu.

Edukacja

tab <- as.data.frame(100*prop.table(table(dane$Education)))
ggplot(tab, aes(x = Var1, y = Freq)) + 
  geom_col(fill = "#FFFF99", colour = "black") +
  geom_text(aes(label = paste0(round(Freq,1),"%")), 
            stat = "identity", size = 4, 
            fontface = "bold", position = position_stack(vjust = 0.5)) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  labs(title = "Edukacja",
       y = "%")

Jedynie co 5 wnioskujący nie posiada wykształcenia.

filtered_data <- dane[dane$Loan_Status == "Y", ]

tab <- as.data.frame(100*prop.table(table(filtered_data$Education)))
ggplot(tab, aes(x = Var1, y = Freq)) + 
  geom_col(fill = "#FFFF99", colour = "black") +
  geom_text(aes(label = paste0(round(Freq,1),"%")), 
            stat = "identity", size = 4, 
            fontface = "bold", position = position_stack(vjust = 0.5)) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  labs(title = "Edukacja",
       y = "%")

Udział osób nie wykształconych spada jęsli nałożymy filtr pozytywnej oceny kredytowej, co może sugerować, że takie sooby z mniejsyzm prawdopodobieństwem otrzymają pożyczkę.

Samozatrudnienie

tab <- as.data.frame(100*prop.table(table(dane$Self_Employed)))
ggplot(tab, aes(x = Var1, y = Freq)) + 
  geom_col(fill = "#FFFF99", colour = "black") +
  geom_text(aes(label = paste0(round(Freq,1),"%")), 
            stat = "identity", size = 4, 
            fontface = "bold", position = position_stack(vjust = 0.5)) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  labs(title = "Samozatrudnienie",
       y = "%")

Historia kredytowa

tab <- as.data.frame(100*prop.table(table(dane$Credit_History)))
ggplot(tab, aes(x = Var1, y = Freq)) + 
  geom_col(fill = "#FFFF99", colour = "black") +
  geom_text(aes(label = paste0(round(Freq,1),"%")), 
            stat = "identity", size = 4, 
            fontface = "bold", position = position_stack(vjust = 0.5)) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  labs(title = "Historia kredytowa",
       y = "%")

Jedynie 15% obserwacji nie miało historii kredytowej.

filtered_data <- dane[dane$Loan_Status == "Y", ]

tab <- as.data.frame(100*prop.table(table(filtered_data$Credit_History)))
ggplot(tab, aes(x = Var1, y = Freq)) + 
  geom_col(fill = "#FFFF99", colour = "black") +
  geom_text(aes(label = paste0(round(Freq,1),"%")), 
            stat = "identity", size = 4, 
            fontface = "bold", position = position_stack(vjust = 0.5)) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  labs(title = "Historia kredytowa",
       y = "%")

Przy nałożeniu filtru pozytywna ocena zdolności, okazuję się, że zaledwie 1,8% otrzymało pożyczke pomimo braku historii pożyczkowej. Co może sugerować, że brak histori jest ogromna przeszkodą albo zablokowanie szans na pożyczkę.

Lokalizacja

tab <- as.data.frame(100*prop.table(table(dane$Property_Area)))
ggplot(tab, aes(x = Var1, y = Freq)) + 
  geom_col(fill = "#FFFF99", colour = "black") +
  geom_text(aes(label = paste0(round(Freq,1),"%")), 
            stat = "identity", size = 4, 
            fontface = "bold", position = position_stack(vjust = 0.5)) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  labs(title = "Lokalizacja",
       y = "%")

Rozkład miejsca zamieszkania jest prawie równy. Jednak najliczniejszą grupę stanowią osoby zamieszkujące tereny semiurbanizowane.

filtered_data <- dane[dane$Loan_Status == "Y", ]

tab <- as.data.frame(100*prop.table(table(filtered_data$Property_Area)))
ggplot(tab, aes(x = Var1, y = Freq)) + 
  geom_col(fill = "#FFFF99", colour = "black") +
  geom_text(aes(label = paste0(round(Freq,1),"%")), 
            stat = "identity", size = 4, 
            fontface = "bold", position = position_stack(vjust = 0.5)) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_text(colour = "black", size = 10),
        plot.title = element_text(hjust = 0.5, size = 12)) +
  labs(title = "Lokalizacja",
       y = "%")

Patrząc po osobach z pozytywna decyzją, dominuje grupa osób z terenów semiurbanizowanych.

Dochód aplikanta

ggplot(dane, aes(x = ApplicantIncome)) + 
  geom_histogram(colour = "black", fill = "#FFFF99", bins = 10) +
  labs(title = "Dochód aplikanta", 
       x = "dollars", y = "n") +
  theme(plot.title = element_text(hjust = 0.5, size = 12))

Większość wnioskujących nie posiada dochodu większego niż 10 000 dolarów. Najliczniejsza grupa nie zarabia nawet 5 000 dolarów.

Dochód współaplikanta

ggplot(dane, aes(x = CoapplicantIncome)) + 
  geom_histogram(colour = "black", fill = "#FFFF99", bins = 10) +
  labs(title = "Dochód współaplikanta", 
       x = "dollars", y = "n") +
  theme(plot.title = element_text(hjust = 0.5, size = 12))

Dochód współwnioskujących najczęściej wynosi 0, co ma swoje przełożenie na tym, że głównie składały osoby nie posiadające nikogo na utrzymaniu.

Wartość pożyczki

ggplot(dane, aes(x = LoanAmount)) + 
  geom_histogram(colour = "black", fill = "#FFFF99", bins = 10) +
  labs(title = "Wartość pożyczki", 
       x = "dollars", y = "n") +
  theme(plot.title = element_text(hjust = 0.5, size = 12))

Za to wartość pożyczki rzadko kiedy przekraczała 200 dolarów.

Okres pożyczkowania

ggplot(dane, aes(x = Loan_Amount_Term)) + 
  geom_histogram(colour = "black", fill = "#FFFF99", bins = 10) +
  labs(title = "Okres pożyczkowania", 
       x = "months", y = "n") +
  theme(plot.title = element_text(hjust = 0.5, size = 12))

Mała grupa osób wnioskowała o pożyczke z okresem płatności dłuższym niż 400 miesiecy.

Wykres liniowy wartości pożyczki

dane <- dane %>% arrange(LoanAmount)

ggplot(dane, aes(x = seq_along(LoanAmount), y = LoanAmount)) +
  geom_line(color = "blue") +
  labs(title = "Wykres liniowy wartości pożyczki", x = "Numer obserwacji", y = "Warrtość pożyczki")

Wykres ilustruję, że niecałe 20% wniosków stnoapiwły pożyczki o kwocie powyżej 200 dolarów i nie wynosiły więcej niż 600.

Wykresy rozrzutu wartości i okresu trwania pożyczki z podziałem na deycję pożyczkową

ggplot(dane, aes(x = LoanAmount, y = Loan_Amount_Term, )) +
  geom_point() +
  facet_wrap(~Loan_Status, scales = "free") +
  labs(title = "Wykresy rozrzutu wartości i okresu trwania pożyczki z podziałem na deycję pożyczkową", x = "Wartość pożyczki", y = "Okres pożyczkowania")

Analiza opisowa

W kolejnym etapie projektu przeprowadzono analizę opisową danych z firm ubezpieczeniowych, wspartą odpowiednimi grafikami.

Dokonano odpowiedniego dopasowania formatów zmiennych, aby uwzględnić ich skalę pomiarową oraz przyszłe zastosowanie. Celem tego procesu jest zapewnienie jednolitości danych oraz ich poprawnej reprezentacji, co umożliwi dokładniejszą analizę i ułatwi korzystanie z tych informacji w przyszłości.

dane$Married<-factor(dane$Married,ordered=TRUE)
dane$Dependents<-factor(dane$Dependents,ordered=TRUE)
dane$Education<-factor(dane$Education,ordered=TRUE)
dane$Self_Employed<-factor(dane$Self_Employed,ordered=TRUE)
dane$Credit_History<-factor(dane$Credit_History, ordered = TRUE)
dane$Property_Area<-factor(dane$Property_Area)
dane$Loan_Status<-factor(dane$Loan_Status)

LoanStatus: YES, Statystyki opisowe dla ApplicantIncome i CoapplicantIncome

library(DT)

yes_data <- dane[dane$Loan_Status == "Y", c("ApplicantIncome", "CoapplicantIncome")]

df_summary_yes <- data.frame(
  Statystyka = c("Min", "Q1", "Median", "Mean", "Q3", "Max"),
  ApplicantIncome = c(min(yes_data$ApplicantIncome), quantile(yes_data$ApplicantIncome, 0.25), median(yes_data$ApplicantIncome), mean(yes_data$ApplicantIncome), quantile(yes_data$ApplicantIncome, 0.75), max(yes_data$ApplicantIncome)),
  CoapplicantIncome = c(min(yes_data$CoapplicantIncome), quantile(yes_data$CoapplicantIncome, 0.25), median(yes_data$CoapplicantIncome), mean(yes_data$CoapplicantIncome), quantile(yes_data$CoapplicantIncome, 0.75), max(yes_data$CoapplicantIncome))
)
DT::datatable(df_summary_yes, rownames = FALSE, options = list(dom = 't', paging = FALSE))

Tabela przedstawia statystyki opisowe dla dwóch zmiennych: ApplicantIncome (dochód wnioskodawcy) i CoapplicantIncome (dochód współmałżonka lub współmałżonki), dotyczące osób, które uzyskały pożyczkę.

Możemy zauważyć różnice między dochodem wnioskodawcy (ApplicantIncome) a dochodem współmałżonka (CoapplicantIncome) w zakresie wartości minimalnych, maksymalnych, mediany, średniej oraz kwartyli (Q1 i Q3). Na przykład, mediana dochodu wnioskodawcy (3839.5) jest niższa niż mediana dochodu współmałżonka (1211.5), co sugeruje, że średni dochód wnioskodawcy jest wyższy niż średni dochód współmałżonka.

##LoanStatus: NO, Statystyki opisowe dla ApplicantIncome i CoapplicantIncome

no_data <- dane[dane$Loan_Status == "N", c("ApplicantIncome", "CoapplicantIncome")]

df_summary_no <- data.frame(
  Statystyka = c("Min", "Q1", "Median", "Mean", "Q3", "Max"),
  ApplicantIncome = c(min(no_data$ApplicantIncome), quantile(no_data$ApplicantIncome, 0.25), median(no_data$ApplicantIncome), mean(no_data$ApplicantIncome), quantile(no_data$ApplicantIncome, 0.75), max(no_data$ApplicantIncome)),
  CoapplicantIncome = c(min(no_data$CoapplicantIncome), quantile(no_data$CoapplicantIncome, 0.25), median(no_data$CoapplicantIncome), mean(no_data$CoapplicantIncome), quantile(no_data$CoapplicantIncome, 0.75), max(no_data$CoapplicantIncome))
)
DT::datatable(df_summary_no, rownames = FALSE, options = list(dom = 't', paging = FALSE))

Tabela przedstawia statystyki opisowe dla dwóch zmiennych: ApplicantIncome (dochód wnioskodawcy) i CoapplicantIncome (dochód współmałżonka lub współmałżonki), dla osób, które nie uzyskały pożyczki.

Możemy zauważyć różnice między dochodem wnioskodawcy (ApplicantIncome) a dochodem współmałżonka (CoapplicantIncome) w zakresie wartości minimalnych, maksymalnych, mediany, średniej oraz kwartyli (Q1 i Q3). Na przykład, mediana dochodu wnioskodawcy (3867) jest niższa niż mediana dochodu współmałżonka (0), co sugeruje, że średni dochód wnioskodawcy jest wyższy niż średni dochód współmałżonka.

##LoanStatus: YES, Statystyki opisowe ilość występowań dla danej cechy

yes_data1 <- dane[dane$Loan_Status == "Y", c("Married", "Education","Self_Employed","Credit_History")]

married_freq <- table(yes_data1$Married)
education_freq <- table(yes_data1$Education)
self_employed_freq <- table(yes_data1$Self_Employed)
credit_history_freq <- table(yes_data1$Credit_History)

df_summary_yes <- data.frame(
  Variable = c("Married (No)", "Married (Yes)", "Education (Graduate)", "Education (Not Graduate)", "Self_Employed (No)", "Self_Employed (Yes)", "Credit_History (0)", "Credit_History (1)"),
  Count = c(
    married_freq["No"], married_freq["Yes"],
    education_freq["Graduate"], education_freq["Not Graduate"],
    self_employed_freq["No"], self_employed_freq["Yes"],
    credit_history_freq["0"], credit_history_freq["1"]
  )
)

DT::datatable(df_summary_yes, rownames = FALSE, options = list(dom = 't', paging = FALSE))

Tabela przedstawia statystyki opisowe ilości wystąpień dla danej cechy w zależności od różnych zmiennych, gdzie LoanStatus przyjmuje wartość “YES”.

Większość osób, które uzyskały kredyt, jest zamężna. Ooznacza to, że osoby będące w związku małżeńskim mogą być bardziej skłonne do otrzymania pozytywnej decyzji o przyznaniu kredytu.

Większość osób, które uzyskały kredyt, posiada wykształcenie na poziomie studiów wyższych. Może to sugerować, że osoby z wyższym wykształceniem są bardziej skłonne do otrzymania pozytywnej decyzji o przyznaniu kredytu.

Większość osób, które uzyskały kredyt, nie pracuje na własny rachunek. To może sugerować, że osoby zatrudnione na etacie są częściej akceptowane do otrzymania kredytu niż osoby prowadzące własną działalność gospodarczą.

Praktycznie wszystkie osoby, które uzyskały kredyt, mają pozytywną historię kredytową. To silne wskazanie na to, że pozytywna historia kredytowa jest kluczowym czynnikiem decydującym o przyznaniu kredytu.

LoanStatus: No, Statystyki opisowe: ilość występowań dla danej cechy

no_data1 <- dane[dane$Loan_Status == "N", c("Married", "Education","Self_Employed","Credit_History")]

married_freq <- table(no_data1$Married)
education_freq <- table(no_data1$Education)
self_employed_freq <- table(no_data1$Self_Employed)
credit_history_freq <- table(no_data1$Credit_History)

df_summary_yes <- data.frame(
  Variable = c("Married (No)", "Married (Yes)", "Education (Graduate)", "Education (Not Graduate)", "Self_Employed (No)", "Self_Employed (Yes)", "Credit_History (0)", "Credit_History (1)"),
  Count = c(
    married_freq["No"], married_freq["Yes"],
    education_freq["Graduate"], education_freq["Not Graduate"],
    self_employed_freq["No"], self_employed_freq["Yes"],
    credit_history_freq["0"], credit_history_freq["1"]
  )
)

DT::datatable(df_summary_yes, rownames = FALSE, options = list(dom = 't', paging = FALSE))

Tabela przedstawia statystyki opisowe ilości wystąpień dla danej cechy w zależności od różnych zmiennych, gdzie LoanStatus przyjmuje wartość “NO”.

Zarówno osoby zamężne jak i osoby niezamężne mają znaczną liczbę wystąpień w przypadku braku otrzymanego kredytu. Nie ma wyraźnej dominacji żadnej z tych grup wśród tych, którzy nie otrzymali kredytu.

Większość osób, które nie otrzymały kredytu, posiada wykształcenie na poziomie studiów wyższych. To może sugerować, że posiadanie wyższego wykształcenia nie jest decydującym czynnikiem w przyznawaniu kredytu.

Większość osób, które nie otrzymały kredytu, nie pracuje na własny rachunek. To sugeruje, że fakt bycia pracownikiem etatowym może być korzystniejszy w kontekście uzyskania kredytu.

Wedug danych z tabeli iczba osób z negatywną historią kredytową jest wyższa. Może to wskazywać na to, że historia kredytowa ma wpływ na decyzję o przyznaniu kredytu, ale nie jest jedynym czynnikiem decydującym.

Macierze korelacji

library(corrplot)
## corrplot 0.92 loaded
dane[, c(6:9)] <- lapply(dane[, c(6:9)], as.numeric, errors = "coerce")
print(which(sapply(dane[, c(6:9)], class) != "numeric"))
## named integer(0)
corr_matrix <- cor(dane[, c(6:9)], use = "complete.obs")
corr_matrix
##                   ApplicantIncome CoapplicantIncome LoanAmount Loan_Amount_Term
## ApplicantIncome        1.00000000      -0.120890617 0.53506308     -0.023383832
## CoapplicantIncome     -0.12089062       1.000000000 0.19566123     -0.005429379
## LoanAmount             0.53506308       0.195661231 1.00000000      0.049704063
## Loan_Amount_Term      -0.02338383      -0.005429379 0.04970406      1.000000000
corrplot(corr_matrix, method = "number", type = "upper", diag = FALSE)

corrplot(corr_matrix, method = "color")

ApplicantIncome vs CoapplicantIncome: Współczynnik korelacji wynoszący -0.12 wskazuje na słabą ujemną korelację między dochodem wnioskodawcy (ApplicantIncome) a dochodem współmałżonka (CoapplicantIncome). Oznacza to, że gdy dochód wnioskodawcy rośnie, dochód współmałżonka maleje nieznacznie (i odwrotnie). Zmienne te są słabo ze sobą skorelowane.

ApplicantIncome vs LoanAmount: Współczynnik korelacji wynoszący 0.54 wskazuje na umiarkowaną dodatnią korelację między dochodem wnioskodawcy (ApplicantIncome) a kwotą kredytu (LoanAmount). Oznacza to, że istnieje pewien pozytywny związek między dochodem wnioskodawcy a kwotą kredytu, co sugeruje, że osoby z wyższym dochodem mają tendencję do ubiegania się o wyższe kwoty kredytu.

CoapplicantIncome vs LoanAmount: Współczynnik korelacji wynoszący 0.20 wskazuje na słabą dodatnią korelację między dochodem współmałżonka (CoapplicantIncome) a kwotą kredytu (LoanAmount). Oznacza to, że istnieje pewien pozytywny związek między dochodem współmałżonka a kwotą kredytu, jednak jest to słaba korelacja.

Loan_Amount_Term vs pozostałe zmienne: Współczynniki korelacji między okresem kredytowania (Loan_Amount_Term) a pozostałymi zmiennymi są bliskie zeru (-0.02 do 0.05), co wskazuje na brak istotnej korelacji między długością kredytowania a dochodem wnioskodawcy, dochodem współmałżonka lub kwotą kredytu.

library(ggplot2)
ggplot(data = dane, aes(x = Education, fill = Loan_Status)) +
  geom_bar(position = "dodge", width = 0.7) +
  labs(title = "Decyzja o przyznaniu kredytu ze względu na wykształcenie",
       x = "Liczba osób",
       y = "Liczba decyzji") +
  theme_minimal()

ggplot(data = dane, aes(x = Property_Area, fill = Loan_Status)) +
  geom_bar(position = "dodge", width = 0.7) +
  labs(title = "Decyzja o przyznaniu kredytu według miejsca zamieszkania",
       x = "Miejsce zamieszkania",
       y = "Liczba decyzji") +
  theme_minimal()

Według danych z wykresu powyżej, możemy stwierdzić, że na pozytywną decyzję o przyznaniu kredytu, największą i szansę, mają osoby posiadające wykształcenie. Możemy również stwierdizć, że największą szansę na otrzymanie kredytu mają osoby mieszkające w strefie półmiejskiej. Mniejsze szanse, na otrzymanie kredytu, utrzymujące się na zbliżonym poziomie, mają osoby zamieszkujące strefy wiejskie i stricte miejskie.

Testowanie zależności między Loan_Status a Married

tabela_kontyngencji_married <- table(dane$Loan_Status, dane$Married)
  
test_fisher <- fisher.test(tabela_kontyngencji_married)
print(test_fisher)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  tabela_kontyngencji_married
## p-value = 0.01302
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##  1.093839 2.532840
## sample estimates:
## odds ratio 
##   1.665226

P-value wynosi 0.01302, czyli prawdopodobieństwo otrzymania wyników równie ekstremalnych jak obserwowane, gdyby prawdziwa była hipoteza zerowa. Wartość p-value jest mniejsza niż przyjęty poziom istotności 0.05, co sugeruje istotność statystyczną i odrzucenie hipotezy zerowej.

Przedział ufności dla współczynnika odds ratio wynosi od 1.093839 do 2.532840. Oznacza to, że istnieje 95% pewności, że prawdziwy współczynnik odds ratio mieści się w tym przedziale.

Podsumowując, wyniki testu Fisher’s Exact Test sugerują istotną statystycznie zależność między zmiennymi Loan_Status a Married, przy czym osoby będące w związku małżeńskim mogą mieć różne szanse na otrzymanie kredytu w porównaniu do osób, które nie są zamężne.

Wnioski i podsumowanie

Na podstawie dokonanej analizy można zauważyć, że analiza dancyh nie należy do najłatwiejszej dziedziny. Problem braku danych, zwłaszcza jakościowych z dwiemia możliwych odpowiedziami typu tak, nie jest istotnie utrudniającym pracę. Jednak ze względu na wąską grupę takich obserwacji zdecydowaliśmy się nie brać ich pod uwagę. Analiza osób, które pozytywnie przechodzą proces udzielania pożyczki jest skomplikownay i posiada wiele zmiennych. Na podstawie powyższej analizy można stwierdzić, że dla kandydata, który chciałby ubiegać się o pożyczke jest posiadanie historii pożyczkowej oraz wykształcenia.