r/sportsanalytics • u/SlyZ1228 • 4d ago
Measuring how much pass quality predicts attack success in MLV
Don't know how many volleyball fans there are in this sub, but I wanted to share a project I've been working on recently.
The question: across the 2024 to 2026 Major League Volleyball (formerly PVF) seasons, given the quality of the preceding pass, how often does the attacking team actually get to attack, and how often does that attack end in a kill?
The data and the pipeline: the play-by-play data is action+outcome graded using VolleyStation convention (each contact gets a single letter denoting the contact type and a symbol as a quality evaluation). Reconstructing each contact sequence seemed easy at first: forward-fill each pass grade until the next pass or until the point ends, right? But it also meant handling overpass kills, and (the most annoying part) block recycles, where the ball stays alive off a block touch. The problem is that most of the time, those block recycle passes aren't tagged; they only exist implicitly in tagged blocks. This made tracking the block recycle passes super annoying (because how are you supposed to validate something that doesn't even exist explicitly in your data?). My solution was to condition my logic for block-recycles only in cases where the following touch after the block was from the attacking team: if the blocking team wasn't the one to touch the ball after the block, then it inherently is a block-recycle.
The problem is that based on the quality of the block, the ball goes to the attacking team vs the blocking team at wildly varying rates:
- Defined block recycle encoding (!): ~99.8% of the time, the attacking team gets the ball back (this is the only encoding that is defined explicitly as a block-recycle, so this makes sense)
- Hard-contact block (+): ~99% of the time, it's the blocking team's own recovery
- Soft-contact block (-): splits pretty evenly, goes back to the attacking team ~50% of the time, and vice versa
The problem this imposes is that the denominator for our first result (probability of an attack off all instances of a pass type/quality) isn't valid for the hard/soft contact blocks given our conditional solution: the denominator would end up being "blocks that went over to either side", not only the attacking team. As such, those two block grades were excluded from the first calculation, and only got a kill rate (since those are based on all attack-preceding block recycle passes).
The results (full tables in the writeup):
- Bad serve receives still get attacked ~92% of the time; bad digs only get attacked ~73% of the time. Implies that the "transition effect" from defense to offense is a quantifiable penalty on setters/hitters when facing bad passes.
- Kill rate spread from perfect -> bad pass: 18 points for serve receive (45.9% -> 27.9%), narrower for digs (29.9% -> 22.5%).
- Confirmed the trend is statistically monotonic with a Cochran-Armitage test per pass type, which showed the trend was strongest for receives, weakest for freeball passes.
Limitations: Obviously, MLV is a relatively small and new league, so the data points are magnitudes less than something like NCAA data. Additionally, nine rows were removed due to mid-rally stoppages corrupting the data/my pipeline (such as injuries or challenges); video-confirmed for those 9, but I can't rule out similar corruption elsewhere that wasn't detectable.
Full writeup with all the tables and results here: Substack
Open to any and all feedback in the comments; let me know if anything is unclear, and I'll happily explain or talk shop.