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
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>
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()
In [ ]: