BigQuery UDF 활용하기

feat. 쿼리로 A/B test 결과 출력하기

Share
BigQuery UDF 활용하기

feat. 쿼리로 A/B test 결과 출력하기

SQL은 데이터 연산에 필요한 다양한 내장함수를 가지고 있습니다. 하지만 기본적인 연산 이외에 복잡한 로직을 요구하는 함수가 필요한 경우가 있는데요, 이때 활용할 수 있는 것이 UDF 입니다.

이 글에서는 마이리얼트립에서 사용하는 DW인 BigQuery의 UDF 사용법을 알아보고, 수기로 관리되던 A/B test 결과를 쿼리로 출력할 수 있게끔 UDF 를 활용한 사례를 소개해드리겠습니다.

UDF 란?
  • User Defined Function 의 약자로, 사용자가 정의한 함수를 의미합니다.
  • Python, R 과 같은 프로그래밍 언어와 마찬가지로, SQL에서도 함수를 만드는 것이 가능합니다.
  • BigQuery 에서는 SQL 뿐만 아니라 JavaScript를 활용하여 UDF 를 정의할 수 있지만, 본 글에서는 SQL 정의 방법만을 다루겠습니다.
BigQuery UDF 종류
  • Temporary(임시) UDF : 쿼리문에 임시로 정의해서 사용하는 방식
  • Persistent(영구) UDF : BigQuery 데이터셋에 저장되는 방식으로, 여러 사람과 함께 사용할 경우 유용
Temporary(임시) UDF

쿼리 최상단에 위치, CREATE TEMP FUNCTION 명령어 사용

주의사항

  • 함수 파라미터 정의 시 데이터 타입 함께 적기
  • RETURNS 뒤에 리턴될 데이터 타입 적기 (RETURNS 자체 생략 가능)
  • AS 뒤에 함수 정의
  • 함수 정의 부분에 쿼리문을 쓴다면 괄호로 한번 꼭 감싸야함
  • 정의 후 ; 를 꼭 붙여야함

예시

  • 반지름을 입력받고, 원의 넓이를 출력해주는 임시 UDF
  • 실행시 아래와 같은 결과를 출력하게 됩니다.
Persistent(영구) UDF

CREATE FUNCTION
명령어 사용. 특정 데이터셋 하위에 테이블처럼 저장
  • CREATE OR REPLACE FUNCTION 사용시 UDF가 없다면 신규 생성, 있다면 수정
  • 정의한 UDF는 dataset_name.function_namee(parameter)꼴로 호출

주의사항

  • 함수 파라미터 정의 시 데이터 타입 함께 적기
  • RETURNS 뒤에 리턴될 데이터 타입 적기 (RETURNS 자체 생략 가능)
  • AS 뒤에 함수 정의
  • 함수 정의 부분에 쿼리문을 쓴다면 괄호로 한번 꼭 감싸야함
  • 정의 후 ; 를 꼭 붙여야함

예시

  • 두 수치를 입력받고, 증감률을 계산해주는 영구 UDF
  • 위와 같이 정의한 함수를 호출하는 방법은 다음과 같습니다.
A/B Test 결과를 출력해주는 UDF 정의하기

마이리얼트립에서는 제품을 개선하기 위해 다양한 실험을 A/B 테스트를 진행하고, 핵심 지표를 기준으로 통계적 검정을 통해 테스트의 결론을 내리고 있습니다.

기존 결과를 산출하던 방식은 A/B Calculator 사이트에서 값을 직접 입력하여 결괏값을 얻곤 했는데요, 이런 방식은 값을 수기로 하나하나 입력해야 한다는 번거로움이 존재합니다.

이를 해결하고자, 쿼리에서 집계된 값을 바탕으로 A/B Test의 결과를 바로 출력해줄 수 있는 UDF 를 정의하게 되었습니다.

시나리오

상품 클릭률 개선을 위해 특정 지면에서의 상품 노출 위치에 대한 A/B Test를 진행한다고 가정해보겠습니다. ( A : 기존 위치, B : 변경 위치)

이 실험에서 가설은 아래와 같습니다.

  • H0(귀무가설) : A안과 B안의 상품 클릭률은 동일할 것이다.
  • H1(대립가설) : A안과 B안의 상품 클릭률은 다를 것이다.
    => 보수적으로 양측 검정으로 세팅
  1. Z값 구하기
  • udf.z_score(집단 A 모수, 집단 A 전환수, 집단 B 모수, 집단 B 전환수, 신뢰수준)

2. 정규분포표 값 계산 함수

  • udf.normal_cdf(z값, 평균, 표준편차)
  • Z값을 구했다면, 해당 값이 정규분포표 상에서 어떤 확률 값을 가지는지 계산해야 합니다.

