본문 바로가기

DataAnalytics/R

R로 안드로이드M 타겟단말검증 목록 만들기... 삽질기...

Choosing Apps for Android M frandly test in Dec.

요즘에 가능하면 엑셀을 R로  대체해서 써보려는 노력을 하고 있다.  R코드를 잘 못다룬다는 점을 생각하면 갈길이 멀지만; 

잘하는 능력자들을 보면 추출한 데이터를 빠르게 로드하고, 조인하고, 컬럼 추가(mutate) 을 슉슉하는데... 엑셀의 진행바를 멍청하게 쳐다보는 내가 바보인 것 같아보였다. 마침 맥용 엑셀 2016버전이 내 맥북에어에서 매우 거지같은 퍼포먼서를 보여주길레.. 이참에 R로 해보는 것이 괜찮겠다.. 라고 결심하고 써보기로 했다. 


그래서 도전을 하기로 한 것은 'OS타겟단말 검증'이라는 것이다. 새로운 OS와 기준단말(예를 들어 갤럭시노트5)가 출시를 하면 OneStore의 상품들이 새로운 OS에서 모두 잘 동작하는지를 샘플검증을 하게 되어 있는데.   매년 한두번씩은 모든 App/game 상품 목록을 받아서, 2~3천개 짜리 샘플 상품 목록을 만들고.. 인력을 투입해서 검증을 하고 있다. (수작업이다!)

작년까지는 이 작업을 모두 엑셀노가다로 했는데;; 수십만줄의 데이터를 다루다 보니깐 엑셀이 느려지고 난리가 나서.. 내 기억에 하루가 넘게 꼬박 목록추출에만 시간을 썼다. 그리고 올해는 R스튜디오로 작업을 해봤다. 결과는.....? 하루면 될 것이 대충 일주일은 걸린 것 같다;;; 그렇다. 익숙하잖은 일을 하다보니깐 스택오버플로우를 계속 찾아보고 주변에 담당자에게 물어보고 난리를 치면서 작업을 했다; 

구글 플레이에 R관련 책이 있어서 길에 다운을 받았는데, 도움을 좀 받았다.


[물론 책을 산다고 실력이 늘지는 않는다;; 난 이 글을 작성하는 순간에도 아래 코드를 까먹고 있다. ]

 

library(dplyr)
library(stringr)
library(XLConnect)
library(ggplot2)
library(tidyr)

일단 라이브러리는 위와 같이 선언했습니다. 아래 코드에는 없지만 엑셀에서 데이터를 불러오거나, 그래프를 그려보기도 했다. (쓸데 없이 시간시간;;)

# 2일 기준으로 데이터를 추출했다. 
# 추출한 데이터를 raw로 만들고, 하나의 데이터 프레임에 합쳤다 (AID 기준)

cms.raw <- read.csv("data/20151202_ICMS-APP_모든상품_리스트.csv", fileEncoding = 'UTF-8') %>% rename( AID = aid)
trans.raw <- read.csv("data/20151202_ICMS-APP_모든상품_매출정보.csv", fileEncoding = 'UTF-8')

tstore <- trans.raw %>% 
  inner_join(cms.raw, by='AID') %>% 
  mutate(총.매출액 = str_replace_all(총.매출액, ',', '') %>% as.numeric %>% ifelse(is.na(.), 0, .)) %>% 
  mutate(다운로드수 = str_replace_all(다운로드수, ',', '') %>% as.numeric %>% ifelse(is.na(.),0,.)) %>% 
  group_by(AID) %>% 
  summarise(매출액 = sum(총.매출액), 다운로드 = sum(다운로드수), 상품명 = min(상품명.y), 카테고리 = min(카테고리), 판매상태 = min(판매상태), 인앱버전 = max(부분유료.인앱버전)) %>%
  arrange(-매출액)

01. 인앱 매출 상위 상품 리스트에 추가

  • 초기 데이터셋: 139043개
  • 매출이 일정이상 이상되는 판매중 상품중 인앱결제 버전 3이상만 포함 
  • 521개 상품 매칭, 138522개 상품은 아직 raw에 있음
