>RE::VISION CRM

R 데이터 분석

:: retail data preparation and EDA 연습 과제

YONG_X 2015. 7. 6. 09:01

:: retail data preparation and EDA 연습 과제

================


[1] subclass중 구매고객수가 가장 많은 것은?


[2] 재구매주기가 가장 짧은 class는 무엇인가?


[3] class별 1일 100불 이상 구매건이 가장 많은 것은? 


[4] 온라인에서 구매가 가장 많은 dept는?


[5] 주말의 일평균 구매가 주중보다 많은 item은?


[6] 구매고객수가 많은 요일은 언제인가?


[7] 월말과 월초에 구매가 집중되는 현상이 있는가?


[8] 월별 구매고객수의 편차가 가장 큰 class는?


[9] 온라인과 오프라인 구매 금액 합계를 월별로 구하라


#-----------


[10] 구매고객수가 가장 많은 3개 dept에 대하여 분기별 50불이상 구매 고객수를 산출하라


[11] 1회구매에서 수량이 가장 많은 class는?


[12] 1개월에 1000불 이상 구매한 다음달에 구매액이 평균보다 낮아지는 현상이 있는가?


[13] 구매건수 상위 10% 고객과 20% 고객이 가장 많이 구매하는 상품리스트 Top 5는?


[14] 금액이 많은 고객 10%와 구매 빈도가 높은 고객 10%간에는 어떤 특성 차이가 있는가?


#------------


:: retail data preparation and EDA 연습 과제

================


[1] subclass중 구매고객수가 가장 많은 것은?


[2] 재구매주기가 가장 짧은 class는 무엇인가?


[3] class별 1일 100불 이상 구매건이 가장 많은 것은? 


[4] 온라인에서 구매가 가장 많은 dept는?


[5] 주말의 일평균 구매가 주중보다 많은 item은?


[6] 구매고객수가 많은 요일은 언제인가?


[7] 월말과 월초에 구매가 집중되는 현상이 있는가?


[8] 월별 구매고객수의 편차가 가장 큰 class는?


[9] 온라인과 오프라인 구매 금액 합계를 월별로 구하라


#-----------


[10] 구매고객수가 가장 많은 3개 dept에 대하여 분기별 50불


이상 구매 고객수를 산출하라


[11] 1회구매에서 수량이 가장 많은 class는?


[12] 1개월에 1000불 이상 구매한 다음달에 구매액이 평균보


다 낮아지는 현상이 있는가?


[13] 구매건수 상위 10% 고객과 20% 고객이 가장 많이 구매하


는 상품리스트 Top 5는?


[14] 금액이 많은 고객 10%와 구매 빈도가 높은 고객 10%간에


는 어떤 특성 차이가 있는가?




[ day of week in R  ]


http://stackoverflow.com/questions/921613


8/find-the-day-of-a-week-in-r



#=====================================


=====



tr01 <- read.csv("tb_tr01.csv")

sku01 <- read.csv("sku_mast01.csv")


require(sqldf)


[1] subclass중 구매고객수가 가장 많은 것은?


