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

우리가 찾는 '창업가처럼 일하는 사람': 신입 공개채용 설명회에서 나눈 이야기

우리가 찾는 '창업가처럼 일하는 사람': 신입 공개채용 설명회에서 나눈 이야기

마이리얼트립은 첫 신입 공개채용을 진행 중입니다. 지원자들이 회사와 일하는 방식을 더 가까이에서 알 수 있도록 온라인 채용설명회와 오프라인 밋업 '창업가에게 묻다'도 열었습니다. 밋업에는 이동건 대표가 직접 나와 회사와 공채를 소개하고, 지원을 고민하는 분들의 질문에 답했습니다. 두 자리에서 나눈 이야기를 정리했습니다. 신입 공개채용은 10월 11일까지 채용 페이지에서 지원할

By 마이리얼트립
마이리얼트립 2026 신입 공개채용 지원 가이드: 밋업 '창업가에게 묻다'에 오지 못했다면

마이리얼트립 2026 신입 공개채용 지원 가이드: 밋업 '창업가에게 묻다'에 오지 못했다면

마이리얼트립 2026 신입 공개채용 밋업 '창업가에게 묻다'가 10월 1일 저녁 마이리얼트립 오피스에서 열렸습니다. 지원을 고민하는 분들이 이동건 대표를 직접 만나 궁금한 것을 묻고 답을 듣는 자리였습니다. 필수 전형도 아니고, 주말도 아닌 평일 저녁이었는데도 많은 지원 희망자가 행사장을 채웠습니다. 전날 온라인 채용설명회를 보고 다시 찾아온 분도 있었습니다. 목요일

By 마이리얼트립
첫 커리어를 창업가처럼: 마이리얼트립 신입 두 사람의 20개월

첫 커리어를 창업가처럼: 마이리얼트립 신입 두 사람의 20개월

마이리얼트립은 '창업가처럼 일한다'를 정해진 역할에 경계를 두지 않고, 문제를 자신의 것으로 받아들여 결과를 내는 방식으로 정의합니다. 이번 신입 공개채용에서 찾는 사람도 이 방식으로 일할 사람입니다. 그렇다면 신입에게 창업가처럼 일한다는 건 실제로 어떤 모습일까요? 작년 초에 입사해 올해 2년 차인 두 분의 20개월을 따라가 봤습니다. 한 사람은 인턴

By 마이리얼트립
딱 내가 바라던 여행, LAFC 홈구장 곳곳에서의 특별한 경험

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

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

By 마이리얼트립