Fitting Poisson distribution to a given car arrival data¶

In [16]:
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
from scipy.stats import poisson
from scipy.optimize import curve_fit

Number of cars arriving at each hour¶

In [17]:
# Given car arrival data
data = np.array([
    9, 12, 21, 7, 22, 20, 10, 13, 13, 15, 17, 16, 11, 14, 14, 14, 13, 17, 14, 18, 
    7, 17, 12, 13, 16, 17, 14, 21, 13, 12, 14, 19, 11, 18, 14, 18, 9, 14, 17, 23, 
    13, 15, 17, 17, 16, 15, 21, 18, 17, 14, 19, 17, 14, 14, 23, 12, 17, 18, 19, 16, 
    16, 14, 20, 12, 14, 11, 16, 20, 22, 24, 11, 15, 8, 12, 7, 18, 10, 14, 11, 11, 
    17, 17, 11, 18, 17, 15, 16, 18, 9, 12, 7, 22, 6, 6, 11, 14, 8, 18, 15, 10
])

Estimate lambda to generate car arrival data¶

In [18]:
# Step 1: Estimate lambda (mean)
lambda_estimate = np.mean(data)
print(f"Estimated \\lambda: {lambda_estimate}")

# Step 2: Generate synthetic Poisson-distributed data
simulated_data = np.random.poisson(lambda_estimate, size=len(data))

# Step 3: Plot histogram of original vs generated data
plt.figure(figsize=(10,5))
plt.hist(data, bins=range(min(data), max(data) + 2), alpha=0.5, label="Original Data", density=True)
plt.hist(simulated_data, bins=range(min(simulated_data), max(simulated_data) + 2), alpha=0.5, label="Simulated Poisson Data", density=True)
plt.xlabel("Number of Cars per Hour")
plt.ylabel("Frequency (Normalized)")
plt.legend()
plt.title("Original vs Poisson-Simulated Car Arrivals")
plt.show()
Estimated \lambda: 14.74
No description has been provided for this image

Fit a Poisson distribution to data in order to generate arrival data¶

In [19]:
def poisson_pmf(k, lamb):
    return poisson.pmf(k, lamb)

params, cov = curve_fit(poisson_pmf, np.arange(0, max(data)+1), np.bincount(data))
fitted_lambda = params[0]
print(f'Fitted lambda = {fitted_lambda}')
Fitted lambda = 14.643711998193513
In [20]:
bins = np.arange(0, max(data)+1)-0.5
x = np.arange(0, max(data)+1)

plt.plot(x, poisson_pmf(x, fitted_lambda), 'b-', label='True Poisson')
plt.hist(data, bins=bins, density=True, label='Samples', color='magenta')
plt.xlabel('Value')
plt.ylabel('Probability')
plt.title('Fitting a Poisson Distribution to Data')
plt.legend()
Out[20]:
<matplotlib.legend.Legend at 0x11dc43d90>
No description has been provided for this image

Use Exponential distribution to generate arrival times¶

In [21]:
# Step 1: Generate inter-arrival times using exponential distribution
inter_arrival_times = np.random.exponential(scale=1/lambda_estimate, size=100)  # Generate 100 inter-arrival times

# Step 2: Compute arrival timestamps
arrival_times = np.cumsum(inter_arrival_times)  # Cumulative sum gives event timestamps

# Step 3: Plot inter-arrival time distribution
plt.figure(figsize=(10,5))
plt.hist(inter_arrival_times, bins=20, alpha=0.7, color="blue", density=True)
plt.xlabel("Inter-Arrival Time (Hours)")
plt.ylabel("Frequency (Normalized)")
plt.title("Distribution of Inter-Arrival Times")
plt.show()
No description has been provided for this image
In [ ]: