Imputación de salarios en datos de portales de empleo de IA con Random Forest
🐢 Hoy quiero compartir un proyecto en el que he estado trabajando últimamente.
Me he propuesto ir mostrando proyectos de vez en cuando para mejorar mis habilidades y aprender nuevas cosas. Además, ¡un feedback me vendría genial para seguir creciendo!
Soy consciente de que esto puede sonar directo, pero estoy en plena fase de mejora. Quien se dedica a lo técnico sabe que esto es un proceso constante de evolución, ¿no?
Contexto y objetivo
En este proyecto analicé una base de datos scrapeada de portales de empleo de EE.UU (obtenida de kaggle), centrada en puestos relacionados con IA (ingenieros de ML, científicos de datos, ingenieros de investigación, científicos aplicados, entre otros).
La mayoría de los puestos tenían un seniority alto y especializaciones muy nicho.
El objetivo principal era analizar y sacar conclusiones sobre la tendencia de los empleos relacionados con la IA, los sueldos, los conocimientos técnicos que se están pidiendo en las ofertas y en definitiva tener una visión panorámica de a donde va evolucionando los empleos ligados a la IA. Pero me topé con 2 columnas importantes para el análisis pero con muchos nulos (cerca del 32%): tipo de jornada y salario.
Desafío: imputar jornada laboral
Convertí todos los salarios a sueldo diario para estandarizar, y solo imputé salarios faltantes cuando la jornada dominante era clara (≥70%), dejando el resto como desconocidos.
Aqui muestro el bucle que usé para imputar por jornada dominante clara
dominant_jobtypes ={}
threshold = 0.7
for position, row in jobtype_by_position.iterrows():
top_jobtype = row.idxmax()
top_freq = row.max()
if top_freq >= threshold:
dominant_jobtypes[position] = top_jobtype
Desafío: imputar salarios faltantes
El 32% de los salarios estaban ausentes y formatos variados ( por dia, año, por contrato, intervalos...)
Primero los unifique todo a un solo formato, busque el formato mayoritario para no manipular demaciado los datos y así evitar introducir demaciado ruido y una vez limpios, en formato numérico y en el mismo formato tocó solucionar los nulos.
Tras barajar varias posibilidades al final me decidí por usar un modelo Random Forest para imputarlos. Elegí este modelo porque:
- Maneja bien relaciones no lineales
- Resiste outliers
- Permite obtener una visión aproximada, ya que no pretendía exactitud extrema (los sueldos dependen de muchos factores que no estaban en el dataset, como experiencia o especialización) Entre otras ventajas que tiene
Proceso (resumido para no alargar mucho)
- Separé los datos en dos grupos: salarios conocidos y faltantes.
- Del grupo de conocidos, reservé un subconjunto para validación.
- Codifiqué variables categóricas usando ordinal encoding y target encoding con validación cruzada para evitar fugas de datos.
- Optimizé hiperparámetros con RandomizedSearchCV para mejorar el modelo.
- Evalué con métricas de regresión: MAE, RMSE y R². Dado que el salario es muy variable, estas métricas sirvieron para validar que el modelo capturaba tendencias generales.
- Finalmente, imputé los valores faltantes con las predicciones del modelo.
Lo que aprendí en este proyecto
Este proyecto fue una gran oportunidad para practicar:
- Limpieza y preparación de datos
- Feature engineering
- Modelado con datos reales y complejos
- Manejo de incertidumbre en la imputación
Además, el tema del dataset es muy interesante y relevante para entender el mercado laboral en IA.
Puedes ver el proyecto completo y el código en mi Analisis empleos ia EE.UU, 2025.
Os dejo un par de las gráficas que obtuve para el análisis:
Top comments (0)