knitr::opts_chunk$set(echo = TRUE) library(tidyverse) library(readxl) #library(readMSMT)
Účel balíčku readMSMT je poskytnout nástroj zjednodušující práci s daty z výkazů sbíraných MŠMT. Jelikož data vyžádatelná občanem mohou nabývat podoby až několika set excelových tabulek, readMSMT vytváří prostředí, které nevyžaduje zásadní úpravy v původních datech a na vyžádání vrací proměnné z let a výkazů vybraných uživatelem v přehledné podobě. Účel balíčku je následující:
Balíček readMSMT operuje na základě balíčků dplyr a readxl. Funkce využívají syntax a funkce z tidyverse, ale lze s nimi pracovat i bez znalosti těchto balíčků.
Začněte instalací balíčku:
devtools::install_github("jmunich/readMSMT")
A pokračujte jeho spuštěním:
library(readMSMT)
První krok je získání samotných dat, která v době napsání balíčku nejsou dostupná online. Data lze získat buď přátelským kontaktování MŠMT, nebo formálně přes žádost podle zákona č. 106/1999 Sb., O svobodném přístupu k informacím (vzor žádosti by měl být snadno dohledatelný). Data by měla být zorganizována podle níže popsaného kódování. Po získání stačí data uložit do jedné složky.
Data MŠMT jsou sbírána skrze výkazy vyplňované řediteli škol. Data z jednotlivých výkazů za každý rok jsou často rozdělená do několika excelových tabulek (sheets). Balíček operuje s názvy těchto tabulek. Názvy tabulek by měly v zálkladní podobě dodržovat následující formát: vXXYYaaa. Každý kód začíná písmenem "v". XX reprezentuje číslo výkazu a YY rok. Balíček obsahuje funkci, která vrací přehled výkazů s popisy kódů. Pro přepnutí místního locale do UTF-8 encoding (pro práci se speciálními symboly v Českém jazyce, jako je 'Š') můžete využít funkci set_cz():
set_cz() guide <- form_codes() ## set_cz lze využít i přímo ve form_codes(cz = TRUE) print(guide)
Mezi hodnotami kod_simple lze najít výše popsané hodnoty vXX pro další vyhledávání.
Pod znaky aaa bývá specifický podkód tabulky. Dělení na tabulky s podkódy ale není napříč lety konzistentní. Například data z výkazu M-03 za rok 2019 mohou být rozdělena do tabulek se jmény v0319a, v0319b, v0319c, zatímco v předchozím roce byla dostupná pouze v tabulkách v0318a a v 0318b.
Jednotlivé tabulky poskytuje MŠMT buď ve formátu .xls nebo .xlsx. Z toho důvodu readMSMT využívá funkci read_excel() z balíčku readxl. Opakované pročítání velkého počtu excelových tabulek ve snaze najít hledané proměnné může být výpočetně zdlouhavé. Proto doporučujeme jednorázové vytvoření mapy složek s daty, která shrne výskyty proměnných v jednotlivých dokumentech a umožní efektivnější načítání dat. Funkce map_folders() takové shrnutí vytváří. Stačí ji spustit jednou při prvním použití balíčku a následně jen při provádění jakýchkoliv změn struktury složky s daty nebo obsahu datových souborů.
Funkce map_folders() vytvoří soubor MSMT_data_map.RDATA, který bude uložen v pracovním direktoriáři k načtení při dalším využtí dat. Vytvoření souboru může zabrat nějaký čas. Když se program dostane k pročítání jednotlivých souborů, začne svůj pokrok zobrazovat v konzoli. Existuje několi způsobů, jak lze mapu vytvořit. Vytvoříte-li mapu s uložením, stačí ji vytvořit pouze jednou (a poté znovu až při přidání nových souborů do složky). Ve funkci lze specifikovat, kde se data nachází (location), zda (a kam) má být mapa uložena (save_map) a zda má být navrácen objekt s mapou (return_map). Následují příklady využití funkce.
Pro vytvoření mapy, je-li složka s daty podsložkou pracovního direktoriáře:
map_folders()
Pro vytvoření mapy, je-li složka s daty podsložkou jiného direktoriáře
map_folders(location = "E:/EDU/Data/data/MSMT/") ## Vložte vlastní adresu
Pro vytvoření mapy konkrétní složky, její uložení v konkrétní složce a vytvoření objektu my_map s mapou
my_map <- map_folders(location = "E:/EDU/Data/data/MSMT/", save_map = "E:/EDU/Data/", return_map = TRUE)
Mapu lze kdykoliv vytvořit i jako objekt bez ukládání nebo přepisování souboru
my_map <- map_folders(save_map = FALSE, return_map = TRUE)
Po uložení lze objekt s mapou kdykoliv načíst, buď za použití plné adresy...
my_map <- readRDS("C:/EDU/Data/MSMT_data_map.RDATA")
...nebo, je-li soubor v pracovním direktoriáři, názvem souboru:
my_map <- readRDS("MSMT_data_map.RDATA")
Mapa dat obsahuje tři objekty. První je tabulka meta_data, která shrnuje lokace relevantních souborů, název tabulky a jeho verzi v lowercase (sheet_name a sheet), kód výkazu (form), rok (year) a počet výskytů tabulky v datech pro případ duplikátů (occurrences).
my_map$meta_data
Další dva objekty varlist a varlist_lc obsahují listy s názvy proměnných v jednotlivých tabulkách. Objekt varlist obsahuje původní názvy proměnných, objekt varlist_lc obsahuje názvy transformované do lowercase, pro případ rozdílů mezi tabulkami.
## Prvních dvacet proměnných první tabulky head(my_map$varlist[[1]], 20)
Když je mapa vytvořena nebo načtena, funkce balíčku s její pomocí identifikuje soubory obsahující vyhledávané proměnné a následně hodnoty těchto proměnných načte do nového objektu. I za využití mapy může vyhledávání trvat několik okamžiků.
Název proměnné lze vyčíst z tabulek ve pdf souborech výkazů. Struktura názvu je r číslo-řádku číslo-sloupce. Například v tabulce I z výkazu M-3 by celkový počet (sloupec 2) žáků kteří ukončili povinnou školní docházku (řádek 0101) byl pro každou školu uveden pod proměnnou r01012.
knitr::include_graphics("Tabulka.png")
Vypisovat jména proměnných pro velké tabulky je mimořádná ztráta času. Balíček proto obsahuje funkci get_table_names, která rekonstruuje názvy proměnných v tabulce do snadno manipulovatelné matice. Funkce obsahuje parametry table_ind, který obsahuje indikátor tabulky (zpravidla první dvě čísla u kódu řádku), row_inds pro rozsah hodnot řádků a col_inds pro žádaný rozsah sloupců.
Některé tabulky obsahují proměnné vložené v pozdějších letech. Aby se nenarušila původní struktura názvů proměnných, mívají takové koncovku "a", "b" etc. Tyto speciální indexy lze manuálně doplnit parametry extra_row a extra_col.
Pro rekonstrukci výše uvedené tabulky lze použít:
variable_names <- get_table_names(table_ind = "01", # Index tabulky row_inds = c(1,4:11), # Uvedené řádky (v tabulce chybí 2 a 3) col_inds = 2:5, # Sloupce extra_row = "07a") # Speciální řádek 7a print(variable_names)
Chceme-li pak získat například názvy všech proměnných s celkovými počtem žáků z běžných tříd, stačí zvolit správný řádek vzniklé matice:
my_varnames <- variable_names[,1] print(my_varnames)
Máme-li názvy proměnných, můžeme využít mapu souborů ke zjištění jejich dostupnosti napříč lety. Funkce get_variable_availability() přijímá vektor vyžádaných proměnných a výkazů. Vrací list s tibbles obsahujícími vyžádané proměnné v daných výkazech a jejich dostupnost. Jelikož stejný název proměnné se může objevit mezi formuláři, je potřeba specifikovat, kde mají být vyhledány.
available <- get_variable_availability(variables = my_varnames, map = my_map, # Je-li mapa v pracovním direktoriáři, # není třeba ji uvádět forms = c("v03")) # Výkaz M-3
Funkce navrátí tibble s dostupností (je-li specifikován vektor výkazů, vrátí tibble pro každý výkaz):
available$tables$v03
Funkce dostupnost rovněž vyobrazuje pro snadnější kontrolu. Například u speciální proměnné r0107a2 lze vidět, že byla přidána až v roce 2016:
available$plots$v03
Když je jasno, jaké proměnné jsou třeba, lze použít funkci get_variables() k jejich získání. Funkce využije existující mapu, vybere soubory obsahující žádoucí proměnné a pro každý rok vrátí tabulku vyžádaných dat. Je-li v souboru pro jeden rok více relevantních souborů (pravděpodobně duplikáty), funkce vybere první soubor a vydá upozornění. Chybí-li nějaké proměnná v daném roce, vrátí se tabulka bez této proměnné.
tibble_list <- get_variables(variables = my_varnames, map = my_map, # Je-li mapa v pracovním direktoriáři, # není třeba ji uvádět joint = c("izo","red_izo", "vusc"), # Názvy dalších proměnných, # například identifikátorů. Obsahuje # defaultní hodnoty forms = "v03", # Vektor (nebo samostatný character) žádaných výkazů years = c("12","13","14","15","16","17","18") # Vektor obsahující žádoucí roky. # Prázdný argument prohledá # všechny dostupné roky )
Funkce vrací list se dvěma objekty. První jsou průvodná meta_data pro využité soubory. Druhý objekt (variables) obsahuje tabulky se získanými daty. Ke každé tabulce je přidána proměnná s příslušným rokem. Příklad tabulek za roky 2012 a 2013:
head(tibble_list$variables$v0312a_1) head(tibble_list$variables$v0313a_1)
Takto vzniklý list lze například za využití balíčku dplyr propojit do jedné tabulky v long formátu. Toto je možné v případě, že všechny proměnné v rámc rái roku byly uloženy ve stejném souboru.
Poznámka: Pokud by se za každý rok vrátilo více tabulek (například pokud používám proměnné z tabulky I a z tabulky IX výkazu M-3), musím nejříve pro každý rok propojit tyto tabulky přes identifikátory škol, které by měly být v rámci let konzistentní, například funkcí dplyr::left_join(x, y, by = "izo").
long_data <- dplyr::bind_rows(tibble_list$variables) head(long_data) unique(long_data$year)
S daty lze pak dělat psí kusy. Funkce starts_with() a ends_with() z tidyverse (popř. matches() a regex) jsou obzvlášť šikovné, protože se s nimi dají indexovat celé řádky nebo sloupce výkazových tabulek. Například se můžeme podívat na počet všech žáků, kteří ukončili školní docházku v sedmém ročníku ZŠ mezi regiony v čase.
tab_1 <- as.vector(variable_names) tibble_list_1 <- get_variables(variables = tab_1, joint = "vusc", forms = "v03") long_data_1 <- dplyr::bind_rows(tibble_list_1$variables) long_data_1 %>% mutate(vusc = substr(vusc, 1, 4)) %>% group_by(year, vusc) %>% summarise_all(sum) %>% select(vusc, starts_with("r0104")) %>% # Vybrat čtvrtý řádek select(vusc, matches("[a-z0-9]+2$|[a-z0-9]+4$")) %>% # Vybrat druhý a čtvrtý sloupec ungroup() %>% mutate(left_7 = rowSums(.[3:4])) %>% ggplot(aes(x = ordered(year), y = left_7, color = vusc, group = vusc)) + geom_point(show.legend = FALSE) + geom_path(show.legend = FALSE)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.