Kde vzít otevřená data a jak s nimi pracovat efektivně

Vybraná témata analýzy dat FF UK

Petr Bouchal, 31. říjen 2024

Cíle

  • zorientovat se ve zdrojích dat
  • pochopit, jak je dostáváme do R: balíky {czso} a {statnipokladna}
  • naučit se s nimi pracovat na příkladu statistik a fiskálních dat
  • naučit se pracovat s většími daty mimo paměť (Parquet/Arrow)

Veřejná data: proč v R

  • strojově čitelná data pro analýzu rovnou v R
  • reprodukovatelný postup
  • automatizace
  • update při každém spuštění

Ale pozor:

  • online zdroj se může změnit/zmizet
  • tedy: třeba zaznamenávat, zachytit i data
  • reprodukovatelnost vs. automatizace

Veřejná data: jak

  • API (služba, která vydává data na požádání)
  • soubory
  • výjimečně specifické služby (geocoding)

R (balíček) jako rozhraní pro přístup k API nebo datovým sadám

Veřejná data: co

  • jaké informace: katalog + datové sady

  • jaká data: data + číselníky

  • obsah: typicky statistiky a standardizované datové sady

  • od koho: statistické úřady, mezinárodní organizace, státy obecně, NGOs

  • forma: tabulky v long formátu

Logika načítání dat z API nebo souborů

  1. Balík postytuje přístup ke katalogu. Tam hledej požadovanou položku, zachyť její ID
  2. Načti data podle ID, dostaneš data.frame. Balík se stará o to, odkud se data berou
  3. U některých zdrojů lze rovnou filtrovat nebo poslat SQL dotaz
  4. Některé zdroje/balíky umožňují vyžádat rovnou “rozklíčované” číselníky
  5. Podle potřeby se (ne)starej o to, kde se skladují mezivýstupy
  6. Stáhni a napoj číselníky

Míra kontroly dle potřeby

flowchart LR
    A[Table ID] -->|"sp_get_table()"| B(Data frame)
    A[Table ID] -->|"sp_get_table(dest_dir = '~/data')"| M(ZIP file)
    A[Table ID] -->|"sp_get_table(dest_dir = 'data')"| N(ZIP file)
    M --> O(CSV file)
    N --> P(CSV file)
    O --> B
    P --> B
    A --> |"sp_get_dataset_url()"| C(URL)
    C --> |"sp_get_dataset(url)"| H(ZIP file)
    C --> |"sp_get_dataset(url, dest_dir = 'data')"| F(ZIP file)
    C --> |"sp_get_dataset(url, dest_dir = '~/data')"| I(ZIP file)
    H --> |"sp_get_table_file()"| X(cesta k CSV)
    F --> |"sp_get_table_file()"| Y(cesta k CSV)
    I --> |"sp_get_table_file()"| Z(cesta k CSV)
    X --> |"sp_load_table()"| B
    Y --> |"sp_load_table()"| B
    Z --> |"sp_load_table()"| B

Příklad: katalog ČSÚ

