퍼스널 모빌리티 기온 보정 모델: 기온 곡선과 보정 모델

Edwin Park
elecle
Published in
24 min readFeb 18, 2024

안녕하세요, 나인투원 데이터분석팀 에드윈, 박의연입니다. 지난 포스트에서 예고한대로, 이번에는 밀도 최적화 모델에도 활용되었던 기온 보정 모델에 대한 소개를 해보고자 합니다. 퍼스널 모빌리티 서비스를 포함한 모든 오프라인 서비스는 날씨의 영향이 중요하게 작용합니다. 나인투원에서는 퍼스널 모빌리티 서비스를 운영하면서, 날씨에 대한 이해를 어떻게 하고 있고 이를 다루는 지에 대한 간단한 소개를 해보고자 합니다.

1. 프로젝트 소개

날씨는 공유 자전거 서비스의 수요에 가장 많은 영향을 미치는 요소 중 하나입니다. 짧게는 한 주 내내 비가 오다가, 비가 온 다음 날에는 이용 횟수가 뚝 떨어지거나, 길게는 봄, 가을철에는 수요가 많지만 겨울철이 되면 수요가 크게 줄어들곤 합니다. 이렇게 공유 자전거 서비스는 태생적으로 날씨의 요소를 많이 받을 수밖에 없습니다. 하지만, 이 날씨의 요소를 제외하였을 때의 성과를 파악하는 작업은 쉽지 않을 것입니다.

자전거 서비스와 날씨의 관계를 가볍게 생각해보면, “따뜻하면 많이 타고, 추우면 덜 탄다.”라는 인과성이 존재하는 관계는 실제 경험과 직관을 통해서 생각해보실 수 있습니다. 과연 일레클 서비스에서의 기온과 이용 횟수의 관계는 진부한 예시 중 하나인 기온과 아이스크림 판매량의 관계처럼 선형 관계를 보일까요? 우리 팀이 확인한 바로는 “80%는 맞고 20%의 디테일이 부족하다.”라 답할 수 있겠습니다. 아래와 같은 선형 관계를 기반으로 설명하기에는 놓차게 되는 부분이 있기 때문에 우리 데이터분석팀은 실제 데이터에 보여져 있는 디테일을 파악하고 이 관계를 표현하는 데에 힘을 썼습니다.

