Rain slows Slavonska, not the tram

Today someone in a discussion about Zagreb traffic wrote the thing every driver in the city has thought this week: since the rain started, everything crawls. That is a claim you can check. Twenty days of ZET positions and one open weather series say it is true — smaller than it feels, except when it is not — and that the culprit is not the one driver in front of you.

Since these rains started, wherever I go the constant problem is people driving 10 to 15 below the limit.

What is doing the measuring

Zagreb has no public sensor network that would tell you how fast an avenue is moving. What it has is a few hundred vehicles driving down that avenue all day, reporting their position every ten seconds or so. A bus on Slavonska sits in the same lanes as everyone else — it is, in practice, a car with a GPS that drives the same route at the same hour every day.

The number that travels is not km/h. A bus’s km/h is not your km/h: the time between two stops includes the dwell at the first of them, which is why a bus on a dry Slavonska medians around 28 km/h and you do not drive 28. So nothing here rests on an absolute speed. Every measured run is divided by the median speed of that stretch in that hour across dry weekday hours, and the number that travels is "per cent of the usual speed, here, now". That ratio does carry over to the traffic around the bus, because the bus and the traffic are the same queue.

The second source is the rain. Hourly precipitation for the centre of Zagreb comes from Open-Meteo, and hours fall into four classes: dry (under 0.1 mm), light rain, rain, and heavy rain from 2 mm an hour up. Across the twenty days of collection there were 45 wet weekday hours, 7 of them in the heaviest class.

What rain actually takes

Slavonska loses speed, and it loses it in order: the harder it falls, the slower it goes. Light rain costs 1.9 per cent of the usual speed, rain 4.7, heavy rain 7.6 per cent. That is a tidier curve than traffic usually gives you.

Then the same measure, the same hours, two kilometres north — the tram on Branimirova, between the main station and Branimirova tržnica, where it runs on its own track, separated from the traffic lanes. The tram loses nothing. In the heaviest rain it runs faster than it does when dry.

Per cent of the usual speed, by rainfall intensity

Every run divided by the median for the same stretch in the same hour when dry. Buses on Slavonska on the left, the tram on Branimirova on the right; the flat line is that stretch behaving normally. The axis starts at 90 %, not at zero.

This difference is worth saying out loud. The rain falls on both vehicles. Both have a wet road surface, both have worse visibility, both go through the same junctions and the same signals. One of them can get stuck behind somebody who slowed down, and the other cannot. Only the one that can, does.

The worst hour in twenty days

A median is good for making a claim, but nobody remembers a median. What gets remembered is the afternoon of 17 September, when the rain came twice — 2.5 mm in the 13:00 hour and 3.6 mm in the 16:00 one — and the second one landed straight on the afternoon peak.

Median speed by hour, Thursday 17 September

The shaded span is when it was raining. The grey line is the same corridor on dry weekdays. Both panels share one axis, which also shows that the tram was never fast to begin with — and that none of this touched it.

At 16:00 the median on Slavonska was 13.8 km/h against the 23.5 that corridor usually manages in that hour. Measured stretch by stretch, the way everything else in this piece is measured, that is −28.6 % — the worst hour in the whole collection window. The tram on Branimirova in that same hour: +6.8 %. Every bus in the city taken together: −2.5 %. The city did not stop that hour. Slavonska did.

Why the chart dives further than the number. The raw hourly median (13.8 against 23.5 km/h) comes out worse than the stretch-by-stretch measure (−28.6 %), and that is not a contradiction. In a bad hour a bus gets through fewer stretches, and the ones it does get through are the short urban ones that are slower anyway. The sample changes, not only the speed. Which is why every claim here rests on a ratio against the same stretch, and the chart is there for the shape rather than for the percentage.

What one hour can and cannot prove. That the rain at 16:00 caused that particular drop is not something one hour can establish — a crash, a failed signal or a closed lane would look identical, and none of those are visible in the feed. What the hour does is show the range: the pattern across every rainy hour is −7.6 per cent, and the worst single hour was close to four times worse.

It is not one driver

