Distribución de Poisson en R

Estadística con R Distribuciones
Distribución de Poisson en R con las funciones dpois, ppois, qpois y rpois

La distribución de Poisson es una distribución discreta que cuenta el número de eventos en un proceso de Poisson. En este tutorial revisaremos las funciones dpois, ppois, qpois y rpois para trabajar con la distribución de Poisson en R.

La distribución de Poisson

Un proceso de Poisson es un experimento aleatorio que consiste en observar la ocurrencia de eventos específicos sobre un soporte continuo (generalmente el espacio o el tiempo), tal que el proceso es estable (el número de ocurrencias, \(\lambda\) es constante a largo plazo) y los eventos ocurren de forma aleatoria e independiente.

La distribución de Poisson se usa para modelar el número de eventos que ocurren en un proceso de Poisson. Sea \(X \sim P(\lambda)\), esto es, una variable aleatoria con distribución de Poisson donde el número medio de eventos que ocurren en un determinado intervalo es \(\lambda\):

  • La función de masa de probabilidad (o PMF, por sus siglas en inglés) es \(P(X = x) =\frac{e^{- \lambda} \lambda^x}{x!}\) para \(x = 0, 1, 2, \dots\).
  • La función de distribución (o CDF, por sus siglas en inglés) es \(F(x) =\sum_{i = 0}^x \frac{e ^{- \lambda} \lambda^i}{i!}\).
  • La función cuantil es \(Q(p) = F ^{-1}(p)\).
  • La esperanza y varianza de \(X\) son \(E(X) = Var(X) = \lambda\).

Las funciones descritas en la lista enterior se pueden calcular en R para un conjunto de valores con las funciones dpois (masa de probabilidad), ppois (distribución) y qpois (cuantil). Además, la función rpois permite obtener \(n\) observaciones aleatorias que siguen una distribución de Poisson. La tabla de abajo describe brevemente cada una de estas funciones.

Función Descripción
dpois Función de masa de probabilidad
de la distribución de Poisson
ppois Función de distribución acumulada
de la distribución de Poisson
qpois Función cuantil de la
distribución de Poisson
rpois Generación de números pseudoaleatorios
de la distribución de Poisson

La función dpois

La función de masa de probabilidad de una distribución de Poisson de media \(\lambda\) se puede calcular en R con la función dpois para cualquier valor de \(x\). El siguiente bloque de código resume los argumentos de la función:

dpois(x,           # Valores del eje X (x = 0, 1, 2, ...)
      lambda,      # Número medio de eventos que ocurren en el intervalo
      log = FALSE) # Si TRUE, las probabilidades se devuelven como log

Como ejemplo, si quieres calcular la función de masa de probabilidad de una distribución de Poisson con media 5 para \(x \in \{0, 1, \dots, 10\}\), puedes escribir:

dpois(0:10, lambda = 5)
0.006737947 0.033689735 0.084224337 0.140373896 0.175467370 0.175467370
0.146222808 0.104444863 0.065278039 0.036265577 0.018132789

También puedes especificar un vector de medias en lugar de un único valor, como en el siguiente bloque de código:

dpois(5, lambda = c(5, 10)) # 0.17546737 0.03783327

En el ejemplo anterior, el primer elemento de la salida procede de una distribución con media \(\lambda = 5\) y el segundo de una distribución con media \(\lambda = 10\) eventos por intervalo.

Gráfico de la función de probabilidad de la distribución de Poisson en R

La función de masa de probabilidad de la Poisson se puede dibujar en R haciendo uso de la función plot, como en el siguiente ejemplo:

# Rejilla de valores del eje X
x <- 0:50

#-----------
# lambda: 5
#-----------
lambda <- 5
plot(dpois(x, lambda), type = "h", lwd = 2,
     main = "Función de masa de probabilidad",
     ylab = "P(X = x)", xlab = "Número de eventos")

#-----------
# lambda: 10
#-----------
lambda <- 10
lines(dpois(x, lambda), type = "h", lwd = 2, col = rgb(1,0,0, 0.7))

#-----------
# lambda: 20
#-----------
lambda <- 20
lines(dpois(x, lambda), type = "h", lwd = 2, col = rgb(0, 1, 0, 0.7))

# Leyenda
legend("topright", legend = c("5", "10", "20"),
       title = expression(lambda), title.adj = 0.75,
       lty = 1, col = 1:3, lwd = 2, box.lty = 0)

