install.packages("countrycode")
install.packages("eurostat")
library(knitr)
library(eurostat)
library(countrycode)
library(dplyr)
library(tidyr)
library(ggplot2)
library(tmap)

1 Eurostat - Europejski Urząd Statystyczny

Eurostat - Europejski Urząd Statystyczny (ang. European Statistical Office) zajmuje się dostarczaniem wysokiej jakości danych statystycznych, które umożliwiają porównanie między krajami i regionami na obszarze Europy.

WWW: http://ec.europa.eu/eurostat/

Eurostat udostępnia dane w 9 grupach tematycznych:

  • General and regional statistics
  • Economy and finance
  • Population and social conditions
  • Industry, trade and services
  • Agriculture and fisheries
  • External trade
  • Transport
  • Environment and energy
  • Science and technology

Struktura danych Eurostat jest następująca: tabele (table) >> zbiory danych (dataset) >> katalogi (folder).

  • tabele - dostarczają najważniejszych danych Eurostatu w przyjazny dla użytkownika sposób. Wszystkie dane są prezentowane w prostych tabelach o dwóch lub trzech wymiarach.
  • zbiory danych - zawierają pełen zakres danych udostępnianych publicznie w Eurostacie. Są one prezentowane w tabelach wielowymiarowych z różnymi cechami do wyboru i są eksportowane do różnych formatów.

Dostępność danych można przeglądać na stronie Eurostatu w zakładce Data - Database. Na poniższym rysunku czerwonym obramowaniem zaznaczono przykładowy zbiór danych - Unemployment rate by NUTS 2 regions (tgs00010) - tabelę zawierającą dane dotyczące poziomu bezrobocia w jednostkach administracyjnych NUTS 2 (w Polsce są to województwa). Tabela ma kod tgs00010 (kod ten będzie potrzebny w R do pobrania danych).

2 Eurostat a R.

Dane udostępniane przez Eurostat mogą być pobierane bezpośrednio ze strony internetowej. Pakiet eurostat udostępnia narzędzia umożliwiające dostęp do bazy danych Eurostatu i pobieranie danych bezpośrednio do R.

install.packages("eurostat")

Więcej informacji na temat pakietu eurostat znajduje się na poniższych stronach:

Pakiet eurostat zawiera kilka przydatnych funkcji:

  • get_eurostat_toc() pobiera tabelę zawierierającą spis udostępnianych przez Eurostat zestawów danych.
  • search_eurostat() przeszukuje spis tabel pod względem podanej frazy, np. wyszuka wszystkie zbiory danych zawierające słowo unemployment.
  • get_eurostat() służy do pobierania danych z Eurostatu.
  • get_eurostat_geospatial() służy do pobrania danych przestrzennych (np. granice jednostek NUTS 2).

2.1 Przeszukiwanie danych

Funkcja get_eurostat_toc() pobiera tabelę zawierierającą spis udostępnianych przez Eurostat zestawów danych.

library(eurostat)
toc <- get_eurostat_toc()
head(toc)
## # A tibble: 6 x 8
##   title code  type  `last update of… `last table str… `data start` `data end`
##   <chr> <chr> <chr> <chr>            <chr>            <chr>        <chr>     
## 1 Data… data  fold… <NA>             <NA>             <NA>         <NA>      
## 2 Gene… gene… fold… <NA>             <NA>             <NA>         <NA>      
## 3 Euro… euro… fold… <NA>             <NA>             <NA>         <NA>      
## 4 Busi… ei_b… fold… <NA>             <NA>             <NA>         <NA>      
## 5 Cons… ei_b… fold… <NA>             <NA>             <NA>         <NA>      
## 6 Cons… ei_b… data… 29.10.2020       29.10.2020       1980M01      2020M10   
## # … with 1 more variable: values <chr>

Funkcja search_eurostat() przeszukuje spis tabel pod względem podanej frazy, np. wyszuka wszystkie zbiory danych zawierające słowo unemployment. Argument type pozwala określić, czy w wyniku mają zostać zwrócone tabele (type="table") czy też bazy danych (type="database").

