Keywords: Statistik Beratung, statistische Datenanalyse, Data Science

Einführung

Die folgende statistische Datenanalyse basiert auf dem UCI-Datensatz, welcher hier zu finden ist.

Data Set Information:

Bike sharing systems are new generation of traditional bike rentals where whole process from membership, rental and return back has become automatic. Through these systems, user is able to easily rent a bike from a particular position and return back at another position. Currently, there are about over 500 bike-sharing programs around the world which is composed of over 500 thousands bicycles. Today, there exists great interest in these systems due to their important role in traffic, environmental and health issues. Apart from interesting real world applications of bike sharing systems, the characteristics of data being generated by these systems make them attractive for the research. Opposed to other transport services such as bus or subway, the duration of travel, departure and arrival position is explicitly recorded in these systems. This feature turns bike sharing system into a virtual sensor network that can be used for sensing mobility in the city. Hence, it is expected that most of important events in the city could be detected via monitoring these data.

Attribute Information:

Both hour.csv and day.csv have the following fields, except hr which is not available in day.csv

  • instant: record index
  • dteday : date
  • season : season (1:springer, 2:summer, 3:fall, 4:winter)
  • yr : year (0: 2011, 1:2012)
  • mnth : month ( 1 to 12)
  • hr : hour (0 to 23)
  • holiday : weather day is holiday or not (extracted from [Web Link])
  • weekday : day of the week
  • workingday : if day is neither weekend nor holiday is 1, otherwise is 0.
  • weathersit :
    • 1: Clear, Few clouds, Partly cloudy, Partly cloudy
    • 2: Mist + Cloudy, Mist + Broken clouds, Mist + Few clouds, Mist
    • 3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light Rain + Scattered clouds
    • 4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog
  • temp : Normalized temperature in Celsius. The values are derived via (t-t_min)/(t_max-t_min), t_min=-8, t_max=+39 (only in hourly scale)
  • atemp: Normalized feeling temperature in Celsius. The values are derived via (t-t_min)/(t_max-t_min), t_min=-16, t_max=+50 (only in hourly scale)
  • hum: Normalized humidity. The values are divided to 100 (max)
  • windspeed: Normalized wind speed. The values are divided to 67 (max)
  • casual: count of casual users
  • registered: count of registered users
  • cnt: count of total rental bikes including both casual and registered

Hypothesen und Fragestellungen:

  1. An Arbeitstagen leihen sich mehr Menschen ein Fahrrad aus, als an anderen Tagen.
  2. Im Herbst und Winter leihen sich mehr Menschen ein Fahrrad aus als im Frühling und Sommer.
  3. Die Anzahl der ausgeliehenen Fahrräder hängt mit der Wettersituation zusammen.
  4. Wir vermuten, dass die Anzahl der ausgeliehenen Fahrräder an einem Tag etwas mit den anderen Variablen zu tun hat, und würden gerne anhand der restlichen Variablen die Anzahl der ausgeliehenen Fahrräder an einem Tag prognostizieren können.

Bevor wir mit der statistischen Auswertung anfangen legen wir noch ein Signifikanzniveau von 5% fest für alle statistischen Tests, die wir im folgenden durchführen wollen.

Statistische Datenanalyse:

  1. An Arbeitstagen leihen sich mehr Menschen ein Fahrrad aus, als an anderen Tagen.

Wir interpretieren diese Frage so, dass die durchschnittliche Anzahl der Menschen, die sich an einem Arbeitstag ein Fahrrad ausleihen, größer als die durchschnittliche Anzahl der Menschen ist, die sich an anderen Tagen ein Fahrrad ausleihen. Um diese Hypothese zu untersuchen, empfiehlt sich der Welch-Test. Unsere Nullhypothese lautet: Die durchschnittliche Anzahl der Menschen, die sich an einem Arbeitstag ein Fahrrad ausleihen ist kleiner oder gleich der durchschnittlichen Anzahl der Menschen, die sich an einem anderen Tag ein Fahrrad ausleihen. Wir gehen davon aus, dass die Varianzen ungleich aber unbekannt sind. (Diese Hypothese werden wir im nachhinein statistisch untermauern).

bikeData <- read.csv("day.csv",header=TRUE);

anArbeitstagen <- bikeData$cnt[bikeData$workingday==1];
anAnderenTagen <- bikeData$cnt[bikeData$workingday==0];
t.test(anArbeitstagen,anAnderenTagen,alternative="greater",var.equal=FALSE);
## 
##  Welch Two Sample t-test
## 
## data:  anArbeitstagen and anAnderenTagen
## t = 1.6014, df = 413.94, p-value = 0.05503
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
##  -7.501167       Inf
## sample estimates:
## mean of x mean of y 
##  4584.820  4330.169

