← LabExperimentApplied ML

Cinema Screening Planner

Problem

A single-screen outdoor summer cinema in Varna has hand-scheduled its nightly programme for nine seasons: which film, which night, from whatever was in rotation. Meticulous accounting records, no demand model - an experienced operator's gut. We wanted to know honestly whether data could match that judgment, and where it couldn't.

What we built

The weather gate

An outdoor venue's first question isn't which film - it's whether anyone comes at all. That was our first hypothesis, and nine seasons of the venue's own history confirmed it: 14% of scheduled nights sold zero tickets, roughly half of them whole-venue rain-outs. So the model is a two-stage gradient-boosting machine behind a weather gate: stage one predicts whether the night happens at all (calendar + evening weather, AUC 0.75), stage two predicts demand given that it does.

Base signals from the booking history

A verified dataset of 1,921 screenings across 277 films, rebuilt from nine years of accounting workbooks and cross-checked row by row. The venue's own data supplies the base features: each film's past draw, the showtime slot, position in the season. Validated the only honest way for a catalogue where 98% of films appear in a single season - train on past seasons, test on an unseen one, never a random split.

External signals we brought in

On top, the system ingests external factors we sourced ourselves, all point-in-time-safe: hourly Varna weather for the actual evening window, Google Trends momentum anchored to a stable local search term, Wikipedia pageviews in English and Bulgarian, US opening release width, and critic ratings.

Findings

Ranking power

The model captures 78–80% of the gap between random ordering and perfect-hindsight ordering - about 95% of the ceiling this data can mathematically support (the same film in the same slot still varies by ±21 tickets a night, irreducibly).

Versus the human

Measured against the operator directly: the model's #1 matched their actual pick on 31% of nights, its top-2 on 54%. The honest conclusion - the operator was already good.

What actually matters

Audience fit beats everything: family films draw twice what everything else does, dubbed family films three times. Critic ratings carried zero signal at this venue and were removed from the model.

The structural blind spot

Locally-beloved family titles look weak on every external API - IMDb 4.3, modest box office - and sell out anyway, because the audience driving them (children) leaves no trace on Wikipedia or Google Trends.

1,921

screenings verified row by row, nine seasons

78–80%

of the random-to-perfect-hindsight gap captured

family films outdraw everything else - 3× when dubbed

Base signals, ranked

Error increase when the signal block is removed (Δ mean absolute error, tickets) - the venue's own booking history at work. Red: tested and cut.

External signals, ranked

The factors we brought in ourselves, same measure. Red: tested and cut - critic ratings carried nothing, holiday features actively hurt.

Use cases

Pre-season slate ranking, validated at Spearman 0.68 against realized season-long draw - with the discipline to abstain on films it has no signal for rather than guess. A second opinion on the nightly programme, not an autopilot. And the shape generalises: any repeated, structured decision with tabular inputs - staffing rosters, prep quantities, promotion timing - where a gradient booster trains in seconds and explains itself.