una - sumar listas anidadas python
¿Cómo puedo calcular la varianza de una lista en python? (3)
Si tengo una lista como esta:
results=[-14.82381293 -0.29423447 -13.56067979 -1.6288903 -0.31632439
0.53459687 -1.34069996 -1.61042692 -4.03220519 -0.24332097]
Quiero calcular la varianza de esta lista en Python.
Varianza = El promedio de las diferencias al cuadrado de la media.
¿Cómo puedo hacer esto? Acceder a los elementos en la lista para hacer los cálculos me confunde al obtener las diferencias cuadradas.
Bueno, hay dos formas de definir la varianza. Tiene la varianza n que usa cuando tiene un conjunto completo y la varianza n-1 que usa cuando tiene una muestra.
La diferencia entre los 2 es si el valor m = sum(xi) / n
es el promedio real o si es solo una aproximación de lo que debería ser el promedio.
Ejemplo 1: quiere saber la altura promedio de los estudiantes en una clase y su varianza: ok, el valor m = sum(xi) / n
es el promedio real, y las fórmulas dadas por Cleb son correctas (varianza n ).
Ejemplo 2: desea saber la hora promedio a la que pasa un autobús en la parada de autobús y su varianza. Anotas la hora de un mes y obtienes 30 valores. Aquí el valor m = sum(xi) / n
es solo una aproximación del promedio real, y esa aproximación será más precisa con más valores. En ese caso, la mejor aproximación para la varianza real es la varianza n-1
varRes = sum([(xi - m)**2 for xi in results]) / (len(results) -1)
Ok, no tiene nada que ver con Python, pero tiene un impacto en el análisis estadístico, y la pregunta es estadísticas etiquetadas y varianza
Nota: ordinariamente, las bibliotecas estadísticas como numpy usan la varianza n para lo que llaman var
o variance
, y la varianza n-1 para la función que proporciona la desviación estándar.
Numpy es de hecho la forma más elegante y rápida de hacerlo.
Creo que la pregunta real fue acerca de cómo acceder a los elementos individuales de una lista para hacer un cálculo de este tipo, así que debajo de un ejemplo:
results=[-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439,
0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097]
import numpy as np
print ''numpy variance: '', np.var(results)
# without numpy by hand
# there are two ways of calculating the variance
# - 1. direct as central 2nd order moment (https://en.wikipedia.org/wiki/Moment_(mathematics))divided by the length of the vector
# - 2. "mean of square minus square of mean" (see https://en.wikipedia.org/wiki/Variance)
# calculate mean
n= len(results)
sum=0
for i in range(n):
sum = sum+ results[i]
mean=sum/n
print ''mean: '', mean
# calculate the central moment
sum2=0
for i in range(n):
sum2=sum2+ (results[i]-mean)**2
myvar1=sum2/n
print "my variance1: ", myvar1
# calculate the mean of square minus square of mean
sum3=0
for i in range(n):
sum3=sum3+ results[i]**2
myvar2 = sum3/n - mean**2
print "my variance2: ", myvar2
te dio:
numpy variance: 28.8223642606
mean: -3.731599805
my variance1: 28.8223642606
my variance2: 28.8223642606
Puedes usar la función incorporada var
numpy (agregué comas a tu lista):
import numpy as np
results = [-14.82381293, -0.29423447, -13.56067979, -1.6288903, -0.31632439,
0.53459687, -1.34069996, -1.61042692, -4.03220519, -0.24332097]
print np.var(results)
Esto te da 28.822364260579157
Si, por cualquier razón, no puede usar numpy
y / o no quiere usar una función incorporada para él, también puede calcularlo "a mano" usando, por ejemplo, una lista de comprensión :
# calculate mean
m = sum(results) / len(results)
# calculate variance using a list comprehension
varRes = sum([(xi - m)**2 for xi in results]) / len(results)
que te da el resultado idéntico.
EDITAR
@Serge Ballesta explicó muy bien la diferencia entre la varianza n
y n-1
. En numpy puedes establecer fácilmente este parámetro usando la opción ddof
; su valor predeterminado es 0, por lo que para el caso n-1
simplemente puede hacer:
np.var(results, ddof=1)
La solución "a mano" sería:
sum([(xi - m)**2 for xi in results]) / (len(results) - 1)
Ambos enfoques te dan 32.024849178421285
.