Blog
  • INWT
  • Blog
  • Logistische Regression - Beispiel in R

Logistische Regression - Beispiel in R

28.07.2015 00:00
von Sarah Wagner

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 schätzen wir ein Logit-Modell mit allen zur Verfügung stehenden Variablen. Die resultierenden Regressionskoeffizienten und ihre Signifikanz ergeben sich aus folgender Tabelle:

Außer "sulphates" sind alle Variablen zu einem Niveau von \( \alpha = 5\% \) signifikant. Als Beispiel für eine Interpretation wird der Regressionskoeffizient der Variable für den pH-Wert herangezogen. Das negative Vorzeichen lässt bereits darauf schließen, dass der pH-Wert einen negativen Einfluss auf die Wahrscheinlichkeit für das Ereignis \( Y_i = Weißwein \) hat. Steigt der pH-Wert um eine Einheit (in diesem Fall 0.01), so verringert sich die Chance \( P(Y_i = Weißwein) / P(Y_i = Rotwein) \) um den Faktor \( \exp(-0.02) = 0.98. \)

Dieses erste Modell wird im Folgenden auf seine Klassifikationsgüte überprüft.

Um herauszufinden ob die insignifikante Variable "sulphates" aus dem Modell entfernt werden kann, 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 bietet die Variable "sulphates" keinen zusätzlichen signifikanten Erklärungsgehalt für unser Modell und könnte 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(SDMTools)
library(ROCR)

# Erstellung einer Klassifikationstabelle
confusion.matrix(wine$color, fitted(logit))

# ROC Kurve
pred < - prediction(fitted(logit), wine$color)
perf < - performance(pred, "tpr", "fpr")
plot(perf, col = "red", lwd = 2)
abline(0,1, lty = 2, col = "gray")

# Pseudo-Bestimmheitsmaße
library(descr)
LogRegR2(logit)

Weitere Teile der Artikelserie über das Logit Modell:

Zurück