Dostęp do Banku Danych Lokalnych GUS z poziomu R a trendy w zatrudnianiu

bdl

Ostatnio w komentarzach, Paweł K. napisał, że dane z GUSowskiego Banku Danych Lokalnych mają wreszcie API. API wykonane i utrzymywane przez fundację mojepanstwo.pl. API ma przyzwoitą dokumentacje przygotowaną w swagger. Link do dokumentacji jest tutaj.

Zrobiłem interface do tego API dostępny z poziomu R. Dostęp do danych możliwy jest poprzez funkcje getBDLsearch{SmarterPoland} i getBDLseries{SmarterPoland} (dla wersji pakietu z GitHuba).

Jak używać tych funkcji?
Zobaczmy na przykładzie trendów w zatrudnieniu. Do pobrania danych wystarczą dwie linijki. Kolejne dwie i już mamy wykres.

library(SmarterPoland)
#
# szukamy obiektów opisujących czasy pracy
# odpowiednia tabela ma nazwę 'Pracujący wg wymiaru czasu pracy i płci'
getBDLsearch("czas")
#
# pobieramy dane korzystając z object_id
# w tym przypadku object_id=744
pracujacy <- getBDLseries(metric_id = "744")
#
# dane pobrane, jeszcze małe czyszczenie
# wyrzucamy agregat i zamieniamy wartości z napisowych na liczbowe
pracujacy <- pracujacy %>%
  mutate(value = as.numeric(value)) %>%
  filter(dimension.1 != "ogółem")
#
# rysujemy wykres
# na panelach będą różne skale, kolory oznaczają płeć, 
# na osi x rok a na osi y liczba zatrudnionych w tysiącach
ggplot(pracujacy, aes(x=year, y=value, color=dimension.1)) +
  geom_point(size=3) +  geom_line() + 
  facet_wrap(~dimension, scales="free_y") +
  ggtitle("Pracujący wg wymiaru czasu pracy i płci") +
  ylab("w tys. osób") + xlab("rok")

Panele mają różne skale (różniące się o rząd wielkości). Wśród pracujących na pełen etat więcej jest mężczyzn, poziom zatrudnienia w tej grupie jest stały stały od kilku lat.
W grupie pracujących na część etatu większość stanowią kobiety. Liczba osób pracujących na część etatu spada i znacznie szybciej spada wśród mężczyzn.

bdl

Oczywiście w Banku Danych Lokalnych jest znacznie znacznie więcej danych.
Udanej zabawy z tym źródłem.

