Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Varianza y Desviación Estándar

14/24
Recursos

Aportes 116

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Por favor platzi y David, porfa sean más homogéneos en el uso de sus fórmulas. En este caso, en la desviación estándar nos muestran una fórmula para variables aleatorias discretas que incluye el término $p_i$,pero sin explicar a qué hace referencia dicho término, y que carece del término 1/N (a diferencia de la fórmula mostrada para la varianza). Aunque la fórmula es correcta y son equivalentes, el contexto es necesario, ya que David no da ejemplos de variables aleatorias discretas y su distribución de probabilidad. Así que era más sencillo tomar la fórmula que mostraron de la varianza y encerrarla en la ‘casita’ de la raíz cuadrada para mostrar la definición de la $\sigma$ sin confundirnos a nosotros los estudiantes.

La dasviacion estandar y la varianza se puede sacar con la libreria numpy de forma rapida:

import numpy
speed = [86,87,88,86,87,85,86]
x = numpy.std(speed)
print(x)```


import numpy
speed = [32,111,138,28,59,77,97]
x = numpy.var(speed)
print(x)```

¿Por qué al cuadrado?
.

  • Elevar cada diferencia al cuadrado hace que todos los números sean positivos (para evitar que los números negativos reduzcan la varianza)

  • Y también hacen que las diferencias grandes se destaquen. Por ejemplo 1002=10,000 es mucho más grande que 502=2,500.

  • Pero elevarlas al cuadrado hace que la respuesta sea muy grande, así que lo deshacemos (con la raíz cuadrada) y así la desviación estándar es mucho más útil.

La desviación estándar indica un rango DESDE la MEDIA, este rango indica en dónde se van a encontrar la mayoria de datos.

Por ejemplo, si tengo esta lista: [1,3,5,5,5,8,10] e imaginemos que la media es 3 y desviación estándar me dio 3, significa que la mayoría de datos se encontrarán desde el 5, 3 datos hacia arriba y 3 datos hacia abajo, osea, de 3 a 8.

La varianza es simplemente la operación que se hace para obtener la desviación estándar, el problema es que da como resultado la desviación estándar al cuadrado. Sacandole la raíz a la varianza se obtiene la desviación estándar.

Una cosa importante a tomar en cuenta es que hay dos tipos de varianza/desviación estandar. La primera es la de la población y la segunda es de una muestra. Te invito a investigar más si te interesa.

Está trabajando con la varianza poblacional y con la desviación estándar poblacional y no con las muestrales, la fórmula cambia en que habría que dividir la sumatoria entre n-1 (en el caso de trabajar con la muestra) y no solo entre N (como es este caso que trabaja con la población).

En cuanto al algoritmo, también se puede importando statistics
con la función pvariance() para la varianza y pstdev() para la desviación estándar. Estas dos funciones calculan en automático la media mean() y repito, funcionan al trabajar con poblaciones

import random
import statistics

if __name__ == '__main__':

    edades = [random.randint(1,35) for i in range (15)]

    print(edades)
    print(f'la media es: {statistics.mean(edades)}')
    print(f'la varianza es: {statistics.pvariance(edades)}')
    print(f'la desviacion estandar es: {statistics.pstdev(edades)}')

Yo preferi hacer una clase, algo nuevo que descubri es que el el constructor de la clase puedes llamar un metodo para definir una propiedad, como lo hice con el promedio.

Tambien quiero agregar como nota extra que el metodo ‘random.randint’ si incluye los extremos

>>> help(random.randint)
Help on method randint in module random:

randint(a, b) methodof random.Random instance
    Return random integer inrange [a, b], including both end points.
import random

class Estadisticas:
    def __init__(self, lista):
        self.lista = lista
        self.mu = self.media()

    def media(self):
        return sum(self.lista) / len(self.lista)

    def varianza(self):
        x_varianza = 0
        for numero in self.lista:
            x_varianza += (numero - self.mu) ** 2
        return round(x_varianza / len(self.lista), 2)

    def desviacion(self):
       return round(self.varianza() ** 0.5, 2)


if __name__ == '__main__':
    lista = [random.randint(0, 20) for _ in range(20)]
    X = Estadisticas(lista)

    print(f'{X.lista}')
    print(f'Media: \t\t{X.media()}')
    print(f'Varianza: \t{X.varianza()}')
    print(f'Desviacion: \t{X.desviacion()}')

https://github.com/karlbehrensg/programacion-dinamica-y-estocastica
Varianza y Desviación Estándar

Varianza

La varianza mide qué tan propagados se encuentran un conjunto de valores aleatorios de su media. Mientras que la media nos da una idea de dónde se encuentran los valores, la varianza nos dice que tan dispersos se encuentran. La varianza siempre debe entenderse con respecto a la media.

Desviación estándar

La desviación estándar es la raíz cuadrada de la varianza. Nos permite entender, también, la propagación y se debe entender siempre relacionado con la media.

La ventaja sobre la varianza es que la desviación estándar está en las mismas unidades que la media.

Vamos a implementar las funciones de varianza y desviación estándar en nuestro script ya hecho para la media.

import random
import math

def media(X):
    return sum(X) / len(X)


def varianza(X):
    mu = media(X)

    acumulador = 0
    for x in X:
        acumulador += (x - mu)**2

    return acumulador / len(X)


def desviacion_estandar(X):
    return math.sqrt(varianza(X))


if __name__ == '__main__':
    X = [random.randint(9, 12) for i in range(20)]
    mu = media(X)
    Var = varianza(X)
    sigma = desviacion_estandar(X)

    print(f'Arreglo X: {X}')
    print(f'Media = {mu}')
    print(f'Varianza = {Var}')
    print(f'Desviacion estandar = {sigma}')

¡Siempre me han encantado las estadísticas! De hecho, muchas veces las utilizo pra perfilar ciertos comportamientos en los aliados dentro de la Gestión de un Proyecto. Me ha pasado con el último proyecto del cual he sido Gerente en mi empresa:

  1. Desde el inicio el aliado empezó a incumplir, desde la 1ra reunión.
  2. Establecí la regla: “ya falló, esprobable que vuelva a fallar”.
  3. Falló por segunda vez. La segunda regla es: "no espero que corrija el rumbo, su lenguaje y sus acciones han sido consistentes, así que es mucho más probable que a la 3ra vez vuelva a fallar a que lo haga bien.
  4. Efectivamente ocurrió, falló de nuevo.
  5. Después de esto, ya sumí por defecto que fallaría. Falló 3 veces más.

Y esto impactó la facturación nuestra en el orden de 250 mil dólares, con un atraso de 2 meses, en medio de la pandemia. Las estadísticas son muy útiles, aplicadas a la gestión de las relaciones del negocio. Es decir, la variabilidad del aliado era muy pequeña, aunque su media se encontraba siempre en zona de falla.

La formula que muestra David en la presentación, es de la desviación estándar para cuando tenemos la frecuencia de cada elemento.

La frecuencia de cada elemento se calcula de la siguiente manera:

Numero de veces que se repite el elemento / Numero de elementos

Sin embargo, en el código aplico una formula equivalente a esta, la cual, es la raíz cuadrada de la varianza.

Saludos.

Un dato: La probabilidad obtener un valor que se encuentra en el intervalo [mu-sigma, mu+sigma] es el 68.2%. Para más info:

Fuente: WikiPedia

the same example using Numpy

import numpy as np 

if __name__ == "__main__":
    X = np.random.randint(1 , 21 , size=20)
    mu = np.mean(X)
    Var = np.var(X)
    Sigma = np.std(X)
    print(X)
    print(f'Mean = {mu}, Variance {Var} , Std {Sigma}')```

Aqui les dejo el link de un video donde explica mejor la varianza y la desviacion estandar https://www.youtube.com/watch?v=cg4kUsbjQms

Tengan cuidado porque en la función random.randint(a, b) los valores a y b SI son inclusivos, en el minuto 09:35 se menciona que son NO inclusivos e igualmente en alguna clase pasada se menciona lo mismo. Inclusive podemos ver al minuto 10:00 que la lista que arrojó si tenía el #12.

Cuando trabajamos con NUMPY, éste módulo también tiene la función random.randint y en ese caso numpy.random.randint(a, b) b si es NO inclusivo.

El random es inclusivo 😉

En realidad aquí el profesor se equivocó la función randint sí es inclusiva. Luego en el video se ve un ejemplo de esto.

Varianza/ Desviación Estándar
Son medidas de dispersión, es decir cuanto varían nuestros datos en relación a la media. Mientras más varíen nuestros datos, mas grande serán estos valores.

  • La varianza se calcula hallando el promedio de la suma de los cuadrados de las diferencias de cada valor con la media. La razón de este cuadrado es para eliminar los signos negativos y sobre todo para dar mayor peso a los elementos que estén muy dispersos,
  • La desviación estándar es simplemente la raíz de la varianza (con el objetivo de compatibilizar unidades)

Nota:

  • Las medidas de dispersion solo se entienden acompañadas de la media (no es lo mismo 10 +/- 5 que 1000 +/ 5)

Con la mediana.

import random
import math

def media(X):
    return sum(X) / len(X)

def varianza(X):
    mu = media(X)

    acumulador = 0
    for x in X:
        acumulador += (x - mu)**2

    return acumulador / len(X)  

def desviacion_estandar(X):
    return math.sqrt(varianza(X))

def mediana(X):
    return X[len(X)//2]

if __name__ == '__main__':
    X = [random.randint(1, 100) for i in range(200)]
    X.sort()
    X
    mu = media(X)
    Var = varianza(X)
    sigma = desviacion_estandar(X)
    valor_mediana = mediana(X)

    print(f'Arreglo X: {X}')
    print(f'Media = {mu}')
    print(f'Mediana = {valor_mediana}')
    print(f'Varianza = {Var}')
    print(f'Desviación estándar = {sigma}')```

Hola, les tengo un pequeño ejemplo para poder comprender mejor:
supongamos que tenemos 5 perros, y que cada uno mide 3,4,8,2,1 metros (aclaración: los perros son de marte) respectivamente.
d1 = 3
d2 = 4
d3 = 8
d4 = 2
d5 = 1

Si se requiere de saber cuales perros están en una altura promedio y cuales son más altos o mas bajos de lo normal, lo primero que se querrá hacer será encontrar el promedio de alturas, el cual en este caso es 3.6. Después de tener un promedio hay que encontrar la diferencia entre la altura de cada perro y el promedio de alturas, osea la varianza, la cual en este caso es de 5,84. Finalmente, tenemos que averiguar la desviación estandard para saber cuales alturas entran en el rango de “promedio”, en nuestro caso es de 2,41, es decir, que todo lo que este entre el promedio y 2.41 va a ser “normal” dentro de las alturas de nuestros perros.

Conclusiones:
+los perros d1, d2 y d4 tienen una altura promedio dentro del conjunto
+d3 es un poco mas alto de lo usual
+d5 es ligeramente más pequeño de lo usual

De nada 😉

Con la varianza elevamos al cuadrado para que no nos molesten los numeros negativos y además ampliar un poco más el margen de cambio (esto es como una especie de intervalo que define donde se encuentran la mayoria de los valores)

Luego, sumamos todos esos cuadrados

y lo dividimos por la cantidad de elementos que hay, en este caso es la cantidad de puntos blancos que son 8.

Y la varianza es solo la raiz cuadrada, o la medida de un lado del cuadrado, esta nos dice “verdaderamente” cuanto cambian los datos.

Dato interesante: todos los cuadrados pequeños que calculamos al principio pueden meterse dentro de un cuadrado grande de 67.5 ya que esta es la suma de todos sus cuadraditos.

Si quieren conocer mas, este enlace es muy bueno:
https://towardsdatascience.com/a-visual-interpretation-of-the-standard-deviation-30f4676c291c

Les recomiendo realizar un ejercicio con sus tiempos de transporte de un lugar a otro (de casa a trabajo y de trabajo a casa), calculando estos datos, ya depende de ustedes, pueden calcular aproximadamente cuanto tiempo deben esperar por su transporte (según sea público) o calcular el tiempo de traslado según el día

Aqui esta mi codigo:

import random
from math import sqrt

def media(X):
    return sum(X) / len(X)