Da der p-Wert ( 0.05503 ) größer als unser vorher definiertes Signifikanzniveau von 5% ist, können wir die in 1. aufgestellte Nullhypothese nicht widerlegen.

Wir kommen jetzt zu der Überprüfung der Varianzen. Unsere Vermutung ist, dass die unbekannten Varianzen ungleich sind. Hierzu benutzen wir den Levene-Test. Beim Levene-Test lautet die Null-Hypothese, dass die Varianzen gleich sind.

library(car)
leveneTest(cnt ~ factor(workingday), data = bikeData)
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value  Pr(>F)  
## group   1  4.3454 0.03746 *
##       729                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Da der p-Wert ( 0.03746 ) kleiner als 5% ist, ist diese Abweichung statistisch signifikant auf dem vorher definierten Niveau, d.h. wir interpretieren den Ausgang dieses statistischen Tests so, dass die Varianzen ungleich sind.

  1. Im Herbst und Winter leihen sich mehr Menschen ein Fahrrad aus als im Frühling und Sommer.

Wir interpretieren diese Hypothese so, dass die durchschnittliche Anzahl der Menschen, die sich an einem Tag im Herbst und Winter ein Fahrrad ausleihen, größer ist als die durchschnittliche Anzahl der Menschen, die sich an einem Tag im Frühling und Sommer ein Fahrrad ausleihen. Um diese Hypothese statistisch untersuchen zu können, verwenden wir wieder den Welch-Test. Dazu fassen wir die Tage im Frühling und Sommer zusammen zu einer Gruppe und die Tage im Herbst und Winter fassen wir in einer anderen Gruppe zusammen. Unsere Nullhypothese, welche wir vermuten verwerfen zu können, lautet: Die durchschnittliche Anzahl der Menschen, die sich an einem Tag im Herbst und Winter ein Fahrrad ausleihen ist kleiner oder gleich der durchschnittlichen Anzahl der Menschen, die sich an einem Tag im Frühling und Sommer ein Fahrrad ausleihen.

imFruehlingUndSommer <- bikeData$cnt[bikeData$season==1 | bikeData$season==2];
imHerbstUndWinter <- bikeData$cnt[bikeData$season==3 | bikeData$season==4];
t.test(imHerbstUndWinter,imFruehlingUndSommer, alternative="greater",var.equal=FALSE);
## 
##  Welch Two Sample t-test
## 
## data:  imHerbstUndWinter and imFruehlingUndSommer
## t = 10.389, df = 706.83, p-value < 2.2e-16
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
##  1170.231      Inf
## sample estimates:
## mean of x mean of y 
##  5198.749  3808.047

Da der p-Wert ( < 2.2e-16 ) , also erst recht kleiner als 5% ist, können wir die Nullhypothese verwerfen. Das heißt zusammenfassend kann man sagen, dass im Herbst und Winter sich mehr Menschen ein Fahrrad ausleihen als im Frühling und Sommer.

  1. Die Anzahl der ausgeliehenen Fahrräder hängt mit der Wettersituation zusammen.

Um diese Hypothese zu untersuchen, wollen wir testen ob die Variable “Anzahl der ausgeliehenen Fahrräder (cnt)” statistisch zusammenhängt mit der Variable “Wettersituation ( weathersit)”. Da es sich bei der Variable “weathersit” um eine kategorielle Variable und bei der Variable “cnt” um eine numerische Variable, wollen wir zuerst die Variable “cnt” in eine kategorielle Variable umwandeln und dann mit Chi-Quadrat-Test auf Unabhägigkeit der Variablen testen. Dazu teilen wir die Variable “cnt” in 9 Intervalle gleicher Länge auf:

bikeData$cntGroups <- cut(bikeData$cnt,breaks=c(0,
                                                1000,
                                                2000,
                                                3000,
                                                4000,
                                                5000,
                                                6000,
                                                7000,
                                                8000,
                                                9000),labels=c(0,1,2,3,4,5,6,7,8));

Wir schauen uns die Häufigkeitstabelle der zwei Variablen an:

table(bikeData$cntGroups,bikeData$weathersit);
##    
##       1   2   3
##   0   5   7   7
##   1  39  34   6
##   2  34  34   6
##   3  61  46   0
##   4 110  54   2
##   5  74  32   0
##   6  64  22   0
##   7  65  17   0
##   8  11   1   0

Man sieht schon an der Häufigkeitstabelle, dass bei gutem Wetter ( weathersit = 1) öfters Fahrräder ausgeliehen werden als bei schlechtem Wetter ( weathersit = 3). Wir führen jetzt den Chi-Quadrat-Test auf Unabhängigkeit der Variablen. Die Nullhypothese lautet: Die zwei Variablen sind stochastisch unabhängig.

