eTeamUps Matching Algorithm – V1
The eTeamUps matching algorithm scores how well a candidate fits an existing team across 16 workstyle dimensions. Each dimension measures a different behavioral trait (teamwork, conscientiousness, conflict style, values, etc.) using Likert-scale survey responses.
The algorithm produces:
- A per-dimension score (0-100%) for each of the 16 scored dimensions
- A score category (LOW / MEDIUM / HIGH) for each dimension
- A weighted overall score combining all dimensions
The Scoring Pipeline
Raw Answers
|
v
Pre-processing (exclude faking, apply reverse scoring)
|
v
Per-Dimension Scoring (6 different calculator types)
|
v
Score Categorization (LOW < 33 <= MEDIUM < 66 <= HIGH)
|
v
Weighted Aggregation (overall = sum(score * weight) / sum(weight))
Step 1: Pre-processing
Before any scoring, two transformations are applied to raw survey answers:
Faking Question Exclusion
Eight questions are flagged as “faking detectors” – extreme statements like “Working in teams is always the most effective way to work” that no honest respondent would strongly agree with. These questions are excluded from all scoring calculations. They exist only to detect dishonest respondents.
Faking questions: Q26, Q41, Q54, Q61, Q87, Q99, Q113, Q131.
Reverse Scoring
Some questions are phrased in the opposite direction of what the dimension measures. For example, in the Teamwork dimension (where higher = more team-oriented), the question “I like to do things my own way” is reverse-scored. The raw answer value is flipped:
| Raw Value | Effective Value |
|---|---|
| 1 | 5 |
| 2 | 4 |
| 3 | 3 |
| 4 | 2 |
| 5 | 1 |
This ensures all questions within a dimension point in the same direction.
Step 2: Per-Dimension Scoring
Each of the 16 scored dimensions uses one of 6 calculator types. The calculator type determines the mathematical formula used to produce the 0-100% score.
Mean Computation
For most calculator types, the first step is computing the effective mean for each person on that dimension:
- Take the person’s answers for all questions in the dimension’s question group
- Exclude faking questions
- Apply reverse scoring where flagged
- Compute the arithmetic mean of the remaining effective values
This gives a value between 1.0 and 5.0 for each person.
Step 3: Categorization
Every score percentage is rounded to the nearest integer and categorized:
| Score Range | Category |
|---|---|
| < 33 | LOW |
| 33 – 65 | MEDIUM |
| >= 66 | HIGH |
Step 4: Weighted Aggregation
The overall score for a candidate-team pair is a weighted average:
overall = sum(scorePercentage[i] * weight[i]) / sum(weight[i])
Weights are either 100 (full weight) or 50 (half weight), assigned per dimension. See the Data Reference for the complete weight table.
Calculator Types
SUPPLEMENTARY – Team Similarity
Used by: Work Expectation, Task Relation, Time Urgency, Work Ethic
Concept: Teams work best when members are similar on this trait. A candidate who makes the team more homogeneous scores higher.
Formula:
theoreticalMaxStdDev = sampleStdDev(half 1s and half 5s for teamSize+1 items)
newTeamData = [teamMember1Mean, teamMember2Mean, ..., candidateMean]
newTeamStdDev = sampleStdDev(newTeamData)
score = 100 - (newTeamStdDev / theoreticalMaxStdDev * 100)
The theoretical maximum standard deviation represents the worst case (maximally dispersed team). Dividing by it normalizes the score to 0-100. Subtracting from 100 inverts it so that lower deviation = higher score.
:::info
Standard deviation uses the sample formula (divides by n-1, not n) to match the Apache Commons Math library used in the original Java implementation.
:::
Example: If the existing team has work expectation means of [3.5, 3.5, 3.5] and a candidate also has 3.5, the new team stddev is 0 and the score is 100% (perfect similarity).
COMPLEMENTARY – Team Diversity
Used by: Assertiveness
Concept: Teams work best when members have diverse levels of this trait. A candidate who increases spread scores higher.
Formula:
theoreticalMaxStdDev = sampleStdDev(half 1s and half 5s for teamSize+1 items)
newTeamData = [teamMember1Mean, teamMember2Mean, ..., candidateMean]
newTeamStdDev = sampleStdDev(newTeamData)
score = newTeamStdDev / theoreticalMaxStdDev * 100
Same as SUPPLEMENTARY but without the 100 - inversion. Higher stddev = higher score.
Example: For assertiveness, a team of all moderate scorers (3.0) benefits from a candidate who is either very assertive (5.0) or very deferential (1.0).
MAX_MEAN – Higher is Better
Used by: Teamwork, Goal Priority, Conscientiousness, Learn Orientation, Agreeableness, Intellect
Concept: Higher team average on this trait is desirable. A candidate who raises the team mean scores higher.
Formula:
newTeamMean = mean([teamMember1Mean, ..., candidateMean])
score = (newTeamMean - 1) / (5 - 1) * 100
This linearly maps the 1-5 Likert scale to 0-100%:
- Mean of 1.0 = 0%
- Mean of 3.0 = 50%
- Mean of 5.0 = 100%
MIN_MEAN – Lower is Better
Used by: Reliance, Performance Prove, Performance Avoid
Concept: Lower team average on this trait is desirable. A candidate who lowers the team mean scores higher.
Formula:
newTeamMean = mean([teamMember1Mean, ..., candidateMean])
score = 100 - ((newTeamMean - 1) / (5 - 1) * 100)
Same as MAX_MEAN but inverted. A mean of 1.0 gives 100%, a mean of 5.0 gives 0%.
Example: For Performance Avoid (tendency to avoid challenging work), lower scores are better. A candidate with a mean of 1.5 pushes the team mean down and gets a high score.
TOP_TEN – Values Overlap
Used by: Values (QG1)
Concept: Measures how much a candidate’s top values overlap with the team’s top values. More shared values = better fit.
Algorithm:
For each person, find their top 5 values: answers scored > 3, sorted by value descending (ties broken by question ID descending), take the first 5.
For the team, aggregate all members’ top 5 lists. Rank questions by how many team members selected them. The top 5 most-selected questions become the team’s top values.
Score is based on how many of the team’s top values the candidate also selected:
calcScore(usersSharing) = 4 * (usersSharing - 1)
rawScore = sum of calcScore for each of the 5 team top values
(counting the candidate as an additional user if they overlap)
score = (rawScore - minPossibleScore) / (maxPossibleScore - minPossibleScore) * 100
Where maxPossibleScore = 5 * calcScore(teamSize + 1) (everyone shares all top values) and minPossibleScore distributes users as evenly as possible across all questions.
Example:
- Team top values: Q15 (results), Q6 (ethics), Q16 (collaboration), Q1 (reliability), Q2 (honesty)
- Candidate top values: Q1 (reliability), Q2 (honesty), Q9 (creativity), Q15 (results), Q16 (collaboration)
- Overlap: Q15, Q6… wait, Q6 is not in candidate’s top values. Overlap = Q15, Q16, Q1, Q2 = 4 out of 5
GROUP_AVERAGE – Conflict Style
Used by: Conflict v2 (QG18)
Concept: Each person has a dominant conflict style determined from 16 conflict-related questions. Problem-Solving (PS) is the best style, Compromise (Comp) is good, and the rest (Yield, Force, Avoid) score zero.
Algorithm:
Group the 16 conflict questions by sub-group (metadata field):
- ConflictYield (4 questions)
- ConflictForce (4 questions)
- ConflictComp (2 questions)
- ConflictPS (3 questions)
- ConflictAvoid (3 questions)
Compute each sub-group’s answer sum divided by the total question count (16, not the sub-group’s own count). The sub-group with the highest score is the person’s dominant conflict style. (This matches the Java implementation where all sub-group sums are divided by the same denominator, so it is effectively a raw-sum comparison.)
Map the dominant style to a numeric score:
| Dominant Style | Score |
|---|---|
| Problem-Solving (PS) | 13 |
| Compromise (Comp) | 7 |
| Yield | 0 |
| Force | 0 |
| Avoid | 0 |
- Normalize:
teamSum = sum of all team members' conflict scores
newSum = teamSum + candidateScore
maxPossible = (teamSize + 1) * 13
score = (newSum / maxPossible) * 100
Example: If a 3-person team has conflict scores [13, 7, 13] (two PS, one Comp), teamSum = 33. A PS-dominant candidate adds 13. newSum = 46, maxPossible = 4 * 13 = 52. Score = 46/52 * 100 = 88.5%.
Worked Example: Dave Petrov vs Engineering Core
Engineering Core is a 3-person team: Alice Rivera (Tech Lead), Bob Chen (Senior Developer), Carol Okafor (DevOps Engineer).
Dave Petrov is a Full-Stack Developer candidate.
Team Baselines
Dimension Type Weight Baseline
────────────────────────── ──────────────── ──────── ────────────────
values TOP_TEN 100% 40.0% MEDIUM
teamwork MAX_MEAN 100% 63.0% MEDIUM
workexpectation SUPPLEMENTARY 100% 100.0% HIGH
reliance MIN_MEAN 100% 45.8% MEDIUM
goalpriority MAX_MEAN 100% 71.7% HIGH
taskrelation SUPPLEMENTARY 100% 75.0% HIGH
timeurgency SUPPLEMENTARY 100% 85.7% HIGH
workethic SUPPLEMENTARY 100% 89.3% HIGH
conscientiousness MAX_MEAN 100% 70.8% HIGH
learnorientation MAX_MEAN 50% 75.0% HIGH
assertiveness COMPLEMENTARY 100% 21.7% LOW
agreeableness MAX_MEAN 100% 70.8% HIGH
performanceprove MIN_MEAN 50% 41.7% MEDIUM
performanceavoid MIN_MEAN 50% 30.0% LOW
intellect MAX_MEAN 100% 75.0% HIGH
conflict-v2 GROUP_AVERAGE 50% 84.6% HIGH
Dave’s Dimension Scores
values (TOP) [weight: 100%]
Team top: Q15, Q6, Q16, Q1, Q2
Candidate top: Q1, Q2, Q15, Q16, Q9
Overlap: 4/5 [Q15, Q6... actually Q1, Q2, Q15, Q16]
Score: 53.3% MEDIUM
teamwork (MAX) [weight: 100%]
Team mean: 3.519 | Candidate mean: 4.222 | New mean: 3.694 | StdDev: 0.451
Score: 67.4% HIGH
workexpectation (SUP) [weight: 100%]
Team mean: 3.500 | Candidate mean: 3.000 | New mean: 3.375 | StdDev: 0.250
Score: 89.2% HIGH
conflict-v2 (CAVG) [weight: 50%]
Team mean: 11.000 | Candidate mean: 13.000 | New mean: 11.500
Score: 88.5% HIGH
Overall Result
┌────────────────────────────────────────────────────────────┐
│ Dave Petrov vs Engineering Core -- Overall: 70.4% HIGH │
└────────────────────────────────────────────────────────────┘
Candidate Comparison
The algorithm scores all candidates against each team and produces a comparison:
── Engineering Core -- Candidate Comparison ────────────────────────
Dimension Wt Dave Petrov Eve Tanaka Sam Reyes
────────────────────────── ───── ────────────────── ────────────────── ──────────────────
values (TOP) 100% 53.3% MEDIUM 26.7% LOW 46.7% MEDIUM
teamwork (MAX) 100% 67.4% HIGH 53.5% MEDIUM 63.2% MEDIUM
workexpectation (SUP) 100% 89.2% HIGH 89.2% HIGH 100.0% HIGH
reliance (MIN) 100% 59.4% MEDIUM 46.9% MEDIUM 56.3% MEDIUM
goalpriority (MAX) 100% 76.3% HIGH 60.0% MEDIUM 70.0% HIGH
taskrelation (SUP) 100% 78.3% HIGH 67.5% HIGH 79.3% HIGH
timeurgency (SUP) 100% 82.2% HIGH 67.9% HIGH 87.6% HIGH
workethic (SUP) 100% 82.2% HIGH 58.9% MEDIUM 89.3% HIGH
conscientiousness (MAX) 100% 71.9% HIGH 62.5% MEDIUM 68.8% HIGH
learnorientation (MAX) 50% 78.1% HIGH 65.6% HIGH 71.9% HIGH
assertiveness (COMP) 100% 20.9% LOW 28.5% LOW 17.7% LOW
agreeableness (MAX) 100% 75.0% HIGH 62.5% MEDIUM 68.8% HIGH
performanceprove (MIN) 50% 62.5% MEDIUM 53.1% MEDIUM 56.3% MEDIUM
performanceavoid (MIN) 50% 73.8% HIGH 58.8% MEDIUM 67.5% HIGH
intellect (MAX) 100% 78.1% HIGH 65.6% HIGH 71.9% HIGH
conflict-v2 (CAVG) 50% 88.5% HIGH 63.5% MEDIUM 76.9% HIGH
────────────────────────── ───── ────────────────── ────────────────── ──────────────────
OVERALL 70.4% HIGH 57.9% MEDIUM 68.3% HIGH
Recommendation for Engineering Core:
>> 1. Dave Petrov: 70.4% HIGH
2. Sam Reyes: 68.3% HIGH
3. Eve Tanaka: 57.9% MEDIUM
Grand Summary
When multiple teams are evaluated, a final grand summary shows which candidate is the best fit for each:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GRAND SUMMARY
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Dave Petrov Eve Tanaka Sam Reyes
────────────────────── ──────────────────── ──────────────────── ────────────────────
Engineering Core 70.4% HIGH 57.9% MEDIUM 68.3% HIGH
Growth Squad 68.4% HIGH 51.7% MEDIUM 62.5% MEDIUM
────────────────────── ──────────────────── ──────────────────── ────────────────────
Best Matches:
Engineering Core -> Dave Petrov (70.4% HIGH)
Growth Squad -> Dave Petrov (68.4% HIGH)
Key Design Decisions
Sample standard deviation (n-1) is used instead of population (n) to match the Apache Commons Math
DescriptiveStatisticsclass used in the original Java implementation.Faking questions are excluded before any mean calculation. They are never part of scoring, only social-desirability detection.
Reverse scoring is applied at the individual answer level, not the group mean level. Each flagged question’s raw value is flipped before aggregation.
Theoretical max stddev is calculated dynamically based on team size, not hardcoded. This ensures correct normalization regardless of team size.
TOP_TEN actually uses top 5, not top 10. The enum name is a legacy artifact from the Java codebase.
GROUP_AVERAGE conflict scoring is binary per sub-group – only the dominant sub-group matters, and only PS (13) and Comp (7) contribute positive scores.
Beyond Workstyle — Role Match, Combined Scoring & Compare
V1 above only covers workstyle (16 dimensions). The platform also ships:
- Role Match — scores a candidate’s experience and goals against a
RoleSpecification. - Combined Score — blends role + workstyle into a single 0–100 score.
- Individual Compare — pairwise / mutual comparison between two candidates.
These are exposed via POST /evaluation/{id}/team-match and POST /evaluation/compare. Full algorithm details are in Role Match & Combined Scoring. UI wiring guides: Admin, HUB.