Model logitowy - ocena jakości kredytu

Klasyfikacja kredytobiorców: dobry / zły

Marcin Bukowski

07.06.2026

Plan prezentacji

  1. Czym jest model logitowy?
  2. Podstawy matematyczne - szansa, logit, prawdopodobieństwo
  3. Estymacja parametrów - metoda największej wiarygodności
  4. Etapy budowy modelu - krok po kroku
  5. Przykładowe dane: kredytobiorcy “dobry” i “zły”
  6. Budowa modelu w R - praktyka
  7. Interpretacja współczynników i ilorazów szans
  8. Ocena jakości klasyfikacji - wzory i obliczenia
  9. Przeuczenie i selekcja zmiennych
  10. Koszty błędów klasyfikacji
  11. Wady i zalety metody
  12. Podsumowanie

1. Czym jest model logitowy?

Definicja

Model logitowy (regresja logistyczna) to parametryczny model statystyczny służący do modelowania prawdopodobieństwa wystąpienia zdarzenia binarnego (np. niespłacenia kredytu).

W naszym przypadku:

Model logitowy modeluje:

\[ P(Y = 1 \mid X_1, \ldots, X_p) \in (0, 1) \]

Następnie na podstawie wybranego progu odcięcia (zwykle \(0{,}5\)) przypisujemy klasę.

Dlaczego nie zwykła regresja liniowa?

Gdyby zastosować regresję liniową \(Y = \beta_0 + \beta_1 X_1 + \ldots + \varepsilon\):

Rozwiązanie: zastosować nieliniową funkcję łączącą (link function) - logit - która sprowadza prawdopodobieństwo z \((0,1)\) na całą oś \(\mathbb{R}\):

\[ \text{logit}(p) = \ln\left(\frac{p}{1-p}\right) \]

2. Podstawy matematyczne

Szansa, logit i krzywa logistyczna

Szansa (odds):

\[ \text{odds}(Y=1) = \frac{P(Y=1)}{1 - P(Y=1)} \]

Logit (logarytm szansy) jest modelowany liniowo:

\[ \ln\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \ldots + \beta_p X_p \]

Odwrotność: rozwiązując względem \(p\), otrzymujemy funkcję logistyczną:

\[ p = P(Y=1 \mid X) = \frac{e^{\beta_0 + \beta_1 X_1 + \ldots + \beta_p X_p}}{1 + e^{\beta_0 + \beta_1 X_1 + \ldots}} = \frac{1}{1 + e^{-(\beta_0 + \beta_1 X_1 + \ldots)}} \]

Krzywa logistyczna - kształt S

Funkcja jest monotonicznie rosnąca, ograniczona w przedziale \((0, 1)\), z punktem przegięcia w \(z = 0\) (gdzie \(p = 0{,}5\)).

3. Estymacja parametrów

Metoda największej wiarygodności (MLE)

Parametry \(\boldsymbol{\beta}\) estymujemy maksymalizując funkcję wiarygodności. Dla próby \((x_i, y_i)\), \(i=1,\ldots,n\):

\[ L(\boldsymbol{\beta}) = \prod_{i=1}^{n} p_i^{y_i} (1 - p_i)^{1 - y_i} \]

W praktyce maksymalizujemy logarytm wiarygodności (log-likelihood):

\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^{n} \left[ y_i \ln p_i + (1 - y_i) \ln(1 - p_i) \right] \]

gdzie \(p_i = 1 / (1 + e^{-\mathbf{x}_i^T \boldsymbol{\beta}})\).

Maksimum znajdujemy iteracyjnie - algorytmem IRLS (Iteratively Reweighted Least Squares) lub metodą Newtona-Raphsona. W R robi to za nas funkcja glm().

Miary jakości dopasowania modelu

Po dopasowaniu modelu oceniamy je m.in. przez:

4. Etapy budowy modelu

