complete.cases() 결측치 제거

행 단위로 NA여부(누락된 데이터)를 체크하고, 행에 NA가 있을 경우 FALSE를 반환

내림차순 정렬(큰 수 -> 작은 수 순으로 정렬)

order(-데이터)


오름차순 정렬(작은 수 -> 큰 수 순으로 정렬)

order(+데이터)

as.integer() 숫자로 변경

>gsub(" ", "-", "123123 123123")

[1] "123123-123123"

세번째 인자에

첫번째 인자가 있다면

그것을 두번째 인자로 바꾸기



주석 처리/해제

ctrl + shift + c


함수 또는 R 소스파일의 내용보기

확인하려는 함수 또는 R 소스파일에 커서를 올리고 F2

데이터 분석을 이용한 게임 고객 모델링

 

1.     탐사분석

 예측 대상이 갖고 있는 패턴/특징 찾는 것.

 

ex '진성 유저 지표 프로젝트'의 경우, 진성 유저의 기준 정하기 위해 현재 유저의 패턴/활동 현황을 탐사.

 각 유저들의 플레이 시간과 레벨, 주 활동 지역 등의 분포를 보거나 좀 더 복잡하게는 직업별, 레벨별 잔존율이나 ARPU(*유저 1명이 특정 기간 동안 지출한 평균 금액)를 비교하거나 반대로 ARPU별 레벨 분포나 주 활동 지역, 보유 아이템 등을 확인하는 등

 

 데이터분석팀에서는 하둡(Hadoop/대용량 데이터 처리 기술)을 데이터웨어하우스(DW)로 운영할 수 있게 해주는 Hive라는 시스템을 이용해 분석가들이 데이터를 직접 추출하고 R에서 다양한 탐사 분석을 수행

 리눅스 명령어 라인 툴인 Bash shell도 활용. 분석가들이 좀 더 효율적으로 일하려면 서버에서 기본적인 데이터 처리 및 자동화를 직접 할 수 있어야 하기 때문.

 

 효과적인 탐사 분석을 위해서는 적절한 시각화가 매우 중요.

 

2.     예측 모델링

 데이터 마이닝 혹은 기계 학습이라고 하는 작업들이 여기에 해당

 

ex 진성 유저 지표 프로젝트의 경우, 유저들을 유형별로 분류하기 위한 분류 모델을 만드는 작업.

 예측 모델을 생성하고 그 성능을 측정하는 작업을 모두 R에서 수행.

 

3.     시스템 or 서비스 개발 단계

ex 진성 유저 지표 서비스를 예로 들자면, 먼저 유저들의 플레이 데이터를 예측 모델에서 사용할 수 있는 형태로 정제하는 데이터 전처리 모듈, 이 데이터로 각 유저들이 어떤 유형인지를 기계 학습을 통해 자동으로 분류하는 모듈, 분류 결과를 서비스하는 모듈을 만들게 되는데 이중 기계 학습 모듈을 R로 개발

 



'사회 연결망 분석(Social network analysis)’을 통해 고객의 특성을 파악하는 방법

 


사회 연결망 분석을 위해서는 먼저 게임 고객 간의 관계를연결망(or 네트워크)’이라 부르는 구조로 만들어야 합니다.

연결망은 보통노드라고 하는 여러 개의 개체를 연결한 것인데요, 흔히소셜 네트워크라고 하는 사회 연결망은 사람들이 사회적 관계를 통해 연결된 구조이죠.

온라인 게임에서 고객들은 다양한 사회적 관계를 맺습니다. 같은 혈맹에 속하기도 하고, 파티를 맺고 인던을 돌거나 아이템을 주고받는 상호 작용을 하죠.

그래서 이런 관계나 게임 활동을 분석하면 게임 고객 네트워크를 만들 수 있습니다.

보통 네트워크 분석을 할 때는 우리가 수학 시간에 배우는행렬로 네트워크 구조를 표현합니다.

예를 들어 네 명의 사람이 아래와 같이 연결돼 있으면, 이들을 행과 열에 놓고 두 사람 사이가 연결되어 있으면 1, 아니면 0으로 표시하는 것이죠.

한편 보통 네트워크는 여러 개의 작은 집단으로 나눌 수 있습니다. 위 그림에서는 각기 다른 색깔로 표현한 수백 개의 소집단으로 구분할 수 있죠.

이런 소집단은 같은 집단에 속한 노드 간의 연결선이 외부 노드와의 연결선에 비해 상대적으로 밀도가 높은데요.

이런 여러 개의 소집단이 모여서 전체 네트워크를 이룹니다이런 소규모 집단을커뮤니티라고 부르죠.

 각각의 커뮤니티는 저마다 다양한 네트워크 구조를 갖고 있습니다.

따라서 유사한 행동 패턴으로 고객들을 나누듯이, 커뮤니티 역시 비슷한 네트워크 구조를 갖는 것끼리 군집화할 수 있습니다.

이때 군집화를 위해 커뮤니티 구조가 얼마나 비슷한지 측정하려면, 우선 각 커뮤니티 구조를 나타내는 적절한 값을 구해야 하는데요.

Degree

Degree네트워크 상의 노드가 몇 개의 노드와 연결되어 있는지 나타내는 값입니다. , 노드에 연결된 선의 개수.

이때 개별 노드의 degree를 구한 뒤 커뮤니티 별로 노드의 degree 평균이나 표준 편차를 구하면 각 커뮤니티 구조의 차이를 아는데 도움이 됩니다.

또 서로 비슷한 degree를 갖는 노드끼리 연결되었느냐 차이가 큰 노드끼리 연결되었느냐를 측정하는 지표로 ‘degree assortativity(동질성)’라는 것이 있습니다.

아래 그림에서 왼쪽 커뮤니티는 비슷한 degree를 갖는 개체끼리만 연결되었기 때문에 이 수치가 높은 반면, 오른쪽 커뮤니티는 반대로 매우 낮은 값을 갖습니다.

Radius

우리말로 하면 반경인데요, 쉽게 말해 커뮤니티 내에서 가장 멀리 떨어진 개체 사이의 거리를 의미합니다.

이것 역시 네트워크 구조를 파악하는데 많이 사용하는 지표입니다.


이런 다양한 지표를 구해서 군집화를 하면, 마치 탄소 분자의 얽힘 구조를 보고 다이아몬드와 석탄을 구분하듯이 비슷한 커뮤니티끼리 분류할 수 있습니다.

아래 그림은 다양한 네트워크 지표를 기반으로 군집화 알고리즘을 사용해 게임 고객 네트워크를 다섯 가지 유형의 커뮤니티로 분류한 것입니다.

 



 

 

게임 고객을 유형별로 세분화한 자료를 어떤 식으로 활용할 수 있는지 활용 사례

 

심슨의 역설 (Simpson’s paradox)’

어떤 집단의 전체 통계량(예를 들어 평균)과 집단을 여러 개 그룹으로 나눠서 구한 통계량이 서로 반대되는 특성을 갖는 현상

 

게임 서비스를 운영할 때의 다양한 지표

활동 유저 (Active User, AU): 특정 기간 동안 게임에 접속한 총 유저수를 의미합니다. 보통 일단위, 주단위, 월단위로 집계를 하는데 게임의 인기도를 파악하는데 중요하게 사용하는 지표입니다.

동시 접속자 (Concurrent Connected User, CCU): 특정 시점에 게임에 접속해 있는 유저수를 의미합니다. 이 지표 역시 AU와 비슷하게 게임의 인기도와 밀접하게 관련된 지표입니다.

유저당 결제금액 (Average Revenue Per User, ARPU): 일정 기간 동안 집계된 총 결제 금액을 동일 기간의 AU로 나눈 지표입니다. 말 그대로 한 명의 유저가 얼마의 금액을 사용하는지를 나타내는 수치입니다.

결제 유저당 결제금액 (Average Revenue Per Paid User, ARPPU): 총 결제 금액을 결제를 한번이라도 한 유저수로 나눈 값입니다.

* ARPU ARPPU를 분리해서 측정하는 이유는 게임의 매출 특성을 좀 더 정확히 파악하기 위함입니다. 가령 ARPU는 낮은데 ARPPU가 매우 높게 나온다면 이 게임은 극소수의 충성도 높은 고객에 의해 대부분의 매출이 발생된다는 뜻입니다. 반대로 ARPU ARPPU의 차이가 크지 않다면 전반적으로 많은 수의 유저들이 고르게 매출을 발생시킨다는 의미가 되겠죠. 보통 F2P 기반의 모바일 게임이나 캐주얼 게임은 전자의 특성이 강하며 정액제 기반의 PC MMORPG는 후자의 특성이 강합니다.

 

