Aufgabe

Unter https://www.openml.org/d/41214 und https://www.openml.org/d/41215 finden Sie zwei Datensätze eines französischen Automobilversicherers. Diese beinhalten Risikomerkmale und Schadeninformationen zu Kfz-Versicherungsverträgen. Ihre Aufgabe besteht in der Modellierung der zu erwartenden Schadenhöhe pro Versicherungsnehmer und Jahr anhand der Risikomerkmale der Kunden. Dieser Wert ist Basis für die Berechnung eines fairen Versicherungsbeitrags.

Meine Prämissen für diese Aufgabe

  • Das Modelle sollte so wenige Parameter wie möglich besitzen.
  • Lineare Modelle sind gegenüber nichtlinearen Modellen zu bevorzugen.
  • Experimente mit wenigen Annahmen sind komplizierten Experimenten vorzuziehen.
  • Modelle sollten bis auf ein Minimum vereinfacht werden.
  • Einfache Erklärungen sind besser als komplizierte Erklärungen.

Explorative Datenanalyse (EDA)

Herausforderungen bei den Ausgangsdaten:

  • Ich habe zwei Datentöpfe.
  • Im Datensatz freMTPL2sev, ist die IDpol des Vertrags nicht Eindeutig, da mehrere Schäden im Versicherungszeitraum vorhanden sein können. Es muss ein Group by über die IDpol erfolgen und ClaimAmount summiert werden. Dadurch entsteht ein Datensatz mit einem eindeutigem Key. Diese Daten werden mit freMTPL2freq über die IDpol gejoint. So erhalte ich eine Ausgangsdatei mit einem eindeutigen Key IDpol, welcher den Versicherungsnehmer identifiziert.
  • Je eindeutigem IDpol kann eine Anzahl der Schäden (0…n) liegen. Da es sich um die gleichen Verträge handelt, kann die Anzahl auf 0 oder 1 und somit die Schadenssumme angepasst werden.
  • Die abhängige Variable y ist definiert als ClaimAmount / Exposure

Daten und deren Verteilung

Alle Datensätze mit NAs wurden entfernen, somit erhalte ich eine Teilmenge, bei denen Beobachtungen vorliegen.

  1. Nicht numerische Variablen Bsp. VehGas:
## 
##  Diesel Regular 
##   12700   12244
  1. Numerische Variablen und ihre Statistische Maßzahlen
##         Name     Varianz Standardabweichung Min   Max  IQR    MAD
## 1   VehPower        4.05               2.01   4    15    2   1.48
## 2     VehAge       26.77               5.17   0    99    8   5.93
## 3    DrivAge      214.87              14.66  18    99   20  14.83
## 4 BonusMalus      394.61              19.86  50   228   26   7.41
## 5    Density 16972089.30            4119.72   2 27000 2009 671.62
  1. Numerische Variable und ihr Lagemaß, Bsp. DrivAge:

Feature Engineering

Gesucht ist Y := erwartende Schadenhöhe pro Versicherungsnehmer und Jahr, daher werden folgende Schritte zur Aufbereitung der abhängige Variable durchgefühert:

  1. Wie hoch ist die Schadensumme im Schnitt bei einem Schaden
claimNb <- df.source$ClaimNb           # Anzahl Schäden im Versicherungszeitraum
claimAmount <- df.source$ClaimAmount   # Höhe der einzelnen Schadenaufwände -> Erwartungswert Y
exposure <- df.source$Exposure         # Länge des Versicherungszeitraums (in Jahren)

y.tmp <- claimAmount/claimNb           
  1. Die abhängige Variable ist definiert als ClaimAmount / Exposure
y <- y.tmp/exposure

y ist die Zielvariable und wird der Stichprobe hinzugefügt.

Gedanken zu Thema Ausreißer

Ausreißer können auf Grund der Begebenheit korrekt sein Bsp. ein richtig teurer Schaden.
Aber solche Datenpunkte können das Ergebnis Verzerren. Daher habe ich mich dazu entschieden, Ausreißer zu identifizieren und zu eliminieren.

Ich suche Q1, Q3 und den Interquartilsabstand für die Zielvariable y.

Q1 <- quantile(y, .25)
Q3 <- quantile(y, .75)
IQR <- IQR(y)

Ich behalten nur Zeilen in der Stichprobe bei, deren Werte innerhalb von 1,5 * IQR von Q1 und Q3 liegen.

no_outliers <- subset(df.source, y> (Q1 - 1.5*IQR) & y< (Q3 + 1.5*IQR))

Modellvergleich

Ich entscheide mich adhoc für eine multiple lineare Regression weil:

  1. das Sparsamkeitsprinzip gilt: lineare Modelle sind gegenüber nichtlinearen Modellen zu bevorzugen
  2. meine Zielvariable y metrisch skaliert ist,
  3. ich einen linearen Zusammenhang der Risikofaktoren und meiner Zielvariablen beschreiben möchte
  4. ich die Werte meiner Zielvariablen auf Basis der Werte meiner unabhängigen Variablen vorhersagen möchte

Welche unabhängigen Variablen sind geeignet?
Ich habe hier keine weiteren Analysen vorgenommen und im ersten Schritt nach Bauchgefühl gewählt:
VehPower, DrivAge, VehAge, BonusMalus, VehBrand

