library(knitr)
library(eurostat)
library(countrycode)
library(dplyr)
library(tidyr)
library(ggplot2)
library(tmap)
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:
Struktura danych Eurostat jest następująca: tabele (table) >> zbiory danych (dataset) >> katalogi (folder).
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).
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.
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).Funkcja get_eurostat_toc()
pobiera tabelę zawierierającą spis udostępnianych przez Eurostat zestawów danych.
## # 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.
## # 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>
## [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:
get_eurostat()
do pobrania wybranego zestawu danych.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.
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:
search_eurostat()
w kolumnie code.label_eurostat()
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.
## kody etykiety
## 35.92188 40.67969
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.
Kod tabeli danych (code) można usyskać za pomocą następującego polecenia.
## [1] "tgs00010"
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
.
## Table tgs00010 cached at /tmp/RtmpKfgm73/eurostat/tgs00010_num_code_FF.rds
## 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.
## [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()
.
## 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.
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
## 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" ...
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ć.
#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
## `summarise()` ungrouping output (override with `.groups` argument)
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
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.
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"))
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"
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