Narzędzia użytkownika

Narzędzia witryny


ewdprocedury_bazaszkol_ludnosc

Przypisywanie szkołom liczby mieszkańców w miejscowości

Liczba mieszkańców miejscowości, w której znajduje się szkoła przypisywana jest z informacji o liczbie mieszkańców miejscowości pobranej z Banku Danych Lokalnych (BDL).

Szkołom znajdującym się na wsiach przypisywana jest wielkość miejscowości 0.

Szkołom dla których brak informacji adresowych przypisywana jest wielkość miejscowości NULL (brak danych).

Ponieważ dane w BDL publikowane są z systematycznym opóźnieniem, przyjęto, że informacja o liczbie mieszkańców:

  • w bieżącym roku pobierana jest dla danych, które są dostępne w BDL, czyli dla poprzedniego roku (mówiąc inaczej wg stanu w momencie rozpoczęcia roku szkolnego, którego to roku szkolnego dotyczą dane teleadresowe szkoły);
  • jednocześnie dla wcześniejszych latach przypisywana jest informacja z BDL dla odpowiadającego im roku.

Algorytm

Pobranie z BDL informacji o liczbie mieszkańców jedynie w gminach miejskich oraz miastach w gminach miejsko-wiejskich (będzie to istotne dla gmin miejsko-wiejskich i wiejskich).

  • dzielnice Warszawy - złączenie po kodzie TERYT Warszawy (146501 / 143101)
  • gminy miejskie - złączenie z danymi z BDL po kodzie TERYT gminy
  • gminy miejsko-wiejskie
    • złączenie z danymi z BDL po parze {TERYT gminy, miejscowość}
    • przypisanie 0 szkołom, które nie połączyły się z danymi BDL
    • przypisanie braku danych szkołom, które nie posiadają kodu pocztowego
  • gminy wiejskie
    • złączenie z danymi z BDL po parze {TERYT powiatu, miejscowość}
      • ponieważ z BDL pobrano tylko informacje o gminach miejskich i miastach w gminach miejsko-wiejskich, dołączyć w ten sposób może się tylko informacja o odpowiadającej danej gminie wiejskiej gminie miejskiej
      • są to przypadki, gdy szkoła siedzibę ma w gminie miejskiej, choć np. organem prowadzącym jest gmina wiejska
      • w skali kraju, dla wszystkich typów szkół, jest takich przypadków ok. 15 do 30.
    • przypisanie 0 szkołom, które nie połączyły się z danymi BDL (tzn. faktycznie znajdują się na wsi)

Pobieranie danych z BDL

http://stat.gov.pl/bdl

  • dane wg dziedzin → ludność → stan ludności → ludność wg grup wieku i płci
  • wybór jednostek terytorialnych (aktualnie pod przyciskiem *zaznacz*) wg poziomu NTS: gminy miejskie, miasta w gminach miejsko-wiejskich
  • wiek: ogółem
  • płeć: ogółem
  • dodatkowe agregaty: brak

I zapisać jako CSV.

Import do bazy

rok = 2013                 # dostosować
kolumnaLudnosc = 'X2012'   # dostosować
plikDanych = '~/ludnosc.csv' # dostosować, plik musi mieć kolumny 'teryt' i 'miasto'
zrodloODBC = 'EWD'      # dostosować

library(stringr)
library(plyr)
library(RODBCext)
P = odbcConnect(zrodloODBC)

# aby upewnić się, że baza jest spójna z naszymi oczekiwaniami
sqlQuery(P, "UPDATE szkoly_dane SET miejscowosc = poczta WHERE miejscowosc = '' or miejscowosc is null")

dane = read.csv2(plikDanych, stringsAsFactors=F)
#dane$teryt = as.numeric(paste0(substring(dane$teryt, 2, 3), substring(dane$teryt, 6, 9)))
dane$teryt = as.integer(substring(dane$teryt, 1, 6))
dane$miasto = sub('[*]', '', dane$miasto)
dane$miasto = sub('[(][0-9][)]', '', dane$miasto)
dane$miasto = tolower(str_trim(sub('- miasto', '', dane$miasto)))
dane$miasto = tolower(str_trim(dane$miasto))
dane[, kolumnaLudnosc] = as.numeric(dane[, kolumnaLudnosc]) # jeśli dane z kilku lat i zmieniała się liczba gmin
dane = dane[!is.na(dane[, kolumnaLudnosc]), ]

szkoly = sqlExecute(
  P, 
  "SELECT 
    id_szkoly, rodzaj_gminy, lower(miejscowosc) AS miejscowosc, rok, 
    id_wojewodztwa * 10000 + id_powiatu * 100 + id_gminy AS teryt, pna
  FROM szkoly_dane JOIN teryt_gminy USING (rok, id_wojewodztwa, id_powiatu, id_gminy)
  WHERE rok = ? AND id_szkoly > 0",
  rok,
  fetch = T, stringsAsFactors = F
)

### Warszawa
warszawa = szkoly[szkoly$rodzaj_gminy == 'dzielnica m.st. Warszawy', ]
warszawa[, kolumnaLudnosc] = dane[dane$teryt %in% c(146501, 143101), kolumnaLudnosc]

### gminy miejskie łączą się wprost po kodzie TERYT
miejskie = szkoly[szkoly$rodzaj_gminy == 'miejska', ]
miejskie = join(miejskie, dane, type = 'inner')

### gminy miejsko-wiejskie złączamy po kodzie TERYT i nazwie miejscowości równej nazwie gminy
mieszane = szkoly[szkoly$rodzaj_gminy == 'miejsko-wiejska', ]
dane$miejscowosc = dane$miasto
mieszane = join(mieszane, dane, type = 'left')
mieszane[is.na(mieszane[, kolumnaLudnosc]), kolumnaLudnosc] = 0
mieszane[is.na(mieszane$pna) | mieszane$pna == '', kolumnaLudnosc] = NA

### szkoły teoretycznie leżące w gminach wiejskich mogą tak naprawdę leżeć w gminach miejskich o tej samej nazwie - złączamy po terycie powiatu i nazwie miejscowości równej nazwie gminy
dane2 = dane
dane2$teryt = paste0(
  substr(dane2$teryt, 1, str_length(dane2$teryt) - 2),
  dane2$miasto
)
wiejskie = szkoly[szkoly$rodzaj_gminy == 'wiejska', ]
wiejskie$teryt = paste0(
  substr(wiejskie$teryt, 1, str_length(wiejskie$teryt) - 2),
  wiejskie$miejscowosc
)
wiejskie = join(wiejskie, dane2, type = 'left', by = 'teryt')
wiejskie[is.na(wiejskie[, kolumnaLudnosc]), kolumnaLudnosc] = 0

### zapis do bazy
odbcSetAutoCommit(P, F)
sqlExecute(
  P,
  "UPDATE szkoly_dane SET wielkosc_miejscowosci = ? WHERE id_szkoly = ? AND rok = ?",
  rbind(
    warszawa[, c(kolumnaLudnosc, 'id_szkoly', 'rok')],
    miejskie[, c(kolumnaLudnosc, 'id_szkoly', 'rok')],
    mieszane[, c(kolumnaLudnosc, 'id_szkoly', 'rok')],
    wiejskie[, c(kolumnaLudnosc, 'id_szkoly', 'rok')]
  )
)
odbcEndTran(P, T)

odbcClose(P)
ewdprocedury_bazaszkol_ludnosc.txt · ostatnio zmienione: 2018/10/10 08:01 przez zozlak