The explanation offered in that thread — one person slows to 20 and drags the whole column down with them — has a consequence you can test. If it is one slow vehicle, then rain should pull down the slow end of the distribution and leave the people who were already getting through quickly where they were. Look at the whole distribution instead of the median, and the opposite happens.

The distribution of speeds on Slavonska, dry against heavy rain

PercentileDryHeavy rainDifference
10th71.7 %66.5 %−5.2 pp
25th85.4 %79.1 %−6.3 pp
50th100.0 %92.4 %−7.6 pp
75th116.9 %106.3 %−10.6 pp
90th139.7 %123.9 %−15.8 pp

The slowest tenth loses 5.2 percentage points. The fastest tenth loses 15.8. In other words, rain takes the most from the people who would otherwise have got through fastest. The distribution does not stretch, it compresses downwards — the possibility of a fast run disappears, rather than a handful of extremely slow ones appearing. That is a queue closing up, not one driver corking it.

As for "10 to 15 below the limit": on a stretch posted at 80, that is 12 to 19 per cent. Our median in heavy rain is 7.6, and the worst hour is 28.6. The feeling is not invented — it is just closer to the worst hour in twenty days than to an average rainy one, which is the ordinary way anybody remembers a drive.

And the evening in question?

The post is about a drive on Thursday 24 September in the evening, heading for Heinzelova. It did rain that evening — 3.8 mm between 17:00 and 22:00. Slavonska ran at 100.0 per cent of its usual speed, with a median of 33.0 km/h. Across the whole day, 06:00 to 20:00: 100.6 per cent. Statistically it was an ordinary day.

That is not a rebuttal, it is a clarification. A queue doing 60 where 80 is allowed does exist, and it lasts the ten minutes you remember, but the hour it sat in was unremarkable. What is being measured here is not whether the queue happened — it is whether there were more of them than usual, and that evening there were not.

The rest of the city barely notices

The same measure, but across every stretch in the city rather than these two — close to 1.8 million runs:

Per cent of the usual speed, by rainfall intensity

RainfallSlavonska (bus)Branimirova (tram)All busesAll trams
dry100.0 %100.0 %100.0 %100.0 %
up to 0.5 mm/h98.1 %98.2 %100.3 %99.9 %
0.5–2 mm/h95.3 %99.5 %99.3 %99.7 %
2 mm/h and up92.4 %102.1 %98.3 %99.9 %

A city bus loses 1.7 per cent in heavy rain, a city tram nothing at all. Slavonska loses four and a half times what the average city bus loses. A citywide average neatly hides what happens on a handful of fast corridors — and Zagreb does not slow down evenly in the rain. It slows down where it is normally quick.

The check that could have killed this

The most serious objection to the whole story is that a tram runs at 16 km/h anyway, so it has nothing to lose. It is a good objection, and the way to test it is to compare bus against tram on stretches that are normally equally fast.

Heavy rain, by how fast the stretch normally runs

Stretch normally runs atBusnTramn
under 15 km/h95.8 %2,152100.2 %6,120
15–25 km/h98.6 %7,70299.9 %7,785
25–35 km/h99.2 %7,03299.4 %799
35 km/h and up97.8 %4,92492.4 %109

What this does not measure

How this was calculated

The corridors are geometry, not a list of stop names. Every street in OpenStreetMap named "Slavonska avenija" and every one named "Ulica kneza Branimira" (the latter restricted to the central stretch — Sesvete has a street of the same name), a 35 m buffer around them, and every timetable stretch longer than 150 m that spends at least 60 per cent of its length inside the buffer. That leaves 47 stretches on Slavonska, all served by buses, and 6 on Branimirova, all tram. The measurement runs on 45 of the Slavonska ones — two of them have too few dry runs for a usual speed to exist.

Data and sources. Vehicle positions: ZET GTFS-Realtime, published as open data by the City of Zagreb under the Open Licence. Precipitation: Open-Meteo, hourly for the centre of Zagreb, CC BY 4.0. Street geometry: OpenStreetMap, ODbL. This is not an official ZET site.