Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Estadística Descriptiva

  • Librería básica: scipy.stats (importado como stats)

  • SciPy es una biblioteca de computación científica que utiliza NumPy como base.

  • SciPy significa Scientific Python.

  • Proporciona más funciones de utilidad para optimización, álgebra lineal, funciones especiales, procesamiento de señales, entre otras.

  • Al igual que NumPy, SciPy es de código abierto, por lo que podemos usarlo libremente.

  • SciPy fue creado por el creador de NumPy, Travis Olliphant.

Medidas de resumen

Medidas de tendencial central

Creamos 100 números aleatorios con distribución normal:

import numpy as np
N = 100
np.random.seed(85) # genera una semilla para los números aleatorios
x = np.random.normal(loc = 0, scale = 1, size = N)

Promedio

Promedio o media: notado como xˉ\bar{x}, de un conjunto de nn datos x1,x2,,xnx_1,x_2,\ldots,x_n es igual a la suma de valores dividido para nn.

xˉ=x1+x2++xnn=i=1nxin\bar{x} = \frac{x_1+x_2+\ldots+x_n}{n}=\frac{\sum_{i=1}^nx_i}{n}
  • Si las observaciones están agrupadas en una tabla de frecuencia de datos individuales de kk valores, el promedio se calcula

xˉ=i=1knixin\bar{x} =\frac{\sum_{i=1}^kn_ix_i}{n}

donde n=i=1knin = {\sum_{i=1}^kn_i}.

  • Si las observaciones están agrupadas en una tabla de frecuencias agrupadas por clases, se calcula el punto promedio de cada clase xi=li+si2x_i = \frac{l_i+s_i}{2} (i=1,2,,ki = 1,2,\ldots,k), donde lil_i y sis_i son la cota inferior y superor de cada clase respectivamente. El promedio es

xˉ=i=1knixin\bar{x} =\frac{\sum_{i=1}^kn_ix_i}{n}

Ventajas y desventajas del promedio:

  • Se expresan en las mismas unidades quela variable

  • En su cálculo intervienen todos los valores de la distribución

  • Es el centro de gravedad de toda la distribución

  • Es único

  • Su principal inconveniente es que se ve afectado por valores atípicos

np.mean(x)
-0.07448679690601528

Toma en cuenta lo que pasa con valores nan. hstack agrega valores al vector:

x1 = np.hstack((x,np.nan))
np.mean(x1)
nan
np.nanmean(x1)
-0.05399175295765159
np.nanstd(x1)
1.0419275949784526
np.nanvar(x1)
1.0437145921593087
np.median(x)
-0.06110877613454464

Mediana

La mediana de un conjunto de datos x1+x2++xnx_1+x_2+\ldots+x_n es el valor que se encuentra en el punto medio, cuando se ordenan los valores de menor a mayor.

Se nota como Q2Q_2 o Med y tiene la propiedad de que a cada lado se encuentra el 50% de los datos.

Ventajas:

  • No se ve afectada por valores extremos o atípicos

  • Fácil de interpretar como el “valor medio” de un conjunto de datos. Divide los datos en dos mitades.

  • En distribuciones asimétricas, la mediana proporciona una mejor representación del centro que la media, ya que no se ve arrastrada hacia la cola de la distribución.

Desventajas:

  • La mediana es menos sensible a los cambios en los valores de los datos individuales en comparación con la media.

  • A diferencia de la media, la mediana no toma en cuenta todos los valores del conjunto de datos, sino solo el valor central.

np.median(x)
-0.15334269473584197

La moda

Es el valor que más se repite en un conjunto de datos.

Ventajas:

  • Fácil de entender y calcular, especialmente en conjuntos de datos pequeños o cuando se analizan datos categóricos.

  • Única medida de tendencia central que puede aplicarse a datos cualitativos o categóricos, como colores, marcas o tipos

  • La moda no se ve influenciada por valores atípicos o extremos.

Desventajas:

  • Puede haber más de una moda (multimodal), lo que complica la interpretación.

  • La moda no siempre representa bien el centro de la distribución, especialmente en distribuciones con una moda que es significativamente diferente de la media o la mediana.

  • Para datos continuos, la moda es menos útil, ya que cada valor puede ser único o tener una baja frecuencia, dificultando la identificación de una moda clara.

from scipy import stats
data = [5,3,7,7,9,7]
stats.mode(data)
ModeResult(mode=7, count=3)

Cuando tenemos resultados en varios elementos como el anterior (mode=7, count=3), podemos guardarlos de la siguiente manera:

(valor, freq) = stats.mode(data)
(valor, freq)
(7, 3)

Medidas de Dispersión

Rango

Diferencia entre el valor más alto y el valor más bajo

