Poisson Distribution

Joel Sanqui (Appalachian State University)

Introduction

Let \(X\) be a random variable representing the total number of events occurring in a fixed interval of time or space, satisfying the following:

  • Events occur independently at a constant average rate.
  • Two events cannot occur at the exact same instantaneous moment.
  • \(\lambda\) (lambda) represents the expected (average) number of occurrences in that interval.

Pmf as a Binomial Limit

The Poisson distribution can be derived by slicing a continuous interval into \(n\) tiny, equal sub-intervals.

Let the probability of an event in any single sub-interval be \(p = \frac{\lambda}{n}\). If \(n \to \infty\), the number of successes \(X\) approaches a Poisson random variablevand its pmf is given by

\[P(X = x) = \lim_{n \to \infty} \binom{n}{x} \left(\frac{\lambda}{n}\right)^x \left(1 - \frac{\lambda}{n}\right)^{n-x}\]

Deriving the Formula

We expand the binomial coefficient and split the limit into three distinct parts:

\[ P(X = x) = \lim_{n \to \infty} \frac{n(n-1)\cdots(n-x+1)}{x!} \cdot \left(\frac{\lambda^x}{n^x}\right) \\ \cdot \left(1 - \frac{\lambda}{n}\right)^n \cdot \left(1 - \frac{\lambda}{n}\right)^{-x}\]

\[= \frac{\lambda^x}{x!} \cdot \lim_{n \to \infty} \underbrace{\left[\frac{n(n-1)\cdots(n-x+1)}{n^x}\right]}_{\mathbf{\to 1}}\\ \cdot \underbrace{\left(1 - \frac{\lambda}{n}\right)^n}_{\mathbf{\to e^{-\lambda}}} \cdot \underbrace{\left(1 - \frac{\lambda}{n}\right)^{-x}}_{\mathbf{\to 1}} \]

The Final pmf

Evaluating those limits yields the classic Poisson probability mass function:

\[f(x) = P(X = x) = \frac{e^{-\lambda} \lambda^x}{x!}\] \[\text{for } x = 0, 1, 2, \dots\]

We write \(X \sim \text{Poisson}(\lambda)\).

Mean & Variance of Poisson

The properties of the Poisson distribution can also be linked back to its Binomial limits (\(n \to \infty\), \(p \to 0\), \(np = \lambda\)).

  • Mean: \[\mathbb{E}[X] = \lim_{n \to \infty} np = \lambda\]
  • Variance: \[\text{Var}(X) = \lim_{n \to \infty} np(1-p) = \lambda(1 - 0) = \lambda\]

The Poisson Process

A Poisson Process models continuous, random events over time or space. Key real-world applications include:

  • Time-based intervals: Bank customers arriving at an ATM per hour, or customer support emails received per day.
  • Space-based intervals: The number of typos per page in a book, or the number of structural flaws per kilometer of highway.

Example 1: Website Server Traffic

System administrators use the Poisson distribution to scale server infrastructure for sudden traffic spikes.

  • Scenario: A website server receives an average of \(\lambda = 4\) requests per second.
  • Problem: Calculate the probability that the server receives \(x \le 2\) requests in a given second to ensure it won’t crash.

Solutions

  • Exact Probability \(P(X \le 2) = f(0)+f(1)+f(2)\) = 23.81%
  • Mean expected requests per second is \(\lambda =\) 4
  • Variance of requests per second is also \(\lambda =\) 4.

Traffic Visualization

library(ggplot2)

lambda_traffic <- 4
df_traffic <- data.frame(x = 0:12, pmf = dpois(0:12, lambda = lambda_traffic))
df_traffic$highlight <- ifelse(df_traffic$x <= 2, "Target (<=2)", "Other")

ggplot(df_traffic, aes(x = factor(x), y = pmf, fill = highlight)) +
  geom_col(width = 0.7) +
  scale_fill_manual(values = c("Target (<=2)" = "darkgreen", "Other" = "grey70")) +
  labs(title = "Server Traffic Probability Matrix (lambda = 4)",
       x = "Number of Requests / Second (x)", y = "Probability", fill = "Region") +
  theme_minimal()

Traffic Visualization

Example 2: Call Center Volume

Managers track hourly metrics to properly staff customer service agents.

  • Scenario: A support hotline handles an average of \(\lambda = 15\) calls per hour.
  • Question: How likely is it that the team receives an overwhelming load of \(x \ge 50\) calls in a 3-hour period?

Solution

  • Mean expected calls per 3-hours is \(\lambda =\) (15)(3) = 45
  • Variance of calls per 3-hours is \(\lambda =\) 45
  • Exact Poisson Probability \(P(X \ge 50) = 1 - P(X \le 49)\) = 24.68%

Call Volume Visualization

library(ggplot2)

lambda_call <- 45
df_call <- data.frame(x = 20:65, pmf = dpois(20:65, lambda = lambda_call))
df_call$highlight <- ifelse(df_call$x >= 50, "Target (>=50)", "Other")

ggplot(df_call, aes(x = x, y = pmf, fill = highlight)) +
  geom_col(width = 0.9) +
  scale_fill_manual(values = c("Target (>=50)" = "firebrick", "Other" = "grey70")) +
  labs(title = "Call Center Volume (lambda = 45)",
       x = "Number of Calls / 3-Hour (x)", y = "Probability", fill = "Region") +
  theme_minimal()

Call Volume Visualization

Poisson Distribution in R

In the prior plots, we map probabilities using dpois. The exact probability in Example 1 is:

dpois(0, lambda=4) + dpois(1, lambda=4) + dpois(2, lambda=4)
[1] 0.2381033

To calculate the cumulative density function (cdf), we use ppois. The calculation for Example 1 simplifies to:

ppois(2, lambda=4)
[1] 0.2381033

To discover specific thresholds, we use the quantile function qpois. To run stochastic simulations, we use rpois.

Example 3

If an intersection averages 3 accidents per month (\(\lambda = 3\)), what is the probability of experiencing exactly 60 accidents next year?

Solution:

The number of accidents, X, in a 12-month period has a Poisson(36) distribution.

\(P(X = 60)\) is evaluated as:

dpois(60, lambda = 36)
[1] 6.658461e-05

Example 4

What is the probability of experiencing less than 36 accidents?

Solution:

\(P(X < 36) = P(X \le 35)\) is evaluated as:

ppois(35, lambda = 36)
[1] 0.4778333

Example 5

What is the probability of experiencing anywhere from 30 to 40 accidents?

Solution:

\(P(30 \le X \le 40)\) is calculated as:

ppois(40, lambda = 36) - ppois(29, lambda = 36)
[1] 0.6392148

Example 6

What is the 3rd quartile (75th percentile) of the number of accidents per year?

Solution:

qpois(0.75, lambda = 36)
[1] 40

Empirical Simulation: Call Arrivals

What happens if we simulate a Poisson process empirically over many intervals?

  • Experiment: Simulate monitoring an arrival loop with an average rate of \(\lambda = 8\) events per interval.
  • Repetitions: Run this process \(1,000\) independent times.
  • Objective: Map the results to show how close the empirical mean and variance are to \(\lambda\).

Simulation

library(ggplot2)
set.seed(42) # Ensure reproducible results

# 1000 intervals simulated with average lambda = 8
sim_events <- rpois(n = 1000, lambda = 8)
df_sim <- data.frame(events = sim_events)

sim_mean <- mean(sim_events)
sim_var  <- var(sim_events)

plot_title <- paste0("Empirical Poisson Simulation (1000 intervals of lambda = 8)\n",
                     "Simulated Mean: ", round(sim_mean, 2), 
                     " | Simulated Variance: ", round(sim_var, 2))
ggplot(df_sim, aes(x = events)) +
  geom_histogram(binwidth = 1, fill = "purple", color = "white", alpha = 0.8) +
  geom_vline(xintercept = sim_mean, color = "black", linetype = "dashed", size = 1) +
  labs(title = plot_title, x = "Number of Events (X)", y = "Frequency") +
  theme_minimal()

Simulation

Note that because both theoretical mean and variance are equal to \(\lambda = 8\), the empirical mean and variance from the simulation are pretty close.

References

  • History of the Distribution: Hald, A. (1998). A History of Mathematical Statistics from 1750 to 1930. New York, NY: John Wiley & Sons.

  • Properties of the Distribution Ross, S. M. (2014). A First Course in Probability (9th ed.). Pearson.

  • Computational Software: R Core Team (2026). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing. Vienna, Austria. Available at https://www.R-project.org/.