Mein Modell sieht folgendermaßen aus:

model <- lm(y ~ VehPower + DrivAge + VehAge + BonusMalus + VehBrand, data = df.analyse)

Vor der Ausgabe muss ich schauen, ob meine Modelannahme erfüllt ist.

Folgende Prüfungen stehen an:

  1. Die Verteilung der Modellresiduen sollte ungefähr normal sein.

Die Verteilung ist rechts verzerrt, aber OK.

  1. Die Varianz der Residuen sollte für alle Beobachtungen konsistent sein.
    Ich prüfe also auf Homoskedastizität (gleichmäßige lineare Streuung)
    Der Breusch-Pagan-Test prüft die Nullhypothese von Homoskedastizität.
    Ein geringer p-Wert verwirft diese und nimmt die Alternativhypothese von Heteroskedastizität an.
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 117.97, df = 14, p-value < 2.2e-16

Mein p-Wert ist sehr klein -> Homoskedastizität liegt vor.

Meine Modellannahmen sind hinreichend erfüllt, Schauen wir uns die Ausgabe meines Modells an:

summary(model)
## 
## Call:
## lm(formula = y ~ VehPower + DrivAge + VehAge + BonusMalus + VehBrand, 
##     data = df.analyse)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2432.9  -824.7  -339.2   481.5  4799.4 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 1229.7582    65.8636  18.671  < 2e-16 ***
## VehPower       3.1438     4.6952   0.670 0.503131    
## DrivAge       -2.3003     0.6805  -3.380 0.000726 ***
## VehAge        -0.8168     1.8410  -0.444 0.657285    
## BonusMalus     6.6614     0.5059  13.166  < 2e-16 ***
## VehBrandB10   55.3805    55.8328   0.992 0.321258    
## VehBrandB11    9.7837    60.2537   0.162 0.871011    
## VehBrandB12  549.3691    30.6187  17.942  < 2e-16 ***
## VehBrandB13   23.1955    64.6933   0.359 0.719939    
## VehBrandB14  239.3493   123.2040   1.943 0.052064 .  
## VehBrandB2    77.8377    24.3900   3.191 0.001418 ** 
## VehBrandB3   118.3581    33.9708   3.484 0.000495 ***
## VehBrandB4    35.0846    46.2806   0.758 0.448408    
## VehBrandB5   -25.5489    38.9051  -0.657 0.511383    
## VehBrandB6   109.6790    43.9815   2.494 0.012647 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1296 on 21595 degrees of freedom
## Multiple R-squared:  0.03081,    Adjusted R-squared:  0.03018 
## F-statistic: 49.04 on 14 and 21595 DF,  p-value: < 2.2e-16

Die Gesamt-F-Statistik meines Modells beträgt 49,04 und der entsprechende p-Wert 2,2e-16.
Dies zeigt mir, dass mein Regressionsmodell als Ganzes nützlich ist.

Die Güte meines Modells der gerechneten Regression, wird anhand des Bestimmtheitsmaßes R-Quadrat abgelesen.
R-Quadrat gibt an, wie viel Prozent der Varianz meiner abhängigen Variable y erklärt werden.
Leider ist der Wert sehr niedrig, erliegt bei 3,1%. Ein höherer Wert ist hierbei besser.

Der Residual standard error liegt bei 1296 und bedeutet, dass mein Modell bei der Vorhersage des ClaimAmount
um durchschnittlich um 1296 abweichen kann.
Je kleiner der Fehler, desto besser ist mein Modell bei der Vorhersage.
-> es geht Besser

Vergleich der Koeffizienten:

Estimate: Erhöhung der unabhängigen Variablen und dann die erwartete Änderung meiner Zielvariablen:
- Wenn die Marke B12 ist, dann steig meine Schadenssumme ordentlich
- Wenn das Alter (DrivAge) um 1 steigt, dann fällt mein Schadenssumme

Std. Error: Messung, wie genau das Modell den unbekannten Wert der abhängigen Variablen schätzt. Ein niedriger Wert ist gewünscht:
Für DrivAge, VehAge und BonusMalus liefert mein Modell ganz gute Schätzer.

Modellbuilding

Prognose anhand der Regressionsergebnisse

y.pred <- predict(model, df.analyse)

Ein Blick auf die Residuen, zeigt, ob eine Normalverteilung vorliegt:

qqnorm(residuals(model))
qqline(residuals(model))

Keine schöne Normalverteilung -> daher sollte das Modell optimiert werden

Nach Betrachtung aller bisherigen Analysen, würde ich tatsächlich noch einemal tiefer in die Datenanalyse gehen.
Kausalität zw. meiner Zielvariablen und meinen unabhängigen Variablen betrachten.
Korrelatoinen zwischen meinen unabhängigen Variablen identifizieren, dadurch kann ich eine Multikolinearität erkennen und entgegenwirken.
Bsp. Ich vermute, dass der Schadenfreiheitsrabatt mit dem Alter des Versicherungsnehmers korreliert.
Das ist nicht gut, da so die Berechnung meiner Regressionkoeffizienten erschwert wird und die Interpretation meines Modells nicht mehr eindeutig ist.