Ventajas:

  • Fácil de calcular y comprender.

  • Proporciona una idea rápida de la amplitud de los datos, lo que puede ser útil para comparar la variabilidad entre diferentes conjuntos de datos.

Desventajas:

  • El rango se ve afectado por los valores atípicos, ya que depende únicamente de los valores máximo y mínimo. Un solo valor extremo puede distorsionar significativamente el rango.

  • Dos conjuntos de datos con el mismo rango pueden tener distribuciones internas muy diferentes.

En Python se usa la función np.ptp donde ptp significa peak to peak

range = np.ptp(x)
range
4.844982042550862

Desviación estándar

Fue introducida por Karl Person en 1894 y se define:

La desviación estándar (o desviación típica), notada por ss, de un conjunto de nn mediciones x1+x2++xnx_1+x_2+\ldots+x_n es la raíz cuadrada de las desviaciones de las mediciones, respecto al promedio xˉ\bar{x}, dividida entre n1n-1; es decir

s=1n1i=1n(xixˉ)2s = \sqrt{\frac{1}{n-1}\sum_{i = 1}^{n}(x_i-\bar{x})^2}
  • Se expresa en las mismas unidades que los datos originales

  • En su cálculo intervienen todos los valores de la distribución

  • Es única

  • Se ve afectada por valores atípicos

np.std(x)
1.021623508029895

Varianza

np.var(x)
1.0437145921593087

Cuantiles

Un cuantil divide la distribución de los datos en una proporción específica, el cuantil es el dato que corresponde a dicha división.

El cuantil de orden pp de una distribución (con 0<p<10 < p < 1) es el valor de la variable xpx_{p} que marca un corte de modo que una proporción pp de valores de la población es menor o igual que xpx_{p}. Por ejemplo, el cuantil de orden 0.36 dejaría un 36% de valores por debajo y el cuantil de orden 0.50 se corresponde con la mediana de la distribución.

Los cuantiles suelen usarse por grupos que dividen la distribución en partes iguales; entendidas estas como intervalos que comprenden la misma proporción de valores. Los más usados son:

  • Los cuartiles, que dividen a la distribución en cuatro partes (corresponden a los cuantiles 0.25; 0.50 y 0.75);

  • Los quintiles, que dividen a la distribución en cinco partes (corresponden a los cuantiles 0.20; 0.40; 0.60 y 0.80);

  • Los deciles, que dividen a la distribución en diez partes;

  • Los percentiles, que dividen a la distribución en cien partes.

from scipy import stats

#https://docs.scipy.org/doc/scipy/reference/stats.html
stats.mstats.mquantiles(x)
array([-0.69859184, -0.06110878, 0.68540961])
stats.mstats.mquantiles(x,prob=np.arange(0,1.1,0.1))
array([-2.65026416, -1.56576568, -0.81561582, -0.63106628, -0.38972545, -0.06110878, 0.27549474, 0.51752299, 0.89374098, 1.19370644, 2.19471788])
stats.describe(x)
DescribeResult(nobs=100, minmax=(-2.650264162330223, 2.194717880220639), mean=-0.06265059823704579, variance=1.0542571637972815, skewness=-0.10163743053101883, kurtosis=-0.44579574301961733)

Distribuciones

Variables aleatorias (v.a.)

  • Una variable aleatoria es un resultado numérico de un experimento.

  • Las variables aleatorias que estudiamos tienen dos variantes: discretas or continuas.

  • Las v.a discretas son las que tienen un número contable de posibilidades.

    • P(X=k)P(X = k)

  • Las v.a. continuas toman valores en los reales o un subconjunto de los reales.

    • P(XA)P(X \in A)


Ejemplos de v.a.

  • Los resultados (01)(0-1) del lanzamiento de una moneda

  • Los resultados del lanzamiento de un dado

  • El índice de masa corpotal de una persona en una toma futura a la línea base

  • El estado de hipertensión de una persona seleccionada al alzar de una población


Función de masa de probabilidad p(x)p(x)

Una función de masa de probabilidad evaluada en un valor corresponde a la probabilidad que una v.a. toma ese valor. Para se una función válida, se debe satisfacer:

  1. p(x)0p(x) \geq 0 for all xx

  2. xp(x)=1\sum_{x} p(x) = 1

La suma se toma sobre todos los valores de xx.


Ejemplo

Sea XX el resultado del lanzamiento de una moneda donde X=0X=0 representa sello y X=1X = 1 representa cara.

p(x)=(1/2)x(1/2)1x   for   x=0,1p(x) = (1/2)^{x} (1/2)^{1-x} ~~\mbox{ for }~~x = 0,1

Suponga que no sabemos si la moneda es justa. Sea θ\theta la probabilidad de que salga cara se expresa como una proporción (entre 0 y 1).

