Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
lehrkraefte:ks:ffstat2324 [2024/04/26 08:58] Simon Knaus |
lehrkraefte:ks:ffstat2324 [2024/05/16 16:03] Simon Knaus |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ==== Lektion 08 ==== | ||
+ | |||
+ | === Ziele === | ||
+ | |||
+ | * Jede/r kann eine eindimensionale Regression mit R durchführen und interpretieren. | ||
+ | * Jede/r kann das Problem (mathematisch) formulieren, | ||
+ | * Jede/r kann eine Schätzung abgeben, wie viel ein gefahrener Kilometer gemäss dem eigenen Regressionsmodell kostet. | ||
+ | |||
+ | === Aufträge === | ||
+ | * Theorie Regression | ||
+ | * Theorie Regression unten durcharbeiten (oder zuhören) | ||
+ | * [[https:// | ||
+ | * Praxis Regression: | ||
+ | * Regression in den beiden Beispiel-Daten ('' | ||
+ | * Scatterplot erstellen | ||
+ | * Regression durchführen, | ||
+ | * Mögliche Fragen: | ||
+ | * Wie lautet die Gleichung der beiden Geraden? | ||
+ | * Welche Gerade ist << | ||
+ | * Regression für ein BMW-Modell durchführen | ||
+ | * Eine Regression durchführen, | ||
+ | * Freiwillig: Anstelle des Preises kann auch der Logarithmus des Preises als $y$-Variable verwendet werden. Wird das Modell ($R^2$) besser oder schlechter? Was heisst das für die Interpretation? | ||
+ | |||
+ | === Theorie === | ||
+ | Bei der Regression geht es letztendlich darum, den Zusammenhang, | ||
+ | |||
+ | Die Idee der Regression ist, die Summe der quadratischen Abstände einer Geraden zu den beobachteten Datenpunkten zu minimieren. Dabei ist wichtig zu beachten, dass nur die **vertikalen** Abstände betrachtet werden: | ||
+ | {{ : | ||
+ | |||
+ | Jede lineare Funktion $g$ kann als $g:y=mx+q$ beschrieben werden. Man sucht also $m$ und $q$ so, dass die quadrierte Summe der Längen der gestrichelten Linien minimal ist. | ||
+ | |||
+ | Streng mathematisch ausgedrückt hat man die Wertepaare $(x_1, | ||
+ | |||
+ | Schliesslich sucht man eben $m$ und $q$ so, dass die Summe | ||
+ | $$ | ||
+ | (y_1-(mx_1+q))^2+(y_2-(mx_2+q))^2+(y_3-(mx_3+q))^2+\cdots (y_n-(mx_n+q))^2=\sum_{i=1}^n (y_i-(mx_i+q))^2 | ||
+ | $$ | ||
+ | minimal ist, das heisst, dass die Summe der quadrierten Abstände möglichst klein ist. | ||
+ | |||
+ | Betrachtet man diese Summe genauer, stellt man fest, dass dieser Ausdruck ein quadratischer Ausdruck ist, wenn man $m$ und $q$ als Variablen betrachtet. In anderen Worten, würde man -- für gegebene Datenpunkte werden $x_i$ und $y_i$ zu Zahlen -- diesen Ausdruck als Graph darstellen, erhielte man eine Parabel. Für Parabeln kann der Scheitelpunkt, | ||
+ | |||
+ | Mit dieser Feststellung kann dann $m= \frac{\sum\limits_{i=1}^n (x_i - \bar x)(y_i - \bar y)}{\sum\limits_{i=1}^n (x_i - \bar x)^2}$ und $q=\bar y-m\bar x$ berechnet werden. Die Berechnung von $m$ und $q$ mit diesen Formeln führt zum Ziel, ist aber umständlich. Alle vernünftigen Datenanalyse-Programme können sogenannte Regressionsanalysen -- oder eben Ausgleichsgeraden -- berechnen. | ||
+ | |||
+ | === R Tipps === | ||
+ | Im Beispiel haben wir ein Datensatz gehabt mit den Spalten '' | ||
+ | Möchte man ausschliesslich die Daten eines Modells, könnte man wie folgt vorgehen: | ||
+ | |||
+ | <code R datenaufbereiten.r> | ||
+ | setwd(" | ||
+ | cardata <- read.table(" | ||
+ | head(cardata) # Erste Zeilen (6) anzeigen | ||
+ | unique(cardata$model) | ||
+ | unique(cardata$treibstoff) | ||
+ | |||
+ | # Nur die Modelle ' | ||
+ | selected <- cardata$model==" | ||
+ | # wie schaut der Vektor aus? | ||
+ | head(selected) | ||
+ | # Wie viele sind' | ||
+ | sum(selected) | ||
+ | |||
+ | # Daten auswählen, d.h. Zeilen auswählen | ||
+ | regdata <- cardata[selected, | ||
+ | |||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | <hidden R-Code> | ||
+ | <code R regressionanalyse.r> | ||
+ | ## Bsp Video Daten aus Excel in der Zwischenablage: | ||
+ | regdf <- read.table(file(" | ||
+ | lm(y ~ x, data = regdf) | ||
+ | summary(lm(y ~ x, data = regdf)) | ||
+ | |||
+ | ## Syntethische Daten | ||
+ | # Parameter um Daten zu generieren | ||
+ | nobs <- 40 | ||
+ | m <- 3 | ||
+ | q <- -2 | ||
+ | |||
+ | # Generieren der Daten | ||
+ | |||
+ | # Zufällige x Werte | ||
+ | xdat <- runif(nobs) * 10 | ||
+ | # y Werte gemäss y=mx+q plus Zufall | ||
+ | ydat <- m * xdat + q + rnorm(nobs, sd = 4) | ||
+ | |||
+ | # Zusammenfassen in dataframe | ||
+ | regdf <- data.frame(x = xdat, y = ydat) | ||
+ | |||
+ | # Regressionsmodell | ||
+ | lm(y ~ x, data = regdf) | ||
+ | # Übersicht Regressionsmodell | ||
+ | summary(lm(y ~ x, data = regdf)) | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | === Lösungen === | ||
+ | < | ||
+ | {{ : | ||
+ | |||
+ | {{ : | ||
+ | Berechnet man für die normalen Preise (nicht $\log$) die Regressiongerade, | ||
+ | * x1: $y = -0.3029\cdot x+47132$ | ||
+ | * x3: $y = -0.2412\cdot x+52607$ | ||
+ | * x4: $y = -0.3317\cdot x+65518$ | ||
+ | * x5: $y = -0.35\cdot x+78561$ | ||
+ | * x6: $y = -0.3912\cdot x+82847$ | ||
+ | |||
+ | Für den X1 << | ||
+ | |||
+ | </ | ||
+ | ==== Lektion 07 ==== | ||
+ | === Ziele === | ||
+ | * Jede/r kann einen Scatterplot von zwei Datenreihen / Merkmalen erstellen | ||
+ | * Jede/r kann die Korrelation von zwei Datenreihen / Merkmalen berechnen | ||
+ | * Jede/r kann die Korrelation interpretieren und die Masszahl Punktewolken aus dem Scatterplot zuordnen. | ||
+ | * Erste Ideen für ein eigenes Projekt. | ||
+ | |||
+ | === Auträge === | ||
+ | * Lies die Theorie unten durch. | ||
+ | * Korrelation im Auto-Datensatz | ||
+ | * Wähle ein BMW-Modell und erstelle eine Scatterplott, | ||
+ | * Berechne die Korrelation und das Bestimmtheitsmass für die gewählten Variablen. | ||
+ | * // | ||
+ | |||
+ | * Welche Korrelationen (Vorzeichen und Stärke) vermutest du im Datensatz? Welche zwei Variablen sind jeweils wie korreliert? | ||
+ | * Schau dir die Webseite {{https:// | ||
+ | === Theorie === | ||
+ | Wird ein Zusammenhang zwischen zwei kardinalen Merkmalen vermutet, sollte als erstes ein sogenannter Scatterplot erstellt werden. Zu diesem Zweck, wird das eine Merkmal auf der $x$-Achse und das andere Merkmal auf der $y$-Achse abgetragen. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Nun gibt es ein Mass für diesen Zusammenhang: | ||
+ | $$R_{xy}=\frac{\sum\limits_{i=1}^n (x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum\limits_{i=1}^n (x_i-\bar{x})^2 \sum\limits_{i=1}^n (y_i-\bar{y})^2}}$$ | ||
+ | Die Korrelation nimmt nur Werte zwischen $-1$ und $1$ an. In Excel wie auch in R sind Funktionen zur Berechnung der Korrelation hinterlegt. Wichtig dabei ist zu beachten, dass die Korrelation nur einen **linearen Zusammenhang** misst: | ||
+ | |||
+ | {{ : | ||
+ | Möchte man die Stärke der Korrelation messen, quadriert man $R_{xy}$ zur $R^2=R_{xy}^2$. Man spricht von einem **<< | ||
+ | |||
+ | Zusammenfassend kann gesagt werden, dass Richtung und Stärke eines linearen Zusammenhangs gemessen werden kann: | ||
+ | |||
+ | * **Richtung: | ||
+ | * **Stärke: | ||
+ | |||
+ | === Korrelation und Kausalität === | ||
+ | Auch wenn $R^2$ sehr gross ist, muss das nicht heissen, dass in Tat und Wahrheit wirklich ein Zusammenhang dieser beiden Variablen vorliegt. Es kann durchaus sein, dass die Korrelation zufällig zu Stande gekommen ist. Man spricht dann auch von **Scheinkorrelation** oder in Englisch von **spurious correlation**. | ||
+ | |||
+ | Kausalität in diesem Zusammenhang besagt, dass ein Merkmal ein anderes bedingt: So ist zum Beispiel bei der Thematik Schuhgrösse und Körpergrösse wirklich davon auszugehen, dass ein kausaler Zusammenhang besteht. | ||
+ | |||
+ | === Umsetzung in R === | ||
+ | In R können Scatterplots mit '' | ||
+ | <code R plot.r> | ||
+ | x <- c(2,3,7,10) | ||
+ | y <- c(7,1,2,30) | ||
+ | plot(x, y, main=" | ||
+ | </ | ||
+ | <hidden Optional: Funktionen zeichnen> | ||
+ | Mit dem gleichen Befehl könnten auch Funktionen gezeichnet werden: | ||
+ | <code R plot.r> | ||
+ | x <- seq(-3,3, by = 0.1) | ||
+ | y <- x^2 | ||
+ | plot(x, y, main=" | ||
+ | plot(x, y, main=" | ||
+ | plot(x, y, main=" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Die Korrelation kann mit '' | ||
+ | <code R plot.r> | ||
+ | x <- c(2,3,7,10) | ||
+ | y <- c(7,1,2,30) | ||
+ | R <- cor(x,y) | ||
+ | R | ||
+ | R^2 | ||
+ | </ | ||
+ | |||
+ | <hidden Optional: Manuelle Umsetzung> | ||
+ | In R werden Vektoren Element für Element multipliziert: | ||
+ | < | ||
+ | x <- c(2,3,7,10) | ||
+ | y <- c(7,1,2,30) | ||
+ | x-mean(x) | ||
+ | (x-mean(x))*(y-mean(y)) | ||
+ | sum((x-mean(x))*(y-mean(y))) | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | === Korrelationen BMW Datensatz nach Modell === | ||
+ | {{ : | ||
+ | <hidden R-Code> | ||
+ | <code correlation_plot.R> | ||
+ | library(corrplot) | ||
+ | png(" | ||
+ | par(mfrow=c(2, | ||
+ | for(mod in sort(unique(bmw$model))){ | ||
+ | tbmw = subset(bmw, | ||
+ | corbmw <- tbmw[, | ||
+ | corrplot(cor(corbmw, | ||
+ | } | ||
+ | dev.off() | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
==== Lektion 06 ==== | ==== Lektion 06 ==== | ||
=== Ziele === | === Ziele === | ||
Line 7: | Line 216: | ||
=== Aufträge === | === Aufträge === | ||
* Theorie Lorenzkurve lesen | * Theorie Lorenzkurve lesen | ||
- | * Beispiel mit Hilfe der {{lehrkraefte: | + | * Beispiel mit Hilfe der {{lehrkraefte: |
* Wahlweise: | * Wahlweise: | ||
* Eigenen R Code schreiben | * Eigenen R Code schreiben | ||
* Gini und Lorenzkurve weiter vertiefen mit | * Gini und Lorenzkurve weiter vertiefen mit | ||
- | * {{https:// | + | * {{https:// |
* Auf der {{https:// | * Auf der {{https:// | ||
- | * Überlege dir alternative Masse, um Konzentration resp. Ungleichverteilung (im Einkommenskontext) zu messen. | + | |
- | | + | |
+ | | ||
Line 31: | Line 241: | ||
Zeichnet man nun die Punkte $(\text{Kumulierte relative Anzahl}, | Zeichnet man nun die Punkte $(\text{Kumulierte relative Anzahl}, | ||
- | {{ : | + | {{ : |
---- | ---- | ||
Line 72: | Line 282: | ||
- | <hidden R Code> | + | < |
<code R> | <code R> | ||
computeLorenzCurve <- function(x, plot = T) { | computeLorenzCurve <- function(x, plot = T) { | ||
Line 431: | Line 641: | ||
<code R | intro.R> | <code R | intro.R> | ||
- | setwd(" | + | setwd(" |
cardata <- read.table(" | cardata <- read.table(" | ||
head(cardata) # Erste Zeilen (6) anzeigen | head(cardata) # Erste Zeilen (6) anzeigen |