library(czso)
czso_get_catalogue() |> head() |> gt::gt()
dataset_iri dataset_id title provider description spatial modified page periodicity start end keywords_all
https://vdb.czso.cz/pll/eweb/lkod_ld.datova_sada?nazev=Bilance_meziokresni_vyjizdky_do_zamestnani_podle_vysledku_scitani_2011 170242 Bilance meziokresní vyjížďky do zaměstnání podle výsledků sčítání 2011 Český statistický úřad Datová sada obsahuje statistické údaje o počtu vyjíždějících osob za jednotlivé okresy a Hlavní město Prahu, jejichž pracoviště bylo v rozhodný okamžik sčítání (26. 3. 2011) v jiné obci než byla obec obvyklého pobytu. Jedná se tedy o vyjížďku mezi okresy České republiky, včetně vyjížďky do Hlavního města Prahy a do zahraničí. https://linked.cuzk.cz/resource/ruian/ST/1 2024-06-28 https://csu.gov.cz/docs/107516/f4224f10-d886-776f-4913-99fff1d363e5/170242-17dds.htm NEVER 2011-03-26 2011-03-26 vyjížďka, vyjížďka do zaměstnání, Sčítání lidu domů a bytů
https://vdb.czso.cz/pll/eweb/lkod_ld.datova_sada?nazev=Cizinci_podle_statniho_obcanstvi_veku_a_pohlavi_rok_2004 290038r05 Cizinci podle státního občanství, věku a pohlaví - rok 2004 Český statistický úřad Datová sada obsahuje statistické údaje o počtech cizinců (bez azylantů, s pobytem přechodným, dlouhodobým, pobytem trvalým a dlouhodobým vízem) v České republice, a v členění podle pohlaví, pětiletých věkových skupin a státního občanství cizince. Údaje jsou k dispozici za okresy České republiky. Připraveny jsou rovněž úhrny za Českou republiku, všechna státní občanství, pohlaví i věkové skupiny. https://linked.cuzk.cz/resource/ruian/ST/1 2024-06-28 https://csu.gov.cz/docs/107508/4711685d-93fa-8eea-ff51-f5c5097a34b5/290038-22dds.htm R/P1Y 2004-01-01 2004-12-31 Cizinec, státní občanství
https://vdb.czso.cz/pll/eweb/lkod_ld.datova_sada?nazev=Cizinci_podle_statniho_obcanstvi_veku_a_pohlavi_rok_2005 290038r06 Cizinci podle státního občanství, věku a pohlaví - rok 2005 Český statistický úřad Datová sada obsahuje statistické údaje o počtech cizinců (bez azylantů, s pobytem přechodným, dlouhodobým, pobytem trvalým a dlouhodobým vízem) v České republice, a v členění podle pohlaví, pětiletých věkových skupin a státního občanství cizince. Údaje jsou k dispozici za okresy České republiky. Připraveny jsou rovněž úhrny za Českou republiku, všechna státní občanství, pohlaví i věkové skupiny. https://linked.cuzk.cz/resource/ruian/ST/1 2024-06-28 https://csu.gov.cz/docs/107508/4711685d-93fa-8eea-ff51-f5c5097a34b5/290038-22dds.htm R/P1Y 2005-01-01 2005-12-31 Cizinec, státní občanství
https://vdb.czso.cz/pll/eweb/lkod_ld.datova_sada?nazev=Cizinci_podle_statniho_obcanstvi_veku_a_pohlavi_rok_2006 290038r07 Cizinci podle státního občanství, věku a pohlaví - rok 2006 Český statistický úřad Datová sada obsahuje statistické údaje o počtech cizinců (bez azylantů, s pobytem přechodným, dlouhodobým, pobytem trvalým a dlouhodobým vízem) v České republice, a v členění podle pohlaví, pětiletých věkových skupin a státního občanství cizince. Údaje jsou k dispozici za okresy České republiky. Připraveny jsou rovněž úhrny za Českou republiku, všechna státní občanství, pohlaví i věkové skupiny. https://linked.cuzk.cz/resource/ruian/ST/1 2024-06-28 https://csu.gov.cz/docs/107508/4711685d-93fa-8eea-ff51-f5c5097a34b5/290038-22dds.htm R/P1Y 2006-01-01 2006-12-31 Cizinec, státní občanství
https://vdb.czso.cz/pll/eweb/lkod_ld.datova_sada?nazev=Cizinci_podle_statniho_obcanstvi_veku_a_pohlavi_rok_2007 290038r08 Cizinci podle státního občanství, věku a pohlaví - rok 2007 Český statistický úřad Datová sada obsahuje statistické údaje o počtech cizinců (bez azylantů, s pobytem přechodným, dlouhodobým, pobytem trvalým a dlouhodobým vízem) v České republice, a v členění podle pohlaví, pětiletých věkových skupin a státního občanství cizince. Údaje jsou k dispozici za okresy České republiky. Připraveny jsou rovněž úhrny za Českou republiku, všechna státní občanství, pohlaví i věkové skupiny. https://linked.cuzk.cz/resource/ruian/ST/1 2024-06-28 https://csu.gov.cz/docs/107508/4711685d-93fa-8eea-ff51-f5c5097a34b5/290038-22dds.htm R/P1Y 2007-01-01 2007-12-31 Cizinec, státní občanství
https://vdb.czso.cz/pll/eweb/lkod_ld.datova_sada?nazev=Cizinci_podle_statniho_obcanstvi_veku_a_pohlavi_rok_2008 290038r09 Cizinci podle státního občanství, věku a pohlaví - rok 2008 Český statistický úřad Datová sada obsahuje statistické údaje o počtech cizinců (bez azylantů, s pobytem přechodným, dlouhodobým, pobytem trvalým a dlouhodobým vízem) v České republice, a v členění podle pohlaví, pětiletých věkových skupin a státního občanství cizince. Údaje jsou k dispozici za okresy České republiky. Připraveny jsou rovněž úhrny za Českou republiku, všechna státní občanství, pohlaví i věkové skupiny. https://linked.cuzk.cz/resource/ruian/ST/1 2024-06-28 https://csu.gov.cz/docs/107508/4711685d-93fa-8eea-ff51-f5c5097a34b5/290038-22dds.htm R/P1Y 2008-01-01 2008-12-31 Cizinec, státní občanství

