69. Funciones en ciencia de datos

69.1 Introducción

La ciencia de datos usa funciones para convertir datos crudos en información útil. Una función puede limpiar valores, calcular métricas, transformar escalas, detectar anomalías o preparar datos para un modelo.

En programación, trabajar con datos significa aplicar muchas transformaciones pequeñas y controladas. Por eso las funciones son una herramienta central: permiten repetir procesos, probarlos y combinarlos.

69.2 Datos como listas

Muchos análisis comienzan con una lista de valores. Una función puede recorrer esa lista y producir un resumen.

function contarDatos(datos) {
  return datos.length;
}

const edades = [18, 22, 25, 31, 40];

console.log("Cantidad de datos:", contarDatos(edades));

Antes de calcular métricas conviene conocer cuántos datos tenemos y si la lista está vacía.

69.3 Suma y promedio

El promedio es una medida básica de tendencia central. Se calcula sumando los valores y dividiendo por la cantidad de datos.

function suma(datos) {
  return datos.reduce((total, valor) => total + valor, 0);
}

function promedio(datos) {
  if (datos.length === 0) {
    return 0;
  }

  return suma(datos) / datos.length;
}

const ventas = [120, 180, 90, 210, 160];
console.log("Promedio:", promedio(ventas));

69.4 Mínimo y máximo

El mínimo y el máximo permiten conocer el rango de los datos. Son útiles para validar valores y preparar escalas gráficas.

function minimo(datos) {
  return Math.min(...datos);
}

function maximo(datos) {
  return Math.max(...datos);
}

const temperaturas = [21.5, 19.2, 24.8, 18.9, 23.1];

console.log("Mínimo:", minimo(temperaturas));
console.log("Máximo:", maximo(temperaturas));

69.5 Rango

El rango mide la diferencia entre el valor máximo y el mínimo. Es una forma simple de observar dispersión.

function rango(datos) {
  return Math.max(...datos) - Math.min(...datos);
}

const mediciones = [12, 18, 15, 30, 21];

console.log("Rango:", rango(mediciones));

69.6 Filtrado de datos

Filtrar significa conservar solamente los datos que cumplen una condición. En ciencia de datos se usa para quitar registros inválidos o seleccionar subconjuntos.

function filtrarMayoresOIguales(datos, limite) {
  return datos.filter(valor => valor >= limite);
}

const puntajes = [45, 82, 77, 30, 91, 65];
const aprobados = filtrarMayoresOIguales(puntajes, 60);

console.log(aprobados);

69.7 Limpieza de valores nulos

Los datos reales pueden tener valores faltantes. Una función de limpieza puede quitarlos antes de calcular estadísticas.

function quitarNulos(datos) {
  return datos.filter(valor => valor !== null && valor !== undefined);
}

const datos = [10, null, 15, undefined, 20, 0];

console.log(quitarNulos(datos));

El valor 0 no debe eliminarse si representa una medición válida.

69.8 Reemplazo de valores faltantes

Otra estrategia es reemplazar valores faltantes por un valor calculado, como el promedio.

function promedio(datos) {
  const validos = datos.filter(valor => valor !== null && valor !== undefined);
  return validos.reduce((total, valor) => total + valor, 0) / validos.length;
}

function completarFaltantes(datos) {
  const valorPromedio = promedio(datos);
  return datos.map(valor => valor === null || valor === undefined ? valorPromedio : valor);
}

const datos = [8, null, 10, 12, undefined];

console.log(completarFaltantes(datos));

69.9 Transformación de columnas

Un conjunto de registros suele representarse como una lista de objetos. Las funciones pueden crear nuevas columnas a partir de las existentes.

function agregarTotal(registros) {
  return registros.map(registro => ({
    ...registro,
    total: registro.precio * registro.cantidad
  }));
}

const ventas = [
  { producto: "A", precio: 100, cantidad: 3 },
  { producto: "B", precio: 80, cantidad: 5 }
];

console.log(agregarTotal(ventas));

69.10 Normalización min-max

Normalizar valores permite llevarlos a una escala común. La normalización min-max convierte valores al intervalo de 0 a 1.

function normalizarMinMax(datos) {
  const min = Math.min(...datos);
  const max = Math.max(...datos);

  return datos.map(valor => (valor - min) / (max - min));
}

const alturas = [150, 165, 180, 190];

console.log(normalizarMinMax(alturas));

69.11 Estandarización

La estandarización convierte valores en cuántas desviaciones estándar se alejan del promedio. Es común en modelos estadísticos y aprendizaje automático.

function promedio(datos) {
  return datos.reduce((total, valor) => total + valor, 0) / datos.length;
}

function desviacionEstandar(datos) {
  const media = promedio(datos);
  const varianza = promedio(datos.map(valor => (valor - media) ** 2));
  return Math.sqrt(varianza);
}

function estandarizar(datos) {
  const media = promedio(datos);
  const desviacion = desviacionEstandar(datos);
  return datos.map(valor => (valor - media) / desviacion);
}

console.log(estandarizar([10, 12, 14, 16]));

69.12 Mediana

La mediana es el valor central cuando los datos están ordenados. Es más resistente a valores extremos que el promedio.

function mediana(datos) {
  const ordenados = [...datos].sort((a, b) => a - b);
  const mitad = Math.floor(ordenados.length / 2);

  if (ordenados.length % 2 === 0) {
    return (ordenados[mitad - 1] + ordenados[mitad]) / 2;
  }

  return ordenados[mitad];
}

console.log(mediana([9, 2, 15, 4, 7]));
console.log(mediana([9, 2, 15, 4]));

69.13 Frecuencias

Contar frecuencias permite saber cuántas veces aparece cada categoría o valor.

function contarFrecuencias(datos) {
  const frecuencias = {};

  for (const valor of datos) {
    frecuencias[valor] = (frecuencias[valor] || 0) + 1;
  }

  return frecuencias;
}

const categorias = ["A", "B", "A", "C", "B", "A"];

console.log(contarFrecuencias(categorias));

69.14 Agrupación de registros

Agrupar registros por una propiedad permite calcular resúmenes por categoría, ciudad, producto, usuario o período.

function agruparPor(registros, campo) {
  return registros.reduce((grupos, registro) => {
    const clave = registro[campo];
    grupos[clave] = grupos[clave] || [];
    grupos[clave].push(registro);
    return grupos;
  }, {});
}

const ventas = [
  { ciudad: "Córdoba", monto: 120 },
  { ciudad: "Rosario", monto: 90 },
  { ciudad: "Córdoba", monto: 150 }
];

console.log(agruparPor(ventas, "ciudad"));

69.15 Suma por grupo

Después de agrupar, es común calcular totales por categoría. Esta operación resume muchos registros en pocos resultados.

function sumarPorGrupo(registros, campoGrupo, campoValor) {
  return registros.reduce((totales, registro) => {
    const grupo = registro[campoGrupo];
    totales[grupo] = (totales[grupo] || 0) + registro[campoValor];
    return totales;
  }, {});
}

const ventas = [
  { producto: "A", monto: 100 },
  { producto: "B", monto: 80 },
  { producto: "A", monto: 40 }
];

console.log(sumarPorGrupo(ventas, "producto", "monto"));

69.16 Detección de valores atípicos

Un valor atípico se aleja demasiado del comportamiento general. Una regla simple es comparar cada dato con el promedio y la desviación estándar.

function promedio(datos) {
  return datos.reduce((total, valor) => total + valor, 0) / datos.length;
}

function desviacionEstandar(datos) {
  const media = promedio(datos);
  const varianza = promedio(datos.map(valor => (valor - media) ** 2));
  return Math.sqrt(varianza);
}

function detectarAtipicos(datos, limite) {
  const media = promedio(datos);
  const desviacion = desviacionEstandar(datos);
  return datos.filter(valor => Math.abs(valor - media) > limite * desviacion);
}

console.log(detectarAtipicos([10, 11, 9, 12, 100], 2));

69.17 Correlación simple

La correlación mide si dos variables tienden a variar juntas. Un cálculo simplificado puede ayudar a entender la relación entre dos listas de datos.

function promedio(datos) {
  return datos.reduce((total, valor) => total + valor, 0) / datos.length;
}

function correlacion(x, y) {
  const mediaX = promedio(x);
  const mediaY = promedio(y);
  let numerador = 0;
  let sumaX = 0;
  let sumaY = 0;

  for (let i = 0; i < x.length; i++) {
    const dx = x[i] - mediaX;
    const dy = y[i] - mediaY;
    numerador += dx * dy;
    sumaX += dx * dx;
    sumaY += dy * dy;
  }

  return numerador / Math.sqrt(sumaX * sumaY);
}

console.log(correlacion([1, 2, 3, 4], [2, 4, 6, 8]));

69.18 Predicción lineal

Una función lineal puede usarse como modelo muy simple de predicción. La forma general es y = m · x + b.

function predecirLineal(x, pendiente, intercepto) {
  return pendiente * x + intercepto;
}

const horasEstudio = 6;
const notaEstimada = predecirLineal(horasEstudio, 8, 35);

console.log("Nota estimada:", notaEstimada);

69.19 Error de predicción

Para evaluar un modelo se compara lo predicho con lo real. El error absoluto medio resume esa diferencia.

function errorAbsolutoMedio(reales, predichos) {
  let total = 0;

  for (let i = 0; i < reales.length; i++) {
    total += Math.abs(reales[i] - predichos[i]);
  }

  return total / reales.length;
}

const reales = [100, 120, 90, 150];
const predichos = [95, 130, 85, 140];

console.log("Error medio:", errorAbsolutoMedio(reales, predichos));

69.20 Preparar datos para gráficos

Antes de dibujar una visualización, los datos suelen transformarse a coordenadas, porcentajes o tamaños.

function mapear(valor, minOrigen, maxOrigen, minDestino, maxDestino) {
  const proporcion = (valor - minOrigen) / (maxOrigen - minOrigen);
  return minDestino + proporcion * (maxDestino - minDestino);
}

function prepararBarras(datos, altoMaximo) {
  const max = Math.max(...datos);
  return datos.map(valor => ({
    valor,
    alto: mapear(valor, 0, max, 0, altoMaximo)
  }));
}

console.log(prepararBarras([10, 25, 40], 200));

69.21 Encadenamiento de transformaciones

Un flujo de ciencia de datos suele aplicar varias funciones en secuencia: limpiar, filtrar, transformar y resumir.

function quitarNulos(datos) {
  return datos.filter(valor => valor !== null && valor !== undefined);
}

function soloPositivos(datos) {
  return datos.filter(valor => valor > 0);
}

function promedio(datos) {
  return datos.reduce((total, valor) => total + valor, 0) / datos.length;
}

const datos = [10, null, -5, 20, undefined, 30];
const resultado = promedio(soloPositivos(quitarNulos(datos)));

console.log(resultado);

69.22 Aplicaciones en programación

Las funciones en ciencia de datos se usan para:

  • Limpiar registros incompletos o inconsistentes.
  • Calcular indicadores y métricas.
  • Transformar datos para gráficos y reportes.
  • Preparar variables para modelos predictivos.
  • Detectar valores atípicos o patrones.
  • Automatizar análisis repetitivos.

69.23 Errores comunes

Al analizar datos conviene evitar estos problemas:

  • Calcular promedios sin revisar valores faltantes.
  • Modificar los datos originales sin necesidad.
  • Confundir categorías con valores numéricos.
  • Normalizar usando escalas incorrectas.
  • Interpretar correlación como causalidad.
  • No validar listas vacías o datos mal formados.

69.24 Conclusión

Las funciones permiten convertir datos en conocimiento paso a paso. Cada operación clara y pequeña hace que el análisis sea más confiable, fácil de revisar y reutilizable.

En ciencia de datos, programar bien no consiste solo en obtener un resultado, sino en construir un proceso comprensible: limpiar, transformar, resumir, comparar y validar.

Volver al índice