unir una sumar suma sacar restar matriz listas lista elementos arreglo anidadas python statistics variance

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 .