VAR_SAMP

La función VAR_SAMP calcula la varianza muestral de un conjunto de valores numéricos. A diferencia de VARIANCE (o VAR_POP), que divide por N, VAR_SAMP divide por N-1. Esta diferencia puede parecer menor, pero tiene un fundamento estadístico importante: cuando tus datos son una muestra de una población mayor, dividir por N-1 produce una estimación más precisa de la varianza real de esa población. Este ajuste se conoce como corrección de Bessel.

Sintaxis

VAR_SAMP(expresion)

La fórmula que aplica MySQL es:

VAR_SAMP = SUM((x - media)^2) / (N - 1)

Donde x es cada valor, media es el promedio y N es el número de valores no nulos. La única diferencia con VAR_POP está en el denominador: N-1 en lugar de N. Si solo hay un valor no nulo, VAR_SAMP devuelve NULL (porque N-1 sería cero), mientras que VAR_POP devuelve 0.

Comportamiento básico

Veamos la diferencia entre varianza poblacional y muestral:

SELECT
    COUNT(precio) AS N,
    ROUND(VAR_POP(precio), 2) AS varianza_poblacional,
    ROUND(VAR_SAMP(precio), 2) AS varianza_muestral,
    ROUND(VAR_SAMP(precio) - VAR_POP(precio), 2) AS diferencia
FROM productos;
Nvarianza_poblacionalvarianza_muestraldiferencia
50183757.41187507.563750.15

Con 50 productos, la diferencia es de 3750.15. Puede parecer una diferencia grande en valor absoluto, pero es solo un 2% del valor. A medida que N crece, la diferencia relativa entre ambas varianzas disminuye y se vuelve insignificante.

Para ver la relación matemática más claramente:

SELECT
    ROUND(VAR_POP(precio), 2) AS var_pop,
    ROUND(VAR_POP(precio) * COUNT(precio) / (COUNT(precio) - 1), 2) AS var_pop_ajustada,
    ROUND(VAR_SAMP(precio), 2) AS var_samp
FROM productos;
var_popvar_pop_ajustadavar_samp
183757.41187507.56187507.56

La varianza muestral es exactamente la varianza poblacional multiplicada por N/(N-1). Esto confirma que la única diferencia es el denominador.

Caso práctico: cuándo usar VAR_SAMP vs VAR_POP

La elección entre varianza poblacional y muestral depende del contexto de tus datos. Si trabajas con todos los datos existentes (la población completa), usa VAR_POP. Si trabajas con un subconjunto representativo y quieres estimar la varianza de la población total, usa VAR_SAMP.

Imagina que haces una encuesta de satisfacción a 30 de tus 500 clientes. Los 30 clientes son una muestra de la población de 500:

SELECT
    ROUND(VAR_POP(calificacion), 4) AS var_poblacional,
    ROUND(VAR_SAMP(calificacion), 4) AS var_muestral
FROM encuestas_satisfaccion
WHERE fecha_encuesta = '2026-01-15';
var_poblacionalvar_muestral
2.85672.9552

En este caso, VAR_SAMP (2.9552) es la estimación más adecuada de la varianza real de satisfacción de todos los 500 clientes, porque los 30 encuestados son solo una muestra.

Ahora compara con el análisis de todos los precios de tu catálogo:

SELECT
    ROUND(VAR_POP(precio), 2) AS var_poblacional,
    ROUND(VAR_SAMP(precio), 2) AS var_muestral
FROM productos;

Aquí los 50 productos son la población completa (no es una muestra de un catálogo más grande), por lo que VAR_POP es la opción correcta.

Caso práctico: la corrección de Bessel importa con pocos datos

La diferencia entre N y N-1 es crítica cuando N es pequeño. Veamos qué pasa con la varianza por categoría, donde algunas categorías tienen pocos productos:

SELECT
    c.nombre AS categoria,
    COUNT(*) AS N,
    ROUND(VAR_POP(p.precio), 2) AS var_pop,
    ROUND(VAR_SAMP(p.precio), 2) AS var_samp,
    ROUND((VAR_SAMP(p.precio) - VAR_POP(p.precio)) /
        VAR_POP(p.precio) * 100, 1) AS pct_diferencia
FROM productos p
JOIN categorias c ON p.categoria_id = c.id
GROUP BY c.nombre
ORDER BY COUNT(*) ASC;
categoriaNvar_popvar_samppct_diferencia
Libros256.25112.50100.0
Deportes421083.0428110.7233.3
Hogar59702.2512127.8125.0
Ropa hombre61075.841290.0120.0
Ropa mujer61482.251778.7020.0
Accesorios electrónicos7835.21974.4116.7
Portátiles8119163.04136186.3314.3
Smartphones1297531.29106398.689.1

Con solo 2 libros, la diferencia es del 100%: la varianza muestral es exactamente el doble de la poblacional. Con 4 productos (Deportes), la diferencia es del 33.3%. Con 12 productos (Smartphones), baja al 9.1%. Este patrón es matemáticamente predecible: la diferencia porcentual siempre es 100/(N-1).

Caso práctico: análisis de variabilidad temporal

Supongamos que quieres medir la variabilidad de las ventas diarias a lo largo de cada mes, y los datos de cada mes son una muestra de lo que podrían ser las ventas futuras:

SELECT
    DATE_FORMAT(fecha_pedido, '%Y-%m') AS mes,
    COUNT(DISTINCT DATE(fecha_pedido)) AS dias_con_ventas,
    ROUND(AVG(ventas_diarias), 2) AS media_diaria,
    ROUND(SQRT(VAR_SAMP(ventas_diarias)), 2) AS desviacion_muestral
FROM (
    SELECT
        DATE(fecha_pedido) AS fecha_pedido,
        SUM(total) AS ventas_diarias
    FROM pedidos
    WHERE estado = 'completado'
        AND YEAR(fecha_pedido) = 2025
    GROUP BY DATE(fecha_pedido)
) ventas_por_dia
GROUP BY DATE_FORMAT(fecha_pedido, '%Y-%m')
ORDER BY mes;
mesdias_con_ventasmedia_diariadesviacion_muestral
2025-0125738.03312.45
2025-0222969.11425.80
2025-0327958.90380.20
2025-0424827.94345.60
2025-0526928.88398.50
2025-06281055.73290.30

Aquí usamos VAR_SAMP (a través de SQRT para obtener la desviación muestral) porque los días de cada mes son una muestra de cómo serán las ventas futuras. Junio tiene la desviación muestral más baja, lo que indica ventas más predecibles.

Manejo de NULL

VAR_SAMP ignora los valores NULL. Si hay un solo valor no nulo, devuelve NULL (no cero), porque la fórmula N-1 daría un denominador de cero:

SELECT
    VAR_POP(precio) AS var_pop_un_valor,
    VAR_SAMP(precio) AS var_samp_un_valor
FROM productos
WHERE id = 1;
var_pop_un_valorvar_samp_un_valor
0NULL

Con un solo valor, VAR_POP devuelve 0 (no hay dispersión) mientras que VAR_SAMP devuelve NULL (no se puede estimar la varianza de una población a partir de una sola observación). Este comportamiento es estadísticamente correcto.

Combinación con otras funciones

VAR_SAMP se combina con STDDEV_SAMP de la misma forma que VARIANCE se combina con STD:

SELECT
    c.nombre AS categoria,
    COUNT(*) AS N,
    ROUND(AVG(p.precio), 2) AS media,
    ROUND(STDDEV_SAMP(p.precio), 2) AS desv_muestral,
    ROUND(VAR_SAMP(p.precio), 2) AS var_muestral,
    ROUND(STDDEV_SAMP(p.precio) * STDDEV_SAMP(p.precio), 2) AS desv_al_cuadrado
FROM productos p
JOIN categorias c ON p.categoria_id = c.id
GROUP BY c.nombre
HAVING COUNT(*) >= 3
ORDER BY var_muestral DESC;
categoriaNmediadesv_muestralvar_muestraldesv_al_cuadrado
Portátiles81245.50369.17136286.33136286.33
Smartphones12785.42326.19106398.68106398.68
Deportes4189.99167.6628110.7228110.72

La columna desv_al_cuadrado confirma que VAR_SAMP = STDDEV_SAMP^2, de la misma forma que VAR_POP = STD^2.

Como regla general, si tienes dudas sobre cuál usar, VAR_SAMP es la opción más conservadora. Produce estimaciones ligeramente más altas que VAR_POP, lo que refleja la incertidumbre adicional de trabajar con una muestra. Con conjuntos de datos grandes (N > 30), la diferencia es mínima y la elección tiene poco impacto práctico.

En el siguiente artículo veremos las funciones de agregación a nivel de bits.

Escrito por Eduardo Lázaro