3. P value 계산

  • udf.p_value(집단 A 모수, 집단 A 전환수, 집단 B 모수, 집단 B 전환수, 신뢰수준)
  • 검정하고자 하는 가설에 따라 해당 부분의 수식을 바꾸며 p value를 계산 할 수 있습니다.

4. A/B Test 결과 출력

  • udf.ab_result(집단 A 모수, 집단 A 전환수, 집단 B 모수, 집단 B 전환수, 신뢰수준)
  • 앞서 정의한 p value 함수와 신뢰수준을 바탕으로 검정 결괏값을 산출합니다.

실험 결과로 다음과 같은 값을 얻었다면, 정의한 udf.ab_result 함수를 활용하여 A/B Test 결과를 출력할 수 있습니다.

  • A 안 : 유입 : 70,000 / 상품클릭 : 1,400 (전환율 : 2.0%)
  • B안 : 유입 : 70,000 / 상품클릭 : 1,560 (전환율 : 2.2%)

쿼리의 결과는 A/B Calculator 사이트의 결과와 동일합니다.

이렇게 BigQuery UDF의 정의부터 활용법까지 살펴보았는데요, 사용해보니 편한점이 많아서 자주 정의해서 사용하고 공유해야겠다는 생각이 듭니다.

BigQuery UDF 커뮤니티도 있으니 다양한 함수들 활용해보셔도 좋을것 같네요 : )

Read more

딱 내가 바라던 여행, LAFC 홈구장 곳곳에서의 특별한 경험

딱 내가 바라던 여행, LAFC 홈구장 곳곳에서의 특별한 경험

경기 시작 전 아직은 조용한 경기장. 관중석이 채워지기 전, 선수들이 그라운드로 나와 몸을 풉니다. 누군가는 그 모습을 관중석이 아니라 바로 앞에서 봤습니다. 선수들이 걸어 나오는 통로 앞, 숨소리가 들릴 만큼 가까운 자리였습니다. 몇 시간 뒤 함성으로 채워진 경기장 전광판에는 이들을 맞는 문구가 떴고, 경기가 끝난 뒤에는 선수에게 직접 사인을 받았습니다.

By 마이리얼트립
눈팅만 하던 여행자들을 위한 설계: '동행매칭' 개편기

눈팅만 하던 여행자들을 위한 설계: '동행매칭' 개편기

마이리얼트립 앱 내 커뮤니티의 '동행매칭'은 같은 시기에 같은 도시로 떠나는 여행자를 서로 연결하는 서비스입니다. 지난 넉 달 동안 이 서비스를 커뮤니티의 중심으로 옮기고, 참여하는 방식을 다시 설계했습니다. 기존 커뮤니티에는 여러 주제의 게시판이 있었고, 작업은 무엇을 남길지 고르는 일에서 시작했습니다. 동행을 찾는 관심은 충분했습니다. 다만 글을 여러 개

By 마이리얼트립
한 곳에서, 어디서나, 더 잘 보이게: 마이리얼트립이 파트너에게 새로 연 세 가지

한 곳에서, 어디서나, 더 잘 보이게: 마이리얼트립이 파트너에게 새로 연 세 가지

마이리얼트립에서 떠나는 여행의 대부분은 파트너의 손에서 시작됩니다. 현지에서 투어를 진행하고, 숙소를 운영하고, 여행자의 문의에 답하는 일을 파트너가 함께합니다. 마이리얼트립은 그 여행이 여행자에게 잘 닿게 하는 일을 맡습니다. 어느 한쪽만 잘해서는 좋은 여행이 되지 않습니다. 마이리얼트립이 파트너의 운영을 돕는 일에 오래 공을 들여 온 이유입니다. 파트너의 하루가 수월해지는 만큼 여행자의 여행도

By 마이리얼트립
여행 앱에서 웬 뷰티요? 나를 돌보는 시간까지 골라 드립니다

여행 앱에서 웬 뷰티요? 나를 돌보는 시간까지 골라 드립니다

뷰티·웰니스. 여행 앱에서 이 단어를 마주하면 잠깐 갸웃하게 됩니다. 항공권과 숙소, 투어를 예약하던 곳에서 웬 마사지와 스파일까요. 그런데 따지고 보면 둘은 생각보다 가까운 사이입니다. 여행을 준비할 때 우리는 컨디션을 챙기고, 사진 속 나를 신경 쓰고, 다녀와서는 쌓인 피로를 풀고 싶어 합니다. 여행이 나를 위한 시간이라면, 나를 돌보는 관리 역시

By 마이리얼트립