← Research

// article

Seattle's Weather

Seattle rains 43.9% of the time. So does it sun.

November 19, 2025 Article
Calendar heatmap of Seattle's daily rain: months down the side, day-of-month across, each cell shaded by how often that calendar day was labeled rain across 2012-2015. A bright band of frequent rain runs through November to March; a dark dry valley sits over July and August.

Seattle’s umbrella reputation is real on the year and almost meaningless on the day. Pull four years of daily records and count the labels. Rain shows up on 43.9% of the 1,461 days from 2012 through 2015. Sun shows up on 43.8%. Those are 641 days and 640 days, one day apart out of fifteen hundred. The city built its weather brand on a coin flip.

I built the calendar above before writing a word, because it settled the question for me. The rain is not spread across the year. It is pooled into a bright winter band with a dark dry hole punched through summer.

The data is the seattle_weather set from vega-datasets, sourced from NOAA GHCN: a date, daily precipitation in mm, max and min temperature, wind speed, and one categorical weather label per day. Five labels total. After rain and sun, everything else is a long tail: fog on 6.9% of days, drizzle on 3.6%, snow on 1.8%. No missing values anywhere, which almost never happens and made me re-check the loader.

So the reputation is not built on how often it rains. Look past the label and ask whether any rain fell at all, precipitation greater than zero. That happens on 42.6% of days. The other 57.4% are bone dry. The mean daily precipitation is about 3.0 mm, but the median is exactly 0.0. Picture the gauge: most days it catches nothing, and a minority of soakers drag the average up past a number no typical day ever reaches. That is the gray-drizzle stereotype. Not constant rain, but a lot of days that never quite commit to being sunny.

The seasons do all the work

The annual coin flip hides a hard seasonal swing. Split the rain label by meteorological season and the winter months (Dec/Jan/Feb) are labeled rain 58.7% of the time. Summer months (Jun/Jul/Aug) drop to 22.3%. That is a 2.64x difference between the wettest and driest stretches of the year, from the same city.

Monthly fraction of days that rained or were labeled rain

The monthly view is steeper still. December is the wettest month: some precipitation fell on 65.3% of its days. July is the floor at 8.9%. The two curves, any precipitation and the stricter rain label, track each other closely, with the labeled-rain line sitting a touch below most months because some wet days got filed as drizzle, fog, or snow instead. Visit in July and the reputation looks like a hoax. Visit in December and you believe every word of it.

Can you predict the label from the numbers?

Here is the question I wanted to answer. Hand a model the precipitation, both temperatures, and the wind for a day, and can it recover the label a human assigned? I split the 1,461 days into 1,022 for training and 439 for test, stratified by label and seeded at 42, then ran a scaled random forest in a pipeline so nothing leaks across the split.

Test accuracy came in at 81.3%. The majority-class baseline, which guesses the most common training label (here, sun), gets 43.7%, so the model nearly doubles it. That sounds like a win until you look at what it is doing.

Confusion matrix on the 439-day test set

Per-class recall splits the model into two animals. Rain it nails: 90.2% of true rain days recovered. Sun, the same story, 90.1%. But fog, drizzle, and snow fall apart, with recall of 20%, 12.5%, and 25%. The whole 81% rests on the two big classes the model can already separate cleanly.

The confusions are the ones you would guess from the labels themselves. The single most-confused pair is fog called as sun: 22 of the 30 fog days in the test set, 73% of them, got labeled sunny. Drizzle has the same problem: 12 of its 16 days, 75%, also got read as sun. Both fog and drizzle are low-or-no-precipitation, mild-temperature days, and the model has no humidity or visibility column. On paper, a foggy morning and a sunny afternoon are the same row of numbers. The model cannot tell apart what the measurements never recorded.

Is precipitation just cheating?

Permutation importance bar chart: shuffling precipitation drops accuracy by 0.386, dwarfing wind (0.025), max temp (0.021), and min temp (0.019)

Permutation importance on the test set makes the strategy obvious. Shuffling precipitation drops accuracy by 0.386, by far the biggest hit. The other three features barely move the needle: max temp 0.021, wind 0.025, min temp 0.019. The forest is essentially a precipitation threshold with some temperature trim.

That feels like cheating, because a day labeled rain almost by definition had precipitation. So I retrained the same pipeline with precipitation removed entirely, just temperature and wind. Accuracy fell to 64.5%, a 16.9-point drop. Still well above the 43.7% baseline, which surprised me. Temperature alone carries real seasonal signal, since cold days skew wet and warm days skew sunny in this climate. But losing precipitation cost most of the model’s edge. The classifier is not decoding Seattle’s sky. It is reading the rain gauge and reporting back what the gauge already knew.

One caveat I will not paper over: this is four years from one station, and the labels are whatever the dataset’s authors assigned, not a meteorological ground truth I can audit. The fog-versus-sun confusion might be as much about where someone drew the line between fog and clear as about anything in the numbers. With 30 fog days and 16 drizzle days in the test set, those recall figures rest on small counts and should not be oversold.

What stuck with me is the opening number. Rain 43.9%, sun 43.8%. The reputation is not a lie, but it is not about frequency. It is about December, and about the long gray middle the labels can barely tell apart.