Logistische Regression - Beispiel in R
Der erste Teil der Artikelserie zur logistischen Regression stellt die logistische Regression als Verfahren zur Modellierung binärer abhängiger Variablen vor. Der zweite Teil geht auf Methoden für die Beurteilung der Klassifikationsgüte ein. In diesem Artikel wird nun die Anwendung des Verfahrens an einem konkreten Beispiel, der Klassifikation von Weinen, mithilfe der Statistik-Software R gezeigt.
Datensatz: Klassifikation von Weinen
Es beschäftigt uns (wie schon bei der Vorstellung der linearen Regression) auch bei der logistischen Regression wieder das Thema Wein. Diesmal geht es jedoch nicht darum, die Qualität des Weines mittels Regression zu bestimmen, vielmehr soll nun anhand der chemischen Eigenschaften des Weins seine Farbe (rot oder weiß) bestimmt werden. Der verwendete Datensatz enthält insgesamt 6497 Beobachtungen, davon gehören 1599 zu den Rot- und 4898 zu den Weißweinen. In der Spalte "color" wird die Farbe spezifiziert, wobei 0 für "rot" und 1 für "weiß" steht. Die Variable "quality" enthält eine Einschätzung der Qualität des Weines auf einer Skala von 0 bis 10. Darüber hinaus geben 11 weitere Variablen Aufschluss über die chemischen Eigenschaften der Weine.
- color (0=rot, 1=weiß)
- quality (zwischen 0 und 10)
- fixed acidity
- volatile acidity
- citric acid
- residual sugar
- chlorides
- free sulfur dioxide
- total sulfur dioxide
- density
- pH
- sulphates
- alcohol
# Rotweindatensatz einlesen
red <- read.csv2("http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv", dec = ".", header = TRUE)
# Weißweindatensatz einlesen
white <- read.csv2("http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv", dec = ".", header = TRUE)
# jedem der beiden Datensätze eine Spalte "color" mit 0 bei Rotweinen und 1 bei Weißweinen anfügen
red$color <- 0
white$color <- 1
# Zusammenführen der zwei Datensätze zu einem Datensatz "wine"
wine <- rbind(red, white)
# Löschen der nun überflüssigen Einzeldatensätze
rm(list = c("red", "white"))
Modellierung mittels Logit
Im ersten Schritt verschaffen wir uns einen Überblick über den Datensatz und schätzen dann ein Logit-Modell mit allen zur Verfügung stehenden Variablen. Außer fixed.acidity und pH sind alle Variablen zu einem Niveau von \( \alpha = 5\% \) signifikant. Als Beispiel für eine Interpretation wird der Regressionskoeffizient der Variable für den Gehalt der Zitronensäure citric.acid herangezogen. Steigt der Zitronensäuregehalt um eine Einheit (in diesem Fall 0.01), so erhöht sich die Chance \( P(Y_i = Weißwein) / P(Y_i = Rotwein) \) um den Faktor \( \exp(2.61720) = 13.7. \)
Dieses erste Modell wird im Folgenden auf seine Klassifikationsgüte überprüft.
Um herauszufinden ob die insignifikanten Variablen aus dem Modell entfernt werden können, bietet sich die Verwendung der step()-Funktion an (siehe R Code). Diese minimiert schrittweise (durch hinzufügen oder weglassen von Variablen) das Akaike Informationskriterium (AIC) des Modells. Tatsächlich bieten die Variablen fixed.acidity und pH keinen zusätzlichen signifikanten Erklärungsgehalt für unser Modell und können damit von der Analyse ausgeschlossen werden.
# einen Überblick über den Datensatz verschaffen:
str(wine)
# Definition des Modells
modell <- as.formula("color ~ fixed.acidity + volatile.acidity +
citric.acid + residual.sugar + chlorides +
free.sulfur.dioxide + total.sulfur.dioxide +
density + pH + sulphates + alcohol + quality")
logit <- glm(modell, family = binomial, data = wine) # Ausgabe der Schätzergebnisse
summary(logit)
# Minimierung des AIC mittels step()-Funktion
logitMinAIC <- step(logit)
summary(logitMinAIC)
Beurteilung der Klassifikationsgüte im Logit
Zuerst wird eine Klassifikationstabelle erstellt, um zu erkennen wie viele Weine das Modell mit einem Schwellenwert von 0.5 (Standard) der richtigen Farbe zuordnet:
Weißwein (1) | Rotwein (0) | Summe | |
---|---|---|---|
Weißwein (1) | 4887 | 19 | 4906 |
Rotwein (0) | 11 | 1580 | 1591 |
Summe | 4898 | 1599 | 6497 |
Es ist zu erkennen, dass 1580 der 1599 Rotweine und 4887 der 4898 Weißweine korrekt klassifiziert werden. Die Korrektklassifikationsrate beträgt (1580+4887)/6497 = 99.5%. Das Modell kann damit als sehr gut angesehen werden. In der unteren Grafik ist darüber hinaus die ROC-Kurve für das Logit-Modell abgetragen. Die Fläche zwischen der Diagonalen und der ROC Kurve hat annähernd die maximale Größe. Eine weitere Anpassung des Modells an den Datensatz würde im Folgenden kaum eine Möglichkeit zur Optimierung des Klassifikationsergebnisses bieten.
Auch die Pseudo-Bestimmtheitsmaße deuten in diesem Fall auf eine gute Modellanpassung hin: Das McFadden R2 beträgt 0.94, wobei bereits Werte ab 0.2/0.3 auf ein gutes Modell schließen lassen. Das Pseudo-Bestimmtheitsmaß von Nagelkerke hat hingegen den Vorteil, dass es analog zum Bestimmtheitsmaß bei der linearen Regression interpetiert werden kann. Nach Nagelkerke ergibt sich ein Wert von 0.97. Zuletzt bleibt noch das Cox&Snell R2, dieses beträgt für unser Wein-Modell 0.65.
# Die benötigten Pakete laden
library(caret)
library(ggplot2)
library(plotROC)
# Erstellung einer Klassifikationstabelle
pred <- ifelse(fitted(logit) > 0.5, 1, 0)
confusionMatrix(factor(wine$color), factor(pred))
# ROC Kurve
df_predictions <- data.frame(color = wine$color, pred = fitted(logit))
ggplot(df_predictions, aes(d = color, m = pred)) +
geom_roc(n.cuts = 0) +
geom_abline(slope = 1, intercept = 0, lty = 2)
Weitere Teile der Artikelserie über das Logit Modell:
- Teil 1: Logistische Regression - Modell und Grundlagen
- Teil 2: Logistische Regression - Beurteilung der Klassifikationsgüte
- Teil 3: Logistische Regression - Beispiel in R