Migracje Polaków w 2016 roku (część pierwsza)

Chcesz wiedzieć skąd pochodzą mieszkańcy Twojej gminy? Albo jak narysować mapę dowolnej wartości na poziomie gmin, powiatów lub województw?

Coś podobnego zrobiło jakiś czas temu BIQdata, po sieci krążyło ostatnio to samo dla Stanów Zjednoczonych. Dzisiaj nauczymy się jak to zrobić samodzielnie. A w następnej części przygotujemy aplikację (wow!).

Jedziemy zatem z pakietami, a później szczegółową instrukcją na zdobycie danych.

Baza nazw gmin, powiatów i województw

Potrzebujemy danych o nazwach gmin, powiatów i województw przyporządkowanych do kodów TERYT. Takie dane znajdziemy w GUSie na odpowiedniej stronie, z której pobieramy archiwum TERC / podstawowa i rozpakowujemy ZIPa, z którego potrzebny nam plik CSV.

Oglądamy sobie dane i wydzielamy kolejno regiony (odpowiednie fragmenty kodu TERYT są puste):

Przy okazji na poziomie gmin dodaliśmy informacje o powiecie i województwie go którego należy gmina oraz jej rodzaju.

W tabeli z powiatami możemy sprawdzić, że mamy osobno Wałbrzych i powiat wałbrzyski – pisałem o tej zmianie jakoś ostatnio.

Dane o migracji

Też są w GUSie w bazie Demografia, konkretnie jest to tabela 2g dostępna przez ścieżkę:

  • Migracje ludności
  • Migracje wewnętrzne
  • 2016
  • 2g – Migracje wewnętrzne ludności na pobyt stały według gminy poprzedniego i obecnego miejsca zamieszkania
  • Ogólnopolskie

Rozpakowujemy archiwum, z którego wyciągamy plik excela. Oglądamy sobie tabelę w Excelu i widzimy, że interesujące nas dane zaczynają się od komórki E5. Ja wyciąłem to co zbędne (nagłówki do wiersza 6 i kolumny A-D oraz F) zostawiając jedynie tabelę z pierwszą kolumną równą kodowi TERYT gminy obecnego zamieszkania, wiersze od kodu TERYT gminy poprzedniego zamieszkania. Przy okazji znaki “#” zamieniłem na zera. Usunąłem również sumy (ostatni wiersz i ostania kolumna). Tak przygotowane dane zapisałem w pliku CSV. Wszystko to można zrobić również w R, ale tym razem szybciej robi się to w Excelu.

Przygotowany plik CSV musimy jeszcze nieco przemodelować, to już w R:

Możemy zobaczyć kilka pierwszych wierszy:

To_TERYT From_TERYT Liczba_osob
0201022 0201011 109
0201032 0201011 6
0201044 0201011 3
0201045 0201011 14
0201052 0201011 8
0201062 0201011 42

i sprawdzić czy nie pokręciliśmy nazw kolumn – czy z gminy 0201011 do gminy 0201062 przeprowadziły się 42 osoby? Tak wynika z tabeli w Excelu, a jak jest w naszych danych w R:

To_TERYT From_TERYT Liczba_osob
0201062 0201011 42

Wszystko jest ok, więc możemy jechać dalej!

Mapy

Potrzebujemy plików SHP – jak w poprzednich postach skorzystamy z danych ze strony CODGiK, pobieramy pliki PRG – jednostki administracyjne, rozpakowujemy i możemy używać. Ja jeszcze zmieniłem w nazwach plików polskie znaki na takie bez ogonków i zostawiłem same małe literki (gmin to akurat nie dotyczy, ale dotyczy innych plików i przydatne jest przy korzystaniu z tych samych plików w różnych systemach operacyjnych – Linux i Windows)

Weźmiemy oczywiście mapkę gmin – na ich poziomie mamy dane:

Mapy są bardzo dokładne, a nie potrzebujemy aż takiej dokładności granic gminy w widoku całego kraju. Dla szybszego rysowania możemy je nieco uprościć, na przykład zaokrąglając dokładność współrzędnych.

Zmniejszyliśmy wielkość danych około 24 razy! Jeśli to za mało – można zaokrąglić dokładność współrzędnych do 3 miejsc po przecinku.

Zobaczmy czy mapa gmin wygląda sensownie?

Cała Polska w podziale na gminy. Z wyjątkiem – Warszawa (i zdaje się, że inne duże miasta podobnie). Dzielnice niestety nie są dostępne w pliku gminy.shp, są w bodaj jednostki_ewidencyjne.shp. Olejemy to jednak ;)