Etapy budowy modelu logitowego - krok po kroku

  1. Definicja problemu - zmienna zależna binarna \(Y\), wybór klasy “sukcesu”.
  2. Przygotowanie danych - czyszczenie, obsługa braków, zmiennych kategorycznych (kodowanie).
  3. Eksploracja zmiennych - analiza rozkładów, korelacji, separacji klas.
  4. Podział zbioru - uczący / walidacyjny / testowy.
  5. Estymacja modelu metodą MLE (glm(family = binomial)).
  6. Diagnostyka - istotność współczynników (test Walda), VIF, reszty Pearsona/Deviance.
  7. Selekcja zmiennych - stepwise, AIC/BIC, regularyzacja (LASSO/Ridge).
  8. Wybór progu klasyfikacji - 0,5 lub optymalizacja względem ROC / kosztów.
  9. Ocena jakości - macierz pomyłek, ROC/AUC, Gini, KS.
  10. Walidacja - kros-walidacja, bootstrap, ocena na zbiorze testowym.

5. Przykładowe dane: kredytobiorcy

Charakterystyka zbioru danych

Fikcyjny zbiór 500 klientów banku, klasy:

Zmienne objaśniające:

Pierwsze obserwacje

Pierwszych 8 wierszy zbioru danych
Wiek Dochod Staz_pracy Zadluzenie Liczba_kredytow Status_mieszk Klasa
47 8173 17 1718 1 Wlasne Dobry
32 8098 11 1122 1 Wynajem Dobry
43 6612 12 999 1 Wlasne Dobry
41 10608 15 2371 0 Wlasne Dobry
36 6654 10 2325 1 Wlasne Dobry
20 6829 11 2132 1 Wynajem Dobry
35 6594 9 1476 0 Rodzice Dobry
33 12150 10 2254 0 Wlasne Dobry

Rozkład zmiennych w grupach

6. Budowa modelu w R

Dopasowanie modelu - funkcja glm()

model <- glm(
  Y ~ Wiek + Dochod + Staz_pracy + Zadluzenie +
      Liczba_kredytow + Status_mieszk,
  data   = train,
  family = binomial(link = "logit")
)

Kluczowe argumenty:

Alternatywne funkcje łączące w binomial:

Tabela estymacji - współczynniki

Zmienna Estymata β Bł. std. Stat. z p-value exp(β) = OR
(Intercept) 11.5862 5.1075 2.2685 0.0233 107600.8524
Wiek -0.1467 0.0927 -1.5828 0.1135 0.8635
Dochod -0.0021 0.0008 -2.6487 0.0081 0.9979
Staz_pracy -0.4983 0.2310 -2.1567 0.0310 0.6076
Zadluzenie 0.0027 0.0009 2.8954 0.0038 1.0027
Liczba_kredytow 1.8710 0.7350 2.5455 0.0109 6.4948
Status_mieszkWynajem -2.3490 1.7614 -1.3336 0.1823 0.0955
Status_mieszkRodzice 2.7251 2.4681 1.1041 0.2695 15.2582

Statystyka Walda \(z = \hat{\beta}/SE(\hat{\beta})\) testuje hipotezę \(H_0: \beta = 0\).

Statystyki dopasowania modelu

Jeżeli różnica między null deviance a residual deviance jest duża - dodanie predyktorów wyraźnie poprawia model.

7. Interpretacja współczynników

Iloraz szans (odds ratio)

Współczynniki w skali logitowej trudno interpretować bezpośrednio. Stosujemy iloraz szans (OR) - \(e^{\beta_j}\):

\[ OR_j = \frac{\text{odds}(Y=1 \mid X_j = x + 1)}{\text{odds}(Y=1 \mid X_j = x)} = e^{\beta_j} \]

Interpretacja:

Dla zmiennych ilościowych w dużych jednostkach (np. dochód w zł) wygodnie liczyć OR dla zmiany o 1000 zł: \(OR_{1000} = e^{1000 \cdot \beta_j}\).

Wykres ilorazów szans z przedziałami ufności

OR powyżej linii 1 → zwiększa ryzyko, poniżej → zmniejsza.

