마케팅 자동화 솔루션, BizSpring Growth Platform™️
BizSpring Growth Platform™️ 자세히 알아보자 - TAM (1)
BizSpring Growth Platform™️ 자세히 알아보자 - TAM (2)
Google Cloud BigQuery를 이용한 RFM 분석
TAM 세그먼트 생성 시, 어떤 과정으로 데이터를 추출할까?
지난 포스팅에서는 트레이트의 데이터 타입과 관련된 내용에 대해 살펴보았는데요.
이어서 이번 포스팅에서는 트레이트의 추출 방법, 트레이트 중 ‘자동 완성’ 형식을 사용하기 위한 데이터 추출 및 적재, 자동완성 구현에 대해 소개하려고 합니다.
트레이트 데이터, 자동완성 데이터 생성 방법
세그먼트 생성에 필요한 트레이트의 정의 및 추출, 생성이 필요합니다.
자동 완성의 경우 데이터베이스에서 데이터를 가져오기 때문에 각 데이터를 생성 및 적재 과정을 거치게 됩니다.
이에 대한 과정을 살펴보겠습니다.
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개
자동완성 DOM 구조
제목
...
...
자동완성 구현을 위한 모듈 생성
$("#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™️에 대해 궁금한 점이 있다면 언제든지 연락주세요.
감사합니다.