Erasmus pro předškolní vzdělávání
Analýza dostupnosti mateřských škol v příhraničních oblastech v Česku, Rakousku a Německu
Autorky: Lenka Hanková, Helena Svobodová
Mentoring: Karel Minichbauer, Siemens
Autorky jsou absolventky Digitální akademie Czechitas: Datová analýza. Projekt popsaný níže je závěrečnou prací, jejíž cílem bylo aplikovat získané znalosti a prokázat jejich osvojení.
Téma a cíle projektu
S tématem na projekt přišla Helča, která má zkušenost se sháněním míst pro české děti v německy mluvících školkách. Na začátku jsme chtěly zmapovat právě tato vyhrazená místa pro děti z ČR ve školkách v Německu či Rakousku a zjistit, jestli i v Česku nenabízí některé školky místa pro děti ze sousední země. Při shánění dat jsme ale tvrdě narazily, nebyla souhrnně vůbec dostupná. Na chvíli jsme se začaly věnovat i jinému tématu projektu, avšak nakonec jsme se k analýze školek opět vrátily s novou vizí.
Rozhodly jsme se udělat přehled školek v příhraničních oblastech, které by přicházely v úvahu pro časté dojíždění. Tento výběr školek jsme pak chtěly obohatit o informace o kapacitě školek, případně jejich naplněnosti, což se ale odvíjelo od skutečnosti, zda se nám podaří získat relevantní data.
Cílovou skupinou našeho projektu jsou tedy rodiče, kteří chtějí svým dětem umožnit získat základy cizího jazyka nenásilnou formou již v předškolním věku, a to návštěvou mateřské školy v sousedním státě, případně i rodiče, pro které je umístění dítěte do mateřské školy v sousedním státě praktičtější, např. z důvodů dojíždění do práce.
Cílem projektu je podpořit jazykovou vybavenost dětí v příhraničních oblastech a tím přispět k ještě lepšímu propojení regionů. K tomu by měla pomoci právě naše analýza, která dá rodičům přehled o mateřských školách v příhraničních oblastech Česka, Rakouska a Německa. Zároveň jsme projektem chtěly upozornit na toto téma, respektive možnost, umístění dítěte do zahraniční mateřské školy.
Sběr a příprava dat
Vzhledem k tomu, že Lenka neumí německy a Helča je naopak vystudovaná učitelka němčiny, bylo rozdělení toho, kdo zkusí získat jaká data, jasné.
Seznam všech mateřských škol v Česku získala Lenka z adresáře škol a školských zařízení na stránkách Ministerstva školství, mládeže a tělovýchovy (MŠMT). V seznamu byly uvedeny základní údaje jako kraj a adresa, ale také kapacita nebo odkaz na webové stránky. Seznam neobsahoval pouze školky, ale také školní jídelny nebo školní družiny. Tyto řádky navíc, stejně jako školky z jiných než příhraničních krajů, které pro nás byly nerelevantní, jsme si odfiltrovaly. Dále se nám podařilo získat z Ministerstva školství, mládeže a tělovýchovy údaje o počtu přihlášek spádových a nespádových dětí a počtu přijatých a nepřijatých dětí za jednotlivé mateřské školy za rok 2021, velké díky za tyto data patří panu Stanislavu Volčíkovi. Tyto údaje jsme pak pomocí kódu školky propojily s tabulkou obsahující základní údaje o školce a ve výsledné tabulce ponechaly jen pro nás relevantní sloupce. Tyto kroky jsme provedly pomocí dotazů v SQL.
Data z příhraničních oblastí v Rakousku získala Helča přes stránky Statistik Austria: https://www.statistik.at/statistiken/bevoelkerung-und-soziales/bildung/kindertagesheime-kinderbetreuung. Za odkaz na tento zdroj a informace ke školkám patří dík panu Matthiasovi Schinaglovi (Abteilung Elementarpädagogik, Bildungsdirektion Oberösterreich). Objasnil nám, že kapacita rakouských školek je variabilní a maximální počet dětí ve skupině (max.23) se ovšem snižuje v závislosti na počtu dětí vyžadujících větší péči z hlediska integrace. Proto u rakouských MŠ kapacitu nelze uvést. Data k obsazenosti byla dostupná pouze pro jednotlivé obce, přiřadily jsme je tedy k jednotlivým školkám v případě, že se v obci nacházelo pouze jedno zařízení (provedeno pomocí dotazů v SQL). Další tabulka obsahující název školky a adresu nám postačila k vygenerování souřadnic. Jednalo se tedy o víceméně očištěná data, která jsme nemusely dále upravovat, kromě změny formátu souboru.
Data za Německo získala Helča, pro Bavorsko přes stránky instituce Bayrisches Landesamt für Statistik https://www.statistikdaten.bayern.de/genesis/online/ a díky paní Viktorii Treuheit, pro Sasko pak u Statistisches Landesamt des Freistaates Sachsen https://www.statistik.sachsen.de/genonline/online a paní Renatě Recknagel.
Data za Bavorsko jsme obdržely ve formátu excelové tabulky, kterou jsme opět pomocí dotazů SQL očistily o nepotřebná údaje ke školním družinám a jeslím. Obsahovala kompletní informace jak ke kapacitě i obsazenosti jednotlivých školek tak i např. odkazy na webové stránky, které bylo třeba kvůli duplicitám očistit v Pythonu. Údaje za Sasko obsahovaly kapacitu, aktuální obsazenost byla ovšem dostupná jen s přesností pro jednotlivé obce s většinou chybějícími údaji o počtu zařízení, proto jsme s ní dále nepracovaly.
Nejvíc zabrat nám dala příprava dat za Sasko. Data byla dostupná v excelu na 15 listech ve formátu naformátovaného reportu, takže například názvy školek a adresy byly v rámci jedné buňky napsány na více řádků. Data tedy po načtení souboru pomocí Pythonu nešly rozdělit dle konce řádků, protože konce řádků se vyskytovaly i v jednotlivých buňkách, ani dle středníku nebo čárky. Nakonec se nám podařilo data ze souboru vydolovat pomocí modulu CSV, jehož požití nám poradil Jirka Pešík na hackathonu.
Práce s daty
Jako první úkol jsme si stanovily spočítat vzdálenost jednotlivých školek od hranic. Možností jak souřadnice vygenerovat se nabízelo několik a jelikož se nám oběma líbilo od počátku programování v Pythonu, zvolili jsme právě jeho. Náš mentor Karel Minichbauer nám pomohl s nalezením a nastavením modulu Geopy.geocoders a následně napsáním skriptu v Pythonu, který uměl vygenerovat z adresy souřadnice GPS. Adresy jednotlivých školek byly ale pro každou zemi v jiném formátu a ne vždy si s ním uměl náš skript poradit, proto jsme musely skript upravovat pro každou sadu dat tak, aby generování GPS souřadnic bylo funkční. Skript jsme nastavily zároveň tak, že školky, u nichž se podařilo souřadnice vygenerovat, se ukládaly do jednoho souboru a školky, u nichž ne, do jiného. Adresy z něj jsme pak následně ještě upravily pro využití v nástroji https://www.gpsvisualizer.com/geocoder/, který nám doporučil Jirka Pešík a získaly tak další údaje o zeměpisné délce a šířce. Tyto původně nepovedené adresy jsme připsaly k již dříve vygenerovaným souřadnicím. Vše opět pomocí skriptů v Pythonu.
# import modulu geopy
from geopy.geocoders import Nominatim
# načtení the Nominatim tool
loc = Nominatim(user_agent="GetLoc")
# otevření souboru
with open('seznam_skolky_Bavorsko.csv', encoding='utf-8') as vstup:
radky = vstup.readlines()
# vytvoření seznamu z jednoho řádku
jeden_radek = [radek.split('\n') for radek in radky]
# proměnné pro ukládání
nepovedene = []
povedene = []
# generování souřadnic - povedené se ukládají do jednoho souboru a nepovedené do jiného
for cast_radku in jeden_radek[1:]:
try:
# rozdělení řádku na jednotlivé údaje
cast = cast_radku[0].split(";")
# načtení adresy
adresa = cast[7] + ', ' + cast[9]
getLoc = loc.geocode(adresa)
# vypsání adresy a souřadnic (pouze pro kontrolu, že se generují)
print(getLoc.address)
print("Latitude = ", getLoc.latitude, "\n")
print("Longitude = ", getLoc.longitude)
# uložení potřebných údajů do proměnné povedené
data = ""
nazev = cast[2] + ' ' + cast[3]
skolka = nazev + ";" + adresa + ";" + cast[14] + ";" + cast[12] + ";" + cast[16]
data+=skolka
povedene.append(skolka + ";" + str(getLoc.latitude) + ";" + str(getLoc.longitude) + "\n")
except Exception as chyba:
# uložení potřebných údajů do proměnné nepovedené
data_nepov = ""
skolka_nepov = nazev + ";" + adresa + ';' + cast[14] + ";" + cast[12] + ";" + cast[16]
data_nepov+=skolka_nepov
nepovedene.append(data_nepov + ";" +"\n")
pass
# vložení hlavičky u povedených
hlavicka = "NAZEV" + ";" + "ADRESA" + ";" + "KAPACITA" + ";" + "WEB" + ";" + "AKTUALNI_OBSAZENOST" + ";" + "LATITUDE" + ";" + "LONGITUDE" + "\n"
povedene.insert(0,hlavicka)
#print(povedene)
# uložení povedených do souboru
with open("DE_Bavorsko_povedene_MS.csv", "w", encoding="utf-8") as vystup:
vystup.writelines(povedene)
# uložení nepovedených do souboru
with open("DE_Bavorsko_nepovedene.csv", "w", encoding="utf-8") as soubor:
soubor.writelines(nepovedene)
Další problém nastal s GPS souřadnicemi hraničních přechodů. Všechny hraniční přechody s jednotlivými zeměmi jsou stanoveny zákonem, takže dopátrat se jejich seznamu nebyl problém. Nás zajímaly pouze hraniční přechody silniční. I když jsme ale do našeho skriptu zadali různé podoby názvu hraničního přechodu, např. hraniční přechod Dolní Dvořiště, Dolní Dvořiště — Wullowitz, Dolní Dvořiště, CLO, žádné GPS souřadnice jsme z něj nedostaly. Nakonec se Helči podařilo najít na internetu soubor ve formátu gpx se souřadnicemi jednotlivých hraničních přechodů, z něhož jsme pomocí skriptu v Pythonu souřadnice vydolovaly.
Následně bylo potřeba spočítat vzdálenost školky od každého hraničního přechodu a vybrat tu nejmenší z nich. Tento krok jsme nakonec udělaly ve Snowflake, kde jsme pomocí CROSS JOIN napárovaly ke každé školce každý hraniční přechod a s pomocí agregační funkce MIN vybrali pro konkrétní školku vždy jen tu nejmenší hodnotu.
CREATE OR REPLACE TABLE "MS_DE_Bav_vzdalenosti" AS
SELECT 'Německo' AS STAT
,MS.NAZEV
,MS.ADRESA
,MS.KAPACITA
,MS.WEB
,MS.AKTUALNI_OBSAZENOST
,MS.LATITUDE
,MS.LONGITUDE
,MIN(ROUND(HAVERSINE(HP.LATITUDE,HP.LONGITUDE,MS.LATITUDE,MS.LONGITUDE))) AS VZDALENOST_OD_HRANIC
FROM "MS_DE_BAV_2" AS MS
CROSS JOIN "souradnice_HP" AS HP
GROUP BY MS.NAZEV, MS.ADRESA, MS.KAPACITA, MS.WEB, MS.AKTUALNI_OBSAZENOST, MS.LATITUDE, MS.LONGITUDE
HAVING VZDALENOST_OD_HRANIC < 50
;
Po nahrání všech souborů do Tableau a vykreslení školek do mapy jsme zjistily, že nám jich několik uteklo do jiných států nebo i na jiné kontinenty. Vzhledem k jejich malému množství jsme přistoupily k ruční úpravě souřadnic. Poté jsme ještě pomocí dotazu v SQL vybraly pro každou oblast pouze školky, které byly od hraničního přechodu vzdáleny maximálně 50 km.
Tímto jsme se dostaly ke 4 souborům — za Česko, Rakousko, Bavorsko a Sasko, které obsahovaly pouze mateřské školy vzdálené maximálně 50 km od hraničního přechodu.
Další velká část práce s daty se věnovala odhadu obsazenosti německých a rakouských školek v budoucích letech na základě aktuální porodnosti. Pokud by se ukázalo, že v příštích letech budou v určitých školkách volné kapacity, otvíral se zde prostor pro oslovení jejich zřizovatelů, kteří by mohli nabídnout několik míst pro děti z České republiky. Predikci jsme chtěly získat použitím lineární regrese a machine learning, které jsme provedly přes skript v Pythonu s použitím modulu statsmodels pro různé datasety (část Bavorska, celé rakouské příhraničí, jedna obec za několik let zpětně).
import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.api as sm
from statsmodels.formula.api import ols
import seaborn
import matplotlib.pyplot as plt
import numpy as np
#vykresleni grafu zavislosti obsazenosti skolek na porodnosti
df = pd.read_csv("regrese_AT.csv")
df["narozene_deti"] = df["2016"] + df["2017"] + df["2018"] + df["2019"]
X=df[['2016', '2017', '2018', '2019']]
g = seaborn.JointGrid(data=df, x="narozene_deti", y="OBSAZENOST")
g.plot_joint(seaborn.scatterplot, legend=False)
plt.show()
df = pd.read_csv("regrese_AT.csv")
#do osy X vstupuji pocty narozenych deti, ktere v roce 2021 mohou navstevovat skolku
#model vyhodnoti, v jake mire se tyto rocniky podileji na obszenosti
df["total"] = df["2015"] + df["2016"] + df["2017"] + df["2018"] + df["2019"]
print(df.head())
X=df[['2015','2016', '2017', '2018', '2019']]
Y=df["OBSAZENOST"]
model=sm.OLS(Y,X).fit()
print(model.summary())
#lze otestovat i RLM: model=sm.RLM(Y,X).fit()
#test predikce na stavajicich datech
predictions=model.predict(X)
print(predictions)
#predikce pro rok 2023
df1 = pd.read_csv("regrese_AT.csv")
df1["total"]= df1["2017"] + df1["2018"] + df1["2019"] + df1["2020"] + df1["2021"]
X1=df1[['2017','2018', '2019', '2020', '2021']]
predictions=model.predict(X1)
print(predictions)
Jakkoli je z vygenerovaného grafu vidět jasná závislost, vstupní data i model ale nenabízí dostatečnou přesnost z hlediska predikcí.
Predikovaná obsazenost při testu se stávajícími daty se bohužel liší od jejich reálné obsazenosti u jednotlivé školky až o 10 dětí, což byla pro naši potřebu příliš velká odchylka. Výsledkem je ovšem po podrobnějším zkoumání dat i konzultaci místní situace i zjištění, že některé děti chodí do školky jinam, než kde se narodily (př. rodiče dojíždí do práce, v místě mají prarodiče) či do hry vstoupí větší počet cizinců. To už by ale byla otázka pro další analýzu.
Rády bychom moc poděkovaly našemu lektorovi Jirkovi Pešíkovi, který nás při této části neúnavně podporoval při nalezení optimálního řešení. Datasety jsme otestovaly i na jím napsaném kódu s využitím modulu scikit-learn, také bohužel bez dostatečně přesných výsledků.
Protože počátečním cílem projektu mělo být zmapování míst pro české děti v německých a rakouských školkách, chtěly jsme se aspoň pokusit o získání těchto dat, která nejsou nikde centrálně evidována. Rozeslaly jsme dotazník na školky ve vzdálenosti do 15 km od hraničních přechodů. Zjišťovaly jsme, kolik míst nabízí konkrétní školka pro české děti, jak jsou tato místa aktuálně obsazená, z jakého důvodu případně tato místa nabízena nejsou a jakou mají zkušenost s jazykovou integrací těchto dětí. Bohužel míra odezvy byla jen 8 %. Nicméně zde se právě otevírá prostor pro návaznou spolupráci s dalšími institucemi.
Všechny výše zmíněné i nezmíněné kódy jsou k dispozici na https://github.com/ErasmusProSkolky.
Výstupy projektu
Pro vizualizaci dat jsme si zvolily Tableau. Celý výstup je dostupný na Tableau Public zde.
V úvodu je možné se prokliknout na dashboard dané země, respektive oblasti v případě Německa.
Dashboard obsahuje mapu, na níž jsou vykresleny jednotlivé školky a přehledovou tabulku. Uživatel si může stanovit požadovanou vzdálenost od hranic, nebo zvolit, zda má školka volná místa, případně zda byly v posledním roce přijaty i nějaké nespádové děti. Filtry se aplikují zároveň na mapu i tabulku.
Při kliku na školku v tabulce se zvýrazní bod školky na mapě. Toolbar u každé položky (v mapě i tabulce) obsahuje mimo jiné odkaz na Google Maps a web školky, případně vyhledávání na Googlu, pokud jsme web školky neměly k dispozici. Pokud uživatel klikne na školku v tabulce zvýrazní se mu bod na mapě.
Cílem projektu bylo také zmapování míst pro české děti v německých a rakouských školkách. Zjišťovaly jsme, kolik míst nabízí konkrétní školka pro české děti, jak jsou tato místa aktuálně obsazená, z jakého důvodu případně tato místa nabízena nejsou a jakou mají zkušenost s jazykovou integrací těchto dětí. Sesbíraná data jsme zobrazily opět na mapě a doplnily přehledovou tabulkou. U této sekce vidíme prostor pro spolupráci na dalším sběru dat a popularizaci tématu s některou z níže zmíněných organizací.
Další směřování projektu
V rámci projektu jsme se věnovaly ze sousedních zemí pouze Rakousku a Německu. Z pohledu českých rodičů nám přišla atraktivní především možnost naučit děti nenásilnou formou němčinu. Projekt by se dal rozšířit i na polské a slovenské příhraniční oblasti. V tomto poslední jmenovaném případě by pak mohla být přínosnost především v praktičnosti pro rodiče, kdy pro ně slovenská školka může být dostupnější (dopravně nebo i kapacitně) než ta česká.
Rády bychom se v závěrečném týdnu Digitální akademie obrátily na několik institucí jako je Tandem, Stiftung Jugendaustausch Bayern, Česko-německý fond budoucnosti či Bavorské zastoupení v Praze, zda by je neoslovil výstup našeho projektu popř. neviděli možnost nějakého smysluplného pokračování.
Rozdělení práce na projektu
Helena Svobodová
Při sbírání dat jsem se zaměřila na Bavorsko, Sasko a Rakousko, u části z nich jsem se věnovala i jejich čištění v SQL. Konkrétně se jednalo o seznamy školek s jejich adresami, informace o obsazenosti a kapacitě, data k porodnosti v jednotlivých obcích, později také údaje o počtu obyvatel v naší cílové skupině.
Ve statistice mě zaujalo téma lineární regrese a šance použít ji právě pro predikci volných míst ve školkách na základě porodnosti. A po pravdě řečeno také chuť vyzkoušet si cokoli do směru machine learning :-) Nastudovala jsem si fungování modelu statsmodels, využila ho k vytvoření kódu a testovala ho na několika sadách dat pro Bavorsko a Rakousko.
Po dokončení regrese jsem si mohla vyzkoušet celý proces generování souřadnic pro oblast Dolního Rakouska, doplnění chybějících souřadnic pomocí GPSvizualizer a stažení výsledných školek po výpočtu vzdálenosti od nejbližších hraničních přechodů ze Snowflake. V SQL jsem pak přiřadila údaje ohledně obsazenosti školek v rakouských obcích již ke konkrétním školkám. K tomuto datasetu jsem v SQL přiřadila počty narozených dětí a závěrem na něm ještě vyzkoušela lineární regresi.
Zainvestovala čas do sestavení dotazníku přes Google Forms a jeho rozeslání na jednotlivé školky, počítám také s oslovením institucí, kterým by mohlo být téma projektu blízké.
Práci v Tableau jsme se věnovaly společně. Zde mě nejvíce zaujala část vizualizace odkazů na webové stránky jednotlivých školek a na Google Maps pomocí jednotlivých souřadnic.
Lenka Hanková
V části sběru dat jsem se věnovala získání dat za Českou republiku, která jsem pak následně i připravila pro další práci. Pomocí Kebooly a Snowflake jsem data, s nimiž jsme chtěly dále pracovat, propojila do jedné tabulky.
Zatímco se Helča věnovala regresi, já jsem se vrhla na generování souřadnic z adres školek. Základní skript jsme nastavili na rvním hackatonu s naším mentorem a já jsem následně pro každou zemi, respektive oblast, kod upravila, protože soubory měly rozdílnou strukturu. Adresy, které se nevygenerovaly jsem pak upravila pomocí skriptu pro použití ve webové aplikaci https://www.gpsvisualizer.com/geocoder/ a dalším skriptem dodatečně vygenerované souřadnice doplnila do již existujícího souboru k ostatním. S úpravou adres dodatečně vygenerovaných v GPSvizualizer mi pak pomohla Helča, která v té době již měla ukončenou práci na regresi a vygenerovala komplet souřadnice i pro oblast Dolních Rakous. Díky této části jsem si dokonale procvičila a taky rozšířila znalosti získané v průběhu akademie v oblasti programování v Pythonu.
Všechny soubory jsem pak nahrála do Kebooly, propojila do Snowflake a provedla v něm výpočet na vzdálenost školky od nejbližšího hraničního přechodu. Pronikla jsem tedy také do tajů Kebooly.
Práci v Tableau jsme se věnovaly společně. Vytvářela jsem například filtry a také kalkulovaná pole, díky kterým se v případě, že nebyla dostupná webová adresa, doplnila do buňky adresa odkazující na vyhledání dané mateřské školy v Googlu.
Zdroje informací a dat
- Česko: adresář škol a školských zařízení dostupný na http://stistko.uiv.cz/registr/vybskolrn.asp, data k zápisům do předškolního vzdělávání za rok 2021 poskytnutá panem Stanislavem Volčíkem z MŠMT
- Rakousko: https://www.statistik.at/statistiken/bevoelkerung-und-soziales/bildung/kindertagesheime-kinderbetreuung (pod složkou Weiterführende Daten)
- Bavorsko: https://www.statistikdaten.bayern.de/genesis/online/ a data poskytnutá paní Viktorií Treuheit (Bayrisches Landesamt für Statistik) — tento zdroj velmi doporučuji
- Sasko: https://www.statistik.sachsen.de/genonline/online a data poskytnutá paní Renatou Recknagel (Statistisches Landesamt des Freistaates Sachsen)
Poděkování
Rády bychom poděkovaly našemu mentorovi Karlu Minichbauerovi za konzultace v průběhu celého projektu a lektorovi Jiřímu Pešíkovi za konzultaci při práci na lineární regresi. V neposlední řadě chceme poděkovat také našim rodinám, že s námi v období realizace projektu měli trpělivost a podporovali nás.