top of page

DATASETY

Veškerá zpracovávaná data pochází z veřejných zdrojů:

  • Dopravní nehody v Jihomoravském kraji v letech 2016-2018 (Policie České republiky)

  • Seznam měřených úseků v Brně (Městská policie Brno) - seznam míst, kde policisté měří překračování nejvyšší povolené rychlosti

IMPORT NEHOD

Data o dopravních nehodách v Brně v letech 2016-2018 jsme získaly ze stránek Policie České republiky. Šlo o čtyři soubory:

  • Číselník ve formátu xlsx

  • Tři soubory ve formátu csv, z nichž každý obsahuje údaje o dopravních nehodách v Jihomoravském kraji za jeden z uvedených roků

Číselník obsahuje legendu ke každému ze souborů ve formátu csv. Skládá se ze 2 listů: Seznam polí a Položky. V listu Seznam polí jsou kódy záhlaví tabulky o nehodách.

hlavicka.png

Význam kódů z hlavičky je v listu Položky. Ve stejném listu jsou i číselníky dimenzí.

legenda.png

Samotný obsah tabulky (data o nehodách) je v souborech ve formátu csv.

obsah_tabulky.png

Vzhledem k několika málo atributům z celkového počtu (57), které z datasetu využíváme, jsme si s pomocí číselníku vyhledaly jejich význam. Pomocí funkce get_dimension(code) jsme si vytvořily slovník, do kterého jsme ukládaly jednotlivé číselníky.

Kromě hlavní tabulky s nehodami tedy vznikly dimenzionální tabulky: charakter, zavineni, alkohol, druh_vozidla a ta nejdůležitější dimenze hlavni_pricina. Jednotlivé příčiny, které zavinily nehodu, jsou rozdělené do kategorií, a proto je na tuto tabulku ještě navázaná tabulka kategorie_hlavni_pricina.

Každá nehoda má mj. atributy souradnice_x a souradnice_y. Tyto souřadnice jsou uvedené v souřadnicovém systému S-JTSK/Krovak. Pro další práci s prostorovými daty jsou vhodnější souřadnice v systému WGS84. Proto jsme tyto souřadnice transformovaly pomocí funkce krovak_to_wgs84(souradnice_x, souradnice_y), která k řešení využívá knihovnu shapely a nové hodnoty: souradnice_lat a souradnice_long jsme do tabulky přidaly jako nové atributy.

Abychom si při práci s daty mohly vyfiltrovat pouze brněnské nehody a také katastrální území a zároveň pro porovnávání míst nehod a úseků, vytvořily jsme si další funkce:

  • get_address(latitude, longitude) – funkce provede request API reverse.geocoder.api.here.com a vrátí slovník s informacemi o lokalitě (stát, kraj, město, katastrální území, ulice, číslo domu, PSČ). Záměrně vracíme celý slovník, kdyby se nám hodily ještě další informace o lokalitě. 

 

Následující funkce vrací informace, které potřebujeme pro filtrování a porovnávání:

  • get_city_district(address) – vrátí katastrální území

  • get_city(address) – vrátí město

  • get_street(address) – vrátí ulici

  • get_house_number(address) – vrátí číslo domu

První skript z roku 2016 obsahoval kromě vkládání hodnot i vytvoření tabulek. Další skript směřující k automatizaci obsahoval pouze vkládání hodnot. Je tedy možné tento skript využít pro další vkládání dat v příštím roce a v dalších letech.

IMPORT MĚŘENÍ

Zaradovaly jsme se, když jsme na stránkách Městské policie Brno našly seznam měřených úseků.

ukazka_mereni.png

Zdálo se, že jde o skvělý zdroj a zároveň příležitost vyzkoušet si web scraping. Připravily jsme si importovací skript a až v průběhu vylaďování skriptu jsme zjišťovaly, že v tabulce je mnoho chyb a  skript na web scraping jednoduchoučké tabulky s 82 záznamy se natáhl na 300 řádků.

Atribut „Ulice“ byl pomocí regulárních výrazů rozdělen do více atributů, aby informace uvedená v každém z nich byla atomická (ulice, zacatek, konec, mapa). Názvy ulic by bylo vhodné vybírat ze seznamu brněnských ulic, aby se předešlo různým překlepům. Další prostor pro vyladění, aby se s daty dalo lépe pracovat, by bylo místa krajních bodů úseků definovaných názvy ulic, které se křižují, určit přesněji pomocí souřadnic těchto bodů.

