Using Heart Rate Data to predict the best jump scare

It's a spooky season. That gave me a terrible, wonderful idea: let’s make my colleagues watch those jumpscares scenes while we track their heartbeats. For research. And maybe for laughs. We’ve got sensors, timestamps, and a playlist designed to ruin office friendships. Let’s find out who screams first and what the data says.

Do our Hearts skip a beat with Jump scares?

We already built the perfect horror movie from jump-scare data. So I pulled a handful of films with the highest scare scores and clipped only the major moments. Which raised a question: what does your heart actually do when a jump scare lands? and is our office full of brave nerds or just very loud ones?

Scenes? Loaded. Sensors? On. Room? Pitch black. Easy data, right? Not quite. Once we synced footage and logs, some readings were inaccurate or gone. And yes, Graham, this is your moment. ‘I know how to use it,’ you said.

Okay, here’s the plan: use this data to pick the exact jump scare that will terrify my boss. But if I want accurate predictions, I need clean data, full stop. If a watch drifts or timestamps don’t line up, you’re training on ghosts. 
So we kept it simple: same clock for everything and a quick calm baseline for each person. Once the inputs are honest, the features stop wobbling and the model can learn actual patterns, not our mistakes. Measure right so it can predict right.

Two friends sitting on a sofa watching a horror movie, one clutching a jar of popcorn and the other hiding behind a pillow, looking scared during a jump scare

Get comfy…. We’ve got some Jumpscare heartrates to analyse!

Under the hood…

It’s simple but strict: we load the raw CSVs, parse the timestamps into real datetimes, and snap every heartbeat stream onto one shared clock. Because not every stream has a beat every second, we allow a ±2-second nearest-match so gaps don’t break the sync. We set t = 0 at the exact moment the montage starts, then trim the timeline to the known end of the video.

Now one thing to note is that raw heart rates aren’t comparable, my “chill” might be 95 and yours 70. So we level the field: take the first 30 seconds as your personal baseline, then track Δbpm: how many beats above calm you climb during the video.

a Graph that shows the 6 people that took part in the heart rate challenge and their heart rate throughout watching the jump scares, Graham seems to be the only one not phased, however it shows everyones starting heart rates were different

Graph to show Heart rate’s of each person throughout watching the jumpscares

 If I ran this again, I’d grab a true resting baseline before we roll, because just knowing a scare reel is coming can nudge your pulse. Not Graham, apparently.

we ran the graph again, starting with a true resting heart rate so cut the first 30 seconds of the previous Graph data to make the starting line more fair. however it didn't seem to impact Graham at all

Let’s Play… Where’s Graham’s Heart Rate??

Let’s see it: a heatmap of Δbpm over time: blue = chill, red = chaos. Daniel’s not as stoic as he thinks and his heartbeat is screaming. Piyumi warms, Liv & Leigh dip then rebound. Gareth & Graham have gaps, so comparisons are shaky. Same scares, different bodies, some hit the gas, others slam the brakes. That’s the chaos.

a heatmap to show who was as cool as a cucumber and who was a scaredy cat whilst watching, we can see that Liv and Leigh were very chilled out whilst watching. Graham and Gareth were hardly there and Daniel was more scared then he'd like to admit

a Heatmap of Δbpm

Now let's measure those fears:

After each scare we take a 0–15 second impulse window.  For every person, we average those windows to get a “startle signature.” Then we extract features: peak height, latency (how many seconds to the top), half-recovery (how fast you calm halfway), and the AUC Area Under the Curve (how much total panic you had in the first 10 seconds).

So we can create a function to turn this messy heartbeat data into a simple fear fingerprint. For each jump scare, it grabs a tiny story in time: 10 seconds before the scare to measure your calm, then 0–15 seconds after to watch the reaction.

Here’s how we judge fear:

  • Peak: biggest jump after the scare.

  • Latency: how many seconds to that peak.

  • Half-recovery: how fast you drop back to half the peak.

  • AUC(0–10s): total “panic area” in the first 10s.

  • Big response?: count it if the peak is ≥ 5 bpm.

  • Average the reactions across all scenes → your mean impulse curve (0–15s): the shape of how you spike and settle.

    Now let's look at this scoreboard:

    • Daniel - “Train to Busan” (Afterburner)
      Relentless momentum, big, sustained spikes.

    • Piyumi - “The Ring” (Creeping Lift)
      Steady rise, moderate sustain and tension keeps tightening.

    • Liv - “The Conjuring”
      Startle and brief freeze (dip) and quick recovery.

    • Leigh - “Lights Out” (Snap Shock)
      Fastest; sharp dip, reset, repeat.

    • Gareth - “The Blair Witch Project”
      Patchy footage, signal too thin to compare.

    • Graham - “Paranormal Activity”
      Long gaps and flickers, fun, but stats are shaky.

Average Impulse Overlay

Watching that overlay, something clicks:

People who sat together show the same impulse shape. Liv & Leigh dip in unison right after the scare, then rebound. Daniel & Piyumi ramp up together across the whole 15 s window. That’s not just vibes, it’s a known thing called physiological synchrony: when groups share attention or emotion, their bodies can literally line up. There’s research on audience heart-rates syncing during shared experiences, and news coverage of the effect in real audiences, too and also a study on physiological synchrony you can read on. It's a big reason group horror feels contagious.

Two people facing each other with glowing brain cells connected by bright neural lines, visualising the physiological synchrony theory where brains align during shared emotions

You thinking what i’m thinking?….

Alright, Evil work time…

If watching together syncs you up, let’s use it. I wrote a function find_room(): feed it your impulse profile and it uses k-nearest neighbours using the features created previously(peak, latency) to see which room your heart desires. For the demo, I volunteered my flatmate Matt. He wasn't thrilled but hey, all in the name of science.

K-nearest neighbours is the “find your people” algorithm. We turn each viewer into a point made of their features. When a new heart comes in, we standardise the features, measure distance to everyone else (I use cosine), and grab the K closest profiles. 

If most of those neighbours belong to Room A, you probably belong in Room A too. No training, it’s a memory-based vibe check. Small K = super specific (but noisy), bigger K = steadier (but blurrier). And if your best neighbour is still too far away, our confidence drops and we put you to the 1408 room.

Poster for the horror film 1408, featuring half of John Cusack and Samuel L. Jackson faces behind a large key engraved with the number 1408.

No one lasts more than an hour inside….

Matt’s A Good Sport:

Then my (Caroline’s) flatmate Matt took one for science. Our K-NN “find_room” looked at his impulse and said he’s closest to Daniel (~0.60) and Piyumi (~0.78). But check his curve: quick spike, then he slides below baseline by ~10 seconds. He’s a natural cooler. So the recommender would seat Matt with Daniel & Piyumi, not to crank the fear, but to calm the aftershock.

Matt = Cool, Calm and Collected

Want to know if you calm the room or join the fear? Join our Discord . We’ll post the jump-scare montage, watch with any heart-rate app, export your CSV, and drop it in #fear-lab. We’ll map your impulse, find your fear twins, and tell you your placement: …. or Cooler. Subscribe to our YouTube channel for more videos and more data science

Come on the journey with us by joining the Evil Lair.

Previous
Previous

I Used Maths to Prove Google Trends SUCKS!

Next
Next

AI horror is already here!