데이터 분석을 하면서 이런 생각이나 궁금증을 가져본 적이 있으실 것 같아요. “지표가 의미 있게 좋아졌는데 이게 정말 이번 제품 개선의 효과라고 볼 수 있을까?”, “분명 기대가 큰 프로젝트였는데 왜 지표 변화는 없다고 나올까?”, “이번에 배포하면서 광고도 같이 집행했는데 성과 분석을 어떻게 하면 좋을까?”
데이터 분석가의 고민
사전에 A/B Test를 통해 제품 개선이나 다른 변경사항에 대한 효과를 확인해보는 것이 가장 좋겠지만, 회사마다 또는 여러 가지 상황에 따라 그렇지 못한 경우도 많습니다. 결국 변화에 대한 효과를 사후에 측정할 수밖에 없는 경우가 발생하는데, 이때 변경 전과 후에 달라지는 부분이 반드시 ‘내가 관심 있는 그것’ 한 가지뿐인 경우는 사실 드뭅니다. 그렇기 때문에 여러 가지 어려움이 생기기도 하는데요, 내가 측정하고자 하는 성과 지표가 다른 변화의 영향을 받을 수도 있고, 내가 미처 인지 못했던, 예를 들어 마케팅팀의 광고의 영향을 받을 수도 있습니다. 아니면, 큰 변화 없이도 해당 지표가 상승하는 추세였기 때문에 지표가 좋아진 것일 수도 있습니다. 그래서 "내 관심사가 아닌, 다른 ‘개입들’의 효과를 최대한 배제하고, 우리 서비스의 성장 추세까지 고려해서 좀 더 정확하게 효과 측정을 할 수는 없을까?" 이런 고민들을 데이터 분석가들을 할 수밖에 없습니다.
Causal Impact 는 무엇인가?
2015년 구글에서 이런 고민을 어느 정도 해소해 줄 수 있는 방법론을 하나 발표합니다. ‘Inferring causal impact using Bayesian structural time-series models(베이지안 구조적 시계열 모형을 사용한 인과적 효과 유추)’라는 걸 발표했어요. 이건 시계열 자료가 있을 때, 어떤 개입의 효과를 판단하기 위한 방법론인데요, 원리는 간단합니다. 실제로 관측된 결과와 개입이 없었을 때를 가정했을 때의 예측값의 차이를 그 ‘개입의 효과(causal impact)’라고 본 것입니다. 여기서 예측값을 산출할 때 ‘베이지안 구조적 시계열 모형’이라는 걸 사용한 것이고요. 이걸 다시 한 번 정리해 보면 이렇습니다.
그림을 보시면, 실선이 어떤 지표의 실제값이고, 점선이 어떤 개입 이후로부터의 그 지표의 예측값입니다. 그리고 그 둘의 차이를 개입의 효과라고 보는 겁니다. 여기서 이 예측값을 산출하는 모델링 과정에서 2가지 종류의 변수가 사용되는데요, 하나가 우리가 측정하는 실제 지표고, 다른 하나가 공변량이라고 부르는, 예측할 때 참고를 하는 변수입니다.
여기서 ‘공변량’이라는 것이 필요한 이유는 예측값을 산출하는 모델이 베이지안 모형을 따르기 때문이에요. 이 모델은 추세나 계절성뿐만 아니라 다른 시계열 데이터와의 관계까지 고려해서 값을 예측합니다. 그래서 참고할 만한 다른 시계열 데이터인 공변량 변수가 필요합니다.
이때 중요한 건 여기 이 공변량으로 넣는 변수가 우리가 효과를 확인하고자 하는 개입(ex. 제품 개선 배포)과는 관련이 없어야 합니다. 왜냐하면 우리는 ‘개입이 없는’ 상태에서의 지표 변화를 예측하는 것이니까요. 그래서 causal impact가 잘 작동하려면 실제 지표를 잘 예측하는 공변량을 미리 잘 찾아두거나 만들어두는 것이 중요합니다.
실제로 어떻게 사용하나?
Python을 주로 사용하시면 pycausalimpact 라이브러리 설치를 통해 쉽게 사용 가능합니다. 구현하는 코드도 매우 간단해서 첨부해드리는 링크만 참고하셔도 충분합니다.
Python : pycausalimpact 라이브러리 바로가기
모델링 작업 이후 causal impact 결과를 위의 그림처럼 그려볼 수 있습니다. 첫 번째 그림을 보시면 실선이 실제값, 점선이 예측값입니다. 그리고 두 번째 그림이 causal impact를 시계열로 표현한 부분입니다. 실제값에서 예측값을 뺀 값을 표현한 것이지요. 그리고 세 번째 그림은 causal impact 값을 시간 흐름에 따라 '누적해서' 더한 결과를 보여줍니다.
결과를 요약해서 볼 수도 있습니다. 요약 결과의 제일 윗부분을 보시면, 실제값과 예측값에 대한 정보가 왼편에는 일평균, 그리고 오른편에 누적으로 정리되어 있습니다. 예시 결과에서는 어떤 개입 이후 실제값이 0.06, 예측값은 0.05로 나타나고, 실제값이 예측값보다 0.01 더 높다고 나옵니다.
그다음은 이제 이 차이가 의미가 있는지 확인할 수 있는 부분입니다. 두 번째 영역은 실제값과 예측값의 차이, 즉 causal impact를 나타냅니다. '[-0.01 에서 0.02]' 라고 되어 있는 부분이 95% 신뢰구간입니다. 그런데 이 구간이 ‘0’을 포함하고 있고, 좀 더 아랫부분을 보시면 p- value가 0.29로 나타납니다. 그래서 결과를 해석해 보면, “실제값과 예측값 둘 사이에 차이가 없다는 귀무가설을 반박할 만한 증거가 71% 정도밖에 안 된다는 의미니까, 우리가 통상 합의하는 수준인 95%에는 미달하기 때문에 우리가 보고자 하는 이 ‘개입’의 효과가 우연의 의한 것임을 배제하기는 어렵다” 정도로 정리해 볼 수 있겠습니다.
언제, 어떻게 활용하면 좋을까?
최근에 causal impact 방법론을 적용하여 제품 개선 효과를 측정해봤는데요, 이것을 사용하면서 좋았던 점은 ‘추세’가 반영된 성과 분석을 하기 쉬웠던 점, 또 공변량을 잘 설정해서 ‘또 다른 개입’의 영향을 줄여볼 수 있었던 점을 들 수 있을 것 같습니다. 그리고 무엇보다도 시간 흐름에 따른 지표 변화를 예전보다 좀 더 자세히 살펴보게 되면서 ‘이상값’이나 ‘다른 중요 요인’에 대한 발견을 하기 쉬웠던 점을 들 수 있을 것 같습니다.
물론 어려웠던 점도 있었는데요, 그건 공변량을 정하는 부분이었습니다. 측정하고자 하는 실제 지표를 잘 설명하는, 안정적인(?) 공변량을 찾기 위해 지표에 영향을 줄 만한 특별한 이슈가 없는 기간을 찾고 그 기간 동안 지표와 공변량이 유사한 패턴으로 움직이는지 찾고자 했는데요, 지표에 영향을 줄 만한 요인 혹은 변화가 없었던 시기를 찾는 것이 쉽지는 않았습니다. 이건 측정 지표에 영향을 주는 요인들이 워낙 다양하기 때문에 발생하는 문제라고 생각됩니다. 그리고 공변량을 정하는 것이 정답이 없는 작업이기 때문에 다양한 변수를 시도해보고, 그림도 많이 그려봐야 해서 보통 성과 분석할 때보다 시간과 노력, 또 고민이 매우 많이 필요했습니다.
그래서 매번 어떤 프로젝트나 프로모션 등의 성과 분석을 할 때마다 이 방법을 사용하는 것이 현실적으로는 쉽지 않을 것으로 생각되었습니다. 다만, 성과 측정 결과가 예상보다 너무 크거나 작게 나올 때 써볼 만할 것 같다는 생각이 들었어요. 그래서 성과가 예상보다 과대한 것으로 나타날 때는 이 방법을 통해 "어떤 부분을 고려했을 때 실제 효과는 이 정도다"라고 보정을 해볼 수도 있을 것으로 생각되고요, 성과가 예상과 다르게 작거나 없는 것으로 나왔을 때는 "이런 상황을 고려했을 때 이 결과는 그래도 선방한 결과다"라고 명확하게 결과를 다시 한번 짚어줄 수도 있을 것 같습니다. 정리를 하자면 기존 분석 방법과 결과에 대한 확신이 부족할 때, 이 방법론을 선택적으로, 기존 분석 결과를 보완하는 용도로 활용해 볼 수 있을 것 같습니다.
아래는 제가 causal impact 방법론에 대해 알아보면서 참고했던 내용들입니다. 오늘 글이 길었는데요, 읽어주셔서 감사합니다 😄
Inferring the effect of an event using CausalImpact by Kay Brodersen (presentation)
causalImpact는 어떻게 이벤트 효과를 추정할까?
'데이터 분석 > Analytics' 카테고리의 다른 글
[행동데이터분석] 인과관계 다이어그램 (1) | 2023.12.21 |
---|---|
[행동데이터분석] 행동 데이터를 이해하는 방법 (0) | 2023.12.20 |
[행동데이터분석] 인과-행동 프레임 워크 (1) | 2023.12.19 |
[Python] list 형태의 string 값을 list로 변환하기 (0) | 2022.02.08 |
이력서/자기소개서 작성팁, 데이터 분석 결과로 짚어보기 (0) | 2022.01.02 |
댓글