A jeśli chcemy tylko wybrane województwo albo powiat? To taki hint na przyszłość, może będzie Wam do czegoś potrzebne – wystarczy tabelę z mapą wyfiltrować po początkowych znakach (dwóch dla województwa, czterech dla powiatu) i narysować tylko to. Weźmy województwo małopolskie (w tabelce kodów TERYT dla województw widzimy, że to kod 12), przy okazji innymi kolorami zaznaczając powiaty:

Widać ząbki na granicach wynikające z zaokrągleń.

Mięso

Mamy już wszystko gotowe i możemy przystąpić do przygotowania odpowiedniej funkcji, która da nam odpowiednie dane dla wybranej gminy. Przygotujemy ją po kawałku, a na koniec opakujemy wszystkie kolejne kroki w funkcję.

Wybierzmy sobie gminę, którą będziemy analizować – niech taką gminą będzie Kraków (o kodzie TERYT = 1261011). Na początek przeanalizujemy skąd ludzie przybyli do Krakowa w 2016 roku?

Te dwie zmienne uczynimy później parametrami funkcji.

Wybieramy więc interesujące nas dane. Na początek nazwa gminy i województwo do którego należy. To będzie potrzebne do wykresów:

Otrzymujemy wartość Kraków (gmina miejska), woj. MAŁOPOLSKIE czyli tak, jak chcieliśmy. Mała uwaga na marginesie: zamiast .$Nazwa można użyć funkcji pull(), ale dostępna jest ona w pakiecie dplyr w wersji powyżej 0.7. A że moje posty z różnych przyczyn piszę na R w wersji 3.2.1 to nie mogę na niej zainstalować nowszej wersji dplyr.

Wybierzmy z tabeli o migracjach tylko fragment danych, których potrzebujemy – skąd ludzie przyjeżdżają do naszej gminy?

Upakowane to w warunku if(), bo będzie gotowym fragmentem funkcji. Od razu przygotowaliśmy sobie tytuł do wykresów: Skąd przyjechali w 2016 roku ludzie do gminy Kraków (gmina miejska), woj. MAŁOPOLSKIE?

Teraz najważniejsza rzecz – dodać liczbę osób, które zmieniły miejsce zamieszkania do mapy.

Możemy już narysować mapkę:

Widzimy, że głównie do Krakowa przyjeżdżają ludzie z jego okolic. To oczywiście naturalne. Ale są pojedyncze gminy z drugiego krańca Polski.

W tym miejscu właściwie kończy się część, o którą często pytacie. Zamiast liczby osób, które zmieniły miejsce zamieszkania może być liczba sprzedanych lizaków, liczba kontaktów z klientami i cokolwiek zechcecie. Rozwiązanie jest uniwersalne i przebiega według algorytmu:

  • dane przygotowujemy w tabeli z dwoma kolumnami: kod TERYT jednostki oraz wartość którą chcemy pokazać na mapie
  • w zależności od poziomu danych (gmina, powiat, województwo) przygotowujemy odpowiednią mapę (z pliku SHP)
  • łączymy (left_join()) mapę z danymi według klucza TERYT
  • rysujemy (ggplot() + geom_polygon()) całość używając do wypełnienia konturów naszej wartości

Możemy z poziomu gmin agregować dane do wyższych poziomów – powiatów lub województw. I znowu narysować je na odpowiedniej mapie. My jednak przygotujemy innego rodzaju wykresy.

Na początek dodamy do informacji o migracjach do Krakowa nazwy gmin, powiatów i województw:

Zobaczmy top 20 gmin skąd przybyli nowi mieszkańcy Krakowa (według liczby osób, które zmieniły miejsce zamieszkania):

Dominują duże miejscowości w okolicach Krakowa: Nowy Sącz i Tarnów. Spodziewam się, że z tych miast (a także z Kielc i Częstochowy) przyjeżdżają studenci i po zakończeniu studiów osiedlają się na stałe. Na mapie widzieliśmy dużo gmin, a tutaj ich prawie nie widać. To dlatego, że bierzemy pod uwagę bezwzględną liczbę mieszkańców.

Gdybyśmy policzyli jaki procent na przykład mieszkańców Kielc wyemigrował do Krakowa układ powyższych słupków byłby zapewne inny. Bo przecież 20 osób z gminy liczącej 3 tysiące mieszkańców (0.66%) to co innego niż 100 osób ze 100-tysięcznego miasta (0.1%). Ale do tego potrzebowalibyśmy jeszcze jednej warstwy danych – liczby mieszkańców każdej z gmin w tym samym czasie (czyli na przykład na koniec 2015 roku), a tutaj od ręki mamy dane na poziomie powiatów (dla zainteresowanych: znowu baza Demografia ścieżka dotarcia to: I. STAN I STRUKTURA LUDNOŚCI, Ludność, 2015, Ludność stan w dniu 31 XII, 03 – Ludność według płci, województw i powiatów, Ogólnopolskie) lub dane na poziomie gmin z Narodowego Spisu Powszechnego, ale z 2011 roku (link) w nieco trudniejszym formacie (każde województwo w innej zakładce) i trochę mniej wprost (nie ma rozbicia po kodach TERYT na obszar wiejski i miejski gmin wiejsko-miejskich – jest całość, a rozbicie trzeba sobie wykoncypować samodzielnie z podziału na ludność zamieszkującą część miejską i wiejską). “Rabialne” w każdym razie.

Wróćmy do naszych migracji. Wiemy już z jakich gmin przyjechali nowi (jak na rok 2016) mieszkańcy Krakowa, a teraz zagregujmy to do powiatów (i pokażmy top 20):

i województw (agregując powiaty):

Już na mapie widzieliśmy, że najwięcej przybyszy jest z okolic Krakowa, z województwa małopolskiego. Co więcej – z powiatu krakowskiego.

Chcecie zobaczyć co to za powiat, jakie gminy i ile ludzi przybyło z niego do miasta królewskiego? Jasne, że tak! Powiat krakowski to kod TERYT:

WOJ POW Powiat TERYT_POW
12 06 krakowski 1206

Zawęzimy więc do niego dane z mapą:

Widać kanciastość granic gmin (to wynik zaokrąglenia współrzędnych przy przygotowaniu mapy), ale widać też dokładnie z której gminy w sąsiedztwie Krakowa przybyli mieszkańcy (Zielonki, Zabierzów i Kocmyrzów-Luborzyca to pierwsza trójka).

Teraz to samo zrobimy dla kierunku odwrotnego. Zmianie podlega tylko jeden fragment: określający tytuł wykresu oraz wybierający odpowiednio dane z tabeli o wszystkich migracjach. Dodamy po prostu kolejny warunek:

Usuńmy jeszcze zbędne zmienne (poskładamy kod z tymi samymi nazwami zmiennych, chodzi o to, żeby nie pomieszały się (głównie w głowie) zmienne lokalne z globalnymi):

Teraz całość możemy upakować w jedną funkcję, która na podanie kodu TERYT badanej gminy i kierunku zmian zwróci nam w liście wszystkie interesujące nas informacje:

  • mapę Polski z odpowiednio pokolorowanymi gminami
  • wykres słupkowy z dwudziestoma gminami z których przybyło (lub do których wyjechało) najwięcej osób
  • tabelę z danymi zagregowanymi do powiatów
  • tabelę z agregacją do województw

Oto cały kod:

Sprawdźmy czy wszystko działa poprawnie dla naszego Krakowa (w kierunku jaki wyżej przeanalizowaliśmy) – na przykład na top 20 powiatów:

Powiat Wojewodztwo Liczba_osob
krakowski MAŁOPOLSKIE 623
wielicki MAŁOPOLSKIE 228
myślenicki MAŁOPOLSKIE 175
nowosądecki MAŁOPOLSKIE 157
nowotarski MAŁOPOLSKIE 140
limanowski MAŁOPOLSKIE 138
wadowicki MAŁOPOLSKIE 138
Nowy Sącz MAŁOPOLSKIE 135
Kielce ŚWIĘTOKRZYSKIE 127
chrzanowski MAŁOPOLSKIE 126
Tarnów MAŁOPOLSKIE 122
brzeski MAŁOPOLSKIE 116
tarnowski MAŁOPOLSKIE 116
oświęcimski MAŁOPOLSKIE 113
bocheński MAŁOPOLSKIE 111
gorlicki MAŁOPOLSKIE 102
proszowicki MAŁOPOLSKIE 98
olkuski MAŁOPOLSKIE 93
Częstochowa ŚLĄSKIE 92
Rzeszów PODKARPACKIE 92

Porównaj teraz tabelę z odpowiednim wykresem wyżej. Musi się zgadzać, a ewentualna zamiana Częstochowy z Rzeszowem jest nieistotna, bo liczba osób w obu przypadkach jest jednakowa.

Porównajmy jednak dwie liczby w obu kierunkach. Powyżej w tabeli mamy 623 osób, które przeprowadziły się z powiatu krakowskiego do Krakowa. A w drugą stronę? Możemy już korzystać z naszej funkcji, zatem:

Powiat Wojewodztwo Liczba_osob
krakowski MAŁOPOLSKIE 1796
wielicki MAŁOPOLSKIE 1026
myślenicki MAŁOPOLSKIE 265
Warszawa MAZOWIECKIE 241
bocheński MAŁOPOLSKIE 131
wadowicki MAŁOPOLSKIE 104
proszowicki MAŁOPOLSKIE 87
limanowski MAŁOPOLSKIE 75
Tarnów MAŁOPOLSKIE 66
brzeski MAŁOPOLSKIE 53

Jak widać jest to 1796 osób! Ludzie migrują z dużych miast na przedmieścia. To samo jest w przypadku Wrocławia i Poznania.

Chcielibyście pewnie wiedzieć ile osób z okolic Łukowa (z rejestracją LLU) trafiło do Warszawy? Dane mamy na poziomie gmin (i co za tym idzie – dzielnic Warszawy), w związku z tym musimy użyć powiatu. Wszystkie gminy Warszawy mają kod TERYT zaczynający się od 1465. Powiat łukowski to zaś 0611. Chwilka na przygotowanie kodu:

Nazwa_gminy Liczba_osob Procent
Białołęka (dzielnica Warszawy) 20 13.4
Wola (dzielnica Warszawy) 18 12.1
Targówek (dzielnica Warszawy) 17 11.4
Mokotów (dzielnica Warszawy) 15 10.1
Praga-Południe (dzielnica Warszawy) 15 10.1
Ursynów (dzielnica Warszawy) 10 6.7
Wawer (dzielnica Warszawy) 10 6.7
Wilanów (dzielnica Warszawy) 10 6.7
Bielany (dzielnica Warszawy) 8 5.4
Bemowo (dzielnica Warszawy) 7 4.7
Śródmieście (dzielnica Warszawy) 7 4.7
Włochy (dzielnica Warszawy) 5 3.4
Ursus (dzielnica Warszawy) 4 2.7
Żoliborz (dzielnica Warszawy) 3 2.0

Rzeczywiście najwięcej trafiło na Białołękę (zgodnie z obiegową opinią). Ale nie jest to jakaś dramatyczna różnica.

Teraz pewnie chcesz zobaczyć skąd pochodzą mieszkańcy Twojej gminy? Albo chcesz zobaczyć dokąd emigrują? Narzędzia są gotowe. A w drugiej części przygotujemy aplikację do tego (w imię “There’s an app for this!”).

7 myśli na temat „Migracje Polaków w 2016 roku (część pierwsza)

  1. niewiele wiedząc o R próbowałem wyrysować to co pokazujesz idąc krok po kroku za twoją instrukcją i w tym miejscu napotykam błąd, którego nie potrafię usunąć,

    > gminy_mapa <- tidy(gminy_mapa, region = "jpt_kod_je")
    BŁĄD: isTRUE(gpclibPermitStatus()) is not TRUE

    gdy go zignorowałem i poszedłem dalej tzn próbowałem zastosować kolejną porcję kodu to wyskakuje błąd
    niestosowalna metoda dla 'group_by_' zastosowana do obiektu klasy "c('SpatialPolygonsDataFrame', 'SpatialPolygons', 'Spatial')"
    jakiś pomysł?

    • To problem, który da się ominąć instalując na nowo pakiety:
      install.packages('rgeos', type='source')
      install.packages('rgdal', type='source')

      • kurcze, nie wiem czemu spodziewalem sie jakiegos powiadomienia na maila, jak odpowiesz, a że go nie było, to mordowałem się sam i w końcu znalazłem to samo rozwiązanie o którym piszesz:)
        mimo to oczywiscie wielkie dzieki, a caly material bardzo ciekawy

  2. Hej,
    super materiał.
    Staram się odtworzyć i utknąłem na etapie instrukcji

    gminy_mapa <- readOGR("../!mapy_shp/gminy.shp", layer = "gminy")

    Plik z COIGDK zgrałem, gminy.shp jest (84mb). I niestety cały czas mam komunikat
    Error in ogrInfo(dsn = dsn, layer = layer, encoding = encoding, use_iconv = use_iconv, :
    Cannot open data source
    Pewnie jakiś głupi błąd. Ale nie mam pojęcia jaki. Będę wdzięczny za wskazówkę.
    M
    ps. biblioteka (rgdal) i ścieżka do pliku zaktualizowana… :)

    • Masz sam plik .shp czy wszystkie gminy.*? Bo to może być problem. Jeśli oczywiście ścieżka do pliku jest poprawna (a obstawiam że to jest problem).

Dodaj komentarz