선형 상관 관계를 이루는 어떤 가게의 기온과 아이스크림 판매량 (데이터 셋 출처 : https://github.com/BuissonFlorent/BehavioralDataAnalysis/tree/master/Chapter 1 — The causal-behavioral framework for data analysis)

우리는 어떠한 액션을 취했을 때, 그에 따르는 성과를 명확하게 측정하고 싶어합니다. 하지만 우리가 통제할 수 없고, 명확히 파악할 수 있는 날씨라는 요소에 의해 액션에 따른 성과를 명확하게 파악하기 어려워지는 경우가 발생합니다. 성과의 변화를 기대할 수 있는 액션들로는 기기대수 조절, 마케팅 프로모션, 신규 기능 출시 등이 있습니다. 그런데 “비가 많이 왔어서”, “최근 추워져서” 등의 실제로 인과성이 있지만, 통제할 수 없는 이유들로 인해 액션을 취한 이후에 그 성과를 명확하게 파악하지 못한다면 우리의 의사 결정에 따른 결과 학습을 하기 어려워집니다. 일레클 데이터 팀 또한 이 문제가 데이터 팀뿐만 아니라 모든 부서에 한계가 되는 점이라 파악하여 “날씨의 요소를 제거(보정)한 권역별 이용횟수”라는 숫자를 도출하고자 하였습니다. 날씨의 영향이 제거(보정)된 이용횟수의 흐름을 활용하면 액션에 따른 이용횟수의 변화를 보다 명확하고 객관적으로 판단할 수 있을 것입니다.

물론 우천의 경우, 분석 기간 내에서 제외를 하는 방식 등으로 간단히 우회할 수는 있을 것입니다. 하지만 기온의 경우에는 어려울 것입니다. 물론 1~2 주 같은 짧은 기간의 경우에는 비가 오지 않은 날은 같은 날씨라 가정하고 성과를 파악할 수도 있겠습니다만, 일별 기온 차이가 심한 환절기나, 연 단위의 넓은 scope로 진행하는 분석과 지표 확인에 있어서는 기온 변화의 영향을 고려하지 않으면 심각한 bias를 초래하거나, “날씨 변화 때문에 애매하다”같은 모호한 결과만 낳게 됩니다. 데이터분석팀은 운영 지역별로 날씨 데이터를 수집하여 적재하는 것부터 시작하여 날씨와 권역별 이용 횟수의 관계를 파악하고, 이를 바탕으로 보정 모델을 개발하는 과정까지 무사히 마쳤습니다. 지금부터 그 여정을 간단히 소개해 드리겠습니다.

2. 날씨와 이용횟수의 관계 파악

기온 보정 모델을 개발하는 데까지는 크게 세 개의 단계가 존재했습니다. 우선 날씨 데이터를 지역별로 올바르게 수집하고, 날씨와 이용횟수의 관계를 파악하고, 그것을 바탕으로 기온 보정을 하는 순서로 프로젝트가 진행되었습니다. 각 단계별 과정을 알아봅시다.

2–1. 날씨 데이터 수집

날씨 분석에 가장 기초가 될 날씨 데이터가 먼저 필요했습니다. 별도의 사설 API를 이용하지 않고도 기상청 API를 활용하여 과거 날씨 데이터를 수집하고, 매일 자동으로 전일 날씨 데이터를 수집하는 스케쥴 작업을 생성할 수 있었습니다.

날씨 분석 초기에는 종관 기상 관측 자료(ASOS)의 일별 요약 자료를 활용하였습니다. 이것으로도 충분히 지역별 날씨에 대한 개괄적인 데이터로 활용할 수 있지만, 시간 단위로 더 정확한 위치의 자료를 파악하기 위해서 지역별상세관측자료(AWS)를 수집하였습니다.

기상청 지역별상세관측자료(AWS)

운영 지역별로 가장 가까운 관측소를 찾은 뒤, 그 관측소의 기상 자료를 수집하여 권역 이름을 맵핑하여 분석용 DB에 적재합니다. 수집 가능한 데이터에는 기온, 강수량과 같은 핵심적인 날씨 자료들을 포함하여 고도, 습도, 풍속 등 추가로 참고할 수 있는 자료들도 있습니다. 이들도 간접적으로는 수요와 이용횟수에 영향이 있을 수 있겠지만, 앞으로 다룰 분석에서는 “일 평균 기온”과 “일 누적 강수량” 두 자료만 활용하겠습니다.

2–2. 일별 날씨 — 이용횟수 관계 파악

위 단계에서 권역별 날씨 데이터를 수집 완료하였으므로, 이제 권역별로 날씨 데이터와 권역별 이용횟수의 관계를 확인해볼 차례입니다. 이용횟수에 가장 직접적으로 영향을 주는 날씨요소는 “기온”과 “강수량”입니다. 앞으로 “날씨”라는 개념은 “기온”과 “강수량” 두 가지 요소를 가리키는 것으로 정의하겠습니다. 기온과 강수량 각각에 대해서 이용횟수와의 관계를 알아봅시다.

(1) 일 평균 기온 — 이용 횟수

위 그림은 한 권역에 대해서 한 해 동안의 기온과 이용횟수의 흐름을 시각화한 것입니다. 우리의 이 자료에 대한 해석은 아래와 같이 정리할 수 있습니다.

  1. 1년 동안의 전체적인 흐름을 보면 이용 횟수의 큰 흐름이 1 년 동안의 기온의 흐름을 적절히 반영하는 것을 볼 수 있습니다.
  2. 다만, 6월~10월 중에는 기온의 흐름과 달리 이용횟수가 급감하는 부분이 존재하고, 기온이 8월 중에는 특히 이용횟수가 전반적으로 낮은 것을 볼 수 있습니다. 이런 부분은 아래에서 다룰 강수의 영향으로 설명할 수 있습니다. 비가 많이 내린 날에는 이용횟수가 매우 낮아지는 것을 확인하였습니다.
  3. 7~8월 중에는 우천이 아닌 날에도 이용횟수가 전반적으로 낮아지는 것을 볼 수 있는데, 이는 장마철의 흐린 날씨의 영향도 있고, 폭염에 의해 수요가 깎이는 양상이 존재하는 것을 확인하였습니다.

위와 같이 우리가 파악한 기온과 이용횟수의 관계를 한 마디로 설명하면, “비가 오지 않는 날에 대해서 이용횟수는 기온과 비례하는 양상을 보이며, 지나치게 높은 기온의 경우 이용횟수가 소폭 하락한다.”라고 정리할 수 있습니다.

한 가지 유의할 것은 이렇게 기온과 이용횟수가 같은 흐름을 가진다는 가정은 1년 동안 운영 기기 대수나 시장 상황이 크게 다르지 않아야만 가능하다는 것입니다. 따라서 날씨 — 이용횟수의 관계를 설명할 때에는 이렇게 날씨 외의 변수가 크게 존재하지 않는 일부 권역들만 활용해야 한다는 점을 기억해야 합니다.

(2) 일 누적 강수량 — 이용 횟수

일 누적 강수량 지표는 위에서 기온이 설명하지 못한 일별 이용횟수의 급감을 설명해 줍니다. 그래프 하단의 파란색 바 그래프는 일 누적 강수량을 가리킵니다. 우리의 이 자료에 대한 해석은 아래와 같이 정리할 수 있습니다.

  1. 강수량이 높은 날에는 이용횟수가 전 날의 이용횟수의 흐름에 관계 없이 급감하는 것을 알 수 있습니다.
  2. 우천에 따른 이용횟수의 감소분은 강수량에 비례해 보이지 않으며, 정확한 감소분을 일반화하기 어려워 보입니다.
  3. 강수량이 0보다 크지만 매우 적은 경우에는 이용횟수에 큰 영향을 주지 않습니다.
  4. 우천 이후 다음 날에 비가 그친 경우 본래 이용횟수 흐름을 다시 찾아오는 것도 볼 수 있습니다.

위와 같이 우리가 파악한 강수량과 이용횟수의 관계를 한 마디로 설명하면, “강수량이 높은 날에 대해서 이용횟수는 이전 흐름과 관계없이 유의미하게 급감하고, 우천이 멈추면 다시 제 흐름을 찾는다.”라고 정리할 수 있습니다.

강수량에 대해서도 한 가지 유의할 점은 관측값과 실제값의 차이가 존재할 수 있다는 것입니다. 우리는 현재 한 권역의 날씨 정보에 대해서 가까운 기상 관측소의 관측값을 사용합니다. 기온의 경우 실제 권역의 기온과 관측소의 기온이 크게 다르지 않을 것입니다. 하지만 강수량의 경우에는 관측소에는 비가 왔는데, 실제 권역에는 비가 오지 않거나, 관측소에는 비가 오지 않았는데 실제 권역에는 비가 오는 경우가 발생합니다. 이렇게 관측된 강수량이 실제값과 다를 수 있음에 유의해야 합니다.

2–3. 우천 보간 이용횟수 도출

위에서 보았듯이 비가 내린 경우 일별 이용횟수는 전날과 관계없이 이용횟수가 급감하고, 이후 비가오지 않은 날에 다시 원래 추이로 회복하는 것을 볼 수 있습니다. 이러한 우천의 영향은 그날에 대해서만 별개로 보정하는 방식으로 채우면 기온과 이용횟수의 관계만을 파악할 수 있습니다.

이 우천에 대한 보정은 선형 보간(linear interpolation)의 방식으로 진행됩니다. 보간이란 통계 분야에서 결측된 자료를 메우는 방법입니다. 선형 보간은 결측 데이터의 앞과 뒤의 자료를 바탕으로 선형의 형태로 값을 채우는 보간법 중 하나입니다. 우천일에 대해서 이용횟수가 현재 결측 상태는 아니므로, 이 날의 이용횟수의 데이터를 비운 다음, 선형 보간을 진행합니다.

선형보간법에 대한 간단한 설명 자료. y_n이 결측일 때 앞, 뒤 자료를 이용해 결측값을 채우는 과정

앞으로 이 우천일에 대해서 선형 보간 작업이 진행된 이후의 이용횟수를 “우천 보간 이용횟수”라 부르겠습니다. 위 예시 자료에 대해서 보간 작업 전후의 자료를 비교해 봅시다.

위 그래프는 raw한 이용 횟수 자료(빨간색)와 우천 보간 작업이 이루어진 이용횟수(파란색)를 겹쳐 그린 결과입니다. 1년 동안 비가 와 이용횟수가 급감한 부분에 대해서 보간이 이루어져 이용횟수의 흐름이 보다 안정적으로 변동한 것을 확인할 수 있습니다. 이렇게 날씨 2 요소(기온, 강수량) 중 강수량의 요소를 1차적으로 대응한 다음, 다음 단계에서 기온과 이용횟수의 관계를 파악할 것입니다.

2–4. 기온 — 우천 보간 이용횟수의 관계 파악

위 단계에서 보간 작업을 통해 우천의 영향을 제거한 이용횟수를 도출하였으니, 이제 기온과 이용횟수의 관계를 보다 정확히 파악할 수 있습니다.

위 검은색 산점도는 앞 단계와 동일한 데이터로 평균 기온 — 우천 보간 이용횟수의 산점도를 그린 결과입니다. 기온과 우천 보간 이용횟수간의 선형적 관계가 제법 뚜렷하게 나타나는 것을 확인할 수 있습니다. 따라서 이 관계를 선형 회귀식으로 표현할 수 있고 그것 또한 제법 설명력이 있겠지만, 우리는 일 평균 기온 25도 이상의 구간에 집중하였습니다. 그래프 개형에서 볼 수 있듯이 오른쪽 끝 구간에서 이용횟수의 흐름이 살짝 감소하는 부분을 확인할 수 있습니다. 이러한 경향은 이 권역 외에도 일반적으로 나타나며, 지나치게 더운 날의 경우 수요가 도리어 감소하는 영향이 존재한다고 해석할 수 있습니다. 이는 수요의 측면에서도 충분히 설명할 수 있습니다. 따듯할 수록 수요가 높은 것은 사실이지만, 예를 들어 평균 기온이 35도인 폭염이 발생한다면 수요도 그만큼 오르진 않을 겁니다. ‘따듯한 것’과 ‘더운 것’은 분명히 차이가 존재하고, 그 기준선이 평균 기온 25도 정도라 볼 수 있겠습니다. 이와 같은 대문자 감마(Γ)와 같은 형태의 기온과 이용횟수를 표현한 곡선을 “기온 곡선”이라 부르겠습니다.

우리는 기온 곡선을 표현하기 위해서 다항 회귀(Polynomial Regression) 모델을 사용하였습니다. 다항 회귀 모델은 설명변수의 다항함수 포물선과 같은 형태를 설명하는 데에 적합한 회귀 분석 방법론입니다. 위 그림에서 빨간색 형태의 곡선은 검은색 산점도의 개형을 설명한 다항 회귀 곡선입니다. 우측 끝부분에서 감소하는 부분을 잘 설명한 것을 확인할 수 있습니다.

2–5. 기온 곡선의 일반화

앞선 단계에서 우리는 기온과 우천 보간 이용횟수의 관계를 다항 회귀를 통해 명확히 설명할 수 있는 것을 확인하였습니다. 하지만, 이전까지의 과정은 모두 한 개의 예시 권역의 자료를 바탕으로 한 것입니다. 이 날씨와 이용횟수의 관계를 일반화하여 설명하려면, 하나의 권역이 아닌 여러 권역에서의 데이터를 가져와 일반화해야 합니다. 하지만 이 일반화 과정에서 “권역별 규모 차이”가 고려되어야 합니다.

위 그림은 세 개의 예시 권역에 대하여 기온과 우천 보간 이용횟수를 한 군데에 시각화한 결과입니다. 각 권역별로 비슷한 형태의 기온 곡선을 띄고 있는 것을 확인할 수 있습니다. 하지만 세 곡선은 서로 다른 위치에서 나타나고 있으며, 이는 운영 규모 차이에 따라 이용횟수의 구간이 제각기 다르기 때문입니다. 따라서 우리는 이 기온 곡선의 일반화를 위해서는 규모의 차이를 반영하는 스케일링 작업을 진행해야 합니다.

운영 규모 차이를 대응하는 데에는 이용횟수에 권역별 면적이나 운영 기기 대수와 같은 값을 나눠주는 방법들이 주로 사용되지만, 이러한 방식들은 권역별 대당 성과가 영향을 미쳐, 성과가 좋은 지역과 안좋은 지역의 자료가 분리되게 됩니다. 권역별 성과와 관계없이 기온에 따른 이용횟수의 높고 낮음의 관계를 파악하는 것이 목적이기 때문에 자료의 분포만을 갖고 수리적인 스케일링을 하는 작업이 필요합니다.

스케일링 작업에는 Standard Scaling, MinMax Scaling 등이 주로 사용되는데, 우리는 Robust Scaling을 채택하였습니다. Robust Scaler는 자료의 Quantile 값을 사용하는 것이 특징으로, 이름에 걸맞게 다른 스케일링 방법론들보다 자료의 outlier에 대하여 강건(robust)한 특징을 갖고 있습니다. 그리고 Robust Scaling의 결과는 -1.5에서 1.5 정도의 범위의 값으로 나타납니다. (outlier의 경우 범위 바깥에 존재) 이는 이후 보정 과정에서 활용되니 기억해 두어야 합니다. Robust Scaler를 차용한 이유는 일레클 이용 횟수 자료의 경우 다양한 비규칙적인 이유로 outlier가 가끔 존재하여, 이에 의한 영향을 최소화해야 하기 때문입니다.

Robust Scaler의 공식 median(Q2)과 Q3, Q1을 활용한다.

위 세 개 권역에 대한 기온 곡선을 스케일링하여 나타낸 결과는 아래와 같습니다.

왼쪽의 스케일링을 하지 않은 자료가 Robust Scaling 과정을 거치면 오른쪽 그림과 같이 -1.5에서 1.5의 범위 내에서 매우 유사한 형태의 자료로 합치하게 되는 것을 확인할 수 있습니다. 우리에게 필요했던 “기온 곡선의 일반화”과정이 아주 적절하게 수행되었습니다. 우리는 기온과 이용횟수 관계를 대표할 수 있는 10개 이내의 권역을 선별하여, 그 권역들의 데이터로 일반화된 기온 곡선을 아래와 같이 도출할 수 있었습니다.

여러 권역의 데이터를 스케일링하여 합친 다음 생성한 다항회귀모델

2–6. 날씨 — 이용횟수의 boomerang curve

위에서 1년 간의 기온과 이용횟수의 관계를 일반화할 수 있었습니다. 하지만 그림에서 볼 수 있듯 하나의 곡선으로 fitting하기에는 잔차가 커, 일반화를 했을 때 발생하는 bias가 우려되었습니다.

이러한 현상에 대한 원인을 파악하고 대안을 고민하면서, 우리는 **“같은 기온이어도 다른 계절일 때 수요가 다르다.”**라는 경험적 인사이트를 단서로 찾을 수 있었습니다. 이는 봄과 가을에 기온이 비슷하지만 가을철에 성과가 더 좋다는 경험적 추론을 가리킵니다. 이는 봄철은 겨울철 비수기에 이탈하였던 유저들이 점차 복귀하거나 신규 유저가 확보되는 기간인 반면, 가을철은 봄~여름을 지나 유저 확보가 많이 되어있고, 유저들의 이용이 습관화되어있는 기간이기 때문에 보다 봄철보다 더 많은 이용횟수를 기대할 수 있는 것이라 할 수 있습니다. 이러한 인사이트는 유저 관련 지표들로도 뒷받침될 수 있었습니다. 그리고 이러한 패턴은 실제 데이터로도 확인해 볼 수 있습니다.

위는 1년 동안의 기온과 스케일된 보간 이용횟수를 시간 순으로 누적하여 그린 애니메이션으로, 봄철에 낮은 기울기로 이용 횟수가 올라가다가, 9월을 정점으로 10월부터 더 높은 곳에서 이용횟수가 가파르게 감소하기 시작하는 것을 볼 수 있습니다. 우리는 이러한 기온 곡선이 움직이는 패턴을 부메랑 형태와 닮았다 하여 “boomerang curve”라 부르겠습니다.

우리는 보다 정확한 날씨와 이용횟수의 관계를 파악하고 보다 정확한 기온 보정을 하기 위해 이러한 기온만으로 설명할 수 없는 계절적 패턴을 기온 곡선에 녹일 방법을 찾고자 했습니다.

2–7. 데이터 분할 이후 다항 회귀 모델 fitting

위 단계에서 발견해낸 boomerang curve를 회귀 곡선으로 fitting해야 합니다. 그런데 부메랑 형태의 곡선은 하나의 x값에 2개의 y값이 놓이기 때문에 이와 같은 곡선을 하나의 함수로 표현할 수는 없습니다. 하지만, 이 곡선은 (1) 올라가는 구간 (= 봄~여름)과 (2) 내려가는 구간(= 여름~가을)으로 분리할 수 있고, 그러면 두 개의 곡선이 겹쳐진 형태로 표현할 수 있습니다. 따라서 데이터를 올라가는 구간과 내려가는 구간을 분할하고, 각각에 대해서 다항회귀 모델을 fitting하는 방법을 채택하였습니다.

위 그림과 같이 기존의 기온곡선은 파란색 산점도와 주황색 산점도로 기간으로 분할될 수 있고, 각각에 대하여 다항 회귀 곡선을 fitting하기 적절해졌습니다. 두 곡선의 개별 fitting 과정에 유의하였던 것은 정의역의 양 끝 구간인 t ≒ -10, t ≒ 30 구간에서 두 함수의 함수값이 비슷하여 만나는 것이었습니다. 현재 fitting 결과는 이러한 요구를 적절히 반영하였다 판단하였습니다. 특정 지점에서 두 다항 회귀 곡선이 만나도록 강제하는 방법론을 고민할 수도 있겠습니다. 이렇게 두 개의 곡선으로 나누어 정의한 새로운 기온 곡선은 아래와 같은 수식으로 정리해볼 수 있습니다.

3. 기온 보정 방법론 개발

3–1. 보정의 목적과 컨셉 정리

1) 이용횟수의 기온 영향 제거

: 우리가 원하는 보정은 기온에 따른 영향을 받는 이용횟수의 흐름을 기온의 영향을 받지 않은 이용횟수의 흐름으로 바꾸는 것입니다. 이 때, 날씨의 영향을 반영하지 못해도 안되고, 날씨의 영향외의 영향도 제거해서는 안됩니다.

2) 고점을 기준으로 이용횟수 보정

: 보정 결과 값을 전체 이용횟수의 평균치 등으로 평탄화하는 것보다 성수기를 기준으로 고점을 기준으로 평탄화는 것이 보다 더 직관적으로 이해하기 좋다 판단하였습니다. 보정결과는 기온의 영향을 받지 않았을 때 그 권역의 이용횟수의 고점을 기준으로 도출하고자 합니다.

그림으로 표현하면 아래와 같습니다.

일별 기온 흐름이 왼쪽 그림과 같다면, 이 패턴을 따르는 검은 색의 raw 이용 횟수는 기온 영향을 제거하면 파란 색의 직선 형태로 데이터로 된다는 것입니다. 이를 달성하기 위해서는 이용 횟수의 흐름에서 “기온의 영향”만을 잘 분리해서 제거하는 작업이 필요할 것입니다.

Q. 시계열 분해(Time Series Decomposition) 모델로 trend를 제거하면 되지 않나요?