48 thoughts on “Dostęp do Banku Danych Lokalnych GUS z poziomu R a trendy w zatrudnianiu”

  1. hmmm…. nie to żębym się czepiał ale w wykresie który udostępniłeś początkowo mylące jest że jest różna skala Y o cały rząd wielkości (na piewszy rzut oka jest to mylące )…. tak tylko mówię 😉

  2. Tak, masz racje, przy czym przy tych samych osiach nie widac zadnych zmian na prawym wykresie, krzywe sa przygwożdżone do zera.

  3. Funkcja getBDLseries nie działa do końca poprawnie ze względu na funkcję htmlEscape(url), przykład: http://api.mojepanstwo.pl/bdl/series?metric_id=440&wojewodztwo_id=02 daje coś innego niż http://api.mojepanstwo.pl/bdl/series?metric_id=440&wojewodztwo_id=02. W tym przypadku widocznie htmlEscape nie jest potrzebne 🙂

    Mam jeszcze pytanie, czy wiadomo coś o zwiększeniu maksymalnej liczby wyników? Obecnie jest to (chyba) 500, co przy próbie pobrania danych dla wszystkich województw już daje błąd 🙁

    1. @Piotrek, mam już problemy ze wzrokiem, jaka jest różnica pomiędzy tymi dwoma linkami, które wkleiłeś?
      Wyglądają tak samo.

      W R dostaję ten link poleceniem
      tmp <- getBDLseries(metric_id = "440", wojewodztwo_id = "02") Co do maksymalnej liczby wyników to nie wiem, ja tylko odpytuję API mojegopaństwa.

  4. Cześć,

    wydaje mi się, że albo API się popsuło, albo coś się zmieniło w aplikacji i nie działa polecenie wyszukiwania wskaźników – u mnie i jeszcze innej osoby pojawia się podobny błąd:

    > getBDLsearch(„czas”)
    Error in data.frame(id = d$id, dataset = d$dataset, object_id = d$object_id, :
    arguments imply differing number of rows: 1, 0

  5. Dzięki za sygnał,
    wygląda na to, że zmienił się format wyników.

    Nowa wersja pakietu SmarterPoland jest już na GitHub, teraz getBDLsearch znów działa, choć trudno przewidzieć czy w przyszłości interface nie zmieni się ponownie

  6. Hej,

    mam ten sam problem co @Mateusz. Co prawda

    getBDLsearch(„czas”) działa ale jak wpiszę

    getBDLsearch(„bezrobocie”) to wyrzuca błąd
    Error in data.frame(id = d$id, dataset = d$dataset, object_id = d$object_id, :
    arguments imply differing number of rows: 1, 0

    Jednak działa poprawnie gdy dodam raw=TRUE.

    Z tego co widzę z poniższego kodu

    wyniki <- getBDLsearch(„bezrobocie”, raw=TRUE)
    sapply(wyniki,sapply, length)

    Pierwsza lista w data ma tylko 7 elementów, a pozostałe mają po 15. Wygląda na to, że dodają informację o szczegółach pobieranej zmiennej.

  7. Jednak nie o to chodzi. Spojrzałem w Twój kod. Pierwszy wynik nie posiada kolumny bdl_wskazniki.tytul

    lapply(wyniki,function(x) x$data$bdl_wskazniki.tytul)

    1. Faktycznie, widzę że w wynikowym JASONie są różne pole dla różnych zapytań, a czasem nawet różne pola dla tego samego zapytania.

      Poprawiłem konwersję na data.frame,
      teraz najpierw sprawdzane są wszystkie nazwy, które występują w JSON a później robiona jest ramka z polami NA tam gdzie brak danych.

      Powinno już działać

  8. Hej, natrafiłem na problem z funkcją getBDLsearch:

    > getBDLsearch(„czas”)
    Error in paste0(„http://api.mojepanstwo.pl:80/bdl/search?q=”, htmlEscape(query)) :
    could not find function „htmlEscape”

    > getBDLsearch(„bezrobocie”)
    Error in paste0(„http://api.mojepanstwo.pl:80/bdl/search?q=”, htmlEscape(query)) :
    could not find function „htmlEscape”

    Zwraca mi brak funkcji htmlEscape. Przyznam, że jestem w R zupełnym świeżakiem i ciężko mi powiedzieć jeszcze czy to ja coś źle zrobiłem czy coś nie działa.

    Pozdrawiam. 🙂

    1. Aby ta funkcja działała trzeba mieć zainstalowany pakiet 'htmltools’

      install.pacakges(„htmltools”)

      library(htmltools)

      Najnowsza wersja SmarterPoland z githuba powinna sama zatroszczyć się o tę zależność.

  9. Hej, chyba po stronie api jest jakiś błąd i wydaje mi się, że wiąże się to z częstymi aktualizacjami bdl’a po stronie GUSu. O ile się tego nie ustali z nimi, to możliwe że pakiet będzie wymagał nieustających korekt…

    > library(SmarterPoland)
    > #
    > # szukamy obiektów opisujących czasy pracy
    > # odpowiednia tabela ma nazwę 'Pracujący wg wymiaru czasu pracy i płci’
    > getBDLsearch(„czas”)
    Error in data.frame(id = d$id, dataset = d$dataset, object_id = d$object_id, :
    arguments imply differing number of rows: 1, 0
    > #
    > # pobieramy dane korzystając z object_id
    > # w tym przypadku object_id=744
    > pracujacy <- getBDLseries(metric_id = "744")
    Error in tmp[met[, d], "value"] : invalid subscript type 'list'

  10. @Mateusz,
    dzięki, niestety rzeczywiście to API MojegoPanstwa ewoluuje bardzo szybko
    wysłałem im kilka maili w tej sprawie i czekam na jakąś odpowiedź,
    ale chyba pozostaje poczekać aż nastąpi jakaś stabilizacja

  11. Wydaje mi się, że oni podążają za GUSem, który nie pilnuje spójności wskaźników jak EUROSTAT. Często z niezrozumiałych dla mnie przyczyn dzieli niektóre wskaźniki, a innych w BDL nie umieszcza (np. nieobsadzone stanowiska pracy w przedsiebiorstwach). Tzn. brawurowe było w ogóle wykonanie czegoś takiego w obecnych warunkach, ale mam przeczucie, że to głębszy problem.

  12. Update:

    getBDLseries() i getBDLsearch() ponownie działają.

    getBDLtree() wciąż nie, czekam na info z MojePanstwo ci jest nie tak z adresem.

  13. Uwaga!

    Dane z BDL nie są oficjalnie udostępniane poprzez żadne API i na dzień dzisiejszy nie ma planów tego typu udostępniania danych, aczkolwiek naciski odbiorców danych mogą to za jakiś czas zmienić.

    Fundacja mojepanstwo.pl udostępnia te dane nieoficjalnie na swoją odpowiedzialność i nie daje żadnej gwarancji na poprawność i aktualność pobieranych danych, gdyż nie wiadomo w jakim trybie te dane pobiera z bazy danych BDL i jak często.

    1. Słuszna uwaga,
      należy brać pod uwagę brak gwarancji ponieważ dane mogą nie być kompletne.

      Ale kiedy powstanie oficjalne API dla BDL?

  14. Witam,
    Niestety skrypt chyba ponownie nie działa. Mimo poprawnej instalacji i wczytania pakietu, przy próbie pobrania jakichkolwiek danych pojawia się ciągle błąd:

    Error in file(con, „r”) : cannot open the connection
    In addition: Warning message:
    In file(con, „r”) :
    InternetOpenUrl failed: 'A connection with the server could not be established’

    Czyżby zmiana w API BDL? Czy coś robię nie tak?

  15. U mnie działa,
    upewnij się, że masz najnowszą wersję pakietu SmarterPoland
    library(devtools)
    install_github(„pbiecek/SmarterPoland”)

  16. Pojawiły się u mnie dwa problemy:
    Pierwszy:

    > getBDLtree()
    Error in file(con, „r”) : cannot open the connection

    Drugi:

    > cieplownictwo_wsk <- getBDLseries(metric_id = "41349")
    Error in tmp[met[, d], "value"] : invalid subscript type 'list'

    Błędy w rodzaju tego drugiego występują przy obiektach o 4-cyfrowych id, takimi id oznaczane są obiekty o nieco innej strukturze (jeden poziom drzewa więcej)

  17. Chyba znowu coś się w API zepsuło gdyż dostaję komunikat:
    getBDLsearch(„czas”)
    Error in file(con, „r”) : cannot open the connection
    In addition: Warning message:
    In file(con, „r”) :
    cannot open: HTTP status was '500 Internal Server Error’

    1. Niestety coś szwankuje z API do BDL na mojepanstwo,
      pozostałe bazy działają dobrze, ale BDL nie.
      Dowiem się czy jest szansa na naprawienie tego interface.

      1. Z góry dziękuję. Akurat bardzo tych danych potrzebuję. A klikanie wszystkich powiatów w Polsce by mnie zabiło 🙁

  18. BDL został ostatnio zaktualizowany i pozwala pobierać większą ilość danych i zwraca je w postaci długiej. Wszystkie powiaty możesz zaznaczyć klikając prawym przyciskiem na POLSKA, w oknie wyboru jednostek terytorialnych, odznacz wszystkie i zaznacz powiaty.

  19. Obecnie API do BDL na mojepanstwo nie działa oprócz prostych metod typu:
    https://api-v3.mojepanstwo.pl/bdl/search?q=Transport

    jednak gdy już chcę wybrać jakikolwiek zestaw to niestety nie mam żadnych wyników zwrotnych. Nawet na stronie mojepanstwo przykładowe query nie działają. https://mojepanstwo.pl/api/bdl
    NP.
    https://api-v3.mojepanstwo.pl/bdl/series?metric_id=762&slice=%5B5479,1713%5D&powiat_id=2

    Czy może wiesz więcej w związku z tym?

    1. Co jakis czas ponawiam pytanie na githubie. Ale wyglada na to ze apo nie jest aktywnie utrzymywane

  20. Hej,

    Czy pojawiły się może jakieś nowe informacje dot. API do BDL?
    Na tę chwilę program załączony do artykułu zatrzymuje się na poziomie 9 wiersza (czyli pracujacy <- getBDLseries(metric_id = "744") ) – zwraca błąd Error in open.connection(con, "rb") : HTTP error 418.

    Pozdrawiam
    KB

  21. Witam, próbowałem skorzystać z powyższego przykładu żeby dostać się do BDL, ale wyświetla mi się error „HTTP error 418” w linii, gdzie dostajemy się do zbioru danych „getBDLseries(metric_id = „744”)”. Widzę, że ostatnie wpisy mają aż 4 lata, ale może ktoś poratuje 🙂

    Byłbym wdzięczny!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *