Skip to content

Pobieranie oszacowań PV uczniów i obliczanie PWE

Mateusz Żółtak edited this page Sep 28, 2015 · 4 revisions

Wstęp

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.

Przydatne linki:

Funkcje, z których będziemy korzystac:

  • 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)

Czynności wstępne

Jak zwykle na początku zaczniemy od załadowania pakietu ZPD i nawiązania połączenia z bazą IBE:

library(ZPD)
src = polacz()

Wyszukiwanie właściwego skalowania

  • 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 PV

  • 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")

Pobieranie informacji kontekstowych

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"

Obliczanie PWE z PV

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().

Zdefiniowanie populacji odniesienia

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

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)