Přehledněji

czso_get_catalogue() |> head() |> select(title, dataset_id) |> gt()
title dataset_id
Bilance meziokresní vyjížďky do zaměstnání podle výsledků sčítání 2011 170242
Cizinci podle státního občanství, věku a pohlaví - rok 2004 290038r05
Cizinci podle státního občanství, věku a pohlaví - rok 2005 290038r06
Cizinci podle státního občanství, věku a pohlaví - rok 2006 290038r07
Cizinci podle státního občanství, věku a pohlaví - rok 2007 290038r08
Cizinci podle státního občanství, věku a pohlaví - rok 2008 290038r09

Prohledáme katalog

czsokat <- czso_get_catalogue()
czso_filter_catalogue(czsokat, c("obce", "obyvatel", "2023")) |> 
  select(title, dataset_id, description) |> t()
            [,1]                                                                                                                                                                                                                                                                                                                                                                                   
title       "Pohyb obyvatel - rok 2023"                                                                                                                                                                                                                                                                                                                                                            
dataset_id  "130141r24"                                                                                                                                                                                                                                                                                                                                                                            
description "Datová sada obsahuje statistické údaje o přirozeném i mechanickém pohybu obyvatel, tedy o počtu živě narozených, zemřelých, přistěhovalých a vystěhovalých za obce, správní obvody obcí s rozšířenou působností (SO ORP), okresy, kraje i republiku. Doplněny jsou údaje o přirozeném přírůstku obyvatel, přírůstku stěhováním, celkovém přírůstku, a také o středním stavu obyvatel."

Načteme si data ČSÚ

czso_get_table("130141r24")
# A tibble: 85,306 × 11
   idhod      hodnota vuk     vuk_text stapro_kod vuzemi_cis vuzemi_kod   rok
   <chr>        <dbl> <chr>   <chr>    <chr>      <chr>      <chr>      <int>
 1 1286495326       5 DEM0008 Zemřelí  5393       43         552674      2023
 2 1286494798       2 DEM0008 Zemřelí  5393       43         555835      2023
 3 1286494804       0 DEM0008 Zemřelí  5393       43         558010      2023
 4 1286494806       5 DEM0008 Zemřelí  5393       43         550922      2023
 5 1286495335       3 DEM0008 Zemřelí  5393       43         589128      2023
 6 1286495398      13 DEM0008 Zemřelí  5393       43         597988      2023
 7 1286495010      24 DEM0008 Zemřelí  5393       43         500526      2023
 8 1286495018       2 DEM0008 Zemřelí  5393       43         561282      2023
 9 1286495027       2 DEM0008 Zemřelí  5393       43         560006      2023
10 1286497476       2 DEM0008 Zemřelí  5393       43         551597      2023
# ℹ 85,296 more rows
# ℹ 3 more variables: casref_od <dttm>, casref_do <dttm>, vuzemi_txt <chr>

Načteme číselník

