BigQuery UDF 활용하기

조준혁
How we build MyRealTrip
6 min readSep 13, 2022

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

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

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

UDF 란?

  • User Defined Function 의 약자로, 사용자가 정의한 함수를 의미합니다.
  • Python, R 과 같은 프로그래밍 언어와 마찬가지로, SQL에서도 함수를 만드는 것이 가능합니다.
출처 : What are user-defined functions?
  • BigQuery 에서는 SQL 뿐만 아니라 JavaScript를 활용하여 UDF 를 정의할 수 있지만, 본 글에서는 SQL 정의 방법만을 다루겠습니다.

BigQuery UDF 종류

출처 : What are user-defined functions?
  • 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 전환수, 신뢰수준)
출처 : The art of A/B testing

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 커뮤니티도 있으니 다양한 함수들 활용해보셔도 좋을것 같네요 : )

참고

--

--