Podstawowe operacje w R - część 4.

Czyszczenie danych

Zadanie domowe

Korzystając z paczki danych “germancredit” dotyczącą oceny kredytowej (creditability) wybranych klientów pewnego banku:

Czy w zbiorze danych mamy obserwacje brakujące?

Proszę dokonać kategoryzacji zmiennej “age.in.years” (wiek w latach) wg oceny kredytowej “creditability”.

Podaj i zinterpretuj wskaźniki informacyjne. Oceń skośność zmiennych ilościowych.

Sprawdź, czy nie mamy obserwacji odstających dla zmiennej “age.in.years” (wiek w latach). Jeśli są - dokonaj imputacji wybraną przez siebie metodą.

library(evtree)
## Warning: pakiet 'evtree' został zbudowany w wersji R 4.2.2
## Ładowanie wymaganego pakietu: partykit
## Warning: pakiet 'partykit' został zbudowany w wersji R 4.2.2
## Ładowanie wymaganego pakietu: libcoin
## Warning: pakiet 'libcoin' został zbudowany w wersji R 4.2.2
## Ładowanie wymaganego pakietu: mvtnorm
data("GermanCredit")
summary(GermanCredit)
##                                         status       duration   
##  ... < 0 DM                                :274   Min.   : 4.0  
##  0 <= ... < 200 DM                         :269   1st Qu.:12.0  
##  ... >= 200 DM / salary for at least 1 year: 63   Median :18.0  
##  no checking account                       :394   Mean   :20.9  
##                                                   3rd Qu.:24.0  
##                                                   Max.   :72.0  
##                                                                 
##                                      credit_history                purpose   
##  no credits taken/all credits paid back duly: 40    domestic appliances:280  
##  all credits at this bank paid back duly    : 49    car (new)          :234  
##  existing credits paid back duly till now   :530    radio/television   :181  
##  delay in paying off in the past            : 88    car (used)         :103  
##  critical account/other credits existing    :293    others             : 97  
##                                                     retraining         : 50  
##                                                     (Other)            : 55  
##      amount                            savings            employment_duration
##  Min.   :  250   ... < 100 DM              :603   unemployed        : 62     
##  1st Qu.: 1366   100 <= ... < 500 DM       :103   ... < 1 year      :172     
##  Median : 2320   500 <= ... < 1000 DM      : 63   1 <= ... < 4 years:339     
##  Mean   : 3271   ... >= 1000 DM            : 48   4 <= ... < 7 years:174     
##  3rd Qu.: 3972   unknown/no savings account:183   ... >= 7 years    :253     
##  Max.   :18424                                                               
##                                                                              
##  installment_rate                          personal_status_sex
##  Min.   :1.00     male : divorced/separated          : 50     
##  1st Qu.:2.00     female : divorced/separated/married:310     
##  Median :3.00     male : single                      :548     
##  Mean   :2.97     male : married/widowed             : 92     
##  3rd Qu.:4.00     female : single                    :  0     
##  Max.   :4.00                                                 
##                                                               
##       other_debtors present_residence
##  none        :907   Min.   :1.00     
##  co-applicant: 41   1st Qu.:2.00     
##  guarantor   : 52   Median :3.00     
##                     Mean   :2.85     
##                     3rd Qu.:4.00     
##                     Max.   :4.00     
##                                      
##                                               property        age      
##  real estate                                      :282   Min.   :19.0  
##  building society savings agreement/life insurance:232   1st Qu.:27.0  
##  car or other                                     :332   Median :33.0  
##  unknown/no property                              :154   Mean   :35.5  
##                                                          3rd Qu.:42.0  
##                                                          Max.   :75.0  
##                                                                        
##  other_installment_plans     housing    number_credits
##  bank  :139              rent    :179   Min.   :1.00  
##  stores: 47              own     :713   1st Qu.:1.00  
##  none  :814              for free:108   Median :1.00  
##                                         Mean   :1.41  
##                                         3rd Qu.:2.00  
##                                         Max.   :4.00  
##                                                       
##                                                          job     
##  unemployed/unskilled - non-resident                       : 22  
##  unskilled - resident                                      :200  
##  skilled employee/official                                 :630  
##  management/self-employed/highly qualified employee/officer:148  
##                                                                  
##                                                                  
##                                                                  
##  people_liable  telephone foreign_worker credit_risk
##  Min.   :1.00   no :596   yes:963        good:700   
##  1st Qu.:1.00   yes:404   no : 37        bad :300   
##  Median :1.00                                       
##  Mean   :1.16                                       
##  3rd Qu.:1.00                                       
##  Max.   :2.00                                       
## 
sum(is.na(GermanCredit))
## [1] 0
rules <- validator(
people_liable > 0
,number_credits > 0
,age > 1
,amount > 0
,duration > 0
)

