Kredit-Scoring, Teil 1

In diesem und dem folgenden Beitrag möchte ich den Unterschied zwischen der klassischen Statistik und dem maschinellen Lernen herausarbeiten. Die Aufgabenstellung kommt dabei aus dem Bereich Kredit-Scoring:

Ein Kunde erhält einen Kredit und zahlt diesen in regelmäßigen Raten zurück. Dabei verdient der Kreditgeber an den Zinsen. Was passiert, wenn der Kunde in Zahlungsverzug gerät? Je nach Absicherung kann es für den Kreditgeber zu einem teilweisen oder auch totalen Ausfall des noch offenen Kreditbetrags kommen. Um diesem Risiko entgegen zu steuern, ermittelt der Kreditgeber mit Hilfe des Kreditscorings vor Abschluss des Vertrags die Wahrscheinlichkeit, dass ein solches Ereignis eintritt.

Für die Ermittlung der Wahrscheinlichkeit eines Zahlungsverzugs stehen mehrere Techniken zur Verfügung: Die klassische Vorgangsweise besteht in der Ermittlung einer Scorekarte. Dabei werden jedem Merkmal Punkte zugeordnet. Überschreitet die Summe aller Scorepunkte einen bestimmten Wert, wird der Kredit genehmigt. Im Grenzfall erfolgt eine individuelle Entscheidung. In allen anderen Fällen wird der Kredit abgelehnt.
Für die Erstellung der Scorekarte benötigt man die Wahrscheinlichkeit für einen Zahlungsverzug. Der Zahlungsverzug wird im englischsprachigen Raum als Default bezeichnet. Als Statistiker würde man diese Wahrscheinlichkeit mit Hilfe einer logistischen Regression ermitteln. Als Data Scientist könnte diese Aufgabe mittels maschinellen Lernens unter Verwendung eines Entscheidungsbaumes erfolgen. Ich werde beide Techniken vorstellen.

In diesem und dem folgenden Beitrag geht es nicht um eine detaillierte Darstellung der Methoden; nur wenige Argumente werden erklärt. Ich möchte Ihnen zeigen, wie Sie mit Hilfe der Sprache R mit wenigen Anweisungen dieses Problem auf elegante Weise lösen. In der Praxis stellt sich dieser Sachverhalt nicht so einfach dar. Viel Zeit wird in die Datenaufbereitung und Modellfindung investiert. Die Modelle müssen ständig auf ihre Aktualität hin geprüft und bei Bedarf angepasst werden. Oft existieren für unterschiedliche Marktsegmente auch unterschiedliche Scoringmodelle.
Ich beschreibe nun einen Lösungsweg mit Hilfe der klassischen Statistik. Dabei kommt die Methode der logistischen Regression zum Einsatz. Auf Grund der geringen Fallzahl an Kreditausfällen werden in der Praxis die Datensätze gewichtet. Für den Vergleich zwischen den Disziplinen Statistik und Data Science reicht zunächst eine repräsentative Stichprobe (ohne Gewichtung).
Beginnen wir mit der Beschreibung des Datenbestandes: Im konkreten Fall haben wir einen fiktiven Datenbestand von 18.000 Kreditfällen. In R wird ein Datenbestand in Form eines Data Frames gespeichert.

Ausgangspunkt für unsere Analysen ist also der Data Frame kreditdaten:


 

data frame kreditkarten

Für das Kredit-Scoring ist das Merkmal Default entscheidend. Default wird mit Zahlungsausfall, Zahlungsverzug übersetzt. Das Ziel ist, den möglichen Zahlungsausfall bereits im Vorfeld zu erkennen, um so eine objektive Entscheidung zur Kreditvergabe zu ermöglichen.

