Freitag, 21. Oktober 2016

Zusammenhang zwischen Rang und Tore im Fussball

Im folgenden Post wollen wir die Daten aus Kaggle analysieren. In dem Datensatz sind über 25000 Spiele mit 300 Mannschaften vorhanden. Ich habe die Mannschaften absteigend sortiert nach der Gesamtanzahl der Tore, die sie geschossen haben. Diese Sortierung wollen wir Rang nennen. Eine Mannschaft mit vielen Toren steht vor einer anderen Mannschaft mit wenigen Toren, d.h. die erste Mannschaft hat einen niedrigeren Rang als die zweite. Zwischen dem Rang und der Gesamtanzahl an Toren besteht ein mathematischer Zusammenhang. Dazu wollen wir uns zuerst eine Grafik anschauen.
Wie man sieht werden die Punkte (Rang/Gesamtanzahl an Toren) gut beschrieben durch die grüne Funktion. Der Zusammenhang ist wie folgt: \[ T = a_0 + a_1 \cdot \log(R) + a_2 \cdot \log(R)^2 + \epsilon\] \[ T = 706.037 + 24.20481 \cdot \log(R) - 25.32589 \cdot \log(R)^2 +\epsilon \] wobei T die Gesamtanzahl der Tore und R der Rang der Mannschaft ist und epsilon eine normalverteilte Zufallsvariable mit Mittelwert 0 und Standardabweichung 21.49643 ist. Die Berechnungen und die Grafik wurden mit R und MySQL gemacht:
#!/usr/bin/Rscript
source("connectToDB.R")

query <- "select sum(tg) as stg from 
 (
   select home_team_api_id as team_api_id, sum(home_team_goal) tg from game where home_team_api_id is not null and away_team_api_id is not null group by home_team_api_id 
   union
   select away_team_api_id as team_api_id, sum(away_team_goal) tg from game where home_team_api_id is not null and away_team_api_id is not null group by away_team_api_id 
 ) as tmp group by team_api_id order by stg desc;";
 x <- dbGetQuery(con, query);
 Y <- x$stg
 X <- seq(1:length(x$stg))
 d <- data.frame(log(X),Y)
 names(d) <- c("x","y")
 m <- lm(d$y ~ poly(d$x,2,raw=TRUE))
 png("rang-tore.png", width = 16, height = 8, units = 'in', res = 600)
 plot(d$y,type="p",xlab="Rang der Mannschaft",ylab="Gesamtanzahl an Toren",main="Fussball: Rang und Tore",cex=0.3)
 lines(predict(m,d),col="green")
 dev.off()
Wir testen, mit dem Kolmogorov-Smirnov-Test in R, ob der Fehler \[\epsilon\] normalverteilt ist:
  r <- m$residuals;
  ks.test(r,"pnorm",mean=mean(r),sd=sd(r))
Der Test ergibt:
  > ks.test(r,"pnorm",mean=mean(r),sd=sd(r))

 One-sample Kolmogorov-Smirnov test

data:  r
D = 0.0721, p-value = 0.08732
alternative hypothesis: two-sided
Da der p-Wert >= 0.05 ist, kann man davon ausgehen, dass epsilon normalverteilt mit Mittelwert 0 = mean(r) und Standardabweichung = sd(r) = 21.49643 ist.

Donnerstag, 20. Oktober 2016

Gebrauchtwagenpreise auf Ebay-Kleinanzeigen

Ich habe mit Scrapy Daten zu Gebrauchtwagenpreisen auf Ebay-Kleinanzeigen gesammelt. Hier ist eine grafische Auswertung nach Erstzulassungsjahr und Preis in Euro:
Die Grafik wurde mit R erzeugt:
#!/usr/bin/Rscript
x <- read.csv("jahr_preise.csv")
ll <- lm(log(x$preis) ~ poly(x$jahr, 93, raw=TRUE))
png("jahr-preis.png", width = 16, height = 8, units = 'in', res = 600)
plot(x$jahr,x$preis,type="p",xlab="Erstzulassungsjahr",ylab="Preis in EURO",main="Gebrauchtwagenpreise auf Ebay-Kleinanzeigen",cex=0.3)
lines(x$jahr, exp(ll$fitted.values))
dev.off()
Um die Kurve in der Grafik darstellen zu können wurde folgende Regression verwendet: \[ \text{preis} = \exp(\sum_{n=0}^{n=93}{a_n\cdot\text{jahr}^n}) \]