Viktorija Mačiulytė, 2024-04-22
Meteorologija - mokslas apie atmosferos reiškinius, atmosferoje vykstančius procesus ir jų sąveiką su paklotiniu paviršiumi. Visuomenei meteorologija plačiau žinoma jos tyrimų aprėptyje esančiais terminais, kaip „orai“, „klimato kaita“, „potvyniai“, „audros“ ir pan. Neretai tuo pačiu kyla ir klausimai apie tai, kokia grėsmė kyla, koks bus orų poveikis poveikis.</br>
Nustatant meteorologinių sąlygų poveikį iškyla didelių iššūkių, nors sąsajos neretai yra (ar gali būti) numanomos. Tačiau neretai nėra taip lengva sąsajas atrasti dėl kai kurių meteorologinių duomenų trūkumo (ypač pavojingų, tokių kaip kruša, škvalas, ekstremalios liūtys ir pan.) ir ypatingai - dėl poveikio duomenų trūkumo, jų netikslumo ar net neprieinamumo. Taip pat tai riboja ir priežasties (meteorologinių reiškinių) ir pasekmės (poveikio) susiejimo kompleksiškumas ir sudėtingumas. O ir neretai gali būti sudėtinga atskirti duomenų triukšmą, kuris susijęs ne su orų poveikiu, o ne žmogaus veiksmais ar kitais faktoriais.
Dėl to šis tyrimas yra svarbus žingsnis plačiau žengiant meteorologinių sąlygų ir poveikio duomenų tyrimų link. Šis tyrimas padės giliau susipažinti su pradinių duomenų neapibrėžtumo, analizės ir interpretavimo metu kylančiais iššūkiais. O taip pat - atlikti Datacademy pilno duomenų analitikos kurso projektą:)
TIKSLAS - įvertinti meteorologinių sąlygų galimą poveikį registruotiems įskaitiniais autoįvykiams Lietuvoje 2017-2023 metais.
PIRMA HIPOTEZĖ. Daugiausiai autoįvykių įvyko vykstant pavojingoms meteorologinėms sąlygoms.
ANTRA HIPOTEZĖ. Autoįvykių statistikoje nurodomos meteorologinės sąlygos dažniausiai nurodytos tinkamai.
Metodikos santrauka
Pradiniai autoįvykių duomenys paimti iš Transporto kompetencijų agentūros (https://tka.lt/katalogas/eismo-ivykiu-statistika-lietuvoje/#tab-0). Duomenyse pateikiami įskaitiniai autoįvykiai, kuriuose žuvo arba buvo sužeistas bent vienas asmuo 2017-2023 m. Lietuvoje. Šie duomenys apjungti su valandiniais artimiausios meteorologijos stoties duomenimis, gautais iš Lietuvos hidrometeorologijos tarnybos (www.meteo.lt). Pradinių duomenų apdorojimas ir apjungimas atliktas 1_duomenu_apjungimas_importavimas_i_sql.ipynb ir 2_autoivykiu_ir_meteo_duomenu_apjungimas.ipynb užrašinėse. Autoįvykių ir meteorologiniai išmatuoti duomenys toliau analizuojami šioje užrašinėje vertinant: autoįvykių pasikartojimą analizuojamu laikotarpiu, statistikos duomenyse nustatytas meteorologines ir kelio dangos būklės sąlygas ir faktiškai išmatuotas meteorologijos stotyse.
Pagrindinių meteorologinių rodiklių trumpiniai:
import pandas as pd
import numpy as np
import sqlalchemy
import seaborn as sns
import matplotlib.pyplot as plt
import calendar
import datetime
# Išsaugotą byla nuskaitau dėl kompiuterinių resursų taupymo, nors galima būtų tęsti ir su tuo pačiu kintamuoju, kuris sukurtas antrame skripte.
autoivykiai_meteo = pd.read_csv(r"C:\Users\...\jupyter_files\projektas\autoivykiai_meteo.csv", sep=';', encoding = "utf-8-sig", decimal=',', index_col=0)
autoivykiai_meteo['autoivykio_laikas']= pd.to_datetime(autoivykiai_meteo['autoivykio_laikas'])
autoivykiai_meteo['autoivykio_laikas_00min']= pd.to_datetime(autoivykiai_meteo['autoivykio_laikas_00min'])
# Apjungiamos kelios dangos buklės kategorijos
autoivykiai_meteo["dangos_bukle_konv"] = autoivykiai_meteo["kelio_dangos_bukle"]
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"].isin(["Apledėjęs asfaltas", "Apledėjęs grindinys", "Apledėjęs žvyrkelis", "Apledėjusi kita danga"]), "dangos_bukle_konv"] = "Apledėjusi"
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"].isin([ "Apsnigta kita danga", "Apsnigtas asfaltas", "Apsnigtas grindinys", "Apsnigtas žvyrkelis"]), "dangos_bukle_konv" ] = "Apsnigta"
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"].isin(["Sausa kita danga", "Sausas asfaltas", "Sausas grindinys", "Sausas žvyrkelis"]), "dangos_bukle_konv"] = "Sausa"
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"].isin(["Šlapia kita danga","Šlapias asfaltas","Šlapias grindinys","Šlapias žvyrkelis"]), "dangos_bukle_konv"] = "Šlapia"
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"].isin(["Užterštas asfaltas","Užterštas grindinys"]), "dangos_bukle_konv"] = "Užteršta"
Tyrime naudojama 18-os meteorologijos stočių informacija
print(len(autoivykiai_meteo["art_stotis"].unique()), "stočių:" )
print(autoivykiai_meteo["art_stotis"].unique())
18 stočių: ['Laukuvos AMS' 'Varėnos AMS' 'Raseinių AMS' 'Telšių AMS' 'Kauno AMS' 'Ukmergės AMS' 'Vilniaus AMS' 'Šiaulių AMS' 'Klaipėdos AMS' 'Dotnuvos AMS' 'Panevėžio AMS' 'Kybartų AMS' 'Lazdijų AMS' 'Šilutės AMS' 'Utenos AMS' 'Biržų AMS' 'Dūkšto AMS' 'Nidos AMS']
pd.set_option('display.max_columns', None)
autoivykiai_meteo.describe() # exclude=[object, datetime]
zuvo | suzeista | autoivykio_laikas | plat_wgs | ilg_wgs | autoivykio_laikas_00min | t | vis_aws | snow_aws | t_0 | t_min_hw | t_max_hw | ws_max_hw | rr_per | rr_per_3val | rr_per_6val | rr_per_12val | snow_aws_per_3val | snow_aws_per_6val | snow_aws_per_12val | ws_max_hw_3val | t_0_3val | t_min_hw_3val | vis_aws_3val | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 20494.000000 | 20494.000000 | 20494 | 20494.000000 | 20494.000000 | 20494 | 20351.000000 | 20344.000000 | 20174.000000 | 20384.000000 | 20410.000000 | 20410.000000 | 20379.000000 | 20337.000000 | 20239.000000 | 20137.000000 | 19921.000000 | 20100.000000 | 19999.000000 | 19835.000000 | 20342.000000 | 20369.000000 | 20377.000000 | 20234.000000 |
mean | 0.056260 | 1.158046 | 2020-06-24 23:45:06.230116096 | 55.196691 | 23.862151 | 2020-06-24 23:17:05.685566464 | 11.420854 | 16744.536129 | 0.685536 | 13.790061 | 10.906247 | 11.940990 | 6.847176 | 0.096691 | 0.270236 | 0.474554 | 0.885352 | 0.705920 | 0.729686 | 0.767633 | 7.641259 | 12.257730 | 10.058875 | 15559.964070 |
min | 0.000000 | 0.000000 | 2017-01-01 03:48:00 | 53.646849 | 20.764696 | 2017-01-01 03:00:00 | -22.300000 | 67.000000 | 0.000000 | -18.800000 | -22.500000 | -22.200000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | -19.400000 | -23.200000 | 67.000000 |
25% | 0.000000 | 1.000000 | 2018-09-20 13:03:30 | 54.711266 | 23.245594 | 2018-09-20 13:00:00 | 3.500000 | 16178.000000 | 0.000000 | 3.400000 | 3.200000 | 3.900000 | 4.600000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 5.300000 | 2.700000 | 2.700000 | 11210.000000 |
50% | 0.000000 | 1.000000 | 2020-06-18 16:55:00 | 54.955506 | 23.978481 | 2020-06-18 16:30:00 | 12.100000 | 20000.000000 | 0.000000 | 13.400000 | 11.500000 | 12.600000 | 6.500000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 7.300000 | 11.700000 | 10.500000 | 19717.000000 |
75% | 0.000000 | 1.000000 | 2022-04-15 18:10:15 | 55.723318 | 25.204756 | 2022-04-15 17:45:00 | 18.800000 | 20000.000000 | 0.000000 | 22.800000 | 18.100000 | 19.500000 | 8.700000 | 0.000000 | 0.000000 | 0.000000 | 0.400000 | 0.000000 | 0.000000 | 0.000000 | 9.600000 | 20.400000 | 17.000000 | 20000.000000 |
max | 5.000000 | 21.000000 | 2023-12-31 16:57:00 | 56.437909 | 26.959662 | 2023-12-31 16:00:00 | 34.100000 | 20000.000000 | 31.000000 | 51.300000 | 33.300000 | 34.400000 | 25.300000 | 18.000000 | 35.000000 | 40.700000 | 45.100000 | 31.000000 | 32.000000 | 32.000000 | 26.100000 | 48.000000 | 33.100000 | 20000.000000 |
std | 0.257814 | 0.663037 | NaN | 0.548870 | 1.362334 | NaN | 9.288258 | 5740.237654 | 2.791513 | 11.590931 | 9.133323 | 9.443453 | 3.097132 | 0.543221 | 1.160637 | 1.702546 | 2.628084 | 2.834513 | 2.890254 | 2.973853 | 3.193751 | 10.966844 | 8.891871 | 6419.396872 |
ivykio_rusis = autoivykiai_meteo["ivykio_rusis"].count()
ivykio_laikas = pd.to_datetime(autoivykiai_meteo["autoivykio_laikas"].dt.strftime('%H:%M:%S'), format='%H:%M:%S').mean().strftime('%H:%M:%S')
t = round(autoivykiai_meteo["t"].mean(), 1)
t_0 = round(autoivykiai_meteo["t_0"].mean(), 1)
vis_aws = round(autoivykiai_meteo["vis_aws"].mean(), 1)
snow_aws = round(autoivykiai_meteo["snow_aws"].mean(), 1)
ws_max_hw = round(autoivykiai_meteo["ws_max_hw"].mean(), 1)
rr_per = round(autoivykiai_meteo["rr_per"].mean(), 1)
print(f" Iš viso 2017-2023 m. laikotarpiu užfiksuoti {ivykio_rusis} įskaitiniai (kai žuvo ar buvo sužeistas bent vienas asmuo) autoįvykiai Lietuvoje.\n Vidutinis laikas, kai įvyko eismo įvykis: {ivykio_laikas} \n Vidutinės meteorologinės sąlygos autoįvykio metu yra: \n vidutinė oro temperatūra (t) {t} C \n vidutinė paviršiaus oro temperatūra (t_0) {t_0} C \n vidutinis matomumas (vis_aws) {vis_aws} m \n vidutinis sniego dangos storis (snow_aws) {snow_aws} cm \n vidutinis maksimalus vėjo greitis (ws_max_hm) {ws_max_hw} m/s \n ir vidutinis valandos kritulių kiekis (rr_per) {rr_per} mm ")
Iš viso 2017-2023 m. laikotarpiu užfiksuoti 20494 įskaitiniai (kai žuvo ar buvo sužeistas bent vienas asmuo) autoįvykiai Lietuvoje. Vidutinis laikas, kai įvyko eismo įvykis: 14:31:58 Vidutinės meteorologinės sąlygos autoįvykio metu yra: vidutinė oro temperatūra (t) 11.4 C vidutinė paviršiaus oro temperatūra (t_0) 13.8 C vidutinis matomumas (vis_aws) 16744.5 m vidutinis sniego dangos storis (snow_aws) 0.7 cm vidutinis maksimalus vėjo greitis (ws_max_hm) 6.8 m/s ir vidutinis valandos kritulių kiekis (rr_per) 0.1 mm
Duomenyse yra 6 object tipo kintamieji (autoįvykius apibūdinantys duomenys), du laiko (autoįvykio datos ir valandos 00 min. kurią naudont buvo jungiami autoįvykių duomenys su meteorologiniais duomenimis. Likę - float tipo.
autoivykiai_meteo.info()
<class 'pandas.core.frame.DataFrame'> Index: 20494 entries, 0 to 20493 Data columns (total 31 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ivykio_rusis 20494 non-null object 1 ivykio_schema 20494 non-null object 2 zuvo 20494 non-null float64 3 suzeista 20494 non-null float64 4 paros_metas 20494 non-null object 5 meteo_salygos 20494 non-null object 6 kelio_dangos_bukle 20494 non-null object 7 autoivykio_laikas 20494 non-null datetime64[ns] 8 plat_wgs 20494 non-null float64 9 ilg_wgs 20494 non-null float64 10 art_stotis 20494 non-null object 11 autoivykio_laikas_00min 20494 non-null datetime64[ns] 12 t 20351 non-null float64 13 vis_aws 20344 non-null float64 14 snow_aws 20174 non-null float64 15 t_0 20384 non-null float64 16 t_min_hw 20410 non-null float64 17 t_max_hw 20410 non-null float64 18 ws_max_hw 20379 non-null float64 19 rr_per 20337 non-null float64 20 rr_per_3val 20239 non-null float64 21 rr_per_6val 20137 non-null float64 22 rr_per_12val 19921 non-null float64 23 snow_aws_per_3val 20100 non-null float64 24 snow_aws_per_6val 19999 non-null float64 25 snow_aws_per_12val 19835 non-null float64 26 ws_max_hw_3val 20342 non-null float64 27 t_0_3val 20369 non-null float64 28 t_min_hw_3val 20377 non-null float64 29 vis_aws_3val 20234 non-null float64 30 dangos_bukle_konv 20494 non-null object dtypes: datetime64[ns](2), float64(22), object(7) memory usage: 5.0+ MB
Čia vertinamas autoįvykių pasikartojimas atsiromis dienomis, savaitės dienomis ir mėnesiais.
Daugiausiai įskaitinių autoįvykių analizuojamu laikotarpiu įvyko 2021-05-12 ir 2020-09-25 d. (po 24 avarijas per dieną).
# Autoįvykių per dieną
autoivykiai_meteo.groupby("ivykio_data")["ivykio_data"].count().sort_values(ascending=False).head(10)
ivykio_data 2021-05-12 24 2020-09-25 24 2017-08-14 23 2020-09-11 22 2017-11-16 21 2021-10-29 21 2017-09-27 20 2022-05-13 20 2020-07-24 20 2023-09-29 20 Name: ivykio_data, dtype: int64
Per 2017-2023 m. laikotarpį daugiausiai avarijų vyko penktadieniais.
#Autoįvykiai savaitės dienomis
autoivykiai_meteo.groupby("sav_diena")["ivykio_data"].count().sort_values(ascending=False)
sav_diena 5 3423 3 3063 4 3013 1 3001 2 2973 6 2792 7 2229 Name: ivykio_data, dtype: int64
Daugiausiai autoįvykių įvykio šiltaisiais metų mėnesiais (rugpjūtis, birželis, rugsėjis, liepa).
# Autoįvykių per mėnesį
autoivykiai_meteo.groupby("menuo")["ivykio_data"].count().sort_values(ascending=False).head(10)
menuo 8 2236 6 2151 9 2064 7 2062 5 1936 10 1885 12 1601 11 1571 4 1390 1 1297 Name: ivykio_data, dtype: int64
Daugiausiai autoįvykių įvyko giedromis sąlygomis esant sausai kelio dangos būklei (11058 atv.). Antroje vietoje yra apsiniaukusios sąlygos su šlapia kelio danga (2608 atv.) (aktualu PIRMAI HIPOTEZEI).
#Autoįvykių skaičius pagal meteo sąlygas ir kelio dangos būklė
autoivykiai_meteo.groupby(["meteo_salygos", "dangos_bukle_konv"])["kelio_dangos_bukle"].count().head(60).sort_values(ascending = False) #head(60)
meteo_salygos dangos_bukle_konv Giedra Sausa 11058 Apsiniaukę Šlapia 2608 Sausa 2474 Lietus Šlapia 1827 Giedra Šlapia 715 Sniegas, kruša Apsnigta 346 Apsiniaukę Apsnigta 220 Giedra Apledėjusi 207 Apsiniaukę Apledėjusi 205 Lijundra Šlapia 169 Sniegas, kruša Šlapia 129 Giedra Apsnigta 129 Rūkas Šlapia 99 Sniegas, kruša Apledėjusi 51 Rūkas Sausa 43 Pūga Apsnigta 31 Lijundra Apledėjusi 28 Stiprus vėjas Sausa 23 Rūkas Apledėjusi 16 Stiprus vėjas Šlapia 14 Apledėjusi 13 Lijundra Apsnigta 12 Lietus Apledėjusi 12 Apsnigta 11 Pūga Apledėjusi 10 Lietus Sausa 10 Giedra Užteršta 9 Rūkas Apsnigta 8 Stiprus vėjas Apsnigta 6 Apsiniaukę Užteršta 6 Sniegas, kruša Sausa 3 Pūga Šlapia 1 Lijundra Sausa 1 Name: kelio_dangos_bukle, dtype: int64
Daugiausu žuvusių ir sužeistų asmenų buvo giedromis ir sauso kelio dangos sąlygomis (žuvo 529, sužeista 12736). Antroje vietoje yra apsiniaukusios, šlapios kelios dangos sąlygos (163 žuvo, 2978 sužeisti) (aktualu PIRMAI HIPOTEZEI).
#Autoįvykių skaičius pagal meteo sąlygas ir kelio dangos būklė
autoivykiai_meteo.groupby(["meteo_salygos", "dangos_bukle_konv"]).agg({"zuvo": "sum",
"suzeista": "sum"}).head(10).sort_values(by="suzeista", ascending = False)
zuvo | suzeista | ||
---|---|---|---|
meteo_salygos | dangos_bukle_konv | ||
Giedra | Sausa | 529.0 | 12736.0 |
Apsiniaukę | Šlapia | 163.0 | 2978.0 |
Sausa | 155.0 | 2773.0 | |
Giedra | Šlapia | 47.0 | 812.0 |
Apledėjusi | 12.0 | 279.0 | |
Apsiniaukę | Apledėjusi | 15.0 | 275.0 |
Apsnigta | 15.0 | 269.0 | |
Giedra | Apsnigta | 8.0 | 155.0 |
Užteršta | 0.0 | 11.0 | |
Apsiniaukę | Užteršta | 0.0 | 8.0 |
Vertinant autoįvykių skaičių, sužeistų ir žuvusių skaičių nustatyta, kad vyravo giedros ir sausos kelio dangos sąlygos. Tokie rezultatai kelia abejonių, nes skirtumai nuo kitų sąlygų siekia kartais. Atrodo, kad kad neproporcingai daug autoįvykių patenka į giedras ir sausos kelio dangos būklės kategorijas, nors Lietuvoje tokios sąlygos nėra dažnos. Sunku pasakyti kodėl tiek atvejų patenka į šitas dvi kategorijas. Nustatyta, kad daugiausiai autoįvykių įvyksta šiltaisiais metų mėnesiais, kuriais, galime daryti prielaidą, šiltos (~ giedros) ir sausos sąlygos gali pasitaikyti dažniau. Taip pat ateityje reiktų pasiaiškinti ar pildant autoįvykių duomenis ir tiksliai nežinant kokios iš tiesų sąlygos buvo, nėra kaip numatytosios reikšmės įvedamos "giedra ir sausa kelio danga", nes šiame tyrimo etape to įrodyti negalima. Dėl šių argumentų PIRMA HIPOTEZĖ atmetama kaip neteisinga.
Didesnė autoįvykių dalis, kuomet įvyko susidūrimas, kiti eismo įvykiai, užvažiavimas ant pesčiojo, kliūties, apvirtimas ir susidūrimas su stovinčia transporto priemone įvyko temperatūrai esant apie 0-5 C ir apie 15-18 C. Susidūrimas su dviračiu, mopedu ir tarp dviračių dažniau pasitaiko esant aukštensnei oro temperatūrai - 10-22 C, kas susiję su šių transporto priemonių naudojimo sezoniškumu.
sns.violinplot(x='t', y='ivykio_rusis', data=autoivykiai_meteo)
plt.show()
Vienos valandos kritulių kiekis (rr_per) neturi tokio išraiškingo dėsningumo kaip oro temperatūros atveju. Tai, tikėtina, susiję su dažnu kritulių apatinės ribos artimos 0 mm reikšmių pasikartojimu. Panaši situacija ir sniego dangos storiu (nepavaizduota).
sns.violinplot(x='rr_per', y='ivykio_rusis', data=autoivykiai_meteo)
plt.show()
Maksimalus vėjo greitis įvairių autoįvykių rūšių metu yra panašus. Dažnesnės mažesnio vėjo greičio reikšmės (apie 3-5 m/s) buvo susidūrimų tarp dviračių įvykių metu.
sns.violinplot(x='ws_max_hw', y='ivykio_rusis', data=autoivykiai_meteo)
plt.show()
Matomumas (galimas matyti atstumas) dažniausiai siekia apie 20000 m (arba 20 km = puikus matomumas), tačiau tai yra dėl to, kad ši riba yra dažniausiai pasikartojanti (viršutinė). Iš visų autoįvykių rūšių dažniau mažesnis matomumas fiksuotas užvažiavimo ant pesčiojo atvejais.
sns.violinplot(x='vis_aws', y='ivykio_rusis', data=autoivykiai_meteo)
plt.show()
IŠVADA: meteorologinės sąlygos pasižymi menkais dėsningumais vertinant kokios sąlygos vyravo tam tikrų autoįvykių rūšių atvejais.
Šiame poskyryje vertinama, kaip autoįvykių metu išskirtos ir statistikoje pateiktos meteorologinės sąlygos (y ašis) susijusios su artimiausioje meteorologijos stotyje išmatuotomis rodikių reikšmėmis (x ašis). Giedros sąlygos dažniau pasitaikė, kai buvo aukštesnė oro temperatūra (apie 15-25 C). Logiška, nes aukštesnio atmosferos slėgio dariniai (anticiklonai) atneša šiltas ir giedras sąlygas. Cikloninė cirkuriacija siejama su šaltesnėmis, apsiniaukusiomis ir neretai su krituliais oro sąlygosmis (grafike atsiniaukusios oro sąlygos dažnesnės esant temperatūros reikšmėms apie 0, bet pasitaiko ir 10-20 C intervale). Žiemos reiškiniai, kaip sniegas/kruša ir pūga - esant temperatūrai žemiau nulio. Iš dalies su tuo susijusi ir lijundra, tačia dažniausias jos temperatūros reikšmių intervalas yra kiek virš 0 C.
sns.violinplot(x='t', y='meteo_salygos', data=autoivykiai_meteo)
plt.show()
Autoįvykių statistikoke išskirti lijundros atvejai turi reikšmių ir >10 C, kas yra abejotina, nes lijundrai formuotis reikalinga temperatūra apie nulį šiek tiek teigiama. Be to, lijundai būdintas šaltasis metų laikas, o aukštesniame oro temperatūros ruože pasitaikę su lijundra sieti autoįvykiai vyko liepos-rugpjūčio mėn. Taip pat lijundrai yra būtina neigiama paviršiaus oro temperatūros (t_0) sąlyga. Tokie atvejai kelia įtarimų gali būti neteisingai identifikuotos meteorologinės sąlygos autoįvykių metu (bent jau pavieniais atvejais) (aktualu ANTRAI HIPOTEZEI).
autoivykiai_meteo[autoivykiai_meteo["meteo_salygos"] == "Lijundra"][["t", "t_0", "autoivykio_laikas"]].sort_values(by="t",ascending=False).head(10)
t | t_0 | autoivykio_laikas | |
---|---|---|---|
11053 | 25.7 | 26.0 | 2020-08-22 17:16:00 |
13477 | 21.3 | 20.9 | 2021-07-31 21:00:00 |
13585 | 21.3 | 23.3 | 2021-08-10 19:50:00 |
13568 | 18.7 | 18.3 | 2021-08-08 16:57:00 |
13556 | 18.6 | 19.4 | 2021-08-07 12:45:00 |
20347 | 17.9 | 18.1 | 2023-08-26 10:10:00 |
5167 | 17.3 | 18.4 | 2018-08-14 15:24:00 |
18632 | 17.0 | 18.9 | 2023-07-22 13:30:00 |
628 | 16.5 | 16.4 | 2017-07-27 05:39:00 |
13553 | 15.9 | 15.8 | 2021-08-07 00:40:00 |
Pagal aukštesnį grafiką taip pat abejotinos rūko reikšmės esant temperatūrai >10 ar 15 C.
autoivykiai_meteo[autoivykiai_meteo["meteo_salygos"] == "Rūkas"][["t", "t_0", "autoivykio_laikas"]].sort_values(by="t",ascending=False).head(10)
t | t_0 | autoivykio_laikas | |
---|---|---|---|
10136 | 21.0 | 19.6 | 2020-07-19 01:53:00 |
10629 | 17.1 | 15.5 | 2020-08-21 07:45:00 |
4638 | 15.6 | 14.8 | 2018-09-19 22:08:00 |
16717 | 15.4 | 15.4 | 2022-08-06 21:06:00 |
5596 | 15.3 | 16.3 | 2018-08-17 03:50:00 |
18490 | 14.4 | 13.8 | 2023-06-16 01:00:00 |
11861 | 14.3 | 12.7 | 2020-08-02 01:45:00 |
11854 | 14.2 | 14.4 | 2020-09-15 08:33:00 |
8598 | 13.5 | 12.0 | 2019-08-27 04:40:00 |
6778 | 12.8 | 11.3 | 2019-07-18 04:24:00 |
Giedra dažniau buvo tuomet, kai kritulių kiekis artimas nuliui, tačiau pasitaiko atvejų, kad kritulių kiekis per valandą (rr_per) galėjo būti ir ženklus (>5 mm). Tai gali būti susiję ir su duomenų kokybe, tačiau nereikia atmesti didelio kritulių nehomogeniškumo laike ir erdvėje požymio. T.y., priskirtoje artimiausioje stotyje galėjo lyti, o autoįvykio vietoje - ne. Kitomis išskirtomis meteorologinėmis sąlygomis kritulių kiekis yra logiškas (sniegas, kruša, lietus, lijundra, pūga).
sns.violinplot(x='rr_per', y='meteo_salygos', data=autoivykiai_meteo)
plt.show()
Atvejai, kai meteorologinės sąlygos nustatytos kaip giedros, o kritulių kiekis per valandą ar 6 val. buvo ženklus. Galima pastebėti, kad vienos valandos ir 6 val. kritulių kiekis atvejais, kai buvo giedros sąlygos, yra pakankamai artimas. Tai reiškia, kad 6 val. kritulių kiekis iškrito per vieną val. (rodo sąlygų pokytį).
autoivykiai_meteo[autoivykiai_meteo["meteo_salygos"] == "Giedra"][["rr_per","rr_per_6val", "meteo_salygos", "autoivykio_laikas"]].sort_values(by="rr_per",ascending=False).head(10)
rr_per | rr_per_6val | meteo_salygos | autoivykio_laikas | |
---|---|---|---|---|
13318 | 17.7 | 21.6 | Giedra | 2021-07-17 19:41:00 |
978 | 14.8 | 14.8 | Giedra | 2017-08-12 19:24:00 |
4000 | 10.7 | 10.7 | Giedra | 2018-06-11 17:07:00 |
13574 | 8.6 | 9.7 | Giedra | 2021-08-09 13:00:00 |
13575 | 8.6 | 9.7 | Giedra | 2021-08-09 13:10:00 |
4040 | 6.0 | 14.6 | Giedra | 2018-08-11 20:29:00 |
5613 | 5.3 | 5.3 | Giedra | 2018-08-05 14:20:00 |
10042 | 4.8 | 5.5 | Giedra | 2020-07-23 08:36:00 |
15838 | 4.2 | 8.7 | Giedra | 2022-07-28 13:30:00 |
13505 | 4.0 | 4.0 | Giedra | 2021-08-03 11:59:00 |
Sniego storis (snow_aws) buvo didesnis tais autoįvykių atvejais, kurie priskirtos sniego/krušos, pūgos, stipraus vėjo (galima sąsaja su pūga, nes pūga yra sniegas + vėjas) meteorologinės sąlygos.
sns.violinplot(x='snow_aws', y='meteo_salygos', data=autoivykiai_meteo)
plt.show()
Autoįvykių metu artimiausiose meteorologijos stotyje nustatytas maksimalus valandos vėjo greitis (ws_max_hw) buvo mažesnis autoįvykių statistikoje priskirtais rūko atvejais. Tai iš dalies atitinka meteorologijos teoriją, kurioje nurodoma, kad rūkui formuotis palankus nestiprus vėjos (2-4 m/s). Pūgos ir stipriaus vėjo atvejais maksimalaus vėjo reikšmių intervalas vyrauja didesnio vėjo greičio skalės dalyje nei kitais atvejais. Likusių išskirtų meteorologinių sąlygų metu buvusių maksimalių vėjo reikšmių pasiskirstymas panašus.
sns.violinplot(x='ws_max_hw', y='meteo_salygos', data=autoivykiai_meteo)
plt.show()
IŠVADA: išskirtos meteorologinės sąlygos autoįvykių statistikoje neblogai atitinka reiškinių apibūdinimą ir jų pasikartojimą tam tikros oro temperatūros, vėjo ar kt. atvejais. Tačiau statistikoje pateikta klasifikacija kai kuriais atvejais prasilenkia su meteorologijos teorija ir turi būti atskirai analizuojami ir, esant reikalui, atmetami. Netikslumai galėjo atsirasti suvedant autoįvykių statistinius duomenis, o gal net ir jas įvertinant ir priskiriant autoįvykiui. Šiame tyrime meteorologinių grupių klasifikacijos tikslumo vertinimas ir duomenų tikslinimas nenumatytas, bet tai gali būti atliekama ateityje (aktualu ANTRAI HIPOTEZEI).
Arti nulio esanti ir neigiama temperatūra daugiausiai susijusi su apledėjusia, apsnigta kelio danga. Šlapia kelios dangos būklė daugiausiai buvo kai temperatūra viršijo 0 C, bet nesiekė 10 C (atitinka sniego, ledo tirpsmo ir mažo garavimo sąlygas). Sausa kelio dangos būklė daugiausiai fiksuota tuomet, kai vyravo šiltos orų sąlygos (apie 15-25 C), kas susiję su geresniu garavimu ir šiltesniais orais. (Kelio dangos būklė "užteršta" šiame tyrime nėra aktuali).
sns.violinplot(x='t', y='dangos_bukle_konv', data=autoivykiai_meteo)
plt.show()
Kritulių kiekis apledėjusios ir apsnigtos kelio dangos atvejais dažniau pasitaikė artimas 0. Šlapios dangos atveju kritulių kiekis per valandą buvo ir didesnis, tačiau keista, kad panaši situacija fiksuojama ir sausos kelio dangos metu. Verta prisiminti tyrimo pradžioje keltą problematiką ar giedros ir sausos kelio dangos sąlygos yra gerai identifikuojamos (aktualu ANTRAI HIPOTEZEI).
sns.violinplot(x='rr_per', y='dangos_bukle_konv', data=autoivykiai_meteo)
plt.show()
Kelio dangos būklė esant išmatuotai sniego dangai (snow_aws) buvo apledėjusi, apsnigta, šlapia ir, nors mažiau atvejų, tačiau ir sausos kelio būklės metu. Teoriškai tokia situacija įmanoma, tačiau esant sniego dangai ant kelio būklė turėtų būti priskiriama "apsnigta" kategorijai. Todėl atkreipiamas dėmesys į sausą kelio būklę (aktualu ANTRAI HIPOTEZEI).
sns.violinplot(x='snow_aws', y='dangos_bukle_konv', data=autoivykiai_meteo)
plt.show()
# paruošiama agreguota lentelė
auto_merged = autoivykiai_meteo.groupby(["meteo_salygos", "dangos_bukle_konv"]).agg({"t": "mean",
"t_0": "mean",
"rr_per": "mean",
"snow_aws": "mean",
"vis_aws": "mean",
"ws_max_hw": "mean"
}).round(1)
Toliau bus vertinamos vidutinės išmatuotos meteorologinės sąlygos autoįvykių metu nustatytoms sąlygos ir kelio dangos būklei.
Grupuotoje lentelėje pateiktas oro ir dirvožemio paviršiaus temperatūros, kritulių kiekio, sniego dangos storio, matomumo ir maksimalaus vėjo greičio vidurkiai pagal autoįvykių metu išskirtas meteorologines sąlygas ir kelio dangos būklę (kategorijomis).
Galima pastebėti, kad iš esmės gautos reikšmės didesne dalimi atitinka meteorologinę logiką. Pavyzdžiai.
cm = sns.light_palette("green", as_cmap=True)
auto_merged.style.format(precision=1).background_gradient(cmap=cm)
t | t_0 | rr_per | snow_aws | vis_aws | ws_max_hw | ||
---|---|---|---|---|---|---|---|
meteo_salygos | dangos_bukle_konv | ||||||
Apsiniaukę | Apledėjusi | -1.3 | -1.2 | 0.0 | 2.6 | 12744.8 | 6.9 |
Apsnigta | -3.0 | -1.9 | 0.1 | 7.4 | 9471.7 | 6.7 | |
Sausa | 10.3 | 11.4 | 0.0 | 0.2 | 17743.6 | 6.8 | |
Užteršta | 6.9 | 6.5 | 0.0 | 2.7 | 16320.7 | 4.9 | |
Šlapia | 5.6 | 5.8 | 0.1 | 1.3 | 13757.7 | 7.2 | |
Giedra | Apledėjusi | -1.7 | -1.2 | 0.0 | 2.9 | 15003.6 | 6.7 |
Apsnigta | -5.5 | -2.4 | 0.1 | 10.5 | 13504.6 | 6.4 | |
Sausa | 15.9 | 19.8 | 0.0 | 0.1 | 19115.9 | 6.5 | |
Užteršta | 13.0 | 16.9 | 0.0 | 2.1 | 16941.4 | 6.5 | |
Šlapia | 5.2 | 6.0 | 0.1 | 1.5 | 15713.9 | 6.9 | |
Lietus | Apledėjusi | 1.1 | 0.7 | 0.6 | 1.1 | 10003.6 | 9.4 |
Apsnigta | 0.9 | 0.2 | 0.7 | 6.0 | 5806.1 | 8.3 | |
Sausa | 7.0 | 6.9 | 0.4 | 0.0 | 13836.5 | 7.6 | |
Šlapia | 8.6 | 8.6 | 0.5 | 0.3 | 12555.6 | 8.1 | |
Lijundra | Apledėjusi | -0.1 | -0.5 | 0.2 | 3.1 | 8496.2 | 8.5 |
Apsnigta | -0.1 | -0.4 | 0.6 | 3.6 | 4963.0 | 6.9 | |
Sausa | 7.5 | 7.9 | 0.0 | 0.0 | 2352.0 | 3.3 | |
Šlapia | 5.2 | 5.0 | 0.2 | 1.1 | 11354.2 | 7.9 | |
Pūga | Apledėjusi | -1.8 | -0.4 | 0.2 | 2.4 | 11373.1 | 13.0 |
Apsnigta | -2.7 | -1.8 | 0.6 | 5.9 | 4026.1 | 10.1 | |
Šlapia | -0.1 | 3.8 | 0.0 | 0.0 | 20000.0 | 10.3 | |
Rūkas | Apledėjusi | -1.0 | -1.4 | 0.1 | 4.4 | 5072.4 | 5.4 |
Apsnigta | -3.9 | -1.7 | 0.0 | 7.6 | 7438.9 | 5.4 | |
Sausa | 7.5 | 6.6 | 0.0 | 0.1 | 7422.7 | 3.1 | |
Šlapia | 3.4 | 3.3 | 0.0 | 1.4 | 3755.4 | 4.3 | |
Sniegas, kruša | Apledėjusi | -2.3 | -1.2 | 0.2 | 5.0 | 8081.6 | 8.2 |
Apsnigta | -2.2 | -1.4 | 0.4 | 6.0 | 5676.5 | 7.2 | |
Sausa | -2.5 | -1.5 | 0.0 | 0.0 | 11055.3 | 7.9 | |
Šlapia | -0.4 | -0.3 | 0.3 | 3.4 | 7823.0 | 7.9 | |
Stiprus vėjas | Apledėjusi | -2.4 | -1.5 | 0.0 | 4.6 | 14727.5 | 11.2 |
Apsnigta | -1.8 | -1.5 | 0.3 | 3.2 | 7848.5 | 10.4 | |
Sausa | 4.4 | 4.1 | 0.0 | 0.1 | 19413.3 | 11.7 | |
Šlapia | 3.3 | 3.5 | 0.2 | 0.8 | 14287.5 | 11.7 |
Pagal šias vidutines sąlygas duomenų prieštaravimo giedros metu buvusioms sausoms sąlygos nepastebima, nors prieš tai analizėje atskiri atvejai yra kvestionuotini. Bendrai, visos išmatuotos meteorologinės sąlygos siejasi su autoįvykiu metu nustatytomis meteorologinių sąlygų kategorijomis ir kelio dangos būkle, nors atskiri pavieniai atvejai ir nėra tinkami. Suprantant tyrimo metu apjungtų duomenų šaltinių neapibrėžtumus (pvz., artimiausios meteorologijos stoties duomuo nebūtinai atitinka autoįvykio metu buvusias sąlygas arba autoįvykio metu nustatytos meteorologinių sąlygų ar kelios dangos būklės kategorijos gali būti vizualiai netinkamai įvertintos) ir remiantis gautais rezultatais, ANTRA HIPOTEZĖ priimama kaip teisinga.
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.metrics import classification_report
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error
from sklearn import preprocessing
Šioje dalyje sudaromi keli modeliai, kuriais prognozuojama kelio dangos būklės kategorija (sausa, šlapia, apledėjusi, apsnigta [užteršta nenaudojama]) pagal išmatuotas meteorologinių rodiklių reikšmes.
# Atrenkami ir sutvarkomi pradiniai duomenys apmokymui ir parengiama duomenų imtis:
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"] == "Sausa", "dangos_bukle_konv1"] = 0
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"] == "Šlapia", "dangos_bukle_konv1"] = 1
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"] == "Apledėjusi", "dangos_bukle_konv1"] = 2
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"] == "Apsnigta", "dangos_bukle_konv1"] = 3
autoivykiai_meteo.loc[autoivykiai_meteo["dangos_bukle_konv"] == "Užteršta", "dangos_bukle_konv1"] = 4
autoivykiai_meteo["dangos_bukle_konv1"] = autoivykiai_meteo["dangos_bukle_konv1"].astype(int)
autoivykiai_meteo = autoivykiai_meteo.drop(autoivykiai_meteo[autoivykiai_meteo['dangos_bukle_konv'] == 'Užteršta'].index)
# prognozuojamas/priklausomas kintamasis
y1 = "dangos_bukle_konv1"
autoivykiai_meteo["dangos_bukle_konv"].unique()
array(['Apledėjusi', 'Apsnigta', 'Šlapia', 'Sausa'], dtype=object)
autoivykiai_meteo.head(3)
ivykio_rusis | ivykio_schema | zuvo | suzeista | paros_metas | meteo_salygos | kelio_dangos_bukle | autoivykio_laikas | plat_wgs | ilg_wgs | art_stotis | autoivykio_laikas_00min | t | vis_aws | snow_aws | t_0 | t_min_hw | t_max_hw | ws_max_hw | rr_per | rr_per_3val | rr_per_6val | rr_per_12val | snow_aws_per_3val | snow_aws_per_6val | snow_aws_per_12val | ws_max_hw_3val | t_0_3val | t_min_hw_3val | vis_aws_3val | dangos_bukle_konv | sav_diena | ivykio_data | menuo | dangos_bukle_konv1 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Susidūrimas | Susidūrimai judant ta pačia kryptimi | 0.0 | 1.0 | Tamsus paros metas | Giedra | Apledėjęs asfaltas | 2017-01-02 17:59:00 | 55.542831 | 22.284767 | Laukuvos AMS | 2017-01-02 17:00:00 | -0.6 | 20000.0 | 0.0 | -1.1 | -0.8 | 0.0 | 9.3 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 10.4 | -1.1 | -0.8 | 20000.0 | Apledėjusi | 1 | 2017-01-02 | 1 | 2 |
1 | Kiti eismo įvykiai | Nuvažiavimai nuo kelio | 0.0 | 1.0 | Tamsus paros metas | Giedra | Apsnigtas asfaltas | 2017-01-06 05:24:00 | 54.210509 | 24.563795 | Varėnos AMS | 2017-01-06 05:00:00 | -19.1 | 20000.0 | 14.0 | -0.6 | -19.5 | -18.9 | NaN | 0.0 | 0.0 | 0.0 | 0.0 | 14.0 | 15.0 | 15.0 | NaN | -0.6 | -19.5 | 19959.0 | Apsnigta | 5 | 2017-01-06 | 1 | 3 |
2 | Kiti eismo įvykiai | Kiti eismo įvykiai | 1.0 | 1.0 | Tamsus paros metas | Apsiniaukę | Apledėjęs asfaltas | 2017-01-08 04:33:00 | 55.113323 | 22.258615 | Laukuvos AMS | 2017-01-08 04:00:00 | -11.2 | 6251.0 | 0.0 | -1.8 | -12.2 | -10.1 | 2.3 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 5.2 | -1.8 | -12.2 | 6251.0 | Apledėjusi | 7 | 2017-01-08 | 1 | 2 |
Tiesinė regresija su vienu iš kintamųjų (oro temperatūra, dirvožemio paviršiaus temperatūra, kritulių kiekiu, sniego dangos storiu ar matomumu) demontruoja mažą modelio patikimumą (iki ~0.3).
x1 = "t_0"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]
X = a1[[x1]]
y = a1[[y1]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LinearRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
Model score test: 0.2940678032107227
x1 = "t"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]
X = a1[[x1]]
y = a1[[y1]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LinearRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
Model score test: 0.3158270129030327
x1 = "rr_per"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]
X = a1[[x1]]
y = a1[[y1]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LinearRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
Model score test: 0.021874891235001637
x1 = "vis_aws"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]
X = a1[[x1]]
y = a1[[y1]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LinearRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
Model score test: 0.27525709402672327
x1 = "snow_aws"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]
X = a1[[x1]]
y = a1[[y1]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LinearRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
Model score test: 0.21575918598654087
Tiesinė regresija su keliais kintamaisiais (oro temperatūra, dirvožemio paviršiaus temperatūra, kritulių kiekiu, sniego dangos storiu ar matomumu) demontruoja mažą modelio patikimumą (iki ~0.45).
#### VISI RODIKLIAI
rod = ["t","vis_aws", "snow_aws", "t_0", "ws_max_hw", "rr_per"]
a1 = autoivykiai_meteo.dropna(subset= rod)
X = a1[rod]
y = a1[[y1]]
### https://www.geeksforgeeks.org/multiple-linear-regression-with-scikit-learn/
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LinearRegression()
model.fit(X_train,y_train)
predictions = model.predict(X_test)
# model evaluation
print('mean_squared_error : ', mean_squared_error(y_test, predictions))
print('mean_absolute_error : ', mean_absolute_error(y_test, predictions))
print("Model score test:", model.score(X_test, y_test))
mean_squared_error : 0.2799807269057089 mean_absolute_error : 0.36974050098822275 Model score test: 0.46412929886924803
Logistinės regresijos patikimumas, naudojant dirvožemio paviršiaus temperatūros ir 3 val. kritulių kiekio nepriklausomus kintamuosius, siekia ~0.76. Sausos sąlygos (0) prognozuojamos gerai (precision ~0.83), o aplėdėjusios ir apsnigtos - beveik nenumatomos (<0.26)
x1 = "t_0"
x2 = "rr_per_3val"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]
a1 = a1[a1[x2].notna()]
X = a1[[x1, x2]]
y = a1[[y1]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LogisticRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
print("Model metrics test:", metrics.confusion_matrix(y_test, y_predicted))
print(classification_report(y_test, y_predicted))
Model score test: 0.7419728566699768 Model metrics test: [[3566 392 0 49] [ 746 903 0 13] [ 7 153 0 7] [ 2 190 0 14]] precision recall f1-score support 0 0.83 0.89 0.86 4007 1 0.55 0.54 0.55 1662 2 0.00 0.00 0.00 167 3 0.17 0.07 0.10 206 accuracy 0.74 6042 macro avg 0.39 0.38 0.38 6042 weighted avg 0.70 0.74 0.72 6042
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\utils\validation.py:1143: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel(). y = column_or_1d(y, warn=True) C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result)) C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result)) C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result))
Logistinės regresijos patikimumas, naudojant dirvožemio paviršiaus temperatūros, 3 val. kritulių kiekio ir matomumo nepriklausomus kintamuosius, siekia ~0.70. Geriausiai prognozuojamos sausos (0) ir iš dalies šlapios (1) sąlygos.
x1 = "t_0"
x2 = "rr_per_3val"
x3 = "vis_aws"
a1 = autoivykiai_meteo[autoivykiai_meteo[x1].notna()]
a1 = a1[a1[x2].notna()]
a1 = a1[a1[x3].notna()]
X = a1[[x1, x2, x3]]
y = a1[[y1]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LogisticRegression()
model.fit(X_train, y_train)
y_predicted = model.predict(X_test)
print("Model score test:", model.score(X_test, y_test))
print("Model metrics test:", metrics.confusion_matrix(y_test, y_predicted))
print(classification_report(y_test, y_predicted))
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\utils\validation.py:1143: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel(). y = column_or_1d(y, warn=True)
Model score test: 0.7543597409068261 Model metrics test: [[3738 217 0 41] [ 826 770 0 34] [ 65 92 0 15] [ 18 171 0 34]] precision recall f1-score support 0 0.80 0.94 0.86 3996 1 0.62 0.47 0.53 1630 2 0.00 0.00 0.00 172 3 0.27 0.15 0.20 223 accuracy 0.75 6021 macro avg 0.42 0.39 0.40 6021 weighted avg 0.71 0.75 0.73 6021
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED LIMIT. Increase the number of iterations (max_iter) or scale the data as shown in: https://scikit-learn.org/stable/modules/preprocessing.html Please also refer to the documentation for alternative solver options: https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression n_iter_i = _check_optimize_result( C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result)) C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result)) C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\metrics\_classification.py:1344: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior. _warn_prf(average, modifier, msg_start, len(result))
Logistinės regresijos patikimumas, naudojant visus penkis kintamuosiu, siekia ~0.76. Visi penki kintamieji nepagerina prognozavimo.
rod = ["vis_aws", "snow_aws", "t_0", "ws_max_hw", "rr_per"]
a1 = autoivykiai_meteo.dropna(subset=rod)
X = a1[rod]
y = a1[[y1]]
### https://www.geeksforgeeks.org/multiple-linear-regression-with-scikit-learn/
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LogisticRegression()
model.fit(X_train,y_train)
predictions = model.predict(X_test)
# model evaluation
print('mean_squared_error : ', mean_squared_error(y_test, predictions))
print('mean_absolute_error : ', mean_absolute_error(y_test, predictions))
print("Model score test:", model.score(X_test, y_test))
print(classification_report(y_test, predictions))
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\utils\validation.py:1143: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel(). y = column_or_1d(y, warn=True)
mean_squared_error : 0.42701525054466233 mean_absolute_error : 0.3070219540807776 Model score test: 0.7479470420646891 precision recall f1-score support 0 0.82 0.91 0.86 4006 1 0.58 0.47 0.52 1592 2 0.04 0.01 0.02 158 3 0.37 0.27 0.32 211 accuracy 0.75 5967 macro avg 0.45 0.42 0.43 5967 weighted avg 0.72 0.75 0.73 5967
C:\Users\Viktorija\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED LIMIT. Increase the number of iterations (max_iter) or scale the data as shown in: https://scikit-learn.org/stable/modules/preprocessing.html Please also refer to the documentation for alternative solver options: https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression n_iter_i = _check_optimize_result(
# cf_matrix = metrics.confusion_matrix(y_test, predictions)
# sns.heatmap(cf_matrix/np.sum(cf_matrix), annot=True,
# fmt='.2%', cmap='Blues')
# plt.show()
Išvada: logistinė regresija yra tinkamesnė nei tiesinė. Tačiau bendras modelio patikimumas gali tesiekti ~0.75 ir nelabai priklauso nuo naudojamų meteorologinių kintamųjų įvesties. Bet kokiu atveju, sausa kelio danga prognozuojama neblogai, šlapia - pusėtinai, tačiau panaudotas mašininis mokymasis nėra tinkamas žiemos meto kelio dangos prognozavimui (aplėdėjusi, apsnigta kelio danga).
PIRMA HIPOTEZĖ. Daugiausiai autoįvykių įvyko vykstant pavojingoms meteorologinėms sąlygoms - ATMESTA.
ANTRA HIPOTEZĖ. Autoįvykių statistikoje nurodomos meteorologinės sąlygos dažniausiai nurodytos tinkamai - PRIIMTA.
Apibendrinimas
Analizuojant įskaitinių autoįvykių Lietuvoje duomenis 2017-2023 m. nustatyta, kad daugiau autoįvykių įvyksta šiltojo sezono mėnesiais (birželis- rugsėjis). Daugiausiai autoįvykių įvyksta penktadieniais, mažiausiai pirmadieniais. Vidutiniškai autoįvykiai įvyksta 14:31:58 laiku. Daugiausiai autoįvykių įvyko giedromis sąlygomis esant sausai kelio dangos būklei (11058 atv.). Antroje vietoje yra apsiniaukusios sąlygos su šlapia kelio danga (2608 atv.). Daugiausiai žuvusių ir sužeistų asmenų buvo giedromis ir sauso kelio dangos sąlygomis (žuvo 529, sužeista 12736). Antroje vietoje yra apsiniaukusios, šlapios kelios dangos sąlygos (163 žuvo, 2978 sužeisti). Vidutiniškai išmatuotos meteorologinės sąlygos atititinka nustatytų sąlygų autoįvykių metu meteorologinę klasifikacija, tačiau yra atskiri atvejai, kurios reikėtų peržiūrėti ir įvertinti jų klasifikavimo tinkamumą. Tai atlikus gali pagerėti mašininio mokymo algoritmų gebėjimas suprognozuoti kelio dangos būklės sąlygas, nes kol kas prognozavimas yra ribotas. Taip pat ateityje galima naudoti daugiau nei 18 meteorologijos stočių duomenis.