Ze strony
https://rowermevo.pl/
co 120 sekund jest pobierany plik locations.js
który zawiera (jak mniemam) listę rowerów zaparkowanych
na stacjach w systemie roweru miejskiego Mevo. Jak rower zmienił
stację to znaczy, że ktoś
się nim przejechał (lub go przewieziono dla jakiś celów.)
Pobrane dane są dostępne
tutaj.
Konkretnie plik MEVO_bikes_ROKMIESIĄC.csv
to plik CSV, którego
każdy wiersz zawiera czas, idRoweru, stanBaterii
oraz współrzędne geograficzne. Rejestrowane są tylko przemieszczenia,
tj. na przykład jeżeli rower jest wykazywany przez 10 kolejnych pobrań
jako zaparkowany w tym samym miejscu, to tylko pierwszy wpis jest
zapisywany. Z kolei MEVO_tracks_ROKMIESIĄC.csv
zawiera idRoweru,
liczbę przemieszczeń
oraz kompletny ślad w postaci par współrzędnych.
Plik MEVO_bikes_201905.csv
(czyli za maj) zawiera 265 tys wierszy,
plik MEVO_tracks_201905.csv
zawiera 1550 wierszy (czyli zarejstrowanych
rowerów w systemie). Tutaj uwaga: część wpisów/rowerów jest
dziwna: są rowery jeżdżące po Warszawie,
po Bałtyku a nawet w księstwie Monako.
Szczegóły
tutaj.
Na podstawie pliku MEVO_tracks_ROKMIESIĄC.csv
obliczyłem łączny
i średni dystans pokonany przez rowery w maju, pomijając
„dziwne” wpisy. Za kryterium dziwności przyjęto punkt
znajdujący się na zewnątrz prostokąta 53.8--55.0/17.4--19.5
(długość/szerokość). W ten sposób zostało 1370 rowerów a odpadło 180
„dziwnych”. Konkretnie policzyłem poniższym skryptem:
#!/usr/bin/perl use Geo::Distance; my $geo = new Geo::Distance; my $distGrandTotal; my $distTotal; while (<>) { chomp(); ($bike, $nodes, $track) = split /;/, $_; $track =~ s/[ \t]+$//; @trkpts = split / /, $track; $distTotal=0; $skipBike = 0; foreach $t (@trkpts) { ($lon, $lat) = split /,/, $t; if ($lat < 53.8 || $lat > 55.0 || $lon < 17.4 || $lon > 19.5 ) {## $skipBike = 1; print STDERR "SKIPPED $bike: lat = '$lat' / lon = '$lon'\n"; } else { if ($latPrev > 54.0 ) { $dist = $geo->distance( "meter", $lonPrev, $latPrev => $lon, $lat ); $distTotal += $dist; } $lonPrev = $lon; $latPrev = $lat; } } unless ($skipBike) { $mean = $distTotal / 31; printf "%s;%.2f;%.2f\n", $bike, $distTotal, $mean; $distGrandTotal += $distTotal; $validBikes++; } } $grandMean = $distGrandTotal / (31 * $validBikes); print STDERR "Średnio: $grandMean ($validBikes)\n";
Minimum przejechane 0km, pierwszy kwartyl 12,8km, mediana 17,8km trzeci kwartyl 21,2km. Maksimum 30,7km. Przypominam, że są to średnie dzienne dla 31 dni maja. Oczywiście nie są to wielkości prawdziwe: po pierwsze dystans jest liczony jako proste pomiędzy punktami (rejestrowanymi co 120s); po drugie nie wszystkie przemieszczenia polegają na pedałowaniu--czasami rower jest wieziony. Arbitralnie przyjmijmy że prawdziwa wartość to 200% zarejestrowanej (to chyba dużo mimo wszystko). Dalej załóżmy że gdyby z roweru korzystało się 6 godzin na dobę (można by policzyć ile się korzysta ale tego jeszcze nie zrobiłem)--co dalej nie wydaje się czymś nadmiernie wyśrubowanym (połowa czasu od 8 rano do 20 wieczorem). Wreszcie przyjmijmy 12km/h jako prędkość przemieszczania się (jak na pojazd z silnikiem -- moim zdaniem -- już mniej się nie da). Wychodzi 6 x 12 = 72km. A jest 30km czyli nawet nie połowa...
Rozkład średnich przedstawia histogram poniżej