Calcular un intervalo de confianza a partir de datos de muestra

Tengo datos de muestra para los que me gustaría calcular un intervalo de confianza, asumiendo una distribución normal.

Encontré e instalé los paquetes numpy y scipy y obtuve numpy para devolver una media y una desviación estándar (numpy.mean (data) con datos como una lista). Cualquier consejo sobre cómo obtener un intervalo de confianza de la muestra sería muy apreciado.

import numpy as np import scipy.stats def mean_confidence_interval(data, confidence=0.95): a = 1.0 * np.array(data) n = len(a) m, se = np.mean(a), scipy.stats.sem(a) h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1) return m, mh, m+h 

Se puede calcular de esta manera.

Aquí, una versión abreviada del código de shasan, que calcula el intervalo de confianza del 95% de la media de la matriz a :

 import numpy as np, scipy.stats as st st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a)) 

Pero el uso de StatsModels ‘ tconfint_mean es posiblemente aún mejor:

 import statsmodels.stats.api as sms sms.DescrStatsW(a).tconfint_mean() 

Los supuestos subyacentes para ambos son que la muestra (matriz a ) se extrajo independientemente de una distribución normal con una desviación estándar desconocida (consulte MathWorld o Wikipedia ).

Para un tamaño de muestra grande n, la media de la muestra se distribuye normalmente, y uno puede calcular su intervalo de confianza utilizando st.norm.interval() (como se sugiere en el comentario de Jaime). Pero las soluciones anteriores son correctas también para la pequeña n, donde st.norm.interval() proporciona intervalos de confianza demasiado estrechos (es decir, “falsa confianza”). Vea mi respuesta a una pregunta similar para obtener más detalles (y uno de los comentarios de Russ aquí).

Aquí un ejemplo donde las opciones correctas dan (esencialmente) intervalos de confianza idénticos:

 In [9]: a = range(10,14) In [10]: mean_confidence_interval(a) Out[10]: (11.5, 9.4457397432391215, 13.554260256760879) In [11]: st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a)) Out[11]: (9.4457397432391215, 13.554260256760879) In [12]: sms.DescrStatsW(a).tconfint_mean() Out[12]: (9.4457397432391197, 13.55426025676088) 

Y finalmente, el resultado incorrecto utilizando st.norm.interval() :

 In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a)) Out[13]: (10.23484868811834, 12.76515131188166) 

Comience con la búsqueda del valor z para el intervalo de confianza deseado desde una tabla de búsqueda . El intervalo de confianza es entonces la mean +/- z*sigma , donde sigma es la desviación estándar estimada de su media muestral, dada por sigma = s / sqrt(n) , donde s es la desviación estándar calculada a partir de sus datos muestrales y n es el tamaño de su muestra.

Al iniciar Python 3.8 , la biblioteca estándar proporciona el objeto NormalDist como parte del módulo de statistics :

 from statistics import NormalDist def confidence_interval(data, confidence=0.95): dist = NormalDist.from_samples(data) z = NormalDist().inv_cdf((1 + confidence) / 2.) h = dist.stdev * z / ((len(data) - 1) ** .5) return dist.mean - h, dist.mean + h 

Esta:

  • Crea un objeto NormalDist partir de la muestra de datos ( NormalDist.from_samples(data) , que nos da acceso a la media y la desviación estándar de la muestra a través de NormalDist.mean y NormalDist.stdev .

  • Calcule la Z-score función de la distribución normal estándar (representada por NormalDist() ) para la confianza dada utilizando el inverso de la función de distribución acumulativa ( inv_cdf ).

  • Produce el intervalo de confianza basado en la desviación estándar y la media de la muestra.


Esto supone que el tamaño de la muestra es lo suficientemente grande (digamos más de ~ 100 puntos) para usar la distribución normal estándar en lugar de la distribución t de Student para calcular el valor z .