기본 콘텐츠로 건너뛰기

SQL - Retention(리텐션) 산출

0. Retention(잔존율)이란 웹 또는 앱에서 특정 시점을 기준으로 일정 시간이 흐른 뒤에도 남아있는, 잔존해 있는 비율을 의미한다. 보통 1 day retention(1일 리텐션)이라 함은 1일 후에도 남아있는 유저의 비율을 의미한다. 실무에서 가입일을 기준으로 유저들의 주(week) 단위 리텐션을 아래의 매트릭스와 같이 관리할 수 있다.


이번 포스팅에는 1일 리텐션을 구해본다.

1. 아래와 같이 게임을 플레이한 유저의 정보를 담고 있는 PLAYS라는 샘플 테이블을 만들자

1
2
3
4
5
6
7
CREATE TABLE PLAYS(id integer, created_at date);

INSERT INTO PLAYS VALUES(1, '2019-01-03');
INSERT INTO PLAYS VALUES(2, '2019-01-03');
INSERT INTO PLAYS VALUES(3, '2019-01-03');
INSERT INTO PLAYS VALUES(1, '2019-01-04');
INSERT INTO PLAYS VALUES(2, '2019-01-04');

" SELECT * FROM PLAYS; " 쿼리를 통해 plays 테이블을 아래와 같이 확인할 수 있다.

2. 리텐션을 구하는 방법을 알아보자.

1월 3일의 dau는 3명, 1월 4일의 dau는 2명이다. 따라서 1월 3일 기준 1일 리텐션은 (2/3)*100 = 66%이다. 이 계산 방법을 조건으로 다시 풀어보자
- 일별 dau를 계산해야 한다. dau를 산출하는 쿼리는 "SQL - DAU 산출" 포스팅에서 자세히 확인할 수 있다.
- 1월 3일과 1월 4일을 매칭시킨다. 1월 4일에서 1일을 뺀 1월 3일을 원래 테이블의 1월 3일과 날짜와 유저를 결합시킨다. 그러면 1월 3일의 유저 중 1월 4일에도 잔존해 있는 유저들을 찾을 수 있다. self join(셀프 조인)을 사용한다.
- 1월 3일이 기준으로 분모가 된다. 1월 3일의 dau가 분모이므로 1월 3일을 기준으로 하는 left join을 사용한다. 즉, self join을 left join으로 실행한다.
- 1월 3일의 전체 dau와 1월 3일과 결합된 1월 4일의 dau를 계산한다. 위 두 값을 나눈다.
(1월 3일에도 접속한 유저 중 1월 4일 dau) / (1월 3일 dau) 가 리텐션이 된다.

3. 위 로직을 쿼리로 작성하면 아래와 같다.

1
2
3
4
5
6
7
SELECT DATE(p1.created_at) as date, round(cast(count(distinct p2.id) as float) / cast(count(distinct p1.id) as float), 3) * 100 as retention_1day
FROM PLAYS p1
LEFT JOIN PLAYS p2
ON p1.id = p2.id and date(p1.created_at) = date(datetime(p2.created_at, '-1 day'))
WHERE date = '2019-01-03'
GROUP BY date
;

- ON절의 date(datetime(p2.created_at, '-1 day')) 구문은 p2의 create_at에서 1일을 뺀 값을 date형식으로 구하는 것을 의미한다. p2의 date에서 1일을 뺀 날짜를 p1.의 date와 일치하는 조건으로 조인시켜 p1의 유저 중 1일 후에도 존재하는 유저들을 조인시켜 1일 리텐션을 구할 수 있다. 만약 7일 리텐션을 구하고 싶다면 date(datetime(p2.created_at, '-7 day'))로 바꿔서 7일 후에 잔존하는 유저들을 조인시키면 된다.

- 위 쿼리에서 아래와 같이 LEFT JOIN만 실시해 데이터들이 조인한 모습을 살펴보자.

1
2
3
4
5
SELECT *
FROM PLAYS p1
LEFT JOIN PLAYS p2
ON p1.id = p2.id and date(p1.created_at) = date(datetime(p2.created_at, '-1 day'))
;

아래와 같이 데이터가 조인되어 있는 것을 확인할 수 있다.

유저 id가 같고 - p1.id = p2.id - 날짜가 1일 차이가 나는 - date(p1.created_at) = date(datetime(p2.created_at, '-1 day')) - 조건으로 데이터가 left join되었다.

4. 위 테이블을 SELECT절에서 계산하면 아래와 같이 결과를 확인할 수 있다.

끝.









댓글

이 블로그의 인기 게시물

웨딩 드레스 스케치 도안

웨딩 드레스샵 투어를 다니면서 샘플로 드레스를 입는 경우에는 드레스 사진을 찍지 못하게 하는 샵이 많다. ​ 그래서 투어를 돌고 나면 어떤 샵의 어떤 스타일이 신부에게 잘 어울렸는지 헷갈릴 수가 있다. ​ 하지만 투어를 다닐 때 드레스샵에서 입은 드레스의 특징과 느낌을 잘 기록하면 샵을 선택하는 데 도움이 될 수 있다. ​ 드레스 투어를 다닐 때 드레스를 기록할 스케치 도안은 아래 링크에서 확인/다운로드 할 수 있다. 웨딩 드레스 스케치 도안 확인/다운로드 하기 투어를 마친 후 드레스샵과 계약을 하고, 드디어 본식 드레스를 고를 때에는 사진을 찍을 수 있는 경우가 많다. ​ 이 땐 사진을 잘 찍어서 어떤 드레스를 입을지 잘 선택하도록 하자. ​ ​

파이썬(Python)을 이용한 선형 회귀분석(linear regression)

파이썬의 statsmodels 라이브러리를 이용해 간단하게 선형 회귀분석을 해볼 수 있다. 예시를 통해 살펴보자. 먼저 아래와 같이 예시 데이터프레임을 만든다. 1 2 3 4 5 6 7 8 9 10 11 12 import pandas as pd height = [ 170 , 168 , 177 , 181 , 172 , 171 , 169 , 175 , 174 , 178 , 170 , 167 , 177 , 182 , 173 , 171 , 170 , 179 , 175 , 177 , 186 , 166 , 183 , 168 ] weight = [ 70 , 66 , 73 , 77 , 74 , 73 , 69 , 79 , 77 , 80 , 74 , 68 , 71 , 76 , 78 , 72 , 68 , 79 , 77 , 81 , 84 , 73 , 78 , 69 ] body = pd . DataFrame( { 'height' : height, 'weight' : weight } ) body . tail() 위 코드에 대한 설명은 "파이썬(Python) Pandas를 이용한 데이터프레임(DataFrame) 만들기" 포스팅을 통해 확인할 수 있다. 위 코드를 Jupyter Notebook을 통해 실행해보면 아래와 같이 데이터 프레임이 만들어진 것을 확인할 수 있다. 선형 회귀분석은 아래와 같은 가정을 만족해야 한다. 선형 회귀분석을 할 때에는 데이터가 아래의 가정을 따르는지 먼저 생각해보는 습관을 기르자. - 변수의 선형 상관관계 : 선형 회귀분석은 종속변수(Y)와 독립변수(X)가 선형의 상관 관계를 가지는 것을 가정한다. 선형의 상관관계가 아닐 경우, 다른 회귀분석 방법을 사용하거나, 새로운 변수를 추가하거나, 기존의 변수를 로그, 지수등의 방법으...

파이썬(Python)을 이용한 피어슨 상관계수 구하기

피어슨 상관계수(Pearson correlation coefficient)는 두 변수 간의 상관관계를 확인하기 위한 가장 기본적인 방법이다. 피어슨 상관계수를 사용할 때 주의해야할 사항은 아래와 같다. - 상관관계가 인과관계를 의미하는 것은 아니다. 단순히 두 변수의 연관성을 확인하는 것이다. - 두 변수가 정규분포일 때 잘 작동한다.  - 이상치(outlier)에 민감하므로, 이상치는 제거하는 것이 좋다. - 두 변수가 완전히 동일하면 피어슨 상관계수는 1.0이다. 완전히 반대방향으로 동일하면 -1.0, 전혀 상관 없으면 0이다. 세부적인 해석은 아래와 같이 한다. - -1.0과 -0.7 사이이면, 강한 음적 선형관계 - -0.7과 -0.3 사이이면, 뚜렷한 음적 선형관계 - -0.3과 -0.1 사이이면, 약한 음적 선형관계 - -0.1과 +0.1 사이이면, 거의 무시될 수 있는 선형관계 - +0.1과 +0.3 사이이면, 약한 양적 선형관계 - +0.3과 +0.7 사이이면, 뚜렷한 양적 선형관계 - +0.7과 +1.0 사이이면, 강한 양적 선형관계 파이썬을 통해 피어슨 상관계수를 쉽게 구할 수 있다. 예시를 통해 알아보자. height, weight의 두 변수를 가지는 body라는 DataFrame을 만들었다. DataFrame을 만드는 과정은 아래의 포스트에서 확인할 수 있다.  "파이썬(Python) Pandas를 이용한 데이터프레임(DataFrame) 만들기" body 데이터프레임으로 피어슨 상관계수를 구하는 코드는 아래와 같다.  1 2 corr = body . corr(method = 'pearson' ) corr Jupyter Notebook으로 구하면 아래와 같은 결과를 얻는다. 표의 행과 열을 살펴보면 "height - height", "weight - weight"는 1이...