chisq.test(bikeData$cntGroups,bikeData$weathersit,simulate.p.value=FALSE);
## Warning in chisq.test(bikeData$cntGroups, bikeData$weathersit,
## simulate.p.value = FALSE): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  bikeData$cntGroups and bikeData$weathersit
## X-squared = 137.17, df = 16, p-value < 2.2e-16

Da der p-Wert ( < 2.2e-16 ) kleiner als 5% ist, können wir die Nullhypothese der Unabhängigkeit der Variablen verwerfen, d.h. wir gehen davon aus, dass die Alternativhypothese zutrifft und die Anzahl der ausgeliehenen Fahrräder mit der Wettersituation zusammenhängt.

  1. Prognose der Anzahl der ausgeliehenen Fahrräder an einem Tag anhand anderer Variablen

Da die Variablen zur Prognose der Anzahl der ausgeliehenen Fahrräder gemischt als numerische und kategorielle Variablen vorliegen, wenden wir einen Entscheidungsbaum, um die Prognose zu machen, da Entscheidungsbäume vergleichsweise leicht zu interpretieren sind und mit gemischten Variablen umgehen können. Als Variablen für die Prognose, können wir nicht zum Beispiel “casual” und “registered” nehmen, da die Summe diese Zahlen genau das ist was wir prognostizieren wollen und diese Variablen im allgemeinen unbekannt während der Prognose sind. Wir benutzen folgende Variablen: temp,atemp,mnth,weekday,season,workingday,weathersit,hum,windspeed um die Variable cnt anhand der gegebenen Variablen vorauszusagen. Damit die Genauigkeit des Verfahrens realistisch geprüft wird, teilen wir den Datensatz in zwei zufällige Gruppen. In die eine Gruppe (Training) kommen nur Datensätze mit denen der Entscheidungsbaum erstellt wird. In die andere Gruppe kommen nur Datensätze um später die Prognosequalität des erstellten Entscheidungsbaums beurteilen zu können:

# faktorielle Variablen werden also solche gespeichert:
bikeData$mnth <- as.factor(bikeData$mnth)
bikeData$season <- as.factor(bikeData$season)

# 75% der Daten werden zum Trainingsdatensatz hinzugefuegt
smp_size <- floor(0.75 * nrow(bikeData))

# Wir setzen seed auf eine beliebige Zahl, 
# um die zufaellige Aufteilung reproduzierbar zu machen
set.seed(123)
train_ind <- sample(seq_len(nrow(bikeData)), size = smp_size)

train <- bikeData[train_ind, ]
test <- bikeData[-train_ind, ]

entscheidungsbaum <- rpart(cnt ~ temp
                                 +atemp
                                 +mnth
                                 +weekday
                                 +season
                                 +workingday
                                 +weathersit
                                 +hum
                                 +windspeed, data = train)

prognoseTestdaten <- predict(entscheidungsbaum, test)

# durchschnittlicher absoluter Fehler
mean(abs(prognoseTestdaten-test$cnt))
## [1] 1112.795

Der durchschnittliche absolute Fehler liegt bei 1112.795. Das heißt im Durchschnitt liegt der Prognosefehler bei 1112.795 ausgeliehenen Fahrrädern am Tag.

Wir schauen uns den erstellten Entscheidungsbaum an:

Der Entscheidungsbaum ist so zu interpretieren: Im ersten Knoten sind 100% der Trainingsdatensätze vorhanden. Die durchschnittliche Anzahl an ausgeliehenen Fahrrädern in diesem Knoten ist aufgerundet 4503. Falls die Variable temp < 0.43 ist gehen wir nach links (yes) ansonsten nach rechts (no). Angenommen wir haben einen Datensatz bei dem temp < 0.43 ist, d.h. wir gehen nach links. In diesem Knoten sind 40% aller Trainingsdatensätze vorhanden und der Durchschnittswert in diesem Knoten liegt bei 2990. Angenommen bei dem betrachteten Datensatz ist temp >= 0.27, d.h. wir gehen weiter zum rechten Knoten ( 3573, 26%) und season = 1, d.h. wir gehen weiter zum linken Knoten (3022, 14%), welches ein Blatt ist. Dann bekommt der betrachtete Datensatz den Wert 3022 zugewiesen. Mit anderen Worten: Wenn wir einen Datensatz haben bei dem 0.27 <= temp < 0.43 und season = 1 ist, dann wird diesem Datensatz 3022 prognostiziert. Der Entscheidungsbaum sagt also aus: Falls an einem zufälligen Tag mit 0.27 <= temp < 0.43 und season = 1 ist, dann werden 3022 Fahrräder an diesem Tag ausgeliehen. Ähnlich interpretiert man die anderen Pfade im Entscheidungsbaum.