czso_get_codelist(43)
# A tibble: 6,258 × 15
   KODJAZ AKRCIS KODCIS CHODNOTA ZKRTEXT     TEXT  ADMPLOD    ADMNEPO    OBEC_UL
   <chr>  <chr>  <chr>  <chr>    <chr>       <chr> <date>     <date>     <chr>  
 1 CS     CISOB  43     500011   Želechovic… Žele… 2009-01-01 9999-09-09 ano    
 2 CS     CISOB  43     500020   Petrov nad… Petr… 2010-01-01 9999-09-09 ne     
 3 CS     CISOB  43     500046   Libhošť     Libh… 2011-01-01 9999-09-09 ne     
 4 CS     CISOB  43     500062   Krhová      Krho… 2013-01-01 9999-09-09 ano    
 5 CS     CISOB  43     500071   Poličná     Poli… 2013-01-01 9999-09-09 ne     
 6 CS     CISOB  43     500101   Bražec      Braž… 2016-01-01 9999-09-09 ne     
 7 CS     CISOB  43     500127   Doupovské … Doup… 2016-01-01 9999-09-09 ne     
 8 CS     CISOB  43     500135   Kozlov      Kozl… 2016-01-01 9999-09-09 ne     
 9 CS     CISOB  43     500151   Luboměř po… Lubo… 2016-01-01 9999-09-09 ne     
10 CS     CISOB  43     500160   Město Liba… Měst… 2016-01-01 9999-09-09 ano    
# ℹ 6,248 more rows
# ℹ 6 more variables: OB_UL_COR <chr>, SM_ROZSAH <chr>, SM_TYP <chr>,
#   KODOBCE_H <chr>, DOMIN_COBC <chr>, PORCOBEC_O <chr>

Číselník vazeb

czso_get_catalogue(c("vazba", "orp", "obec")) |> select(title, dataset_id)
# A tibble: 3 × 2
  title                                                       dataset_id
  <chr>                                                       <chr>     
1 Vazba mezi číselníky ČSÚ: CISOB (kód 43) - CISORP (kód 65)  cis43vaz65
2 Vazba mezi číselníky ČSÚ: CISORP (kód 65) - CISOB (kód 43)  cis65vaz43
3 Vazba mezi číselníky ČSÚ: CISORP (kód 65) - CISPOU (kód 61) cis65vaz61
czso_get_codelist("cis43vaz65")
# A tibble: 206 × 10
   kodjaz typvaz akrcis1 kodcis1 chodnota1 text1 akrcis2 kodcis2 chodnota2 text2
   <chr>  <chr>  <chr>   <chr>   <chr>     <chr> <chr>   <chr>   <chr>     <chr>
 1 CS     Edita… CISOB   43      500496    Olom… CISORP  65      7107      Olom…
 2 CS     Edita… CISOB   43      503444    Lito… CISORP  65      7105      Lito…
 3 CS     Edita… CISOB   43      505188    Šter… CISORP  65      7110      Šter…
 4 CS     Edita… CISOB   43      505587    Unič… CISORP  65      7112      Unič…
 5 CS     Edita… CISOB   43      505927    Opava CISORP  65      8117      Opava
 6 CS     Edita… CISOB   43      507016    Hluč… CISORP  65      8109      Hluč…
 7 CS     Edita… CISOB   43      507580    Krav… CISORP  65      8113      Krav…
 8 CS     Edita… CISOB   43      511021    Vítk… CISORP  65      8122      Vítk…
 9 CS     Edita… CISOB   43      511382    Přer… CISORP  65      7109      Přer…
10 CS     Edita… CISOB   43      513750    Hran… CISORP  65      7101      Hran…
# ℹ 196 more rows

Bonus: struktura území

czso_get_catalogue(search_terms = c("struktura", "území")) |> select(title, dataset_id)
# A tibble: 1 × 2
  title                           dataset_id        
  <chr>                           <chr>             
1 Struktura území České republiky struktura_uzemi_cr
# A tibble: 3 × 31
  platnost_datum obec_text obec_kod obec_typ pou_text         pou_csu_cis61_kod
  <chr>          <chr>     <chr>    <chr>    <chr>            <chr>            
1 2024-01-01     Abertamy  554979   Město    Ostrov           41061            
2 2024-01-01     Adamov    581291   Město    Adamov           62011            
3 2024-01-01     Adamov    535826   Obec     České Budějovice 31021            
# ℹ 25 more variables: pou_ruian_kod <chr>, pou_sidlo_obec_kod <chr>,
#   orp_text <chr>, orp_csu_cis65_kod <chr>, orp_ruian_kod <chr>, …
czso_get_table("struktura_uzemi_cr")

Existuje i verze se změnami v čase, ale v Excelu, viz https://csu.gov.cz/i_zakladni_uzemni_ciselniky_na_uzemi_cr_a_klasifikace_cz_nuts.

Data ČSÚ o území

ČSÚ taky kompiluje databáze základních informací o území po letech, za kraje a obce. Struktura je složitější než běžná otevřená data ČSÚ, je ale konzistentní a může se to hodit.

Všechna metadata ČSÚ

lze hledat v tzv. databázi metainformací

https://apl2.czso.cz/iSMS/

Otázka

Jak se liší příjmy obcí s RP z daně za nemovitostí v jednotlivých krajích?

Státní pokladna: katalog

library(statnipokladna)
statnipokladna::sp_datasets
# A tibble: 9 × 2
  id     name                                                    
  <chr>  <chr>                                                   
1 finm   FIN 2-12 M - Plnění rozpočtu MŘO                        
2 finsf  FIN 2-04 U - Plnění rozpočtu SF                         
3 finu   FIN 2-04 U - Plnění rozpočtu KAP, OSS a SF (2010 - 2014)
4 misris FIN 1-12 OSS - Plnění rozpočtu KAP a OSS                
5 pozvk  Přehled o změnách vlastního kapitálu                    
6 ppt    Přehled peněžních toků                                  
7 pril   Příloha                                                 
8 rozv   Rozvaha                                                 
9 vykzz  Výkaz zisků a ztrát                                     
statnipokladna::sp_tables
# A tibble: 19 × 4
   id                                dataset_id czech_name                 note 
   <chr>                             <chr>      <chr>                      <chr>
 1 balance-sheet                     rozv       Rozvaha - první část       <NA> 
 2 balance-sheet-2                   rozv       Rozvaha - druhá část       <NA> 
 3 balance-sheet-city-districts      rozv       Rozvaha městských částí -… only…
 4 balance-sheet-city-districts-2    rozv       Rozvaha městských částí -… only…
 5 budget-central                    misris     Plnění rozpočtu ústředně … post…
 6 budget-central-old                finu       Plnění rozpočtu ústředně … pre-…
 7 budget-central-old-purpose-grants finu       Účelové financování - pos… pre-…
 8 budget-central-old-subsidies      finu       Dotační financování - pos… pre-…
 9 budget-indicators                 misris     Závazné ukazatele státníh… only…
10 budget-local                      finm       Plnění rozpočtu místně ří… <NA> 
11 budget-local-purpose-grants       finm       Účelové financování místn… <NA> 
12 budget-statefunds                 finsf      Plnění rozpočtu státních … post…
13 budget-statefunds-purposegrants   finsf      Plnění rozpočtu státních … post…
14 cash-flow                         ppt        Přehled peněžních toků     <NA> 
15 cash-flow-statefunds              finsf      Plnění rozpočtu státních … post…
16 changes-in-equity                 pozvk      Přehled o změnách vlastní… <NA> 
17 profit-and-loss                   vykzz      Výkaz zisků a ztrát        <NA> 
18 profit-and-loss-city-districts    vykzz      Výkaz zisků a ztrát - měs… only…
19 profit-and-loss-statefunds        finsf      Plnění rozpočtu státních … post…

Načteme rozpočty obcí

rozp_obce <- sp_get_table("budget-local", year = 2023, dest_dir = "data-input/sp")
dim(rozp_obce)
[1] 1305940      16
colnames(rozp_obce)
 [1] "vykaz"           "vtab"            "vykaz_year"      "vykaz_month"    
 [5] "ucjed"           "ico"             "kraj"            "nuts"           
 [9] "polozka_typ"     "paragraf"        "polozka"         "budget_adopted" 
