Analiza danych - raport końcowy

K. Ciosek, O. Kanigowski, N. Górczyńska

Analityka Gospodarcza II 2024/2025

\(\\ \\ \\ \\ \\\)

1. Wprowadzenie

1.1. Pożyczki

Spośród wszystkich branż, domena ubezpieczeniowa ma największe zastosowanie analityki i metod nauki o danych. Ten zestaw danych zapewni ci wystarczający przedsmak pracy nad zestawami danych z firm ubezpieczeniowych, z jakimi wyzwaniami się mierzą, jakie strategie są stosowane, jakie zmienne wpływają na wynik itp. Jest to problem klasyfikacji. Dane mają 615 wierszy i 13 kolumn.

1.2. Problem

Firma chce zautomatyzować proces kwalifikowania się do pożyczki (w czasie rzeczywistym) w oparciu o dane klienta podane podczas wypełniania wniosku online. Dane te obejmują płeć, stan cywilny, wykształcenie, liczbę osób na utrzymaniu, dochód, kwotę pożyczki, historię kredytową i inne. Aby zautomatyzować ten proces, firma postawiła sobie za cel zidentyfikowanie segmentów klientów, którzy kwalifikują się do otrzymania kwoty pożyczki, aby móc skierować do nich konkretną ofertę. W tym przypadku dostarczono częściowy zestaw danych.

1.3. Opis bazy danych

Baza składa się z 13 kolumn, a te z kolei zawierają następujące wartości:

  1. Loan_ID - indywidualny numer ID każdej obserwacji,
  2. Gender - informacja, jaka płeć jest przyjęta w danej obserwacji,
  3. Married - informacja, czy osoba jest w związku małżeńskim,
  4. Dependents - ilość osób zależnych (finansowo),
  5. Education - informacja, czy dana osoba ukończyła studia,
  6. Self_Employed - informacja, czy osoba jest samozatrudniona,
  7. ApplicantIncome - dochód wnioskodawcy o pożyczkę,
  8. CoapplicantIncome - dochód współwnioskodawcy o pożyczkę,
  9. LoanAmount - kwota pożyczki,
  10. Loan_Amount_Term - okres kredytowania,
  11. Credit_History - historia kredytowa,
  12. Property_Area - obszar zamieszkania,
  13. Loan_Status - informacja, czy udzielono kredytu 

2. Data Wrangling, Cleasing

Data Wrangling odnosi się do procesu przekształcania, reorganizacji i mapowania surowych danych w użyteczny format gotowy do analizy. Data Cleansing, zwane także czyszczeniem danych, odnosi się do procesu identyfikacji i usuwania błędów, niespójności oraz niekompletnych informacji w zbiorach danych. Celem tego procesu jest poprawa jakości danych, co jest kluczowe dla analizy oraz podejmowania trafnych decyzji opartych na danych.

2.1 Obliczanie NA

#podstawowe statystyki
summary(data)
##    Loan_ID             Gender            Married           Dependents       
##  Length:614         Length:614         Length:614         Length:614        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##   Education         Self_Employed      ApplicantIncome CoapplicantIncome
##  Length:614         Length:614         Min.   :  150   Min.   :    0    
##  Class :character   Class :character   1st Qu.: 2878   1st Qu.:    0    
##  Mode  :character   Mode  :character   Median : 3812   Median : 1188    
##                                        Mean   : 5403   Mean   : 1621    
##                                        3rd Qu.: 5795   3rd Qu.: 2297    
##                                        Max.   :81000   Max.   :41667    
##                                                                         
##    LoanAmount    Loan_Amount_Term Credit_History   Property_Area     
##  Min.   :  9.0   Min.   : 12      Min.   :0.0000   Length:614        
##  1st Qu.:100.0   1st Qu.:360      1st Qu.:1.0000   Class :character  
##  Median :128.0   Median :360      Median :1.0000   Mode  :character  
##  Mean   :146.4   Mean   :342      Mean   :0.8422                     
##  3rd Qu.:168.0   3rd Qu.:360      3rd Qu.:1.0000                     
##  Max.   :700.0   Max.   :480      Max.   :1.0000                     
##  NA's   :22      NA's   :14       NA's   :50                         
##  Loan_Status       
##  Length:614        
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 
#struktura danych
str(data)
## '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" ...
#obliczanie liczby NA (brakujących wartości) uwzględniając "puste ciągi"
count_na <- function(x) {
  sum(is.na(x) | x == "" | x == " ")
}
na_count <- sapply(data, count_na)
na_count
##           Loan_ID            Gender           Married        Dependents 
##                 0                13                 3                15 
##         Education     Self_Employed   ApplicantIncome CoapplicantIncome 
##                 0                32                 0                 0 
##        LoanAmount  Loan_Amount_Term    Credit_History     Property_Area 
##                22                14                50                 0 
##       Loan_Status 
##                 0

Tworzona jest funkcja count_na(), która: Sprawdza, czy wartość w danej kolumnie to NA (brak wartości), sprawdza, czy wartość to pusty ciąg “” lub spacja ” “, traktując je jako brakujące. Sumuje wszystkie brakujące wartości w danej kolumnie.

#zamiana pustych ciagow na NA
data[data == ""] <- NA
data[data == " "] <- NA
#wizualizacja braków danych
vis_miss(data)

gg_miss_var(data)

gg_miss_case(data)

vis_miss: Tworzy wizualizację brakujących wartości w całym zbiorze danych. gg_miss_var: Tworzy wykres przedstawiający liczbę braków danych w poszczególnych kolumnach. gg_miss_case: Wizualizuje liczbę braków danych w poszczególnych wierszach (rekordach).

#wzorce braków danych
md.pattern(data, plot = TRUE, rotate.names = TRUE)

##     Loan_ID Education ApplicantIncome CoapplicantIncome Property_Area
## 480       1         1               1                 1             1
## 43        1         1               1                 1             1
## 25        1         1               1                 1             1
## 5         1         1               1                 1             1
## 19        1         1               1                 1             1
## 1         1         1               1                 1             1
## 10        1         1               1                 1             1
## 1         1         1               1                 1             1
## 12        1         1               1                 1             1
## 1         1         1               1                 1             1
## 1         1         1               1                 1             1
## 12        1         1               1                 1             1
## 1         1         1               1                 1             1
## 2         1         1               1                 1             1
## 1         1         1               1                 1             1
##           0         0               0                 0             0
##     Loan_Status Married Gender Loan_Amount_Term Dependents LoanAmount
## 480           1       1      1                1          1          1
## 43            1       1      1                1          1          1
## 25            1       1      1                1          1          1
## 5             1       1      1                1          1          1
## 19            1       1      1                1          1          0
## 1             1       1      1                1          1          0
## 10            1       1      1                1          0          1
## 1             1       1      1                1          0          0
## 12            1       1      1                0          1          1
## 1             1       1      1                0          1          1
## 1             1       1      1                0          0          1
## 12            1       1      0                1          1          1
## 1             1       1      0                1          1          1
## 2             1       0      1                1          0          1
## 1             1       0      1                1          0          0
##               0       3     13               14         15         22
##     Self_Employed Credit_History    
## 480             1              1   0
## 43              1              0   1
## 25              0              1   1
## 5               0              0   2
## 19              1              1   1
## 1               0              0   3
## 10              1              1   1
## 1               1              1   2
## 12              1              1   1
## 1               0              1   2
## 1               1              1   2
## 12              1              1   1
## 1               1              0   2
## 2               1              1   2
## 1               1              1   3
##                32             50 149
gg_miss_upset(data)

md.pattern analizuje wzorce brakujących danych i prezentuje je graficznie. gg_miss_upset tworzy wykres upset, który pokazuje, które kombinacje braków danych są najczęstsze.

Podsumowując, kod identyfikuje i liczy brakujące wartości, uwzględniając puste ciągi. Przygotowuje dane, zastępując puste wartości NA. Wizualizuje rozkład braków danych w zbiorze (kolumny, wiersze, wzorce braków). Analizuje wpływ zmiennych kategorycznych na występowanie braków danych.

