Kto bierze korepetycje z matmy? – jak to zrobić w R?

This post was kindly contributed by SmarterPoland » R - go there to comment and to read the full post.

W poprzednim wpisie pokazywaliśmy, którzy z uczniów w Polsce mają częściej zajęcia dodatkowe z matematyki.

A dziś pokażemy jak taki obrazek zrobić samodzielnie! Wystarczy przekopiować kilka linii kodu do R i mamy wykres dla Polski lub innego, wybranego kraju.

Zrobimy to w czterech krokach.

1. Wczytujemy dane z badania PISA2009 i ograniczamy zbiór danych tylko do polskich uczniów.

1
2
3
4
5
6
7
library(PISA2009lite)
library(PISAtools)
library(ggplot2)
sstudent2009 <- student2009[student2009$CNT == "Poland",]
schmeans <- by(sstudent2009[,c("PV1MATH", "W_FSTUWT")], 
		sstudent2009$SCHOOLID, 
		function(x) weighted.mean(x[,1], x[,2], na.rm=TRUE))

2. Przygotowujemy zbiór danych z trzema kolumnami – wynikiem z matematyki, wynikiem względnym z matematyki(minus średnia szkoły) i informacją czy uczeń ma zajęcia dodatkowe z matematyki.

8
9
10
df <- na.omit(data.frame(MATH = sstudent2009$PV1MATH, 
             MATHrelative =  sstudent2009$PV1MATH - schmeans[as.character(sstudent2009$SCHOOLID)], 
             dodatkoweZajecia = sstudent2009$ST32Q02 != "Do not attend", z = runif(nrow(sstudent2009))))

3. Aby narysować wykres konturowy potrzebujemy danych w innym formacie. Dla każdego punktu siatki musimy wyliczyć średnią liczbę studentów biorących korepetycje. W tym przypadku na bazie 400 sąsiadów.

12
13
14
15
16
17
18
os1 <- seq(min(df[,1]), max(df[,1]), length.out=50)
os2 <- seq(min(df[,2]), max(df[,2]), length.out=50)
grid <- expand.grid(x = os1, y = os2)
voting <- knn(df[,1:2], grid, cl=df[,3], prob=TRUE, k = 400, use.all=FALSE)
z <- attr(voting, "prob")
z <- ifelse(voting == "TRUE", z, 1-z) 
df2 <- data.frame(grid, z=1-z)

4. Rysujemy używając pakietu ggplot2. Jest tutaj trochę opcji, ponieważ domyślny wykres nie jest najpiękniejszy, trzeba więc pozmieniać trochę elementów by wyglądał lepiej.

18
19
20
21
22
23
24
25
p <- ggplot(df2, aes(x = x, y = y, z = z, fill= z))
p + geom_tile() + stat_contour( size=1, breaks=seq(0,1,0.1)) + theme_bw() +
  scale_fill_gradient2(low = "red", mid = "white", high = "blue", midpoint = .5) +
  geom_point(aes(x = MATH, y = MATHrelative, z = z, fill=z, shape=dodatkoweZajecia, color=dodatkoweZajecia), 
             data=df, alpha=0.3) + 
  scale_color_manual(values=c("blue", "red")) +
  xlab("Wynik ucznia z matematyki") +
  ylab("Wynik ucznia - sredni wynik szkoly z matematyki")