W poniższym przykładzie szukamy danych o poziomie bezrobocia (ang. unemployment rate) przechowywanych w tabelach. Do pobrania wybranego zestawu danych powinno używać się wartości z kolumny code.

szukane_dane <- search_eurostat(pattern = "Unemployment rate", type = "table")
head(szukane_dane)
## # A tibble: 6 x 8
##   title code  type  `last update of… `last table str… `data start` `data end`
##   <chr> <chr> <chr> <chr>            <chr>            <chr>        <chr>     
## 1 Unem… tgs0… table 11.11.2020       11.11.2020       2008         2019      
## 2 Unem… tps0… table 11.11.2020       11.11.2020       2008         2019      
## 3 Unem… tgs0… table 11.11.2020       11.11.2020       2008         2019      
## 4 Unem… tips… table 07.10.2020       07.10.2020       1995         2019      
## 5 Unem… tips… table 07.10.2020       07.10.2020       1995         2019      
## 6 Unem… tips… table 11.11.2020       11.11.2020       1995Q1       2020Q3    
## # … with 1 more variable: values <chr>
names(szukane_dane)
## [1] "title"                       "code"                       
## [3] "type"                        "last update of data"        
## [5] "last table structure change" "data start"                 
## [7] "data end"                    "values"

Funkcja search_eurostat() zwraca tabelę składającą się z 8 kolumn:

  • title - nazwa zestawu danych
  • code - kod zestawu danych, używany przez funkcję get_eurostat() do pobrania wybranego zestawu danych.
  • type - tabela (ang. table), zestaw danych (ang. dataset), katalog danych (ang. folder)
  • last.update.of.data - data ostatniej aktualizacji danych
  • last.table.structure.change
  • data.start, data.endDates - zakres dat, dla których dostępne są dane.

Kody dla zestawu danych można wyszukiwać również z bazy danych Eurostatu. Baza danych Eurostatu podaje kody w drzewie danych po każdym zbiorze danych w nawiasie.

2.2 Pobieranie danych

Do pobierania danych z Eurostatu służy funkcja get_eurostat().

get_eurostat(id, time_format = "date", filters = "none", type = "code",select_time = NULL, cache = TRUE, update_cache = FALSE,
  cache_dir = NULL, compress_file = TRUE, stringsAsFactors = default.stringsAsFactors(), keepFlags = FALSE, ...)