Braki danych uzupełniono metodą mice, natomiast braki wartoście Married zastąpiono medianą.

2.2 Identyfikacja unikatowych wartości

##                   unikalne_wartosci
## Loan_ID                         614
## Gender                            2
## Married                           2
## Dependents                        4
## Education                         2
## Self_Employed                     2
## ApplicantIncome                 505
## CoapplicantIncome               287
## LoanAmount                      203
## Loan_Amount_Term                 10
## Credit_History                    2
## Property_Area                     3
## Loan_Status                       2

Powyższy kod oblicza liczbę unikalnych wartości w każdej kolumnie. Tworzona jest ramka unique_counts, w której dla każdej kolumny zliczana jest liczba unikalnych wartości. ### 2.3 Propocje odpowiedzi dla wybranych kategorii

##      odpowiedzi liczba_obserwacji        kategorie
## 1        Female               112           Gender
## 2          Male               489           Gender
## 3            No               213          Married
## 4           Yes               398          Married
## 5             0               345       Dependents
## 6             1               102       Dependents
## 7             2               101       Dependents
## 8            3+                51       Dependents
## 9      Graduate               480        Education
## 10 Not Graduate               134        Education
## 11           No               500    Self_Employed
## 12          Yes                82    Self_Employed
## 13            0                89   Credit_History
## 14            1               475   Credit_History
## 15        Rural               179    Property_Area
## 16    Semiurban               233    Property_Area
## 17        Urban               202    Property_Area
## 18            N               192      Loan_Status
## 19            Y               422      Loan_Status
## 20           12                 1 Loan_Amount_Term
## 21           36                 2 Loan_Amount_Term
## 22           60                 2 Loan_Amount_Term
## 23           84                 4 Loan_Amount_Term
## 24          120                 3 Loan_Amount_Term
## 25          180                44 Loan_Amount_Term
## 26          240                 4 Loan_Amount_Term
## 27          300                13 Loan_Amount_Term
## 28          360               512 Loan_Amount_Term
## 29          480                15 Loan_Amount_Term
##                       class
## Loan_ID           character
## Gender            character
## Married           character
## Dependents        character
## Education         character
## Self_Employed     character
## ApplicantIncome     integer
## CoapplicantIncome   numeric
## LoanAmount          integer
## Loan_Amount_Term    integer
## Credit_History      integer
## Property_Area     character
## Loan_Status       character

Dla określonych kolumn kategorycznych (np. Gender, Married, Education, Loan_Status) tworzona jest tabela częstości wartości. Tworzony jest zbiorczy data.frame, który zawiera liczbę wystąpień każdej wartości w każdej analizowanej kolumnie.

2.4. Data Cleasing

Tworzona jest funkcja map_to_numeric, która konwertuje zmienne kategoryczne na wartości numeryczne na podstawie zdefiniowanego mapowania. Zmienne takie jak Gender, Married, Education, Self_Employed, Property_Area, Loan_Status są zamieniane na wartości liczbowe (np. Male = 1, Female = 0). Kod ten przekształca surowe dane w ustrukturyzowaną formę, gotową do analizy i modelowania. Usuwa zbędne wartości, standardyzuje formaty.

2.5. Podział klientów

W celu rozwiązania stojącego przed danymi problemu - wyodrębnienia klientów kwalifikujących się do uzyskania pożyczki w celu wysłania im odpowiedniej oferty, zaporponowano następujące rozwiązania:

  1. Podział ze względu na dochody gospodarstwa domowego w zależności od ilość osób zależnych

  2. Podział za pomocą algorytmnu klastrowania

Linia podziału w punkcie pierwszym przebiegała według najmniejszej wartości odstającej, klientów powyżej tej wartości zaliczono do klientów premium, natomiast poniżej - do klientów typu basic.

# Normalizacja danych
s_data <- scale(data)

# Wybór optymalnej liczby klastrów
fviz_nbclust(s_data, kmeans, method = "silhouette")

Jak widać na powyższym wykresie, za pomocą metody k-średnich znaleziono optymalną liczbę klastrów (grup) na które można podzielić potencjalnych kredytobiorców która wynosi 2.

# Klasteryzacja
clusters <- kmeans(s_data, centers = 2, nstart = 25)

fviz_cluster(clusters, data = s_data,
             palette = "Accent", 
             ellipse.type = "euclid", 
             star.plot = TRUE, 
             repel = TRUE, 
             ggtheme = theme_minimal(),
             labelsize = 0)

Na powyższym wykresie widoczna jest wizualizacja rozrzutu klastrów.

data$Cluster <- as.factor(clusters$cluster)

# Statystyki opisowe dla każdego klastra
summary_stat <- data %>%
  group_by(Cluster) %>%
  summarise(across(everything(), list(mean = ~mean(.), sd = ~sd(.), median = ~median(.), 
                                      min = ~min(.), max = ~max(.), n = ~length(.)), 
                   .names = "{col}_{fn}"))

summary_statistics <- summary_stat[,14:ncol(summary_stat)]
print(summary_statistics)
## # A tibble: 2 × 72
##   Gender_mean Gender_sd Gender_median Gender_min Gender_max Gender_n
##         <dbl>     <dbl>         <int>      <int>      <int>    <int>
## 1       0.814     0.390             1          0          1      295
## 2       0.809     0.394             1          0          1      319
## # ℹ 66 more variables: Married_mean <dbl>, Married_sd <dbl>,
## #   Married_median <int>, Married_min <int>, Married_max <int>,
## #   Married_n <int>, Dependents_mean <dbl>, Dependents_sd <dbl>,
## #   Dependents_median <int>, Dependents_min <int>, Dependents_max <int>,
## #   Dependents_n <int>, Education_mean <dbl>, Education_sd <dbl>,
## #   Education_median <int>, Education_min <int>, Education_max <int>,
## #   Education_n <int>, Self_Employed_mean <dbl>, Self_Employed_sd <dbl>, …

Klaster 1 (303 obserwacje)

  • Demografia: Większość to mężczyźni (80%), osoby zamężne (64%) i wykształcone (76%).

  • Zatrudnienie: Tylko 15% jest samozatrudnionych.

  • Finanse: Średni dochód wnioskodawcy to 5624 z dużą rozpiętością (min. 210, max. 81 000).

  • Kredyt: Średnia kwota kredytu wynosi 149 tys., a okres spłaty 341 miesięcy.

Klaster 2 (311 obserwacji)

  • Demografia: Nieco większy udział kobiet (ok. 20%), większy odsetek osób zamężnych (66%) i wykształconych (80%).

  • Zatrudnienie: Samozatrudnieni stanowią 13% grupy.

  • Finanse: Średni dochód wnioskodawcy jest niższy (5188), a maksymalna wartość dochodu to 51 763.

  • Kredyt: Średnia kwota kredytu jest nieco niższa (143 tys.), a okres spłaty podobny (342 miesiące).

Klaster 1 charakteryzuje się wyższymi dochodami i większą różnorodnością dochodów, podczas gdy klaster 2 ma nieco wyższy udział osób wykształconych i zamężnych, ale niższe dochody.

3. Wizualizacja danych

3.1. Wykesy puedłkowe

Każdy wykres pudełkowy przedstawia rozkład dochodu w gospodarstwie domowym (HouseholdIncome) w zależności od miejsca zamieszkania klientów. Pierwszy wykres pokazuje, jak dochody kształtują się w różnych lokalizacjach dla wszystkich klientów, natomiast drugi dodatkowo rozróżnia klientów Basic, a trzeci Premium. Taka wizualizacja pozwala lepiej zrozumieć, jak dochody różnią się w różnych obszarach oraz jak przedstawiają się w poszczególnych grupach klientów.

Klienci Premium mają wyższe i bardziej zróżnicowane dochody niż klienci Basic, szczególnie w obszarach wiejskich. Największa zmienność dochodów w obu grupach występuje w rejonach wiejskich.

3.2. Wykresy słupkowe

Na wykresach słupkowych zaprezentujemy zmienne: Gender, Married, Dependents oraz Education.

