1 Wprowadzenie i Cel Projektu

1.1 Kontekst projektu

Współczesna bankowość opiera się na precyzyjnej ocenie zachowań klientów przy użyciu modeli statystycznych. Projekt dotyczy analizy ofert kredytów samochodowych banku działającego na rynku USA.

Głównym problemem badawczym jest identyfikacja czynników wpływających na decyzję klienta o zaakceptowaniu oferty kredytu samochodowego. W procesie sprzedaży bank napotyka na opór wynikający z ofert konkurencji (compet_interest) oraz indywidualnego profilu ryzyka klienta (risk_group, FICO_score). Kluczowe jest zrozumienie, jak parametry takie jak stopa procentowa czy kwota kredytu wpływają na prawdopodobieństwo sukcesu sprzedażowego.

1.2 Cel i efekty projektu

1.2.1 Cel ogólny

Głównym celem projektu jest opracowanie modelu scoringowego, który na podstawie danych historycznych dotyczących ofert kredytów samochodowych pozwoli na ocenę prawdopodobieństwa podjęcia decyzji przez klienta. Projekt ma na celu przeprowadzenie pełnego procesu modelowania, od wstępnej analizy danych, przez budowę karty scoringowej, aż po ocenę jakości klasyfikacji.

1.2.2 Planowane efekty

Rezultatem prac nad projektem będą następujące elementy:

  • Raport analityczny: Kompleksowe podsumowanie zawierające opis procesu przygotowania danych, analizę zmiennych, wyniki modelowania oraz wnioski.
  • Kody źródłowe: Kompletny i udokumentowany skrypt w języku R, zapewniający pełną odtwarzalność przeprowadzonych analiz.
  • Funkcja scoringowa: Funkcja, która po wprowadzeniu parametrów oferty automatycznie obliczy ocenę punktową dla danego klienta.

1.2.3 Metodyka

W ramach projektu wykorzystane zostaną klasyczne metody uczenia nadzorowanego stosowane w modelowaniu ryzyka. Proces obejmie:

  1. Inżynierię i ekstrakcję cech (feature engineering).
  2. Transformację zmiennych metodą Weight of Evidence (WoE) oraz ich dyskretyzację (kubełkowanie).
  3. Selekcję predyktorów w oparciu o wskaźnik Wartości Informacyjnej (Information Value, IV).
  4. Budowę modelu regresji logistycznej.
  5. Skalowanie wyników modelu do postaci klasycznej karty scoringowej (Scorecard).
  6. Ocenę siły dyskryminacyjnej modelu przy pomocy krzywej ROC, pola pod krzywą (AUC) oraz współczynnika Giniego.

2 Opis Zbioru Danych

Poniższa sekcja zawiera szczegółową charakterystykę zmiennych wykorzystanych w projekcie oraz analizę struktury technicznej zbioru danych. Analizowany zbiór danych zawiera informacje o 40 000 ofertach kredytowych, opisanych przez 13 zmiennych.

2.1 Charakterystyka zmiennych

Zmienna Opis Typ aktualny Typ docelowy
ID unikalny numer identyfikacyjny rekordu int do usunięcia
approved data zatwierdzenia oferty kredytu przez bank chr Date
risk_group grupa ryzyka klienta (1-najniższe, 4-najwyższe) int factor
partner_ID identyfikator sieci dealerów samochodowych int factor
loan_type typ kredytu: N (nowy), U (używany), R (refinansowanie) chr factor
FICO_score scoring kredytowy klienta (odpowiednik BIK) int int
loan_term okres kredytowania w miesiącach (np. 48, 60, 72) int int
loan_amount kwota kredytu w USD int num
refin_interest oprocentowanie poprzedniego kredytu (tylko dla typu R) num num
compet_interest najlepsze oprocentowanie oferowane przez konkurencję num num
cost_of_funds koszt pozyskania kapitału przez bank num num
proposed_interest oprocentowanie zaproponowane klientowi num num
customer_accept czy klient zaakceptował ofertę (1 - tak, 0 - nie) int factor

2.1.1 Planowane transformacje danych

Na podstawie powyższej analizy struktury, w kolejnym kroku zostaną podjęte następujące działania:

  • Reklasyfikacja zmiennych jakościowych: Zmienne takie jak risk_group, partner_ID oraz loan_type zostaną przekształcone na typ factor. Jest to kluczowe, aby algorytmy scoringowe nie traktowały identyfikatorów czy grup ryzyka jako ciągłych wartości liczbowych, lecz jako odrębne kategorie.

  • Normalizacja daty: Kolumna approved zostanie skonwertowana z formatu tekstowego (chr) na format daty (Date).

  • Przygotowanie zmiennej objaśnianej: Zmienna customer_accept zostanie zdefiniowana jako czynnik (factor), co jest warunkiem koniecznym do przeprowadzenia klasyfikacji binarnej.

  • Selekcja zmiennych: Zmienna ID zostanie wykluczona z procesu modelowania, ponieważ jako unikalny identyfikator techniczny nie posiada mocy predykcyjnej.

2.2 Statystyki opisowe zmiennych ilościowych

Min 1. Kwartyl.25% Mediana Średnia 3. Kwartyl.75% Max
FICO_score 601.00 684.00 717.00 720.73 755.00 851.00
loan_term 36.00 48.00 60.00 57.19 60.00 72.00
loan_amount 4527.00 15703.75 23000.00 24211.66 30907.25 100000.00
refin_interest 3.00 6.25 7.75 8.37 9.90 24.00
compet_interest 2.99 4.49 4.99 4.96 5.39 6.29
cost_of_funds 1.09 1.11 1.38 1.42 1.63 2.10
proposed_interest 2.59 4.82 6.34 6.59 8.24 11.35

Profil klienta i jego wiarygodność