def varianza(X):
    mu = media(X)
    return sum([(x - mu)**2 for x in X]) / len(X)

def desviacion_estandar(X):
    return sqrt(varianza(X))

if __name__ == '__main__':
    X = [random.randint(1, 21) for _ in range(10) ]
    #X = [8,3,16,8,3,1,1,12,9,10,15,11,9,5,18,19,14,8,19,8]
    print(X)

    print(f'Media: {media(X)}')
    print(f'Varianza: {varianza(X)}')
    print(f'Desviacion estandar: {desviacion_estandar(X)}')

El punto con la desvest y varianza es que, claro, la media nos puede decir cual es el promedio de los datos, pero, ¿qué tan cercanos o alejados están estos datos con respecto a la media?

Un ejemplo:

  • La media entre [0, 100] = 50

  • La media entre [49, 51] = 50.

    En ambos casos la media es 50, sin embargo, el segundo conjunto de datos es más representativo de la media que el otro.

random.randint(a, b) si es inclusivo b -> si lo incluye

Que buen ejercicio

implementé de otra manera el cálculo de la varianza, aprovechando map de python, aquí el código:

def varianza(X):
    mu = media(X)
    x_mu = list(map(lambda x: (x - mu)**2, X))
    return sum(x_mu) / len(X)

def desviacion_std(X):
    return varianza(X)**(1/2)

Más herramientas, genial! 😄

cuando se crean los valores aleatorios de 9 a 12, si toma el 12, no como se menciona en el vídeo que va hasta 11

import random
import math

def media(X):
    return sum(X) / len(X) #sumar todos los valores de X, y dividirlo entre su longitud

def varianza(X):
    mu = media(X)
    acumulador = 0
    for x in X: 
        acumulador += (x - mu)**2 #por cada X le restamos la media, elevamos al cuadrado y ponemos en el acumulador

    return acumulador / len(X)

def desviacion_estandar(X):
    return math.sqrt(varianza(X)) #esto saca la raíz cuadrada a la varianza


if __name__ == '__main__':
    X = [random.randint(9, 12) for i in range(20)]
    #Si disminuyo los números aleatorios, entonces tendré un indice de variación menor, lo cual es mejor
    #con random indico que quiero valores entre el 1 al 20 (no incluye al 21), y con Range indico que quiero 20 valores aleatorios
    mu = media(X) #mu es la media de la población total
    Var = varianza(X) #varianza
    sigma = desviacion_estandar(X)

    print(f'Arreglo X: {X}')
    print(f'Media = {mu}')
    print(f'Varianza = {Var}')
    print(f'Desviacion estandar = {sigma}')

Pero sí es inclusivo .__.

#UTILIZANDO NUMPY
mu = np.mean(X)
var = np.var(X)
std = np.std(X)
mediana = np.median(X)
percentil = [np.percentile(X, 25), np.percentile(X, 50), np.percentile(X, 75)]

tengo una pregunta con respecto a la fórmula de la varianza. Me puse a analizarla y quisiera saber si mi análisis es correcto

si tenemos una lista [5,6,1] o sea de tres elementos y usamos la fórmula que nos dice según lo mostrado por el profesor david, que es la suma de las diferencias con respecto a la media al cuadrado y eso dividido entre la cantidad de elementos por tanto si yo calculo la varianza de esta lista ya dada el resultado sería ¿este?.

mu = (5 + 6 + 1 ) / 3 = 12 / 3 = 4 vale
ahora

(X1 - mu) ** 2 + (X2 - mu) ** 2 + (X3 - mu) ** 2 esto es igual

= 1 + 4 + 9 = 14

ahora el paso final es tomar lo obtenido y dividirlo entre 3

var(X) = 14 / 3 = 4,6

ahora quiero que me digan si este razonamiento está bien, muchas gracias a la persona que llegue a responder esta pregunta

Mientras que la media es la tendencia central, la varianza y la desviación estándar, son medidas de propagación.

La varianza, es prácticamente sigma al cuadraro, osea desviación estándar al cuadrado.

Para la desviación estándar, utilizamos sigma en minúscula, y esta es igual a la raíz cuadrada de la varianza.

La desviación estándar, nos permite entedern, también, la propagación y se debe entender siempre relacionado a la media.