Z powyższych wykresów możemy wywnioskować, że w danych dużo większy udział mają mężczyźni niż kobiety. Więcej jest także osób w związku małżeńskim niż singli, zdecydowaną większością są osoby, które nie mają pod sobą osób zależnych oraz o kredyt aplikuje więcej osób ze skończonymi studiami.

Dalsze wykresy pokazują, że o kredyt aplikuje zdecydowanie mniej osób na samozatrudnieniu oraz bez historii kredytowej. Biorąc pod uwagę obszar zamieszkania, najwięcej jest osób z obszarów półmiejskich, następnie z obszarów wiejskich, a najmniej osób z miast. Zdecydowanie więcej jest udzielonych kredytów niż tych odrzuconych.

4. Analiza opisowa

Pierwszym etapem analiz wszelkiego typu danych jest ich analiza opisowa. Pozwala ona lepiej zrozumieć dane oraz wyciągnąć odpowienie wnioski.

4.1. Statystyki opisowe

Statystyki opisowe pomagają szybko zrozumieć, jakie wartości dominują, jak bardzo dane są zróżnicowane i czy występują jakieś nietypowe przypadki. Dzięki nim mogliśmy np. sprawdzić, jaki jest przeciętny dochód wnioskodawcy, jak bardzo dochody różnią się między aplikantami, albo czy w danych są osoby, które odstają od reszty.

Rozkład IncomePerDependent wg Loan_Status
Zmienna 0
N = 192
1
N = 422
p-value1
Przychód na jedną osobę w gospodarstwie domowym

0.94
    N Non-missing 192 422
    Mean 6,106 5,763
    SD 5,302 5,090
    Median (Q1, Q3) 4,699 (2,908, 7,131) 4,730 (3,270, 6,400)
    Min, Max 610, 35,673 942, 63,337
1 Wilcoxon rank sum test

Tabela przedstawia rozkład przychodu na jedną osobę w gospodarstwie domowym w podziale na status kredytowy, gdzie 0 oznacza osoby, którym kredytu nie przyznano (N = 192), a 1 oznacza osoby, które otrzymały kredyt (N = 422).

4.2. Korelacja

Korelacja pokazuje, czy i jak mocno dwie zmienne są ze sobą powiązane.

U nas wygląda to następująco:

##                            X.2         X.1           X       Gender
## X.2                 1.00000000  1.00000000  1.00000000 -0.031900583
## X.1                 1.00000000  1.00000000  1.00000000 -0.031900583
## X                   1.00000000  1.00000000  1.00000000 -0.031900583
## Gender             -0.03190058 -0.03190058 -0.03190058  1.000000000
## Married            -0.01601317 -0.01601317 -0.01601317  0.356275359
## Dependents          0.05614104  0.05614104  0.05614104  0.179851514
## Education          -0.03944197 -0.03944197 -0.03944197 -0.053546793
## Self_Employed       0.02208120  0.02208120  0.02208120 -0.021008857
## ApplicantIncome     0.01692515  0.01692515  0.01692515  0.032350855
## CoapplicantIncome   0.03921107  0.03921107  0.03921107  0.077678416
## LoanAmount          0.03050557  0.03050557  0.03050557  0.081060177
## Loan_Amount_Term   -0.02900425 -0.02900425 -0.02900425 -0.076187985
## Credit_History     -0.03631300 -0.03631300 -0.03631300  0.002785175
## Property_Area      -0.15541641 -0.15541641 -0.15541641 -0.024612939
## Loan_Status         0.01177341  0.01177341  0.01177341  0.006519051
## HouseholdIncome     0.03377445  0.03377445  0.03377445  0.065793648
## IncomePerDependent  0.02071706  0.02071706  0.02071706  0.043931212
## type_of_client      0.04621324  0.04621324  0.04621324 -0.014285200
##                         Married   Dependents   Education Self_Employed
## X.2                -0.016013167  0.056141038 -0.03944197   0.022081201
## X.1                -0.016013167  0.056141038 -0.03944197   0.022081201
## X                  -0.016013167  0.056141038 -0.03944197   0.022081201
## Gender              0.356275359  0.179851514 -0.05354679  -0.021008857
## Married             1.000000000  0.337886897 -0.01230438   0.008221324
## Dependents          0.337886897  1.000000000 -0.07560693   0.056368651
## Education          -0.012304383 -0.075606925  1.00000000   0.020095121
## Self_Employed       0.008221324  0.056368651  0.02009512   1.000000000
## ApplicantIncome     0.051708376  0.111009718  0.14076028   0.166062451
## CoapplicantIncome   0.075947672  0.026996631  0.06228983  -0.021494459
## LoanAmount          0.145275385  0.155004331  0.16877015   0.125530163
## Loan_Amount_Term   -0.104822514 -0.090575390  0.06885308  -0.037420834
## Credit_History      0.003714357 -0.062706146  0.06006666  -0.010867713
## Property_Area       0.004256547  0.004891355  0.06524332  -0.031141695
## Loan_Status         0.091477825 -0.003569252  0.08588391  -0.021333458
## HouseholdIncome     0.083319148  0.117231962  0.16136246   0.147334546
## IncomePerDependent -0.006017892 -0.238778682  0.17105747   0.166668596
## type_of_client     -0.027929057 -0.049859848  0.11409227   0.128301281
##                    ApplicantIncome CoapplicantIncome  LoanAmount
## X.2                    0.016925154        0.03921107  0.03050557
## X.1                    0.016925154        0.03921107  0.03050557
## X                      0.016925154        0.03921107  0.03050557
## Gender                 0.032350855        0.07767842  0.08106018
## Married                0.051708376        0.07594767  0.14527539
## Dependents             0.111009718        0.02699663  0.15500433
## Education              0.140760276        0.06228983  0.16877015
## Self_Employed          0.166062451       -0.02149446  0.12553016
## ApplicantIncome        1.000000000       -0.11660458  0.56876365
## CoapplicantIncome     -0.116604581        1.00000000  0.18415260
## LoanAmount             0.568763655        0.18415260  1.00000000
## Loan_Amount_Term      -0.048485232       -0.05691635  0.03309862
## Credit_History        -0.024553482       -0.06028924 -0.03187333
## Property_Area         -0.009499695        0.01052192 -0.04437248
## Loan_Status           -0.004709523       -0.05918731 -0.03806919
## HouseholdIncome        0.893037294        0.34278082  0.62140981
## IncomePerDependent     0.746487999        0.29159277  0.51190565
## type_of_client         0.622874901        0.20435018  0.46681332
##                    Loan_Amount_Term Credit_History Property_Area  Loan_Status
## X.2                     -0.02900425   -0.036313000  -0.155416405  0.011773414
## X.1                     -0.02900425   -0.036313000  -0.155416405  0.011773414
## X                       -0.02900425   -0.036313000  -0.155416405  0.011773414
## Gender                  -0.07618799    0.002785175  -0.024612939  0.006519051
## Married                 -0.10482251    0.003714357   0.004256547  0.091477825
## Dependents              -0.09057539   -0.062706146   0.004891355 -0.003569252
## Education                0.06885308    0.060066658   0.065243319  0.085883915
## Self_Employed           -0.03742083   -0.010867713  -0.031141695 -0.021333458
## ApplicantIncome         -0.04848523   -0.024553482  -0.009499695 -0.004709523
## CoapplicantIncome       -0.05691635   -0.060289243   0.010521919 -0.059187313
## LoanAmount               0.03309862   -0.031873328  -0.044372481 -0.038069194
## Loan_Amount_Term         1.00000000    0.022739513  -0.074605118 -0.027247125
## Credit_History           0.02273951    1.000000000  -0.008500905  0.532764415
## Property_Area           -0.07460512   -0.008500905   1.000000000  0.032111985
## Loan_Status             -0.02724712    0.532764415   0.032111985  1.000000000
## HouseholdIncome         -0.07164790   -0.050539794  -0.004218254 -0.031270779
## IncomePerDependent      -0.04116120    0.006993410   0.019759980 -0.030840148
## type_of_client          -0.02954493   -0.042836701   0.019378616 -0.062687081
##                    HouseholdIncome IncomePerDependent type_of_client
## X.2                    0.033774445        0.020717060     0.04621324
## X.1                    0.033774445        0.020717060     0.04621324
## X                      0.033774445        0.020717060     0.04621324
## Gender                 0.065793648        0.043931212    -0.01428520
## Married                0.083319148       -0.006017892    -0.02792906
## Dependents             0.117231962       -0.238778682    -0.04985985
## Education              0.161362460        0.171057467     0.11409227
## Self_Employed          0.147334546        0.166668596     0.12830128
## ApplicantIncome        0.893037294        0.746487999     0.62287490
## CoapplicantIncome      0.342780824        0.291592773     0.20435018
## LoanAmount             0.621409812        0.511905650     0.46681332
## Loan_Amount_Term      -0.071647897       -0.041161202    -0.02954493
## Credit_History        -0.050539794        0.006993410    -0.04283670
## Property_Area         -0.004218254        0.019759980     0.01937862
## Loan_Status           -0.031270779       -0.030840148    -0.06268708
## HouseholdIncome        1.000000000        0.838191812     0.68174288
## IncomePerDependent     0.838191812        1.000000000     0.73818311
## type_of_client         0.681742882        0.738183114     1.00000000