Zur Klärung des Zahlungsausfalls stehen folgende Variablen zur Verfügung:

  • Kreditbetrag in Euro (€)
  • Scoreklasse: A = beste Bewertung, … , G = schlechteste Bewertung
  • Wohnen: Hypothek, Eigentum, Miete und Sonstige
  • Einkommen in € pro Jahr
  • Alter in Jahren
  • Jobdauer: Dauer der letzten Beschäftigung in Jahresgruppen
  • Zins: Zinsbereich in Zinsgruppen

Die nachfolgende Anweisung zeigt, wie man mit Hilfe der Sprache R eine Zufallsstichprobe zieht. Bei einer Zufallsstichprobe hat jedes Element die gleiche Wahrscheinlichkeit, gezogen zu werden. Sie ist damit auch repräsentativ.

In unserem Beispiel wähle ich 12.000 Datensätze zufällig aus:

trainingIndex <- sample(1:nrow(kreditdaten), 12000)
trainingSet <- kreditdaten[trainingIndex,]
testSet <- kreditdaten[-trainingIndex,]

In R werden Zufallsstichproben mit Hilfe der sample Funktion erstellt. Das erste Argument beschreibt die Zahlen von 1 bis N (Anzahl aller Datensätze) in Form einer Sequenz 1 : nrow(kreditdaten). Aus dieser Sequenz werden nun 12.000 Zahlen ohne Zurücklegen gezogen und im R-Vektor trainingIndex gespeichert.
Mit Hilfe dieses Index‘ können nun die Data Frames (R Tabelle) trainingSet und testSet gebildet werden. Dabei nutzt man die Indexierungsmöglichkeiten [] von R. So sind im trainingSet nur jene Datensätze enthalten, deren Index auch im trainingIndex vorkommt. Beim testSet wird durch das Minus-Zeichen die Auswahl auf die Komplementärmenge beschränkt. Das Ergebnis dieses Schrittes sind die Data Frames:


trainingSet: 12.000 Datensätze
testSet: 6.000 Datensätze

Wir werden den Trainingsbestand dazu verwenden, unser Modell (logistische Regression) zu bilden. In der Fortsetzung dieses Beitrags werden wir beide Modelle mit Hilfe des Testbestands vergleichen.
In der Praxis spielt die Datenaufbereitung eine große Rolle. Diese nimmt oft den größten Teil des gesamten Zeitaufwands in Anspruch. Die eigentlichen Analysen sind eher technischer Natur und werden vom Computer unter Verwendung von R in kürzester Zeit gelöst. Bei der Beurteilung der Ergebnisse spielt die Erfahrung eine große Rolle.

Es ist nun an der Zeit, die logistische Regression auf unseren Trainingsbestand anzuwenden. Im Standardpaket von R existieren dazu die Funktionen lm und glm. Dabei steht lm für lineare Modelle und glm für allgemeine lineare Modelle. Die logistische Regression ist Teil der glm-Funktion.

gml-Funktion


Die R Funktion glm (generalized linear model) benötigt drei Argumente:

  • eine Formel für das gewünschte Modell (gekennzeichnet durch die Wellenlinie ~)
  • eine Familie zur Anwendung eines Binärmodells (Ja/Nein Entscheidungen) und
  • den Datenbestand

Die Formel – Default ~ . – sagt aus, dass sich der Default-Wert als Funktion aller anderen Werte darstellen lässt.

Mathematisch wird dies mit folgender Gleichung dargestellt:


Bei dieser Gleichung handelt es sich um eine nichtlineare Funktion und für die Bestimmung der Koeffizienten β0, β1, β2, … gibt es keine geschlossene Formel. Wir benötigen daher ein Näherungsverfahren. In der Statistik wird dabei gerne die Maximum Likelihood Methode genutzt. Über diesen komplexen Vorgang müssen Sie sich als Anwender keine Gedanken machen - R verfügt über entsprechende Algorithmen und erledigt dies alles im Hintergrund.

