2022-10-09 20:59:33 -06:00
---
title: CLRG Scoring Analyzed
date: 2022-10-09
2022-10-10 07:21:53 -06:00
tags:
- clrg
2022-10-09 20:59:33 -06:00
stylesheets:
- toys.css
scripts:
- scorecard.mjs
---
Let's take a look how how CLRG does its scoring!
*With math!*
## How CLRG Scoring Works
As I am given to understand, the scoring works like so:
1. Adjudicators give you a "raw score": a real number between 0 and 100
2. The scoring system ranks each dancer per adjudicator, based on raw scores
3. These rankings are mapped into "award points"
4. All of a dancer's award points are summed
5. Final ranking is determined by comparing total award points
## Raw Scoring
The way raw scores translate into rankings and award points is a little
confusing, so I've made a little tool you can play with to get a feel for how it
works. Essentially, it's a way of normalizing places to an adjudicator: score
weights are only relative to the judge that assigns them.
Adjudicator A can assign scores between 80 and 100;
adjudicator B can assign scores between 1 and 40;
and they'll both have a first, second, third, fourth place, etc.
These places then get translated into award points.
## Award Points
Award points are handed out based on ranking against other dancers for that
adjudicator. I obtained these values from a FeisWorx results page for my kid:
< div class = "awardPoints" >
< table >
< thead >
< tr >
< th > Ranking< / th > < th > Award Points< / th >
< / tr >
< / thead >
< tbody > < / tbody >
< / table >
< / div >
If there's a 2-way, 3-way, or n-way tie,
all tied dancers get the average of the next 2, 3, or n award points,
and the next 2, 3, or n rankings are skipped.
## What's with these values?
At first glance, the award points look like the output of an exponential function.
{{< figure src = "chart.png" alt = "Chart of scores vs. award points" > }}
In an effort to figure out where these numbers came from,
I ran some curve fitting against the data.
Here's the best I could come up with:
| Ranking range | Award Points Function | Type of function |
| --: | --: | --- |
| 1 - 11 | 100 * x^-0.358 | Exponential |
| 12 - 50 | 51 - x | Linear |
| 51 - 60 | 14.2 - 0.46x + 0.00385x | Polynomial |
| 61 - 100 | 1 - x/100 | Linear |
If you, dear reader, are a mathematician,
I would love to hear your thoughts on why they went with this algorithm.
There are a few points to note here:
* 1st place is a *huge deal* . Disproportionately huge.
* Places 2-10 are similarly big deals compared to places 3-11.
* Places 12-50 operate the way most people probably assume ranking works: linearly.
2022-10-09 21:47:37 -06:00
* Places 51-60 fit best to a second degree polynomial, but it doesn't matter much for differences of hundreths of a point. This section is *really weird* , mathematically.
2022-10-09 20:59:33 -06:00
* Places 61-100 are all less than 1 point. If you're a judge trying to tank a top dancer, anywhere in this range is equivalent to anywhere else.
## Consequences of Exponential Award Points
Playing around with this,
I've found a few interesting consequences
of the exponential growth in the top 11 places.
### 1st place is super important
2022-10-09 21:42:30 -06:00
1st place is weighted so heavily that one judge could move a 5th place dancer into 2nd.
2022-10-09 20:59:33 -06:00
< table class = "scorecard" >
< thead >
< tr >
< td > < / td >
< th > Alice< / th >
< th > Bob< / th >
2022-10-09 21:42:30 -06:00
< th > Carol< / th >
2022-10-09 20:59:33 -06:00
< / tr >
< / thead >
< tbody >
< tr >
< th class = "justify-left" > Adj. 1< / th >
2022-10-09 21:42:30 -06:00
< td > < input type = "number" min = 1 max = 99 value = 1 readonly > < / td >
< td > < input type = "number" min = 1 max = 99 value = 3 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 2 > < / td >
2022-10-09 20:59:33 -06:00
< / tr >
< tr >
< th class = "justify-left" > Adj. 2< / th >
2022-10-09 21:42:30 -06:00
< td > < input type = "number" min = 1 max = 99 value = 5 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 3 > < / td >
2022-10-09 22:49:58 -06:00
< td > < input type = "number" min = 1 max = 99 value = 1 > < / td >
2022-10-09 20:59:33 -06:00
< / tr >
< tr >
< th class = "justify-left" > Adj. 3< / th >
2022-10-09 21:42:30 -06:00
< td > < input type = "number" min = 1 max = 99 value = 5 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 3 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 2 > < / td >
2022-10-09 20:59:33 -06:00
< / tr >
< / tbody >
< tfoot >
< tr >
< th class = "justify-left" > Award Points< / th >
< td class = "justify-right" > < output name = "points" > < / td >
< td class = "justify-right" > < output name = "points" > < / td >
2022-10-09 21:42:30 -06:00
< td class = "justify-right" > < output name = "points" > < / td >
2022-10-09 20:59:33 -06:00
< / tr >
< tr >
< th class = "justify-left" > Ranking< / th >
< td class = "justify-right" > < output name = "ranking" > < / td >
< td class = "justify-right" > < output name = "ranking" > < / td >
2022-10-09 21:42:30 -06:00
< td class = "justify-right" > < output name = "ranking" > < / td >
2022-10-09 20:59:33 -06:00
< / tr >
< / tfoot >
< / table >
2022-10-09 21:42:30 -06:00
You can adjust these values to get a better feel for how scoring works.
2022-10-09 20:59:33 -06:00
2022-10-09 21:42:30 -06:00
### Tanking a high-ranked dancer is another way to cheat
2022-10-09 20:59:33 -06:00
2022-10-09 21:42:30 -06:00
Because of that exponential curve,
a low ranking from a single judge can carry a lot of weight.
< table class = "scorecard" >
< thead >
< tr >
< td > < / td >
< th > Alice< / th >
< th > Bob< / th >
< th > Carol< / th >
< / tr >
< / thead >
< tbody >
< tr >
< th class = "justify-left" > Adj. 1< / th >
< td > < input type = "number" min = 1 max = 99 value = 3 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 11 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 2 > < / td >
< / tr >
< tr >
< th class = "justify-left" > Adj. 2< / th >
< td > < input type = "number" min = 1 max = 99 value = 3 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 1 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 2 > < / td >
< / tr >
< tr >
< th class = "justify-left" > Adj. 3< / th >
< td > < input type = "number" min = 1 max = 99 value = 3 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 2 > < / td >
2022-10-09 22:54:56 -06:00
< td > < input type = "number" min = 1 max = 99 value = 1 > < / td >
2022-10-09 21:42:30 -06:00
< / tr >
< / tbody >
< tfoot >
< tr >
< th class = "justify-left" > Award Points< / th >
< td class = "justify-right" > < output name = "points" > < / td >
< td class = "justify-right" > < output name = "points" > < / td >
< td class = "justify-right" > < output name = "points" > < / td >
< / tr >
< tr >
< th class = "justify-left" > Ranking< / th >
< td class = "justify-right" > < output name = "ranking" > < / td >
< td class = "justify-right" > < output name = "ranking" > < / td >
< td class = "justify-right" > < output name = "ranking" > < / td >
< / tr >
< / tfoot >
< / table >
2022-10-09 22:34:44 -06:00
### Being in 1st provides a nice buffer
Try playing around with Alice's rankings with Adjudicators 2 and 3 here.
She has to get ranked a lot lower before her overall ranking starts going down.
< div class = "scrolly" >
< table class = "scorecard" >
< thead >
< tr >
< td > < / td >
< th > Alice< / th >
< th > Bob< / th >
< th > Carol< / th >
< th > Dave< / th >
< th > Erin< / th >
< / tr >
< / thead >
< tbody >
< tr >
< th class = "justify-left" > Adj. 1< / th >
< td > < input type = "number" min = 1 max = 99 value = 1 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 3 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 2 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 4 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 5 > < / td >
< / tr >
< tr >
< th class = "justify-left" > Adj. 2< / th >
< td > < input type = "number" min = 1 max = 99 value = 7 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 1 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 2 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 3 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 4 > < / td >
< / tr >
< tr >
< th class = "justify-left" > Adj. 3< / th >
2022-10-09 22:49:58 -06:00
< td > < input type = "number" min = 1 max = 99 value = 5 > < / td >
2022-10-09 22:34:44 -06:00
< td > < input type = "number" min = 1 max = 99 value = 2 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 1 > < / td >
< td > < input type = "number" min = 1 max = 99 value = 3 > < / td >
2022-10-09 22:49:58 -06:00
< td > < input type = "number" min = 1 max = 99 value = 4 > < / td >
2022-10-09 22:34:44 -06:00
< / tr >
< / tbody >
< tfoot >
< tr >
< th class = "justify-left" > Award Points< / th >
< td class = "justify-right" > < output name = "points" > < / td >
< td class = "justify-right" > < output name = "points" > < / td >
< td class = "justify-right" > < output name = "points" > < / td >
< td class = "justify-right" > < output name = "points" > < / td >
< td class = "justify-right" > < output name = "points" > < / td >
< / tr >
< tr >
< th class = "justify-left" > Ranking< / th >
< td class = "justify-right" > < output name = "ranking" > < / td >
< td class = "justify-right" > < output name = "ranking" > < / td >
< td class = "justify-right" > < output name = "ranking" > < / td >
< td class = "justify-right" > < output name = "ranking" > < / td >
< td class = "justify-right" > < output name = "ranking" > < / td >
< / tr >
< / tfoot >
< / table >
< / div >