Al hablar de desviación estándar, hablamos en las mismas unidades.

Mientras que la varianza nos dá términos al cuadrado, la desviación estándar, nos permite hablar en las unidades tal cual son.

La desviación estándar, es la raíz cuadrada de la varianza.

La variancia es igual a 1/n n sigma i = 1 (x base i - miu)²

Siempre tenemos que hablar de varianza y desviación estándar en base a la media.

Que tan alejados o cercanos a la media de encuentran los valores.

La varianza y la desviación estándar es una medida de propagación.

Primer paso en inferencia estadística es calcular la media y el segundo, calcular la varianza y la desviación estándar.

Si no quieren que sus resultados muestren taantos decimales, pueden utilizar la función round.

round(resultado, numero_maximo_decimales)

Ejemplo:

    print(f'-- Media: {round(mu, 3)} --')
    print(f'-- Varianza: {round(sigma_cuadrado, 3)} --')
    print(f'-- Desviación estandar: {round(sigma, 3)} --')

Resultado:

-- Media: 11.2 --
-- Varianza: 18.96 --
-- Desviación estandar: 4.354 --

Algunas respuestas en este apartado:
¿Qué es la varianza y desviación estándar y para qué nos sirve?

Porque a Var la puso en mayuscula?

Estas medidas nos sirven para describir distribuciones de probabilidad 👀. Una distribución de probabilidad muy importante y que puede ser completamente descrita por únicamente la media y la desviación estándar es la distribución gaussiana o normal, la cual es útil para describir muchísimos fenómenos conocidos. También es conocida como la campana de Gauss 🔔.

Me encanta la estadística

Para entender un poco mejor la explicación realicé la siguiente gráfica, donde se puede observar que dado un rango de valores, la media puede permanecer similar, sin embargo, entre mas grande es el rango, la varianza, y por lo tanto la desviación estándar tenderán a ser mas grandes, es decir, los datos estarán mas dispersos.


Lista Original: [17, 3, 10, 17, 1, 21, 4, 8, 20, 6, 19, 9, 12, 14, 15, 14, 8, 18, 8, 7]
Lista Ordenada: [1, 3, 4, 6, 7, 8, 8, 8, 9, 10, 12, 14, 14, 15, 17, 17, 18, 19, 20, 21]
Media: 11.55
Varianza = 34.04749999999999
Desciacion estanda = 5.835023564648218
les comparto un poco como se ven las listas, para comprnderlo un poco mejor, ya que con una lista ordenada nos podemos dar una mejor idea

Código Desviación estándar.

Código Varianza.

Definición Varianza.

me gusto la explicación

Fórmula Varianza.

que buena explicacion de que mismo significa la varianza y la desviacion estandar.!!

Sólo como comentario y la razón por la que quizás haya confusión también:
random.randint(a,b) es inclusiva para ambos.
np.random.randint(a,b) es inclusiva en a pero exclusiva en b con la librería numpy.
Si alguien está acostumbrado a usar numpy para generar arrays de números aleatorios puede caer en ese error.

Todo se entendió a la perfección, que grande David

Hola muchachos, recuerden que las funciones están retornando números. Con lo cual cuando estás imprimiendo los valores puedes hacerlo directamente de esta manera, a Mí me parece más legible:

print (f'La media es igual a {media(X)}')
    print (f'La Varianza es igual a {varianza(X)}')
    print (f'La desviacion_estandard es igual a {desviacion_estandard(X)}')

Definición Desviación estándar.

import math
import random

#Represemtacion de un array
def media(X):
    return sum(X)/len(X)

def varianza(X):
    mu=media(X)

    acumulador=0
    for x in X:
        acumulador +=(x-mu)**2
    
    return acumulador / len(X)


def desviacion_estandar(X):
    return math.sqrt(varianza(X))

if __name__=='__main__':
    X=[random.randint(9,12) for i in range(20)]
    mu=media(X)
    Var=varianza(X)
    sigma= desviacion_estandar(X)

    print(f'Arreglo x:{X}')
    print(f'Media= {mu}')
    print(f'Varianza= {Var}')
    print(f'Desviacion estandar= {sigma}')

