콘텐츠로 건너뛰기

TAM 세그먼트에 사용되는 Trait 속성 값을 수집/사용하기 위해 어떤 과정을 거칠까?

  • 테크

지난 포스팅에서는 트레이트의 데이터 타입과 관련된 내용에 대해 살펴보았는데요.

이어서 이번 포스팅에서는 트레이트의 추출 방법, 트레이트 중 ‘자동 완성’ 형식을 사용하기 위한 데이터 추출 및 적재, 자동완성 구현에 대해 소개하려고 합니다.

트레이트 데이터, 자동완성 데이터 생성 방법

세그먼트 생성에 필요한 트레이트의 정의 및 추출, 생성이 필요합니다.
자동 완성의 경우 데이터베이스에서 데이터를 가져오기 때문에 각 데이터를 생성 및 적재 과정을 거치게 됩니다.

이에 대한 과정을 살펴보겠습니다.

1. 속성 데이터 (트레이트)

사용자가 일반적으로 많이 사용할 만한 세그먼트를 미리 정의하여 ‘트레이트’ 이라는 이름으로 분류 및 생성하여 사용자가 간편하게 사용할 수 있습니다.

해당 트레이트 코드 값을 추출하기 위해서 모바일앱, 온라인 방문, 매장 POS, CRM 고객 데이터 등 원천 데이터에서 수집한 고객 및 행동 데이터를 가공하여 목적에 맞게 추출합니다.

데이터 종류별 데이터 셋(데이터 모음집) 단위로 데이터를 저장하며, 다음과 같은 원천 데이터 셋에서 트레이트을 가공 및 생성하여 사용합니다.


예시) 유저 ID, 성별, 나이 속성 데이터 추출

				
					// 사용자 프로파일 추출
WITH
e_profile AS (
    ...
)

// 유저 ID(usr_id), 성별(sex), 나이(age)
,e_user AS (
    SELECT      pfno,dpuid,vt
                ,(SELECT value FROM UNNEST(prop) WHERE key = "rk"  ) AS usr_id
                ,(SELECT value FROM UNNEST(prop) WHERE key = "sx"  ) AS sex
                ,(SELECT value FROM UNNEST(prop) WHERE key = "ag"  ) AS age
                ...
    FROM        `data.user_*`
    LEFT JOIN   e_profile USING(pfno)
    WHERE       _TABLE_SUFFIX = "20221001"
      AND       dpuid != ""
)

,t_user_attribute AS (
    SELECT      DISTINCT DATE(vt,"Asia/Seoul") AS stat_date,pfno,dpuid
                ,LAST_VALUE(usr_id IGNORE NULLS) OVER(user_window) AS usr_id
                ,LAST_VALUE(sex    IGNORE NULLS) OVER(user_window) AS sex
                ,LAST_VALUE(age    IGNORE NULLS) OVER(user_window) AS age
                ...
    FROM        e_user
)

SELECT          *
FROM            t_user_attribute

				
			

예시와 같이 특성에 맞는 데이터들을 추출하여 저장하고 이를 활용하여 트레이트 항목을 선택할 수 있습니다.

다음은 선별된 트레이트 목록입니다.


2. 자동완성 데이터

‘상품명’처럼 기존에 있는 값을 직접 입력하여 설정 해야 하는 경우, 이를 간편하게 사용하기 위해 자동완성 항목을 제공하고 있습니다.

자동완성이 필요한 데이터들을 매일 추출 후, Elasticsearch에 적재하고,
사용 시(입력 시) 해당 Elasticsearch Index(테이블)을 조회하여 결과 값을 가져와 출력하여 선택할 수 있습니다.

예시) 상품 관련 데이터 추출

				
					// 사용자 프로파일 추출
WITH
e_profile AS (
    ...
)

// 페이지 정보 : dp_fst(상품코드), dp_lst(상품명), …

,t_page AS (
    SELECT      stat_date,client_seq,pfno,dpuid,sid
                ,ic
                ,IF(rn=1      ,dp ,NULL) AS dp_fst
                ,IF(rn=1      ,dpt,NULL) AS dpt_fst
                ,IF(rn=rn_last,dp ,NULL) AS dp_lst
                …
    FROM        (
        SELECT  stat_date,client_seq,pfno,dpuid,sid,vt,vt1
                ,ic,dp,dpt
                ,rn,LAST_VALUE(rn) OVER(session_window) AS rn_last
        FROM    e_page
        WINDOW  session_window AS (
                PARTITION BY client_seq,pfno,dpuid,sid ORDER BY vt ASC
                ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
        )
    )
)


// 랜딩 정보 : kw_outer(유입검색어), …
,t_land AS (
    SELECT      CAST(client_seq AS STRING) AS client_seq,pfno,dpuid,vt,dr_tp,dr_dd,dr_dq
                ,IF(dr_tp="O",
                    IF(REGEXP_CONTAINS(dr_dd,"(?i)(bing|daum|google)"),(SELECT STRING_AGG(value LIMIT 1) FROM UNNEST(dr_dq) WHERE key="q"),
                        IF(REGEXP_CONTAINS(dr_dd,"(?i)(naver|zum)"),(SELECT STRING_AGG(value LIMIT 1) FROM UNNEST(dr_dq) WHERE key="query"),
                            (SELECT STRING_AGG(value LIMIT 1) FROM UNNEST(dr_dq) WHERE key="keyword"))),NULL) AS kw_outer
    FROM        `data.land_*`
    LEFT JOIN   e_profile USING(pfno)
    WHERE       _TABLE_SUFFIX = "20221001"
      AND       client_seq IS NOT NULL
      AND       dpuid != ""
)


