En mis artículos anteriores Beginners Guide to Statistics in Data Science y The Inferential Statistics Data Scientists Should Know hemos hablado de casi todos los conceptos básicos (descriptivos e inferenciales) de la estadística que se utilizan comúnmente en la comprensión y el trabajo con cualquier estudio de caso de ciencia de datos. En este artículo, vamos a ir un poco más allá y hablar de algunos conceptos avanzados que no son parte del hype/buzz.
Puedes leer más artículos de Data Science en español aquí
Concepto #1 - Q-Q(quantile-quantile) Plots
Un cuantil define una parte concreta de un conjunto de datos, es decir, un cuantil determina cuántos valores de una distribución están por encima o por debajo de un determinado límite. Los cuantiles especiales son el cuartil (cuarto), el quintil (quinto) y los percentiles (centésimo).
Un ejemplo:
Si dividimos una distribución en cuatro porciones iguales, hablaremos de cuatro cuartiles. El primer cuartil incluye todos los valores que son menores que la cuarta parte de todos los valores. En una representación gráfica, corresponde al 25% del área total de la distribución. Los dos cuartiles inferiores comprenden el 50% de todos los valores de la distribución. El rango intercuartil entre el primer y el tercer cuartil es igual al rango en el que se encuentra el 50% de todos los valores que se distribuyen alrededor de la media.
En Estadística, un gráfico Q-Q (cuantil-cuantil) es un gráfico de dispersión creado al trazar dos conjuntos de cuantiles entre sí. Si ambos conjuntos de cuantiles provienen de la misma distribución, deberíamos ver los puntos formando una línea que es aproximadamente recta (y=x).
Es muy importante saber si la distribución es normal o no para poder aplicar diversas medidas estadísticas a los datos e interpretarlos en una visualización mucho más comprensible para el ser humano, y el gráfico Q-Q entra en escena. La pregunta más fundamental que responde el gráfico Q-Q es si la curva está normalmente distribuida o no.
Se distribuye normalmente, pero ¿por qué?
Los gráficos Q-Q se utilizan para encontrar el tipo de distribución de una variable aleatoria, ya sea una distribución gaussiana, una distribución uniforme, una distribución exponencial o incluso una distribución de Pareto, etc.
Se puede saber el tipo de distribución utilizando la potencia del gráfico Q-Q con sólo mirar el gráfico. En general, hablamos de distribuciones Normales sólo porque tenemos un concepto muy bonito de la regla 68-95-99.7 que se ajusta perfectamente a la distribución normal Así sabemos qué parte de los datos se encuentra en el rango de la primera desviación estándar, la segunda desviación estándar y la tercera desviación estándar de la media. Así que saber si una distribución es Normal nos abre nuevas puertas para experimentar
Si el extremo inferior del gráfico Q-Q se desvía de la línea recta, pero el extremo superior no, entonces la distribución es Left skewed(Negatively skewed).
La distribución con la cola gorda tendrá ambos extremos de la gráfica Q-Q para desviarse de la línea recta y su centro sigue la línea, donde como una distribución de cola delgada término Q-Q parcela con muy menos o desviación insignificante en los extremos por lo que es un ajuste perfecto para la distribución normal.
import numpy as np #create dataset with 100 values that follow a normal distribution np.random.seed(0) data = np.random.normal(0,1, 1000) #view first 10 values data[:10]
array([ 1.76405235, 0.40015721, 0.97873798, 2.2408932 , 1.86755799, -0.97727788, 0.95008842, -0.15135721, -0.10321885, 0.4105985 ])
import statsmodels.api as sm import matplotlib.pyplot as plt #create Q-Q plot with 45-degree line added to plot fig = sm.qqplot(data, line='45') plt.show()
El eje Y muestra los datos reales. Esto significa que si los valores de los datos caen a lo largo de una línea aproximadamente recta en un ángulo de 45 grados, entonces los datos están distribuidos normalmente.
Podemos ver en nuestro gráfico Q-Q de arriba que los valores de los datos tienden a seguir de cerca el ángulo de 45 grados, lo que significa que los datos están probablemente distribuidos normalmente. Esto no debería ser sorprendente, ya que generamos los 100 valores de datos utilizando el numpy.random.normal() function.
#create dataset of 100 uniformally distributed values data = np.random.uniform(0,1, 1000) #generate Q-Q plot for the dataset fig = sm.qqplot(data, line='45') plt.show()
Concepto #2- Chebyshev's Inequality
Así, la desigualdad de Chebyshev dice que al menos (1-1/k^2) de los datos de una muestra deben caer dentro de K desviaciones estándar de la media (o, de forma equivalente, no más de 1/k^2 de los valores de la distribución pueden estar a más de k desviaciones estándar de la media).
Donde K --> número real positivo
Si los datos no se distribuyen normalmente, entonces diferentes cantidades de datos podrían estar en una desviación estándar. La desigualdad de Chebyshev proporciona una manera de saber qué fracción de datos cae dentro de K desviaciones estándar de la media para cualquier distribución de datos.
Lea También: 22 Preguntas Sobre Estadística Para Preparar En Una Entrevista De Trabajo
Consideremos un ejemplo: supongamos que se presentan 1.000 concursantes a una entrevista de trabajo, pero sólo hay 70 puestos disponibles. Para seleccionar a los 70 mejores concursantes del total, el propietario realiza unas pruebas para juzgar su potencial. La puntuación media de la prueba es de 60, con una desviación estándar de 6. Si un aspirante obtiene una puntuación de 84, ¿puede presumir que va a conseguir el puesto?
import numpy as np import random import matplotlib.pyplot as plt #create a population with a gamma distribution shape, scale = 2., 2. #mean=4, std=2*sqrt(2) mu = shape*scale #mean and standard deviation sigma = scale*np.sqrt(shape) s = np.random.gamma(shape, scale, 1000000)
#sample 10000 values rs = random.choices(s, k=10000)
#set k ks = [0.1,0.5,1.0,1.5,2.0,2.5,3.0] #probability list probs = [] #for each k for k in ks: #start count c = 0 for i in rs: # count if far from mean in k standard deviation if abs(i - mu) > k * sigma : c += 1 probs.append(c/10000)
plot = plt.figure(figsize=(20,10)) #plot each probability plt.xlabel('K') plt.ylabel('probability') plt.plot(ks,probs, marker='o') plot.show() #print each probability print("Probability of a sample far from mean more than k standard deviation:") for i, prob in enumerate(probs): print("k:" + str(ks[i]) + ", probability: " \ + str(prob)[0:5] + \ " | in theory, probability should less than: " \ + str(1/ks[i]**2)[0:5])
Concepto #3- Log-Normal Distribution
Así, si la variable aleatoria X se distribuye de forma log-normal, entonces Y = ln(X) tiene una distribución normal. De forma equivalente, si Y tiene una distribución normal, entonces la función exponencial de Y, es decir, X = exp(Y), tiene una distribución log-normal.
Puedes leer más artículos de Data Science en español aquí
Las distribuciones sesgadas con baja media y alta varianza y todos los valores positivos encajan en este tipo de distribución. Una variable aleatoria con distribución log-normal sólo toma valores reales positivos.
La fórmula general de la función de densidad de probabilidad de la distribución lognormal es
La forma de la distribución Lognormal está definida por 3 parámetros:
-
σ es el parámetro de forma, (y es la desviación estándar del logaritmo de la distribución)
-
θ o μ es el parámetro de localización (y es la media de la distribución)
-
m es el parámetro de escala (y es también la mediana de la distribución)
Si x = θ, entonces f(x) = 0. El caso en el que θ = 0 y m = 1 se denomina distribución lognormal estándar. El caso en el que θ es igual a cero se denomina distribución lognormal de 2 parámetros.
El siguiente gráfico ilustra el efecto del parámetro de localización(μ) y escala(σ) en la función de densidad de probabilidad de la distribución lognormal:
import numpy as np import matplotlib.pyplot as plt from scipy.stats import lognorm np.random.seed(42) data = lognorm.rvs(s=0.5, loc=1, scale=1000, size=1000) plt.figure(figsize=(10,6)) ax = plt.subplot(111) plt.title('Generate wrandom numbers from a Log-normal distribution') ax.hist(data, bins=np.logspace(0,5,200), density=True) ax.set_xscale("log") shape,loc,scale = lognorm.fit(data) x = np.logspace(0, 5, 200) pdf = lognorm.pdf(x, shape, loc, scale) ax.plot(x, pdf, 'y') plt.show()
Concepto #4- Power Law distribution
Por ejemplo, considerando el área de un cuadrado en función de la longitud de su lado, si se duplica la longitud, el área se multiplica por un factor de cuatro.
Una distribución de ley de potencia tiene la forma Y = k Xα,
donde:
-
X e Y son variables de interés,
-
α es el exponente de la ley,
-
k es una constante.
Se ha comprobado que muchos procesos siguen leyes de potencia en rangos de valores considerables. Desde la distribución en los ingresos, el tamaño de los meteoroides, las magnitudes de los terremotos, la densidad espectral de las matrices de pesos en las redes neuronales profundas, el uso de las palabras, el número de vecinos en varias redes, etc. (Nota: La ley de potencia aquí es una distribución continua. Los dos últimos ejemplos son discretos, pero a gran escala pueden modelarse como si fueran continuos).
Puedes leer más artículos de Data Science en español aquí
Lea también: Medidas Estadísticas De Tendencia Central
import numpy as np import matplotlib.pyplot as plt from scipy.stats import pareto x_m = 1 #scale alpha = [1, 2, 3] #list of values of shape parameters plt.figure(figsize=(10,6)) samples = np.linspace(start=0, stop=5, num=1000) for a in alpha: output = np.array([pareto.pdf(x=samples, b=a, loc=0, scale=x_m)]) plt.plot(samples, output.T, label='alpha {0}' .format(a)) plt.xlabel('samples', fontsize=15) plt.ylabel('PDF', fontsize=15) plt.title('Probability Density function', fontsize=15) plt.legend(loc='best') plt.show()
Concepto #5- Box cox transformation
Las transformaciones de Box-Cox de un parámetro se definen como En muchas técnicas estadísticas, suponemos que los errores se distribuyen normalmente. Esta suposición nos permite construir intervalos de confianza y realizar pruebas de hipótesis. Al transformar la variable objetivo, podemos (con suerte) normalizar nuestros errores (si no son ya normales).
Además, la transformación de nuestras variables puede mejorar el poder predictivo de nuestros modelos porque las transformaciones pueden eliminar el ruido blanco.
Las transformaciones Box-Cox de un parámetro se definen como:
El parámetro λ se estima mediante el profile likelihood function y utilizando pruebas de bondad de ajuste.
Si hablamos de algunos inconvenientes de la transformación Box-cox, entonces si lo que se quiere es la interpretación, entonces no se recomienda Box-cox. Porque si λ es algún número distinto de cero, entonces la variable objetivo transformada puede ser más difícil de interpretar que si simplemente aplicamos una transformación logarítmica.
Puedes leer más artículos de Data Science en español aquí
Un segundo escollo es que la transformación Box-Cox suele dar la mediana de la distribución de la previsión cuando revertimos los datos transformados a su escala original. En ocasiones, queremos la media y no la mediana.
#load necessary packages import numpy as np from scipy.stats import boxcox import seaborn as sns #make this example reproducible np.random.seed(0) #generate dataset data = np.random.exponential(size=1000) fig, ax = plt.subplots(1, 2) #plot the distribution of data values sns.distplot(data, hist=False, kde=True, kde_kws = {'shade': True, 'linewidth': 2}, label = "Non-Normal", color ="red", ax = ax[0]) #perform Box-Cox transformation on original data transformed_data, best_lambda = boxcox(data) sns.distplot(transformed_data, hist = False, kde = True, kde_kws = {'shade': True, 'linewidth': 2}, label = "Normal", color ="red", ax = ax[1]) #adding legends to the subplots plt.legend(loc = "upper right") #rescaling the subplots fig.set_figheight(5) fig.set_figwidth(10) #display optimal lambda value print(f"Lambda value used for Transformation: {best_lambda}")
Concepto #6- Poisson distribution
En términos muy sencillos, una distribución de Poisson puede utilizarse para estimar la probabilidad de que algo ocurra "X" número de veces.
Algunos ejemplos de procesos de Poisson son los clientes que llaman a un centro de ayuda, la desintegración radiactiva de los átomos, los visitantes de una página web, los fotones que llegan a un telescopio espacial y los movimientos en el precio de las acciones. Los procesos de Poisson suelen estar asociados al tiempo, pero no tienen por qué estarlo.
La fórmula de la distribución de Poisson es:
-
e es el numero de Euler (e = 2.71828...)
-
k es el numero de ocurrencias
-
k! es el factorial de k k
- λ es igual al valor esperado de kcuando éste es también igual a su varianza
Otro ejemplo: este modelo puede utilizarse para predecir el número de "shocks" del mercado que se producirán en un periodo de tiempo determinado, por ejemplo, durante una década.
from numpy import random import matplotlib.pyplot as plt import seaborn as sns lam_list = [1, 4, 9] #list of Lambda values plt.figure(figsize=(10,6)) samples = np.linspace(start=0, stop=5, num=1000) for lam in lam_list: sns.distplot(random.poisson(lam=lam, size=10), hist=False, label='lambda {0}'.format(lam)) plt.xlabel('Poisson Distribution', fontsize=15) plt.ylabel('Frequency', fontsize=15) plt.legend(loc='best') plt.show()
Espero que hayas disfrutado de la lectura de este artículo, Si tienes alguna pregunta o sugerencia, por favor deja un comentario.
Lea también: Falsos Positivos Vs. Falsos Negativos
Siéntase libre de conectarse conmigo en LinkedIn para cualquier consulta.