p(x)=θx(1θ)1x   for   x=0,1p(x) = \theta^{x} (1 - \theta)^{1-x} ~~\mbox{ for }~~x = 0,1

Función de densidad

Una función de densidad (pdf), es una función asociada con una v.a. continua

Las areas debajo las pdfs corresponden a las probabilidades de esa v.a.

La función ff debe satisfacer

  1. f(x)0f(x) \geq 0 para todo xx

  2. El área debajo de f(x)f(x) es uno.


Ejemplo

Supongamos que la proporción de llamadas de ayuda que se atienden en un día aleatorio en una línea de ayuda está dada por

f(x)={2x para 1>x>00 en otro casof(x) = \left\{\begin{array}{ll} 2 x & \mbox{ para } 1 > x > 0 \\ 0 & \mbox{ en otro caso} \end{array} \right.

¿Es esta una densidad válida?


import matplotlib.pyplot as plt

x = [-0.5, 0, 1, 1, 1.5]
y = [0, 0, 2, 0, 0]

plt.plot(x, y, linewidth=3)
<Figure size 640x480 with 1 Axes>

Ejemplo

¿Cuál es la probabilidad de que se atienda el 75% o menos de las llamadas?

import matplotlib.pyplot as plt

# Datos para la línea
x = [-0.5, 0, 1, 1, 1.5]
y = [0, 0, 2, 0, 0]

# Crear la figura y los ejes
fig, ax = plt.subplots()

# Dibujar la línea
ax.plot(x, y, linewidth=3)

# Dibujar el polígono
polygon_x = [0, 0.75, 0.75, 0]
polygon_y = [0, 0, 1.5, 0]
ax.fill(polygon_x, polygon_y, color="lightblue", linewidth=3, edgecolor="black")
<Figure size 640x480 with 1 Axes>
from scipy.stats import beta

result_pbeta = beta.cdf(0.75, 2, 1)
print(1.5 * .75 / 2)
print(result_pbeta)
0.5625
0.5625

Función de distribución acumulada

  • La función de distribución acumulada (CDF) de una v.a. XX se define como la función

    F(x)=P(Xx)F(x) = P(X \leq x)
  • Esta definición aplica indistintamente de si XX es discreta o continua.

  • La función de supervivencia de una v.a. XX es definida como

S(x)=P(X>x)S(x) = P(X > x)
  • Note que S(x)=1F(x)S(x) = 1 - F(x)

  • Para v.a. continuas, la función de densidad es la derivada de la acumulada


Ejemplo

¿Cuál es la función de supervivencia y CDF de la densidad considerada antes?

Para 1x01 \geq x \geq 0

F(x)=P(Xx)=12Base×Height=12(x)×(2x)=x2F(x) = P(X \leq x) = \frac{1}{2} Base \times Height = \frac{1}{2} (x) \times (2 x) = x^2
S(x)=1x2S(x) = 1 - x^2
print(beta.cdf([0.4, 0.5, 0.6], 2, 1))
[0.16 0.25 0.36]

Función Cuantil

  • La función cuantil (QF) de una v.a. XX se define como la función

    Q(x)=F1(x)Q(x) = F^{-1}(x)

Es decir, la función cuantil es la inversa de la función de distribución acumulada.

En Python

miFD = stats.norm(5,3)
miFD
<scipy.stats._distn_infrastructure.rv_frozen at 0x7fdde6619640>
x = np.linspace(-5,15,101)
y1 = miFD.pdf(x) # densidad
y2 = miFD.cdf(x) # acumulada
y3 = miFD.ppf(y2) # cuantil
import matplotlib.pyplot as plt

plt.figure()
plt.plot(x,y1,'-');
Loading...
Loading...
plt.figure()
plt.plot(x,y2,'-');
Loading...
Loading...
plt.figure()
x1 = np.linspace(0,1, len(y3))
plt.plot(y2,y3,'-');
Loading...
Loading...

Distribución acumulada empírica

x = stats.norm.rvs(loc=0,scale=1,size=1000) # distribucion normal estandar
x = np.sort(x) # odenamos los valores de la variable
n = x.size # tamano de la muestra
y = np.arange(1, n+1) / n # % acumulado
plt.figure()
plt.scatter(x=x, y=y);
plt.xlabel('x', fontsize=16)
plt.ylabel('y', fontsize=16)
Loading...
Loading...
from statsmodels.distributions.empirical_distribution import ECDF
ecdf = ECDF(x)
ecdf(1.5)
0.9390000000000001

QQ plot

#https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.probplot.html#scipy.stats.probplot
nsample = 100
np.random.seed(7654321)
plt.figure()
x = stats.t.rvs(df=3, size=nsample)
res = stats.probplot(x, plot=plt)
Loading...
Loading...