La guía paso a paso o código que hallarás en este post es la resolución más eficiente y válida que hallamos a esta inquietud o problema.
Solución:
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, m-h, m+h
se puede calcular de esta manera.
Aquí una versión abreviada del código de shasan, calculando el intervalo de confianza del 95% de la media de array 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 usando StatsModels’ tconfint_mean
es posiblemente incluso mejor:
import statsmodels.stats.api as sms
sms.DescrStatsW(a).tconfint_mean()
Los supuestos subyacentes para ambos son que la muestra (array a
) se dibujó independientemente de una distribución normal con una desviación estándar desconocida (ver MathWorld o Wikipedia).
Para un tamaño de muestra grande n, la media de la muestra se distribuye normalmente y se puede calcular su intervalo de confianza usando st.norm.interval()
(como se sugiere en el comentario de Jaime). Pero las soluciones anteriores también son correctas para n pequeño, donde st.norm.interval()
da intervalos de confianza que son demasiado estrechos (es decir, “falsa confianza”). Consulte 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 usando st.norm.interval()
:
In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a))
Out[13]: (10.23484868811834, 12.76515131188166)
Comenzando Python 3.8
la biblioteca estándar proporciona la NormalDist
objeto como parte del statistics
módulo:
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
Este:
-
Crea un
NormalDist
objeto de la muestra de datos (NormalDist.from_samples(data)
que nos da acceso a la media y desviación estándar de la muestra a través deNormalDist.mean
yNormalDist.stdev
. -
Calcular el
Z-score
basado en la distribución normal estándar (representada porNormalDist()
) para la confianza dada usando la inversa de la función de distribución acumulada (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 z
valor.
Te mostramos las comentarios y valoraciones de los lectores
Eres capaz de reafirmar nuestra publicación añadiendo un comentario y valorándolo te lo agradecemos.