grep

Engineering

뱅크샐러드의 실험플랫폼 분석 인프라 살펴보기

뱅크샐러드

2021년 2월 10일

원문에서 보기 ↗

안녕하세요. 실험플랫폼 팀 Data Scientist 이수형입니다.

뱅크샐러드는 실험을 통해 제품을 개선하는 노력이 실제로 사용자에게 더 좋은 경험으로 이어지는지 매일매일 데이터를 통해 검증해나가고 있습니다. 여기서 말하는 실험(A/B Test, Online Controlled Experiment)이란 사용자가 마주하는 변화를 정량적인 데이터로 측정하는 과정입니다. 내부적으로 실험을 원활하게 진행하기 위해, 2020년 초에 실험플랫폼 팀이 만들어졌습니다.

실험플랫폼 팀은 크게 두 가지 역할을 합니다. 첫 번째는 쉽게 실험을 할 수 있도록 인프라(실험플랫폼 UI, 분석 파이프라인, …)를 구축합니다. 두 번째는 실험을 통해 성과를 검증하는 문화를 만들어갑니다. 지금은 모든 제품 개선을 실험으로 계획하고, UI에서 실험 분석 결과를 확인합니다. 이러한 과정을 통해 제품 개선을 실험 분석 결과로 검증하고 사용자에게 배포할지 Rollback할지 의사결정 합니다. 이러한 모습이 되기까지 1년이라는 시간 동안 실험플랫폼팀 및 많은 구성원의 노력이 필요했습니다. 이 글에서는 실험플랫폼의 여러 노력 중에서 실험 분석 인프라를 구축한 내용에 대해 이야기하려 합니다.

뱅크샐러드의 모든 조직은 제품/기능을 기획할 때 임팩트에 대한 가설을 세우고, 실험을 진행합니다. 사내 백오피스인 실험플랫폼 웹을 통해 실험 결과를 분석하고, 분석 결과를 토대로 해당 제품/기능을 사용자에게 배포할지 Rollback할지 의사결정 합니다. 이러한 모습이 되기까지 실험플랫폼팀은 2가지 노력을 해왔습니다. 첫째, 실험을 통해 성과를 검증하는 문화를 만들었습니다. (이 내용은 진정한 실험 조직의 탄생에서 자세히 볼 수 있습니다) 둘째, 누구나 쉽게 실험을 진행할 수 있도록 인프라(실험플랫폼 UI, 분석 파이프라인, …)를 구축합니다. 이 글에서는 두 번째 노력 중 실험 분석 인프라를 어떻게 구축했는지에 대해 이야기하려 합니다.

실험플랫폼이 실험 문화를 정착시키기 위해 어떤 노력을 했는지 궁금하신 분들은 진정한 실험 조직의 탄생을 참고 바랍니다.

실험플랫폼의 핵심가치

실험플랫폼 팀의 핵심 가치는 “신뢰할 수 있는 데이터를 제공하고 모든 제품 개선들을 실험을 통해 검증할 수 있게 한다” 입니다. 실험 분석 인프라는 팀의 핵심가치를 토대로 설계되었고 발전되어 왔습니다.

분석 인프라 V1: 수동으로 실험 분석하기

수동 분석 Script

Figure 1 | 수동 분석 Script

실험이 진행되면 사용자를 실험의 대조군(Control group)/실험군(Treatment group)에 할당하고, 각 실험 그룹의 반응을 데이터로 수집하고, 수집된 데이터를 통해 실험 결과를 분석하게 됩니다. 실험 분석 인프라는 이러한 실험과정에서 발생하는 데이터를 자동으로 적재하고 분석할 수 있어야 합니다. 다만, 자동화된 분석 인프라가 완성 되기 전에 예정된 실험들의 분석이 가능한 환경을 만드는 것이 더 중요했습니다. 자동화된 분석 인프라가 갖춰질 때까지 기다리는 것은 그 시간 동안 제품을 개선하지 못한다는 의미였기 때문에 회사 입장에서는 큰 손실이었습니다. 반면에 실험 없이 제품 개선을 반영하는 것은 제품 개선이 사용자에게 주는 영향을 정량적으로 측정하지 못한다는 의미였기 때문에 이 또한 저희가 원하는 방향이 아니었습니다. 개선들을 예정대로 적용하고 정량적으로 측정하기 위해서는 꼭 필요한 기능들만이 포함된 첫 번째 분석 인프라를 만들어야 했습니다.

많은 제품 개선이 예정되어 있었기에 빠르게 분석 인프라를 개발하는 방향으로 계획해나갔습니다. 그리고 팀 내의 개발자 누구나 쉽게 실험 결과를 분석할 수 있는 방법을 고민하였습니다. 이러한 실험 분석 인프라는 자동화를 위한 초석이 되어야 했습니다. 그래서 빠르게 개발할 수 있고 쉽게 동작시킬 수 있도록 하나의 Script로 계획했습니다. 개발 언어는 추후 자동화 분석 인프라가 Python(Pyspark)기반으로 개발 될 예정이였기 때문에 Python을 사용했습니다. 그렇게 Python Notebook으로 된 첫 번째 분석 인프라를 개발했습니다.

첫 번째 분석 인프라를 통해 사용자의 반응을 데이터로 파악했고 그 결과를 제품에 반영해나가는 팀이 늘어갔습니다. 어느새 모든 제품 개선이 실험을 통해 의사결정 되었습니다. 하지만 시간이 지날수록 첫 번째 분석 인프라에 대한 불편의 목소리는 커졌습니다.

첫 번째 실험 분석 인프라를 만들 때는 실험의 개수도 작아 관리가 수월했기 때문에 수동으로도 충분히 분석할 수 있었습니다. 하지만 점점 많아지는 실험들을 관리하고 정확한 분석 결과를 제공하기에는 무리가 있었습니다.

분석 인프라 V2: 자동으로 실험 분석하기

자동 실험 분석 파이프라인 구조

Figure 2 | 자동 실험 분석 파이프라인 구조

첫 번째 분석 인프라가 가진 문제를 해결하기 위해서는 실험 분석 파이프라인을 개발해야 했습니다. 실험 분석 파이프라인이란, 자동으로 실험의 결과와 관련된 데이터를 수집하여 실험 분석 결과를 계산하고 적재하는 환경을 의미합니다. 파이프라인은 실험의 지표(Metric)를 관리하는 Metric Configuration, 실험 분석 결과 계산에 필요한 데이터를 가공하는 Data Preparation, 실험 분석 결과를 계산하는 Metric Calculation 세 부분으로 나누어 구성했습니다.

Metric Configuration

metric_name: 사용자 당 탭 방문수
event_query: ...
aggregation_query: ...

Metric Configuration이란 실험 지표들을 관리하기 위한 설정들을 의미합니다. 실험 지표란 실험 결과를 대변할 수 있는 정량적 수치로, 계산하는데 필요한 정보와 방법은 지표별로 달라집니다.

위와 같이 지표 계산에 필요한 정보와 방법을 관리하는 체계가 Metric Configuration입니다. Metric Configuration은 지표 계산에 필요한 정보를 조회하는 Query인 Event Query, 계산하는 방법을 나타내는 Query인 Aggregation Query를 관리합니다. 정의된 Query들은 Data Preparation과 Metric Calculation에서 지표를 계산하기 위해 사용됩니다.

Data Preparation

Data Preparation이란 용어 그대로 분석에 필요한 데이터를 준비하는 과정입니다. 실험 분석을 위해서는 어떤 실험인지, 어떤 사용자가 실험에 노출되었는지, 실험 지표는 무엇인지에 대한 정보가 필요합니다. 이 정보들은 아래와 같이 각 Context(실험, 사용자, 지표) 별로 구조화됩니다.

Experiment Information: 실험을 정의하는데 필요한 정보들을 의미합니다. 실험이 생성/수정/삭제/완료된 history를 활용하여 분석해야 하는 실험들의 정보를 조회하게 됩니다. 실험 정보는 실험이 사용자에게 노출되는 비율, 노출되는 조건(Platform, App Version, …), 실험 상태, 실험 기간 등으로 정의됩니다.

experiment information 예시

Figure 3 | Experiment Information

Trigger Event: Trigger란 Subject(사용자)가 실험에 노출된 이벤트를 의미합니다. 여기서 Subject란 실험의 분석 단위를 의미하며 User, Device, Session 등으로 정의됩니다. Trigger Event는 Subject의 종류가 무엇이며, Subject가 어떤 실험의 어떤 그룹에 언제 노출되었는지의 데이터로 정의됩니다.

trigger_event 예시

Figure 4 | Trigger Event

Subject Event: 실험의 지표를 계산하기에 필요한 Subject의 이벤트 정보들을 의미합니다. Subject가 언제 어떤 이벤트를 어떻게 일으켰는지의 데이터가 포함되며, Metric Configuration의 Event Query를 사용해 계산되게 됩니다.

subject_event 예시

Figure 5 | Subject Event

위 3가지 정보들을 가공하기 위한 Raw Data는 내부 로깅 시스템을 통해 적재됩니다. 적재된 데이터는 Data Preparation단계를 통해 실험 분석 결과 계산에 필요한 정보로 가공됩니다.

Metric Calculation

실험 분석 결과는 실험을 통한 의사결정에 필요한 정보들을 의미하고, 반드시 아래의 정보들을 포함해야 합니다.

Metric Calculation은 Data Preparation에서 가공된 데이터를 통해 위 정보들을 계산하는 과정입니다. 해당 과정은 4단계로 나누어 독립적으로 진행되며, 각 과정의 결과물들은 AWS S3에 적재됩니다. 이렇게 과정을 나눈 이유는 두가지가 있습니다.

첫 번째로 Data Scientist & Analyst 분들이 분석을 효율적으로 할 수 있게 하기 위해서입니다. 분석 요청마다 처음부터 모든 분석 과정을 반복하는 것이 아닌, 각 과정의 저장된 결과를 재사용하여 효율적으로 분석을 진행할 수 있게 했습니다.

예를 들어, 실험 설계 과정에서 정의되지 않은 실험 지표를 추가해서 분석하려는 경우를 가정해 보겠습니다. Metric Calculation의 과정이 나누어져 있다면, 지표를 계산하기 전까지의 과정은 반복하지 않아도 됩니다. S3에 적재된 데이터를 사용하여 지표를 계산하는 과정만 반복하면 됩니다.

두 번째로 파이프라인에 통계적인 방법론 추가와 같은 변경사항을 반영하기에 유연한 구조를 만들기 위해서입니다. Metric Calculation의 특정 과정에 변경사항이 있더라도 다른 단계에는 영향을 주지 않도록 구성했습니다. 이렇게 독립적으로 파이프라인을 구성해, 변경사항이 있을 때 변경사항에 해당하는 단계만 변경하도록 했습니다.

마지막으로 분석 결과 혹은 과정에서 문제가 생겼을 경우, 어느 단계에서 문제가 발생했는지 모든 과정을 확인하는 것이 아닌 관련된 과정만을 확인하여 Debugging이 쉬운 구조를 구축했습니다.

Metric calculation 과정은 재사용이 많은 기준으로 나누었습니다. 재사용의 대표적인 예시는 추가 분석입니다. 뱅크샐러드의 경우 실험을 Subject의 특성(성별, 연령, …)으로 나누어 실험 분석을 하거나, 설계 시에 설정되지 않은 실험 지표를 추가하여 분석하고자 하는 경우가 많았습니다. 이를 기준으로 실험(Experiment Event), Subject(Subject-level Aggregated), Metric(Metric-level Aggregated) 단위로 과정을 나누었습니다. 이 과정에서 얻은 결과를 통해 최종적으로 실험 분석 결과(Experiment Analysis Result)를 계산합니다.

