읽기일기

Think Bayes (8) 관측 편향


파이썬을 활용한 베이지안 통계, 앨런 B. 다우니 지음, 권정민 옮김/한빛미디어

8.1 레드라인 문제

레드라인은 케임브리지와 보스턴을 연결하는 지하철 노선이다. 저자는 켄달 스퀘어에서 레드라인을 타고 사우스 스테이션까지 간 다음 니드햄으로 가는 통근선으로 갈타났다. 러시아워 때 레드라인은 평균 매 7~8분 간격으로 운행했다.

역에 도착하면 플랫폼에서 기다리는 승객 수를 기초로 다음 기차가 도착할 때까지 걸리는 시간을 추정했었다. 승객이 별로 없다면 직전 기차를 놓쳤으니 7분 정도 기다려야하고, 승객이 어느 정도 있다면 기차가 곧 도착할 것이다. 하지만 승객이 너무 많다면 기차 운행에 문제가 있을 것이라 생각하고 나가서 택시를 탔다.

이 장의 코드는 http://thinkbayes.com/redline.py에서 얻을 수 있고 데이터를 모으는 데에는 http://thinkbayes.com/redline_data.py를 사용하였다.

8.2 모델

모델링 규칙을 만들어보자.

우선, 승객은 동일한 확률로 도착하고, 이 때 분당 승객 수가 임의의 비율 인 상수 $\lambda$인 포아송 프로세스를 따른다고 하자. 반면 기차 도착은 포아송 프로세스가 아니다. 기차가 7~8분 마다 노선 끝에서 출발하여도 캔달 스퀘어에 도착하는 시간은 3분에서 12분까지 다양하다.

기차 시간 간격에 대한 데이터 수집을 위해 http://www.mbta.com/rider_tools/developers/의 데이터를 참고하여 5일간 매일 오후 4시에서 6시까지의 켄달 스퀘어 근처의 15개의 도착 내역을 기록하였다. 그 후 연달아 도착하는 기차 간격의 시간을 계산하여 z라고 하였다.

하지만 4시에서 6시까지의 분포와 한 승객이 도착하였을 때 임의의 시간에서 관찰한 분포는 상당히 다를 것이다. 왜냐하면 승객이 도착할 시각은 시간 간격이 짧은 경우보다 큰 경우에 도착할 확률이 더 높기 때문이다.

이런 종류의 관측자 편향은 많은 상황에서 나타난다. 학생들은 대부분 큰 강의실에 있기 때문에 강의실들이 실제보다 더 크다고 생각한다. 항공기 승객들은 보통 만석인 비행기에 타기 때문에 비행기가 실제보다 만석일 경우가 많다고 생각한다.

각각의 경우, 실제 분포에서 가져온 값은 실제 값의 비율보다 오버 샘플링된다. 레드 라인 예제에서도, 실제 관측 결과보다 시간 간격이 두 배 정도 크다.

이를 이용하여 실제 시간 차의 분포가 주어졋을 때 승객들이 보는 시간 간격의 분포를 계산할 수 있다.

pmf는 실제 분포고, new_pmf는 편향된 분포다. 각 값에 대하여 x에 의해 나온 확률을 곱한다.

8.3 대기 시간

y로 사용할 대기 시간은 승객이 도착하고 다음 기차가 도착하는 사이의 시간이다. x는 경과 시간이다. 이전 기차가 도착하고 승객이 도착한 사이의 시간이다. 이를 zb = x + y라고 정의하여 보자.

zb의 분포가 주어지면 y의 분포를 계산할 수 있다. 앞의 예에서, 5분일 때의 zb는 1/3의 확률을, 10분에 대해서는 2/3의 확률을 가진다.

5분 간격일 때 임의의 시간에 도착한 경우, y는 0에서 5분 사이의 균등 분포를 따른다. 만약 10분 간격이 ㄹ때 도착했다면 y는 0에서 10 사이의 균등 분포를 따를 것이다. 따라서 전체 분포는 각 간격의 확률이 곱해진 균등 분포의 혼합 형태다.

다음 함수는 zb의 분포를 사용한 y의 분포를 구한다.

그리고 이 분포를 계산하는 과정을 캡슐화하기 위해 WaitTimeCalculator라는 클래스를 만들었다.

pmf_z는 z의 비편향 분포이다. pmf_zb는 승객들이 본 시간 간격의 편향 분포이다.

pmf_y는 대기 시간의 분포이다. pmf_x는 경과시간의 분포로, 대기 시간의 분포와 동일하다. 그 이유는 x = zp - y이기 때문에 x의 분포는 0부터 zp까지의 균등 분포이다.

그 결과로 z의 평균은 7.8분, zb의 평균은 8.8분이다. y의 평균은, 4.4분이다.

8.4 대기 시간 예측

내가 플랫폼에 도착했을 때 10명이 대기하고 있는 것을 봣다. 그러면 다음 기차가 도착할 때까지 얼마나 기다려야 할까?

일단 문제를 쉬운 형태로 만든뒤 확장하도록 하자. 실제 분포 z가 있고 승객 도착 비율 $ \lambda $가 분당 2명이라는 것을 알고 있다고 가정하자. 할 수 있는건 다음과 같다.

  1. z의 분포를 사용해서 승객이 보는 기차 시간 간격 zp의 사전 분포를 계산하자.
  2. 지난 기차로부터의 경과 시간 x에 대한 분포 추정을 위해 승객 수를 사용할 수 있다.
  3. 마지막으로 y = zp - x 관계를 사용해서 y의 분포를 구한다.

먼저 승객 수를 계산하기 전에 zp, x, y의 분포를 캡슐화 하는 WaitTimeCalculator를 생성한다.

pmf_z는 시간 간격에 대해 주어진 분포다.

다음은 x의 사후 분포와 y의 예측 분포를 캡슐화하는 ElapsedTimeEstimator를 만든다.

lam은 초당 승객 수로 나타내는 승객 도착 비율, 그리고 num_passengers는 관측된 승객 수이다.

prior_xpost_x는 경과 시간의 사전 분포와 사후 분포다. pmf_y는 대기 시간의 예측 분포다.

Elapsed는 가설 분포를 나타내는 Suite이다.

우도의 hypo는 마지막 기차 이후 경과 시간이고, datalam과 승객 수의 튜플이다. 이렇게 계산된 우도는 주어진 도착 비율 lam에 대해 시간 xk대가 도착할 확률이다. 여기서는 포아송 분포를 사용하여 계산하였다.

pmf_zb는 기차 간의 간격 분포고, pmf_x는 관측된 승객 수에 따른 경과 시간 분포다. y = zb - x 이므로 다음을 구할 수 있다.

결과에는 음수에 대한 경우가 포함되어있는데, RemoveNegatives는 이를 제거해버리는 기능을 한다.

8.5 도착 비율 추정

지금까지는 우리가 간격 분포와 승객 도착 비율을 안다는 가정에서 문제를 해결하였다. 여기서 승객 도착 비율은 모르는 상태를 생각하여 보자.

막 보스턴으로 이사를 와서 승객 도착 비율을 모른다고 하여보자. 따라서 플랫폼에 도착하는 날마다 시간과 대기 승객 수를 기록하였다고 해보자. 다음은 5일 간의 데이터이다.

k1 y k2
17 4.6 9
22 1.0 0
23 1.4 4
18 5.4 12
4 5.8 11

k1은 도착했을 때의 대기 승객 수, y는 분 단위 대기시간, k2는 대기하는 동안 도착한 승객 수이다.

$ \lambda $의 사후 분포를 계산하여 보자.

ArrivalRate$\lambda$에 대한 가설을 나타내는 Suite이다. 가설은 $ \lambda$의 값이며, 데이터는 대기 시간 y와 도착한 승객 수 k의 쌍이다.

8.6 결합 불확실성

만약 분석 시 입력 값 중 하나라도 불확실한 것이 있다면 다음과 같은 프로세스를 고려할 수 있다.

  1. 불확실한 변수의 결정 값을 기반으로 한 분석을 구현한다.
  2. 불확실 변수값의 분포를 계산한다.
  3. 변수의 각 값에 대해 분석을 실행한 후 예측 분포의 셋을 설정한다.
  4. 변수의 분포에 가중치를 주어 예측 분포의 혼합을 계산한다.

1, 2는 앞에서 설명하였고 여기서는 3, 4를 처리하여보자.

일반적으로 시스템의 응답 값이 선형이 아닌 경우 변동성을 포함하는 것은 중요하다.

8.7 의사 결정 분석

여기까지 진행 했으면, 대기 시간의 플랫폼의 승객 수를 사용하여 대기 시간의 분포를 예측할 수 있다. 그렇다면 언제 기차를 기다리는 것을 멈추고 택시를 잡으로 가야할까? 아직 여유 시간이 15분 있다고 가정해보자.

이러한 경우 num_passengers함수로 y가 15분 이상일 확률을 알 수 있을 것이다. 8.4의 분석을 사용하면 된다.

하지만, 대기 시간이 긴 경우는 드물어서 분석 내용이 빈도에 민감해지는데, 빈도를 추정하는 것이 어렵다.

가진 데이터는 1주일치 뿐이고, 관측했던 가장 긴 대기시간이 15분이다. 대기 시간이 더 긴 경우에는 정확하게 추정할 수가 없다.

하지만 기존 관측 내용을 토대로 최소한 대략적인 추정은 할 수 있다.1년간 3개의 주요 장기 대기 시간이 있다고 추정하여보자. 하지만 이 관측은 편향적이다. 긴 관측이 많은 승객에게 영향을 끼치므로 더 관측하기가 쉽다. 그러므로 이 관측은 z가 아니라 zb를 샘플로 사용하여야 한다.

관측한 시간 차 gap_times를 사용해서 220개의 시간차 샘플을 만들고, 이 샘플의 PMF를 계산한다.

이제 pmf_z를 편향시킨 뒤 샘플을 고르고 30, 40, 50분의 대기 시간을 추가하자.

다음 KDE로 Pdf를 추정하고 이를 Pmf로 바꾼다.

마지막으로 zb의 분포를 비편향화해서 z의 분포를 구하고, 이를 사용해서 WaitTimeCalculator를 생성한다.

이제 장기 대기 시간의 확률을 계산하여보자.

8.8 토의

이제까지 분석 내용은 승객 도착 비율이 동일하다는 가정하에 이루어졌다. 만약 특별한 행사가 주변에 있을 경우, 많은 사람들이 몰릴 것이며 lam의 추정치는 낮아지고 x, y의 추정치는 높아질 것이다. 이것이 주요 장기 대기만큼 일어난다면 모델에 포함시켜야 한다. lam의 분포에 간헐적으로 발생하는 큰 값을 포함하여 확장하면 될 것이다.


Add a Comment Trackback