실제로 저도 많이 헷갈려했던 부분입니다. 아래 그림과 같이 일별 이용횟수 자료에 시계열 분해 모델을 적용하면 (1) trend(추세) (2) seasonality(계절성) (3) residual(잔차)의 세 요소로 자료를 분할 할 수 있습니다. 여기에서 관측값에서 trend 값을 빼서 시계열 자료의 거시적인 흐름을 제거할 수 있습니다. 이 과정을 detrend 과정이라고 부릅니다.

시계열 분해 모델 중 additive model의 decomposition 결과 예시 (출처: https://towardsdatascience.com/time-series-decomposition-8f39432f78f9)

하지만 이러한 시계열 분해의 detrend 과정을 거친 일별 이용횟수 자료는 데이터의 시계열적인 흐름을 제거한 것이지, 기온의 영향을 제거한 것이 아닙니다.

예를 들어 기기 대수가 2배로 늘어난 지역에 대해서는 이용횟수가 날씨의 영향도 받고, 기기 대수 증가에 따른 영향도 받게 될 것입니다. 시계열 분해 모델로 detrend를 하게 되면, 날씨 영향은 물론, 기기 대수에 의한 이용횟수 영향에 대해서도 제거가 됩니다. 우리는 날씨 — 이용횟수의 영향만을 제거한 값을 원하므로 이 방식은 적절하지 않습니다.

그러면 일 년 동안 기온의 흐름에 따라 발생하는 포물선을 seasonality라 판단하고 seasonality를 제거하는 방법은 어떨까요? 그것도 적절하지 않습니다. 연 단위 이용횟수 흐름의 파동을 seasonality로서 잡아내기 위해서는 자료가 최소 2~3 년 정도의 분량이 있어서 그 반복을 파악할 수 있어야 하는데, 우리가 운영하는 지역들은 대부분 1~2 년 정도의 운영 기간을 갖고 있어 파악하기 어렵고, 신규 운영 지역에 대해서는 이를 잡는 것이 불가능한 문제가 있습니다. 따라서 기존의 시계열 분해 모델의 이론을 사용하지 않고 위에서 소개한 컨셉을 바탕으로 우리 나름의 방식으로 보정 방식을 구현해야 합니다.

3–2. 회귀 분석의 오차(ε: epsilon)를 활용한 보정(detrend)

우리는 기온이라는 영향을 회귀 모델이라는 형태로 설명할 수 있고, 이 관계의 영향이 반영되지 않은 이용횟수의 흐름을 알고 싶어합니다. 따라서 우리는 이 회귀 분석의 이론을 활용해 영향을 제거해 보았습니다.

선형 회귀 모델의 기본 공식. 오차(error)를 ε(epsilon)으로 표현한다.

위의 선형 회귀 분석의 공식에서 ε(epsilon)은 오차항을 의미하고 이는 회귀 분석이 예측하는 y값 (y_hat)과 실제 y값의 차이를 의미합니다. 전통적인 회귀 분석 이론에서 이 오차항은 평균이 0인 정규분포를 따르는 것을 가정하고 있습니다.

이 오차항이 0보다 크다는 것은 예측되는 관계에 비해 실제 값이 조금 더 높게 나타나는 것이고, 0보다 작다는 것은 예측되는 관계에 비해 실제 값이 조금 더 낮게 나타나는 것입니다. 이 오차항은 다르게 해석하면 회귀 모델이 설명하는 관계의 영향을 제거하고 남은 데이터의 흐름이라고 볼 수 있습니다. 우리는 이 오차항을 통해 기온 — 이용횟수의 관계를 덜어낸 이용횟수를 도출할 것입니다.

이는 아래 예시 함수를 보면 더 쉽게 이해할 수 있습니다.

왼쪽 그래프는 0부터 4pi까지의 범위에서의 사인 함수에 평균이 0인 정규 분포를 따르는 난수를 추가한 함수의 그래프입니다. 사인 함수의 개형을 따르면서 데이터가 진동하고 있음을 알 수 있습니다. 여기에서 위아래로 출렁이는 사인 함수의 흐름이 날씨의 흐름이라 가정한다면, 우리는 기존 식에서 사인 함수만 제거해볼 수 있습니다. 오른쪽 그래프는 왼쪽 함수에서 사인 함수를 제거한 것으로, 사인 함수의 출렁이는 패턴이 제거된 것 함수입니다. 우리는 이와 같은 방식으로 날씨의 요소만을 제거한 데이터의 흐름을 파악할 수 있습니다.

이 이론을 바탕으로, y와 y_pred(y_hat)의 차이를 구하여 잔차(residual = epsilon)을 도출합니다. 그리고 3–1에서 이야기한 것처럼 고점을 기준으로 평탄화를 하는 것이 목적이기 때문에 epsilon 값에 +1을 해줍니다. 현재 데이터가 -1에서 1의 범위로 만들어주는 Robust Scaler에 의해 스케일된 값이기 때문에 평균이 0에 가까운 epsilon에 +1 을 더했을 때, Robust Scaler 기준으로 최댓값에 가까운 값으로 변환하게 됩니다.

마지막으로 권역별 스케일러를 통해 inverse scaling 과정으로 스케일되었던 -1~1의 값을 다시 원래 데이터의 형태로 변환시켜서, 실제 권역별 이용횟수와 비슷한 규모의 숫자를 반환해줍니다. 이렇게 다소 복잡한 보정 알고리즘이 마무리됩니다. 전체 과정을 수식으로 표현하면 아래와 같습니다.

4. 기온 보정 모델의 결과 해석과 활용

4–1. 기온 보정 모델의 해석

이제 기온 보정이 완료된 권역별 이용횟수 값을 한번 확인해 봅시다. 앞서 예시로 든 권역에 대해서 기온 보정의 결과는 아래와 같습니다.

예시 권역은 날씨 외에 큰 변수가 일년 동안 없었기 때문에 일년 동안의 날씨 보정 결과가 일정한 편인 것을 확인할 수 있습니다. 이러한 결과는 3–1) 에서 생각했던 컨셉을 그대로 반영하는 것을 알 수 있습니다. 추가로 두 개의 보정 결과를 확인해봅시다.

위 권역 케이스에서는 특정 outlier에 대해서도 보정 결과가 잘 반응하는지를 확인해볼 수 있습니다. 이 권역에는 22년 7월 경에 이용횟수가 폭발적으로 뛴 하루가 있었습니다. 이는 지역 행사가 있어서 이용량이 비정상적으로 높았던 케이스로, 이는 날씨의 흐름과 관계없는 외생 변수가 영향을 준 경우라 할 수 있습니다. 이러한 이용횟수 자료에 대해서도 기온 보정이 적절히 이루어져 1년간 가장 높은 결과값으로 보정한 것을 확인할 수 있습니다.

이 케이스에서는 위 두 경우와 다르게 1년 동안의 보정 결과가 평탄하지 않고 상반기에는 점차 감소하다가 하반기에는 증가하는 추세를 확인할 수 있습니다. 이는 날씨 이외에 권역에 외생변수가 있었음을 암시합니다. 실제로 이 권역에서는 상반기에 경쟁서비스가 생겨나면서 시장 상황이 바뀌었었습니다. 그리고 하반기가 시작될 무렵에 기기 대수를 늘렸고, 그에 따라 이용횟수도 늘어났던 이력이 있습니다. 날씨 보정 이용횟수는 이러한 외적인 상황에 따른 이용횟수의 변화를 잘 캐치하고 있는 것을 확인할 수 있습니다.

