estás analizando un pequeño conjunto de datos:
\[X = [15, 8, 13, 7, 7, 12, 15, 6, 8, 9]\]
Quiere calcular algunas estadísticas resumidas para tener una idea de la distribución de estos datos, por lo que usa numpy para calcular la media y la varianza.
importar numpy como np X = [15, 8, 13, 7, 7, 12, 15, 6, 8, 9]
media = np.media(X) var = np.var(X) print(f”Media={media:.2f}, Varianza={var:.2f}”)
Su salida se ve así:
Media=10,00, Varianza=10,60
¡Excelente! Ahora tienes una idea de la distribución de tus datos. Sin embargo, su colega se acerca y le dice que también calcularon algunas estadísticas resumidas en este mismo conjunto de datos utilizando el siguiente código:
importar pandas como pd X = pd.Series([15, 8, 13, 7, 7, 12, 15, 6, 8, 9]) media = X.media() var = X.var() print(f”Media={media:.2f}, Varianza={var:.2f}”)
Su salida se ve así:
Media=10,00, Varianza=11,78
¡Las medias son las mismas, pero las variaciones son diferentes! ¿Qué da?
Esta discrepancia surge porque numpy y pandas usan diferentes ecuaciones predeterminadas para calcular la varianza de una matriz. Este artículo definirá matemáticamente las dos varianzas, explicará por qué difieren y mostrará cómo utilizar cualquiera de las ecuaciones en diferentes bibliotecas numéricas.
Dos definiciones
Hay dos formas estándar de calcular la varianza, cada una destinada a un propósito diferente. Todo se reduce a si estás calculando la varianza de toda la población (el grupo completo que estás estudiando) o solo de una muestra (un subconjunto más pequeño de esa población para la que realmente tienes datos).
La varianza poblacional, σ2\sigma^2, se define como:
\[\sigma^2 = \frac{\sum_{i=1}^N(x_i-\mu)^2}{N}\]
Mientras que la varianza muestral, s2s^2, se define como:
\[s^2 = \frac{\sum_{i=1}^n(x_i-\bar x)^2}{n-1}\]
(Nota: xix_i representa cada punto de datos individual en su conjunto de datos. NN representa el número total de puntos de datos en una población, nn representa el número total de puntos de datos en una muestra y x‾\bar x es la media de la muestra).
Observe las dos diferencias clave entre estas ecuaciones:
En la suma del numerador, σ2\sigma^2 se calcula usando la media poblacional, μ\mu, mientras que s2s^2 se calcula usando la media muestral, x‾\bar x. En el denominador, σ2\sigma^2 se divide por el tamaño total de la población NN, mientras que s2s^2 se divide por el tamaño de la muestra menos uno, n−1n-1.
Cabe señalar que la distinción entre estas dos definiciones es más importante para tamaños de muestra pequeños. A medida que nn crece, la distinción entre nn y n−1n-1 se vuelve cada vez menos significativa.
¿Por qué son diferentes?
Al calcular la varianza de la población, se supone que tiene todos los datos. Conoces el centro exacto (la media poblacional μ\mu) y exactamente a qué distancia está cada punto de ese centro. Al dividir por el número total de puntos de datos NN se obtiene el promedio exacto y verdadero de esas diferencias al cuadrado.
Sin embargo, al calcular la varianza muestral, no se supone que tenga todos los datos, por lo que no tiene la verdadera media poblacional μ\mu. En cambio, solo tienes una estimación de μ\mu, que es la media muestral x‾\bar x. Sin embargo, resulta que utilizar la media muestral en lugar de la media poblacional verdadera tiende a subestimar la varianza poblacional real en promedio.
Esto sucede porque la media muestral se calcula directamente a partir de los datos de la muestra, lo que significa que se encuentra en el centro matemático exacto de esa muestra específica. Como resultado, los puntos de datos de su muestra siempre estarán más cerca de su propia media muestral que de la verdadera media poblacional, lo que conducirá a una suma artificialmente menor de diferencias al cuadrado.
Para corregir esta subestimación, aplicamos lo que se llama corrección de Bessel (llamada así por el matemático alemán Friedrich Wilhelm Bessel), donde no dividimos por nn, sino por n−1n-1, ligeramente más pequeño, para corregir este sesgo, ya que dividir por un número más pequeño hace que la varianza final sea ligeramente mayor.
Grados de libertad
Entonces, ¿por qué dividir por n−1n-1 y no por n−2n-2 o n−3n-3 o cualquier otra corrección que también aumente la varianza final? Eso se reduce a un concepto llamado Grados de Libertad.
Los grados de libertad se refieren al número de valores independientes en un cálculo que pueden variar libremente. Por ejemplo, imagina que tienes un conjunto de 3 números, (x1,x2,x3)(x_1, x_2, x_3). No sabes cuáles son los valores de estos, pero sí sabes que su media muestral x‾=10\bar x = 10.
El primer número x1x_1 podría ser cualquier cosa (digamos 8) El segundo número x2x_2 también podría ser cualquier cosa (digamos 15) Debido a que la media debe ser 10, x3x_3 no puede variar libremente y debe ser el número tal que x‾=10\bar x = 10, que en este caso es 7.
Entonces, en este ejemplo, aunque hay 3 números, solo hay dos grados de libertad, ya que hacer cumplir la media muestral elimina la capacidad de uno de ellos de tener libertad para variar.
En el contexto de la varianza, antes de realizar cualquier cálculo, comenzamos con nn grados de libertad (correspondientes a nuestros nn puntos de datos). El cálculo de la media muestral x‾\bar x esencialmente utiliza un grado de libertad, por lo que cuando se calcula la varianza muestral, quedan n−1n-1 grados de libertad con los que trabajar, razón por la cual n−1n-1 es lo que aparece en el denominador.
Valores predeterminados de la biblioteca y cómo alinearlos
Ahora que entendemos las matemáticas, ¡finalmente podemos resolver el misterio del principio del artículo! numpy y pandas dieron resultados diferentes porque utilizan de forma predeterminada diferentes fórmulas de varianza.
Muchas bibliotecas numéricas controlan esto mediante un parámetro llamado ddof, que significa Delta Grados de Libertad. Esto representa el valor restado del número total de observaciones en el denominador.
Establecer ddof=0 divide la ecuación por nn, calculando la varianza de la población. Establecer ddof=1 divide la ecuación por n−1n-1, calculando la varianza de la muestra.
Estos también se pueden aplicar al calcular la desviación estándar, que es simplemente la raíz cuadrada de la varianza.
Aquí hay un desglose de cómo las diferentes bibliotecas populares manejan estos valores predeterminados y cómo puedes anularlos:
engordado
De forma predeterminada, numpy asume que estás calculando la varianza de la población (ddof=0). Si está trabajando con una muestra y necesita aplicar la corrección de Bessel, debe pasar explícitamente ddof=1.
importar numpy como np X = [15, 8, 13, 7, 7, 12, 15, 6, 8, 9]
# Varianza muestral y desviación estándar np.var(X, ddof=1) np.std(X, ddof=1) # Varianza poblacional y desviación estándar (predeterminado) np.var(X) np.std(X)
pandas
Por defecto, pandas adopta el enfoque opuesto. Asume que sus datos son una muestra y calcula la varianza de la muestra (ddof=1). En cambio, para calcular la varianza de la población, debe pasar ddof=0.
importar pandas como pd X = pd.Series([15, 8, 13, 7, 7, 12, 15, 6, 8, 9]) # Varianza de la muestra y desviación estándar (Predeterminado) X.var() X.std() # Varianza de la población y desviación estándar X.var(ddof=0) X.std(ddof=0)
Módulo de estadísticas integrado de Python
La biblioteca estándar de Python no utiliza un parámetro ddof. En cambio, proporciona funciones con nombres explícitos para que no haya ambigüedad sobre qué fórmula se utiliza.
estadísticas de importación X = [15, 8, 13, 7, 7, 12, 15, 6, 8, 9]
# Estadísticas de varianza de la muestra y desviación estándar.variance(X) stats.stdev(X) # Estadísticas de varianza de la población y desviación estándar.pvariance(X) stats.pstdev(X)
R
En R, las funciones estándar var() y sd() calculan la varianza muestral y la desviación estándar muestral de forma predeterminada. A diferencia de las bibliotecas de Python, R no tiene un argumento incorporado para cambiar fácilmente a la fórmula de población. Para calcular la varianza de la población, debe multiplicar manualmente la varianza de la muestra por n−1n\frac{n-1}{n}.
X <- c(15, 8, 13, 7, 7, 12, 15, 6, 8, 9) n <- length(X) # Varianza muestral y desviación estándar (predeterminado) var(X) sd(X) # Varianza poblacional y desviación estándar var(X) * ((n - 1) / n) sd(X) * sqrt((n - 1) / n)
Conclusión
Este artículo exploró un rasgo frustrante pero a menudo desapercibido de diferentes bibliotecas y lenguajes de programación estadística: eligen usar diferentes definiciones predeterminadas de varianza y desviación estándar. Se dio un ejemplo en el que, para la misma matriz de entrada, numpy y pandas devuelven valores diferentes para la varianza de forma predeterminada.
Esto se redujo a la diferencia entre cómo se debe calcular la varianza para toda la población estadística que se está estudiando y cómo se debe calcular la varianza basándose solo en una muestra de esa población, con diferentes bibliotecas tomando diferentes decisiones sobre el valor predeterminado. Finalmente se demostró que aunque cada biblioteca tiene su valor predeterminado, todas pueden usarse para calcular ambos tipos de varianza usando un argumento ddof, una función ligeramente diferente o mediante una simple transformación matemática.
¡Gracias por leer!