Statystyki pokazują, że bank obsługuje głównie wiarygodnych klientów. Średni FICO_score wynosi ok. 720, co świadczy o dużej rzetelności kredytobiorców. Większość osób w naszej bazie ma po prostu dobrą historię kredytową (powyżej 684 punktów).

Parametry udzielanych pożyczek

Jeśli chodzi o same pożyczki, typowy klient bierze kredyt na 23 000 - 24 211 USD, zazwyczaj decydując się na okres 5 lat (60 miesięcy). Warto odnotować, że maksymalna kwota kredytu to aż 100 000 USD, co przy znacznie niższej średniej wskazuje na obecność grupy klientów, którzy “wyciągają” średnią w górę.

Pozycjonowanie cenowe i rentowność

Warta uwagi jest również oferta banku vs rynku. Bank proponuje średnie oprocentowanie na poziomie 6,59%, podczas gdy konkurencja oferuje średnio 4,96%. Bank jest więc wyraźnie droższy od rynkowej czołówki, co może wpływać na finalną akceptację ofert przez klientów. Przy średnim koszcie pozyskania kapitału wynoszącym 1,42%, bank pracuje na marży ponad 5 punktów procentowych. Proponowane odsetki wahają się od 2,59% do 11,35%, co sugeruje, że bank mocno uzależnia cenę od grupy ryzyka konkretnego klienta.

Dynamika nowych kredytów i refinansowania

Początkowa analiza zmiennej refin_interest wykazała, że dla kredytów na nowe i używane samochody system technicznie przypisywał wartość 0 zamiast braku danych. Aby zapobiec zaburzeniom w procesie wyliczania wartości WoE, zera te zostały przekształcone na wartości brakujące (NA), co pozwoli algorytmom scoringowym na utworzenie dla nich oddzielnej kategorii logicznej. W segmencie refinansowania (typ R) bank przejmuje klientów, którzy wcześniej mieli bardzo drogie finansowanie, rekordowo nawet 24%.

2.3 Rozkłady empiryczne zmiennych ciągłych

2.3.1 Analiza rozkładów zmiennych ciągłych

Wykresy skrzypcowe połączone z wykresami pudełkowymi po wykonaniu korekty braków danych pozwalają na rzetelną ocenę rozkładów kluczowych zmiennych:

  • Skośność kwot kredytów: Zmienna loan_amount charakteryzuje się asymetrią prawostronną. Choć większość udzielanych kredytów koncentruje się w przedziale 15 000 – 30 000 USD, widoczny jest długi ogon wartości odstających sięgający aż do 100 000 USD.
  • Dyskretny charakter okresu kredytowania: Wykres dla loan_term nie jest płynny, lecz pokazuje wyraźne zwężenia i rozszerzenia. Wynika to z faktu, że okres kredytowania w praktyce bankowej przyjmuje standardowe wartości (najczęściej 48, 60 i 72 miesiące).
  • Jakość portfela (FICO_score): Zdecydowana większość klientów osiąga wysokie wyniki punktowe (mediana ok. 720). Wykres wyraźnie pokazuje, że bank celuje przede wszystkim w bezpiecznego klienta, unikając osób z bardzo złą historią kredytową.
  • Polityka cenowa: Porównanie proposed_interest i compet_interest ukazuje, że oferta banku charakteryzuje się znacznie większą wariancją. Podczas gdy oferty konkurencji są mocno scentrowane wokół 5%, bank proponuje stawki w dużo szerszym przedziale (zauważalny długi “ogon” w stronę wyższych stóp), co sugeruje silną indywidualizację ceny w zależności od ryzyka.
  • Prawdziwy obraz refinansowania: Dzięki wcześniejszemu wykluczeniu technicznych zer dla kredytów nowych i używanych, wykres refin_interest ukazuje rzeczywisty rozkład starych zobowiązań klientów. Widać na nim, że bank skutecznie przyciąga osoby uwięzione w bardzo drogich kredytach (ogon rozkładu sięga nawet ponad 20%).

2.4 Zależności między predyktorami a zmienną objaśnianą

Analiza ujawnia kluczowe zależności między profilem klienta i parametrami oferty a ostateczną decyzją o jej akceptacji:

Wbrew rynkowemu założeniu o tzw. selekcji negatywnej, według którego najsłabsi klienci najczęściej akceptują oferty z braku alternatyw, nasze dane wskazują na zupełnie inną dynamikę. Najwyższy wskaźnik (34.9%) występuje w grupie o najniższym ryzyku (grupa 1). Wynika to prawdopodobnie z faktu, że bank jest w stanie zaproponować tym klientom wysoce konkurencyjne warunki. Skłonność do przyjęcia oferty wyraźnie spada w grupach 2 i 3, notując jedynie minimalne odbicie w grupie najwyższego ryzyka (grupa 4, wskaźnik 18.8%).

Ponadto wykres pudełkowy dla proponowanego oprocentowania jednoznacznie potwierdza dużą wrażliwość klientów na cenę. Osoby, które zaakceptowały ofertę, otrzymały propozycje zauważalnie tańsze – z medianą na poziomie około 5.4%. Z kolei oferty odrzucone charakteryzowały się medianą w okolicach 6.5% oraz znacznie większym rozrzutem w stronę wysokich stóp procentowych. Wskazuje to, że sam koszt finansowania jest ewidentnie jednym z najsilniejszych czynników decyzyjnych w analizowanym portfelu.

2.5 Podsumowanie Wstępnej Analizy Danych