4–2. 기온 보정 모델의 활용

기온 보정 모델은 다음과 같은 상황에서 사용될 수 있습니다.

1) 권역별 성과 분석과 시장 상황 분석

날씨 보정 모델은 중장기 스코프에서의 권역별 성과 분석을 하는 데에 있어 유용하게 사용될 수 있습니다. 계절의 변화가 포함된 월단위의 분석을 할 때에, 날씨 변화에 따른 이용횟수 변화가 있을 경우 권역별 성과가 긍정적인지, 부정적인지를 판단하기 어려울 수 있습니다. 이 떄 날씨 보정 이용횟수는 이러한 분석과 판단을 더욱 용이하게 할 수 있습니다.

2) 밀도 최적화 모델에서의 활용

앞선 포스트에서 다룬 밀도 최적화 모델에서 권역에 배치한 기기대수와 이용횟수의 관계를 파악하는 데에 있어 활용할 수 있습니다. 날것의 이용횟수를 사용하면 날씨의 영향이 존재하고, 날씨를 고려하지 않아도 되는 단기간의 자료를 사용하면 자료가 부족해지는 문제가 존재하는데, 날씨 보정 이용횟수는 이러한 딜레마를 해결해 줄 수 있습니다.

5. 마무리

5–1. 한계 및 보완점

1) 우천의 시간대 고려

일단위의 누적 강수량 자료는 어느 시간대에 우천이 발생했느냐에 따라 이용횟수에 영향을 주는 정도가 다릅니다. 예를 들어 새벽 4시에 발생한 30mm의 우천보다, 오후 6시에 발생한 우천이 일 이용횟수에 영향을 더 크게 줄 것입니다. 이러한 우천에 대한 시간대가 고려될 수 있을 것입니다.

2) 요일 및 휴일 고려

일 이용횟수에 가장 큰 영향을 미치는 것은 날씨이겠지만, 요일 및 휴일에 따른 이용횟수 영향도 존재합니다. 기온 보정 방법론 자체에서는 이것을 고려하지 않는 것이 맞지만, 기온 곡선을 fitting하는 등의 과정에서 이러한 요소를 고려할 수 있을 것입니다.

3) 단기간 보정 데이터 활용 어려움

현재 만들어진 기온 보정 모델은 1년 동안의 일부 권역들의 데이터를 통해 만든 기온곡선을 바탕으로 만들어져있어, 연단위의 장기간 데이터에 대해서는 기온 보정이 되지만, 일 단위, 주 단위의 단기간의 보정에 대해서는 보다 정확하지 않을 수 있습니다.

5–2. 소감