fixable_data <- replace_errors(GermanCredit, rules)
sum(is.na(GermanCredit))
## [1] 0
sum(is.na(fixable_data))
## [1] 0
GermanCredit$creditability <- as.numeric(GermanCredit$credit_risk)
GermanCredit$creditability <- transform(GermanCredit$creditability, method = "minmax")

bin <- binning_by(GermanCredit, y="creditability", x="age")
summary(bin)
## ── Binning Table ──────────────────────── Several Metrics ── 
##       Bin CntRec CntPos CntNeg RatePos RateNeg    Odds      WoE      IV     JSD
## 1 [19,25]    190     80    110 0.26667 0.15714 0.72727  0.52884 0.05792 0.00716
## 2 (25,75]    810    220    590 0.73333 0.84286 0.37288 -0.13920 0.01525 0.00190
## 3   Total   1000    300    700 1.00000 1.00000 0.42857       NA 0.07317 0.00906
##       AUC
## 1 0.02095
## 2 0.53381
## 3 0.55476
## 
## ── General Metrics ───────────────────────────────────────── 
## • Gini index                       :  0.10952
## • IV (Jeffrey)                     :  0.07317
## • JS (Jensen-Shannon) Divergence   :  0.00906
## • Kolmogorov-Smirnov Statistics    :  0.10952
## • HHI (Herfindahl-Hirschman Index) :  0.6922
## • HHI (normalized)                 :  0.3844
## • Cramer's V                       :  0.12794 
## 
## ── Significance Tests ──────────────────── Chisquare Test ── 
##     Bin A   Bin B statistics      p_value
## 1 [19,25] (25,75]    16.3681 0.0000521562
#Gini Index mówi o nierówności rozkładu, wskazuje na nierówność na poziomie 11% oceny kredytowej w stosunku do wieku
#JS (Jensen-Shannon) Divergence - rozbieżność w rozkładach dwóch kategorii na poziomie 1% - niewielka
#Kolmogorov-Smirnov Statistics - 11%, poziom podobieństwa dystrybucji dwóch populacji
#HHI - mierzy koncentrację oraz kompetetywność, w tym przypadku prawdopodobnie nie znajduje zastosowania (wartość i tak jest bardzo mała, rynek pożyczek nie jest kompetetywny od strony konsumenta)
#Cramers V - 12.8%, przyjmuje się, że przy poziomie 10% zmienne są od siebie zależne, można więc założyć zależność między wiekiem a zdolnością kredytową

plot(bin)

find_skewness(GermanCredit, index = F,value = T)
##          duration            amount  installment_rate present_residence 
##             1.093             1.947            -0.531            -0.272 
##               age    number_credits     people_liable 
##             1.019             1.271             1.907
#duration (1.093) - większość kredytów przydzielana jest na krótszy okres
#Amount (1.947) - Duża część kredytów jest udzielana na niższe kwoty
#number_credits (1.271) - Większość osób zapożyczających się ma aktualnie mniej kredytów to spłacania od średniej
#people_liable (1.907) - Większość kredytów zaciągana jest przez jedną osobę, nie wspólnie
#installment_rate (-0,531) - Większość osób wchodzi z kapitałem własnym powyżej średniej
#present_residence (-0,272) - Większość kredytobiorców przebywa w obecnym miejscu zamieszkania dłużej niż średnia'

GermanCredit$age<-imputate_outlier(GermanCredit, age, method="capping")
summary(GermanCredit$age)
## Impute outliers with capping
## 
## * Information of Imputation (before vs after)
##                     Original    Imputation 
## described_variables "value"     "value"    
## n                   "1000"      "1000"     
## na                  "0"         "0"        
## mean                "35.546"    "35.350"   
## sd                  "11.3755"   "10.8530"  
## se_mean             "0.359724"  "0.343202" 
## IQR                 "15"        "15"       
## skewness            "1.020739"  "0.821878" 
## kurtosis            " 0.595780" "-0.132573"
## p00                 "19"        "19"       
## p01                 "20"        "20"       
## p05                 "22"        "22"       
## p10                 "23"        "23"       
## p20                 "26"        "26"       
## p25                 "27"        "27"       
## p30                 "28"        "28"       
## p40                 "30"        "30"       
## p50                 "33"        "33"       
## p60                 "36"        "36"       
## p70                 "39"        "39"       
## p75                 "42"        "42"       
## p80                 "45"        "45"       
## p90                 "52"        "52"       
## p95                 "60"        "60"       
## p99                 "67.01"     "63.00"    
## p100                "75"        "64"
plot(GermanCredit$age)