Najważniejsze informacje uzyskane z EDA, z którymi wchodzimy do etapu modelowania:

  • Zbiór został oczyszczony. Kluczowym na tym etapie było zidentyfikowanie zer w kolumnie refin_interest i zamiana ich na braki danych (NA).

  • Bank celuje w bezpiecznego klienta. Mediana FICO_score na poziomie 717 punktów oraz koncentracja kwot wokół 23 000 USD wskazuje na solidny, standardowy portfel.

  • Bank wykazuje dużą elastyczność w ofertowaniu (proposed_interest ma szeroki rozkład), pracując na bardzo solidnej marży (średni koszt funduszy to zaledwie ok. 1.4%, a proponowane oprocentowanie to ponad 6.5%). Konkurencja wydaje się wypadać gorzej (skupiona wokół 5%).

  • Klienci akceptujący ofertę dostali średnio o ponad punkt procentowy tańszy kredyt (mediana 5.4% vs 6.5%).

  • Accept Rate jest w najwyższej grupie jakościowej (grupa 1 - 34.9%). Najsłabsi klienci akceptują oferty rzadziej, co sugeruje, że bank może oferować im ceny zaporowe ze względu na ryzyko.

3 Model scoringowy i założenia

Celem części modelowej jest przejście od analizy opisowej do interpretowalnego modelu scoringowego, który pozwala ocenić skłonność klienta do zaakceptowania oferty kredytu samochodowego.

Proces modelowania obejmuje kilka etapów. Najpierw utworzono dodatkowe zmienne opisujące ekonomiczne cechy oferty, takie jak konkurencyjność oprocentowania, marża banku czy potencjalna oszczędność przy refinansowaniu. Następnie przeprowadzono analizę wartości informacyjnej zmiennych, kubełkowanie oraz transformację WoE. Ostatecznie zbudowano model regresji logistycznej i przeskalowano jego wyniki do postaci punktowej karty scoringowej.

3.1 Inżynieria cech

Nowe zmienne utworzone w procesie inżynierii cech
Zmienna Wzor Interpretacja Uzasadnienie_biznesowe
price_advantage compet_interest - proposed_interest Przewaga cenowa banku względem konkurencji. Wartość dodatnia oznacza, że bank oferuje niższe oprocentowanie niż konkurencja. Klienci powinni częściej akceptować oferty bardziej konkurencyjne cenowo.
bank_margin proposed_interest - cost_of_funds Przybliżona marża odsetkowa banku na ofercie kredytowej. Zbyt wysoka marża może obniżać atrakcyjność oferty dla klienta.
refin_savings refin_interest - proposed_interest Potencjalna oszczędność klienta w przypadku refinansowania starego kredytu. Im większa potencjalna oszczędność, tym większa motywacja klienta do refinansowania.
approx_installment loan_amount / loan_term Przybliżona miesięczna część kapitałowa raty kredytu. Wyższe miesięczne obciążenie może ograniczać skłonność do akceptacji.
is_refin 1 jeśli loan_type = R, w przeciwnym razie 0 Flaga identyfikująca oferty refinansowania. Refinansowanie ma inną logikę decyzyjną niż zakup nowego lub używanego samochodu.

Utworzone zmienne mają charakter interpretowalny biznesowo. Oznacza to, że ich wpływ na decyzję klienta można wyjaśnić nie tylko statystycznie, ale również ekonomicznie.

Wykresy pudełkowe pokazują, czy nowo utworzone zmienne różnicują klientów, którzy zaakceptowali ofertę i klientów, którzy ją odrzucili. Szczególnie istotna jest zmienna price_advantage, ponieważ bezpośrednio porównuje ofertę banku z najlepszą ofertą konkurencji. Jeżeli dla klientów akceptujących ofertę wartości tej zmiennej są wyższe, oznacza to, że przewaga cenowa banku rzeczywiście przekłada się na większą skuteczność sprzedażową.

Zmienna bank_margin pozwala natomiast ocenić, czy oferty bardziej rentowne dla banku są jednocześnie mniej atrakcyjne dla klientów. Wysoka marża może zwiększać wynik finansowy pojedynczej transakcji, ale jednocześnie obniżać prawdopodobieństwo przyjęcia oferty.

Podział danych na zbiór treningowy i testowy
Zbior Liczba_obserwacji Udzial_w_calosci Accept_rate
Treningowy 28000 70.0% 25.9%
Testowy 12000 30.0% 25.9%

Dane zostały podzielone na zbiór treningowy i testowy w proporcji 70/30. Zbiór treningowy wykorzystano do wyznaczenia kubełków WoE, estymacji modelu oraz budowy karty scoringowej. Zbiór testowy pozostawiono do niezależnej oceny jakości modelu na obserwacjach, które nie były używane podczas procesu uczenia. Porównanie wskaźnika akceptacji w obu próbach pozwala ocenić, czy podział nie zaburzył struktury zmiennej celu. Zbliżony poziom Accept rate w zbiorze treningowym i testowym oznacza, że obie próby są porównywalne pod względem udziału zaakceptowanych ofert.

3.2 Pre-screening zmiennych

Przed estymacją modelu przeprowadzono ocenę siły predykcyjnej zmiennych przy użyciu miary Information Value. Wartość IV informuje, w jakim stopniu dana zmienna różnicuje obserwacje należące do różnych klas zmiennej celu. W projekcie miara ta została wykorzystana jako etap pre-screeningu, czyli wstępnej selekcji zmiennych kandydackich do modelu.

Przy interpretacji IV zastosowano następujące orientacyjne progi:

  • < 0.02 - bardzo słaba zmienna

  • 0.02-0.10 - słaba, ale potencjalnie użyteczna zmienna

  • 0.10-0.30 - średnia siła predykcyjna

  • 0.30-0.50 - mocna zmienna

  • > 0.50 - bardzo mocna zmienna, wymagająca kontroli pod kątem przeuczenia

Wartość informacyjna zmiennych
variable info_value Ocena siły
loan_amount 1.5914 bardzo mocna - do sprawdzenia
approx_installment 1.4222 bardzo mocna - do sprawdzenia
bank_margin 0.6323 bardzo mocna - do sprawdzenia
price_advantage 0.5885 bardzo mocna - do sprawdzenia
proposed_interest 0.5707 bardzo mocna - do sprawdzenia
refin_savings 0.4579 mocna
loan_type 0.4096 mocna
compet_interest 0.3795 mocna
refin_interest 0.3735 mocna
is_refin 0.2263 średnia
partner_ID 0.2238 średnia
risk_group 0.1750 średnia
FICO_score 0.1414 średnia
loan_term 0.0690 słaba
cost_of_funds 0.0207 słaba

Ranking pozwala wskazać zmienne, które samodzielnie najlepiej różnicują klientów akceptujących i nieakceptujących ofertę. Wysoka wartość nie oznacza jednak automatycznie, że zmienna powinna wejść do finalnego modelu. Ostateczny wybór predyktorów zależy również od stabilności kubełków, interpretowalności biznesowej, współliniowości oraz istotności parametrów w regresji logistycznej.

3.3 Kubełkowanie i transformacja WoE

Kolejnym etapem było kubełkowanie zmiennych, czyli przekształcenie wartości ciągłych i kategorii w przedziały wykorzystywane w karcie scoringowej. Kubełkowanie pełni kilka funkcji. Po pierwsze, pozwala uchwycić nieliniowe zależności między predyktorami a zmienną celu. Po drugie, ogranicza wpływ wartości odstających. Po trzecie, zwiększa interpretowalność modelu, ponieważ finalna karta scoringowa przypisuje punkty nie pojedynczym wartościom, lecz konkretnym przedziałom wartości. Po wyznaczeniu kubełków zastosowano transformację Weight of Evidence.

3.4 Budowa modelu regresji logistycznej

m_full <- glm(I(1 * (customer_accept == 1)) ~ ., data = train_woe, family = binomial())
m_step <- step(m_full, direction = "both", trace = FALSE)

print(summary(m_step))
## 
## Call:
## glm(formula = I(1 * (customer_accept == 1)) ~ risk_group_woe + 
##     partner_ID_woe + loan_type_woe + FICO_score_woe + loan_amount_woe + 
##     refin_interest_woe + compet_interest_woe + cost_of_funds_woe + 
##     proposed_interest_woe + price_advantage_woe + refin_savings_woe + 
##     approx_installment_woe + is_refin_woe, family = binomial(), 
##     data = train_woe)
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)    
## (Intercept)            -1.06503    0.01703 -62.524  < 2e-16 ***
## risk_group_woe          0.87655    0.08640  10.145  < 2e-16 ***
## partner_ID_woe          1.16211    0.04359  26.661  < 2e-16 ***
## loan_type_woe           0.32915    0.04520   7.283 3.28e-13 ***
## FICO_score_woe         -0.33115    0.08706  -3.804 0.000142 ***
## loan_amount_woe         0.50345    0.03320  15.163  < 2e-16 ***
## refin_interest_woe      0.23882    0.09106   2.623 0.008723 ** 
## compet_interest_woe     0.67319    0.05246  12.831  < 2e-16 ***
## cost_of_funds_woe       0.41348    0.15207   2.719 0.006548 ** 
## proposed_interest_woe  -0.18700    0.05664  -3.302 0.000961 ***
## price_advantage_woe     1.01937    0.06631  15.373  < 2e-16 ***
## refin_savings_woe       0.64492    0.06160  10.469  < 2e-16 ***
## approx_installment_woe  0.49787    0.03367  14.788  < 2e-16 ***
## is_refin_woe           -0.90961    0.08375 -10.861  < 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: 32051  on 27999  degrees of freedom
## Residual deviance: 23315  on 27986  degrees of freedom
## AIC: 23343
## 
## Number of Fisher Scoring iterations: 5

Do budowy finalnego modelu wykorzystano regresję logistyczną na zmiennych przekształconych metodą WoE. Model został następnie poddany regresji kroczącej, której celem było ograniczenie liczby predyktorów i pozostawienie w modelu zmiennych wnoszących największą wartość informacyjną.

Wynik przedstawia parametry finalnego modelu logistycznego. Współczynnik Beta określa kierunek i siłę wpływu danej zmiennej na logarytm ilorazu szans akceptacji oferty. Dodatnia wartość parametru oznacza wzrost szansy akceptacji wraz ze wzrostem wartości zmiennej WoE, natomiast wartość ujemna oznacza zależność odwrotną. Kolumna z p_value pozwala ocenić statystyczną istotność predyktora w modelu.

3.4.1 Założenia dotyczące skalowania modelu scoringowego

Po estymacji modelu logistycznego na zmiennych przekształconych metodą WoE dokonano przeliczenia modelu na postać punktowej karty scoringowej. W tym celu przyjęto trzy podstawowe parametry skalowania: points0, odds0 oraz pdo.

Parametr points0 = 500 oznacza bazowy poziom punktacji. Jest to wartość referencyjna, wokół której budowana jest skala scoringowa. Przyjęcie poziomu 500 punktów jest wygodne interpretacyjnie, ponieważ pozwala uzyskać dodatnią, czytelną skalę punktową oraz ogranicza ryzyko występowania bardzo niskich lub ujemnych wartości score’u.

Parametr odds0 = 1 oznacza bazowy poziom odds, któremu przypisana jest wartość points0. W modelu przyjęto odds równe 1, czyli relację 1:1. Oznacza to punkt odniesienia, przy którym prawdopodobieństwo wystąpienia klasy pozytywnej i negatywnej jest takie samo. W analizowanym projekcie klasą pozytywną jest customer_accept = 1, czyli zaakceptowanie oferty przez klienta.

