데이터 분석을 위한 SQL 레시피 - 5장 사용자를 파악하기 위한 데이터 추출 (1)
🗄️ 데이터분석을 위한 SQL 레시피 책을 읽고 정리 / 요약 한 내용입니다.
11. 사용자 전체의 특징과 경향 찾기
-
서비스를 제공하는 것은 사용자에게 가치를 제공하는 것
-
서비스 제공자 측에서 관련 정보로 알고 싶은 것
- 사용자의 속성(나이, 성별, 주소지)
- 사용자의 행동(구매한 상품, 사용한 기능, 사용한 빈도)
샘플 데이터
- 사용자 마스터 테이블
- 가입시 사용자 성별, 가입 날짜, 사용 장치 등
- 탈퇴시는 날짜만 기록
- 액션 로그 테이블
- 페이지 열람, 관심 상품 등록, 카트 추가, 구매, 리뷰 등 각 액션에 이름을 명시
user_id
가 NULL 인 경우 비로그인 회원- 액션 로그 테이블을 따로 만들고 액션 내용을 적어두면 별도의 JOIN, UNION 없이 데이터를 다룰 수 있음
|
|
11.1 사용자의 액션 수 집계하기
액션과 관련된 지표 집계하기
- 사용자들이 특정 기간동안 얼마나 사용하는지 집계한다.
- 사용자가 평균적으로 액션을 몇번 이나 했는지도 집계 (1명당 액션 수)
UU(Unique Users)
: 중복 없이 집계된 사용자 수특정 액션 UU / 전체 액션 UU = 사용율(usage_rate)
액션 수와 비율을 계산하는 쿼리
- 전체 UU를 구하고 그 값을
CROSS JOIN
하여 액션 로그를 결합
|
|
로그인 사용자와 비로그인 사용자를 구분해서 집계하기
- 회원, 비회원을 나누어 집계하면 충성도가 높은 사용자와 낮은 사용자가 어떤 경향을 보이는지 파악
- 로그인, 비로그인, 회원, 비회원을 판별하기 위해서는 로그 데이터에
session
정보가 있어야 한다.
로그인 상태를 판별하는 쿼리
user_id
여부에 따라login_status
를login
과guest
로 구분login_status
기반으로 액션 수, UU 집계
|
|
로그인 상태에 따라 액션 수 등을 따로 집계하는 쿼리(ROLLUP 활용)
login_status
가 비로그인guest
/로그인logint
상관없이 전체all
로 집계ROLLUP
구문을 사용 : RedShift, BigQuery는UNION ALL
사용
|
|
회원과 비회원을 구분해서 집계하기
- 로그인 상태가 아니더라도 이전에 한번이라도 로그인 했다면 회원으로 계산하기
- 로그 데이터에 회원상태를 추가해야 한다.
action_log_with_status
가상 테이블에 회원상태를 추가함
회원 상태를 판별하는 쿼리
session
에 한 번이라도 로그인했다면MAX(user_id)
로 추출 할 수 있음- 로그인 하기 이전의 상태를 비회원으로 다루고 싶다면 내부에
ORDER BY stamp
를 지정
|
|
- 로그인한 사용자를 빈 문자열로 지정한 경우
COUNT(DISTINCT user_id)
의 결과에 포함된다. - 사용자 수를 정화하게 추출하려면 사용자 ID를 NULL로 지정
- 빈 값을 NULL, 빈문자열 혹은 특수한 값으로 나타낼지는 쿼리 최적화에 따라 다름
11.2 연령별 구분 집계하기
- 사용자의 속성을 정의하고 집계하면 다양한 리포트를 만들 수 있음
- 시청률 분석에 많이 사용되는 연령별 집계하기
연령별 구분 목록
연령별 구분 | 설명 |
---|---|
C | 4~12세 남성/여성 |
T | 13~19세 남성/여성 |
M1 | 20~34 남성 |
M2 | 35~49 남성 |
M3 | 50세 이상 남성 |
F1 | 20~34 여성 |
F2 | 35~49 여성 |
F3 | 50세 이상 여성 |
사용자의 생일을 계산하는 쿼리
mst_users_with_int_birth_date
: 생일과 특정 날짜를 정수로 표현한 결과 임시 테이블mst_users_with_age
: 생일 정보를 부여한 사용자 마스터
|
|
성별과 연령으로 연령별 구분하는 계산 쿼리
cagetory
컬럼에서 연령별 구분을 계산- 20세 이상일 경우 접두사
M
,F
를 계산하고CONCAT
함수로 결합
|
|
연령별 구분의 사람 수를 계산하는 쿼리
|
|
- 연령을 단순하게 계산하면 특징을 파악하기 어렵고 데모그래픽
Demographic
등에 활용하기 어려움 - 서비스에 따라
M1
,F1
으로 정의하는 것이 적절하지 않을 수 있음 : 새로운 기준을 정의
11.3 연령별 구분의 특징 추출하기
- 연령별 구분을 사용하여 각각 구매한 상품의 카테고리를 집계하기
- 카테고리 내부에서 연령별 분포 확인 가능 연령별 구분과 카테고리를 집계하는 쿼리
|
|
11.4 사용자의 방문 빈도 집계하기
- 서비스를 한 주 동안 며칠 사용하는 사용자가 몇 명인지를 집계
- 일주일 동안 사용자 사용 일수와 구성비를 집계
한 주에 며칠 사용되었는지 집계
action_log
테이블에 사용자별 ID로DISTINCT
를 적용하여 사용일수 집계
|
|
구성비와 구성비누계를 계산하는 쿼리
|
|
11.5 벤 다이어그램으로 사용자 액션 집계하기
- 서비스 내의 여러 기능을 사용 현황을 조사하여 예상대로 사용하는지 확인해야 함
has_purchase
,has_review
,has_ravorite
: 등록액션한 경우 1, 아닌경우 0- 데이터 툴에 따라 곧바로 벤 다이어그램을 만들어 주는 기능 존재
사용자들의 액션 플래그를 집계하는 쿼리
|
|
모든 액션 조합에 대한 사용자 수 계산하기
- 벤 다이어그램을 그리기 위해서는
구매 액션만 한 사용자 수
,구매와 리뷰 액션을 한 사용자 수
처럼 하나의 액션 두 갱의 액션을 몇 명인지 계산필요 - PostgreSQL :
CUBE
구문을 사용하면 쉽계 계산
|
|
CUBE 구문을 사용하지 않고 표준 SQL 구문으로 작성한 쿼리
UNION ALL
을 많이 사용하므로 성능이 좋지 않다.
|
|
유사적으로 NULL을 포함한 레코드를 추가해서 CUBE 구문과 같은 결과를 얻는 쿼리
|
|
벤 다이어그램을 만들기 위해 데이터를 가공하는 쿼리
|
|
- 글을 작성하지 않고 다른 사람의 글만 확인하는 사용자
- 글을 많이 작성하는 사용자
- 글을 거의 작성하지 않지만 댓글은 많이 작성하는 사용자
- 글과 댓글 모두 적극적으로 작성하는 사용자
11.6 Decile 분석을 사용해 사용자를 10단계 그룹으로 나누기
- 사용자 특징을 분석 시 성별과 연령 등의 데이터가 있다면 이러한 속성에 따른 특징을 확인가능
- 데모그래픽한 데이터가 존재하지 않을 경우 사용자 액션으로 속성을 정의해 보는 것도 좋음
- 데이터를 10단계로 분할해서 중요도를 파악하는
Decile
분석 방법을 사용
Decile 분석 과정
사용자의 구매 금액에 따라 순위를 구분하고 중요도를 파악하는 리포트를 생성하기
- 사용자를 구매 금액이 많은 순으로 정렬
- 정렬된 사용자 상위부터 10%씩 Decile 10까지의 그룹을 할당한다.
- 각 그룹의 구매 금액 합계를 집계한다.
- 전체 구매 금액에 대해 각
Decile
의 구매 금액 비율(구성비)를 계산한다. - 상위에서 누적으로 어느 정도의 비율을 차지하는지 구성비누계를 집계한다.
구매액이 많은 순서로 사용자 그룹을 10등분 하는 쿼리
- 정렬된 사용자 상위에서 10%씩 Decile 1 ~ Decile 10 까지 그룹을 할당
- 같은 수로 데이터 그룹을 만들 때는
NTILE
윈도 함수를 사용
|
|
10등분한 Decile들을 집계하는 쿼리
|
|
구매액이 많은 Decile 순서로 구성비와 구성비누계를 계산하는 쿼리
|
|
Decile
의 특징을 다른 분석 방법으로 세분화하여 조사하면 사용자의 속성을 자세하게 파악 가능- 예시로
Decile 7 ~ 10
은 정착되지 않은 고객을 나타내면- 메일 매거진 등으로 리텐션을 높이는 등의 대책을 강구해볼 수 있음
- 이미 매거진을 보내는 상황이면 메일 매거진을 보낼 때 추가적인 데이터를 수집하여 해당 decile에 해당하는 사람들의 속성과 관련 데이터를 수집하고 활용
11.7 RFM 분석으로 사용자를 세 가지 그룹으로 나누기
- Decile 분석의 문제점
- 검색 기간에 따라 문제가 발생
- 검색기간이 너무 긴 경우 - 과거의 우수고객이어도 현재는 다른서비스를 사용하는 휴면 고객이 포함될 가능성 있음
- 검색기간이 너무 짧은 경우 - 정기적으로 구매하는 안정 고객이 포함되지 않고 해당 기간동안 일시적으로 많이 구매한 사용자가 우수 고객 취급
RFM 분석의 세가지 지표 집계하기
- RFM 분석의 세가지 지표
- Recency(최근 구매일) : 최근 무언가를 구매한 사용자를 우량 고객으로 취급
- Frequency(구매 횟수) : 사용자가 구매한 횟수를 세고 많을 수록 우량 고객으로 취급
- Mondtary(구매 금액 합계) : 사용자의 구매 금액 합계를 집계하고 금액이 높을 수록 우량 고객으로 취급
- Recency, Frequency, Monetary 3 개의 앞글자를 따서 RFM 분석이라고 함
- Decile 분석에서는 한 번 구매로 비싼 물건을 구매한 사용자와 정기적으로 저렴한 물건을 여러번 구매한 사용자가 같은 그룹으로 판별
|
|
RFM 랭크정의하기
- RFM 분석에서는 3개의 지표를 각각 5개의 그룹으로 나누는 것이 일반적
125 = 5 * 5 * 5
개의 그룹으로 사용자를 나누어 파악
RFM 랭크 정의 테이블
랭크 | R:최근 구매일 | F:누계 구매 횟수 | M:누개 구매 금액 |
---|---|---|---|
5 | 14일 이내 | 20회 이상 | 300만원 이상 |
4 | 28일 이내 | 10회 이상 | 100만원 이상 |
3 | 60일 이내 | 5회 이상 | 30만원 이상 |
2 | 90일 이내 | 2회 이상 | 5만원 이상 |
1 | 91일 이내 | 1회 | 5만원 미만 |
사용자들의 RFM 랭크를 계산하는 쿼리
|
|
각 그룹에 사람 수를 확인하는 쿼리
|
|
- 극단적으로 적은 사용자 수의 그룹이 발생한다면, RFM 랭크 정의를 수정해야 함
- 그룹이 그분되면 각각 FRM 랭크별로 어떠한 대체
사용자를 1차원으로 구분하기
- RFM 분석을 3차원으로 표현하면 125개의 그룹이 발생하므로 관리가 매우 어려움
R+F+M
각 랭크 합계를 기반으로 13개 그룹으로 나누어 관리
통합 랭크별 사용자 수
통합 랭크 | R | F | M | 사용자 수 |
---|---|---|---|---|
15 | 5 | 5 | 5 | 9 |
14 | 5 | 5 | 4 | 13 |
5 | 4 | 5 | 15 | |
4 | 5 | 5 | 15 | |
13 | 5 | 5 | 3 | 16 |
… | … | … | … | … |
3 | 1 | 1 | 1 | 842 |
통합 랭크를 계산하는 쿼리
|
|
종합 랭크별로 사용자 수를 집계하는 쿼리
|
|
2차원으로 사용자 인식하기
- RFM을 지표 2개를 사용해서 사용자 층을 정의한다.
- 2차원으로 사용자 층을 구성하면
- 각 사용자 층에 어떤 마케팅 대책을 실시 할지
- 상위 사용자 층으로 어떻게 구성할지 생각 해 볼 수 있다.
R과 F를 사용해 2차원으로 사용자 인식
R과 F를 사용해 2차원 사용자 층의 사용자 수를 집계하는 쿼리
|
|
어떤 대책을 실시할지 생각해보기