Luck or Leak
The Gilded Ace slot floor · Jan–Jun 2025 · TAMU Datathon 2026

Each day: casino kept vs. expected to keep

Details →
Actually keptExpected to keep

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 →
ActualOur forecastFlat average

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.

Back Forty zoneRest of the floorManagement's 10
Source: machine_day, game_math. Click a dot to find it in the table below.

Management's 10, one by one

Selected by lowest total house win, Jan–Jun. Numbers follow the period filter.

Shows the same 10 machines whatever zone is selected.

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.

Fair replaysReplays as bad as the real resultReal result

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.

z = (house win − theo) ÷ √Σ(bet² × payout_multiplier_variance)

Win-frequency check: largest gaps from game design

Hit rate = payout-positive spins ÷ paid spins. z = (observed − spec) ÷ √(spec × (1 − spec) ÷ spins).

In plain terms

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.

Location is taken at the start of each day, so machines that moved count in the right place.

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.

Source: floor_locations, floor_walkways, machine_day.

Same game, different zone

Expected earnings per working hour. Pick a game to see that identical machines earn less in Back Forty.

Source: machine_day, game_math. Click a bar to focus on that zone.

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.

Back FortyAll other zones
Source: zone_traffic_hourly. Counts sensor crossings, not unique people. Offline sensor hours are skipped, not counted as zero.

Which events brought people in?

Amount bet on event days vs. the same weekday without an event.

Source: events, machine_day. Extra earnings = extra amount bet × the floor's expected keep rate.

Average amount bet per day, by weekday

Saturdays bring in about 1.6× a Tuesday.

Source: machine_day.

The casino vs. Las Vegas as a whole

Both indexed so January = 100. The June dip happened citywide too.

Gilded Ace amount bet per dayLas Vegas visitors per day (real LVCVA data)
City data was published after 2025, so it is used for context only, never in the forecast.
In plain terms

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.

RidgelineHalcyonNorthwind
Source: machine_hour.

How often each brand breaks

Repairs per 100 days on the floor.

Source: operations, machine_day.

Hours until a technician starts the repair

By how many slot technicians were working when the machine broke.

Source: operations, shift_roster.

Technician staffing by month

Average technicians who actually worked vs. planned, per shift.

Source: shift_roster. Highlighted months had days with no day-shift technician.
In plain terms

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.

Source: player_period, summed per guest over the selected months.

Breakdown by guest group

Net = what guests got back minus what they bet. Luck = net result vs. what the game design predicts.
In plain terms

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.

Base tierGold tierPlatinum tier
Source: loyalty_ledger (redemptions).

What comps cost the casino each month

Real cost of the food and drinks, not their menu price. After the change in maroon.

Source: player_period. Comp cost is already inside food cost, so it is counted once.
In plain terms

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

ActualWeekday + eventsWeekday onlyFlat average (baseline)
Source: property_day, events (with announcement dates).

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.

Flat average (baseline)Weekday onlyWeekday + events (ours)Regression

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).

In plain terms

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

In plain terms

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.