날씨에 대한 분석은 데이터 분석팀 초기부터 존재하던 과제였습니다. 비가 오면 매출이 줄고, 추워지면 매출이 줄어든다는 것은 모두가 알고 있는 공공연한 사실이지만, 이 관계를 숫자로 정확히 설명하고 이 영향을 대응하는 방법을 찾는 것은 데이터분석팀만이 할 수 있고, 해야만 하는 과제였습니다. 날씨 — 이용횟수의 관계를 일반화하고 보정 방식을 고안하는 데까지에는 매우 오랜 시간이 들었고, 초기에 고안한 것과 현재의 것은 천차만별로 많은 시행 착오와 러프한 아이디어들이 많았었습니다. 하지만 현 시점 고안된 모델이 실제로도 쓰일 수 있는 형태가 되었다 느껴서 이렇게 정리 문서를 작성하고 포스트로 공유하게 되었습니다.

하지만, 이 포스트를 작성하고 데이터를 준비하면서도, 아직도 보정 방식과 결과에 있어 아쉬운 부분을 많이 찾을 수 있었습니다. 현재의 결과물이 만들어지기까지 수많은 시행착오 발견과 아이디어들이 있었던 것처럼, 앞으로도 이 방법론이 발전해나갈 여지가 많다 느꼈습니다. 기온 보정 방법론에 새로운 개선과 발전이 있으면 다시 찾아오겠습니다.

--

--