Función de masa de probabilidad de la distribución de Poisson en R

La función ppois

La probabilidad de que una variable \(X\) siguiendo una distribución de Poisson tome valores menores o iguales a \(x\) se puede calcular con la función ppois, cuyos argumentos se describen a continuación:

ppois(q,                 # Cuantil o vector de cuantiles
      lambda,            # Media o vector de medias
      lower.tail = TRUE, # Si TRUE, las probabilidades son P(X <= x), o P(X > x) en otro caso
      log.p = FALSE)     # Si TRUE, las probabilidades se devuelven como log

Si quieres calcular, por ejemplo, la probabilidad de observar 5 o menos eventos \((P(X \leq 5))\) si la media de ocurrencia de los eventos en un intervalo específico es 10 puedes escribir:

ppois(5, lambda = 10) # 0.06708596

En este ejemplo, el anterior resultado es equivalente a la suma de las probabilidades de cada valor hasta 5:

sum(dpois(0:5, lambda = 10)) # 0.06708596

Ejemplo con la función ppois

En esta sección vamos a presentar un ejemplo en detalle usando la función ppois. Considera que el número de visitas a una página web sigue una distribución de Poisson con media 15 visitas por hora. Por tanto, \(\lambda = 15\).

  • La probabilidad de obtener 10 visitas o menos por hora, \(P(X \leq 10)\), es:
ppois(10, lambda = 15) # 0.1184644 o 11.8%
1 - ppois(10, lambda = 15, lower.tail = FALSE) # Equivalente
sum(dpois(0:10, lambda = 15)) # Equivalente

Como la distribución de Poisson es discreta, la probabilidad acumulada se calcula sumando las correspondientes probabilidades de la función de masa de probabilidad. La siguiente función de R permite visualizar las probabilidades que se suman basadas en un límite inferior y uno superior.

# lambda: media
# lb: límite inferior de la suma
# ub: límite supeior de la suma
# col: color
# lwd: ancho de línea
pois_sum <- function(lambda, lb, ub, col = 4, lwd = 1, ...) {
    x <- 0:(lambda + lambda * 2)
    
    if (missing(lb)) {
       lb <- min(x)
    }
    if (missing(ub)) {
        ub <- max(x)
    }
      
    plot(dpois(x, lambda = lambda), type = "h", lwd = lwd, ...)
  
    if(lb == min(x) & ub == max(x)) {
        color <- col
    } else {
        color <- rep(1, length(x))
        color[(lb + 1):ub ] <- col
    }
    
    lines(dpois(x, lambda = lambda), type = "h",
          col =  color, lwd = lwd, ...)
}

A modo ilustrativo, si quieres mostrar las probabilidades que se van a sumar para calcular la probabilidad de observar entre 10 y 15 eventos, si ocurren 10 eventos de media en cada intervalo, puedes escribir:

 pois_sum(lambda = 10, lb = 10, ub = 15, lwd = 2,
           col = 2, ylab = "P(X = x)", xlab = "Número de eventos")

Suma de probabilidades de la distribución de Poisson

La suma de las probabilidades mostradas en rojo es igual a ppois(15, lambda = 10) - ppois(10, lambda = 10).

La probabilidad calculada (11.8%) corresponde a la suma de las siguientes probabilidades:

pois_sum(lambda = 15, ub = 10, lwd = 2,
         ylab = "P(X = x)", xlab = "Visitas por hora")

Ejemplo con la función ppois en R

  • La probabilidad de obtener más de 20 visitas por hora, \(P(X > 20)\), es:
ppois(20, lambda = 15, lower.tail = FALSE) # 0.08297091 o 8.3%
1 - ppois(20, lambda = 15)        # Equivalente
1 - sum(dpois(0:20, lambda = 15)) # Equivalente

Esta probabilidad corresponde a:

pois_sum(lambda = 15, lb = 20, lwd = 2,
         ylab = "P(X = x)", xlab = "Visitas por hora")

Función ppois cola superior

  • La probabilidad de recibir menos de 15 visitas por hora, \(P(X < 15)\) es:
ppois(14, lambda = 15, lower.tail = FALSE) # 0.5343463 o 53.43%
1 - sum(dpois(0:15, lambda = 15)) # Equivalente

Ten en cuenta que establecemos 14 en lugar de 15 porque la distribución de Poisson es discreta, por lo que \(P(X < 15) = P(X \leq 14)\). El gráfico correspondiente es como sigue:

pois_sum(lambda = 15, ub = 14, lwd = 2,
         ylab = "P(X = x)", xlab = "Visitas por hora")

Gráfico de la función de probabilidad de Poisson en R

  • La probabilidad de obtener entre 10 y 20 visitas por hora es:
ppois(20, lambda = 15) - ppois(10, lambda = 15) # 0.7985647 o 79.86%
sum(dpois(11:20, lambda = 15)) # Equivalente

La probabilidad se puede representar haciendo uso de la función que definimos antes:

pois_sum(lambda = 15, lb = 10, ub = 20, lwd = 2,
         ylab = "P(X = x)", xlab = "Visitas por hora")

Representando la suma de las probabilidades de una distribución de Poisson

Como la distribución de Poisson es una distribución discreta \(P(X = x) \neq 0\), por lo que \(P(X \geq x) \neq P(X > x)\) y \(P(X \leq x) \neq P(X < x)\).

Gráfico de la función de distribución de Poisson en R

La función de distribución acumulada de una distribución de Poisson se puede representar para diferentes valores de \(\lambda\) con el siguiente bloque de código:

# Rejilla de valores del eje X
x <- 0:50

#-----------
# lambda: 5
#-----------
lambda <- 5
plot(ppois(x, lambda), type = "s", lwd = 2,
     main = "Función de distribución",
     xlab = "Número de eventos", ylab = "F(x)")

#-----------
# lambda: 10
#-----------
lambda <- 10
lines(ppois(x, lambda), type = "s", lwd = 2, col = 2)

#-----------
# lambda: 20
#-----------
lambda <- 20
lines(ppois(x, lambda), type = "s", lwd = 2, col = 3)

# Legend
legend("bottomright", legend = c("5", "10", "20"),
       title = expression(lambda), title.adj = 0.75,
       lty = 1, col = 1:3, lwd = 2, box.lty = 0)

Función de distribución acumulada de Poisson en R

La función qpois

La función qpois permite obtener los cuantiles correspondientes de la distribución de Poisson para un conjunto de probabilidades.

qpois(p,                 # Probabilidad o vector de probabilidades
      lambda,            # Media o vector de medias
      lower.tail = TRUE, # Si TRUE, las probabilidades son P(X <= x), o P(X > x) en otro caso
      log.p = FALSE)     # Si TRUE, las probabilidades se devuelven como log

Por ejemplo, el cuantil 0.5 de una distribución de Poisson es igual a la media:

qpois(0.5, lambda = 10) # 10

Gráfico de la función cuantil de la distribución de Poisson

Las funciones cuantil de la distribución de Poisson se pueden dibujar en R para un conjunto de probabilidades. El siguiente gráfico muestra los salidas de la función qpois para diferentes medias.

#-----------
# lambda: 20
#-----------
plot(qpois(seq(0, 1, 0.001), lambda = 20),
     main = "Función cuantil",
     ylab = "Q(p)", xlab = "p",
     type = "s", col = 3, xaxt = "n")

axis(1, labels = seq(0, 1, 0.1), at = 0:10 * 100)

#-----------
# lambda: 10
#-----------
lines(qpois(seq(0, 1, 0.001), lambda = 10), type = "s", col = 2)

#-----------
# lambda: 5
#-----------
lines(qpois(seq(0, 1, 0.001), lambda = 5), type = "s")

# Legend
legend("topleft", legend = c("5", "10", "20"),
       title = expression(lambda), title.adj = 0.75,
       lty = 1, col = 1:3, lwd = 2, box.lty = 0)

Función cuantil de la distribución de Poisson en R

La función rpois

Si quieres obtener \(n\) observaciones de una distribución de Poisson puedes hacer uso de la función rpois. El siguiente bloque de código resume los argumentos de la función.

rpois(n,      # Número de observaciones a ser generadas
      lambda) # Media o vector de medias

Si quieres obtener 10 observaciones aleatorias de una distribución de Poisson con media 4 puedes escribir:

rpois(10, lambda = 4)
7 6 2 2 3 6 3 4 4 7

Sin embargo, la salida anterior no será reproducible. En caso de que quieras generar una secuencia reproducible de números puedes fijar una semilla con cualquier número entero de la siguiente manera:

set.seed(10)
rpois(10, lambda = 4)
4 3 3 5 1 2 3 3 4 3