Parametr pdo = 50, czyli Points to Double the Odds, określa, o ile punktów zmienia się score przy dwukrotnej zmianie odds. Przyjęcie pdo = 50 oznacza, że dwukrotna zmiana odds odpowiada zmianie punktacji o 50 punktów. Wartość ta zapewnia kompromis między czytelnością skali a jej szczegółowością. Niższe wartości pdo powodowałyby bardziej dynamiczne zmiany punktacji, natomiast wyższe wartości prowadziłyby do bardziej rozciągniętej, łagodniejszej skali.

Warto podkreślić, że parametry skalowania nie wpływają bezpośrednio na jakość dyskryminacyjną modelu mierzoną za pomocą AUC i Giniego. Wynika to z faktu, że AUC oraz Gini zależą przede wszystkim od uporządkowania obserwacji według wyniku modelu, a nie od samej jednostki skali. Zmiana parametrów points0, odds0 lub pdo przekształca score w sposób monotoniczny, więc ranking obserwacji pozostaje zasadniczo taki sam. Ewentualne niewielkie różnice w Gini mogą wynikać z zaokrągleń punktów w karcie scoringowej.

W niniejszym modelu zastosowano następujące skalowanie:

  • points0 = 500,
  • odds0 = 1,
  • pdo = 50.

Ponieważ projekt dotyczy response / acceptance scorecardu, wynik końcowy interpretowany jest jako acceptance score. Oznacza to, że wyższa wartość wyniku punktowego odpowiada większej skłonności klienta do zaakceptowania oferty, czyli wystąpienia customer_accept = 1.

W kodzie wynik pakietu scorecard przekształcono do orientacji acceptance według wzoru:

acceptance_score = -raw_score

$basepoints variable bin woe points 1: basepoints NA NA 577

$risk_group variable bin count count_distr neg pos posprob woe 1: risk_group 1 12216 0.4362857 7957 4259 0.3486411 0.4244808 2: risk_group 2 5754 0.2055000 4520 1234 0.2144595 -0.2487526 3: risk_group 3%,%4 10030 0.3582143 8262 1768 0.1762712 -0.4923193 bin_iv total_iv breaks is_special_values points 1: 0.08612080 0.1743144 1 FALSE -27 2: 0.01193958 0.1743144 2 FALSE 16 3: 0.07625397 0.1743144 3%,%4 FALSE 31

$partner_ID variable bin count count_distr neg pos posprob woe 1: partner_ID 1 10372 0.3704286 7074 3298 0.31797146 0.28638856 2: partner_ID 2 4364 0.1558571 3996 368 0.08432631 -1.33546778 3: partner_ID 3 13264 0.4737143 9669 3595 0.27103438 0.06011752 bin_iv total_iv breaks is_special_values points 1: 0.032393675 0.2237651 1 FALSE -24 2: 0.189634732 0.2237651 2 FALSE 112 3: 0.001736664 0.2237651 3 FALSE -5

$loan_type variable bin count count_distr neg pos posprob woe 1: loan_type N 9993 0.3568929 8815 1178 0.1178825 -0.9631383 2: loan_type R 7899 0.2821071 4660 3239 0.4100519 0.6857476 3: loan_type U 10108 0.3610000 7264 2844 0.2813613 0.1117793 bin_iv total_iv breaks is_special_values points 1: 0.253120447 0.4095646 N FALSE 23 2: 0.151813809 0.4095646 R FALSE -16 3: 0.004630303 0.4095646 U FALSE -3

$FICO_score variable bin count count_distr neg pos posprob woe 1: FICO_score [-Inf,645) 707 0.02525000 515 192 0.2715700 0.0628269 2: FICO_score [645,690) 7376 0.26342857 5855 1521 0.2062093 -0.2984296 3: FICO_score [690,700) 1987 0.07096429 1657 330 0.1660795 -0.5641729 4: FICO_score [700,730) 6485 0.23160714 4964 1521 0.2345412 -0.1333454 5: FICO_score [730,770) 6653 0.23760714 4368 2285 0.3434541 0.4015592 6: FICO_score [770, Inf) 4792 0.17114286 3380 1412 0.2946578 0.1766299 bin_iv total_iv breaks is_special_values points 1: 0.0001011637 0.09261407 645 FALSE 2 2: 0.0217385218 0.09261407 690 FALSE -7 3: 0.0194354710 0.09261407 700 FALSE -13 4: 0.0039844313 0.09261407 730 FALSE -3 5: 0.0417931859 0.09261407 770 FALSE 10 6: 0.0055612984 0.09261407 Inf FALSE 4

$loan_amount variable bin count count_distr neg pos posprob 1: loan_amount [-Inf,10000) 2187 0.07810714 735 1452 0.66392318 2: loan_amount [10000,14000) 2929 0.10460714 1372 1557 0.53158074 3: loan_amount [14000,20000) 5638 0.20135714 3672 1966 0.34870521 4: loan_amount [20000,30000) 8787 0.31382143 7137 1650 0.18777740 5: loan_amount [30000, Inf) 8459 0.30210714 7823 636 0.07518619 woe bin_iv total_iv breaks is_special_values points 1: 1.7303251 0.28469382 0.9702645 10000 FALSE -63 2: 1.1759898 0.17437309 0.9702645 14000 FALSE -43 3: 0.4247630 0.03980194 0.9702645 20000 FALSE -15 4: -0.4150188 0.04851272 0.9702645 30000 FALSE 15 5: -1.4601264 0.42288294 0.9702645 Inf FALSE 53