각 과정의 결과물은 다음과 같습니다.

Experiment Event: Subject Event를 Subject가 실험에 노출된 시점(Trigger Time) 이후의 데이터만 조회한 결과물입니다. 분석을 진행할 때 필요한 데이터는 Subject가 실험에 노출된 이후 시점의 데이터입니다. 그전의 데이터는 실험의 영향을 받기 전(받지 않은) 데이터이기 때문에 제외해야 합니다.

실험 노출에 이후의 가계부 방문 이벤트를 실험 분석에 사용

Figure 6 | 실험 노출 이후의 가계부 방문 이벤트만을 실험 분석에 사용

Subject-level Aggregated: 지표 계산을 위해서 Experiment Event를 Subject 단위로 Aggregation 하여 Subject별로 지표를 계산한 결과입니다. Metric Configuration의 Aggregation Query를 사용해서 계산합니다.

Metric-level Aggregated: 지표 값의 평균, Standard Error 등 통계적 유의성을 검증하는데 필요한 정보들을 지표 단위로 계산한 결과입니다.

Experiment Analysis Result: 실험 분석 결과입니다. 지표의 수치, 지표의 차이, 지표의 통계적 유의성(p-value) 등이 포함되며 의사결정에 필요한 정보들(신뢰구간, 표준편차, Minimum Detectable Effect)을 함께 제공하게 됩니다. 통계 방법론은 Two-sample z-test를 사용합니다.

최종적으로 계산된 Experiment Analysis Result는 실험플랫폼 UI에서 보이게 됩니다.

첫 번째 분석 인프라에서 Script를 동작시키고 그 결과를 문서화하는 과정은 주에 2시간 정도의 Data Scientist & Analyst 분들의 리소스가 필요했습니다. 자동화된 분석 인프라는 이러한 리소스 문제를 해결했고, 인적과오로 생길 수 있는 데이터 정합성 문제 또한 해결 했습니다. 그리고 실험 결과를 UI에서 확인할 수 있기 때문에 Python에 대한 이해가 없어도 누구나 실험 결과를 확인할 수 있게 되었습니다.

실험 분석 결과의 신뢰성과 접근성이 높아지면서 팀원들은 진행 중인 실험의 결과를 더 자주 확인했습니다. 실험에 대한 다양하고 적극적인 논의가 이루어졌고 데이터 기반 의사결정 과정이 더 성숙해졌습니다.

유연하고 신뢰할 수 있는 자동화된 분석 인프라는 기술적인 측면뿐 아니라 뱅크샐러드의 실험 문화를 한 단계 더 발전시켰습니다.

마치며

실험플랫폼은 1년이라는 시간 동안 문화적으로나 기술적으로 많은 발전을 이루어 왔습니다. 자동화된 분석 인프라 구성은 그중에서도 기술적으로 큰 도약이었습니다. 하지만 분석 결과를 제공하는 것은 실험플랫폼의 가장 기본적인 기능이기도 합니다.

뱅크샐러드의 실험 문화는 하루가 달리 성숙해지고 있습니다. 모든 제품 개선을 실험을 통해 검증하는 것뿐 아니라, 진행된 실험들에 대해 논의하고 더 나은 실험을 하기 위해 고민하고 있습니다. 성숙해지는 실험 문화를 기술적으로 지원하기 위해서는 지금보다 많은 기술적인 발전이 필요합니다.

지금까지는 실험플랫폼에 꼭 필요한 핵심 기능을 구현하기 위해 노력했습니다. 앞으로는 검정력을 높여 더 빠른 실험을 제공하거나, 여러 종류의 지표를 계산하는 등 다양하고 복잡한 실험을 쉽게 할 수 있도록 실험플랫폼을 고도화하는데 더 많은 노력을 기울이려고 합니다.