Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

¿Cómo estimar una distribución?

10/17
Recursos

Aportes 29

Preguntas 6

Ordenar por:

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

<h4>Estimación Paramétrica</h4>

Se basa realizar el cálculo de una distribución teórica, cuyos parámetros se basan en la información o en el conjunto de datos con el que estamos trabajando. En el ejemplo en clase, primero se calcula un conjunto de datos aleatorios, que sigue a una distribución normal, cuya media será 50 y el desvío estandar será de 5. Esto se genera a partir de la siguiente línea de código:

sample = normal(loc = 50, scale = 5, size = 1000) #Donde loc es la media y scale el desvío estandar

Si graficamos el resultado, veremos algo como lo expuesto en la siguiente imagen, la cual tiene una forma de distribución normal:

El siguiente paso es calcular una función teórica que se ajuste al conjunto de datos. En este caso se conoce la media y el desvío porque los colocamos nosotros para realizar la simulación, pero en una situación real, se debe calcular la media y el desvío tal como lo hizo el profe, y esto se ve en la siguiente línea de código:

mu = sample.mean()
sigma = sample.std()

Con estos valores, se crea una instancia de un objeto cuyos parámetros son precisamente mu y sigma. Es decir, tenemos la base para aplicar la fórmula de la función de distribución Gauseana, pero nos fatan los valores sobre los cuales vamos a calcular esas probabilidades. Entonces primero se crea el objeto y luego se genera un array cuyo rango va a variar entre los extremos de los datos reales y calculamos las probabilidades. Todo esto se ejecuta en las siguientes líneas de código:

dist = norm(mu, sigma)
values = [value for value in range(30,70)]
probabilidades = [dist.pdf(value) for value in values]

Si graficamos ahora solo la función teórica nos queda lo siguiente:

Finalmente, graficamos los datos y la curva teórica calculada y observamos que se asemejan.

<h4>Estimación No Paramétrica</h4>

Este proceso se aplica cuando los datos no se ajustan a una distribución conocida. Entonces no forzamos ajustar los datos a una única distribución, sino a un conjunto de distribuciones.
En este ejemplo, el profe utiliza un método que ya viene incluído dentro de la librería de ScikitLearn, el cual se llama Kernel Density Estimation. Para ello, primero se simulan dos conjuntos de datos a través de dos funciones normales y se juntan en luego en una sola variable a través del método hstack(). Esto lo vemos en las siguientes líneas del código:

sample1 = normal(loc = 20, scale = 5, size = 300)
sample2 = normal(loc = 40, scale = 5, size = 700)
sample = hstack((sample1, sample2))

El resultado lo vemos en la siguiente imagen:

Luego, una vez que tenemos los datos simulados, comienza el proceso de estimación, para ello se crea un objeto modelo, el cual se instancia a través de los parámetros bandwidth (parámetro de suavizado) y kernel (funciones de distribución que se usan para la estimación). Esto es equivalente al método anterior, donde teníamos la función normal teórica, y luego calculábamos las probabilidades, solo que ahora no tenemos solo una función de densidad de probabilidad, sino un conjunto de distribuciones. Una vez creado el objeto, se ajustan los datos a las necesidades del objeto, para esto se utiliza el método reshape, el cual los ordena en una matriz de 1000 filas y 1 columna y luego se ajusta el modelo a estos datos. Esto se hace con las siguientes líneas de codigo:

model = KernelDensity(bandwidth = 2, kernel = 'gaussian')
sample = sample.reshape((len(sample), 1))
model.fit(sample)

Ahora, como dije antes, estamos ajustando el modelo a los datos, es como si estuvieramos calculando la media y el desvío estandar de una distribución normal pero nos faltan calcular los promodios para darle forma a la función teórica. Esto es lo que hacemos a continuación, se crea un array en el rango de los datos reales sobre cuales queremos estimar la función, y luego calculamos las probabilidades. Esto se hace en las siguientes líneas del código. Una aclaración, el cálculo de forma logarítimica tiene que ver con la complejidad algorítmica, es una cuestión de eficiencia. Luego a través de función inversa, la exponencial, obtenemos las probabilidades.

values = np.asarray([value for value in range(1, 60)])
values = values.reshape((len(values), 1))
probabilities = model.score_samples(values) #probabilidad logarítmica para facilitar los calculos
probabilities = np.exp(probabilities)  # inversión de probabilidad obtenemos el valor original

Esto nos devuelve la siguiente curva:

La cual, en conjunto con los datos finalmente queda de la siguiente forma:

Espero que les sirva, me costó un poco entenderlo al principio, hasta que dí con la tecla. Saludos!

La estimacion paramétrica consiste en suponer una función para la distribución y ajustar los parámetros de los datos a dicha distribución. Por otro lado, la estimación no paramétrica se aplica cuando los datos no se ajustan a ninguna distribución conocida.

Profundizando en np.reshape

Nos sirve para separar la lista, y esto es importante para la grafica, ya que si los tenemos juntos, solo nos va a imprimir 1 barra
El primer argumento es la cantidad de grupos o listas en la que vamos a dividir, el segundo argumento nos indica cuantos elementos por lista
Graficando el array a, ósea sin hacer reshape

Graficando el array b, ósea después del reshape
Hay 10 columnas, si ya se que parecen más, pero recordemos, que son 20 elementos, agrupados en 10 columnas

Entre otras variantes, también podemos llamarlo por np.array, y de primer parámetro hacemos referencia a la lista, y dentro del paréntesis la forma en como lo queremos ordenar.
Hay una función para dejar que numpy lo ordene de la forma que el considere más pertinente y es usando el -1, definimos 2 listas y numpy automáticamente sabe que cada una debe tener 10 elementos.
En caso de invertirlo (-1,2) serían 10 listas de 2 elementos

Uffff este curso tiene mi cerebro a mil por hora!!!

lo mejor que escuche, importo de numpy una vaina que se llama.
me identifico tal cual con su jerga

me costo un poco esta clase

Estimaciones

Paramétrica: Forzar los parametros de la distribución. ref
No parametrica: Combinación de varias distribuciones. sec

aun me falta mejorarlo pero allí voy a implementar lo que resta:

Por si a alguien le sirve de ayuda, dejo mis apuntes!

Creo que vendría genial un expert session para esta clase y que se incluya al curso.

No entendí ni papa esta clase…

Este curso está definitivamente mal ubicado en la ruta de ciencia de datos. Se requiere un conocimiento previo de un millón de cosas que el profesor pasa por alto asumiendo que ya las conocemos.

Algo importante para este tema es el Teorema del limite centra, lo vi en el curso de pensamiento probabilístico del profe David Aroesti. Ahora tiene mucho mas sentido de donde salían las distribuciones extrañas que presentaba como ejemplo.

Muy buena explicación.

Vaya si que esta clase fue bastante pesada en cuanto a la información.

Dejare esto aqui.

import numpy as np
from matplotlib import pyplot
from numpy.random import normal
from scipy.stats import norm
from numpy import hstack
from sklearn.neighbors import KernelDensity

# sample = normal(size= 10000) #generador
# pyplot.hist(sample, bins = 30)
# pyplot.show()

if __name__ == '__main__':
    #Estimacion parametrica
    sample = normal(loc=50, scale=5, size=10000) # #mu = 50, sigma = 5
    mu = sample.mean()
    sigma = sample.std()
    dist = norm(mu,sigma)
    values = [value for value in range(30,70)]
    probabilidades = [dist.pdf(value) for value in values]
    pyplot.hist(sample, bins =30, density=True)
    pyplot.plot(values,probabilidades)
    #pyplot.show()

    #estimacion no parametrica
    #construimos una distribucion bimodal
    sample1 = normal(loc=20, scale=5, size=300)
    sample2 = normal(loc=40, scale=5, size=700)
    sample= hstack((sample1,sample2))

    #model = KernelDensity(bandwith=2,  kernel='gaussian')
    model = KernelDensity(bandwidth=2, kernel='gaussian')
    sample = sample.reshape(len(sample),1)
    model.fit(sample)

    values = np.asarray([value for value in range(1,60)])
    values = values.reshape(len(values), 1)
    probabilidades = model.score_samples(values) # probabilidad logaritmica
    probabilidades = np.exp(probabilidades) # inversion de probabilidad

    pyplot.hist(sample, bins=50, density=True)
    pyplot.plot(values, probabilidades)
    pyplot.show()
    

Nota:
Podemos ajustar diversos tipos de distribución como la composisción de otras más sencillas (usamos el módulo Kernel Densisty de scikitLearn cuyos hiper-parámetros son el suavisado y la función base)

Estas clases no tienen desperdicio!!

Explicación de la estimación No Paramétrica

Buen Modulo

Excelente esta clase

Explicación de la estimación Paramétrica

Hasta acá ya he reafirmado que lo mío son los datos, nunca pararé de aprender hasta ser el mejor en ellos.

Deberían hacer un curso completo para esta clase 😛

Grafica de todas las bases de estimación

Tengo una duda
Porque en la estimación paramétrica, le damos el promedio y la desviación estándar para generar los valores

sample = normal(loc = 50, scale = 5, size = 100000)  # mu = 50, sigma = 5

Y después sacamos otra vez el promedio y la desviación estándar sobre los valores ya generados?

mu = sample.mean()
sigma = sample.std()

Vale que se que es como en la clase pasada, pero no acabo de entenderlo del todo

Si alguien me pudiera ayudar se los agradecería mucho

Muy interesante, no me había topado con esto antes

Excelente clase.

sigo sin entender cual es la aplicacion de la vida real de todo esto? creo que este curso esta mal ubicado (yo estoy en escuela de analisis de datos y siento que se me fue muy lejos a machine learning)