SELECT          *
FROM            {t_page} 혹은 {e_land}


추출된 데이터들을 자동완성 DB에 적재하기 위해 종합합니다.

WITH
### 추출
e_session AS (
    SELECT      client_seq,pfno
                ,...
                ,dr_dp,dp_fst,dpt_fst,dp_lst,dpt_lst
    FROM        `data.user_session_*`
    WHERE       _TABLE_SUFFIX = "20221001"
)
,e_behavior AS (
    SELECT      client_seq,pfno
                ,kw_outer,kw_inner
    FROM        `data.user_behavior_*`
    WHERE       _TABLE_SUFFIX = "20221001"
)
, …

### 변환
,t_dp_fst AS (
    SELECT      client_seq,pfno,"du" AS seg,attr,attr AS attr_nm
    FROM        e_session
    LEFT JOIN   UNNEST(dp_fst) AS attr
)
,t_dp_lst AS (
    SELECT      client_seq,pfno,"du" AS seg,attr,attr AS attr_nm
    FROM        e_session
    LEFT JOIN   UNNEST(dp_lst) AS attr
)
, …
,t_final AS (
    SELECT      attr,attr_nm,client_seq,pfno,seg
    FROM (
        …
        SELECT  *
        FROM    t_dp_fst
        UNION ALL
        SELECT  *
        FROM    t_dpt_fst
        UNION ALL
        SELECT  *
        FROM    t_dp_lst
        UNION ALL
        SELECT  *
        FROM    t_kw_outer
        
    )
    WHERE       attr IS NOT NULL AND attr != ""
    AND         client_seq IS NOT NULL
)

### 적재
SELECT          DISTINCT *
FROM            t_final
ORDER BY        client_seq,pfno,seg,attr
				
			

3. 자동완성 사용을 위한 기능 구현

자동완성 속성을 사용하기 위해 데이터 추출 및 적재까지 완료되었습니다.
이를 실제로 사용하기 위해 세그먼트 설정 페이지에 UI 구현이 필요한데, 이에 대해 설명하겠습니다.

기본적인 구조는 다음과 같습니다.

    • 검색어가 없을 시(초기), 가나다 순으로 상위 데이터 출력
    • 검색어 입력 시, 해당 검색어로 시작하는 단어들을 검색하여 상위 데이터 출력
    • 출력되는 데이터의 갯수는 최대 30개
해당 조건에 부합하는 기능을 구현하기 위해 ‘jQuery UI Autocomplete’ 라이브러리를 사용하여 구현하고 있습니다.
 
자동완성을 사용할 HTML Input DOM을 생성 후, jQuery 형식의 모듈 생성 명령어를 사용하여 완성합니다.
 

자동완성 DOM 구조

				
					<!DOCTYPE html>
<html>
    <head>
    <meta charset=UTF-8"> 
        <title>제목</title>
    </head>
    <body>
     ...
     <input id="searchInput" class="form-control">
     ...
    </body>
</html>
				
			

자동완성 구현을 위한 모듈 생성

				
					$("#searchInput").autocomplete({
    /*
        검색 데이터를 설정하는 부분입니다.
        자동완성 데이터를 검색하기 위해 검색어, 갯수등을 설정하여 DB를 조회합니다.
    */
    source: function (request, response) {
      const lookback = $('#select_lookback').val();
      ...
      const seg = this.element.data('seg');
      const search_kw = request.term;                                   // 검색어
      $.ajax({
        url: 'https://growthplatform.ai/gp/autocomplete-search',
        type: 'POST',
        data: {
          lookback: lookback,
          ...
          seg: seg,
          search_kw: search_kw,
          search_len: 30                                // 결과를 최대 30개로 제한
        },
        dataType: 'json',
        beforeSend: function (xhr) {
          xhr.setRequestHeader(header, token);
        },
        success: function (data) {          // 결과를 jQuery UI Autocomplete 형식에 맞게 변환
          let result = [];
          if (data && data.length > 0) {
            result = $.map(data, function (item) {
              return {
                label: item.attrNm,
                value: item.attr
              }
            });
          } else {
            result.push({label: '검색 결과가 없습니다.', value: request.term});
          }
          response(result);
        }
      })
    },
    ... ,
    minLength: 0,
    delay: 100                    // DB 과부하 방지를 위하여 검색어 작성 후 0.1초 이후에 DB를 검색
  }).focus(function() {
    $(this).autocomplete('search', $(this).val());
    // 검색어 미 입력시(초기), 상위 30개의 검색어 출력을 위하여 설정
  });
				
			

이러한 구현 결과, 다음과 같이 자동완성 형식을 사용할 수 있습니다.

 

이상으로, BizSpring Growth Platform™️ Trait 속성 값 수집/사용을 위한 데이터를 정리해보았습니다.
비즈스프링의 마케팅 자동화 솔루션인 Bizspring Growth Platform™️에 대해 궁금한 점이 있다면 언제든지 연락주세요.

감사합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다