# Beyond the forecast: making sense of traffic changes with BigQuery

> TimesFM spots unusual days in BigQuery; ARIMA_PLUS explains why. We tested both on a year of GA360 data to turn traffic drops into clear answers.

Source: https://www.measurelab.co.uk/insights/blog/beyond-the-forecast-making-sense-of-traffic-changes-with-bigquery/  
Author: Elisa Liu  
Published: 2026-11-03  
Updated: 2026-11-03

*A practical comparison of TimesFM and ARIMA_PLUS, and what their results can tell an analyst.*

Most forecasting tools are good at telling you what will happen. Far fewer tell you why. When a stakeholder sees traffic drop by 40% on a Monday, "the model flagged it as an anomaly" is not enough. "It was Boxing Day, which explains 1,300 of the missing sessions" is a more useful answer.

BigQuery now has two families of time-series functions that help bridge that gap. The newer AI.* functions use Google's TimesFM foundation model without any training on your part. The older ML.* functions, built on ARIMA_PLUS, can break each day into its component parts. We tested both on the same year of data to see where each works best and how much they can explain.

### **The test**

We used Google's public GA360 sample (bigquery-public-data.google_analytics_sample): daily sessions for the Google Merchandise Store from 1 August 2016 to 1 August 2017. It is a useful test series, with patterns familiar from real client data: a strong weekly rhythm, a holiday season, a Christmas slump and a few unexplained spikes.

![bigquery-public-data.google_analytics_sample · SUM(totals.visits) per day, 1 Aug 2016 – 1 Aug 2017](https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/11/data-src-image-95677fce-6bdd-43e0-9263-2368cac92f7f.png)

bigquery-public-data.google_analytics_sample · SUM(totals.visits) per day, 1 Aug 2016 – 1 Aug 2017

Function

Family

Needs a model?

What it answers

AI.FORECAST

TimesFM

No

What happens next?

AI.EVALUATE

TimesFM

No

How accurate is the forecast?

AI.DETECT_ANOMALIES

TimesFM

No

Which days were unusual?

ML.TREND, ML.SEASONALITY

Model-free

No

What's the underlying level and weekly shape?

ML.EXPLAIN_FORECAST

ARIMA_PLUS

Yes

Why was each day what it was?

Every query scanned about 16 MB, so the whole experiment cost next to nothing.

### **TimesFM: fast, accurate, and silent on why**

AI.FORECAST takes a single table function call. There is no model to train, store or retrain, and it runs with read-only access. It picked up the weekly pattern automatically and forecast around 2,500 sessions a day for August, with a 95% prediction interval of roughly ±400 to ±600 sessions, widening further into the future.

To assess its accuracy, we held out July 2017 and compared the results with an ARIMA_PLUS model trained on the same history:

Metric (31-day holdout)

TimesFM

ARIMA_PLUS

MAPE

5.9%

6.4%

MAE (sessions/day)

133

136

Actuals inside the 95% interval

96.8%

93.5%

Both performed well, with TimesFM slightly ahead and producing better-calibrated intervals. One month is a small test, though, so we would not choose between them on accuracy alone.

AI.DETECT_ANOMALIES was the most interesting of the three. Using August to October as its reference history, it scored each later day and flagged eight with at least a 95% probability of being unusual: 23 to 30 December, 2 January and Martin Luther King Day. It identified the Christmas slump without being told when Christmas was.

![AI.DETECT_ANOMALIES on bigquery-public-data.google_analytics_sample · 1 Nov 2016 – 28 Feb 2017](https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/11/data-src-image-20356f27-6b5e-41c0-ba4e-fe530e1a8f4a.png)

AI.DETECT_ANOMALIES on bigquery-public-data.google_analytics_sample · 1 Nov 2016 – 28 Feb 2017

There are two caveats. It only flagged drops: with three months of reference history, its expected range was wide enough to include the Black Friday peak of 4,807. It can also only tell you that a day was unusual, rather than explain the cause.

### **A quick decomposition, with one catch**

ML.TREND and ML.SEASONALITY take a table directly and return the underlying trend and weekly effect, again without a model. Subtract both from the actual value to get an additive decomposition: actual = trend + weekly + remainder. The remainder's spread was 197 sessions, compared with 707 for the raw series, so these two components explain most of the movement.

The weekly pattern produced the clearest business finding of the exercise:

![ML.SEASONALITY on bigquery-public-data.google_analytics_sample · average weekly column per weekday, Aug 2016 – Aug 2017](https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/11/data-src-image-a1afb6f5-6112-4356-9fac-0205dbdba941.png)

ML.SEASONALITY on bigquery-public-data.google_analytics_sample · average weekly column per weekday, Aug 2016 – Aug 2017

Midweek traffic is around 900 sessions, or roughly 40%, higher than weekend traffic. People browse this store during working hours, which matters when planning campaigns or releases.

The catch is holidays. Without a holiday term, the Christmas dip is folded into the trend. The trend line falls in December, suggesting that demand fell, when the drop was due to the holiday. On 26 December, the remainder is only −336 sessions because the trend has already absorbed the dip. ML.DETECT_CHANGE_POINTS helps a little by identifying 25 November to 1 January as a single volatile period, but it does not explain why.

### **Explaining every day with ML.EXPLAIN_FORECAST**

This is where the "why" comes in. An ARIMA_PLUS model with holiday_region = 'US' and decompose_time_series = TRUE splits each day into trend, weekly effect, holiday effect and residual. In our run, these components added back to the actual value to within 0.1 sessions on all 366 days, leaving nothing hidden.

Take Boxing Day, one of the days flagged by TimesFM:

![ML.EXPLAIN_FORECAST, temp ARIMA_PLUS model (holiday_region US) · 26 Dec 2016](https://storage.ghost.io/c/2b/29/2b2922bc-51da-44ac-8a48-6f70d3ab322e/content/images/2026/11/data-src-image-e6bd9215-2449-4ffa-a33e-52cba063b317.png)

ML.EXPLAIN_FORECAST, temp ARIMA_PLUS model (holiday_region US) · 26 Dec 2016

The anomaly is fully explained: the trend remains intact, Mondays are normally strong, and the Christmas holiday window accounts for a drop of around 1,300 sessions. Very little remains unexplained.

The model also totals each holiday's effect across the days it covers. New Year (−5,908 sessions over 9 days) and Christmas (−4,316 over 12 days) have the largest negative effects. Thanksgiving (+1,780), covering Black Friday and Cyber Monday, is the only large positive. With one year of data, each estimate rests on a single occurrence, so treat outliers cautiously: the −3,168 effect for Mother's Day is more likely to reflect something else that happened in early May.
