버스가 1 시간에 평균적으로 6대가 온다. 이때 20분 이상 오는 버스들에 대한 평균 기대시간은 얼마일까? 이 문제를 Exponential distribution의 Expectation value 으로 simulation 을 통해 알아보자.
수식으로 보면, \(E(X | X > a) = a + E(X - a | X > a) = a + 1/ \lambda = 20/60 + 1/6 = 0.5 h\) 임을 보인다.
그럼, 위 과정을 어떻게 simulation 할 수 있을까?
total_time <- 100 # 전체 시간 100시간
my_lambda <- 6 # 1시간에 평균 6대의 버스가 온다.
min_wait <- 20/60 # 20분 이상 대기한 버스들
num_trials <- 10000 # simulation 시도 횟수
# 대기 시간 반환
wait_time <- function(n, my_lambda)
{
P <- runif(n) # 랜덤하게 0 에서 1 사이의 수를 n개 생성한다.
return(-logb(1-P) / my_lambda) # 대기 시간을 반환한다.
}
# 1번 시도
my_trial <- function()
{
# 100개의 poisson 분포를 따르는 랜덤수를 생성한다.
bus_event <- rpois(total_time, lambda = my_lambda)
# 총 버스 수 만큼의 대기시간을 생성한다.
bus_wait_time <- wait_time(bus_event, my_lambda)
# 20분 이상 걸린 버스들의 대기시간을 반환한다.
result <- bus_wait_time[bus_wait_time >= min_wait]
return(result)
}
my_trial() # 함수 기능 테스트
## [1] 0.5576534 0.5831732 0.3852844 0.3974964 1.3156829 0.4143739 0.3446031
## [8] 0.3480976 0.4648205 0.3352885 0.6130914 0.3784026 0.5619464
trial_result <- c()
# simulation 수 만큼 결과를 생성한다.
for(i in 1:num_trials) {
trial_mean <- mean(my_trial()) # 한 번 시도 후 평균값을 구한다.
trial_result <- c(trial_result, trial_mean) # 결과를 누적해서 저장한다.
}
# histogram 을 그린다.
hist(trial_result, breaks = 100)
# 기대값을 구한다.
mean(trial_result)
## [1] 0.4990559
# 이론적인 기대값
theorical_result <- 20/60 + 1/6
theorical_result
## [1] 0.5