$refin_interest variable bin count count_distr neg pos posprob woe 1: refin_interest missing 20101 0.71789286 16079 4022 0.2000895 -0.3362364 2: refin_interest [-Inf,5.5) 899 0.03210714 704 195 0.2169077 -0.2342804 3: refin_interest [5.5,7) 2176 0.07771429 1509 667 0.3065257 0.2330860 4: refin_interest [7,8) 1340 0.04785714 781 559 0.4171642 0.7150727 5: refin_interest [8,13) 2851 0.10182143 1467 1384 0.4854437 0.9912568 6: refin_interest [13, Inf) 633 0.02260714 199 434 0.6856240 1.8292381 bin_iv total_iv breaks is_special_values points 1: 0.074437476 0.3192794 missing TRUE 6 2: 0.001661025 0.3192794 5.5 FALSE 4 3: 0.004451747 0.3192794 7 FALSE -4 4: 0.028122469 0.3192794 8 FALSE -12 5: 0.118823002 0.3192794 13 FALSE -17 6: 0.091783730 0.3192794 Inf FALSE -32

$compet_interest variable bin count count_distr neg pos posprob 1: compet_interest [-Inf,3.9) 1058 0.03778571 736 322 0.3043478 2: compet_interest [3.9,4.6) 8011 0.28610714 6945 1066 0.1330670 3: compet_interest [4.6,5.3) 11048 0.39457143 7901 3147 0.2848479 4: compet_interest [5.3,5.9) 6626 0.23664286 4458 2168 0.3271959 5: compet_interest [5.9, Inf) 1257 0.04489286 699 558 0.4439141 woe bin_iv total_iv breaks is_special_values points 1: 0.2228199 0.001973697 0.226855 3.9 FALSE -11 2: -0.8246102 0.155079981 0.226855 4.6 FALSE 40 3: 0.1289587 0.006762379 0.226855 5.3 FALSE -6 4: 0.3286033 0.027479165 0.226855 5.9 FALSE -16 5: 0.8242066 0.035559822 0.226855 Inf FALSE -40

$cost_of_funds variable bin count count_distr neg pos posprob 1: cost_of_funds [-Inf,1.14) 7641 0.27289286 5586 2055 0.2689439 2: cost_of_funds [1.14,1.34) 4048 0.14457143 3129 919 0.2270257 3: cost_of_funds [1.34,1.44) 4274 0.15264286 3165 1109 0.2594759 4: cost_of_funds [1.44,1.46) 400 0.01428571 310 90 0.2250000 5: cost_of_funds [1.46,1.64) 4818 0.17207143 3433 1385 0.2874637 6: cost_of_funds [1.64,1.84) 4387 0.15667857 3232 1155 0.2632779 7: cost_of_funds [1.84, Inf) 2432 0.08685714 1884 548 0.2253289 woe bin_iv total_iv breaks is_special_values points 1: 0.049510806 6.768752e-04 0.01191545 1.14 FALSE -1 2: -0.175684196 4.270632e-03 0.01191545 1.34 FALSE 5 3: 0.000804078 9.870903e-08 0.01191545 1.44 FALSE 0 4: -0.187264202 4.780286e-04 0.01191545 1.46 FALSE 6 5: 0.141764050 3.574090e-03 0.01191545 1.64 FALSE -4 6: 0.020497629 6.615298e-05 0.01191545 1.84 FALSE -1 7: -0.185378743 2.849575e-03 0.01191545 Inf FALSE 6

$proposed_interest variable bin count count_distr neg pos posprob 1: proposed_interest [-Inf,3.8) 550 0.01964286 322 228 0.4145455 2: proposed_interest [3.8,4.6) 4795 0.17125000 3769 1026 0.2139729 3: proposed_interest [4.6,5.6) 6586 0.23521429 3852 2734 0.4151230 4: proposed_interest [5.6,6.2) 1509 0.05389286 1010 499 0.3306826 5: proposed_interest [6.2,7.8) 6825 0.24375000 5289 1536 0.2250549 6: proposed_interest [7.8, Inf) 7735 0.27625000 6497 1238 0.1600517 woe bin_iv total_iv breaks is_special_values points 1: 0.7042925 0.011180172 0.2580658 3.8 FALSE 10 2: -0.2516435 0.010174463 0.2580658 4.6 FALSE -3 3: 0.7066717 0.134829521 0.2580658 5.6 FALSE 10 4: 0.3443989 0.006895831 0.2580658 6.2 FALSE 5 5: -0.1869491 0.008129605 0.2580658 7.8 FALSE -3 6: -0.6083449 0.086856190 0.2580658 Inf FALSE -8

$price_advantage variable bin count count_distr neg pos posprob 1: price_advantage [-Inf,-2.6) 8262 0.29507143 7047 1215 0.1470588 2: price_advantage [-2.6,-1.4) 4864 0.17371429 3863 1001 0.2057977 3: price_advantage [-1.4,0.6) 14108 0.50385714 9424 4684 0.3320102 4: price_advantage [0.6, Inf) 766 0.02735714 405 361 0.4712794 woe bin_iv total_iv breaks is_special_values points 1: -0.7083595 0.12216528 0.2317577 -2.6 FALSE 52 2: -0.3009462 0.01456809 0.2317577 -1.4 FALSE 22 3: 0.3503912 0.06681283 0.2317577 0.6 FALSE -26 4: 0.9344893 0.02821153 0.2317577 Inf FALSE -69

$refin_savings variable bin count count_distr neg pos posprob woe 1: refin_savings missing 20101 0.71789286 16079 4022 0.2000895 -0.3362364 2: refin_savings [-Inf,0) 1232 0.04400000 1101 131 0.1063312 -1.0792784 3: refin_savings [0,1) 1061 0.03789286 716 345 0.3251649 0.3193627 4: refin_savings [1,2.5) 3300 0.11785714 1963 1337 0.4051515 0.6654528 5: refin_savings [2.5,5.5) 1607 0.05739286 715 892 0.5550716 1.2706820 6: refin_savings [5.5, Inf) 699 0.02496429 165 534 0.7639485 2.2239488 bin_iv total_iv breaks is_special_values points 1: 0.074437476 0.4341132 missing TRUE 16 2: 0.037825245 0.4341132 0 FALSE 50 3: 0.004148454 0.4341132 1 FALSE -15 4: 0.059545935 0.4341132 2.5 FALSE -31 5: 0.112292692 0.4341132 5.5 FALSE -59 6: 0.145863384 0.4341132 Inf FALSE -103

