Saltar al contenido

Calcule un intervalo de confianza a partir de datos de muestra

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.8la 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 de NormalDist.mean y NormalDist.stdev.

  • Calcular el Z-score basado en la distribución normal estándar (representada por NormalDist()) 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *