# 대량의 데이터 빠르게
library(data.table)
# 데이터 로드 - fread()로 data.frame 만들기
df <- fread('R-ggagi-data//example_conveniencestore.csv', encoding = 'UTF-8',
data.table = F)
head(df)
# 표본 만들기 - sample()
S <- df[sample(nrow(df), 5000), ]
str(S)
head(S)
# 분석 상품 선택 - 가장 많이 팔린 상품
sort(table(S$sellproduct)) # 가스큐팩 1.6리터(P)
# 가스큐팩 1.6리터(P) 의 시간당 판매 조사
# 날짜는 문자열 처리
library(stringr)
head(S$Date,3)
S$time <- str_split_fixed(S$Date, " ", 2)[,2]
S$hour <- str_split_fixed(S$time, ":", 3)[,1]
head(S, 5)
# 가스큐팩 1.6리터(P) 만 추출
library(dplyr)
# filter() : dplyr 에서 조건 주는 함수
S <- tbl_df(S)
S2 <- filter(S, sellproduct=='가스큐팩 1.6리터(P)')
# filter 사용 안 한다면 아래와 같이 가스큐팩 1.6리터(P) 만 추출 가능
S3 <- S[S$sellproduct == '가스큐팩 1.6리터(P)',]
head(S3)
S4 <- subset(S, subset = S$sellproduct == "가스큐팩 1.6리터(P)")
head(S4)
str(S2)
# 시간대별 도수
freq <- table(S2$hour)
freq
# 확률변수 X 선택
rv <- as.vector(freq)
rv <- rv[!duplicated(rv)] # 중복값 제거
rv <- sort(rv)
rv
# 확률변수별 비율
prv <- prop.table(rv)
prv
# 각각의 기댓값
exps <- rv*prv
exps
# 확률변수의 평균은 확률변수*확률(비율)의 총합
sum(exps)
# 이벤트 상품 목록 구하기 - 2000
eventlist <- c("구카카콜 250미리리터(캔)", "세계콘 170미리리터",
"딸기속우유 310미리리터(팩)", "조르지아오리지널 240미리리터(캔)",
"육개장사발탕면 86g(컵)", "카페라떼와일드 200미리리터(컵)",
"핫개컨디션파워 100미리리터(병)", "비타528 100미리리터(병)")
# 세트 판매 데이터 불러오기
event <- read.csv('R-ggagi-data//example_eventsale.csv', header=F)
event <- as.list(event) # 리스트 1개당 1세트로 처리
event <- lapply(event, as.character)
head(event, 3)
length(event)
# 2000개 팔렸다~
# 마진율 가져오기
# 데이터 적재
# fread() : data.table 패키지의 함수 (대용량 데이터 빠르게 읽어옴)
library(data.table)
DF <- fread('R-ggagi-data//example_conveniencestore.csv', encoding='UTF-8',
data.table=F)
# 1000개 샘플링
S <- DF[sample(nrow(DF),1000),]
# 상품별 요약
library(dplyr)
S2 <- S %>% filter(sellproduct == eventlist[1] | sellproduct == eventlist[2]
| sellproduct == eventlist[3] | sellproduct == eventlist[4]
| sellproduct == eventlist[5] | sellproduct == eventlist[6]
| sellproduct == eventlist[7] | sellproduct == eventlist[8]
) %>%
group_by(sellproduct) %>%
summarise(margin=min(margin)) %>% # 상품별 마진은 동일 max()도 동일
# mutate() : dplyr 패키지의 의 '열 추가' 함수
# 마진이 0.13 보다 크면 참(1), 거짓(0)
mutate(marginTF=ifelse(margin > 0.13, 1, 0))
S2
# 경우의 수 만들기
# 8개 중 6개, 중복 가능
library('gtools')
com <- combinations(length(eventlist), 6, eventlist, repeats.allowed = T)
nrow(com)
# 1716 개의 중복조합이 가능함
head(com, 3)
head(event, 3)
# 판매데이터와 사건 비교
# 236 첫번째 판매데이터로 236번째 조합
c <- NULL
for(j in 1: length(event)){
for(i in 1: nrow(com)){
if(all(event[[j]] %in% com [i,])){
c <- c(c,i)
break()
}
}
}
head(c, 10) # c 에는 몇번째 제품이 팔린 건지의 정보가 담겨있음
# 각 eventlist의 marginTF 값 적용
com2 <- com
for(i in 1: length(eventlist)){
com2[com == eventlist[i]] <- S2[S2$sellproduct == eventlist[i],]$marginTF
}
head(com2) # com 상품 코드표를 마진이 넘는지 안 넘는지 숫자로 표시
# com2 int로 형변환
com3 <- apply(com2, 2, as.integer) # 1 : 행(row)단위 / 2: 열(col) 단위
head(com3)
head(com, 3)
head(com[com == eventlist[1]])
head(com2[com == eventlist[1]])
# 확률변수 X = {0,1,2,3,4,5,6} (사건마다 마진이 있는 상품의 개수)
# 확률변수 X를 모두 더하기 rowSums
rv <- rowSums(com3) # 행의 값 더하기
head(rv) # 팔린 상품의 마진 TF
head(c) # 몇번째 상품이 팔린건지
# 확률마다 실제 판매된 제품 넣어서 도수 구하기
rv_table <- table(rv[c])
rv_table
addmargins(rv_table, margin = 1)
# 상대적 판매 비율 => 확률
rv_prop_table <- prop.table(rv_table)
rv_prop_table
# 시각화
library(ggplot2)
library(ggthemes)
# 시각화해야 하니까 data.frame에 넣어주기
rv_df <- as.data.frame(rv_table)
rv_df
ggplot(rv_df, aes(x=factor(Var1), y=Freq, fill=Var1)) +
geom_bar(stat='identity') # 데이터는 각각 표시
library(data.table)
# 데이터 로드
DF <- fread('R-ggagi-data//example_gamedata.csv', data.table=T)
head(DF, 1)
tail(DF, 1)
# memberID 376966 자세히 보기
library(dplyr)
DF2 <- tbl_df(DF)
DF2 %>% filter(memberID == 376966)
# memberID 376966 stage별 성공 / 실패
DF2 %>%
filter(memberID==376966) %>%
group_by(stage, success) %>%
select(success) %>%
summarise(count = n()) # 갯수 셀 때 쓰는 n()함수
# 모든 사람들의 성공 / 실패 구하기
SF <- DF2 %>%
group_by(stage, success) %>%
summarise(count=n())
SF
# 그래프 그리기
library(ggplot2)
library(ggthemes)
ggplot(SF, aes(x=factor(stage), y=count, colour=success, group=success)) +
geom_line(size=0.7) +
geom_point(size=4) +
ggtitle('A사의 B게임 스테이지별 성공여부') +
theme_wsj()
# 성공한 횟수만 따로 저장
SF2 <- SF %>% filter(success == T)
SF2
# 스테이지별 전체 횟수 구하기
SFT <- DF2 %>% group_by(stage) %>% summarise(total=n())
SFT
# 성공횟수와 전체 횟수 합치기
SF3 <- cbind(SF2, total=SFT$total)
SF3
# 스테이지마다 시도횟수, 성공횟수 -> 성공비율 구하기
SF4 <- SF3 %>% mutate(p = count/total)
SF4
# stage_03일 때(성공확률 p = 0.32740155)의 기하분포
x <- 1:15
y <- dgeom(x, 0.327)
plot(x,y,type='h')
# 기하분포 값을 자세히
round(y, 3) # 소숫점 세 자리 까지만 표시
# 한 번 실패 후 성공( 첫번째 값 )
0.327*(1-0.327)
# 누적 기하분포 확률값
pgeom(5, 0.327) # 5 :실실실실성 했을 때의 확률값
pgeom(4, 0.327) # 4: 실실실성 했을 때의 확률값
# 6번 실패하고 성공할 확률 90% 만들기
# 0.9 될 때의 확률 p값 구하는 함수 만들기
findp <- function(n,p){
for(i in 1:99){
a <- pgeom(n, 0.01*i)
if(a > p){
print(paste0('n값이 ', n, '일 때'))
print(paste0('p값 ', 0.01*0.1, '을 사용하면'))
print(paste0('확률 ', a, '이 나옵니다'))
break()
}
}
}
# 6번 만에 90%가 성공하는 p값
findp(6, 0.9)
# -> 게임 밸런스를 0.327에서 0.29로 조정하면 6번만에 90%가 성공하게 만들 수 있음
n = 6
for(i in 1:9){
a <- pgeom(n, 0.01*i)
print(paste0("n값이 ",n, "일 때"))
print(paste0("p값 " , 0.01*i, "을 사용하면"))
print(paste0("확률 ", a,"이 나옵니다"))
}