Narzędzia użytkownika

Narzędzia witryny


ewdprocedury_bazaszkol_ludnosc

To jest stara wersja strony!


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

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 lata przypisywana jest informacja z BDL dla odpowiadającego im roku.

Pobieranie danych z BDL

http://stat.gov.pl/bdl

  • dane roczne → ludność → stan ludności i prognozy → ludność wg grup wieku i płci
  • wybór jednostek terytorialnych 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

<code> 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)

dane = read.csv2(plikDanych, stringsAsFactors=F) dane$teryt = as.numeric(paste0(substring(dane$teryt, 2, 3), substring(dane$teryt, 6, 9))) dane$miasto = tolower(str_trim(sub('(- miasto )?[(][0-9][)]( [*])?$', '', 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
FROM szkoly_dane JOIN teryt_gminy USING (rok, id_wojewodztwa, id_powiatu, id_gminy)
WHERE rok = ?",
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

### 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.1414672872.txt.gz · ostatnio zmienione: 2014/10/30 13:41 przez zozlak