Genial forma de entender media y desviacion estandar: PROGRAMANDO

Fórmula Desviación estándar.

Super facil de entender!

Muy Claro!!!

En este ejercicio se puede tomar a X como toda la poblacion, sin embargo, cuando se esta usando muestras la varianza debe de ser ajustada y se debe de usar n-1 en lugar de n al dividir las deferencias al cuadrado en la varianza

Resultados

PS E:\OneDrive\06_Platzy\02_IA\03_PgmDinamica Python> & C:/Users/ingrd/AppData/Local/Programs/Python/Python37/python.exe "e:/OneDrive/06_Platzy/02_IA/03_PgmDinamica Python/estadisticas.py"meros: [10, 12, 12, 12, 12, 10, 11, 10, 9, 12, 9, 10, 12, 11, 12, 12, 11, 9, 9, 10]
Media: 10.75
Varianza: 1.3875
Desviación Estandar: 1.1779218989389746

Hola, he estado haciendo el codigo antes de ver el video xD y aquí está mi codigo, por favor, si quieren contribuir en algo comentenlo jeje ♥

import random
import math

def media(cajon):
    return sum(cajon) / len(cajon)

def varianza (cajon, media):
    varianza = []

    for i in cajon:
        varianza.append((i - media)**2)
        print(varianza)
    return sum(varianza)/len(cajon)

def desviación_estandar(varianza):
    return math.sqrt(varianza)


def X(lista):
    cajon = []

    for i in range(lista):
        cajon.append(random.randint(0,100))
        print(cajon)
    return cajon


if __name__ == '__main__':
    lista = int(input('cuantos numeros?'))
    cajon = X(lista)
    media = media(cajon)
    varianza = varianza (cajon, media)
    desviacion_estandar = desviación_estandar(varianza)

    print(f' Media =  {media}' 
          f' Varianza = {varianza}'
          f' Desviación estandar = {desviacion_estandar}')

import random
import math

def average(x):
    return sum(x) / len(x)

def variance(X):
    mu = average(X)
    
    accumulator = 0
    for x in X:
        accumulator += (x - mu)**2
    
    return accumulator / len(X)

def standard_deviation(X):
    return math.sqrt(variance(X))

if __name__ == '__main__':
    X = [random.randint(1,100) for i in range(100)]
    mu = average(X)
    Var = variance(X)
    standard_deviation = standard_deviation(X)

    print(f"{X}\naverage = {mu} | variance = {Var} | standard deviation = {standard_deviation}")
import random
import math

def media(X):
    return sum(X) / len(X)

def varianza(X):
    mu = media(X)

    acumulador = 0
    for x in X:
        acumulador += (x - mu)**2

    return acumulador / len(X)

def desviacion_estandar(X):
    return math.sqrt(varianza(X))

