Algoritmo de Compatibilidad

Como funciona el calculo del porcentaje de compatibilidad entre candidatos y vacantes

algoritmocompatibilidadmatchingcredito parcialscorecalculoponderacion

Algoritmo de Compatibilidad

El Finder utiliza el Algoritmo de Credito Parcial para calcular que tan compatible es un candidato con una vacante. Este documento explica en detalle como funciona el calculo.

Concepto general

El algoritmo evalua cada habilidad de la vacante contra las habilidades del candidato y produce:

  1. Match por habilidad: Porcentaje de cumplimiento de cada skill
  2. Match de requeridas: Promedio ponderado de skills obligatorias
  3. Bonus de preferidas: Puntos extra por skills deseables
  4. Match general: Combinacion final que determina el ranking

Formula basica

Match por habilidad individual

Formula:

matchPercent = min(100, (userScore / minimumScore) * 100)

Ejemplos:

MinimoScoreCalculoResultado
78(8/7) x 100 = 114%100% (cap)
77(7/7) x 100100%
75(5/7) x 10071%
70(0/7) x 1000%

Nota: El maximo es 100%, no se dan puntos extra por exceder el minimo.

Determinacion de "cumple"

Formula:

met = (userScore >= minimumScore)
MinimoScore¿Cumple?
78Si
77Si
75No (parcial)
70No (faltante)

Match de habilidades requeridas

Formula ponderada

requiredMatch = Sum(matchPercent x weight) / Sum(weight)

Ejemplo:

SkillPesoMatch%Ponderado
JavaScript2100%200
React2100%200
CSS180%80
Node.js1100%100

Calculo:

requiredMatch = (200 + 200 + 80 + 100) / (2 + 2 + 1 + 1)
             = 580 / 6
             = 96.7%

Bonus de habilidades preferidas

Formula

Por cada habilidad preferida cumplida:

bonus = 10% x weight (sumado al match general)

Ejemplo:

Skill PreferidaPeso¿Cumple?Bonus
TypeScript1Si+10%
GraphQL1No+0%
Docker1Si+10%

Calculo:

preferredBonus = 10% + 0% + 10% = 20%

Match general (overallMatch)

Formula completa

overallMatch = (requiredMatch x 0.9) + (preferredBonus x 0.1)

Nota: Las preferidas contribuyen un maximo de ~20% al score total.

Ejemplo completo

Vacante: Desarrollador Frontend

Candidato: Juan Perez

Habilidades requeridas:

SkillPesoMinScoreMatch%Cumple
JavaScript278100%Si
React267100%Si
CSS15480%No
HTML156100%Si

Habilidades preferidas:

SkillPesoMinScoreCumpleBonus
TypeScript156Si+10%
Testing140No0%

Calculo:

  1. Match requeridas:

    • = (100x2 + 100x2 + 80x1 + 100x1) / (2+2+1+1)
    • = (200 + 200 + 80 + 100) / 6
    • = 580 / 6
    • = 96.7%
  2. Bonus preferidas:

    • = 10% (TypeScript cumple)
  3. Match general:

    • = (96.7% x 0.9) + (10% x 0.1)
    • = 87% + 1%
    • = 88%
  4. ¿Cumple requisitos?

    • = 3 de 4 requeridas cumplidas = NO

Indicadores del resultado

Estructura MatchResult

interface MatchResult {
  overallMatch: number;       // 0-100, el % final
  meetsRequirements: boolean; // true si TODAS requeridas OK
  requiredMatch: number;      // % de requeridas
  preferredBonus: number;     // % de bonus
  breakdown: SkillMatch[];    // detalle por skill
}

Estructura SkillMatch

interface SkillMatch {
  skillId: number;
  skillName: string;
  required: boolean;        // requerida o preferida
  minimumScore: number;     // nivel minimo
  userScore: number;        // nivel del candidato
  weight: number;           // ponderacion
  met: boolean;             // cumple el minimo?
  matchPercent: number;     // % de match (0-100)
}

Casos especiales

Sin habilidades evaluadas

Si el candidato no tiene ninguna habilidad evaluada:

  • overallMatch = 0%
  • meetsRequirements = false
  • Todos los skills aparecen como "Faltante"

Vacante sin habilidades

Si la vacante no tiene requisitos definidos:

  • overallMatch = 100% (todos los candidatos "cumplen")
  • No hay breakdown util

Solo preferidas

Si la vacante solo tiene habilidades preferidas (sin requeridas):

  • requiredMatch = 100%
  • meetsRequirements = true
  • El ranking se define solo por el bonus

Peso cero

Si una habilidad tiene peso 0:

  • No contribuye al calculo
  • Aparece en el breakdown pero no afecta el score

Ordenamiento de candidatos

Los candidatos se ordenan por:

  1. Primario: overallMatch descendente
  2. Secundario: Nombre alfabetico

Ejemplo de ranking:

PosCandidatoMatchCumple Req
#1Juan95%Si
#2Maria88%Si
#3Pedro88%No
#4Ana72%No

Nota: Aunque Maria y Pedro tienen el mismo %, Maria tiene prioridad alfabetica.

Pesos y su impacto

Que son los pesos

Cada habilidad puede tener un peso (weight) de 1, 2, 3, etc. que representa su importancia relativa.

Ejemplo de impacto

Escenario: Dos skills con minimo 7

ConfiguracionJavaScript (w=2)CSS (w=1)Match
Ambas OK (8,8)100% x 2 = 200100% x 1 = 100300/3 = 100%
Solo JS OK (8,5)100% x 2 = 20071% x 1 = 71271/3 = 90%
Solo CSS OK (5,8)71% x 2 = 142100% x 1 = 100242/3 = 81%

Conclusion: Fallar en JavaScript (peso 2) impacta mas que fallar en CSS (peso 1).

Recomendaciones de pesos

PesoUso recomendado
1Habilidad estandar
2Habilidad muy importante
3Habilidad critica/core

Credito parcial explicado

Por que "credito parcial"

A diferencia de un sistema binario (cumple/no cumple), este algoritmo da credito proporcional:

Sistema binario:

  • Requiere: 7, Tiene: 6 - 0% de credito

Credito parcial:

  • Requiere: 7, Tiene: 6 - 86% de credito

Esto permite:

  1. Diferenciar entre "casi cumple" y "muy lejos"
  2. Rankear candidatos con diferentes grados de fit
  3. Identificar brechas especificas

Visualizacion

Minimo requerido: 7

CandidatoNivelMatch
A8100% (cap)
B7100%
C571%
D343%
E00%

Optimizacion de busquedas

Para el reclutador

  1. Define minimos realistas: Si pides 10/10, pocos candidatos calificaran
  2. Usa pesos estrategicamente: Skills core con peso mayor
  3. Balance requeridas/preferidas: No todo debe ser obligatorio

Para mejores matches

  1. Evalua habilidades consistentemente: Misma escala para todos
  2. Cubre todas las skills de tus vacantes: Si no evaluas, score = 0
  3. Actualiza evaluaciones: Skills pueden mejorar con el tiempo

Limitaciones del algoritmo

No considera

  • Experiencia: Solo niveles de skill, no anos
  • Educacion: Titulos no afectan el score
  • Soft skills subjetivas: Solo las evaluadas numericamente
  • Contexto: Un 7 en "JavaScript React" vs "JavaScript vanilla"

Posibles mejoras futuras

  • Factor de experiencia
  • Boost por certificaciones
  • Decaimiento temporal de evaluaciones
  • Skills relacionados (transferibles)

Codigo de referencia

El algoritmo esta implementado en:

backend/src/services/SkillMatchingService.ts

Metodos principales:

  • calculateMatch(): Match individual
  • calculateMatchFromSkills(): Logica core
  • findMatchingCandidates(): Busqueda por vacante
  • findMatchingPositions(): Busqueda por candidato

Proximos pasos

¿No encontraste lo que buscabas?

Nuestro equipo de soporte está listo para ayudarte.

Contactar Soporte