No i się skończyło (Kompletne fiasko systemu za miliony złotych):
Decyzję o częściowym wypowiedzeniu umowy z wykonawcą NB Tricity podjął Zarząd Obszaru Metropolitalnego Gdańsk-Gdynia-Sopot. Powodem były między innymi niedotrzymywanie terminów w dostawach rowerów, usterki, czy brak dostępności jednośladów. -- Dalsza współpraca z nierzetelnym kontrahentem nie rodzi nadziei na poprawę, a dalsze czekanie na rozwój wydarzeń w spółce NB Tricity byłoby zbyt dużym ryzykiem dla publicznych pieniędzy -- czytamy w oświadczeniu OMGGS.
Własnością Obszaru Metropolitalnego są 1224 rowery, 660 stacji, system IT i całe oprogramowanie internetowe.
Rower Metropolitalny Mevo miał być najnowocześniejszym systemem roweru miejskiego w Europie.
Od siebie dodam że nie tylko miał być ale był. Przez pół roku:-) Co do majątku (rowery/stacje/ITsystem), to mniemam, że jest gówno warty (w szczególności system, który zgodnie z umową kosztował 600 tys PLN, LoL). Dane dotyczące wykorzystania MEVO, które zgromadziłem (kwiecień-październik) udostępniam tutaj.
Umbriel to mój serwer. W pliku crontab są następujące nastawy:
## co 120s */2 * * * * /home/tomek/bin/mevo_get.sh ## Codziennie 2:33 po północy 33 2 * * * /home/tomek/bin/mevo_process_yesterday.sh ## Raz w miesiącu 2:43 (musi być po mevo_process_yesterday.sh) 43 3 1 * * /home/tomek/bin/mevo_process_lastmonth.sh
Uruchamiany co 2 minuty mevo_get.sh
pobiera
(mevo_get_store.pl
) ze strony plik locations.js
, wyciąga
z niego najważniesze dane, które dopisuje do pliku YYYYMMDD_log.csv
Uruchamiany raz dziennie mevo_process_yesterday.sh
agreguje (robi to skrypt mevo_yesterday_f.pl
)
dane z pliku YYYYMMDD_log.csv
, które zapisuje
do pliku MEVO_DAILY_BIKES.csv
.
Zawartość MEVO_DAILY_BIKES.csv
jest następująca:
day;bikes;zb;dist.total;ga;gd;sop;tczew;rumia;s10111;s10111d;s10112;s10112d;zstat;sstat;\ gd0p;ga0p;sop0p;tczew0p;rumia0p;gd1p;ga1p;sop1p;tczew1p;rumia1p;slope3;\ slope5;stage2;stage4;stage6;stage8;stage10;stage12;stage14;stage16;stage18;stage20;stage99
gdzie:
bikes
-- łączna liczba rowerów dostępnych/wykazanych w ciągu dnia w plikach locations.js
;
zb
-- łączna liczba rowerów wykazanych, które nie były używane (zero-bikes);
dist.total
-- dystans łącznie (liczony po prostej);
ga/gd/sop/tczew/rumia
-- dystans łącznie (liczony po prostej dla miast; jeżeli rower
przejechał z miasta do miasta to każde miasto dostaje połowę);
s10111/s10112
--przeciętna liczba rowerów na stacjach s10111/s10112 liczona jako
$\sum_{i=1}^N r_i / N$ (N -- liczba pobrań pliku locations.js
, jeżeli pobrano wszystkie
to $24 \times 30 = 720$);
s10111d/s10112d
-- przeciętna liczba rowerów na stacjach s10111/s10112 w godzinach 5--23;
zstat
-- przeciętny odsetek stacji bez rowerów (zero-stations), liczony jako
$\sum_{i=1}^N s_i / (S \times N)$ (N -- liczba pobrań pliku locations.js
, $S$ -- liczba
stacji w systemie);
sstat
-- przeciętny odsetek stacji z maksimum jednym rowerem (single-stations), liczony
jako $\sum_{i=1}^N s_i / (S \times N)$;
gd0p/ga0p/sop0p/tczew0p/rumia0p
-- przeciętny odsetek stacji bez rowerów (zero-stations)
dla miast (gd/ga/sop/tczew/rumia). Liczony jak zstat tylko $S$ -- liczba stacji
w danym mieście oczywiście;
gd1p/ga1p/sop1p/tczew1p/rumia1p
-- przeciętny
odsetek stacji z maksimum jednym rowerem (single-stations)
dla miast (gd/ga/sop/tczew/rumia). Liczony jak sstat tylko $S$ to liczba stacji
w danym mieście oczywiście a nie ogółem;
slope3/slope5
-- łączny dystans przejechanych odcinków o nachyleniu przeciętnym 3%/5%;
stage2/stage4
itd --
łączny dystans przejechanych odcinków o dlugości 0--2km, 2--4km itd...
Następnie uruchamia skrypt mevo_daily_report.pl
, który
z pliku MEVO_DAILY_BIKES.csv
wyciąga ostatni i przedostatni dzień;
kompiluje raport dzienny tj. oblicza podstawowe statystyki,
tworzy raport tekstowy (ograniczony do 280 znaków bo Twitter więcej nie potrafi)
tworzy bardziej obszerny raport w formacie TeXa, konwertowany
później do obrazka (za pomocą XeTeXa/converta)
Publikuje na twitterze (twitter_post.py
) obrazek i ww raport tekstowy.
Następnie uruchamia skrypt mevo_yesterday_hr_f.pl
, który agreguje
dane z pliku YYYYMMDD_log.csv
w ujęciu godzinowym.
Zapisuje wynik do pliku MEVO_STAT_BIKES_HRS_YYYYMM.csv
(plik przechowuje zagregowane
dane godzinowe dla miesiąca). Ten skrypt niczego nie publikuje na twitterze
Plik MEVO_STAT_BIKES_HRS_YYYYMM.csv
ma następującą zawartość:
day;hr;bikes;nzstations;bikesGD;bikesGA;bikesSP;nzsGD;nzsGA;nzsSP
day/hr
-- dzień i godzina;
bikes
-- przeciętna liczba rowerów na wszystkich stacjach (definiowana jako
suma rowerów/suma pomiarów);
nzstations
-- przeciętna liczba stacji z minimum jednym rowerem (non-zero stations);
bikesGD/bikesGA/bikesSP
-- przeciętna liczba rowerów na stacjach w mieście
nzsGD/nzsGA/nzsSP
-- przeciętna liczba stacji
z minimum jednym rowerem w mieście
Wykonywany raz w miesiąc mevo_process_lastmonth.sh
uruchamia
mevo_monthly_report.pl
, który agreguje w skali miesiąca dane z pliku
MEVO_DAILY_BIKES.csv
; kompiluje raport miesięczny tj. oblicza
podstawowe statystyki, tworzy raport tekstowy i obrazek (w sposób
analogiczny jak raport dzienny) publikuje na Twitterze
(twitter_post.py
) obrazek i raport tekstowy.
Następnie uruchamia skrypt mevo_stat_bikes_hrs.pl
, który
konwertuje/łączy MEVO_DAILY_BIKES.csv
i MEVO_STAT_BIKES_HRS_YYYYMM.csv
do pliku MEVO_HRS.csv
. Na podstawie danych z pliku MEVO_HRS.csv
tworzone są wykresy, do czego wykorzystywany jest R.
Plik MEVO_HRS.csv
ma następującą zawartość:
dow;dowNN;hr;bikes;bikesGd;bikesGa;bikesSp;stats;statsGd;statsGa;statsSp;\ pbikes;pbikesGd;pbikesGa;pbikesSp;pstats;pstatsGd;pstatsGa;pstatsSp
gdzie:
dow
-- dzień tygodnia (0 -- powszedni; 1 -- święta, soboty i niedziele)
dowNN -- liczba dni powszednich i niepowszednich (w miesiącu)
hr
-- godzina
bikes/bikesGd/bikesGa/bikesSp
-- przeciętna liczba rowerów
na wszystkich stacjach i na stacjach w mieście;
stats/statsGd/statsGa/statsS
-- przeciętna liczba stacji
z minimum jednym rowerem ogółem i w mieście;
pbikes/pbikesGd/pbikesGa/pbikesSp
-- przeciętna % rowerów na stacjach ogółem
i w mieście (% średniej dobowej);
pstats/pstatsGd/pstatsGa/pstatsSp
--
przeciętny % stacji z minimum jednym
rowerem ogółem i w mieście (% średniej dobowej);
Konkretnie zaś uruchamiany jest R ze skryptem mevo_hrly.R
, który
generuje wykresy do pliku Mevo_hrly_YYYYMM.pdf
. Następnie
Mevo_hrly_YYYYMM.pdf
jest konwertowane (convert) do formatu
JPG (Mevo_hrly_YYYYMM-0.jpg
,
Mevo_hrly_YYYYMM-1.jpg
i Mevo_hrly_YYYYMM-2.jpg
).
Publikuje na twitterze (twitter_post.py
) Mevo_hrly_YYYYMM-*.jpg
Uruchamia R ze skryptem mevo_daily_bikes.R
.
Uruchamia R ze skryptem mevo_daily_zstats.R
.
Skrypty generują wykresy do plików mevo_daily_bikes.pdf
i mevo_daily_zstats.pdf
.
Pliku mevo_daily_bikes.pdf
/mevo_daily_zstats.pdf
są zamieniane na
format JPG.
Publikuje na twitterze (twitter_post.py
)
mevo_daily_bikes.jpg
/mevo_daily_zstats.jpg
.
Reasumując tworzone/wykorzystywane są następujące pliki danych:
YYYYMMDD_log.csv
(dzienny log dopisywany co 2min);
MEVO_DAILY_BIKES.csv
(dzienny log aktualizowany co 24h (o 2:33));
MEVO_STAT_BIKES_HRS_YYYYMM.csv
(dzienny log godzinowy aktualizowany co 24h (o 2:33))
MEVO_HRS.csv
(plik tymczasowy
z MEVO_DAILY_BIKES.csv
/MEVO_STAT_BIKES_HRS_YYYYMM.csv
(raz w m-cu))
Przy okazji się okazało że XeTeX na Debiana 4.9.51-1 (chyba Stretch)
w wersji Armel jest epicko spieprzony. Konkretnie nie może znaleźć fontów systemowych,
bo szuka jakiś dziwnych obciętych nazw.
Przykładowo Iwona-Reg.otf
nie znajduje, bo szuka Iwona-Reg.
.
Dziwaczny błąd. Zrobiłem link ln -s Iwona-Reg. Iwona-Reg.otf
i działa
bo mi się nie chciało tracić czasu na poprawienie tego lepiej.
Anyway za 4 ostatnie miesiące zbiorcza statystyka wygląda następująco (dystanse w tys km za wyjątkiem Dist/r -- miesięczny średni przebieg roweru w km):
YYMM Days Dist %Change Dist/r GD %Change GA %Change SOP %Change ------------------------------------------------------------------------ 201905 31 569.8 241.1 531.5 359.5 235.6 126.6 267.3 42.9 244.3 201906 30 856.9 150.4 677.4 501.4 139.5 220.5 174.2 76.2 177.7 201907 31 751.4 87.7 570.9 438.8 87.5 187.9 85.2 69.0 90.5 201908 31 781.0 103.9 592.3 466.5 106.3 180.3 96.0 73.3 106.3 ------------------------------------------------------------------------
Czyli najlepiej było w Czerwcu, bo jeżdżą wcale nie przyjezdni tylko miejscowi do roboty. Potwierdza to też zmienność tygodniowa (mniej się jeździ w soboty i niedziele). Połowa odcinków ma mniej niż 4km (liczone w linii prostej przypominam). Długość odcinków o nachyleniu 3% jest śladowa (a 5% to już ślad w śladzie). Resztę na wykresach widać...
Lotna inaczej p. Dulkiewicz, znana z tego, że usiłuje zaistnieć (bo o jakiś namacalnych że tak powiem osiągnięciach trudno na razie mówić, chociażby z tego powodu, że ostatecznie dopiero mija pół roku jak się świat dowiedział, że ktoś taki wybitny w ogóle istnieje) poucza marszałka Kuchcińskiego, że zamiast samolotem to powinien rowerem jak ona...
Chciała błysnąć a wyszło jak zwykle dotąd średnio (mówiąc oględnie), bo niby zamiast trwonić grosz publiczny latając ona jeździ rowerem więc wstydź się rozrzutny marszałku z PiSa. No ale kurcze nie swoim rowerem, tylko kupionym za publiczne, do tego cały projekt to modelowy przykład klapy (za cudze pieniądze). Więc zamiast siedzieć cicho (jak Szczurek czy inny Karnowski) przypomniała jaką to klapą/kompromitacją jest słynne MEVO.
Miało być 4000 rowerów jest 1500... O reszcie należy zapomnieć, bo bądźmy szczerzy: w czym leży nie-do-rozwiązania-od-miesięcy problem pt kupić i udostępnić te marne 2500 brakujących bajków, jak nie w braku kasy w NextBike czy jak oni się tam nazywają? Operatorowi oczywiście naliczają za niewywiązanie się z umowy kary, ale skoro on nie ma na rowery, to i na kary nie będzie miał (więc pewnie w stosownym czasie się wszystko się anuluje albo się ogłosi upadłość operatora i będzie po sprawie, i po pieniądzach wpompowanych w Misia pn. MEVO też)...
29 czerwca był upał i pierwszy raz w życiu zobaczyłem stację
MEVO literalnie zawaloną rowerami. Była 13:00. Po dojechaniu
do domu sprawdziłem, że rowerów było tam aż 24.
To mnie zainspirowało do sprawdzenia jak wygląda koncentracja rowerów na stacjach.
Na szybko zmajstrowałem skrypt wypisujący ile jest
rowerów na stacjach (rowery
), udział w całości
zaparkowanych w danym momencie (udzial
) oraz
udział w całości zaparkowanych w danym momencie
w tym konkretnym mieście (ludzial
):
Dla 29 czerwca 2019, godz 13:00 okazało się że:
stacja;wspolrzedne;miasto;rowery;udzial;ludzial S11358;18.57196808,54.40258423;Gdańsk;55;6.782;16.566 S11069;18.59038998,54.42794681;Gdańsk;24;2.959;7.229 S10100;18.57092997,54.44534256;Sopot;24;2.959;35.294 S11357;18.63640600,54.38637008;Gdańsk;18;2.219;5.422 S12007;18.53351997,54.49663118;Gdynia;16;1.973;7.843 S11186;18.57639103,54.39859534;Gdańsk;15;1.850;4.518 S10121;18.56255831,54.45392821;Sopot;13;1.603;19.118 S12126;18.47267507,54.54728035;Gdynia;13;1.603;6.373 S12053;18.54832346,54.51633152;Gdynia;13;1.603;6.373 S12054;18.54687652,54.51960321;Gdynia;12;1.480;5.882 S12033;18.56357898,54.48005340;Gdynia;10;1.233;4.902
Czyli na stacji 11358 było 55 rowerów co stanowiło 6,782% wszystkich zaparkowanych w systemie MEVO albo 16,566% zaparkowanych w Gdańsku. Dla Sopotu było nawet jeszcze lepiej bo na stacjach 10100/10121 było 24+13 (37 rowerów) ale było to 35,294 + 19.118, tj. prawie 55% wszystkich zaparkowanych w Sopocie (o godzinie 13:00). Dokładnie było 68 rowerów w 28 miejscach wtedy (27 stacji i jeden luźny bajk). Na 11 stacjach nie było nic a na 10 jeden rower.
Jest taka prosta miara koncentracji, co się nazywa w języku HH-Index, albo po polsku Wskaźnik Herfindahla-Hirschmana. Jest on nawet stosowany w USA do mierzenia koncentracji na rynku. Formuła jest banalnie prosta: dla $N$ wartości $x_i$ ($i=1...N$) sumujących się do 100 (czyli udziałów w całości), HHI liczy się jako: $\sum_{i=1}^N x_i^2$. Łatwo sprawdzić że HHI < 10000. Interpretacja jest taka, że HHI < 1000 wskazuje na słabą koncentrację, 1000 < HHI < 1800 umiarkowaną, a wartości większe od 1800 na dużą. BTW HHI da Sopotu o 13:00 (29/7/2019) wynosiło około 1850...
No to ja policzyłem HHI dla MEVO. Udziały były chwilowe, tj. $x_i = r_i/r_t$, dzie $r_t$ łączna liczba zaparkowanych rowerów na wszystkich stacjach w mieście $M$ (w danym momencie); no a $x_i$ to oczywiście liczba rowerów na stacji $i$. Potem uśredniłem, tj. wszystkie $HHI_i$ z godziny $h$ zsumowałem i podzieliłem przez liczbę pomiarów w tej godzinie (zwykle przez 30, bo pomiar jest co 2 minuty). Policzyłem oddzielnie dla GD/GA/Sopot/Tczew dla dni pracujących oraz dla świąt, sobót i niedziel osobno...
Wyniki dla maj--lipiec na wykresie (obok). Ciekawostkowo koncentracja w GD jest zaskakująco inna niż w GA. Teoretycznie im więcej stacji tym wartość HHI powinna być mniejsza, a tak nie jest: w GD wartość HHI wynosi w szczycie około 500, a w GA tylko 300. Szczyt wypada tak 9--11 zresztą. Można sobie wyobrazić, że użytkownicy jadą do pracy i zostawiając rowery przez biurami ogołacają stacje poza centrum a zapełniają te w rodzaju stacji o numerze 11358 (Gdańsk/Oliva Business Centre). W niedziele i święta do pracy nie jeżdżą to koncentracja jest mniejsza. Ma sens, ale nie w GA gdzie akurat w święta jest większa, wprawdzie chwilowo (w znaczeniu, że szybko rośnie ale potem równie szybko spada), ale jednak. Jakby w GA masowo jeździli gdzieś koło południa, a potem wracali z powrotem prawie że od razu... Mniejsza liczba stacji/rowerów w GA niż GD może powodować że wartość HHI ,,łatwiej'' rośnie...
W Sopocie i Tczewie jest znacząco mniej rowerów niż w GD/GA więc nic dziwnego że wartość HHI jest też dużo większa. BTW przeciętne dzienne wartości HHI są następujące (GD/GA/Sopot/Tczew): 170/222/1255/1143 (pon-piątek) oraz 93/225/1169/1200 (niedziele-soboty-święta). W Sopocie (poniedziałek--piątek) zmiany HHI są jeszcze inne niż w GD/GA. Amplituda jest mniejsza, a jedyny wyraźny dół jest rano około 5 a nie w godzinach 21--5 jak na przykład w GD. W niedziele i święta jest tradycyjnie jeden szczyt koło południa, a oprócz tego około 19--20 oraz 2--3 rano.
Skrypty i plik CSV z danymi jest tradycyjnie w archiwum GitHub
Na koniec przypomnienie,
że prezes obiecał na 18.08 +4000 rowerów w systemie. Na koniec
lipca wykazywane jest póki co: +1500 (niektóre w Warszawie albo w Cedrach Wlk.).
Z tej puli bajków (numerów bajków?)
codziennie pojawia się w pliku locations.js
+1350,
jeździ zaś mniej, około 1200 (reszta stoi).
Na 100 procent wszyscy
już wiedzą, że ni-chu-chu nie będzie 4000 rowerów nawet na 31 września,
ale media zachowują w tej sprawie zgodne milczenie.
Nikt nikogo nie pyta, a zwłaszcza prezesa.
Nie ma sprawy...
Miało nie być o MEVO do września, ale najechałem na stojący
w zasadzie w polu rower przed Chwaszczynem. Zrobiłem zdjęcie
i się okazało że figuruje on w bazie.
Przypomnę, że w poprzednim odcinku trylogii o MEVO
założyłem że plik locations.js
zawiera informacje nt stacji
oraz informacje o luźnych-rowerach-w-dziwnych-miejscach (np w Warszawie),
które postanowiłem pomijać. Że przypomnę:
[luźne-rowery] mają dziwną nazwę a w atrybucie bike
mają true (albo jeden), a w atrybucie spot mają
zero (czyli false).
Z tego wychodzi, że te stacje to nie są stacje tylko jakieś luźne rowery
pozasystemowe. Taką mam koncepcję...
Znalezisko spod Chwaszczyna podkopało moją wiarę w koncepcję. No bo jeżeli baza zawiera także rowery normalnie eksploatowane, ale nie parkowane na stacjach, to pomijam -- być może istotną -- część ruchu w systemie MEVO. Żeby ustalić w miarę szybko stan rzeczy wymyśliłem, że podsumuję pozycje wszystkich rowerów -- zarówno tych na stacjach i tych luźnych -- i zobaczę co wyjdzie. Konkretnie czy parkowanie poza stacjami to incydent, który można pominąć czy niekoniecznie oraz czy dzikie parkingi się skupiają w pewnych lokalizacjach, a jak się skupiają, to gdzie?
Plik locations.js
zawiera zmienną
NEXTBIKE_PLACES_DB
, która wygląda jakoś tak:
var NEXTBIKE_PLACES_DB = '[{"places":[ {"uid":14242676, "lat":52.281631111111, "lng":21.011891111111, "bike":true, "name":"Jagiellońska 88A", "address":null, "spot":false, "number":0, "bikes":1, "booked_bikes":0, "bike_racks":0, "free_racks":0, "special_racks":0, "free_special_racks":0, "maintenance":false, "terminal_type":""," bike_list":[{"number":"600262","bike_type":114, "lock_types":["frame_lock"], "active":true, "state":"ok", "electric_lock":true, "boardcomputer":7551015898, "pedelec_battery":62, "battery_pack":{"percentage":62}}], "bike_numbers":["600262"], "bike_types":{"114":1}, "place_type":"12", "rack_locks":false, "city":"Gdańsk-Wawa"}]}]';
Pole places
zawiera listę elementów,
z których każdy to opis miejsca, tj. stacji
lub pozycji luźnego roweru (dalej LB od luźnego-bajka).
Czy jest to stacja czy rower można wykoncypować
na podstawie wartości pola bike
(jeżeli true/1
to luźny rower).
Są ponadto
współrzędne miejsca (lat
, lng
);
numer miejsca (number
, lub zero dla LB)
liczba rowerów zaparkowanych w miejscu (bikes
);
lista numerów rowerów w miejscu (bike_numbers
);
nazwa miejscowości (city
).
Pole uid
to moim zdaniem unique id miejsca.
Zatem stacja ma numer, LB nie ma numeru.
Każda para współrzędnych ma
ten sam uid
.
W zasadzie jeżeli bike = true
, to
bikes=1
ale niekoniecznie i nie potrafię wykoncypować
co znaczy taki rekord:
{"uid":14302318, "lat":54.350404444444,"lng":18.586652222222, "bike":true, "name":"BIKE 99170", ... "bikes":0, ... city":"Gdańsk"}
Takich wpisów jest circa pięć więc pomijam wyjaśnienie tego
fenomenu. Robię skrypt parsujący apiać wszystkie pliki locations.js
pobrane w okresie maj--lipiec (ostatni miesiąc niekompletny). Skrypt zapisuje:
uid, numer, pozycję, miasto,
typ miejsca (stacja albo LB) oraz liczbę powtórzeń (liczba
wpisów dotyczących miejsca o współrzędnych lat/lng; każda stacja w tym okresie ma 53 tysiące wpisów.
LB ma mniej oczywiście.)
Dla czerwca wychodzi 20 tysięcy różnych
zarejestrowanych miejsc. Dla całego okresu 60 tysięcy (różnych).
Wyświetlenie 60 tys kropek na mapie nie będzie proste więc wymyśliłem sobie, że rozpocznę od zagregowania liczby ,,parkingów'' do rozsądnej wielkości rzędu kilku tysięcy. W pierwszym podejściu założyłem, że duża liczba miejsc parkowania to rezultat błędów w ustalaniu pozycji GPS i że pozycji będzie mniej jak się zmniejszy dokładność pomiaru. Konkretnie zamiast 8 cyfr spróbować zastosować 4 (tj. przykładowo 54.12345678 obciąć do 54.1234) i zobaczyć co wyjdzie.
Wyszło 40 tysięcy czyli redukcja taka sobie, ale ujawniły się dziwne miejsca koncentracji: w Gdańsku na ul. Pokoleń Lechii/Amber Expo, w Warszawie na ulicy Jagiellońskiej w okolicach numeru 88 oraz w Cedrach Wlk! W Cedrach na ul. Pionierów Żuław 42 (gdzie na Google Maps jest firma UEGZ). Wygląda, że wszystkie wymienione miejsca to stacje, tyle że serwisowe rowerów.
Ponieważ oprócz Warszawy LB sporadycznie są raportowane także, w różnych innych dziwnych miejscach, to wymyśliłem, że będę pomijał miejsca znajdujące się poza prostokątem o współrzędnych wierzchołków równych: 53.8/17.4 (dolny lewy) i 55.0/19.5 (górny prawy).
Na okoliczność LB z Pokoleń Lechii/Amber Expo dodałem warunek, że pomijane są także miejsca znajdujące się wewnątrz prostokąta o współrzędnych wierzchołków równych: 54.387395/18.630779 (górny lewy) i 54.385733,18.635221 (dolny prawy). Cedry zostawiłem w spokoju za to policzyłem kwantyle tych 40 tysięcy miejsc (bez 650 oficjalnych stacji):
kwantyl 25% 50% 75% 90% 95% 100% ------------------------------------------ wpisy 2 9 29 121 246 32760
Dwa wpisy to 4 minuty skoro każdy wpis jest co 2 minuty średnio. 50% miejsc było zajmowanych przez około 20 minut, a 5% wszystkich miejsc to parkingi na 8 godzin i dłużej (w ciągu 2,5 miesiąca przypominam) czyli dalej niewiele. Zamiast kombinować z dokładnością pomiaru można pominąć te miejsca które pojawiają się sporadycznie. Jeżeli za typowe przyjmiemy takie, które występują minimum 250 razy (około 5% największych wartości), to miejsc jest 2232 (w tym 650 stacji). Co ważniejsze udział wpisów dotyczących LB w całości wpisów to 5,6%. Spokojnie można tego nie analizować bo przecież i tak moje szacunki są przybliżone. A pominięcie LB ma tą zaletę że upraszcza rachunki. Na mapie te 5% najczęściej powtarzających się miejsc wygląda następująco:
Zostało osiem miejsc z liczbą wpisów większą od 5000, w tym 5 w Cedrach (gdzie jak już ustaliłem coś serwisują niechybnie). Te 3 duże dzikie parkingi to: Stężyca (2) oraz Sierakowice.
Reasumując: znalezisko spod Chwaszczyna niewiele zmienia. Nie będę uwzględniał w statystykach wykorzystania MEVO rowerów parkowanych poza stacjami.
Obiecuję ostatni wpis n/t Mevo. Następny po wakacjach, czyli po mitycznym 18 sierpnia (czemu mitycznym poniżej).
Obszerny wywiad z prezesem się ukazał 19 maja, ale ja go przeczytałem dopiero przedwczoraj (cały wywiad w repo na githubie, link poniżej). Prezes pisze, że:
26 marca na ulice wyjechały 1224 rowery [...] [Potem] liczba rowerów zaczęła spadać. Trafiały do serwisu, mieliśmy problem z ładowaniem. Zainteresowanie systemem w pierwszych dniach nas zaskoczyło [...] Zwiększyliśmy zatrudnienie do około 40 osób, przenieśliśmy serwis do większej hali w MTG. Codziennie wyjeżdża stąd około 250 rowerów. Przygotowujemy się do obsługi pełnej floty docelowych 4 tysięcy rowerów [...] Kolejne rowery planujemy dostarczać stopniowo, po 100-200-300 tygodniowo. Ostatnią partię dostarczymy 18 sierpnia.
Mój komentarz. Po pierwsze: czy wyjechało 1224 to ja nie wiem -- pewnie tak, ale w kwietniu średnio jeździło niecałe 800, a raczej jeździło 624 a 163 nie jeździło tylko było (wykazywane że są, ale nie przejechały nic). W tym kontekście twierdzenie prezesa, że przyczyną (wielokrotnie podkreślaną) problemów jest nadzwyczajne zainteresowanie rowerami jest cokolwiek niezborne ze stanem przygotowań. System jest sprawny na 800/4000 = 20%, a on jest zaskoczony, że rowerów brakuje. Nie wiem co prezes kończył za szkoły, ale z logiką na bakier jest... No i pytanie pomocnicze: gdyby wyjechało na przykład 2000 rowerów (w sensie wyjechało i jeździło) czyli 250% tego co jeździło (w kwietniu), to dalej byłaby klapa czy jednak nie? A te 2000 to 50% tego co miało jeździć. Albo inaczej po co system na 4000 rowerów skoro miało wystarczyć 1220?
Dwa: zatrudniają 40 ludzi do obsługi około 1000 rowerów (dane za maj). Ile musi być zatrudnionych do obsługi 4000 (czyli o 300% więcej niż mają) i to do 18 sierpnia (w trzy miesiące licząc od daty wywiadu).
Trzy: 250 wyjeżdżających rowerów z MTG to jak rozumiem rowery niesprawne, serwisowane i włączane z powrotem do ruchu. Hmmm... czy to oznacza, że z grubsza jest codziennie 250 serwisowanych (czyli wyłączonych z ruchu)? Że rower się psuje, to normalne więc nie ma w tym nic dziwnego, że są rowery popsute i trzeba je naprawiać. Wychodzi, że tych rowerów jest 250 z 1250 czyli około 20%. Albo i nie, bo dziennikarz nie dopytuje... Ale jeżeli tak, to na 4000 będzie 800 popsutych przy założeniu 20%. No może mniej będzie, bo obciążenie/rower będzie mniejsze, a rowery będą usprawniane pod kątem słabych punktów, ale nawet jak będzie to 10% to dalej jest 400 rowerów do naprawy codziennie czyli o 60% więcej niż teraz (40 ludzi:-) może nie wystarczyć.)
Cztery: jeżeli planują dostarczyć stopniowo po 100--300 tygodniowo a mają do dostarczenia 2800, to dostarczając 100/tydzień przez 3 miesiące dostarczą 2400. He, he... Gorzej że na dziś system wykazuje około i zaledwie 1500 rowerów. Pozostało 2500 do dodania, a tygodni do 18 sierpnia zostało 5. Wychodzi po 500/tydzień, starting from now...
+--------------------------------------------------+ | | średnio dzienne | | Miesiąc +--------------------------------------+ | | NZB | ZB | NZB+ZB | NZB% | | ----------+---------+---------+---------+------- + | kwietnia | 624.93 | 163.87 | 788.81 | 79.09 | | maja | 893.13 | 179.03 | 1072.16 | 83.18 | | czerwca | 1094.97 | 172.07 | 1267.03 | 86.45 | | lipca | 1089.00 | 248.25 | 1337.25 | 81.58 | +-----------+---------+---------+---------+--------+
NZB -- rowery ruszające się; ZB -- rowery które nie jeździły, ale były wykazywane. Porównaj też wykresy. Drugi wykres pokazuje dostępność rowerów na stacjach 10111/10112 (Sopot Mickiewicza/Armii Krajowej), które są najbliżej mojego domu. Dostępność liczona jako prosta średnia (liczba rowerów)/(liczba pomiarów)...
Generalnie trend jest OK tylko to ślimacze tempo. Załamanie lipcowe spowodowane jest przypuszczalnie (fatalną) pogodą (lipiec liczony dla tylko dla pierwszych 8 dni). Dane są przypominam tutaj.
Zestawienie wybranych parametrów pomorskiego roweru miejskiego MEVO (maj--czerwiec 2019). Dystanse i średnie są w kilometrach. Zapis Łącznie x% nach. oznacza łączną długość odcinków z przeciętnym nachylenie x% oraz większym. Odcinki z nachylenie 5% i więcej stanowiły odpowiednio 0,06% (maj) oraz 0,05% (czerwiec) łącznego przejechanego dystansu (ŁPD) a z nachyleniem 3% i więcej odpowiednio 0,72% oraz 0,66% ŁPD. To tyle odnośnie potrzeby instalowania silników elektrycznych w każdym rowerze ponieważ Trójmiasto pełne jest stromych podjazdów. Chyba chodziło o coś innego z tymi silnikami...
Wyszczególnienie | Maj | Czerwiec | Zmiana |
Liczba rowerów | 1333 | 1518 | 13.9% |
Łącznie odcinki | 235455 | 330074 | 40.2% |
Dystans łącznie (km) | 649904.3 | 974943.1 | 50.0% |
Średnio na rower/dzień (km) | 15.7 | 21.4 | 36.3% |
Średnio na rower/miesiąc (km) | 487.6 | 642.3 | 31.7% |
Łącznie 5% nach. (km) | 393.9 | 491.5 | 24.7% |
Łącznie 3% nach. (km) | 4687.1 | 6440.4 | 37.4% |
Łącznie 2% nach. (km) | 16722.7 | 23386.0 | 39.8% |
Przypominam, że powyższe policzono w taki oto sposób iż: ze strony
https://rowermevo.pl/
co 120 sekund jest pobierany plik locations.js
który zawiera listę rowerów zaparkowanych
na stacjach w systemie roweru miejskiego Mevo.
Długość/szerokość geograficzna stacji jest w pliku locations.js
.
Wysokość npm. stacji (SRTM) dodałem korzystając z programu
gpsprune.
Mapa najczęściej używanych odcinków:
Dane, że tak powiem źródłowe dotyczące ruchu rowerów MEVO maj/czerwiec 2019 są dostępne tutaj.
Numery stacji w systemie MEVO
są pięciocyfrowe i zaczynają się od 10, 11 oraz 12.
Takich stacji jest 654 (albo 653 zależy jak liczył).
Oprócz tego jest stacja 999993
o współrzędnych w Wawie(52.261177495785/20.968099236488), która
zapewne omyłkowo jest wykazywana
w zestawie (https://rowermevo.pl/mapa-stacji/). Jak się naciśnie
guziczek Pobierz bieżące lokalizacje,
to się dostanie plik CSV
o nazwie locations_YYYY-MM-DD_HH-MM-SS.csv
.
Plik ten ma 704 stacje czyli o 50 więcej niż wykazywana na stronie.
Te pomijane stacje mają numer zero.
Z tych 654 stacji 363 jest w Gdańsku 55,56%; Gdynia 145 (22,17%); Tczew 28 (4,28%); Sopot 27 (4,13%); Rumia 23 (3,52%); Reda 17 (2,60%); Puck 14 (2,14%); Inni 18 (Władysławowo, Kartuzy, Sierakowice, Somonino, Stężyca, Żukowo.)
Te 50 coś stacji-niestacji wygląda jakoś tak:
uid;number;name;city;latlng;bikes;bike;spot;bikeSpot;terminal;address 13915356;0;BIKE 99127;Tczew;54.08056000 18.79086222;1;1;0;;;
Mają dziwną nazwę a w atrybucie bike mają true (albo jeden) a w atrybucie spot mają zero (czyli false). Z tego wychodzi, że te stacje to nie są stacje tylko jakieś luźne rowery pozasystemowe. Taką mam koncepcję...