유데미 스타터스 취업 부트캠프 4기 - 데이터분석/시각화(태블로) 8주차 학습일지
미니 해커톤 준비
오늘은 월요일에 있을 미니 해커톤 발표를 준비하는 시간을 가졌다.
주어진 데이터 셋은 app에 대한 기본 정보가 들어 있는 googleplaystore 테이블과 review 테이블이었다.
googleplaystore 테이블에는 앱 이름, 앱에 대한 리뷰 수, 리뷰 평점, 설치 수 , 최근 업데이트 일자, 유료앱 여부, 유료앱이라면 price 등등이 있었고, review 테이블에는 앱 이름, 앱에 대한 텍스트 리뷰, 그 리뷰의 polarity (-1 ~ 1), 그 리뷰의 subjectivity 즉 주관 정도, positive 인지 negative인지 등이 적혀 있었다.
우선 우리 조는 여러 가지 주제가 나왔는데 아래 같은 주제들이 기억난다.
1. 사용하지 않는 앱에 대한 조치를 취하는 방법 (last updated 일자와 리뷰 수 등을 이용)
2. free 앱 중 paid로 돌릴 앱 리스트를 찾아서, 매출을 올리는 방법
결론적으로는 눈에 보이는 매출을 낼 수 있는 2번으로 선택했다.
그래서 free app 중 설치 수, 리뷰 수, 평점 등으로 등급을 매기고 그 등급으로 상위 20%까지 짜른 다음,
그 앱을 좋아해주는 팬이 많은 앱들을 paid 로 가져오기로 했다.
그래서 polarity > 0 이고, subjectivity 가 중앙값인 0.56보다 큰 앱들을 paid로 전환 시키는 것을 고려하였다.
그래서 대시보드 2개를 만들어 하나는 전체적인 summary를 볼 수 있도록 구성하였고,
두번째 상세 대시보드에서 paid로 전환시킬 앱 리스트, 그리고 기대 매출 등을 넣었다.


사실 ppt 10-15장 정도를 준비하고, 발표 준비도 해야해서 금요일까지 대시보드는 무조건 완성해야 했다. 그래서 하루종일 대시보드만 만들었는데 생각보다 어려운 부분이 많았다.
우선 여기서 내가 맡은 부분은 현재 앱 유료 현황에 스코어 차트랑, 두번째 상세 대시보드에 있는 텍스트 차트, 불릿 차트 내용이었다.
스코어 차트는 쉬우니까 pass 하고 바로 상세 대시보드로 가보면, 우리가 원하는 등급제를 하기 위한 계산된 필드 식을 짜보았다.
등급, 총 점수 매겨서 전환될 리스트 뽑아내기
- install, reviews, rating을 각각 4분위로 나누어 1점 ~ 4점까지 준다 .
여기서 Fixed가 들어가는 이유는 percentile을 구하는 과정에서 전체의 0% ~ 25% 라는 게 앱의 전체 분포로 들어가야 하는데 Fixed를 끼지 않으면 그 앱의 install의 0~ 25가 나타난다. 예를 들어 앱의 설치 수가 100이면 25%가 단순시 25점이라고 계산된다.
그치만 우리가 원하는 것은 전체 앱의 분포이므로 저렇게 설정해주었더니 정상작동하였다.
IF { FIXED [App] : AVG([Installs2]) } >= { FIXED : PERCENTILE([Installs2], 0) }
AND { FIXED [App] : AVG([Installs2]) } < { FIXED : PERCENTILE([Installs2], 0.25) }
THEN '1'
ELSEIF { FIXED [App] : AVG([Installs2]) } >= { FIXED : PERCENTILE([Installs2], 0.25) }
AND { FIXED [App] : AVG([Installs2]) } < { FIXED : PERCENTILE([Installs2], 0.5) }
THEN '2'
ELSEIF { FIXED [App] : AVG([Installs2]) } >= { FIXED : PERCENTILE([Installs2], 0.5) }
AND { FIXED [App] : AVG([Installs2]) } < { FIXED : PERCENTILE([Installs2], 0.75) }
THEN '3'
ELSEIF { FIXED [App] : AVG([Installs2]) } >= { FIXED : PERCENTILE([Installs2], 0.75) }
AND { FIXED [App] : AVG([Installs2]) } <= { FIXED : PERCENTILE([Installs2], 1) }
THEN '4'
END
IF { FIXED [App] : AVG([Rating]) } >= { FIXED : PERCENTILE([Rating], 0) }
AND { FIXED [App] : AVG([Rating]) } < { FIXED : PERCENTILE([Rating], 0.25) }
THEN '1'
ELSEIF { FIXED [App] : AVG([Rating]) } >= { FIXED : PERCENTILE([Rating], 0.25) }
AND { FIXED [App] :AVG([Rating]) } < { FIXED : PERCENTILE([Rating], 0.5) }
THEN '2'
ELSEIF { FIXED [App] : AVG([Rating]) } >= { FIXED : PERCENTILE([Rating], 0.5) }
AND { FIXED [App] : AVG([Rating]) } < { FIXED : PERCENTILE([Rating], 0.75) }
THEN '3'
ELSEIF { FIXED [App] : AVG([Rating])} >= { FIXED : PERCENTILE([Rating], 0.75) }
AND { FIXED [App] : AVG([Rating])} <= { FIXED : PERCENTILE([Rating], 1) }
THEN '4'
END
IF { FIXED [App] : MIN([Reviews]) } >= { FIXED : PERCENTILE([Reviews], 0) }
AND { FIXED [App] : MIN([Reviews]) } < { FIXED : PERCENTILE([Reviews], 0.25) }
THEN '1'
ELSEIF { FIXED [App] : MIN([Reviews]) } >= { FIXED : PERCENTILE([Reviews], 0.25) }
AND { FIXED [App] : MIN([Reviews]) } < { FIXED : PERCENTILE([Reviews], 0.5) }
THEN '2'
ELSEIF { FIXED [App] : MIN([Reviews]) } >= { FIXED : PERCENTILE([Reviews], 0.5) }
AND { FIXED [App] : MIN([Reviews]) } < { FIXED : PERCENTILE([Reviews], 0.75) }
THEN '3'
ELSEIF { FIXED [App] : MIN([Reviews])} >= { FIXED : PERCENTILE([Reviews], 0.75) }
AND { FIXED [App] : MIN([Reviews])} <= { FIXED : PERCENTILE([Reviews], 1) }
THEN '4'
END
2. 점수를 다 합친다.
int([score_installs])+ int([score_rating]) + int([score_reviews])
3. 상위 20%을 골라낸다 .
{ FIXED [App] : AVG([Sentiment Polarity]) } > 0
AND
{ FIXED [App] : AVG([Sentiment Subjectivity]) } > 0.56
AND
[Total_score] >= 11
11보다 높은 것을 뽑는 이유는 총 점이 3~12점까지 분포되어 있기 때문에 상위 20%인 11점부터 뽑는 것이다.
* 이 리스트를 골라내는 것 중에 주의할 점이 있었다.
1. 우선 필터를 걸 때는 최대한 한 필드에 넣어야 한다.
만약 위 식에서 sentiment 관련식 따로, total score 관련식 따로 하여 두 개 필드를 필터에 넣고 참, 참 이렇게 한다면
제대로 안 먹히는게 나올지도 모른다. 왜냐하면 필터에는 우선순위라는게 있기 때문이다. 그렇기 때문에 같은 우선순위에 있어야 하는 제약 조건이라면 한 필드에 넣어서 필터를 걸어주어야 한다.
2. fixed를 걸어야 할 경우인지 확인해야 한다.
만약 위 식에서 fixed를 하지 않고 sentiment polarity >0 인것, subjectivity가 0.56 이상인 것 이렇게 설정한다면 우리가 원하는 것처럼 앱마다 전체 평균을 내어서 이 기준에 맞추는 것이 아니라, 그 앱의 리뷰가 0.56이하인걸 빼고 그 앱의 평점을 낸다.
만약 확인해보지 않았다면 그냥 이대로 낼 수도 있는 아주 치명적인 실수를 했을지도 모른다.
그래서 아래처럼 같은 앱이지만 다른 지표를 가져오게 된다
1. 해당 앱의 전체 평균 polarity, subjectivity