데이터 시각화 도구: 게피 (https://gephi.org/)

출처: http://blog.ncsoft.com/?p=28906(즐거움으로 연결된 새로운 세상, 엔씨소프트-데이터 분석을 이용한 게임 고객 모델링 )


내맘대로 워드클라우드 만들어보기


#워드클라우드 패키지

> library(wordcloud)


> rwc <- read.csv("RandomWordCloud.csv")


#색상

> library(RColorBrewer)

> pal<-brewer.pal(8, "Dark2")



#폰트 변경할 수 있는 패키지

> install.packages("extrafont")

> library(extrafont)


> font_import() #y눌러 줘야함 | 컴퓨터에 설치된 폰트를 불러옴, 시간 오래 걸림

> loadfonts(device="win")


> windowsFonts(malgun=windowsFont("LG PC"))



> wordcloud(words=rwc$items, freq=rwc$num, scale=c(5, 1), rot.per=0.25, min.freq=5, random.order = F, colors = pal, family="LG PC")




RandomWordCloud.csv


R studio

엑셀 파일 불러와서 읽기


패키지 설치 및 불러오기

> install.packages("readxl")

> library(readxl)


작업 디렉토리 확인 후 그곳에 불러올 엑셀 파일 넣기

> getwd()

[1] "C:/Users/(사용자 이름)/Documents"


엑셀 불러와서 읽기

> ex<-read_excel("nail.xlsx")

> ex

1. 워드 클라우드


//패키지 설치

> install.packages("wordcloud")         //워드 클라우드 패키지

> install.packages("RColorBrewer")     //팔레트 패키지


//패키지 로딩

> library(wordcloud)

> library(RColorBrewer)


> pa12<-brewer.pal(8, "Dark2")         //Dark2 팔레트 생성


> x<-c("국민", "신한국사회", "민족", "정치", "문학")     //키워드

> y<-c(5, 4, 12, 5, 8)                                             //키워드의 빈도


> wordcloud(x, y, colors=pa12) //단어의 크기를 빈도수에 따라 Dark2 팔레트의 색으로 출력





2. 동전 던지기 시뮬레이션


> interation<-5000                      //시행 횟수


> plot(0, 0, xlab="동전 던진 횟수", ylab="앞면이 나오는 비율", xlim=c(0, interation), ylim=c(0 , 1))     

//xlab, ylab : 라벨, xlim, ylim : 크기


> abline(a=0.5, b=0, col="red")     //수학적 확률(b:기울기, a:y절편)


> sum<-0 //앞면이 나오는 횟수


> for(x in 1:interation){                 //x를 1부터interation(5000)까지 할당하면서 반복


+     y<-sample(c("front", "back"), 1, replace=T) //동전에서 한 면 추출


+     if(y=="front")                     //앞 면 나오면 앞면이 나오는 횟수에 1추가

+         sum=sum+1


+     prob<-sum/x                     // 동전을 던진 총 시행 횟수에 대한 앞면이 나온 비율


+     points(x, prob)                  // 시행 횟수와 비율을 그래프에 추가

+ }




1. 파이차트 


3시 방향을 기준으로 시작하며 시계 반대방향을 순서로 나타낸다.


> x<-c(9, 15, 20, 6)


> x

[1]  9 15 20  6


> label<-c("영업1팀", "영업2팀", "영업3팀", "영업4팀")


> label

[1] "영업1팀" "영업2팀" "영업3팀" "영업4팀"


> pie(x, labels=label, main="부서별 영업 실적")








2. 바 차트


> height<-c(9, 15, 20, 6)


> heignt

[1]  9 15 20  6


> name<-c("영업1팀", "영업2팀", "영업3팀", "영업4팀")


> barplot(height, names.arg=name, main="부서별 영업 실적", col=rainbow(length(height)), xlab="부서", ylab="영업실정(억 원)")










3. 에니메이션을 숫자 카운트다운 하기


> install.packages("animation") //에니메이션을 위한 패키지 설치

> library(animation) //패키지 로딩


> ani.options(interval=1) //1초 간격

> plot.new() //새로운 그래픽 프레임 출력


> for(i in 10:0) //i값을 10~0까지 1씩 감소

+ {rect(0, 0, 1, 1, col="yellow")  //그래픽 출력 영역 최대 설정, 색상은 노란색

+     text(0.5, 0.5, i, cex=5, col=rgb(.2,.2,.2,.7)) //0.5, 0.5 위치에서 i값 출력, cex - 글자 크기(5가 디폴트), rgb - 글자 색, alpha - 투명도 

+     ani.pause()}








4. 구글맵에 위치 나타내기


//패키지 설치

> install.packages("ggplot2")

> install.packages("RgoogleMaps")

> install.packages("ggmap")


//패키지 로딩

> library(ggplot2)

> library(RgoogleMaps)

> library(ggmap)


> names <- c("1.도담삼봉/석문", "2, 구담/옥순봉")

> names

[1] "1.도담삼봉/석문" "2, 구담/옥순봉" 


> addr<-c("충청북도 단양군 매포읍 삼봉로 644-33", "충청북도 단양군 단성면 월악로 3827")

> addr

[1] "충청북도 단양군 매포읍 삼봉로 644-33" "충청북도 단양군 단성면 월악로 3827"  


> gc<-geocode(enc2utf8(addr)) //주소지의 위도, 경도

> gc

       lon      lat

1 128.3433 37.00300

2 128.2560 36.93046


> df<-data.frame(name=names, lon=gc$lon, lat=gc$lat) //이름, 경도, 위도에 대한 항목명을 각각 name, lon, lat로 하는 데이터 프레임 만들기

> df

             name      lon      lat

1 1.도담삼봉/석문 128.3433 37.00300

2  2, 구담/옥순봉 128.2560 36.93046


> cen<-c(mean(df$lon), mean(df$lat)) //데이터 프레임에 있는 모든 경도, 위도에 대한 평균치

> cen

[1] 128.29964  36.96673


> map<-get_googlemap(center=cen, maptype="roadmap", zoom=11, marker=gc) //지도 중심을 위도, 경도 평균값으로 설정, marker : 각 위도, 경도에 마커 설정


> ggmap(map, fullpage=TRUE) //fullpage = TRUE :여백 없이 지도 출력






+ Recent posts