Predykcja prawdopodobieństw

# Prawdopodobieństwo P(Y = 1) - klient "Zły"
prob_test <- predict(model, newdata = test, type = "response")

# Klasyfikacja przy progu 0.5
pred_test <- factor(ifelse(prob_test > 0.5, "Zly", "Dobry"),
                    levels = c("Dobry","Zly"))

8. Ocena jakości klasyfikacji

Macierz pomyłek

Macierz pomyłek (próg = 0,5, zbiór testowy)
Predykcja  Rzeczywistość
Dobry
Zly
Dobry Zly
Dobry 93 2
Zly 0 55

Oznaczenia: TP - poprawnie “Zły”, TN - poprawnie “Dobry”, FP - błędnie “Zły” (fałszywy alarm), FN - błędnie “Dobry” (przeoczone ryzyko).

Wzory miar jakości

\[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \qquad \text{Error Rate} = \frac{FP + FN}{TP + TN + FP + FN} \]

\[ \text{Sensitivity} = \frac{TP}{TP + FN} \qquad \text{Specificity} = \frac{TN}{TN + FP} \]

\[ \text{Precision} = \frac{TP}{TP + FP} \qquad F_1 = \frac{2 \cdot \text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}} \]

\[ \text{AUC} = \int_0^1 TPR(FPR^{-1}(t)) \, dt \qquad \text{Gini} = 2 \cdot AUC - 1 \]

Podstawienie wartości z przykładu (1/2)

Z naszej macierzy pomyłek (N = 150): TP = 55, TN = 93, FP = 0, FN = 2.

\[\text{Accuracy} = \frac{55 + 93}{150} = \frac{148}{150} \approx 0.987\]\[\text{Error Rate} = \frac{0 + 2}{150} \approx 0.013\]\[\text{Sensitivity} = \frac{55}{55 + 2} = \frac{55}{57} \approx 0.965\]\[\text{Specificity} = \frac{93}{93 + 0} = \frac{93}{93} \approx 1.000\]

Podstawienie wartości z przykładu (2/2)

\[\text{Precision} = \frac{55}{55 + 0} = \frac{55}{55} \approx 1.000\]\[F_1 = \frac{2 \cdot 1.000 \cdot 0.965}{1.000 + 0.965} \approx 0.982\]\[\text{AUC} \approx 0.990 \qquad \text{Gini} = 2 \cdot 0.990 - 1 \approx 0.980\]

Interpretacja: Accuracy = 0.987, czyli model poprawnie klasyfikuje 98.7% klientów testowych. AUC = 0.99 oznacza dobrą zdolność dyskryminacyjną - dla losowej pary (zły, dobry) model w 99% przypadków przypisze wyższe prawdopodobieństwo złemu.

Zbiorcza tabela miar

Miara Wartosc Opis
Accuracy 0.987 Udział poprawnych klasyfikacji ogółem
Error Rate 0.013 Udział błędnych klasyfikacji
Sensitivity 0.965 Skuteczność wykrywania klientów ‘złych’
Specificity 1.000 Skuteczność wykrywania klientów ‘dobrych’
Precision 1.000 Wiarygodność predykcji ‘zły’
F1-score 0.982 Średnia harmoniczna precyzji i czułości
AUC 0.990 Pole pod krzywą ROC
Gini 0.980 Współczynnik Giniego = 2·AUC - 1

Krzywa ROC i AUC

ROC pokazuje kompromis czułość vs. swoistość dla wszystkich progów odcięcia. AUC ≈ 0,5 - klasyfikator losowy, AUC = 1 - idealny.

Krzywa KS i statystyka Kołmogorowa-Smirnowa

W scoringu kredytowym KS > 0,3 uznaje się za akceptowalny, KS > 0,5 za bardzo dobry.

9. Przeuczenie i selekcja zmiennych

Problem przeuczenia w modelu logitowym

W modelu logitowym przeuczenie objawia się:

Sygnał ostrzegawczy: różnica AUC między uczącym a testowym > 0,05.

