>RE::VISION CRM

R 데이터 분석

0702 빅Labor .... 주제

YONG_X 2015. 7. 3. 09:05

[ 복습 ]

1. 데이터 처리에서 기억해야할 ... 잘틀리는 부분 정리

2. 기본적인 그래프 작성 구문 정리


[ retail ] ... 새로운 변수의 추가 생성

- 변수목록 도출

- 변수 생성


[탐색적 분석 EDA ]

개념, 사례 ... retail 예제에 적용


[Business Understanding]

====>>> "여름에 어떤 고객에 집중할까?"

* 조단위 진행

- 변수목록 도출 (5개 신규 )

- 변수생성 (2개 이상)

- 탐색적 데이터 분석 --> 그래프 2장

- BU 문서화 (목표, 상황, 계획) 각 1page ppt 16 point



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

복습 1. 데이터 처리에서 기억해야할 ... 잘틀리는 부분 정리


read.csv(“crashes.csv”)

read.csv(“roads.csv”)


df1 <- crashes[ quantile(crashes$N_Crashes, 0.5)<crashes$N_Crashes, ]


df1 <- crashes[ which(quantile(crashes$N_Crashes, 0.5)<crashes$N_Crashes) , ]


df2 <- crashes[, c(1:2)]

df2 <- crashes[, c(1:2, 4)]


factor 를 character로 취급하고 계산하고 있었으나, 값이 다르게 나옴

**  as.character() 로 먼저 변환 후 처리


특정 컬럼을 지정해서 그 컬럼의 명칭을 변경하기


특정컬럼 지정 – 순서로 지정

names(df2[3])


names(df2[“Volume”])


특정컬럼 지정 – 컬럼이름으로 지정

names(df2[c("Volume", "Year")])


이름변경

names(df2)[3] <- "Volume1"

names(df7)[names(df7)=="Road"] <- "road"



집계 – aggregate()


df3 <- aggregate(crashes$Volume, by=list(crashes$Road), FUN=sum)

names(df3) <- c(“Road”, “Volume”)


[외우기] 

aggregate by list  ===>  ABL


merge by c() ===> MBC



df301 <- aggregate(crashes$Volume, by=list(crashes$Road), FUN=mean)


*** FUN 에서 sum, mean, max, min  활용가능

***  FUN= 이라는 표현은 생략 가능



두 테이블 결합


df4<- merge(crashes, roads, by=c(“Road”))


디폴트는 Inner Join(교집합)

df5<- merge(crashes, roads, by=c("Road"), all.x=FALSE, all.y=TRUE)


all.x=FALSE, all.y=TRUE 옵션 설정으로 방식 변경 가능



빈칸 처리 -- NA 확인 후 값 변경


df6<-aggregate(crashes$N_Crashes, by=list(crashes$Road), mean)

df7 <- merge(roads, df6, by=c("Road"), all.x=TRUE)


is.na(df7$mean_Crashes)

df7$is_crashinfo <- 0

df7$is_crashinfo <- ifelse( !is.na(df7$mean_Crashes),1, df7$is_crashinfo)


정렬 :: - 는 내림차순

df8 <- df7[order(-df7$is_crashinfo),]


자주 사용하는 그래프 정리

 

plot(df7$Length, main=”length of road”)

plot(df7$Length, type=”b”, col=”grey”)

컬러는 “red”, “grey”, “blue”, “green”
선그래프는 l(line), 점과  모두는 b(both)
lines(df7$Length+2, type="b", col="red")
 
내림차순 정렬된 분포 생성
plot(df7$Length[order(- df7$Length)], main="length of road")
 
 
 plot(df7$Length,df7$mean_Crashes)
 abline(lm(df7$mean_Crashes~df7$Length), col="red")
 단순선형회귀를 통해서 식을 구함
Plot 두번째 컬럼이 Y 자리에
 

카테고리별 단순 크기 시각적 비교에 활용 

dotchart(roads$Length,labels=roads$Road)

분포를 구간별로 비교 
boxplot(crashes$Volume~crashes$Year,data=crashes)
  
점이 많은 경우 밀집된 영역이 구분되지 않는 문제를 피하기 위해 열지도 형식의 플롯 작성
require(gplots)
 df8 <- df7[!is.na(df7$mean_Crashes), ]
NA 포함되면 오류 발생, NA 미리 처리 필요
 ci2d(df8$Length,df8$mean_Crashes)
  
 다른 밀집도 분포 확인용 그래프
install.packages("hdrcde")
require(hdrcde)
 hdr.boxplot.2d(crashes$N_Crashes, crashes$Volume)

# 밀집도 등고선 구간 지정

 hdr.boxplot.2d(crashes$N_Crashes, crashes$Volume, prob = c(50, 75, 90), main="crashes against traffic volume by road")

# 회귀선 추가
abline(lm(crashes$Volume~crashes$N_Crashes), col="red")



 



 

 


후보변수 목록 도출 연습 ::
names(q70)
 
"amt2003" ~ "amt_sale" ,   
"ndays", "maxdsale"   
 .... 그리고?
 
어느 상품군을 구매했는가?
온라인, 오프라인 다이용하는가?
구매간격이 짧아지고 있나?

마지막으로 구매한지 얼마나 지났는가?

tr01$d_datea <- as.Date((tr01$d_date)) df73 <- sqldf('select customer_id, max(d_datea) as maxddate from tr01 where year="2002" group by customer_id ') df73$maxddate <- as.Date((df73$maxddate)) df73$DaysfromLastP <- as.Date("2002-12-31") - df73$maxddate q71 <- merge(q70, df73[,c(1,3)], by=c("customer_id"), all.x=TRUE) )



얼마나 많은 상품군을 샀나?

# 몇개 클래스를 구매했나?
q72 <- sqldf('select distinct customer_id, sk_item_id 
from tr01 where year="2002" ')
q73 <- sqldf('select a.*, b.sk_class_id
from tr01 as a left join sku01 as b
on a.sk_item_id=b.sk_item_id ')
q74 <- sqldf('select customer_id, count(distinct sk_class_id) as nclass
from q73
group by customer_id')
q75 <- merge(q71, q74, by=c("customer_id"), all.x=TRUE) 
nrow(q75[is.na(q75$nclass),])
t1 <- ctree(q75$amt2003~q75$ndays+q75$amt_sale+q75$maxdsale + q75$DaysfromLastP 
+q75$nclass, data=q75, controls = ctree_control(maxdepth = 3, mincriterion = 0.95, 
minsplit = 50) )
plot(t1)

# 클래스별 구매고객수와 구매금액

q80 <- sqldf('select b.sk_class_id, b.class_name, 

count(distinct a.customer_id) as ncust, 

sum(a.t_item_amt_sale) as sumamt 

from tr01 as a left join sku01 as b

on a.sk_item_id=b.sk_item_id 

where a.year="2002"

group by b.sk_class_id' )


q81 <- q80[!is.na(q80$class_name),]

plot(q81$ncust, q81$sumamt)