if __name__ == "__main__":
    X = [random.randint(1,21) for i in range(20)]
    mu = media(X)
    Var = varianza(X)
    sigma = desviacion_estandar(X)
    print(f'Areglo X: {X}')
    print(f'Media: {mu}')
    print(f'Varianza: {Var}')
    print(f'Desviacion estandar: {sigma}')```
import random
import math


def media(numbers):
    sum_numbers = 0
    for number in numbers:
        sum_numbers += number

    return sum_numbers / len(numbers)


def varianza(numbers, media):
    sum_numbers = 0
    for number in numbers:
        sum_numbers += (number - media) ** 2

    return sum_numbers / len(numbers)


def desviacion_estandar(varianza):
    return math.sqrt(varianza)


if __name__ == '__main__':
    numbers = [random.randint(0, 100) for _ in range(20)]
    print(numbers)
    media = media(numbers)
    print('Media', media)
    varianza = varianza(numbers, media)
    print('Varianza', varianza)
    print('Desviacion Estandar', desviacion_estandar(varianza))

Varianza

  1. Calcula la media (el promedio de los números)
  2. Ahora, por cada número resta la media y eleva el resultado al cuadrado (la diferencia elevada al cuadrado).
  3. Ahora calcula la media de esas diferencias al cuadrado

import random
import math

def media (X):
    return sum(X)/len(X)

def varianza (X):
    mu=media(X)

    acumulador=0
    for x in X:
        acumulador += ((x-mu)**2)
        acumulador - (x-1)


    return acumulador / len(X)

def desv_estandar (X):
    return math.sqrt(varianza(X))


if __name__=='__main__':
    X=[random.randint(9,12) for i in range(20)]
    mu=media(X)
    Var=varianza(X)
    sigma=desv_estandar(X)

    print(f'Arreglo X: {X}')
    print(f'Media = {mu}')
    print(f'Varianza =  {Var}')
    print(f'Desviacion estandar = {sigma}')

Me están gustando mucho estas clases donde se juntan con temas de matemáticas y estadística.

Este video me ayudo a entenderlo mejor: https://www.youtube.com/watch?v=VTTqr5cAzvw

David, una corrección:
random.randint() si es inclusivo, cuando escribe random.randint(1, 21) existe la posibilidad estadística de que el 21 este incluido, de hecho, en el ejemplo del vídeo, se ve que el vector tiene un 21, y cuando el ejemplo es random.randint(9, 12) tambien salen varios 12.
en en range() donde no es inclusivo.

import random
import math

def media(X):
    return sum(X) / len(X)

def varianza(X):
    mu = media(X)
    acumulador = 0
    for x in X:
        acumulador =+ (x - mu)**2
    return acumulador / len(X)

def desviacion_estandar(X):
    return math.sqrt(varianza(X))

if __name__ == "__main__":
    X = [random.randint(1, 20) for i in range(20)]
    print(f'\nEl arreglo es: {X}.')
    print(f'El promedio es: {media(X)}.')
    print(f'La varianza es: {varianza(X)}.')
    print(f'La desviación estandar es: {desviacion_estandar(X)}.\n')

Hello, aqui esta mi code. Hice el ambio y es que me di cuenta que ya todo se estaba calculando y no habia necesidad de llamar a la media y a la varianza si la llamabas desde el main

import random
import math

def average (X):
    return sum(X) / len(X)

def variance(X, mu):
    store = 0

    for x in X:
       store += (x - mu)**2
    
    return store / len(X)

def standard_deviation(v):
    return math.sqrt(v)


if __name__ == "__main__":
    X = [random.randint(1,21) for i in range(20)]
    mu = average(X)
    v = variance(X, mu)
    sigma = standard_deviation(v)

    print(X)
    print(mu)
    print(v)
    print(sigma)```

The given array was:
[3, 4, 8, 2, 1]

medium = 3.6
variance = 5.840000000000002
standard deviation = 2.4166091947189146

Tema con buena explicación por parte de David.

import random
import math

def media(X):
    return sum(X) / len (X)

def varianza(X):
    mu = media(X)

    acumulador = 0

    for ind in X:
        acumulador  += (ind - mu)**2

    return acumulador / len(X)

def desviacion_estandard(X):
    return math.sqrt(varianza(X))

if __name__ == "__main__":
    X = [random.randint(9,11) for i in range(20)]
    mu = media(X)
    Var = varianza (X)
    sigma = desviacion_estandard(X)

    print(f'La muestra X es {X}')
    print(f'La media es {mu}')
    print(f'La varianza es {Var}')
    print(f'La desviación estándard es {sigma}')

Como dato curioso:
Cuando cambiamos el rango de 9-11

Media=10.0

Recordando mas conceptos estadisticos, esto se pone cada vez mas interesante.

def inferencia_estadistica(x):
	stat={}
	stat['media']=sum(x)/len(x)
	varianza_dividendo=[(i - stat['media'])**2 for i in x] 
	acumulador=0
	for i in varianza_dividendo:
		acumulador+=i
	stat['varianza']=acumulador/len(x)
	stat['desviacion_estandar']=stat['varianza']**0.5
	return stat
	
if __name__ == '__main__':
	x=[1, 2, 3, 4, 5]
	print(inferencia_estadistica(x))

Muy buenas herramientas!!

Hice una modificación para que se puedan escribir los datos que se deseen.

import math

def media(X):
    return sum(X) / len(X)


def varianza(X):
    mu = media(X)

    acumulador = 0
    for x in X:
        acumulador += (x - mu)**2

    return acumulador / len(X)


