-
Notifications
You must be signed in to change notification settings - Fork 0
Pobieranie oszacowań PV uczniów i obliczanie PWE
Aby samodzielnie policzyć PWE, musimy:
- znaleźć skalowanie, z którego chcemy skorzystać;
- pobrać dla tego skalowania oszacowania PV umiejętności uczniów;
- dołączyć dane kontekstowe, które będą nam potrzebne do wskazania grup, dla których PWE zostaną policzone;
- użyć funkcji
agreguj_pwe()
do obliczenia wskaźników PWE.
-
pobierz_testy()
(wyszukiwanie skalowań) -
pobierz_oszacowania_uczniow()
(pobieranie PV) -
pobierz_szkoly()
,pobierz_uczniow()
, 'pobierz_dane_uczniowie_testy()` (ew. pobieranie danych kontekstowych) -
filtruj_przystapienia()
(ew. odfiltrowanie uczniów ponownie przystępujących do egzaminu) -
agreguj_pwe()
,oblicz_wariancje_populacji()
(obliczanie PWE)
Jak zwykle na początku zaczniemy od załadowania pakietu ZPD i nawiązania połączenia z bazą IBE:
library(ZPD)
src = polacz()
- Spis wszystkich skalowań znajduje się w grupie danych skale, stąd też do ich pobrania użyjemy funkcji
pobierz_skale()
. - Następnie odfiltrowujemy tylko te z nich, które posiadają w bazie oszacowania PV (zmienna posiada_pv) oraz odnoszą się do interesującego nas egzaminu i/lub roku (zmienne rodzaj_egzaminu, czesc_egzaminu, rok).
Np. wyszukajmy skalowania części matematyczno-przyrodniczej egzaminu gimnazjalnego:
skalowGim = pobierz_skale(src) %>%
filter(
rodzaj_egzaminu == 'egzamin gimnazjalny',
posiada_pv == TRUE
) %>%
select(id_skali, skalowanie, rodzaj_egzaminu, czesc_egzaminu, data_skalowania, opis_skali) %>%
distinct() %>%
arrange(id_skali, skalowanie, rodzaj_egzaminu) %>%
as.data.frame()
skalowGim
## id_skali skalowanie rodzaj_egzaminu czesc_egzaminu
## 1 854 22003 egzamin gimnazjalny historia i WOS
## 2 854 22003 egzamin gimnazjalny humanistyczna
## 3 854 22003 egzamin gimnazjalny j. polski
## 4 855 21003 egzamin gimnazjalny matematyczno-przyrodnicza
## 5 855 21003 egzamin gimnazjalny matematyka
## 6 855 21003 egzamin gimnazjalny przedmioty przyrodnicze
## data_skalowania opis_skali
## 1 2015-05-03 paou;gh;2002-2013
## 2 2015-05-03 paou;gh;2002-2013
## 3 2015-05-03 paou;gh;2002-2013
## 4 2015-05-06 paou;gm;2002-2013
## 5 2015-05-06 paou;gm;2002-2013
## 6 2015-05-06 paou;gm;2002-2013
Jak widać w bazie istnieją dwa skalowania spełniające te kryteria:
- skalowanie o id_skali 854 i numerze skalowania 22003 - opisujące część humanistyczną egzaminu;
- skalowanie o id_skali 855 i numerze skalowania 21003 - opisujące część matematyczno-przyrodniczą egzaminu.
My w tej chwili ograniczmy się do części humanistycznej, a więc skalowania 22003 na skali 854.
- Pobieranie z bazy PV jest najbardziej kłopotliwym elementem omawianego procesu, zajmuje bowiem bardzo dużo czasu.
- Wynika to z faktu, że w bazie znajduje się w chwili obecnej ponad 450 milionów rekordów z oszacowaniami umiejętności uczniów, które baza musi odfiltrować, a następnie przesłać na nasz komputer.
- W szczególności w praktyce nie jest możliwe pobranie na komputer całej grupy danych oszacowania naraz.
- Niezbędne jest jej odfiltrowanie co najmniej po wybranej kombinacji zmiennych id_skali i skalowanie.
- Zalecane jest pobieranie PV latami (tym bardziej, że wyliczanie PWE odbywa się potem i tak w podziale na lata)
- Z uwagi na powyższe ograniczenia ćwiczenia przeprowadzać będziemy na ograniczonej liczbie uczniów, zaś pełne dane ogólnopolskie wczytamy z wcześniej przygotowanego pliku .RData
Pobierzmy oszacowania PV dla wyszukanego uprzednio skalowania 22001 na skali 854 (PWE gimnazjalne dla części humanistycznej egzaminu) dla wszystkich szkół w powiecie oławskim
# najpierw wyszukajmy szkoły
szkoly = pobierz_szkoly(src) %>%
filter(rok == 2013, typ_szkoly == 'gimn.', powiat_szkoly == 'oławski')
# następnie pobierzmy pv odfiltrowując je za pomocą wyszukanych szkół
pv = pobierz_oszacowania_uczniow(src) %>%
filter(id_skali == 854, skalowanie == 22003, rok == 2013, estymacja == 'PV') %>%
semi_join(szkoly) %>%
collect()
## Joining by: c("id_szkoly", "rok")
PWE wyliczamy dla grup uczniów (szkół, gmin, ale też np. chłopców i dziewcząt, itp.), musimy więc posiadać w zbiorze danych zmienne pozwalające podzielić PV na interesujące nas grupy.
Zmienne znajdujące się w grupie danych oszacowania często okazą się tutaj niewystarczające i trzeba będzie dołączyć do nich dane z innych grup danych, np.:
- szkoly - informacje o szkołach i JST;
- uczniowie - niezmienne informacje o uczniach: płeć i rocznik szkolny;
- uczniowieTesty - informacje o uczniach mogące zmieniać się w czasie, np. dysleksja lub bycie laureatem egzaminu.
W naszym przykładzie "pójdziemy na całość" i dołączymy informacje z wszystkich powyższych grup danych:
# pobieramy na komputer dane szkół (te same, których użyliśmy do filtrowania PV)
szkoly = szkoly %>%
collect()
# pobieramy dane o uczniach (stałe i zmienne w czasie)
# ograniczając je tylko do uczniów, dla których pobraliśmy PV
uczniowie = pobierz_uczniow(src) %>%
inner_join(pobierz_dane_uczniowie_testy(src)) %>%
semi_join(pv, copy = TRUE) %>%
collect()
## Joining by: "id_obserwacji"
## Joining by: c("id_obserwacji", "id_testu", "id_szkoly", "rok")
# dołączamy wszystkie dane do PV
pv = pv %>%
inner_join(szkoly) %>%
inner_join(uczniowie)
## Joining by: c("id_szkoly", "rok")
## Joining by: c("id_obserwacji", "id_testu", "id_szkoly", "rok")
# podejrzyjmy wszystkie zmienne w złączonym zbiorze:
colnames(pv)
## [1] "id_skali" "skalowanie"
## [3] "id_obserwacji" "id_testu"
## [5] "estymacja" "nr_pv"
## [7] "wynik" "bs"
## [9] "grupa" "id_szkoly"
## [11] "rok" "typ_szkoly"
## [13] "publiczna" "dla_doroslych"
## [15] "specjalna" "przyszpitalna"
## [17] "artystyczna" "id_szkoly_oke"
## [19] "nazwa_szkoly" "adres"
## [21] "miejscowosc" "pna"
## [23] "poczta" "wielkosc_miejscowosci"
## [25] "matura_miedzynarodowa" "teryt_szkoly"
## [27] "wojewodztwo_szkoly" "powiat_szkoly"
## [29] "gmina_szkoly" "rodzaj_gminy"
## [31] "plec" "rocznik"
## [33] "id_cke" "dysleksja"
## [35] "laureat" "pop_podejscie"
## [37] "oke" "zrodlo"
Mając PV z dołączonymi zmiennymi kontekstowymi umożliwiającymi wyróżnienie grup, możemy obliczyć interesujące nas PWE.
Użyjemy do tego funkcji agreguj_pwe()
w kombinacji z funkcją oblicz_wariancje_populacji()
.
Przy obliczaniu PWE musimy odpowiedzieć sobie na pytanie, w stosunku do jakiej populacji chcemy odnosić nasze wyniki. Może to być np.:
- Polska
- region (np. tutaj powiat oławski)
- możemy też nie określać populacji odniesienia.
Wybór ten nie będzie miał znaczenia dla oszacowań punktowych, ale będzie wpływał na błąd standardowy oszacowania średniej.
Im więcej uczniów należy do populacji odniesienia, tym błędy standardowe oszacowania średniej będą większe.
Kiedy już wybierzemy populację odniesienia, obliczamy dla niej wariancję wyników poprzez przekazanie PV uczniów z tej populacji do funkcji oblicz_wariancje_populacji()
, np.:
- przyjmujemy za populację odniesienia powiat oławski:
warPop_pow = oblicz_wariancje_populacji(pv)
warPop_pow
## [1] 226.1709
- przyjmujemy za populację odniesienia Polskę:
(w tym wypadku potrzebujemy PV dla uczniów z całej Polski, których pobranie z bazy trwałoby zbyt długo, dlatego wczytamy je z zawczasu przygotowanego pliku .RData)
# ponieważ pobieranie PV dla całego rocznika trwałoby bardzo długo,
# przypiszemy wartość wariancji populacji ręcznie na podstawie dokonanych przez autora obliczeń:
warPop_pol = 249.29
# chcąc samemu pobrać dane i obliczyć wariancję populacji, zastosowalibyśmy kod:
# pv_854_22003_2013 = pobierz_oszacowania(src) %>%
# filter(id_skali == 854, skalowanie == 22003, rok == 2013, estymacja == 'PV') %>%
# collect()
# warPop_pol = oblicz_wariancje_populacji(pv_854_22003_2013)
- nie przyjmujemy żadnej populacji odniesienia:
warPop_brak = 0
Obliczanie PWE następuje z użyciem funkcji agreguj_pwe(pv, nazwy_zmiennych_wyznaczających_grupy, wariancja_populacji)
.
Policzmy np. PWE gmin (w naszym powiecie oławskim) w podziale na chłopców i dziewczęta. Porównajmy wyniki dla różnych populacji odniesienia:
pwe_warPol = agreguj_pwe(pv, c('gmina_szkoly', 'plec'), warPop_pol)
## Błąd losowania obserwacji obliczany na podstawie wariancji populacji
pwe_warPow = agreguj_pwe(pv, c('gmina_szkoly', 'plec'), warPop_pow)
## Błąd losowania obserwacji obliczany na podstawie wariancji populacji
pwe_warBrak = agreguj_pwe(pv, c('gmina_szkoly', 'plec'), warPop_brak)
## Błąd losowania obserwacji obliczany na podstawie wariancji wewnątrz grup
# obejrzyjmy wyniki (dla przejrzystości tylko wybrane zmienne)
pwe_warPol %>% select(gmina_szkoly, plec, n, q1, srednia, q3, bs)
## Source: local data frame [6 x 7]
## Groups: gmina_szkoly, plec [6]
##
## gmina_szkoly plec n q1 srednia q3 bs
## (chr) (chr) (dbl) (dbl) (dbl) (dbl) (dbl)
## 1 Domaniów k 25 92.18865 99.33556 108.0082 3.287003
## 2 Domaniów m 44 81.49880 91.27989 101.6512 2.471248
## 3 Jelcz-Laskowice k 101 94.19413 102.08938 111.7127 1.642243
## 4 Jelcz-Laskowice m 87 88.81642 98.56712 108.0954 1.764086
## 5 Oława k 238 94.62886 102.76524 111.8901 1.086610
## 6 Oława m 239 88.89140 100.08143 112.3276 1.069557
pwe_warPow %>% select(gmina_szkoly, plec, n, q1, srednia, q3, bs)
## Source: local data frame [6 x 7]
## Groups: gmina_szkoly, plec [6]
##
## gmina_szkoly plec n q1 srednia q3 bs
## (chr) (chr) (dbl) (dbl) (dbl) (dbl) (dbl)
## 1 Domaniów k 25 92.18865 99.33556 108.0082 3.143187
## 2 Domaniów m 44 81.49880 91.27989 101.6512 2.362548
## 3 Jelcz-Laskowice k 101 94.19413 102.08938 111.7127 1.571006
## 4 Jelcz-Laskowice m 87 88.81642 98.56712 108.0954 1.687087
## 5 Oława k 238 94.62886 102.76524 111.8901 1.040952
## 6 Oława m 239 88.89140 100.08143 112.3276 1.023337
pwe_warBrak %>% select(gmina_szkoly, plec, n, q1, srednia, q3, bs)
## Source: local data frame [6 x 7]
## Groups: gmina_szkoly, plec [6]
##
## gmina_szkoly plec n q1 srednia q3 bs
## (chr) (chr) (dbl) (dbl) (dbl) (dbl) (dbl)
## 1 Domaniów k 25 92.18865 99.33556 108.0082 2.6226725
## 2 Domaniów m 44 81.49880 91.27989 101.6512 2.5084130
## 3 Jelcz-Laskowice k 101 94.19413 102.08938 111.7127 1.4392714
## 4 Jelcz-Laskowice m 87 88.81642 98.56712 108.0954 1.7749890
## 5 Oława k 238 94.62886 102.76524 111.8901 0.9327097
## 6 Oława m 239 88.89140 100.08143 112.3276 1.1032293
Jak widać wybór populacji nie ma znaczenia dla oszacowań punktowych, wpływa jednak na błąd standardowy oszacowania średniej.
Obliczmy teraz wyniki dla całego powiatu z Polską jako populacją odniesienia i porównajmy je z wartościami prezentowanymi w serwisie http://pwe.ibe.edu.pl :
agreguj_pwe(pv, 'powiat_szkoly', warPop_pol) %>%
mutate(dg_prz_uf = srednia - 1.96 * bs, gg_prz_uf = srednia + 1.96 * bs)
## Błąd losowania obserwacji obliczany na podstawie wariancji populacji
## Source: local data frame [1 x 13]
## Groups: powiat_szkoly [1]
##
## powiat_szkoly nr_pv min q1 mediana q3 max
## (chr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
## 1 oławski 8 50.04411 90.95209 101.3147 111.2323 140.5805
## Variables not shown: srednia (dbl), n (dbl), var (dbl), bs (dbl),
## dg_prz_uf (dbl), gg_prz_uf (dbl)