2. 앱으로 고정하지 않고 단순 필터를 꼈을 때

예상 기대 수익 보여주기
- 우선 예상 수익을 아래 식으로 구했다.
[카테고리별 예상 수익]
SUM(IF [Type] = 'Free'
AND
{ FIXED [App] : AVG([Total_score]) }>= 11
and
{ FIXED [App] : AVG([Sentiment Polarity]) } > 0
and
{ FIXED [App] : AVG([Sentiment Subjectivity]) } > 0.56
THEN (0.99 * [Installs2] * [전환 유저 비율] * 0.15) END)
* 전환 유저 비율은 우리가 현재 설치한 유저 수에서 n%가 전환되는 경우에 따라서 어떻게 변할지를 보여주기 위해 parameter로 설정하였다.
2. 그리고 우리는 앞으로 벌 수익 + 현재 카테고리에 얼마 벌고 있는지를 보여줄 것이므로 둘을 더한다.
[카테고리별 예상 수익] + SUM([Total Sales])
3. 불릿 차트를 만든다.

현재는 1%가 전환될 경우의 수익인데, 저 비율을 조정해가며 예상 수익을 알 수 있다.
아래는 전환 유저 비율이 10%일 경우!

아직 .. 갈길이 멀지만 ㅠㅠ 그래도 차트 내용은 다 만들었습니다.
근데 차트 다시 보다가 오류를 발견함.
type :free Context filter 낄 때랑 안낄때랑 값이 다른데 로우 데이터로 보면 안 낀게 맞음.. 흠
이유가 무엇인지 모르겠다..
일단 대시보드 구성 시에는 안 낀거로 하면 맞아서 그대로 하면 되는데 왜인지를 모르겠어서 한번 깊게 파봐야겠다.
* 유데미 큐레이션 바로가기 : https://bit.ly/3HRWeVL
* STARTERS 취업 부트캠프 공식 블로그 : https://blog.naver.com/udemy-wjtb
본 후기는 유데미-웅진씽크빅 취업 부트캠프 4기 데이터분석/시각화 학습 일지 리뷰로 작성되었습니다.