Score Calculation Deep Dive
🧠 Behind the Scenes: How Scores Are Calculated
This section will walk through how inputs, categories, and peer groups are used in the mathematical calculation of the score. The steps involved in calculating the score are the following:
-
Normalize Input Amongst Peers
Every input—whether it's a number, date, boolean, or string—is normalized between 0 and 1 within its peer group. This ensures fairness across companies of different sizes or types.
-
Summing the inputs
Each input is multiplied by its weight. Scores are summed and capped per category if needed.
-
Assign Score Grade
Raw scores are then ranked within each peer group to assign a letter grade from A+ to F.
1) Normalize Inputs Amongst Peers
In order for inputs to be useful in scoring, they must be normalized. The task is to take values such as Website Visitors L30D = 36, Last Engagement = January 1st 2025, or Is Job Switcher = true, and convert them to a value from 0 to 1. In order to honor our peer group concept, we want 1 to represent the highest value for a given input in the peer group and 0 to be the lowest in the peer group.
Each input datatype has a different required normalization:
- Numbers
- We use a linear normalization for numbers. Within each peer group we find the maximum and minimum value of the input. Then we apply the following formula:
normalized = (number_value - min) / (max - min)
- We use a linear normalization for numbers. Within each peer group we find the maximum and minimum value of the input. Then we apply the following formula:
- Booleans (including signals)
- Booleans are already normalized with their value being either 0 or 1.
- Dates
- A date input contributes the most to the score the closer it is to the present day. The contribution then decays linearly over the following 60 days. To accomplish this we apply the following formula:
max(0, 1 - absolute_value(today - date_value) / 60). If the date_value is today, the value is 1. If the date_value is 59 days ago it's 0.016. If the date_value is 100 days ago, the value is 0.
- A date input contributes the most to the score the closer it is to the present day. The contribution then decays linearly over the following 60 days. To accomplish this we apply the following formula:
- AI Events
- In Pocus, AI events are assigned important values by the relevance agent. We apply a linear decay to these importance values and sum across all the events that took place across the last 60 days. The formula is the following:
sum(importance_score / (today - event_date) + 1). This sum is then treated like a number input and is normalized amongst its peers.
- In Pocus, AI events are assigned important values by the relevance agent. We apply a linear decay to these importance values and sum across all the events that took place across the last 60 days. The formula is the following:
- Strings
- String inputs need to be converted from natural language values (like industry = "tech") into numeric values (0.8) to contribute to scoring. This conversion uses AI to assign meaningful values. When a string trait is added to a score, our system automatically collects the 50 most common values for that field. Our AI then assigns each value a number from 0 to 1 based on the input name, description, and company context. For example, if a customer sells to health-tech companies, the industry field might have assigned value of: "health-tech" = 1.0, "health" = 0.8, "tech" = 0.7, and "finance" = 0.1.
2) Summing The Inputs
Now that each input is a value from 0 to 1, we apply the the configured weights. This is a simple operation of multiplying each input by the weight from -1 to 1. These weights corresponded with the slider values shown during score configuration.
Once the weights are applied, the inputs are summed together using the following formula to account for category caps:
min(sum(weighted_input_values), sum(input_weights) * cap)
To walk through an example, let's imagine there is no cap assigned. In this case, the value cap is 1. Also, recall the input value are normalized now, so they are at most 1. With this in mind, the sum of the weighted inputs (input_value * input_weight) will always be less than the number of the input weights. Therefore, the formula can be simplified to sum(weighted_input_values) . Now, let's assume there is a High Restriction cap, cap=0.2 . In this case, the second part of the formula imposes a ceiling of the category, limiting it to only 20% of the maximum weight it is usually able to contribute.
3. Assign Score Grade
At this point, the scores are raw values summing up the inputs. The goal is for the highest scoring company within a peer group to be assigned a 1 and other companies to be some value less than 1. Importantly, we do not want to linearly distribute the companies from 0 to 1, instead we want to "grade the companies amongst their peers." The highest score sets where A+ is and every 10% drop below that is another grade cutoff. This means that the lowest scoring companies do not necessarily receive an F–it is purely dependent on their percentile difference from the top score. We need some complicated math to make this work with negative scores, but put simply the formula is as follows: 1 - (max_raw_score - raw_score) / max_raw_score .
Updated 5 months ago