q11 <- sqldf('select count(distinct a.customer_id) as ncust,

b.sk_subclass_id, b.subclass_name 

from tr01 as a left join sku01 as b

on a.sk_item_id = b.sk_item_id

group by b.sk_subclass_id')


q11[order(q11$ncust),]


df01 <- tail(q11[order(q11$ncust),], 5 ) 


plot(q11[-order(q11$ncust),"ncust"])


# LEFT JOIN만 먼저 실시

q12 <- sqldf('select a.*, b.sk_subclass_id,

b.subclass_name

from tr01 as a left join sku01 as b

on a.sk_item_id = b.sk_item_id')


# GROUP BY를 이어서 실시

q13 <- sqldf('select sk_subclass_id,

subclass_name,

count(distinct customer_id) as ncust

from q12

group by sk_subclass_id ')


is.na(head(q13$subclass_name) )

#===========


head(sku01$sk_subclass_id[order(sku01$sk_subclass_id)],3)


tail(sku01$sk_subclass_id[order(sku01$sk_subclass_id)],3)


[2] 재구매주기가 가장 짧은 class는 무엇인가?


[ 5704908 ]번 고객의 구매주기는?

1. [ 5704908 ] 번의 tr만 추출


q21 <-sqldf('select * from tr01

where customer_id=5704908')

nrow(q21)


tr01$d_date <- as.Date(as.POSIXct(tr01$d_date, 


origin='1960-01-01',tz="UTC"))


2. 구매한 날짜의 리스트만 추출


q22 <- sqldf('select distinct d_date 

from q21 order by d_date')


q23 <- sqldf('select customer_id,

count(distinct d_date) as ndays

from tr01

group by customer_id')


head(q23[order(-q23$ndays),],2)



q24 <- sqldf('select max(d_date) as maxddate,

min(d_date) as minddate

from q22')


q24$dateasd <- as.Date(q24$maxddate, origin='1960-01-


01') 

# 날짜 타입변경 check!


#----------------------


[ 5704908 ]번 고객의 구매주기는?

(q22$d_date[nrow(q22)]  - q22$d_date[1] )/(nrow(q22) -1 )


# 전체고객의 구매주기를 고객별로


q25 <- sqldf('select distinct customer_id, d_date 

from tr01

group by customer_id, d_date

order by customer_id, d_date ')


q25 <- sqldf('select distinct customer_id, d_date 

from tr01

order by customer_id, d_date ')



q25$d_date <- as.character(q25$d_date)


q26 <- sqldf('select customer_id,

min(d_date) as minddate,

max(d_date) as maxddate,

count(distinct d_date) as ndays

from q25

group by customer_id ')


q26$minddate <- as.Date(q26$minddate)

q26$maxddate <- as.Date(q26$maxddate)

q26$datediff <- as.numeric(q26$maxddate - 


q26$minddate)


q26$avg_rpcycle <- ifelse( q26$ndays>1, q26$datediff / 


(q26$ndays-1), NA)


plot(sort(q26$avg_rpcycle))


# 고객단위가 아니라, Class 별로 계산해야하므로

# sk_class_id, customer_id, d_date 

q31 <- sqldf('select a.customer_id, a.d_date,

b.sk_class_id

from tr01 as a left join sku01 as b

on a.sk_item_id=b.sk_item_id ')


q31$d_date <- as.character(q31$d_date)


q32 <- sqldf('select sk_class_id, customer_id,

min(d_date) as minddate,

max(d_date) as maxddate,

count(distinct d_date) as ndays

from q31

group by sk_class_id, customer_id 

order by sk_class_id, customer_id 

')


q32$minddate <- as.Date(q32$minddate)

q32$maxddate <- as.Date(q32$maxddate)

q32$datediff <- as.numeric(q32$maxddate - 


q32$minddate)


q32$avg_rpcycle <- ifelse( q32$ndays>1, q32$datediff / 


(q32$ndays-1), NA)


q32 <- q32[order( - c(q32$sk_class_id, q32$avg_rpcycle) ),]


tail(q32$avg_rpcycle,10)


nrow( q32[is.na(q32$avg_rpcycle),])


q33 <- sqldf('select sk_class_id, avg(avg_rpcycle) as 


avg_rpcycle

from q32

where avg_rpcycle is not null 

group by sk_class_id ')


plot(sort(q33$avg_rpcycle))


[4] 온라인에서 구매가 가장 많은 dept는?


q41 <- sqldf('select b.sk_department_id,

b.department_name,

count(distinct a.sk_transaction_id) as ntrx,

avg(t_item_amt_sale) as avg_amt

from tr01 as a left join sku01 as b

on a.sk_item_id=b.sk_item_id

where a.channel_id=on"

group by b.sk_department_id ')


q42 <- head(q41[order(-q41$ntrx),], 10)



require(lubridate)

weekdays(Sys.Date())


plot(q42$ntrx, q42$avg_amt)

text(q42$ntrx, q42$avg_amt, q42$department_name,  adj 


= c( 0, 1 ), col="blue) )



[5] 주말의 일평균 구매가 주중보다 많은 item은?


require(lubridate)

tr01$wday <- weekdays(tr01$d_date)

tr01$is_wend <-ifelse(tr01$wday=="토요일" | 


tr01$wday=="일요일", "weekend", "weekday")


q51 <- sqldf('select sk_item_id, 

is_wend,

count(distinct d_date) as ndays

from tr01

group by sk_item_id, is_wend

order by sk_item_id, is_wend ')


q52 <- sqldf('select distinct sk_item_id

from tr01')


q53 <- sqldf('select a.*, b.ndays as ndays_wd

from q52 as a left join (select * from q51 

  where is_wend = "weekday") as b

on a.sk_item_id=b.sk_item_id ')


q54 <- sqldf('select a.*, b.ndays as ndays_wend

from q53 as a left join (select * from q51 

  where is_wend = "weekend") as b

on a.sk_item_id=b.sk_item_id ')




 q55 <- q54

 # 주중일평균건수

 q55$ndays_wda <- q55$ndays_wd/5

# 주말일평균건수

 q55$ndays_wenda <- q55$ndays_wend/2

# 주말대비주중 비율 = 주말 / 주중

 q55$ndays_rdaynend <- q55$ndays_wenda/ 


q55$ndays_wda


q56<- tail(head(q55[order(- q55$ndays_rdaynend),],200),6)

# q56<- head(tail(q55[order(- 


q55$ndays_rdaynend),],200),6)


q57 <- sqldf('select a.sk_item_id, b.sku_description,

a.ndays_rdaynend

from q56 as a left join sku01 as b

on a.sk_item_id=b.sk_item_id' )