Z atributu „Limit“  byla pomocí regulárního výrazu vyextrahována pouze číselná informace bez jednotky (km/h), aby se se vzniklým číslem dalo dále pracovat, kdyby to bylo potřeba.

Kvůli poslednímu atributu „Důvod měření“ jsme pozměnily datový model a vytvořily jsme pro tento atribut dekompoziční tabulku a číselník.

Aby bylo možné měřené úseky zobrazit v mapě, bylo potřeba krajním bodům úseků přiřadit souřadnice. K těmto účelům jsme si vytvořily funkci get_crossroads_wgs84_coordinates(street_1, street_2) s argumenty názvů ulic křižovatky, která provede request API geocoder.api.here.com a vrátí WGS84 souřadnice tohoto místa.

Dalším krokem k úspěšnému vykreslení úseků bylo potřeba ke každému úseku kromě krajních bodů přiřadit ještě body, které jsou mezi krajními body. Pomocí vytvořeného algoritmu jsou získané body od sebe vzdálené maximálně 2 metry. K tomuto účelu jsme vytvořily funkci get_route_points(start_lat, start_long, end_lat, end_long), která provede request API dev.virtualearth.net a vrátí pole s tuply (dvěma dvojicemi souřadnic začátku a konce úseku). Čím byl rovnější úsek mezi jednotlivými body, tím vzdálenější byly tyto body od sebe. Abychom měly body úseků vzdálené od sebe maximálně 2 metry, došlo uvnitř této funkce k volání funkce get_distance(start_lat, start_long, end_lat, end_long), která u každého přidávaného bodu ověřila, zda je vzdálenost menší než 2 m. V případě, že to bylo potřeba, úsečka mezi těmito dvěma body se proložila dalšími body (dynamicky podle vzdálenosti). Toto obstarala funkce interleave_abscissa(start, end, distance).

Pro body úseků jsme si v databázi vytvořily další tabulku mereni_usek, do které jsme vložily jednotlivé body úseků s vazbou na jednotlivé úseky.

PŘÍPRAVA PODKLADŮ PRO MAPU

Myslely jsme si, že máme vyhráno. Máme připravená veškerá data a už zbývá jen jejich vizualizace s pomocí Power BI. Zjistily jsme však, že Power BI nedokáže ani zobrazovat úseky (v mapách zobrazuje pouze body) a stejně tak sloučení dvou vrstev map, které jsme potřebovaly pro vizualizaci překryvů měřených úseků a nehodovosti, standardní cestou pomocí Power BI není možné.

 

To nás ovšem neodradilo. Hledaly jsme, hodně jsme se ptaly a nakonec jsme řešení našly. Dokonce jsme vyřešily oba tyto problémy najednou, když jsme objevily mapový vizuál Mapbox, který umožňuje neomezeně vrstvit mapy na sebe a skýtá velké množství funkcinonalit vedoucích ke customizování mapy. Zároveň je možné nastavit zobrazení úseků (linií).

Pro vrstvu s měřenými úseky jsme využily data z tabulky mereni_usekData pro vykreslení polygonů katastrálních území jsme získaly z webových stránek ArcGIS Hub. Naimportovaly jsme si data o polygonech (katastralni_uzemi_id, latituda a longituda).

Bylo však ještě potřeba tomuto vizuálu data předpřipravit ve vhodné podobě: ve specifickém formátu geojson. Standardní geojson se Mapboxu nepozdával, a proto jsme si připravily dva skripty, které správný formát geojsonu upravily: useky_to_geojson a katastralni_uzemi_to_geojson.

DATOVÝ MODEL

V zobrazeném datovém modelu jsou všechna dosud naimportovaná data. Navíc jsou tu dvě analytické tabulky: nehodovost_a_mereni a efektivita_mereni. O těchto tabulkách se dozvíte více na další stránce věnující se analýze dat pomocí Pythonu.

datovy_model_mereni_a_nehody.png

VYTVOŘENÍ DATOVÉHO SKLADU

Vzhledem k tomu, že datový sklad je vhodnější strukturou pro provádění analýz než vytvořený transakční datový model, pro práci v Power BI jsme datový model do datového skladu transformovaly. Tento krok jsme realizovaly pomocí skriptu v SQL.

dwh_mereni_a_nehody.png

POMOCNÉ FUNKCE

Všechny funkce, které jsme si vytvořily v Pythonu, jsme uložily do pomocného modulu util.py.

bottom of page