[13] "budget_amended"  "budget_spending" "ZC_FCOPY"        "vykaz_date"     
head(rozp_obce)
# A tibble: 6 × 16
  vykaz vtab   vykaz_year vykaz_month ucjed      ico     kraj  nuts  polozka_typ
  <chr> <chr>  <chr>      <chr>       <chr>      <chr>   <chr> <chr> <chr>      
1 051   000100 2023       12          1000017768 000645… CZ010 CZ01… 2          
2 051   000100 2023       12          1000017768 000645… CZ010 CZ01… 2          
3 051   000100 2023       12          1000017768 000645… CZ010 CZ01… 2          
4 051   000100 2023       12          1000017768 000645… CZ010 CZ01… 2          
5 051   000100 2023       12          1000017768 000645… CZ010 CZ01… 2          
6 051   000100 2023       12          1000017768 000645… CZ010 CZ01… 2          
# ℹ 7 more variables: paragraf <chr>, polozka <chr>, budget_adopted <dbl>,
#   budget_amended <dbl>, budget_spending <dbl>, ZC_FCOPY <chr>,
#   vykaz_date <date>

Jdeme na kód

https://github.com/petrbouchal/ffuk-r-publicdata

https://github.com/petrbouchal/ffuk-r-publicdata/archive/refs/heads/main.zip

Případně

git clone https://github.com/petrbouchal/ffuk-r-publicdata

nebo v R

usethis::create_from_github("petrbouchal/ffuk-r-publicdata")

Potom

source("0_setup.R")

1_explorace.R

Dodatečné úkoly:

  • vyrobte mapu!
  • udělejte totéž pro státy EU

Balíky na veřejná data

  • eurostat (viz i klikací katalog)
  • wbdata: Světová banka
  • oecd: OECD
  • giscoR: oficiální evropská geodata území
  • WDI: část data Světové banky
  • statistické úřady po světě: viz CRAN Task View

Česká data

  • RCzechia, CzechData
  • statnipokladna
  • czso
  • vsezved: rejstříky a seznamy škol
  • hlidacr: data Hlídače státu
  • pragr: geodata o Praze
  • ispv: Informační systém o průměrném výdělku (“Trexima”)

Viz též - https://github.com/kokes/knod - https://github.com/kokes/od

Pomůcky

  • {countrycode}
  • {nuts}
  • {regions}

Co když je dat hodně: práce s daty mimo paměť

Kolik dat je hodně? Co je s tím za problém?

Typicky: miliony řádků

Data se nevejdou do paměti

Dlouho se načítají, ne vždy počítáme se všemi

Odvozené datasety násobí požadavky na paměť

Pomalu se s nimi počítá

Obecné řešení

Výpočetní engines mimo R

Chytřejší skladování dat

Rychlejší nástroje na počítání

Parquet

  • formát skladování dat v souborech optimalizovaný pro analýzu
  • součástí souboru je definice datových typů
  • data organizovaná po sloupcích a úsecích řádků
  • možnost načítat dle potřeby jen části: v prostředí R jen index
  • vhodné pro sdílení dat mezi systémy/jazyky
  • {arrow}: plná polní vs. {nanoparquet}: lightweight ukládání a načítání dat

Arrow

  • formát skladování (parquet/CSV) + výpočetní engine (arrow)
  • balík {arrow} = funkce v R pro ovládání arrow engine
  • výpočty se dějí mimo R s daty mimo paměť
  • možnost explicitně dělit data do více souborů podle skupin
  • balík {purrrow} na out-of-memory kompilaci dat

DuckDB

  • in-process databáze - bez serveru
  • může fungovat jako vrstva mezi R a daty (např. Parquet/arrow)

Rychlost

  • {data.table} => {dtplyr}
  • {duckdb} / {duckplyr}
  • {collapse} / {fastverse} => {fastplyr}
  • {furrr}: paralelizace po skupinách

Zdroje

Otázky? Tipy? Nápady?