$approx_installment variable bin count count_distr neg pos posprob 1: approx_installment [-Inf,240) 4315 0.1541071 1822 2493 0.57775203 2: approx_installment [240,320) 4535 0.1619643 2704 1831 0.40374862 3: approx_installment [320,400) 4653 0.1661786 3370 1283 0.27573608 4: approx_installment [400,500) 5546 0.1980714 4638 908 0.16372160 5: approx_installment [500, Inf) 8951 0.3196786 8205 746 0.08334264 woe bin_iv total_iv breaks is_special_values points 1: 1.36305043 0.34824212 0.8819703 240 FALSE -49 2: 0.65962853 0.08033402 0.8819703 320 FALSE -24 3: 0.08378677 0.00118991 0.8819703 400 FALSE -3 4: -0.58129571 0.05730703 0.8819703 500 FALSE 21 5: -1.34827498 0.39489727 0.8819703 Inf FALSE 48

$is_refin variable bin count count_distr neg pos posprob woe 1: is_refin [-Inf,1) 20101 0.7178929 16079 4022 0.2000895 -0.3362364 2: is_refin [1, Inf) 7899 0.2821071 4660 3239 0.4100519 0.6857476 bin_iv total_iv breaks is_special_values points 1: 0.07443748 0.2262513 1 FALSE -22 2: 0.15181381 0.2262513 Inf FALSE 45

Ocena jakości modelu na zbiorze treningowym i testowym
Zbior AUC Gini Ocena
Treningowy 0.8413 0.6826 bardzo dobra jakość dyskryminacyjna
Testowy 0.8398 0.6795 bardzo dobra jakość dyskryminacyjna
Accept rate według grup scoringowych na zbiorze treningowym
score_group liczba_obserwacji min_score max_score avg_score accept_rate
1 2800 -936 -767 -821.6200 0.0104
2 2800 -767 -710 -735.9432 0.0411
3 2800 -710 -676 -690.2082 0.0629
4 2800 -676 -643 -660.1157 0.0961
5 2800 -643 -616 -628.3843 0.1375
6 2800 -616 -588 -601.8875 0.1996
7 2800 -588 -549 -568.3621 0.2918
8 2800 -549 -509 -530.3868 0.3971
9 2800 -508 -450 -481.2889 0.5914
10 2800 -450 -261 -404.3479 0.7654

Jakość modelu oceniono na dwóch próbach: treningowej oraz testowej. Wynik na zbiorze treningowym informuje, jak dobrze model dopasował się do danych użytych w procesie uczenia. Wynik na zbiorze testowym pokazuje natomiast, jak model radzi sobie na obserwacjach niewykorzystanych podczas estymacji.

Kluczowe znaczenie ma porównanie AUC i Giniego między obiema próbami. Jeżeli wyniki na zbiorze testowym są zbliżone do wyników na zbiorze treningowym, oznacza to, że model generalizuje poprawnie i nie wykazuje silnych oznak przeuczenia. Wyraźny spadek jakości na zbiorze testowym mógłby natomiast sugerować nadmierne dopasowanie modelu do próby treningowej.

3.5 Finalna karta scoringowa

