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.
Alle Datensätze mit NAs wurden entfernen, somit erhalte ich eine Teilmenge, bei denen Beobachtungen vorliegen.
##
## Diesel Regular
## 12700 12244
## 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
Gesucht ist Y := erwartende Schadenhöhe pro Versicherungsnehmer und Jahr, daher werden folgende Schritte zur Aufbereitung der abhängige Variable durchgefühert:
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
y <- y.tmp/exposure
y ist die Zielvariable und wird der Stichprobe hinzugefügt.
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))
Ich entscheide mich adhoc für eine multiple lineare Regression weil:
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:
Die Verteilung ist rechts verzerrt, aber OK.
##
## 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.
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.