반응형
PART04.2장 R 프로그래밍 기초(데이터마트)
- 데이터 마트
- 데이터 웨어하우스와 사용사 사이 중간층에 위치
- 요약 변수
- 분석에 맞게 종합한 변수
- 데이터 마트의 기본적인 변수로 총 구매금액, 금액 등 데이터 분석을 위해 만들어지는 변수
- 많은 모델에 공통으로 사용될 수 있어서 재활성이 높다
- 얼마 이상이면 구매하더라도 기준값의 의미 해석이 애매할 수 있기에, 연속형 변수를 그룹핑해 사용하는 것이 좋다
- 파생변수
- 특정 조건을 만족하거나 특정 함수에 의해 값을 만들어 의미를 부여한 변수
- 주관적일 수 이기에, 논리적 타당성을 갖추어 개발
- 세분화, 고객 행동 예측, 캠페인 반응 예측에 활용
- 상황에 따라 특정 상황에만 유의미하지 않게 대표성을 나타나게 할 필요가 있다.
reshape library
install.packages("reshape")
library(reshape)
data("airquality")
head(airquality)
head(airquality, 10) # head에 출력되는 row수를 지정
names(airquality) # 변수명 보기
[1] "Ozone" "Solar.R" "Wind" "Temp" "Month" "Day"
aqm = melt(airquality, id=c("Month", "Day"), na.rm=T)
head(aqm)
- melt(data, id)
- id에 지정한 변수를 기준으로 나머지 변수를 variable 변수에 변환
- 녹이는 함수
a <- cast(aqm, Day ~ Month ~ variable)
a
- cast(data, x축~y축~변수)
- 엑셀 피벗과 유사
- 만드는 함수
- cast(data, x축+추가 변수~y축+추가 변수, func)
b<- cast(aqm, Month ~ variable, mean)
b
- x축 month, y축 variable, mean 함수 적용
c <- cast(aqm, Month ~ .| variable, mean)
c
- variable 별로 분리 출력
d <- cast(aqm, Month ~ variable, mean, margins=c("grand_row", "grand_col"))
d
- 소계 옵션
- subset
e <- cast(aqm, Day ~ Month, mean, subset=variable=="Ozone")
# cast(data, x축~y축, 함수, subset 조건)
e
- range : min, max 동시 표현
- y축에 min은 "_X1", max는 "_X2" suffix
f <- cast(aqm, Day ~ variable, range)
f
- sqldf : sql 활용케 하는 라이브러리
install.packages("sqldf")
library(sqldf)
sqldf("select * from iris")
plyr
- plyr : 데이터를 분리하고 처리한 다음, 다시 결합하는 등 데이터 처리 기능 제공
- apply함수와 multi-core 사용 함수 이용하면 for loop 없이 빠르게 처리 가능
- apply 함수에 기반해 데이터와 출력 변수를 동시에 배열로 치환하여 처리하는 패키지
- ply() 함수의 형태
- 첫 번째 문자는 입력 데이터 형태
- 두 번째 문자는 출력 데이터 형태
- d = 데이터 프레임, a = 배열, l = 리스트
input -> | 데이터 프레임 | 리스트 | 배열 | n replicates | function arguments |
데이터 프레임 | ddply | ldply | adply | rdply | mdply |
리스트 | dlply | llply | alply | rlply | mlply |
배열 | daply | laply | aaply | raply | maply |
nothing | d_ply | l_ply | a_ply | r_ply | m_ply |
set.seed(1) # 난수 생성 seed 고정
d = data.frame(year = rep(2012:2014, each=6), count=round(runif(9,0,20)))
# rep(2012:2014, each=6) 2012~2014 값을 각 각 6번 반복 => 총 18개
# runif 난수 생성 / runif(생성 난수 갯수, 최소값, 최대값)
d
library(plyr)
d
ddply(d, "year", function(x){
tempval.count = mean(x$count)
tempval2.count = sd(x$count)
tempval3 = tempval2.count / tempval.count
data.frame(cv_val = tempval3)
})
ddply(d, "year", summarize, mean_count=sum(count))
# summarize는 최종 결과만
ddply(d, "year", transform, mean_count=sum(count))
# transform은 결과에 사용된 변수도 표현
https://blog.naver.com/sw4r/222154367000
apply
https://blog.naver.com/gisookhyun/221856315114
[R]적용함수( apply, lapply, sapply, tapply, mapply)
apply 계열함수 -벡터, 행렬, 데이터프레임에 임의의 함수를 적용한 결과얻기 -벡터, 연산 수행 -> 수행...
blog.naver.com
데이터 테이블
- data.table : 데이터 프레임과 유사하지만 보다 빠른 그룹화와 순서화, 짧은 문장 지원에서 유리 / 64bit 환경에서 RAM이 많을 때 유리
- 행 번호가 출력됨
install.packages("data.table")
library(data.table)
DT = data.table(x=c("b", "b", "b", "a", "a"), v=rnorm(5))
DT
data(cars)
head(cars)
t_cars = data.table(cars)
head(t_cars)
tables() # 현재 메모리에 올라간 테이블들 조회
sapply(t_cars, class) # function 적용 list ov vector
lapply(t_cars, class) # function 적용 list
DT
DT[2,]
DT[DT$x=="a",]
- setkey : 키를 설정하면 order 가 됨
setkey(DT, x)
DT
tables()
DT["b"]
DT["b", ]
DT["b", mult="first"] # 첫번째꺼 조회
DT["b", mult="last"] # 마지막꺼 조회
head(DT["b"])
- data.frame과 data.table 비교
- table을 사용하면 binary search를 이용해서 속도는 빨라진다.
- 하지만, 데이터 프레임처럼 사용하면 binary search를 하지 않아 동일해진다.
ceiling(1e7/26^2)
grpsize <- ceiling(1e7/26^2) # 천만개의 행과 676개 그룹
grpsize
tt <- system.time(DF <- data.frame(
x=rep(LETTERS, each=26*grpsize),
y=rep(letters, each=grpsize),
v=runif(grpsize*26^2),
stringsAsFactors = FALSE
))
tt
head(DF)
tail(DF)
dim(DF) # 행, 열 갯수 조회
tt <- system.time(ans1 <- DF[DF$x=="R" & DF$y=="h",])
tt
DT1 <- data.table(DF)
tables()
# 테이블 변수로 변환해서
DT <- data.table(DF)
setkey(DT, x, y)
ss <- system.time(ans2 <- DT[J("R", "h")]) # binary search, 약간 join 조건?
head(ans2)
head(ans1)
ss2 <- system.time(ans3 <- DT[DT$x == "R" & DT$y == "h"])
ss2
mapply(identical, ans2, ans3)
- data.table summary
head(DT)
DT[, sum(v)]
DT[, sum(v), by=x] # sum을 x 기준으로
ttt <- system.time(tt <- tapply(DT$v, DT$x,sum)) # tapply, DT$v를 DT$x 기준으로 sum 적용
ttt
head(tt)
sss <- system.time(ss <- DT[, sum(v), by=x])
sss
sss <- system.time(ss <- DT[, sum(v), by="x,y"])
head(ss, 5)
변수 중요도 및 구간화
- 변수 중요도
- 변수 선택법과 유사한 개념
- 종류
- klaR
- 특정 변수가 주어졌을 때 클래스가 어떻게 분류되는지에 대한 에러율 계산, 그래픽으로 결과
- greedy.wilks() : 세 번 화를 위한 stepwise forward 변수 선택을 위한 패키지, 종속변수에 가상 영향력을 미치는 변수를 wilks lambda를 활용하여 변수의 중요도를 정리
* Wilk's Lamda = 집단내 분산/총 분산
- klaR
install.packages("klaR")
library(klaR)
head(iris)
iris2 <- iris[, c(1,3,5)]
head(iris2)
plineplot(Species ~., data=iris2, method="lda", x=iris[,4], xlab="Peter.Width")
# Species 별로 iris2데이터를 이용해 lda 메소드 사용, iris[,4] -> peter.width 변수 기준
- 변수 구간화
- 연속형 변수를 분석 목적에 맞게 활용하기 위해 구간화
- 구간화 방법
- binning
- eg. 변수를 오름차순 정렬 후 각각 동일한 개수의 레코드를 50개의 깡통(bin)에 나누어 담고 각 깡통의 부실률을 기준으로 병합하면서 최종 5~7개의 깡통으로 부실률의 역전이 생기지 않게 합치면서 구간화 - 의사결정 나무
- 여러 번의 분리기준 사용으로 연속 변수가 반복적으로 선택될 경우, 각각의 분리기준값으로 연속형 변수를 구간화 할 수 있다.
- binning
728x90
'데이터분석 > ADP' 카테고리의 다른 글
4장-01. 통계분석의 이해 (0) | 2022.06.08 |
---|---|
PART04.2장 R 프로그래밍 기초(결측값 처리와 이상값 검색) (0) | 2022.06.08 |
PART04.2장 R 프로그래밍 기초(함수) (0) | 2022.06.03 |
PART04.2장 R 프로그래밍 기초(그래픽기능) (0) | 2022.06.03 |
PART04.2장 R 프로그래밍 기초(자료구조) (0) | 2022.06.03 |
댓글