Zdecydowaliśmy się ograniczyć korelacje, aby ukazywały się tylko te od 0,5 do 1 (korelacja silna).

##                  Var1               Var2      Freq
## 1                 X.1                X.2 1.0000000
## 2  IncomePerDependent    HouseholdIncome 0.9527593
## 3      type_of_client IncomePerDependent 0.9489643
## 4     HouseholdIncome    ApplicantIncome 0.9487066
## 5      type_of_client    HouseholdIncome 0.9239404
## 6  IncomePerDependent    ApplicantIncome 0.9000457
## 7      type_of_client    ApplicantIncome 0.8834059
## 8     HouseholdIncome         LoanAmount 0.8708846
## 9          LoanAmount    ApplicantIncome 0.8409786
## 10        Loan_Status     Credit_History 0.8099601
## 11 IncomePerDependent         LoanAmount 0.7950181
## 12     type_of_client         LoanAmount 0.7883677
## 13            Married             Gender 0.5964911
## 14         Dependents            Married 0.5507486

W celu bardziej przejrzystego przedstawienia danych, prezentujemy naszą macierz korelacji:

Stąd od razu widzimy, które zmienne są ze sobą silnie skorelowane, a które słabiej.

5. Wnioskowanie (testy statystyczne)

Wnioskowanie statystyczne to proces podejmowania decyzji lub formułowania wniosków na podstawie danych. W ramach projektu podjęto próbę zdefinowania wzajemnych zależności pomiędzy zmiennymi opisującymi osoby wnioskujące o kredyt, w kontekście finalnej decyzji banku o udzieleniu pożyczki, lub też decyzji odmownej.

5.1. Model regresji logistycznej

W celu przeprowadzenia wnioskowania wykorzystano model regresji logistycznej (logit) - tóry jest używany do analizy zmiennych zależnych o charakterze binarnym, takich jaką jest zmienna opisująca decyzję o przyznaniu pożyczki.

logit1 <- glm(Loan_Status ~ Married + ApplicantIncome + CoapplicantIncome +Dependents + Education + LoanAmount + Credit_History, 
              data = data, family = binomial)
summary(logit1)
## 
## Call:
## glm(formula = Loan_Status ~ Married + ApplicantIncome + CoapplicantIncome + 
##     Dependents + Education + LoanAmount + Credit_History, family = binomial, 
##     data = data)
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)       -2.619e+00  4.364e-01  -6.002 1.95e-09 ***
## Married            6.040e-01  2.315e-01   2.609  0.00909 ** 
## ApplicantIncome    1.183e-05  2.177e-05   0.543  0.58681    
## CoapplicantIncome -3.473e-05  3.879e-05  -0.895  0.37066    
## Dependents         1.975e-02  1.148e-01   0.172  0.86344    
## Education          4.575e-01  2.496e-01   1.833  0.06684 .  
## LoanAmount        -1.997e-03  1.531e-03  -1.304  0.19217    
## Credit_History     3.502e+00  3.568e-01   9.816  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 762.89  on 613  degrees of freedom
## Residual deviance: 582.68  on 606  degrees of freedom
## AIC: 598.68
## 
## Number of Fisher Scoring iterations: 4

Dla utworzonego modelu zmienną objaśniającą jest Loan_Status informujący o decyzji przyznanie pożyczki, natomiast zmienne objaśniające to pozostałe dostępne informacje o potencjalnych kredytobiorcach.

Jak widać dla utworzonego modelu jedynie zmienne informujące o stanie cywilnym, poziomie oraz hisotrii kredytowej są istotne statystycznie.

logit2 <- glm(Loan_Status ~ Married + Credit_History, 
              data = data, family = binomial)
summary(logit2)
## 
## Call:
## glm(formula = Loan_Status ~ Married + Credit_History, family = binomial, 
##     data = data)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)     -2.5127     0.3705  -6.782 1.18e-11 ***
## Married          0.5519     0.2119   2.605  0.00919 ** 
## Credit_History   3.5109     0.3543   9.910  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 762.89  on 613  degrees of freedom
## Residual deviance: 588.29  on 611  degrees of freedom
## AIC: 594.29
## 
## Number of Fisher Scoring iterations: 4
OR <- exp(logit2$coefficients)
print(OR)
##    (Intercept)        Married Credit_History 
##     0.08104677     1.73653607    33.47855312

W ramach drugie modelu przyjęto jako zmienne objaśniające dwie zmienne o największej istotności statystycznej w stosunku do wszystkich danych. Można stąd wysunąć wniosek, że zmiennymi o największym wpływie na decyzję o przyzaniu kredytu są zmienne mówiące o stanie cywilnym oraz hisotrii kredytowej.

Zakładając, że tylko te dwie wartości determinowałyby decyzję:

  • bycie w zwiazku malzenskim zwieksza szanse na otrzymanie kredytu o 73%.
  • natomiast pozytywna historia kredytowa zwieksza szanse na otrzymanie kredytu az o 3248%

5.2. Wizualizacja testów statystycznych

Wszystkie analizowane zmienne są istotne statystycznie przy poziomie istotności 0.05.

Historia kredytowa:

Stan cywilny:

Poziom edukacji:

6. Podsumowanie i wnioski końcowe

W ramach przeprowadzonej analizy danych zastosowano szereg technik przetwarzania, wizualizacji, analizy opisowej oraz wnioskowania statystycznego, które pozwoliły na dogłębne zrozumienie zależności między zmiennymi a decyzją o przyznaniu pożyczki.

  • Pierwszym etapem pracy był data wrangling, który obejmował wstępną analizę danych, oczyszczanie zbioru danych, radzenie sobie z wartościami odstającymi oraz przygotowanie danych do dalszej wizualizacji.
  • Następnie podjęto próbę rozwiązania głównego problemu postawionego przed danymi - wyodrębnieniu osób kwalifikujących się do kredytu. Przyjęto że wyznacznikiem będzie tu kwota dochodów gospodarstwa domowego w zależności od liczby osób zależnych. Podjęto również próbę klasteryzacji klientów na dwie grupy.
  • Kolejnym krokiem było rozwiązanie kwestii wartości odstających. Problem ten rozwiązał się samoczynnie poprzez podział klientów ze względu na zarobki w punkcie 2.
  • Wizualizacja danych została przeprowadzona przy użyciu wykresów pudełkowychi słupkowych.
  • Wreszcie, na etapie wnioskowania statystycznego przeprowadzono odpowiednie testy (w tym budowę modelu), które miały na celu identyfikację zmiennych istotnych statystycznie w kontekście przyznania pożyczki.

Podczas realizacji projektu udało się rozwiązać zadanie stojące przed bazą danych poprzez zaproponowanie dwóch podziałów klientów do których bank mógłby skierować swoją ofertę - na podstawie dochodu gospodarstwa w zależności od liczby osób zależnych, oraz na podstawie algorytmu klastrowania. Wykazano również, że stan cywilny oraz historia kredytowa mają największy wpływ na decyzję o przyznaniu pożyczki.