跳到正文
DEV Community· Heorhii Lavrynenko·· 3 小時前AI 評分36

如何在 JavaScript 統計薪酬覆蓋率而不虛構薪金

Cómo contar cobertura salarial sin inventar salarios en JavaScript

AI 導讀

這篇 JavaScript 教學示範如何區分薪酬欄位是否存在,以及金額能否正規化為可比較的年度税前薪酬;在 MapaLocal 的研究中,423 筆篩選後記錄有 107 個薪酬欄位,但不足以估算平均薪酬。例子只接受明確標示的年度税前金額,或有記錄發薪次數的月薪,並分開統計欄位數與可正規化金額數。

正文

Heorhii Lavrynenko

Transparencia: texto y ejemplo preparados con ayuda de IA. Las filas del ejemplo son sintéticas.

Una canalización de datos de empleo debería responder dos preguntas distintas: ¿hay un campo de salario? y ¿puedo comparar su contenido como bruto anual? En el estudio de MapaLocal sobre salarios por convenio y ofertas contamos 107 campos salariales entre 423 registros filtrados; eso no basta para estimar una media salarial. Aquí mostramos una forma de conservar esa distinción en JavaScript.

Define el contrato de entrada

Este ejemplo supone que la fase de ingesta ya extrajo texto o números. Un valor ausente no equivale a cero. La normalización solo admite bruto anual explícito, o bruto mensual con número de pagas documentado. En producción también habría que controlar moneda, jornada, rangos, procedencia y duplicados.

function classify(row) {
  const hasField = row.raw != null && String(row.raw).trim() !== "";
  if (!hasField) return { hasField, annual: null };
  const validAmount = Number.isFinite(row.amount) && row.amount > 0;
  if (!validAmount || row.kind !== "gross") return { hasField, annual: null };
  if (row.period === "year") return { hasField, annual: row.amount };
  if (row.period === "month" && Number.isInteger(row.payments) && row.payments > 0) {
    return { hasField, annual: row.amount * row.payments };
  }
  return { hasField, annual: null };
}

const example = [
  { raw: null },
  { raw: "1.400 €/mes", amount: 1400, period: "month" },
  { raw: "1.400 € brutos/mes, 14 pagas", amount: 1400,
    kind: "gross", period: "month", payments: 14 },
  { raw: "21.000 € brutos/año", amount: 21000, kind: "gross", period: "year" }
].map(classify);

console.assert(example.filter(x => x.hasField).length === 3);
console.assert(example.filter(x => x.annual !== null).length === 2);
console.assert(example[2].annual === 19600);

Publica dos contadores

Guarda por separado el denominador filtrado, el número de campos presentes y el número de importes normalizables. Registra también el criterio de filtrado y la fecha de extracción. El primer cociente mide cobertura; el segundo ayuda a decidir si existe suficiente información comparable. Ninguno vuelve representativa una extracción.

Para inspeccionar errores, conserva un motivo de descarte junto con el dato original: periodo desconocido, bruto sin confirmar o pagas no documentadas. Así se puede revisar la regla sin convertir un supuesto en un resultado.

來源:DEV Community · dev.to