match <- tstore %>% filter(매출액 > #기준 매출액#[각주:1], 판매상태 == '판매중', 인앱버전 ==3) %>% mutate(기준='1. 부분유료 매출액 기준')
review_list <- match
tstore <- tstore %>% anti_join(match, by='AID')

02. 일반 유료 매출 상위 상품 리스트에 추가

  • 인앱이 없는 상품(인앱버전이 0인) 중 매출이 000 만원 이상되는 판매중 상품은 목록에 추가
  • 308개 상품 매칭, 138214개 상품은 아직 raw에 있음
match <- tstore %>% filter(매출액 > #기준 매출액#, 판매상태 == '판매중', 인앱버전 == "0") %>% mutate(기준='2. 일반 유료 매출액 기준')
review_list <- rbind(review_list, match) tstore <- tstore %>% anti_join(match, by='AID')

03. 다운로드 상위 상품 리스트에 추가

  • 기간내 다운로드가 0000개 이상되는 판매중 상품은 목록에 추가
  • 인앱버전이 3또는 0인 것만 포함
  • 336개 상품 매칭, 137878개 상품은 아직 raw에 있음
match <- tstore %>% filter(다운로드 > #00000# , 판매상태 == '판매중', 인앱버전 %in% c('0','3')) %>% mutate(기준='3. 다운로드수 기준')
review_list <- rbind(review_list, match)
tstore <- tstore %>% anti_join(match, by = 'AID')

04. 남은 상품중에서 카테고리별 다운로드 상위 상품을 따로 추가

  • 총 293 상품 맵핑 / 아직 137585개 상품은 raw에 있음
library(tidyr)

tstore <- tstore %>% separate(카테고리, c('메인카테고리', '서브카테고리'), sep = '>')
match <- tstore %>% group_by(메인카테고리) %>% arrange(-다운로드) %>% filter(판매상태 =='판매중', 인앱버전 %in% c('0','3'), row_number() < 100) %>% mutate(기준='4. 카테고리 다운로드수 기준')

review_list <- review_list %>% separate(카테고리, c('메인카테고리', '서브카테고리'), sep='>')
review_list <- rbind(review_list, match)
tstore <- tstore %>% anti_join(match, by = 'AID')

05. 기타: 퍼미션 정보를 가져오기

15개 이상의 퍼미션을 사용하는 ‘앱’ 상품에 대하서 카테고리별로 최대 20개까지 추출함 149개 상품 추출, 아직 137436개 상품은 raw에 있음

permission.raw <- read.csv("data/CMS-APP_게임제외_판매중인_상품의_퍼미션_53070.csv", fileEncoding = 'UTF-8')
permission <- permission.raw %>% mutate(퍼미션수 = str_count(퍼미션, ",")) %>%
  group_by(AID) %>% 
  summarise(퍼미션수 = max(퍼미션수), 퍼미션 = min(퍼미션))%>%
  arrange(-퍼미션수)

match <- tstore %>% inner_join(permission, by="AID") %>% arrange(-퍼미션수) %>% filter(인앱버전 %in% c('0','3'), 판매상태=='판매중') %>% group_by(메인카테고리) %>% arrange(-퍼미션수) %>% filter(판매상태 =='판매중', 인앱버전 %in% c('0','3'), row_number() < 50) %>% mutate(기준='5. 퍼미션수 기준') 
match <-  subset(match, select=c('AID', '매출액', '다운로드','상품명', '메인카테고리','서브카테고리','판매상태', '인앱버전', '기준'))

review_list <- rbind(review_list, match)
tstore <- tstore %>% anti_join(match, by = 'AID')

06. 인앱버전 상관없이 매출 상위 상품 추출

  • 인앱버전 상관없이 카테고리별로 매출 상위상품을 최대 100개씩 추출함
  • 총 344개 상품, 아직 raw에 137092개 있음
match <- tstore  %>% group_by(메인카테고리) %>% arrange(-매출액) %>% filter (판매상태 == '판매중', row_number() < 100) %>% mutate(기준='6. 인앱버전 상관없는 카테고리별 매출 상위  ')
review_list <- rbind(review_list, match)
tstore <- tstore %>% anti_join(match, by='AID')

07. 인앱버전 상관없이 다운로드 상위 상품 추출

  • 인앱버전 상관없이 카테고리별로 매출 상위상품을 최대 100개씩 추출함
  • 총 338개 상품, 아직 raw에 136754개 있음
match <- tstore  %>% group_by(메인카테고리) %>% arrange(-다운로드) %>% filter (판매상태 == '판매중', row_number() < 100) %>% mutate(기준='7. 인앱버전 상관없는 카테고리별 다운로드 상위  ')
review_list <- rbind(review_list, match)
tstore <- tstore %>% anti_join(match, by='AID')

08. 판매상태 상관없이 매출 및 다운로드 상위 50개씩 상품 추출

match <- tstore  %>% group_by(메인카테고리) %>% arrange(-다운로드) %>% filter (row_number() < 50) %>% mutate(기준='8. 판매상태 상관없는 카테고리별 다운로드 상위  ')

review_list <- rbind(review_list, match)
tstore <- tstore %>% anti_join(match, by='AID')

match <- tstore  %>% group_by(메인카테고리) %>% arrange(-매출액) %>% filter (row_number() < 50) %>% mutate(기준='7. 인앱버전 상관없는 카테고리별 매출 상위  ')

review_list <- rbind(review_list, match)
tstore <- tstore %>% anti_join(match, by='AID')

csv 추출

write.csv(review_list, '/Users/dusskapark/Desktop/review_20151209.csv')



  1. ..흠 흠 비공개 입니다. [본문으로]