Nasz model: AUC uczący = 0.999, AUC testowy = 0.990, różnica = 0.009

Selekcja zmiennych - kryterium AIC

Iteracyjne dodawanie/usuwanie zmiennych minimalizujące AIC:

\[ AIC = -2 \ell(\hat{\boldsymbol{\beta}}) + 2k \]

model_step <- step(model, direction = "both", trace = 0)

Wybrany model: Y ~ Wiek + Dochod + Staz_pracy + Zadluzenie + Liczba_kredytow +
Wybrany model: Status_mieszk
AIC: model pełny = 38.58   |   model po selekcji = 38.58

AIC karze za dodatkowe parametry - mniejszy AIC oznacza lepszy kompromis między dopasowaniem a złożonością.

Regularyzacja - LASSO / Ridge

Gdy zmiennych jest bardzo dużo, stosujemy regularyzację (pakiet glmnet):

\[ \hat{\boldsymbol{\beta}} = \arg\min_{\boldsymbol{\beta}} \left[ -\ell(\boldsymbol{\beta}) + \lambda \sum_{j=1}^p |\beta_j|^q \right] \]

Parametr \(\lambda\) wybieramy przez kros-walidację (cv.glmnet).

10. Koszty błędów klasyfikacji

Asymetria kosztów w kredycie

Tak jak w drzewach, błędy mają różne koszty finansowe:

W modelu logitowym mamy bezpośrednią kontrolę przez próg odcięcia \(p^*\):

\[ \hat{y} = \begin{cases} 1 & \text{gdy } \hat{p} > p^* \\ 0 & \text{w przeciwnym razie} \end{cases} \]

Domyślnie \(p^* = 0{,}5\), ale to rzadko jest optymalne ekonomicznie.

Optymalny próg minimalizujący koszt

Oczekiwany koszt dla progu \(p^*\):

\[ E[\text{Koszt}](p^*) = C_{FP} \cdot FP(p^*) + C_{FN} \cdot FN(p^*) \]

Teoretyczny optymalny próg dla założeń kosztowych (przy zbalansowanej próbie):

\[ p^*_{opt} = \frac{C_{FP}}{C_{FP} + C_{FN}} = \frac{1000}{1000 + 10000} \approx 0{,}091 \]

Porównanie progów - 0,5 vs. optymalny

Założenia: FP = 1 000 zł, FN = 10 000 zł
Prog FP FN Sensitivity Specificity Koszt (zł)
0,50 (domyślny) 0 2 0.965 1 20 000
0,48 (optymalny) 0 2 0.965 1 20 000

Przesunięcie progu w dół zwiększa FP, ale drastycznie redukuje FN - i to obniża koszt łączny, bo FN jest 10× droższy.

Alternatywne podejścia do kosztów

  1. Optymalizacja progu - wybór \(p^*\) minimalizującego \(C_{FP} \cdot FP + C_{FN} \cdot FN\).
  2. Ważenie obserwacji w glm(weights = ...) - większe wagi dla rzadszej / kosztowniejszej klasy.
  3. Oversampling / undersampling (SMOTE, ROSE) - bilansowanie klas w danych.
  4. Cost-sensitive learning - wbudowane w modele klasy glmnet, xgboost.
  5. Macierz utility - rozszerzenie macierzy kosztów o zyski z TP i TN (np. zysk z udzielonego dobrego kredytu).

11. Wady i zalety

Zalety modelu logitowego

Wady modelu logitowego

12. Podsumowanie

Najważniejsze wnioski

Dziękuję za uwagę

Kontakt:

Pełny kod źródłowy w pliku model_logitowy.Rmd.

Aby wygenerować prezentację:

# Zainstaluj wymagane pakiety (jeśli nie masz):
install.packages(c("dplyr", "ggplot2", "knitr", "kableExtra",
                   "caret", "pROC", "broom", "gridExtra",
                   "rmarkdown"))

# Renderowanie prezentacji:
rmarkdown::render("model_logitowy.Rmd")