Argumenty funkcji:

  • id - kod zestawu danych/tabeli (zwracany m.in przez funkcję search_eurostat() w kolumnie code.
  • time_format - format do którego ma być przekonwertowana data w tabeli wynikowej:
    • date (domyślnie) - data początkowego okresu dla którego dostępne są dane zwracana w formacie Date.
    • date_last - data końcowego okresu dla którego dostępne są dane zwracana w formacie Date.
    • num (zalecane do analiz) - data zwrócona w formacie numerycznym
    • raw - brak konwersji.
  • filters - domyślnie zwracana jest cała tabela. Argument ten przyjmuje listę definiującą zakres danych jakie mają być zwrócone.
  • type - typ zmiennych: kody lub etykiety. Istnieje możliwość przekształcenia w późniejszym etapie pobranych danych lub wybranej kolumny na etykiety używając funkcji label_eurostat()
  • select time - częśtotliwość czasowa danych (np. dane roczne, miesięczne itd.)

Poniższy przykład pokazuje w jaki sposób pobrać dane dotyczące poziomu bezrobocia na poziomie jednostek NUTS2 (tabela “tgs00010”) dla roku 2010, bez podziału na płeć (sex=“T”). Argument filters może być wykorzystany, w sytuacji gdy znamy strukturę pobieranej tabeli (musimy znać nazwy kolumn i przyjmowane przez nie wartości). Możemy takż pobrać całą tabelę, a następnie używając narzędzi zarządzania danymi (np. z pakietu dplyr) wyselekcjonować odpowiednie dane.

dat <- get_eurostat("tgs00010", time_format = "num", type = "code", filters = list(time=2010, sex="T"))
head(dat)
## # A tibble: 6 x 6
##   unit  age    sex   geo    time values
##   <chr> <chr>  <chr> <chr> <dbl>  <dbl>
## 1 PC    Y_GE15 T     AT11   2010    4  
## 2 PC    Y_GE15 T     AT12   2010    3.9
## 3 PC    Y_GE15 T     AT13   2010    8.3
## 4 PC    Y_GE15 T     AT21   2010    4.3
## 5 PC    Y_GE15 T     AT22   2010    4.5
## 6 PC    Y_GE15 T     AT31   2010    3.9

Poniżej przedstawiono ten sam zbiór danych, ale zamiast kodów wynikowa tabela zawiera pełne etykiety.

datl <- get_eurostat("tgs00010", time_format = "num", type = "label", filters = list(time=2010, sex="T"))
head(datl)
## # A tibble: 6 x 6
##   unit       age              sex   geo               time values
##   <chr>      <chr>            <chr> <chr>            <dbl>  <dbl>
## 1 Percentage 15 years or over Total Burgenland (AT)   2010    4  
## 2 Percentage 15 years or over Total Niederösterreich  2010    3.9
## 3 Percentage 15 years or over Total Wien              2010    8.3
## 4 Percentage 15 years or over Total Kärnten           2010    4.3
## 5 Percentage 15 years or over Total Steiermark        2010    4.5
## 6 Percentage 15 years or over Total Oberösterreich    2010    3.9

W przypadku analizy dużych zbiorów danych zaleca się pobieranie danych w formacie “code”. Takie dane będą zajmowały mniej pamięci. W poniższym przykładzie nie będzie to mieć znaczenia.

c(kody = object.size(dat)/1024, etykiety = object.size(datl)/1024)
##     kody etykiety 
## 35.92188 40.67969

3 Przykład: Bezrobocie w Polsce na poziomie województw

Przykład demonstruje wykorzystanie pakietu eurostat do pozyskania danych o poziomie bezrobocia na poziomie województw, przygotowanie danych do analizy oraz wizualizację wyników w postaci wykresów oraz map.

W przykładzie wykorzystamy dane Unemployment rate by NUTS 2 regions przechowywanych w tabeli tgs00010.

Województwa odpowiadają poziomowi NUTS2.

3.1 Przeszukiwanie danych

Kod tabeli danych (code) można usyskać za pomocą następującego polecenia.

id <- search_eurostat(pattern = "Unemployment rate", type = "table")$code[1]
print(id)
## [1] "tgs00010"

3.2 Pobieranie danych

Funkcja get_eurostat() pobierze dane w postaci kodów dla zestawu danych określonych przez id, data zostanie zwrócona w formacie numerycznym. Poniższy przykład nie wykorzystuje argumentu filters do pobrania określonego fragmentu tabeli. Poniżej pobieramy całą tabelę tgs00010, którą następnie będziemy przetwarzać wykorzystując funkcje pakietu dplyr.

dane <- get_eurostat(id, time_format = "num", type = "code")
## Table tgs00010 cached at /tmp/RtmpKfgm73/eurostat/tgs00010_num_code_FF.rds
str(dane)
## tibble [11,619 × 6] (S3: tbl_df/tbl/data.frame)
##  $ unit  : chr [1:11619] "PC" "PC" "PC" "PC" ...
##  $ age   : chr [1:11619] "Y_GE15" "Y_GE15" "Y_GE15" "Y_GE15" ...
##  $ sex   : chr [1:11619] "F" "F" "F" "F" ...
##  $ geo   : chr [1:11619] "AT11" "AT12" "AT13" "AT21" ...
##  $ time  : num [1:11619] 2008 2008 2008 2008 2008 ...
##  $ values: num [1:11619] NA 4.3 6.8 4.3 3.9 3.2 3.1 3 4.9 16.6 ...

Pobrane dane składają się z 6 zmiennych. Informację co oznaczają poszczególne zmienne można uzyskać za pomocą funkcji label_eurostat_vars(), która pobiera definicję kodów używanych przez Eurostat ze słownika Eurostatu. Funkcja names() zwraca nazwy zmiennych.

label_eurostat_vars(names(dane))
## [1] "Unit of measure"                 "Age class"                      
## [3] "Sex"                             "Geopolitical entity (reporting)"
## [5] "Period of time"

Podstawowe informacje o danych można wyświetlić używając funkcji summary().

summary(dane)
##      unit               age                sex                geo           
##  Length:11619       Length:11619       Length:11619       Length:11619      
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##       time          values     
##  Min.   :2008   Min.   : 0.70  
##  1st Qu.:2011   1st Qu.: 4.80  
##  Median :2014   Median : 7.30  
##  Mean   :2014   Mean   : 8.93  
##  3rd Qu.:2017   3rd Qu.:10.80  
##  Max.   :2019   Max.   :48.00  
##                 NA's   :152

Powyżej zostały pobrane dane na poziomie NUTS2 dla obszaru Europy. W następnym kroku należy wyselekcjonować odpowiednie dane dla obszaru Polski.

3.3 Przetwarzanie pobranych danych

W pobranym zbiorze danych kolumna geo zawiera skróty poszczególnych jednostek regionalnych na poziomie NUTS2. Pierwsze 2 litery skrótu oznaczają kod państwa. Używając funkcji countrycode() z pakietu countrycode możemy dokonywać konwersji pomiędzy kodami państw a ich nazwami. Gdybyśmy pobrali dane używając opcji type=label otrzymalibyśmy w kolumnie geo nazwy jednostek regionalnych na poziomie NUTS2 (np. wielkopolskie), ale nie mielibyśmy kodu ani nazwy państwa.

W poniższym przykładzie dodamy kolumnę countryname zawierającą nazwy poszczególnych państw. Funkcja substr() służy do wybrania odpowiedniego podzbioru znaków z wektora (Użyj pomocy aby sprawdzić jak działa funkcja substr()).

#Intalacja pakietu jeśli wymagane. 
##install.packages(countrycode)

library(countrycode)
dane$cntry <- substr(dane$geo,1,2)
dane$countryname <- countrycode(dane$cntry, "iso2c", "country.name")
## Warning in countrycode(dane$cntry, "iso2c", "country.name"): Some values were not matched unambiguously: EL, UK
str(dane)
## tibble [11,619 × 8] (S3: tbl_df/tbl/data.frame)
##  $ unit       : chr [1:11619] "PC" "PC" "PC" "PC" ...
##  $ age        : chr [1:11619] "Y_GE15" "Y_GE15" "Y_GE15" "Y_GE15" ...
##  $ sex        : chr [1:11619] "F" "F" "F" "F" ...
##  $ geo        : chr [1:11619] "AT11" "AT12" "AT13" "AT21" ...
##  $ time       : num [1:11619] 2008 2008 2008 2008 2008 ...
##  $ values     : num [1:11619] NA 4.3 6.8 4.3 3.9 3.2 3.1 3 4.9 16.6 ...
##  $ cntry      : chr [1:11619] "AT" "AT" "AT" "AT" ...
##  $ countryname: chr [1:11619] "Austria" "Austria" "Austria" "Austria" ...

3.4 Przykład 1: Bezrobocie w Polsce w 2016 roku w podziale na płeć.

Do czego służy funkcja droplevels? Dlaczego musiała zostać użyta w tym przykładzie?

#Jeśli rozdzielimy kryteria przecinkiem, np. cntry=="PL", time==2016 to domyślnie zostaną one połączone operatorem &
pl2016 <- filter(dane, cntry=="PL", time==2016, sex%in%c("F", "M"))

#Wybór zmiennych - kolumna unit, age, oraz countryname są niepotrzebne 
pl2016 <- select(pl2016, -c(unit, age, countryname, cntry))
pl2016 <-  droplevels(pl2016)

#zmiana kodu w kolumnie geo na nazwy
pl2016 <- mutate(pl2016, geo = label_eurostat(pl2016)[["geo"]])

head(pl2016)
## # A tibble: 6 x 4
##   sex   geo                 time values
##   <chr> <chr>              <dbl>  <dbl>
## 1 F     Malopolskie         2016    5.6
## 2 F     Slaskie             2016    5.6
## 3 F     Wielkopolskie       2016    5.3
## 4 F     Zachodniopomorskie  2016    7.3
## 5 F     Lubuskie            2016    5  
## 6 F     Dolnoslaskie        2016    5.7

Wykres porównujący poziom bezrobocia w 2016 roku ze względu na płeć.

ggplot(pl2016, aes(x=sex, y=values)) + 
  geom_boxplot() + 
  labs(x = "Płeć", y = "Bezrobocie w procentach", title = "Bezrobocie w Polsce w 2016 roku w podziale na płeć") + 
  theme_bw()

3.5 Przykład 2: Bezrobocie w Polsce w latach 2005 - 2016

#wybór podzbioru danych
pl2005_2016 <- filter(dane, cntry=="PL", time %in% 2005:2016, sex=="T")
pl2005_2016 <-  droplevels(pl2005_2016)

#wybór kolumn
pl2005_2016 <- select(pl2005_2016, -c(1,2,3,7,8))
head(pl2005_2016)
## # A tibble: 6 x 3
##   geo    time values
##   <chr> <dbl>  <dbl>
## 1 PL21   2008    6.2
## 2 PL22   2008    6.6
## 3 PL41   2008    6.1
## 4 PL42   2008    9.5
## 5 PL43   2008    6.5
## 6 PL51   2008    9.1
#zamiana kolumny geo na nazwy
pl2005_2016 <- mutate(pl2005_2016, geo = label_eurostat(pl2005_2016)[["geo"]])

head(pl2005_2016)
## # A tibble: 6 x 3
##   geo                 time values
##   <chr>              <dbl>  <dbl>
## 1 Malopolskie         2008    6.2
## 2 Slaskie             2008    6.6
## 3 Wielkopolskie       2008    6.1
## 4 Zachodniopomorskie  2008    9.5
## 5 Lubuskie            2008    6.5
## 6 Dolnoslaskie        2008    9.1

3.5.1 Uśrednienie wyników dla poszczególnych lat

by_time<- group_by(pl2005_2016, time)
mean_by_time <- summarise(by_time, 
                srednia = mean(values))
## `summarise()` ungrouping output (override with `.groups` argument)
ggplot(mean_by_time, aes(x = time, y = srednia)) + 
  geom_line() + 
  labs(title = "Średni poziom bezrobocia w Polsce w latach 2005-2016", x = "rok", y = "Średni poziom bezrobocia w procentach") + 
  theme_bw()

ggplot(pl2005_2016, aes(x=as.factor(time), y=values)) + 
  geom_boxplot() + 
  labs(x = "Rok", y = "Bezrobocie w procentach", title = "Bezrobocie w Polsce w latach 2005 - 2016") + 
  theme_bw()

3.5.2 Bezrobocie według lat oraz województw.

pl2005_2016$geo_abbr <- substr(pl2005_2016$geo, 1, 3)
ggplot(pl2005_2016, aes(x=geo_abbr, y=values)) + 
  geom_boxplot() + 
  labs(x = "Województwo", y = "Bezrobocie w procentach", title = "Bezrobocie w Polsce w latach 2005 - 2016") + 
  theme_bw()

wojewodztwa_2005_2016 <- pivot_wider(pl2005_2016, 
                             names_from = time, 
                             values_from = values)

wojewodztwa_2005_2016
## # A tibble: 17 x 11
##    geo   geo_abbr `2008` `2009` `2010` `2011` `2012` `2013` `2014` `2015` `2016`
##    <chr> <chr>     <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
##  1 Malo… Mal         6.2    7.9    9.1    9.3   10.4   10.9    9.1    7.1    5.2
##  2 Slas… Sla         6.6    6.7    9.2    9.2    9.4    9.7    8.6    7.2    5.4
##  3 Wiel… Wie         6.1    7.5    8.8    8.6    8.5    8.8    7.7    5.8    4.8
##  4 Zach… Zac         9.5   10.4   12.4   11.8   10.9   10.1    8.4    7.5    6.9
##  5 Lubu… Lub         6.5    9.6   10.6    9.4    9      9.7    8.3    6.4    4.7
##  6 Doln… Dol         9.1   10.1   11.3   10.6   11.1   11.3    9.1    7      5.5
##  7 Opol… Opo         6.5    9.9    9.6    9.3    9.5    9.4    7.8    6.5    5  
##  8 Kuja… Kuj         9.1   10.4   10.6   11     11.9   12.4   10.7    7.9    7.4
##  9 Warm… War         7.4    8.5    9.7    9.6   11     11.4    9.8    9.5    8.8
## 10 Pomo… Pom         5.5    6.4    9.3    8.5    9.5   10      8.6    6.6    5.7
## 11 Lódz… Lód         6.7    7.6    9.3    9.3   11.1   11.1    8.9    7.7    5.5
## 12 Swie… Swi         8.8   10.8   12     12.9   13.1   13     11.4   10.1    8.9
## 13 Lube… Lub         8.8    9.7    9.8   10.3   10.5   10.3    9.9    9.3    8  
## 14 Podk… Pod         8.2   10.1   11.6   12.4   13.2   14.4   14     11.6    9.6
## 15 Podl… Pod         6.4    7.1   10.2    9.3    9.2    9.9    9.1    7      6.7
## 16 Wars… War        NA     NA     NA     NA     NA      5.9    5.8    4.9    3.6
## 17 Mazo… Maz        NA     NA     NA     NA     NA     10.5    8.9    8.3    7.8

4 Wizualizacja wyników na mapie.

W poniższym przykładzie zostaną wyselekcjonowane dane dotyczące poziomu bezrobocia w województwach w 2016 roku. Następnie dane te zostaną dołączone do danych przestrzennych zawierających granice województw. Wyniki zostaną przedstawione w postaci mapy.

4.1 Dane

W poniższym przykładzie wykorzystano argument filters do wybrania danych dla roku 2016 (time=2016), bez podziału na płeć (sex=“T”).

library(eurostat)
dane2016 <- get_eurostat("tgs00010", time_format = "num", type = "code", filters = list(time=2016, sex="T"))
dane2016$cntry <- substr(dane2016$geo, 1,2)
library(dplyr)

pl2016_total <- filter(dane2016, cntry=="PL")
pl2016_total <-  droplevels(pl2016_total)

pl2016_total <- mutate(pl2016_total, geo_name = label_eurostat(pl2016_total)[["geo"]])
pl2016_total <- mutate(pl2016_total, etykieta = paste0(values, "%"))

pl2016_total <- select(pl2016_total, geo_name, geo, values, etykieta)
head(pl2016_total)
## # A tibble: 6 x 4
##   geo_name           geo   values etykieta
##   <chr>              <chr>  <dbl> <chr>   
## 1 Malopolskie        PL21     5.2 5.2%    
## 2 Slaskie            PL22     5.4 5.4%    
## 3 Wielkopolskie      PL41     4.8 4.8%    
## 4 Zachodniopomorskie PL42     6.9 6.9%    
## 5 Lubuskie           PL43     4.7 4.7%    
## 6 Dolnoslaskie       PL51     5.5 5.5%
geodata <- get_eurostat_geospatial(output_class = "sf",
                                   resolution = "60",
                   nuts_level = 2,
                   year = 2016)
## sf at resolution 1:60 read from local file
#połączenie danych atrybutowych oraz danych przestrzennych używając kolumny geo
map_data <- inner_join(geodata, pl2016_total)
## Joining, by = "geo"

4.2 Tworzenie mapy

library(tmap)
map2 <- tm_shape(map_data, is.master = TRUE) +
  tm_polygons("values", n=3, title = "Unemployment", palette = "YlOrRd", border.col = "white" ) +
  tm_text("etykieta", just = "center", size=0.7, col="black") +
  tm_scale_bar(position = "center")
map2
## Linking to GEOS 3.6.2, GDAL 2.2.3, PROJ 4.9.3