def desviacion_estandar(X):
    return math.sqrt(varianza(X))


if __name__ == '__main__':
    X = []
    
    numero_de_datos = int(input("Ponga el número de datos: "))
    
    for i in range(numero_de_datos):
        numero = int(input(f"Dato {i+1}: "))
        X.append(numero)

    mu = media(X)
    Var = varianza(X)
    sigma = desviacion_estandar(X)

    print(f'Arreglo X: {X}')
    print(f'Media = {mu}')
    print(f'Varianza = {Var}')
    print(f'Desviacion estandar = {sigma}')

En resumen, NUNCA tener en cuenta el promedio sin la desviación estandar, los 2 datos deben ir juntos para tomar decisiones en base a ellos

Utilizando la librería statistics

import random
import math
import statistics

def media(X):
    return sum(X) / len(X)

def varianza(X):
    mu = media(X)
    acumulador = 0
    for x in X:
        acumulador += (x - mu)**2

    return acumulador / len(X)

def desviacion_estandar(X):
    return math.sqrt(varianza(X))


if __name__ == "__main__":
    X = [random.randint(1,21) for i in range(20)]
    mu = media(X)
    sigma_cuadrado = varianza(X)
    sigma = desviacion_estandar(X)
    print(f'La lista es : {X}')
    print ('*' * 10)
    print(f'La media (mu) es: {mu}')
    print(f'La varianza (sigma_cuadrado) es: {sigma_cuadrado}')
    print(f'La desviacion estandar (sigma) es: {sigma}')

    mu_fun = statistics.mean(X)
    sigma_cuadrado_fun = statistics.pvariance(X)
    sigma_fun = statistics.pstdev(X)
    print ('*' * 10)
    print(f'La media  (Import statistics) es : {mu_fun}')
    print(f'La varianza  (Import statistics) es : {sigma_cuadrado_fun}')
    print(f'La desviacion estandar  (Import statistics) es : {sigma_fun}')

No se si estoy en lo correcto pero creo que la formula de la clase para para una poblacion. Y segun aprendi en un video que comparti existe 2 tipos de formulas una para la poblacion y otra para las muestras

Varianza: medida de dispersión de los datos respecto a la media.
Desviación estándar: raíz cuadrada de la varianza

Código

Ejecución

El profe confundió randint con randrange. El primero es inclusivo (o sea está agregando el segundo valor) y el primero es exclusivo (el segundo valor define el límite)…

randint:
Return a random integer N such that a <= N <= b. Alias for randrange(a, b+1).

Reglas al tener en cuenta:

  1. El 68 % de los datos se concentra en +/- un SD.
  2. El 95% de los datos se concentra en +/- dos SD.
  3. El 99.7% de los datos se concentra en +/- tres SD.

![Distribución normal de probabilidades](

Me encanta como en un video de menos de 12 minutos explica tan bien el tema y deja bien claro como implementarlo, ahora si se me ocurren usos para la desviación estándar, con las clases de la universidad solo pensé “y esto para que me sirve?”

Excelente la manera como explica el profesor David estos dos conceptos de varianza y desviacion estandar.

La desviación estándar es muy usada a la hora de obtener las incertidumbres en las mediciones.

Esta suponiendo que calcula sobre una muestra… pero está utilizando la fórmula de varianza y desviación estánda POBLACIONAL y no la muestral, no está considerando los grados de libertad.

generalmente la varianza se obtiene diviendo por n-1 y no por n debido a que con esto se obtiene una estimación insesgasda de la misma , es decir es mas probable que nuestro calculo sea cercano al valor en la población

En un gráfico se puede explicar mucho mejor este concepto, a la gráfica de dispersión se le agrega la línea media y tan tan

La funcion random.randint(x, y) es es inclusiva, si ponen esto en el codigo les va a dar una lista de ceros y unos (1 y 2)

X = [random.randint(1, 2) for i in range(20)]

Good class**!!!

Si se toman datos de una muestra en que la desviacón estándar es un número pequeño, que significa con respecto a la validez de ese estudio? quiero decir que sin un estudio con una desviación más pequeña es más valido que un estudio con una desviación más gtrande?