Summary

버스가 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