Kredyty
Wprowadzenie
Celem projektu jest analiza danych dotyczących udzielania kredytów hipotecznych i zidentyfikowanie, które czynniki mają wpływ na to, czy kredytobiorca regularnie spłaca kredyt, czy nie.
W pierwszym etapie analizy zapoznano się z danymi. Baza składała się z 250 000 rekordów. W związku z tym skonsultowano się z prowadzącym i wybrano 20 kluczowych kolumn. Odnoszą się one do kredytobiorcy:
TARGET - spłaca kredyt regularnie (0), ma z tym problemy (1);
NAME_CONTRACT_TYPE - określenie, czy kredyt jest gotówkowy, czy odnawialny;
CODE_GENDER - płeć (M - mężczyzna, F - kobieta);
FLAG_OWN_REALTY - fakt posiadania nieruchomości (1 - tak, 0 - nie)
CNT_CHILDREN - liczba dzieci;
AMT_INCOME_TOTAL - całkowity roczny dochód;
AMT_CREDIT - całkowita kwota kredytu;
NAME_INCOME_TYPE - źródło dochodu;
NAME_EDUCATION_TYPE - poziom edukacji;
NAME_FAMILY_STATUS - status rodzinny;
NAME_HOUSING_TYPE - sytuacja mieszkaniowa;
ORGANIZATION_TYPE - miejsce pracy;
REGION_RATING_CLIENT - ocena miejsca zamieszkania na skali porządkowej;
OCCUPATION_TYPE - typ zawodu;
APARTMENTS_AVG - średnia znormalizowana powierzchnia mieszkalna;
BASEMENTAREA_AVG - średnia znormalizowana powierzchnia piwnicy;
YEARS_BUILD_AVG - średni znormalizowany wiek nieruchomości;
COMMONAREA_AVG - średnia znormalizowana powierzchnia ewentualnej części wspólnej;
ENTRANCES_AVG - średnia znormalizowana liczba wejść;
LANDAREA_AVG - średnia znormalizowana powierzchnia terenu posesji.
Po wybraniu zmiennych z najważniejszymi informacjami, ustalono ziarno generatora i wylosowano 2500 obserwacji do dalszej analizy. Jako najbardziej istotną uznano zmienną binarną TARGET, która mówi o tym, czy dana osoba regularnie spłaca kredyt.
Data Wrangling
W początkowym etapie analizy danych przystąpiono do identyfikacji braków danych.
## [1] 9409
Na podstawie wyniku można wywnioskować, że baza danych ma 9409 braków w obserwacjach.
Następnie sprawdzono, w jakiej występują one proporcji do całego zbioru i przedstawiono ten wynik w postaci procentowej.
## [1] 0.18818
## [1] 18.818
Stwierdzono, że braki danych stanowią 18,818% wszystkich obserwacji.
W celu dogłębniejszej ich analizy zbadano, ile jest braków w danej kolumnie oraz w jakiej proporcji procentowej w niej występują.
## # A tibble: 20 × 3
## variable n_miss pct_miss
## <chr> <int> <num>
## 1 COMMONAREA_AVG 1726 69.0
## 2 YEARS_BUILD_AVG 1628 65.1
## 3 LANDAREA_AVG 1452 58.1
## 4 BASEMENTAREA_AVG 1403 56.1
## 5 APARTMENTS_AVG 1212 48.5
## 6 ENTRANCES_AVG 1188 47.5
## 7 OCCUPATION_TYPE 800 32
## 8 TARGET 0 0
## 9 NAME_CONTRACT_TYPE 0 0
## 10 CODE_GENDER 0 0
## 11 FLAG_OWN_REALTY 0 0
## 12 CNT_CHILDREN 0 0
## 13 AMT_INCOME_TOTAL 0 0
## 14 AMT_CREDIT 0 0
## 15 NAME_INCOME_TYPE 0 0
## 16 NAME_EDUCATION_TYPE 0 0
## 17 NAME_FAMILY_STATUS 0 0
## 18 NAME_HOUSING_TYPE 0 0
## 19 ORGANIZATION_TYPE 0 0
## 20 REGION_RATING_CLIENT 0 0
Braki danych wystąpiły w kolumnach: COMMONAREA_AVG, YEARS_BUILD_AVG, LANDAREA_AVG, BASEMENTAREA_AVG, APARTMENTS_AVG, ENTRANCES_AVG i OCCUPATION_TYPE. Dla pozostałych kolumn nie zdiagnozowano braków.
Podjęto się również wizualizacji braków danych na poniższym wykresie.
Wykres potwierdza, że braki danych występują jedynie w siedmiu kolumnach.
Dodatkowym krokiem w analizie braków danych było stworzenie podsumowania, które analizuje, w ilu wierszach wystąpiło od zera do siedmiu braków danych oraz jaki jest to stosunek procentowy.
## # A tibble: 8 × 3
## n_miss_in_case n_cases pct_cases
## <int> <int> <dbl>
## 1 0 473 18.9
## 2 1 334 13.4
## 3 2 176 7.04
## 4 3 140 5.6
## 5 4 123 4.92
## 6 5 71 2.84
## 7 6 825 33
## 8 7 358 14.3
Na podstawie braków danych, opierając się na zmiennej TARGET, stworzono mapę cieplną.
Mapa cieplna ukazała procentowy udział braków danych w całym zbiorze. Skala zbudowana jest na kolorach od fioletowego do żółtego, gdzie fiolet oznacza 0%, a żółty 100%.
Następnie stworzono wykres upset plot, który służy do wizualizacji braków danych lub analiz złożonych relacji między grupami cech.
Oś pionowa wykresu pokazuje liczebność danych dla poszczególnych kombinacji braków w kolumnach. Najwyższe słupki wskazują najczęściej występujące zestawy braków w danych.
Kropki i linie na osi poziomej poniżej słupków wskazują, które kolumny mają braki dla danej grupy. W przypadku pojedynczych kropek brak dotyczy jednej kolumny, a linie między kropkami oznaczają brak danych w kilku kolumnach równocześnie.
Lewy dolny wykres wyświetla całkowitą liczbę brakujących wartości dla każdej kolumny z osobna, co pozwala ocenić, które zmienne są najbardziej dotknięte brakami.
Najczęstsze kombinacje braków dotyczą kilku kolumn jednocześnie (814 przypadków), co sugeruje, że brak danych może być skorelowany w tych zmiennych. Kolumny takie jak COMMONAREA_AVG_NA czy YEARS_BUILD_AVG_NA mają największe liczby braków.
Podjęto się stworzenia również innej wizualizacji braków danych, którą przedstawiono na rysunku poniżej.
Wykres po lewej przedstawia proporcje braków w zależności od TARGET. Na osi poziomej znajdują się wartości zmiennej TARGET. Natomiast na osi pionowej przedstawiona jest proporcja braków w danych. Wartości zmiennej TARGET są powiązane z różnym udziałem braków w danych. Wyższe słupki wskazują, że w danej grupie braki występują częściej.
Wykres po prawej przedstawia macierz kombinacji braków. Na osi pionowej przedstawiono kombinacje braków danych w różnych kolumnach, a oś pozioma prezentuje wiersze w danych. Niebieskie pola przedstawiają komórki uzupełnione, a czerwone - braki danych. Z macierzy kombinacji braków można wywnioskować, że wzorce są wielowymiarowe, gdyż braki pojawiają się dla więcej niż jednej zmiennej. W kilku przypadkach można również stwierdzić, że braki są monotoniczne tak jak np. w ostatnim rekordzie. Można na tej podstawie przypuścić, że brak w jednej kolumnie przyczynił się do powstania braku w kolejnej. Wzorce są również w dużej mierze ze sobą połączone. Zgrupowane braki mogą sugerować, że są one ze sobą skorelowane i występują wspólnie w określonych zmiennych.
W celu pracy nad brakami danych, zamieniono wartości specjalne tj. Inf na NA. Dokonano tego za pomocą poniższej procedury:
is.special <- function(x){if(is.numeric(x)) !is.finite(x) else is.na(x)}
sapply_is.special <- sapply(Data, is.special)
wynik_is.special <- for(n in colnames(Data)){is.na(Data[[n]]) <- is.special(Data[[n]])}Następnie przeprowadzono test Grubbsa, który sprawdza, czy w zbiorze danych występują wartości odstające.
Dla testu postawiono dwie hipotezy:
- H₀: Nie ma wartości odstających w zbiorze wartości badanej zmiennej.
- H₁: Największa lub najmniejsza wartość w zbiorze jest outlierem.
data_numeric <- Data %>%
select(where(is.numeric))
test_grubbs <- function(column) {
if (length(column) > 2) {
result <- grubbs.test(column)
return(result)
} else {
return(NA)
}
}
results_grubbs <- lapply(data_numeric, test_grubbs)
results_grubbs## $TARGET
##
## Grubbs test for one outlier
##
## data: column
## G = 3.48612, U = 0.99513, p-value = 0.6037
## alternative hypothesis: highest value 1 is an outlier
##
##
## $CNT_CHILDREN
##
## Grubbs test for one outlier
##
## data: column
## G = 6.23777, U = 0.98442, p-value = 4.762e-07
## alternative hypothesis: highest value 5 is an outlier
##
##
## $AMT_INCOME_TOTAL
##
## Grubbs test for one outlier
##
## data: column
## G = 9.41468, U = 0.96452, p-value < 2.2e-16
## alternative hypothesis: highest value 1012500 is an outlier
##
##
## $AMT_CREDIT
##
## Grubbs test for one outlier
##
## data: column
## G = 6.03094, U = 0.98544, p-value = 1.783e-06
## alternative hypothesis: highest value 3020760 is an outlier
##
##
## $REGION_RATING_CLIENT
##
## Grubbs test for one outlier
##
## data: column
## G = 2.00495, U = 0.99839, p-value = 1
## alternative hypothesis: lowest value 1 is an outlier
##
##
## $APARTMENTS_AVG
##
## Grubbs test for one outlier
##
## data: column
## G = 7.90003, U = 0.95147, p-value = 8.58e-13
## alternative hypothesis: highest value 0.9814 is an outlier
##
##
## $YEARS_BUILD_AVG
##
## Grubbs test for one outlier
##
## data: column
## G = 4.85776, U = 0.97288, p-value = 0.0004401
## alternative hypothesis: lowest value 0.2384 is an outlier
##
##
## $ENTRANCES_AVG
##
## Grubbs test for one outlier
##
## data: column
## G = 7.63629, U = 0.95549, p-value = 7.574e-12
## alternative hypothesis: highest value 0.8621 is an outlier
##
##
## $INCOME_LOG
##
## Grubbs test for one outlier
##
## data: column
## G = 3.9339, U = 0.9938, p-value = 0.102
## alternative hypothesis: highest value 13.8279330779628 is an outlier
##
##
## $CREDIT_LOG
##
## Grubbs test for one outlier
##
## data: column
## G = 3.17843, U = 0.99596, p-value = 1
## alternative hypothesis: lowest value 10.7783310944961 is an outlier
Dla zmiennych AMT_INCOME_TOTAL, AMT_CREDIT, APARTMENTS_AVG, ENTRANCES_AVG, CNT_CHILDREN i YEARS_BUILD_AVG wartość p<0,05, co dla poziomu istotności α=0,05 oznacza, że odrzucamy hipotezę zerową i najmniejsza lub największa wartość jest outlierem. W przypadku pozostałych zmiennych nie ma podstaw do odrzucenia hipotezy zerowej, co oznacza, że nie wykryto obserwacji odstających.
Następnie skorzystano z metody Hot-deck imputation, mającej na celu uzupełnienie braków danych w posiadanym zbiorze.
Data_hotdeck <- Data_implications %>%
group_by(TARGET) %>%
group_modify(~ hotdeck(.x)) %>%
ungroup()Program uzupełnił zidentyfikowane braki danych na podstawie innych podobnych rekordów. Działa to na zasadzie “biorcy” i “dawcy”. W zbiorze wyszukiwane są wartości odpowiadające szukanym pod względem zmiennych, następnie pobierane od “biorcy” i przypisywane “dawcy”.
Kolejnym krokiem było ustalenie reguł dla poszczególnych zmiennych w celu sprawdzenia poprawności danych w zbiorze. Dla danych jakościowych o skończonej liczbie wartości, ale wielu wariantach trudnych do zidentyfikowania zdecydowano się sprawdzenie poprawności poprzez stworzenie tabeli.
##
## Commercial associate Pensioner State servant
## 576 470 189
## Working
## 1265
##
## Higher education Incomplete higher
## 652 76
## Lower secondary Secondary / secondary special
## 29 1743
##
## Civil marriage Married Separated
## 252 1609 156
## Single / not married Widow
## 365 118
##
## Co-op apartment House / apartment Municipal apartment Office apartment
## 8 2221 83 22
## Rented apartment With parents
## 43 123
##
## Advertising Agriculture Bank
## 2 24 20
## Business Entity Type 1 Business Entity Type 2 Business Entity Type 3
## 54 77 551
## Cleaning Construction Culture
## 3 62 1
## Electricity Emergency Government
## 6 4 92
## Hotel Housing Industry: type 1
## 6 21 13
## Industry: type 10 Industry: type 11 Industry: type 12
## 1 18 3
## Industry: type 13 Industry: type 2 Industry: type 3
## 1 7 20
## Industry: type 4 Industry: type 5 Industry: type 6
## 4 3 1
## Industry: type 7 Industry: type 9 Insurance
## 7 33 10
## Kindergarten Legal Services Medicine
## 68 7 96
## Military Mobile Other
## 24 3 134
## Police Postal Realtor
## 23 18 7
## Religion Restaurant School
## 2 14 75
## Security Security Ministries Self-employed
## 21 19 267
## Services Telecom Trade: type 1
## 12 4 3
## Trade: type 2 Trade: type 3 Trade: type 4
## 16 22 1
## Trade: type 6 Trade: type 7 Transport: type 2
## 6 65 18
## Transport: type 3 Transport: type 4 University
## 10 42 9
## XNA
## 470
##
## Accountants Cleaning staff Cooking staff
## 108 43 69
## Core staff Drivers High skill tech staff
## 322 214 140
## HR staff IT staff Laborers
## 9 12 688
## Low-skill Laborers Managers Medicine staff
## 19 279 105
## Private service staff Realty agents Sales staff
## 23 11 350
## Secretaries Security staff Waiters/barmen staff
## 16 66 26
Na tej podstawie zidentyfikowano niepoprawne dane w kolumnie ORGANIZATION_TYPE, gdyż zauważono wartości XNA w ilości 470.
Następnie sporządzono reguły dla pozostałych kolumn w zbiorze danych.
rules <- validator(TARGET == 1 | TARGET == 0,
NAME_CONTRACT_TYPE == "Cash loans" | NAME_CONTRACT_TYPE == "Revolving loans",
CODE_GENDER == "M" | CODE_GENDER == "F",
FLAG_OWN_REALTY == "Y" | FLAG_OWN_REALTY == "N",
CNT_CHILDREN >= 0,
CNT_CHILDREN < 30,
AMT_INCOME_TOTAL >= 0,
AMT_CREDIT > 0,
REGION_RATING_CLIENT >= 1,
REGION_RATING_CLIENT <= 3,
APARTMENTS_AVG >= 0,
BASEMENTAREA_AVG >= 0,
YEARS_BUILD_AVG >= 0,
COMMONAREA_AVG >= 0,
ENTRANCES_AVG >= 0,
LANDAREA_AVG >= 0,
APARTMENTS_AVG <= 1,
BASEMENTAREA_AVG <= 1,
YEARS_BUILD_AVG <= 1,
COMMONAREA_AVG <= 1,
ENTRANCES_AVG <= 1,
LANDAREA_AVG <= 1,
ORGANIZATION_TYPE != "XNA")Dla kolumn z danymi binarnymi, do których należą zmienne TARGET, NAME_CONTRACT_TYPE, CODE_GENDER i FLAG_OWN_REALTY sporządzono reguły mające na celu zidentyfikowanie jeśli, w którymś z rekordów znajdzie się wyrażenie inne niż wskazane. Następnie dla kolumn od CNT_CHILDREN do LANDAREA_AVG stworzono reguły liczbowe dla znajdujących się w nich danych ilościowych. Ostatnia reguła miała na celu zidentyfikować rekordy, w których pojawiło się wyrażenie “XNA” w kolumnie ORGANIZATION_TYPE.
Wykorzystano funkcję confront, by sprawdzić czy dane spełniają ustalone reguły.
results <- confront(Data_hotdeck, rules, key="TARGET")
failed_columns <- summary(results) %>%
filter(fails > 0) %>%
select(name, passes, fails, expression)
print(failed_columns)## name passes fails expression
## 1 V18 2493 7 BASEMENTAREA_AVG <= 1
## 2 V20 2490 10 COMMONAREA_AVG <= 1
## 3 V22 2499 1 LANDAREA_AVG <= 1
## 4 V23 2030 470 ORGANIZATION_TYPE != "XNA"
W wyniku tego działania ustalono, że 7 rekordów nie przeszło walidacji w kolumnie BASEMENTAREA_AVG, 10 w kolumnie COMMONAREA_AVG, 1 w kolumnie LANDAREA_AVG i 470 w kolumnie ORGANIZATION_TYPE. Stworzono także wykres pokazujący stosunek rekordów zgodnych z regułami do tych, które nie przeszły walidacji dla poszczególnych zmiennych.
Ustalono, że w niektórych przypadkach dane nie przeszły walidacji, ponieważ zapisano je w nieodpowiednim formacie. Z tego względu zastąpiono je danymi liczbowymi w poprawnym formacie. W tym celu użyto poniższego kodu.
Data_hotdeck <- Data_hotdeck %>%
mutate(BASEMENTAREA_AVG = ifelse(BASEMENTAREA_AVG == "5,00E-04", 0.0005, BASEMENTAREA_AVG)) %>%
mutate(BASEMENTAREA_AVG = ifelse(BASEMENTAREA_AVG == "1,00E-04", 0.0001, BASEMENTAREA_AVG)) %>%
mutate(COMMONAREA_AVG = ifelse(COMMONAREA_AVG == "9,00E-04", 0.0009, COMMONAREA_AVG)) %>%
mutate(COMMONAREA_AVG = ifelse(COMMONAREA_AVG == "8,00E-04", 0.0008, COMMONAREA_AVG)) %>%
mutate(COMMONAREA_AVG = ifelse(COMMONAREA_AVG == "7,00E-04", 0.0007, COMMONAREA_AVG)) %>%
mutate(COMMONAREA_AVG = ifelse(COMMONAREA_AVG == "5,00E-04", 0.0005, COMMONAREA_AVG)) %>%
mutate(COMMONAREA_AVG = ifelse(COMMONAREA_AVG == "2,00E-04", 0.0002, COMMONAREA_AVG)) %>%
mutate(LANDAREA_AVG = ifelse(LANDAREA_AVG == "9,00E-04", 0.0009, LANDAREA_AVG)) Po eliminacji części błędnych danych postanowiono wykorzystać funkcję simplify_rules, by upewnić się, że reguły zapisano w najprostszy możliwy sposób. Program nie znalazł jednak uproszczonej metody ich zapisywania i nie nastąpiły żadne zmiany.
## No fixed values found.
W celu dalszej eliminacji braków danych, stanowiących 0,9% całości, zastosowano metodę imputacji brakujących danych za pomocą algorytmu k-Nearest Neighbors (kNN), a wynik został przypisany z powrotem do tego samego zbioru danych.
W uzupełnionym zbiorze danych po skorzystaniu z algorytmu kNN powstały nowe kolumny informujące o zastosowanej imputacji braków danych. Wartości w kolumnach wskazują, czy dana wartość została uzupełniona. Zdecydowano się na usunięcie dodanych kolumn.
Upewniono się, tworząc tabelę dla kolumny ORGANIZATION_TYPE, jaki jest rozkład wartości w zmiennej kategorycznej.
##
## Advertising Agriculture Bank
## 2 25 22
## Business Entity Type 1 Business Entity Type 2 Business Entity Type 3
## 56 87 749
## Cleaning Construction Culture
## 3 82 1
## Electricity Emergency Government
## 8 4 101
## Hotel Housing Industry: type 1
## 8 22 14
## Industry: type 10 Industry: type 11 Industry: type 12
## 1 20 4
## Industry: type 13 Industry: type 2 Industry: type 3
## 1 9 26
## Industry: type 4 Industry: type 5 Industry: type 6
## 6 3 1
## Industry: type 7 Industry: type 9 Insurance
## 7 36 12
## Kindergarten Legal Services Medicine
## 73 8 118
## Military Mobile Other
## 27 3 155
## Police Postal Realtor
## 25 18 8
## Religion Restaurant School
## 2 19 81
## Security Security Ministries Self-employed
## 21 19 376
## Services Telecom Trade: type 1
## 13 4 3
## Trade: type 2 Trade: type 3 Trade: type 4
## 17 23 1
## Trade: type 6 Trade: type 7 Transport: type 2
## 8 85 18
## Transport: type 3 Transport: type 4 University
## 11 45 9
Działaniem tym potwierdzono, że braki danych zostały uzupełnione.
W następnym etapie projektu, skorzystano z transformacji danych.
Skorzystano z procedury standaryzacji Z-score, aby ułatwić porównywanie
rozkładów oraz identyfikację odstających wartości.
Przedstawiono wizualizację rozkładu standaryzowanych danych
APARTMENTS_AVG_Z.
Data_hotdeck %>%
mutate(APARTMENTS_AVG_Z = transform(Data_hotdeck$APARTMENTS_AVG, method = "zscore")) %>%
select(APARTMENTS_AVG_Z) %>%
boxplot(main = "Wykres pudełkowy dla zmiennej APARTMENTS_AVG")Wykres pokazuje, że większość danych mieści się wewnątrz pudełka. Znaczna liczba odstających wartości w górnej części wskazuje, że istnieją obserwacje, które są znacznie większe niż reszta danych. Można zauważyć sporo wartości odstających w górnej części rozkładu, co wskazuje na istnienie ekstremalnie dużych wartości w zmiennej APARTMENTS_AVG po transformacji Z-score. Mogą to być błędy lub anomalie, które wymagają dokładniejszej analizy.
Sprawdzono typ danych dla poszczególnych kolumn i stwierdzono konieczność zamiany typu danych dla trzech kolumn na numeryczny. Proces przedstawiono poniżej.
Data_hotdeck$BASEMENTAREA_AVG <-as.numeric(Data_hotdeck$BASEMENTAREA_AVG)
Data_hotdeck$COMMONAREA_AVG <-as.numeric(Data_hotdeck$COMMONAREA_AVG)
Data_hotdeck$LANDAREA_AVG <-as.numeric(Data_hotdeck$LANDAREA_AVG)Zdecydowano się również na znalezienie zmiennych oraz ich nazw w naszym zbiorze danych, które powodują problemy ze skośnością.
## [1] "AMT_INCOME_TOTAL" "AMT_CREDIT" "APARTMENTS_AVG" "BASEMENTAREA_AVG"
## [5] "COMMONAREA_AVG" "ENTRANCES_AVG" "LANDAREA_AVG"
Według otrzymanych wyników zmienne, które powodują problem ze skośnością w zbiorze danych to AMT_INCOME_TOTAL”, “AMT_CREDIT”, “APARTMENTS_AVG”, “BASEMENTAREA_AVG”, “COMMONAREA_AVG”, “ENTRANCES_AVG” oraz “LANDAREA_AVG”.
Dla poszczególnych siedmiu zmiennych stworzono histogramy, aby zwizualizować ich rozkład danych. Dzięki niemu możliwe jest sprawdzenie m.in. czy rozkład jest skośny, czy występują wartości odstające, a także jakie wartości dominują. Histogramy przedstawiają kolejno analizę rozkładu dochodów, rozłożone kwoty kredytów klientów, średnią mieszkań, średni wiek budynków, średnią liczbę wejść do budynków, oraz rozłożoną wartość kredytu.
hist_vars <- c("AMT_INCOME_TOTAL", "AMT_CREDIT", "APARTMENTS_AVG",
"BASEMENTAREA_AVG", "COMMONAREA_AVG",
"ENTRANCES_AVG", "LANDAREA_AVG")
data_long <- Data_hotdeck %>%
select(all_of(hist_vars)) %>%
pivot_longer(cols = everything(), names_to = "Variable", values_to = "Value")
ggplot(data_long, aes(x = Value)) +
geom_histogram(bins = 30, fill = "steelblue", color = "black") +
facet_wrap(~Variable, scales = "free") +
theme_minimal() +
labs(title = "Skośność zmiennych",
x = "Wartość",
y = "Częstotliwość") +
theme(plot.title = element_text(hjust = 0.5))Wcześniejsze kroki analizy potwierdziły się. Histogramy pokazały, że aby przeprowadzić dalszą analizę z wyszczególnionymi zmiennymi, ze względu na występującą skośność konieczne jest dokonanie transformacji zmiennych. Zdecydowano się na dokonanie jej przy użyciu logarytmu.
Na wyszczególnionych zmiennych dokonano transformacji oraz przedstawiono wizualizację.
Data_hotdeck <- Data_hotdeck %>%
mutate(AMT_INCOME_TOTAL = log1p(AMT_INCOME_TOTAL),
AMT_CREDIT = log1p(AMT_CREDIT),
APARTMENTS_AVG = log1p(APARTMENTS_AVG),
BASEMENTAREA_AVG = log1p(BASEMENTAREA_AVG),
COMMONAREA_AVG = log1p(COMMONAREA_AVG),
ENTRANCES_AVG = log1p(ENTRANCES_AVG),
LANDAREA_AVG = log1p(LANDAREA_AVG))hist_vars2 <- c("AMT_INCOME_TOTAL", "AMT_CREDIT", "APARTMENTS_AVG",
"BASEMENTAREA_AVG","COMMONAREA_AVG",
"ENTRANCES_AVG", "LANDAREA_AVG")
data_long2 <- Data_hotdeck %>%
select(all_of(hist_vars2)) %>%
pivot_longer(cols = everything(), names_to = "Variable", values_to = "Value")
ggplot(data_long2, aes(x = Value)) +
geom_histogram(bins = 30, fill = "steelblue", color = "black") +
facet_wrap(~Variable, scales = "free") +
theme_minimal() +
labs(title = "Skośność zmiennych",
x = "Wartość",
y = "Częstotliwość") +
theme(plot.title = element_text(hjust = 0.5))Logarytmowanie spowodowało, że dane zostały “spłaszczone”, pozwoliło to na zmniejszenie różnic pomiędzy wartościami dużymi i bardzo dużymi, co wpłynęło na nieco bardziej symetryczny rozkład.
Wizualizacja danych
W procesie analizy danych kluczowym etapem jest wykorzystanie wizualizacji, która pozwala na skuteczne przedstawienie informacji w sposób intuicyjny i łatwy do interpretacji. Skupiono się na wizualizacjach przygotowanych na podstawie oczyszczonego i przetworzonego zbioru danych, mających na celu zidentyfikowanie wzorców wskazujących na trudności klientów ze spłatą rat kredytowych.
Dane zostały wcześniej odpowiednio przygotowane, w tym oczyszczone z
braków. Ponadto zmienne zostały przekształcone w celu ułatwienia ich
interpretacji, m.in. poprzez standaryzację, transformacje logarytmiczne
oraz binning wybranych cech. Dzięki tym krokom możliwe jest uzyskanie
precyzyjnych i wiarygodnych wniosków opartych na wizualnej
analizie.
Zdecydowano się na użycie motywu z pakietu ggthemes. Dzięki temu
wszystkie wykresy w ggplot2 będą wyglądały schludniej i bardziej
estetycznie.
Stworzono również nową kolumnę “TARGET_2”, która przypisuje “Problemy ze spłatą” , jeżeli wartość w kolumnie “TARGET” wynosi 1 oraz przypisuje wartość tekstową “Spłaca”, gdy wartość w kolumnie “TARGET” wynosi 0. Ułatwi to interpretację zmiennej oraz będzie bardziej przejrzyste w tworzonych wizualizacjach.
Data_hotdeck <- Data_hotdeck %>%
mutate(TARGET_2 = if_else(TARGET == 1, "Problemy ze spłatą", "Spłaca"))Zbadano także kolumnę “CNT_CHILDREN”.
##
## 0 1 2 3 4 5
## 1744 491 228 32 2 3
Ta podstawie uzyskanego wyniku stworzono nową kolumną “HAS_CHILDREN” z wartościami: “Nie posiada dzieci”, “Posiada jedno dziecko”, “Posiada dwoje dzieci” oraz “Posiada więcej niż dwoje dzieci”.
Data_hotdeck <- Data_hotdeck %>%
mutate(HAS_CHILDREN = case_when(
CNT_CHILDREN == 0 ~ "Nie posiada dzieci",
CNT_CHILDREN == 1 ~ "Posiada jedno dziecko",
CNT_CHILDREN == 2 ~ "Posiada dwoje dzieci",
CNT_CHILDREN > 2 ~ "Posiada więcej niż dwoje dzieci"))Charakterystyka próby badawczej
Na początku analizy podjęto się scharakteryzowania próby badawczej. Na poniższym wykresie przedstawiono rozkład płci na wykresie kołowym.
pie_chart_g <- Data_hotdeck %>%
count(CODE_GENDER)
ggplot(pie_chart_g) +
aes(
x0 = 0, y0 = 0,
r0 = 0, r = 1,
amount = n,
fill = CODE_GENDER
) +
geom_arc_bar(stat = "pie") +
coord_fixed() +
scale_fill_brewer(palette = "Set1") +
ggtitle("Udział kobiet i mężczyzn w próbie badawczej") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))Ze stworzonego wykresu wynika, że zdecydowana większość próby badawczej to kobiety. Stanowią one około 67% populacji, a mężczyzny 33%.
Na kolejnym wykresie przedstawiono wykres pudełkowy, prezentujących dochód całkowity w zależności od statusu rodziny.
ggplot(Data_hotdeck, aes(x = INCOME_LOG, fill = NAME_FAMILY_STATUS)) +
geom_boxplot() +
xlab("Dochody") +
ggtitle("Dochód całkowity w zależności od statusu rodziny") +
scale_fill_brewer(palette = "Set1") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))Na osi poziomej wykresu przedstawiono zlogarytmowane wartości dochodów. Każdy wykres pudełkowy odpowiada innemu statusowi rodziny i prezentuje medianę, kwartyle, wartości maksymalne, minimalne oraz obserwacje odstające. Status civil marriage charakteryzuje się dosyć niskimi wartościami z wyraźnie zauważalnymi obserwacjami odstającymi. Ze statusu married można wywnioskować, że dochody mieszczą się głównie w średnim zakresie rozkładu. Dochody w statusie separated są bliskie neutralnego poziomu. Status single / not married charakteryzuje się dochodami zbliżonymi do średniego poziomu, a status widow tym, że dochody są wyraźnie niższe w porównaniu do innych statusów rodzinnych badanych jednostek.
Trzeci wykres charakteryzujący próbę badawczą analizowanego zbioru danych prezentuje udział osób spłacających kredyt w zależności od posiadanego przez nich typu nieruchomości.
ggplot(Data_hotdeck, aes(x = NAME_HOUSING_TYPE, fill = HAS_CHILDREN)) +
geom_bar() +
xlab("Typ nieruchomości") +
ggtitle("Udział osób posiadających dzieci w zależności od typu zamieszkanej nieruchomości") +
scale_fill_brewer(palette = "Set1") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))Z wykresu wynika, że najwięcej osób, które wzięły kredyt, posiadają dom albo mieszkanie. Kolejni pod względem liczności kredytobiorcy to osoby mieszkające z rodzicami, zajmujący mieszkania komunalne oraz mieszkających w wynajmowanych nieruchomościach. Niewielki odsetek osób stanowią te, zamieszkujące pozostałe typy nieruchomości: mieszkania z częścią biurową oraz kooperatywne.
Można zauważyć, że zdecydowana większość próby badawczej nie posiada dzieci. Jest także sporo osób w populacji, które posiadają jedno lub dwoje dzieci. Grupy mające więcej niż dwoje dzieci stanowią niewielki odsetek próby.
Na wykresie widać także, że w grupie “Co-op apartment” większość osób posiada więcej niż dwoje dzieci, a z kolei w grupie “Office apartment” dominują kredytobiorcy bez dzieci. Pozostałe grupy charakteryzują się większym zróżnicowaniem.
Ostatnim wykresem stworzonym w celu analizy próby badawczej jest udział osób z danym wykształceniem w zależności od typu wykonywanego zawodu.
ggplot(Data_hotdeck, aes(x = OCCUPATION_TYPE, fill = NAME_EDUCATION_TYPE)) +
geom_bar() +
xlab("Typ wykonywanego zawodu") +
ggtitle("Udział osób z danym wykształceniem w zależności od typu wykonywanego zawodu") +
scale_fill_brewer(palette = "Set1") +
theme_minimal()+
theme(plot.title = element_text(hjust = 0.5),
legend.position = "bottom") +
coord_flip()Z wykresu wynika, że najpopularniejsze wykonywane zawody w próbie badawczej to robotnicy, sprzedawcy, podstawowy personel, managerowie, kierowcy, pracownicy o umiejętnościach technicznych, księgowi, pracownicy medyczni, personel kuchenny, pracownicy ochrony oraz personel sprzątający. Pozostałe zawody tj. pracownicy HR i IT, robotnicy o niskich kwalifikacjach, prywatna kadra usługowa, agenci nieruchomości, sekretarze oraz kelnerzy i barmani są zdecydowanie mniej popularne.
Można zauważyć, że w próbie badawczej dominuje wykształcenie średnie. Nieznaczny odsetek osób stanowią te z niższym wykształceniem lub nieukończonym wyższym. Sporą grupę stanowią kredytobiorcy o wykształceniu wyższym.
Z analizy próby badawczej można wywnioskować, że jej większość stanowią kobiety. Próba charakteryzuje się także dochodami na średnim poziomie oraz średnim wykształceniem. Dodatkowo, zdecydowana większość kredytobiorców mieszka we własnych domach lub mieszkaniach.
Analiza danych
Spłata kredytu
Po określeniu próby badawczej przystąpiono do wizualizacji danych dotyczących kredytów, jakie zaciągali kredytobiorcy. W celu skonstruowania pierwszej wizualizacji policzono liczbę osób, które nie spłacają kredytu oraz tych, które go spłacają i na tej podstawie stworzono nową tabelę. Następnie wykorzystano te dane i zaprezentowano je na wykresie kołowym.
pie_chart <- Data_hotdeck %>%
count(TARGET_2)
ggplot(pie_chart) +
aes(
x0 = 0, y0 = 0,
r0 = 0, r = 1,
amount = n,
fill = TARGET_2
) +
geom_arc_bar(stat = "pie") +
coord_fixed() +
scale_fill_brewer(palette = "Set1") +
ggtitle("Udział osób mających problemy ze spłatą kredytu i bez problemów ze spłatą kredytu w próbie") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))Na przedstawionym wykresie można zauważyć, że zdecydowana większość analizowanych osób spłaca kredyt.
Spłata kredytu a grupa dochodowa
Kolejna wizualizacja prezentuje udział osób mających problem ze spłatą kredytu w grupie dochodowej.
ggplot(Data_hotdeck, aes(x = INCOME_LOG, fill = TARGET_2)) +
geom_histogram(binwidth = 0.25) +
xlab("Dochód") +
ggtitle("Udział osób mających problem ze spłatą kredytu w grupie dochodowej") +
scale_fill_brewer(palette = "Set1") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))Analizując wykres można powiedzieć, że większość klientów mieści się w środkowym przedziale dochodowym (ok. 11,5–12,5 na osi dochodu w skali logarytmicznej), co wskazuje na koncentrację klientów o przeciętnych dochodach. Problemy ze spłatą kredytu (kolor czerwony) występują w każdej grupie dochodowej, jednak ich proporcja jest różna. Najwięcej przypadków niespłacania kredytu można zaobserwować dla wartości w środkowym przedziale dochodowym.
Dochód jest istotnym czynnikiem wpływającym na zdolność do spłaty kredytu. Klienci z niższych grup dochodowych są bardziej narażeni na trudności, podczas gdy osoby z wyższymi dochodami rzadziej mają problemy z regulowaniem zobowiązań.
Wielkość kredytu a spłata kredytu
Kolejnym krokiem analizy było stworzenie wykresów skrzypcowych dla osób, które spłacają i nie spłacają swoich zobowiązań, w zależności od wielkości zaciągniętego zobowiązania.
ggplot(Data_hotdeck, aes(x = TARGET_2, y = CREDIT_LOG, fill = TARGET_2)) +
geom_violin(trim = FALSE) +
geom_boxplot(width = 0.1, fill = "white", outlier.shape = NA) +
theme_minimal() +
labs(title = "Wielkość kredytu ze względu na grupy z problemami oraz bez problemów ze spłatą kredytów",
x = "", y = "Wielkość kredytu") +
scale_fill_brewer(palette = "Set1") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))Grupę osób mających problem ze spłatą zobowiązania przedstawiono na czerwonym wykresie. Średnia zlogarytmowana wartość kredytu dla tej grupy wynosi około trzynastu. Wartości są skoncentrowane, co może oznaczać, że problem ze spłacaniem zobowiązań mają kredytobiorcy o podobnej wartość kredytu. Wykres niebieski przedstawia grupę osób, które regularnie spłacają swoje zobowiązania. Średnia wartość kredytu jest podobna do grupy niespłacającej zobowiązań. To, co różni oba wykresy to ich zakres. W przypadku grupy spłacającej wartości zaciągniętego kredytu są bardziej zróżnicowane i występuje więcej tych powyżej wartości 13,5.
Wielkość kredytu a wielkość dochodów
Następnie stworzono wykres punktowy przedstawiający zależność zlogarytmowanej zmiennej “wielkość kredytu” od zlogarytowanej wartości “dochodów”. Dodatkowo, na wykresie problemy ze spłatą i spłacanie kredytu kolorem punktów.
ggplot(Data_hotdeck, aes(x = INCOME_LOG, y = CREDIT_LOG, color = TARGET_2))+
geom_point() +
xlab("Dochody") +
ylab("Wielkość kredytu") +
ggtitle("Zależność wielkości kredytu od dochodów") +
scale_fill_brewer(palette = "Set1") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))Z wykresu można wywnioskować, że im więcej zarabia dany kredytobiorca tym większy kredyt bierze. Dominują osoby spłacające kredyt. Można zaobserwować wiele punktów odstających, niezgodnych z ogólnym trendem.
Spłata kredytu a rodzaj kontraktu
W następnej kolejności podjęto się analizy zmiennej TARGET_2 w zależności od rodzaju kontraktu. Procentowy rozkład osób niespłacających kredyt w tych grupach przedstawiono w poniższej tabeli.
Data_hotdeck %>%
group_by(NAME_CONTRACT_TYPE) %>%
summarise(Liczba_obserwacji = n(),
Spłaca = sum(TARGET_2 == "Spłaca"),
Nie_spłaca = sum(TARGET_2 == "Problemy ze spłatą")) %>%
mutate(Procent_nie_spłaca = (Nie_spłaca / Liczba_obserwacji) * 100)## # A tibble: 2 × 5
## NAME_CONTRACT_TYPE Liczba_obserwacji Spłaca Nie_spłaca Procent_nie_spłaca
## <chr> <int> <int> <int> <dbl>
## 1 Cash loans 2243 2090 153 6.82
## 2 Revolving loans 257 241 16 6.23
Z tabeli wynika, że nie istnieje widoczna różnica osób niespłacających kredyt w analizowanych grupach kontraktowych. Dane te zwizualizowano w postaci wykresu słupkowego pokazującego udział osób mających problem ze spłatą kredytu w zależności od rodzaju kontraktu.
ggplot(Data_hotdeck, aes(x = NAME_CONTRACT_TYPE, fill = TARGET_2)) +
geom_bar() +
xlab("Nazwa kontraktu") +
ggtitle("Udział osób mających problem ze spłatą kredytu w zależności od rodzaju kontraktu") +
scale_fill_brewer(palette = "Set1") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))W danych można było wyróżnić dwa rodzaje kontraktów: kredyty odnawialne oraz pożyczki gotówkowe. Zdecydowaną większość stanowią pożyczki gotówkowe, bo jest ich ponad dwa tysiące, natomiast kredyty odnawialne stanowią niewielką liczbę rekordów. Na stworzonym wykresie można zaobserwować zależność, mówiącą o tym, że większość osób spłaca swoje zobowiązania. Na wykresach zaznaczono te osoby kolorem niebieskim. Zarówno na słupku dotyczącym pożyczek gotówkowych, jak i tym z kredytami odnawialnymi, większość obszaru słupka jest niebieska.
Spłata kredytu a poziom edukacji
W następnym etapie analizy danych stworzono tabelę podsumowującą liczbę spłat i problemów ze spłatą w grupach poziomu edukacji.
Data_hotdeck %>%
group_by(NAME_EDUCATION_TYPE) %>%
summarise(Liczba_obserwacji = n(),
Spłaca = sum(TARGET_2 == "Spłaca"),
Nie_spłaca = sum(TARGET_2 == "Problemy ze spłatą")) %>%
mutate(Procent_nie_spłaca = (Nie_spłaca / Liczba_obserwacji) * 100) ## # A tibble: 4 × 5
## NAME_EDUCATION_TYPE Liczba_obserwacji Spłaca Nie_spłaca Procent_nie_spłaca
## <chr> <int> <int> <int> <dbl>
## 1 Higher education 652 622 30 4.60
## 2 Incomplete higher 76 67 9 11.8
## 3 Lower secondary 29 25 4 13.8
## 4 Secondary / secondary … 1743 1617 126 7.23
Ze stworzonej tabeli można wywnioskować, że największy odsetek osób niespłacających kredytu jest w grupie kredytobiorców z niższym wykształceniem, gdyż stanowią one 13,79% swojej grupy. Podobny wynik, bo 11,84% zauważono w grupie niepełnego wyższego wykształcenia. Najmniejsze problemy ze spłatą kredytu mają osoby z wysokim wykształceniem, a osoby o średnim wykształceniu znajdują się na średnim poziomie w porównaniu do innych grup.
W celu dokładnego przeanalizowania danych z powyższej tabeli stworzono wykresy łączące w sobie informacje o poziomie edukacji, wielkości zaciągniętego kredytu oraz spłacania kredytu przez daną osobę.
ggplot(Data_hotdeck, aes(x = INCOME_LOG, y = CREDIT_LOG)) +
geom_point(color = "steelblue") +
facet_wrap(TARGET_2 ~ NAME_EDUCATION_TYPE, ncol = 4) +
ggtitle("Problemy oraz brak problemów ze spłatą kredytu w zależności od poziomu edukacji kredytobiorcy") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))Z wykresów można wywnioskować, że najliczniejsza grupa niespłacająca kredytu należy do poziomu edukacji “secondary/secondary special”, najmniej liczna natomiast do “lower secondary”. Wniosek ten wynika głównie z liczby osób w każdej grupie. Na wykresie zauważono także zależność, że zarobki osób z wyższym wykształceniem są skumulowane na wyższym poziomie niż w innych grupach. Zaciągają oni również najwyższe kredyty. Opozycją dla nich jest grupa o niższym poziomie wykształcenia. Osoby o średnim i niepełnym wyższym wykształceniu mają najbardziej regularne rozproszenie danych.
Wykres potwierdza wcześniej wysnuty wniosek, że większość osób z bazy danych spłaca swoje zobowiązania.
Dane o zamieszkiwanych nieruchomościach
Zdecydowano się również na przeanalizowanie znormalizowanych danych dotyczących cech nieruchomości na poniższym wykresie.
apartment_vars <- c("APARTMENTS_AVG", "BASEMENTAREA_AVG",
"YEARS_BUILD_AVG", "COMMONAREA_AVG",
"ENTRANCES_AVG", "LANDAREA_AVG")
data_long_apartment <- Data_hotdeck %>%
select(all_of(apartment_vars)) %>%
pivot_longer(cols = everything(), names_to = "Variable", values_to = "Value")
ggplot(data_long_apartment, aes(x = Value)) +
geom_density(fill = "steelblue", color = "black") +
facet_wrap(~Variable, scales = "free") +
theme_minimal() +
labs(title = "Dane o zamieszkiwanych nieruchomościach",
x = "Wartość",
y = "Częstotliwość") +
theme(plot.title = element_text(hjust = 0.5))Analiza wykazała, że dla większości cech rozkład wartości jest przesunięty w lewo i cechuje się prawoskośnością. Świadczy to o tym, że wartości są w wielu przypadkach bliskie zeru. Jedynie dla zmiennej dotyczącej wieku budowanej nieruchomości są one lewoskośne i osiągają wartości powyżej 0,5.
Analiza danych wykazała, że większość próby badawczej nie ma problemu ze spłacaniem kredytu. Jeżeli takie problemy występują, to jest to zwykle uwarunkowane niskimi bądź średnimi dochodami danej osoby. Zauważono także, że im dana osoba ma wyższy dochód, tym większy kredyt zaciąga. Co więcej, wywnioskowano, że największe problemy ze spłatą kredytu znajdują się w grupach o niskim lub średnim wykształceniu.
Analiza opisowa
Analizę opisową rozpoczęto od stworzenia wykresu korelacji pomiędzy wybranymi zmiennymi numerycznymi wizualizowaną za pomocą funkcji z pakietu corrplot.
Zakresem wartości korelacji jest zakres od -1 do 1, gdzie:
Korelacja bliska 1 oznacza silny dodatni związek między zmiennymi.
Korelacja bliska 0 wskazuje na brak związku.
Korelacja bliska -1 sugeruje silną zależność ujemną.
corrplot(cor(Data_hotdeck[c("TARGET","CNT_CHILDREN", "AMT_INCOME_TOTAL",
"AMT_CREDIT", "REGION_RATING_CLIENT",
"APARTMENTS_AVG", "BASEMENTAREA_AVG",
"YEARS_BUILD_AVG", "COMMONAREA_AVG",
"ENTRANCES_AVG", "LANDAREA_AVG")]),
method = "number", type = "upper", diag =FALSE)Najwyższą dodatnią korelację można zauważyć między APARTMENTS_AVG a ENTRANCES_AVG oraz APARTMENTS_AVG a BASEMENTAREA_AVG, co oznacza, że średnia powierzchnia mieszkań jest silnie powiązana z liczbą wejść do budynku oraz powierzchnią piwnicy.
AMT_INCOME_TOTAL wykazuje umiarkowaną korelację z AMT_CREDIT (0.43), co sugeruje, że osoby o wyższym dochodzie częściej zaciągają wyższe kredyty.
Wartość korelacji zmiennej REGION_RATING_CLIENT jest bliska zeru, co sugeruje brak silnego związku z innymi zmiennymi. Brak silnej korelacji między zmiennymi a TARGET sugeruje, że inne czynniki (np. zatrudnienie, poziom edukacji, typ pożyczki) mogą mieć większy wpływ na przewidywanie zmiennej dotyczącej regularnego spłacania i niespłacania kredytu.
Następnie stworzono wykres przedstawiający macierz korelacji. Kolory użyte w wizualizacji pozwalają na szybkie rozpoznanie siły oraz kierunku zależności między zmiennymi – ciemnoniebieskie odcienie oznaczają silną dodatnią korelację, natomiast czerwone wskazują na ujemną korelację.
corr_matrix<-cor(Data_hotdeck[c("TARGET","CNT_CHILDREN", "AMT_INCOME_TOTAL",
"AMT_CREDIT", "REGION_RATING_CLIENT",
"APARTMENTS_AVG", "BASEMENTAREA_AVG",
"YEARS_BUILD_AVG", "COMMONAREA_AVG",
"ENTRANCES_AVG", "LANDAREA_AVG")])
corrplot(corr_matrix, method="color")Dzięki zastosowaniu kolorów w odniesieniu do każdej korelacji między zmiennymi oraz usunięciu danych liczbowych z macierzy wizualizacja stała się bardziej czytelna. Najwyższe wartości korelacji oznaczające silne powiązania dodatnie można zauważyć w dolnym prawym rogu wykresu. Pokazują one powiązania między zmiennymi opisującymi charakterystykę nieruchomości.
W kolejnym etapie analizy zdefiniowano funkcję do obliczania
statystyk opisowych dla wybranych zmiennych jakimi będą: wysokość
kredytu oraz wysokość dochodów kredytobiorców. Zmienne te zostaną
pogrupowane według zmiennej TARGET, aby sprawdzić różnice pomiędzy
osobami spłacającymi kredyt oraz tymi, które posiadają problem ze
spłatą.
Statystykami obliczanymi w funkcji są:
minimum;
maksimum;
średnia arytmetyczna;
odchylenie standardowe;
mediana;
Q1 - pierwszy kwartyl;
Q3 - trzeci kwartyl;
skośność;
kurtoza.
Jako pierwszą przeanalizowano zmienną AMT_CREDIT opisującą wysokość kredytu.
Data_hotdeck %>%
select(AMT_CREDIT, TARGET_2) %>%
group_by(TARGET_2) %>%
summarize(minimum=min(AMT_CREDIT),
maksimum=max(AMT_CREDIT),
średnia=mean(AMT_CREDIT),
odchylenie = sd(AMT_CREDIT),
mediana = median(AMT_CREDIT),
Q1=quantile(AMT_CREDIT,0.25),
Q3=quantile(AMT_CREDIT,0.75),
skośność= Skew(AMT_CREDIT),
kurtoza=Kurt(AMT_CREDIT)) %>%
kbl() %>%
kable_classic_2(full_width = F) %>%
kable_paper("striped", full_width = F) %>%
column_spec(1:2, bold = F) %>%
row_spec(1, bold = F, color = "black", background = "white")| TARGET_2 | minimum | maksimum | średnia | odchylenie | mediana | Q1 | Q3 | skośność | kurtoza |
|---|---|---|---|---|---|---|---|---|---|
| Problemy ze spłatą | 11.53156 | 14.92102 | 13.00188 | 0.6118171 | 13.11232 | 12.50618 | 13.42247 | 0.0505161 | -0.2885967 |
| Spłaca | 10.77835 | 14.73870 | 13.05761 | 0.7228547 | 13.14384 | 12.50618 | 13.60271 | -0.3324083 | -0.3040258 |
Podsumowując dane z powyższej tabeli średnia kredytów w grupie
“spłaca” jest wyższa niż w grupie “problemy ze spłatą”, co może
sugerować, że osoby spłacające kredyty mają wyższe zobowiązania.
Najniższy kredyt w grupie posiadającej problemy ze spłatą wynosi
11,53156, a najwyższy 14,92102. W grupie osób bezproblemowo spłacających
kredyt minimalną wartością udzielonego kredytu jest 10,77835, a
maksymalną 14,73870.
Mediana wartości kredytu dla osób z problemami ze spłatą wynosi 13,11232, co wskazuje, że połowa kredytów jest mniejsza lub równa tej kwocie, a połowa większa. W przypadku grupy bez problemów ze spłatą mediana (13,14384) również znajduje się blisko średniej, co sugeruje, że wartości kredytów w obu grupach są stosunkowo jednorodne, choć nieco bardziej w grupie “spłaca”.
Zmienność w obu grupach jest widoczna, jednak to grupa “spłaca” charakteryzuje się większym odchyleniem standardowym (0,7228547) w porównaniu do grupy “problemy ze spłatą” (0,6118171), co oznacza większe zróżnicowanie wartości kredytów wśród osób spłacających bezproblemowo.
Skośność w grupie “problemy ze spłatą” (0,0505161) jest bliska zeru, co sugeruje symetryczny rozkład wartości kredytów, natomiast w grupie “spłaca” skośność wynosi -0,3324083, co oznacza lekkie przesunięcie rozkładu w lewo (więcej niższych wartości kredytów).
Z kolei kurtoza w obu grupach ma wartości ujemne (-0,2885967 w grupie “problemy ze spłatą” i -0,3040258 w grupie “spłaca”), co oznacza, że rozkłady są bardziej płaskie niż rozkład normalny – wartości kredytów są mniej skoncentrowane wokół średniej, a ich rozproszenie jest większe.
Dane sugerują, że osoby z problemami ze spłatą mają nieco bardziej jednorodne zobowiązania niż osoby spłacające kredyty, a ich wartości kredytów są mniej zróżnicowane. Z kolei w grupie “spłaca” kredyty mają większą rozpiętość, co może oznaczać, że w tej grupie znajdują się zarówno osoby z niskimi, jak i wysokimi zobowiązaniami.
Operację powtórzono dla zmiennej AMT_INCOME_TOTAL opisującej wysokość dochodów kredytobiorców.
Data_hotdeck %>%
select(AMT_INCOME_TOTAL, TARGET_2) %>%
group_by(TARGET_2) %>%
summarize(minimum=min(AMT_INCOME_TOTAL),
maksimum=max(AMT_INCOME_TOTAL),
średnia=mean(AMT_INCOME_TOTAL),
odchylenie=sd(AMT_INCOME_TOTAL),
mediana=median(AMT_INCOME_TOTAL),
Q1=quantile(AMT_INCOME_TOTAL,0.25),
Q3=quantile(AMT_INCOME_TOTAL,0.75),
skośność=Skew(AMT_INCOME_TOTAL),
kurtoza=Kurt(AMT_INCOME_TOTAL)) %>%
kbl() %>%
kable_classic_2(full_width = F) %>%
kable_paper("striped", full_width = F) %>%
column_spec(1:2, bold = F) %>%
row_spec(1, bold = F, color = "black", background = "white")| TARGET_2 | minimum | maksimum | średnia | odchylenie | mediana | Q1 | Q3 | skośność | kurtoza |
|---|---|---|---|---|---|---|---|---|---|
| Problemy ze spłatą | 10.49130 | 13.42247 | 11.92960 | 0.4661756 | 11.90835 | 11.63072 | 12.26198 | 0.0978233 | 0.2433553 |
| Spłaca | 10.26817 | 13.82793 | 11.88559 | 0.4948417 | 11.81304 | 11.63072 | 12.21850 | 0.0429838 | 0.3255798 |
W związku z wysokością dochodów kredytobiorców można stwierdzić, że średnie dochody w grupie “problemy ze spłatą” są nieco wyższe i wynoszą 11,92960, w porównaniu do drugiej grupy, gdzie średnie dochody wynoszą 11,88559.
Mediana dochodów w grupie “problemy ze spłatą” wynosi 11,90835, co oznacza, że połowa kredytobiorców w tej grupie zarabia mniej niż ta wartość, a połowa więcej. W grupie “spłaca” mediana jest nieco niższa i wynosi 11,81304, co sugeruje, że dochody w tej grupie są minimalnie niższe, ale dość zbliżone do grupy mającej problemy ze spłatą. Zmienność dochodów w obu grupach jest zauważalna, a odchylenie standardowe wynosi 0,4661756 w grupie “problemy ze spłatą” i 0,4948417 w grupie “spłaca”. Wskazuje to, że rozproszenie dochodów jest większe wśród osób bezproblemowo spłacających kredyt.
Skośność w obu grupach jest dodatnia (0,0978233 w grupie “problemy ze spłatą” i 0,0429838 w grupie “spłaca”), co sugeruje lekką asymetrię w kierunku wyższych wartości dochodów. Nie oznacza to jednak znaczącej przewagi bardzo wysokich dochodów, ponieważ wartości skośności są bliskie zeru.
Kurtoza w obu grupach ma wartości dodatnie (0,2433553 w grupie “problemy ze spłatą” i 0,3255798 w grupie “spłaca”), co oznacza, że rozkłady dochodów są bardziej skupione wokół wartości centralnych niż w rozkładzie normalnym. Grupa “spłaca” charakteryzuje się wyższą kurtozą, co wskazuje na większą koncentrację dochodów wokół średnich wartości.
Wnioski mogą sugerować, że osoby spłacające kredyty mają bardziej skoncentrowane dochody wokół mediany, a wartości skrajne są mniej wyraźne. Z kolei osoby mające problemy ze spłatą mają dochody o podobnym poziomie, jednak ich rozkład jest nieco bardziej rozproszony.
Statystyki opisowe przygotowano także do cech budynków mieszkaniowych analizowanych uprzednio w macierzy korelacji. Pogrupowano je tak jak w dwóch powyższych tabelach ze względu na zmienna TARGET_2 oznaczającą problemy ze spłatą lub ich brak.
Data_hotdeck %>%
select(TARGET_2, APARTMENTS_AVG, BASEMENTAREA_AVG, YEARS_BUILD_AVG, COMMONAREA_AVG, ENTRANCES_AVG, LANDAREA_AVG) %>%
pivot_longer(cols = -TARGET_2, names_to = "Zmienna", values_to = "VALUE") %>%
group_by(Zmienna, TARGET_2) %>%
summarize(minimum=min(VALUE),
maksimum=max(VALUE),
średnia=mean(VALUE),
odchylenie=sd(VALUE),
mediana=median(VALUE),
Q1=quantile(VALUE,0.25),
Q3=quantile(VALUE,0.75),
skośność=Skew(VALUE),
kurtoza=Kurt(VALUE)) %>%
kbl() %>%
kable_classic_2(full_width = F) %>%
kable_paper("striped", full_width = F) %>%
column_spec(1:2, bold = F) %>%
row_spec(1, bold = F, color = "black", background = "white")| Zmienna | TARGET_2 | minimum | maksimum | średnia | odchylenie | mediana | Q1 | Q3 | skośność | kurtoza |
|---|---|---|---|---|---|---|---|---|---|---|
| APARTMENTS_AVG | Problemy ze spłatą | 0.0040916 | 0.3126186 | 0.0975958 | 0.0634068 | 0.0782565 | 0.0648510 | 0.1157365 | 1.2567163 | 1.1260155 |
| APARTMENTS_AVG | Spłaca | 0.0000000 | 0.6838037 | 0.1095510 | 0.0892077 | 0.0878277 | 0.0566165 | 0.1393271 | 1.9937740 | 6.3688553 |
| BASEMENTAREA_AVG | Problemy ze spłatą | 0.0000000 | 0.2362572 | 0.0809718 | 0.0488261 | 0.0715762 | 0.0497421 | 0.1068794 | 0.8922185 | 0.7050735 |
| BASEMENTAREA_AVG | Spłaca | 0.0000000 | 0.6931472 | 0.0838537 | 0.0724259 | 0.0737150 | 0.0484091 | 0.1051705 | 3.5008441 | 22.9508278 |
| COMMONAREA_AVG | Problemy ze spłatą | 0.0000000 | 0.2589739 | 0.0398865 | 0.0387310 | 0.0255703 | 0.0080674 | 0.0513583 | 1.6895845 | 4.7480302 |
| COMMONAREA_AVG | Spłaca | 0.0000000 | 0.4888867 | 0.0446941 | 0.0652911 | 0.0216636 | 0.0077697 | 0.0580802 | 3.2156028 | 13.0134364 |
| ENTRANCES_AVG | Problemy ze spłatą | 0.0339182 | 0.4393511 | 0.1348591 | 0.0599004 | 0.1291845 | 0.0983963 | 0.1590529 | 1.2535307 | 3.8528734 |
| ENTRANCES_AVG | Spłaca | 0.0000000 | 0.6217049 | 0.1368595 | 0.0743803 | 0.1291845 | 0.0826854 | 0.1880551 | 1.2650636 | 3.1982393 |
| LANDAREA_AVG | Problemy ze spłatą | 0.0000000 | 0.2159175 | 0.0538882 | 0.0458839 | 0.0450690 | 0.0157749 | 0.0834216 | 1.4650238 | 2.7345828 |
| LANDAREA_AVG | Spłaca | 0.0000000 | 0.6931472 | 0.0614972 | 0.0711802 | 0.0476467 | 0.0182328 | 0.0807040 | 3.6775220 | 21.2904384 |
| YEARS_BUILD_AVG | Problemy ze spłatą | 0.6192000 | 0.9796000 | 0.7591834 | 0.0816995 | 0.7552000 | 0.7008000 | 0.8232000 | 0.1425733 | -0.5804187 |
| YEARS_BUILD_AVG | Spłaca | 0.2384000 | 1.0000000 | 0.7558126 | 0.1023895 | 0.7552000 | 0.6940000 | 0.8164000 | -0.3520700 | 1.5061309 |
Dla zmiennych APARTMENTS_AVG, BASEMENTAREA_AVG, COMMONAREA_AVG, ENTRANCES_AVG, LANDAREA_AVG minimum wynosi 0, co sugeruje, że niektóre nieruchomości nie mają w ogóle tych cech (np. brak wspólnych przestrzeni, piwnic, działek, wejść). Dla zmiennej YEARS_BUILD_AVG minimum wynosi 0,2384000 dla osób spłacających kredyt, co może wskazywać na obecność nowszych budynków w tej grupie. W grupie osób mających problemy ze spłatą najniższa wartość tej zmiennej wynosi 0,6192000, co sugeruje, że nieruchomości w tej grupie są starsze.
Średnia w grupie “problemy ze spłatą” dla zmiennej APARTMENTS_AVG wynosi 0,0975958, a w grupie “spłaca” wynosi 0,1095510, co sugeruje, że osoby spłacające kredyt mają nieco większe mieszkania niż osoby z problemami. Podobna tendencja widoczna jest w przypadku powierzchni piwnic (0,0809718 w porównaniu do 0,0838537) i działek (0,0538882 w porównaniu do 0,0614972), co wskazuje, że osoby spłacające kredyt mają nieco większe nieruchomości. Natomiast powierzchnia wspólnych przestrzeni jest zbliżona w obu grupach (0,0398865 w porównaniu do 0,0446941).
Dzięki zmiennej opisującej wiek nieruchomości można zauważyć, że osoby z problemami mają średnio nieco starsze budynki, choć różnice są niewielkie.
W przypadku zmiennych takich jak APARTMENTS_AVG czy LANDAREA_AVG, odchylenie standardowe wskazuje na dużą rozbieżność w wielkości nieruchomości, zwłaszcza w grupie spłacających kredyt (0,0892077 porównując do 0,0634068 dla mieszkań, 0,0711802 do 0,0458839 dla działek). Natomiast dla zmiennych takich jak BASEMENTAREA_AVG czy COMMONAREA_AVG, odchylenie jest mniejsze, co oznacza mniejszą zmienność w tych cechach.
Mediana dla powierzchni mieszkań, piwnic i działek jest nieco wyższa w grupie spłacających kredyt, co sugeruje, że osoby te mieszkają w nieruchomościach o większej powierzchni w tych kategoriach. Mediana dla wspólnych przestrzeni jest niższa w grupie spłacających, co sugeruje, że nieruchomości w tej grupie mają mniejsze przestrzenie wspólne. Mediana liczby wejść jest identyczna w obu grupach i wynosi 0,1291845.
Wartości skośności wskazują, że w obu grupach występuje przesunięcie w stronę wyższych wartości, ale jest szczególnie widoczne w grupie spłacających kredyt - skośność dla BASEMENTAREA_AVG wynosi 3,5008441 porównując do 0,8922185 w grupie z problemami. Sugeruje to, że w grupie “spłaca” występują bardziej ekstremalne wartości, np. pojedyncze nieruchomości z bardzo dużymi piwnicami.
Kurtoza wskazuje na silną koncentrację danych wokół średnich wartości w obu grupach, z wyraźnie większą koncentracją w grupie spłacających kredyt. Wartości kurtozy są szczególnie wysokie w przypadku zmiennych takich jak APARTMENTS_AVG czy BASEMENTAREA_AVG, co sugeruje, że w tych grupach pojawiają się skrajne przypadki (np. bardzo duże mieszkania, czy piwnice).
Dodatkowo stworzono wizualizację rozkładu danych, w której porównano dwie grupy pod kątem różnic w wartościach. W tym celu stworzono wykres skrzypcowy porównujący kwoty kredytów (AMT_CREDIT) w zależności od posiadania nieruchomości (FLAG_OWN_REALTY).
ggstatsplot :: ggbetweenstats(
data = Data_hotdeck,
x = FLAG_OWN_REALTY,
y = AMT_CREDIT,
type = "np",
palette = "Set1",
title = "Porównanie kwot kredytów w zależności od posiadania nieruchomości") +
theme(plot.title = element_text(hjust = 0.5))Oś pozioma (X) przedstawia kategorię: N (Nie posiada nieruchomości) i Y (Posiada nieruchomość). Oś pionowa reprezentuje kwotę kredytu, gdzie kolory reprezentują dwie grupy: czerwony (osoby nieposiadające nieruchomości), niebieski (osoby posiadające nieruchomość).
Z wykresu można wywnioskować, że osoby nieposiadające nieruchomości zaciągają nieco wyższe kredyty (mediana = 13,19) w porównaniu do osób posiadających nieruchomości (mediana = 13,11). Rozkład kredytów w obu grupach jest zbliżony, ale osoby bez nieruchomości mają więcej ekstremalnych wartości. Wartość p = 0,000339 sugeruje, że różnica jest istotna statystycznie, ale efekt nie jest duży (r_biserial = 0,09).
Testy statystyczne
W ramach niniejszego rozdziału przeprowadzono analizę statystyczną zbioru danych. Ma ona na celu zbadanie zależności pomiędzy wybranymi zmiennymi. Wykorzystane metody statystyczne pozwolą na ocenę istotności różnic oraz zidentyfikowanie potencjalnych zależności w danych.
Dokonano kategoryzacji danych liczbowych dotyczących dochodów (AMT_INCOME_TOTAL) oraz kwoty kredytu (AMT_CREDIT) na pięć równych przedziałów, co pozwala na lepsze przedstawienie struktury tych zmiennych. Podział ten umożliwia łatwiejszą intrpretację wyników i identyfikację ewentualnych różnic między grupami dochodowymi. W celu wizualizacji wyników wykorzystano histogramy oraz wykresy słupkowe, co ułatwia interpretację rozkładów.
Uzyskane wyniki dostarczają cennych informacji na temat struktury dochodów oraz udzielanych kredytów.
Data_hotdeck <- Data_hotdeck %>%
mutate(data_kat_income = binning(Data_hotdeck$AMT_INCOME_TOTAL, nbins = 5, type = "equal"))data_kat_income <- binning(Data_hotdeck$AMT_INCOME_TOTAL, nbins = 5, type = "equal")
summary(data_kat_income)## levels freq rate
## 1 [10.26817,10.98012] 88 0.0352
## 2 (10.98012,11.69207] 792 0.3168
## 3 (11.69207,12.40403] 1268 0.5072
## 4 (12.40403,13.11598] 336 0.1344
## 5 (13.11598,13.82793] 16 0.0064
Data_hotdeck <- Data_hotdeck %>%
mutate(data_kat_credit = binning(Data_hotdeck$AMT_CREDIT, nbins = 5, type = "equal"))data_kat_credit <- binning(Data_hotdeck$AMT_CREDIT, nbins = 5, type = "equal")
summary(data_kat_credit)## levels freq rate
## 1 [10.77835,11.60689] 65 0.0260
## 2 (11.60689,12.43542] 437 0.1748
## 3 (12.43542,13.26395] 963 0.3852
## 4 (13.26395,14.09249] 887 0.3548
## 5 (14.09249,14.92102] 148 0.0592
Pierwsza hipoteza, którą zdecydowano się postawić, ma na celu
zbadanie czy poziom edukacji (NAME_EDUCATION_TYPE) ma istotny wpływ na
problemy ze spłatą kredytu (TARGET_2).
Hipotezy statystyczne:
H₀: Nie ma istotnej zależności między poziomem edukacji, a problemami ze spłatą kredytu. Rozkład wartości TARGET_2 jest równomierny w różnych grupach edukacyjnych.
H₁: Istnieje istotna zależność między poziomem edukacji, a problemami ze spłatą kredytu. Pewne grupy edukacyjne mają wyraźnie większe lub mniejsze ryzyko problemów kredytowych.
ggbarstats(
data = Data_hotdeck,
x = NAME_EDUCATION_TYPE,
y = TARGET_2,
caption = "test",
package = "ggsci",
palette = "default_igv",
title = "Rozkład poziomu edukacji w zależności od problemów ze spłatą kredytu") +
theme(plot.title = element_text(hjust = 0.5))Wartość p=0,01 wskazuje na to, że poziom edukacji wpływa na problemy ze spłatą kredytu. Współczynnik V Craméra (0,06) sugeruje słabą zależność między zmiennymi. P-value jest mniejsze niż poziom istotności α=0,05. Odrzucamy hipotezę zerową. Oznacza to, że istnieje statystycznie istotna zależność między poziomem edukacji, a problemami ze spłatą kredytu.
Na podstawie rozkładu poziomu edukacji w zależności od problemów ze spłatą kredytu można zauważyć pewne różnice. Osoby z wykształceniem średnim dominują w obu grupach, ale ich udział jest większy wśród osób mających problemy ze spłatą kredytu (75%). Sugeruje to, że wykształcenie średnie jest najczęściej występującym poziomem edukacji w badanej próbie, jednak w grupie z problemami kredytowymi odsetek ten jest większy. Osoby z wykształceniem wyższym częściej spłacają kredyt regularnie (27%) w porównaniu do tych, które mają problemy (18%).
Druga postawiona hipoteza związana jest ze sprawdzeniem, czy istnieje zależność między przedziałem kwot branego kredytu, a statusem rodzinnym. Chcemy zobaczyć jak np. małżeństwa czy osoby samotne różnią się pod względem wielkości kredytów, które biorą. Zdecydowano się na wizualizację kołową.
Hipotezy statystyczne:
H₀: Nie ma zależności między przedziałem kwoty kredytu (data_kat_credit), a statusem rodzinnym (NAME_FAMILY_STATUS). Rozkład wielkości kredytów jest taki sam we wszystkich grupach rodzinnych.
H₁: Istnieje zależność między przedziałem kwoty kredyt, a statusem rodzinnym. Rozkład wielkości kredytów różni się w zależności od statusu rodziny.
ggpiestats(
data = Data_hotdeck,
x = data_kat_credit,
y = NAME_FAMILY_STATUS,
palette = "Set1",
title = "Rozkład pięciu przedziałów kredytów w zależności od statusu rodziny") +
theme(plot.title = element_text(hjust = 0.5))Na wykresie przedstawiono wyniki testu chi-kwadrat dla każdej grupy. Dla każdej z nich p-value < 0,05, co oznacza, że odrzucamy hipotezę zerową. Istnieje istotny statystycznie związek między przedziałem kwoty kredytu, a statusem rodzinnym. Współczynnik V Craméra (0,08), wskazuje na słaby, ale istotny związek między zmiennymi.
Analizując otrzymane wykresy można zauważyć kilka istotnych wniosków. W większości grup statusu rodzinnego, kredyty w średnim przedziale (12,43542 - 13,26395) stanowią największy udział. W grupie ozaczone jako “Wdowy”, 45% osób korzysta z tego przedziału kredytowego, a w grupie „Single / not married” jest to 43%.
Największy udział jednego z niższych przedziałów kredytowych (11,60689 - 12,43542) występuje w grupach: Widow (24%), Single / not married (23%), oraz Separated (19%). W grupie Married udział najniższego przedziału wynosi 15%, co oznacza, że małżeństwa częściej biorą kredyty w wyższych przedziałach niż inne grupy.
Wyższe przedziały kredytów są bardziej popularne wśród osób pozostających w małżeństwie. W grupie Married, aż 39% osób korzysta z kredytów w wyższych przedziałach, w tym 7% z najwyższego przedziału. W innych grupach udział wyższych przedziałów kredytów jest znacznie mniejszy.
Osoby samotne i osoby po rozwodzie częściej biorą niższe kredyty. W grupach Single, Widow i Separated, kredyty z wyższych przedziałów stanowią jedynie niewielki procent wszystkich przypadków, co sugeruje ograniczone możliwości finansowe tych grup.
Wyniki wskazują na istotne różnice w struktorze kwot kredytów między osobami z poszczególnych grup ze względy na status rodzinny. Warto jednak zauważyć, że uwzględniając współczynnik V Craméra sugeruje, że zależność ta nie jest dominującym czynnikiem.
Wykorzystano również analizę wariancji (ANOVA). Celem tego testu jest zrozumienie, jak typ zawodu oraz sytuacja mieszkaniowa wpływają na to, czy klient ma problemy ze spłatą kredytu.
W modelu uwzględniono interakcję między zmiennymi OCCUPATION_TYPE i NAME_HOUSING_TYPE. Oznacza to, że sprawdzamy nie tylko główny wpływ każdej z tych zmiennych na TARGET, ale także, czy wpływ jednej zmiennej zależy od poziomu drugiej zmiennej.
W przypadku tego modelu ANOVA postawiono następujące hipotezy dotyczące efektów:
H₀: Typ zawodu OCCUPATION_TYPE nie ma wpływu na zmienną zależną TARGET, a typ sytuacji mieszkaniowej NAME_HOUSING_TYPE nie ma wpływu na zmienną zależną TARGET.
H₁: Typ zawodu OCCUPATION_TYPE ma istotny wpływ na zmienną zależną TARGET, a Typ sytuacji mieszkaniowej NAME_HOUSING_TYPE ma istotny wpływ na zmienną zależną TARGET.
Postawiono również hipotezy dotyczące interakcji:
H₀: Nie ma interakcji między typem zawodu (OCCUPATION_TYPE), a typem sytuacji mieszkaniowej (NAME_HOUSING_TYPE) w odniesieniu do zmiennej zależnej TARGET.
H₁: Istnieje interakcja między typem zawodu (OCCUPATION_TYPE), a typem sytuacji mieszkaniowej (NAME_HOUSING_TYPE) w odniesieniu do zmiennej zależnej TARGET.
## Df Sum Sq Mean Sq F value Pr(>F)
## OCCUPATION_TYPE 17 4.10 0.24106 3.527 1.31e-06 ***
## NAME_HOUSING_TYPE 5 1.06 0.21110 3.089 0.00877 **
## OCCUPATION_TYPE:NAME_HOUSING_TYPE 49 4.46 0.09108 1.333 0.06195 .
## Residuals 2428 165.94 0.06835
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggcoefstats(mod, title = "Test Anova dla zmiennej TARGET w zależności od typu zawodu i typu nieruchomości")+
theme(plot.title = element_text(hjust = 0.5))Typ zawodu (OCCUPATION_TYPE) ma istotny wpływ na to, czy klient ma
problemy ze spłatą kredytu, ponieważ wartość p-value jest bardzo mała
(0,0000959), odrzucamy hipotezę zerową. Sytuacja mieszkaniowa
(NAME_HOUSING_TYPE) również ma istotny wpływ na problemy ze spłatą
kredytu, z wartością p-value wynoszącą 0,00233, również odrzucamy w
takim wypadku hipotezę zerową.
Interakcja między typem zawodu, a sytuacją mieszkaniową jest istotna
statystycznie (p = 0,00388), oznacza to że wpływ jednego czynnika na
TARGET (problemy ze spłatą kredytu) zależy od poziomu drugiego czynnika.
Istotna interakcja pokazuje, że zawód i sytuacja mieszkaniowa razem mają
bardziej złożony wpływ na to, czy klient ma problemy ze spłatą kredytu,
niż gdybyśmy oceniali te zmienne oddzielnie.
Podsumowanie i wnioski końcowe
Celem projektu było znalezienie trendów wskazujących na to, że dany klient ma problemy ze spłatą zobowiązań. W pierwszym etapie zapoznano się ze zmiennymi znajdującymi się w bazie danych dotyczącej klientów składających wniosek o kredyt. Zdecydowano się na analizę 20 kluczowych dla problemu kolumn, a następnie wylosowano 2500 rekordów.
Niezwykle istotnym etapem było zidentyfikowanie braków danych. Okazało się, że jest ich 9409, co stanowi 18,82% wszystkich obserwacji. Ustalono również, że pojawiają się one tylko i wyłącznie w przypadku 7 zmiennych. Stworzono również mapę cieplną, aby zwizualizować, jaki jest procentowy udział braków danych w zmiennych oraz upset plot w celu przeanalizowania złożonych relacji między grupami cech. Podjęto się również wizualizacji braków danych w zależności od zmiennej TARGET, by dostrzec zależności pomiędzy pojawiającymi się brakami danych. Zamieniono również wartości specjalne Inf na NA. Przeprowadzono test Grubbsa mający na celu sprawdzenie, czy w zbiorze danych występują obserwacje odstające. W wyniku testu stwierdzono, że outliery znajdują się w kolumnach AMT_INCOME_TOTAL, AMT_CREDIT, APARTMENTS_AVG, ENTRANCES_AVG, CNT_CHILDREN i YEARS_BUILD_AVG. Kolejnym etapem było usunięcie braków danych przy pomocy metody Hot-deck, w wyniku czego obserwacje brakujące zostały zapełnione przez odpowiadające im wartości z podobnych rekordów. Podjęto się również walidacji danych i każdej zmiennej przypisano reguły, na podstawie których program zidentyfikował dane niepoprawne. W wyniku tego procesu znaleziono 470 wartości niezgodnych z regułami w kolumnie ORGANIZATION_TYPE, 7 w kolumnie BASEMENTAREA_AVG, 11 w kolumnie COMMONAREA_AVG i 2 w kolumnie LANDAREA_AVG. Ustalono, że niektóre z tych danych nie przeszły walidacji, ponieważ daty w zbiorze danych zostały zapisane w nieodpowiednim formacie. Podjęto odpowiednie działania, aby naprawić ten błąd, a następnie skorzystano z kodu mającego na celu uproszczenie reguł walidacyjnych. Ustalono, że pozostałe niepoprawne dane to 0,9% całości i zdecydowano się na metodę imputacji brakujących danych za pomocą algorytmu k-Nearest Neighbors (kNN).
W kolejnym kroku skorzystano z metody standaryzacji z-score, aby ułatwić porównywanie rozkładów oraz identyfikację odstających wartości. Zdecydowano się na zidentyfikowanie zmiennych, które powodują problem skośności i odfiltrowanie tych, których poziom skośności przekracza 0,1. Okazało się, że zmienne, które powodują problem ze skośnością w zbiorze danych to AMT_INCOME_TOTAL, AMT_CREDIT, APARTMENTS_AVG, YEARS_BUILD_AVG, ENTRANCES_AVG oraz CREDIT_LOG. Stworzono dla nich histogramy, aby sprawdzić rozkład danych i potwierdzono istnienie problemu skośności. Zdecydowano się na transformację zmiennych przy użyciu logarytmu+1, co rozwiązało problem. Dodatkowo, wykonano procedurę binnigu dla zmiennych AMT_INCOME_TOTAL oraz AMT_CREDIT, aby przekształcić zmienne ilościowe w kategoryczne.
Przed wizualizacją danych dokonano charakterystyki próby badawczej. Większość, bo aż 67% analizowanej próby, stanowiły kobiety. Analizowane są głównie osoby o średnim wykształceniu oraz średnich dochodach. Przeanalizowano zależność dochodów od statusu rodziny. Wyniki pokazały, że wdowy oraz wdowcy osiągają najniższe dochody oraz grupa ta jest najbardziej zróżnicowana pod tym względem. W małżeństwach dochody znajdują się w górnym zakresie dochodów. W przypadku osób rozwiedzionych, samotnych lub niezamężnych dochody są na średnim poziomie. Podczas analizy próby zauważono, że kredytobiorcy najczęściej zamieszkują własny dom, własne mieszkanie lub dom rodzinny. Zdecydowana większość próby to osoby nieposiadające dzieci lub posiadające ich jedno lub dwoje. Dodatkowo, najczęściej kredyty biorą robotnicy, sprzedawcy, podstawowy personel, managerowie, kierowcy itd. Zdecydowaną mniejszość stanowią pracownicy działów IT oraz HR, a także agenci nieruchomości.
Badanie danych o zaciągniętych kredytach wykazało, że większość osób poddanych tej analizie nie ma problemu ze spłacaniem kredytu. Zauważono także zależność, mówiącą o tym, że im więcej zarabia dana osoba, tym większy kredyt zaciąga. Ewentualne trudności z jego spłatą są zwykle uwarunkowane niskimi bądź średnimi dochodami. Osoby z niską płynnością finansową zazwyczaj charakteryzują się niższym lub średnim wykształceniem.
Następnie przeprowadzono analizę opisową, która rozpoczęła się od stworzenia wykresu korelacji pomiędzy wybranymi zmiennymi numerycznymi, co pozwoliło na ocenę zależności między danymi. Najwyższą dodatnią korelację odnotowano między zmiennymi APARTMENTS_AVG a ENTRANCES_AVG oraz BASEMENTAREA_AVG, co wskazuje, że większa powierzchnia mieszkań jest silnie związana z liczbą wejść do budynku oraz powierzchnią piwnicy. Dodatkowo, umiarkowaną korelację wykazuje zmienna AMT_INCOME_TOTAL z AMT_CREDIT, sugerując, że osoby o wyższych dochodach zaciągają wyższe kredyty.
W kolejnym etapie obliczono statystyki opisowe dla zmiennych AMT_CREDIT i AMT_INCOME_TOTAL. Badanie wykazało, że osoby regularnie spłacające kredyty zaciągają nieco wyższe średnie kwoty pożyczek. Kwoty te charakteryzują się większą zmiennością w grupie spłacających (odchylenie standardowe: 0,7228547) w porównaniu do osób z problemami ze spłatą (odchylenie standardowe: 0,6118171). W przypadku dochodów, średnie wartości są zbliżone w obu grupach. Osoby z problemami ze spłatą mają nieco wyższe dochody, przy czym ich rozkład jest bardziej rozproszony.
Przygotowano także analizę dotyczącą cech nieruchomości. Osoby spłacające kredyty mieszkają w nieco większych nieruchomościach niż osoby z problemami ze spłatą. W pierwszej grupie powierzchnia nieruchomości wykazuje się większą zmiennością. Osoby z problemami ze spłatą mają starsze nieruchomości. Istnieją też różnice w rozkładzie danych, z większą koncentracją średnich wartości dla osób spłacających kredyty.
Na zakończenie analizy opisowej stworzono wykres skrzypcowy, w którym porównano kwoty kredytów w zależności od faktu posiadania nieruchomości. Mediana kwoty kredytu dla osób nieposiadających nieruchomości wynosi 13,19 i jest nieco wyższa niż wśród osób posiadających nieruchomość (13,11), co wskazuje na pewne rozbieżności między tymi grupami. Choć różnica ta jest istotna statystycznie (p = 0,000339), jej wpływ pozostaje niewielki (r_biserial = 0,09).
W celu zbadania jakie występują zależności między wybranymi zmiennymi zdecydowano się na przeprowadzenie testów statystycznych. Przeanalizowano dane związane z dochodem, kwotami kredytów, poziomem edukacji, statusem rodzinnym, zawodem oraz sytuacją mieszkaniową w kontekście problemów ze spłatą kredytu.
Pierwsza hipoteza pozwoliła na stwierdzenie tego, że osoby z wykształceniem średnim częściej mają problemy ze spłatą kredytu, a osoby z wykształceniem wyższym spłacają go regularnie. Weryfikacja drugiej hipotezy pokazała, że małżeństwa częściej występują o wyższe kwoty kredytu, podczas gdy osoby samotne i te po rozwodzie częściej biorą niższe kredyty.
Zastosowano również test ANOVA, aby sprawdzić, jak typ zawodu oraz sytuacja mieszkaniowa wpływają na problemy ze spłatą kredytu. Wyniki wykazały, że te czynniki mają istotny wpływ na to, czy klient ma problemy ze spłatą kredytu. Dodatkowo, wykryto istotną interakcję między tymi dwoma zmiennymi. Ich wspólny wpływ na problemy ze spłatą kredytu jest bardziej złożony, niż jeżeli byłyby one analizowane osobno.