Each day: casino kept vs. expected to keep
Details →What it means: the lines move together. Daily gaps are luck and cancel out, like a store's sales vs. its forecast.
Method: Daily Σ house win vs. Σ theo, where theo = Σ bet × (1 − RTP). Luck = house win − theo. Active machine-days only.
Management's 10: why they earned little
Details →What it means: like 10 slow restaurant branches. Most are on a quiet street or just opened; one has a kitchen problem.
Method: Rules: z ≤ −3 and hit-rate z > 5 → inspect; on floor < 50% of days → too new; theo per available hour < 0.75 × floor average in Back Forty → location.
Expected earnings per working hour, by zone
Details →What it means: Back Forty is the side street. Same games, fewer people walking by.
Method: Σ theo ÷ Σ available hours (ratio of sums). Zone taken from the placement at the start of each gaming day.
Breakdown cost by brand
Details →What it means: like one car model that's always in the shop. Ridgeline causes most of the lost play.
Method: Lost theo = unavailable seconds × the machine's coin-in per available second at that local hour × its theo hold (machine_hour).
Forecast vs. actual (May–June test)
Details →What it means: like a weather forecast that says "it's Saturday, expect a crowd." The weekday alone gets most of the way.
Method: Train Jan–Apr, test May–Jun (61 days). Weekday mean on non-event days × event multiplier (events announced ≤ Apr 30). Metric: MAE vs. a constant-mean baseline.
The $100,000 plan
Details →What it means: fix what we can prove, test what we can't, and keep the rest.
Method: Cost = qty × (unit + per-day × max(0, 30 − lead days)). Inspect 5 × $1,200; signage $7,500; comp pilot $4,000; $82,500 preserved.
Question 1 of 6 · Which machines are truly underperforming?
Nine of the ten are explained by luck, location or newness. One machine is not.
Total earnings are unfair to machines that were new, in quiet spots, or designed to keep less. So we score every machine on two things: expected earnings per working hour and a luck score.
Every machine: how busy it is vs. how lucky it was
Further right = more played. Further down = unluckier. Below the lower dashed line is too unlucky to be chance.
Management's 10, one by one
Selected by lowest total house win, Jan–Jun. Numbers follow the period filter.
Luck simulator: could bad luck explain it?
We replay the selected period 1,000 times on a fair machine with the same game and the same amount of play, and count how often it does as badly as the real one.
Luck scores vs. what pure chance predicts
Bars: machines per luck-score band in the selected period. Line: expected count under a standard normal. A close fit means the test is calibrated; only the far-left tail stands out.
Win-frequency check: largest gaps from game design
Hit rate = payout-positive spins ÷ paid spins. z = (observed − spec) ÷ √(spec × (1 − spec) ÷ spins).
The luck score works like a coin-flip test. Getting 7 heads in 10 flips is normal, and nobody would call the coin rigged. Getting 700 heads in 1,000 flips is a different story. Nine of the ten machines are in "7 out of 10" territory. M-1158 is in "700 out of 1,000" territory: it pays a win on 39% of spins when its design says 32%, month after month.
So what: don't replace machines for being unlucky. Have a technician check M-1158's settings.
All machines in your current selection
Click a column heading to sort. How we assign each verdict is explained in How we did it.
Question 2 of 6 · What changed in demand, and why?
Demand was steady overall. Back Forty is the quiet corner, and it got quieter when its hallway closed.
A renovation closed the walkway from the Main Entrance to Back Forty from March 3 to April 7. Foot traffic dropped by about a third and did not fully come back.
Floor map: which banks earn the most per working hour
Darker = earns more. Click a bank to focus the whole page on it. The dashed line is the walkway that was closed.
Same game, different zone
Expected earnings per working hour. Pick a game to see that identical machines earn less in Back Forty.
Foot traffic: Back Forty vs. the rest of the floor
Door-sensor entries, 7-day average. 100 = normal level before the closure (Jan 1 – Mar 2). Shaded = walkway closed.
Which events brought people in?
Amount bet on event days vs. the same weekday without an event.
Average amount bet per day, by weekday
Saturdays bring in about 1.6× a Tuesday.
The casino vs. Las Vegas as a whole
Both indexed so January = 100. The June dip happened citywide too.
Back Forty is like a good shop on a side street. It sells the same products as the shops on Main Street, but fewer people walk past. When the hallway leading to it was closed for five weeks, a third of the passers-by disappeared, and some never came back. Swapping in shiny new machines there is like restocking the side-street shop: it doesn't bring people down the street.
So what: make Back Forty easier to find before spending money on its machines. Big sports weekends and our own tournament drew crowds; conventions barely did.
Question 3 of 6 · How much play was lost to downtime, and when?
Breakdowns cost less than half a percent of earnings, and one brand caused most of it
We price lost play as what each machine normally earns at that hour of the day, multiplied by the hours it was out of service.
Earnings lost to downtime each month, by machine brand
Includes repairs, installs and moves.
How often each brand breaks
Repairs per 100 days on the floor.
Hours until a technician starts the repair
By how many slot technicians were working when the machine broke.
Technician staffing by month
Average technicians who actually worked vs. planned, per shift.
Downtime is like a supermarket checkout lane closing for a few hours: annoying, but a small share of sales. Most of the problem comes from one brand, Ridgeline, much like one car model that keeps going back to the shop. Repairs also wait longest on days nobody is scheduled, which happened 12 times in April and May.
So what: downtime does not explain management's 10 (all were working over 99% of the time). Hiring an extra technician would cost more than it saves this month.
Question 4 of 6 · What did tracked players wager, get back and net?
Guests lost about what the games are designed to take, and a small group carries most of it
This covers guests who used a loyalty card. Play without a card can't be tied to a person, so these totals are smaller than the machine totals. Use the Guest group filter to focus on a region, tier or age band.
Who carries the losses?
Guests ranked from biggest loser to biggest winner. Bars show how much each group lost in total.
Breakdown by guest group
It's like a phone company's data use: most customers use a little, while a small group uses most of the total. The top 10% of carded guests account for more than half of all tracked losses, and about 1 in 6 guests went home ahead. Local guests are 8% of players but carry 57% of the losses.
So what: nothing in our plan targets heavy losers to play more. Any guest-facing change should be tested carefully, especially with locals.
Question 5 of 6 · What did the comp program cost, and did anything change?
On May 1, free food and drinks started costing guests half as many points
Comps are the free food and drinks guests buy with loyalty points. The points needed per dollar were cut by about 53% in every tier on May 1. Spending barely moved, but the points guests already hold became twice as costly to honour.
Points needed for $1 of comps, each week
The dashed line is May 1. Always shows the full six months.
What comps cost the casino each month
Real cost of the food and drinks, not their menu price. After the change in maroon.
Picture a coffee shop that changes its loyalty card from "free coffee after 15 stamps" to "free coffee after 7." Few people have cashed in yet, so the shop's costs barely moved. But every stamp already sitting in customers' wallets is now worth twice as much, and the shop owes twice as much if everyone redeems. Visits did not go up after the change.
So what: run a small test with a control group before deciding whether to keep the new rate.
Forecast model Fixed test: ignores filters
Knowing the day of the week predicts most of the daily swing
We built the forecast using January–April only, froze it, then checked it against May–June, which it had never seen. It only uses things known in advance: the weekday, and events already announced by April 30.
Forecast vs. what actually happened
How far off was each forecast? (May 1 – Jun 30)
Decision it changes
Schedule technicians and floor staff for weekends and evenings, where an hour of downtime costs about twice as much. Test any promotion on a normally quiet day, so its effect isn't confused with the usual weekend rush.
Is it a one-off? Testing on 4 different months
Each month is forecast using only the months before it. We picked our model using March and April only, then confirmed it on May and June, which it had never seen.
Error by weekday (test period, May 1 – Jun 30)
Mean absolute error in dollars per day for each model, and the bias of the chosen model (positive = over-forecast).
It's like a weather forecast that mostly says "it's Saturday, expect a crowd." That simple rule cut the average daily miss from about $218k to $69k. Adding big announced events, like the Super Bowl weekend, cut it further. A fancier model isn't needed to staff the floor well.
Question 6 of 6 · What should we do with $100,000 (July 1–30)?
Spend $17,500 on three targeted fixes and keep the rest
Each fix matches a cause we actually found. Bad luck needs no fix, so most of the money is kept. Costs use the catalogue price: quantity × (unit cost + daily cost × days remaining after lead time).
Where the money goes
Budget playground: build your own plan
Pick quantities from the real action catalog. We check the rules as you go and show what each action could return in July, based on the data. Our plan is loaded to start.
Options we priced and did not fund
It's like a sensible doctor's visit. Don't operate on patients who just had a bad week (the unlucky machines). Run the test that confirms a diagnosis (inspect M-1158). Fix the road to the clinic so people can find it (signs for Back Forty). And trial a new prescription on half the patients before giving it to everyone (the comp pilot).
Appendix
How we did it
Every claim, with its query, result, alternative explanation and limitation: open the Claims and Evidence appendix →
How we did it, in four lines
- Fair comparison: we only count days a machine was on the floor and working.
- Luck removed: we compare what each machine kept with what its game design says it should keep.
- Too strange to be luck: a machine is flagged only if its results would happen by chance less than 1 time in 700.
- Honest forecast: we built it on January–April and tested it on May–June, which it had never seen.
AI use, and how we checked it
Our ideas: the approach (testing luck vs. location vs. leak before spending), the decision to keep most of the budget, and the user experience of explaining the results to many audiences at once: the story intro and the Simple / Analyst views.
Where AI helped: Claude (Anthropic) helped with execution: writing the SQL and Python analysis, fitting and back-testing the forecast models, and coding this dashboard.
How we verified it:
- Recomputed key numbers two independent ways (SQL in DuckDB and this page's code) and confirmed they match, e.g. house win $23.64M, M-1158 luck score −4.6, forecast errors.
- Checked the money rules: house win = amount bet − payout; every ratio is computed from totals.
- Sanity checks: the 310 luck scores form the bell curve chance predicts, and the Luck simulator confirms the result a second, independent way.
- Went through the guide's "common mistakes" list one by one. This caught and fixed a real error: a forecast input that used future information.
- Tested the forecast on four separate months, chose the model before looking at May–June, and tested every filter combination and screen.
Full method (definitions, formulas, limits)
Money definitions
Amount bet (coin-in) = all wagers including re-bet winnings. House win = amount bet − payout. Expected earnings (theo) = Σ bet × (1 − payback rate). Keep rate (hold) = Σ house win ÷ Σ amount bet. Ratios are always computed from totals, never by averaging daily ratios.
Fair comparisons
Days a machine wasn't installed yet, or was already retired, are left out (not counted as zero). "Per working hour" divides by hours the machine was available, which removes downtime. March 8 had 23 hours (daylight saving); we use actual scheduled seconds.
Luck score
For each spin, the casino's result varies by bet² × the game's payout variance. Adding that up over all spins gives the normal spread for a machine's total. Luck score = (house win − expected earnings) ÷ that spread. Across 310 machines the scores form the bell curve chance produces, except M-1158.
Luck simulator
Each game's payout per spin is modelled as 0 (no win), a regular win, or the top prize, with the three probabilities and sizes solved so the model matches the game's published RTP, payout variance and hit rate exactly. For each replay we draw the number of wins and top prizes for the machine's real number of spins, convert to dollars using its real amount bet, and correct for bet-size spread using Σbet². The share of 1,000 replays at or below the real result is a simulated p-value that does not rely on the bell-curve assumption behind the luck score.
Win-frequency check
The share of spins that pay anything, compared with the game's published hit probability. Over hundreds of thousands of spins, a 7-point gap isn't chance. That makes it a reason to inspect, not proof of a fault or of wrongdoing.
Machine verdicts
- Inspect payout: luck score ≤ −3 and wins far more often than the game design.
- Too new to judge: on the floor for less than half the selected days.
- Watch: luck score ≤ −2.5 (about 2 of 310 machines by chance alone).
- Quiet location: earns under 75% of the floor average per working hour, in Back Forty.
- Low-earning game: the same, elsewhere (usually games designed to keep little, like Royal Draw).
- Normal (luck): everything else.
Downtime pricing
For each machine-hour with downtime: lost earnings = seconds down × that machine's usual amount bet per working second at that hour × its expected keep rate.
Forecast, without peeking
Trained on Jan 1 – Apr 30, tested on May 1 – Jun 30. Event flags only include events announced by April 30, so Locals Appreciation Week (announced May 26) is not used. City tourism data is published later and is never an input. We also fit a linear regression (weekday dummies, event flag, linear trend; no lagged actuals, since a frozen 61-day forecast cannot see test-period results) and ran a rolling-origin backtest (forecast each of Mar, Apr, May, Jun from the months before it). The model was chosen on the Mar and Apr folds only.
Tracked vs. all play
Player figures cover loyalty-card play only. Concentration, the share of guests ahead, and comp ratios describe carded guests, not everyone.
Limits
- The casino is fictional and its data is synthetic; nothing here describes a real property.
- Supplied costs are partial (no rent, taxes or depreciation).
- Action prices are given; their effects are our estimates, with uncertainty stated.
- LVCVA and Missouri figures are real but published after 2025; context only.
Reproduce it
Run python analysis/build_dashboard_data.py, then open dashboard/index.html. Every number comes from that script.