Finalny model scoringowy: kubełki, WoE, IV oraz punkty scorecardu
Zmienna Kubełek / bin Liczba obserwacji Udział obserwacji Liczba 0 Liczba 1 Accept rate / event rate WoE IV binu Punkty scorecard Punkty acceptance
basepoints Punkty bazowe NA NA NA NA NA NA NA 577 -577
risk_group 1 12216 43.6% 7957 4259 34.9% 0.4245 0.0861 -27 27
risk_group 2 5754 20.5% 4520 1234 21.4% -0.2488 0.0119 16 -16
risk_group 3%,%4 10030 35.8% 8262 1768 17.6% -0.4923 0.0763 31 -31
partner_ID 1 10372 37.0% 7074 3298 31.8% 0.2864 0.0324 -24 24
partner_ID 2 4364 15.6% 3996 368 8.4% -1.3355 0.1896 112 -112
partner_ID 3 13264 47.4% 9669 3595 27.1% 0.0601 0.0017 -5 5
loan_type N 9993 35.7% 8815 1178 11.8% -0.9631 0.2531 23 -23
loan_type R 7899 28.2% 4660 3239 41.0% 0.6857 0.1518 -16 16
loan_type U 10108 36.1% 7264 2844 28.1% 0.1118 0.0046 -3 3
FICO_score [-Inf,645) 707 2.5% 515 192 27.2% 0.0628 0.0001 2 -2
FICO_score [645,690) 7376 26.3% 5855 1521 20.6% -0.2984 0.0217 -7 7
FICO_score [690,700) 1987 7.1% 1657 330 16.6% -0.5642 0.0194 -13 13
FICO_score [700,730) 6485 23.2% 4964 1521 23.5% -0.1333 0.0040 -3 3
FICO_score [730,770) 6653 23.8% 4368 2285 34.3% 0.4016 0.0418 10 -10
FICO_score [770, Inf) 4792 17.1% 3380 1412 29.5% 0.1766 0.0056 4 -4
loan_amount [-Inf,10000) 2187 7.8% 735 1452 66.4% 1.7303 0.2847 -63 63
loan_amount [10000,14000) 2929 10.5% 1372 1557 53.2% 1.1760 0.1744 -43 43
loan_amount [14000,20000) 5638 20.1% 3672 1966 34.9% 0.4248 0.0398 -15 15
loan_amount [20000,30000) 8787 31.4% 7137 1650 18.8% -0.4150 0.0485 15 -15
loan_amount [30000, Inf) 8459 30.2% 7823 636 7.5% -1.4601 0.4229 53 -53
refin_interest missing 20101 71.8% 16079 4022 20.0% -0.3362 0.0744 6 -6
refin_interest [-Inf,5.5) 899 3.2% 704 195 21.7% -0.2343 0.0017 4 -4
refin_interest [5.5,7) 2176 7.8% 1509 667 30.7% 0.2331 0.0045 -4 4
refin_interest [7,8) 1340 4.8% 781 559 41.7% 0.7151 0.0281 -12 12
refin_interest [8,13) 2851 10.2% 1467 1384 48.5% 0.9913 0.1188 -17 17
refin_interest [13, Inf) 633 2.3% 199 434 68.6% 1.8292 0.0918 -32 32
compet_interest [-Inf,3.9) 1058 3.8% 736 322 30.4% 0.2228 0.0020 -11 11
compet_interest [3.9,4.6) 8011 28.6% 6945 1066 13.3% -0.8246 0.1551 40 -40
compet_interest [4.6,5.3) 11048 39.5% 7901 3147 28.5% 0.1290 0.0068 -6 6
compet_interest [5.3,5.9) 6626 23.7% 4458 2168 32.7% 0.3286 0.0275 -16 16
compet_interest [5.9, Inf) 1257 4.5% 699 558 44.4% 0.8242 0.0356 -40 40
cost_of_funds [-Inf,1.14) 7641 27.3% 5586 2055 26.9% 0.0495 0.0007 -1 1
cost_of_funds [1.14,1.34) 4048 14.5% 3129 919 22.7% -0.1757 0.0043 5 -5
cost_of_funds [1.34,1.44) 4274 15.3% 3165 1109 25.9% 0.0008 0.0000 0 0
cost_of_funds [1.44,1.46) 400 1.4% 310 90 22.5% -0.1873 0.0005 6 -6
cost_of_funds [1.46,1.64) 4818 17.2% 3433 1385 28.7% 0.1418 0.0036 -4 4
cost_of_funds [1.64,1.84) 4387 15.7% 3232 1155 26.3% 0.0205 0.0001 -1 1
cost_of_funds [1.84, Inf) 2432 8.7% 1884 548 22.5% -0.1854 0.0028 6 -6
proposed_interest [-Inf,3.8) 550 2.0% 322 228 41.5% 0.7043 0.0112 10 -10
proposed_interest [3.8,4.6) 4795 17.1% 3769 1026 21.4% -0.2516 0.0102 -3 3
proposed_interest [4.6,5.6) 6586 23.5% 3852 2734 41.5% 0.7067 0.1348 10 -10
proposed_interest [5.6,6.2) 1509 5.4% 1010 499 33.1% 0.3444 0.0069 5 -5
proposed_interest [6.2,7.8) 6825 24.4% 5289 1536 22.5% -0.1869 0.0081 -3 3
proposed_interest [7.8, Inf) 7735 27.6% 6497 1238 16.0% -0.6083 0.0869 -8 8
price_advantage [-Inf,-2.6) 8262 29.5% 7047 1215 14.7% -0.7084 0.1222 52 -52
price_advantage [-2.6,-1.4) 4864 17.4% 3863 1001 20.6% -0.3009 0.0146 22 -22
price_advantage [-1.4,0.6) 14108 50.4% 9424 4684 33.2% 0.3504 0.0668 -26 26
price_advantage [0.6, Inf) 766 2.7% 405 361 47.1% 0.9345 0.0282 -69 69
refin_savings missing 20101 71.8% 16079 4022 20.0% -0.3362 0.0744 16 -16
refin_savings [-Inf,0) 1232 4.4% 1101 131 10.6% -1.0793 0.0378 50 -50
refin_savings [0,1) 1061 3.8% 716 345 32.5% 0.3194 0.0041 -15 15
refin_savings [1,2.5) 3300 11.8% 1963 1337 40.5% 0.6655 0.0595 -31 31
refin_savings [2.5,5.5) 1607 5.7% 715 892 55.5% 1.2707 0.1123 -59 59
refin_savings [5.5, Inf) 699 2.5% 165 534 76.4% 2.2239 0.1459 -103 103
approx_installment [-Inf,240) 4315 15.4% 1822 2493 57.8% 1.3631 0.3482 -49 49
approx_installment [240,320) 4535 16.2% 2704 1831 40.4% 0.6596 0.0803 -24 24
approx_installment [320,400) 4653 16.6% 3370 1283 27.6% 0.0838 0.0012 -3 3
approx_installment [400,500) 5546 19.8% 4638 908 16.4% -0.5813 0.0573 21 -21
approx_installment [500, Inf) 8951 32.0% 8205 746 8.3% -1.3483 0.3949 48 -48
is_refin [-Inf,1) 20101 71.8% 16079 4022 20.0% -0.3362 0.0744 -22 22
is_refin [1, Inf) 7899 28.2% 4660 3239 41.0% 0.6857 0.1518 45 -45

Tabela przedstawia finalną kartę scoringową. Kolumna Punkty scorecard zawiera wartości wygenerowane przez pakiet scorecard, natomiast kolumna Punkty acceptance pokazuje wynik w orientacji interpretacyjnej przyjętej w projekcie. W tej wersji wyższy score oznacza większe prawdopodobieństwo akceptacji oferty przez klienta.

Po utworzeniu karty scoringowej obiekt card zostaje zapisany do pliku Amigos.rds. Ten plik jest następnie wykorzystywany przez zewnętrzny skrypt scoringowy uruchamiany na zbiorze testowym.