Als Ergebnis erhalten Sie eine erste Lösung. Zunächst haben wir alle Merkmale zur Modellbildung zugelassen. Aber nicht alle Merkmale sind voneinander unabhängig (z. B. Jobdauer und Alter). In diesem Beitrag möchte ich die Schwierigkeiten, die bei der Verletzung von Annahmen entstehen, noch ausblenden. Ich möchte Ihnen in erster Linie die Klarheit und Einfachheit der Sprache R näher bringen.
Betrachten wir die Signifikanz der einzelnen Koeffizienten: In R wird die Signifikanz durch entsprechende Marker (Punkt bzw. einer oder mehrere Sterne) dargestellt.

Mit Hilfe der summary-Funktion können wir das Gesamtmodell im Detail betrachten:

summary(lreg)

Wir erkennen, dass bestimmte Merkmale wie Kreditbetrag und Alter nicht signifikant sind. Andere Merkmale weisen nur eine geringe Signifikanz auf. Ich selbst bin kein Befürworter dieser Interpretation von Signifikanz. Sie ist aber mittlerweile Standard in vielen Statistik-Programmen.
Wie kann man nun aus diesen Merkmalen jene herausfiltern, die zu einem Modell führen, das die wichtigsten Variablen ohne wesentlichen Informationsverlust enthält?
Eine häufig genutzte Methode ist die Rückwerts-Elimination (backward elimination). Dabei wird schrittweise ein Merkmal nach dem anderen eliminiert, solange dieses eliminierte Merkmal keinen wesentlichen Informationsverlust darstellt.
Diese Formulierung ist noch vage - aber wir stehen ja am Anfang der R-Initiative.


lreg.backward <- step(lreg, trace = 0)

Die R-Funktion step implementiert die backward elimination. Das Argument trace unterdrückt die Ausgabe. Als Ergebnis erhalten wir das reduzierte Modell lreg.backward.
Auch hier sehen wir uns das Ergebnis des Modells lreg.backward im Detail an:


Unser Modell enthält nun die Merkmale: Scoreklasse, Wohnen, Einkommen, Jobdauer und Zins. Die Merkmale Kreditbetrag und Alter wurden eliminiert.
Um nun die Wahrscheinlichkeit für einen Zahlungsausfall je Datensatz zu berechnen, müssten wir obige Formel anwenden und für die Parameter β0, β1, β2, … die Werte aus der Spalte Estimate übernehmen - ein mühsamer Prozess.
Es geht aber auch einfacher. Betrachten wir den Data Frame trainingSet:


In der ersten Spalte finden wir die Datensatz-ID. Über diese ID wird ein Datensatz identifiziert.
So beschreibt der Datensatz mit der ID = 2928 einen Kunden, der einen Kreditbetrag von 1050 € benötig, mit einem Score A bewertet wird, in Miete lebt, über ein Einkommen von 17.100 € im Jahr verfügt, 27 Jahre alt ist und dessen Zinssatz unbekannt ist. Wie wahrscheinlich ist ein Kreditausfall?

Mittels predict kann man nun die Wahrscheinlichkeiten für einen Default vorhersagen. Ein mühsames Rechnen von Hand aus entfällt.

pred <- predict(lreg.backward, type = "response", newdata = trainingSet)

Die predict-Funktion liefert als Ergebnis einen R-Vektor mit den Wahrscheinlichkeiten zum Zahlungsverzug für jeden Datensatz.
Sehen wir uns z. B. die ersten sechs Datensätze mittels der head-Funktion an:

head(trainingSet)

Die erste Zeile zeigt die Datensatz ID. Darunter findet man die jeweilige Wahrscheinlichkeit. Damit ergibt sich für den Kunden eine Wahrscheinlichkeit für einen Zahlungsausfall in der Höhe von 7,80 %.

Im nächsten Beitrag werde ich den Zahlungsausfall mit Hilfe eines Entscheidungsbaums ermitteln.

Mit statistischen Grüßen
Helmut Grillenberger

www.usedata.com
www.pulsmagic.com

Dieser Komentar steht auch im pdf-Format zur Verfügung [346 KB] .