본문 바로가기
데이터분석/ADP

PART04.2장 R 프로그래밍 기초(데이터마트)

by Mr.꾸 2022. 6. 3.
반응형

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() 함수의 형태
      1. 첫 번째 문자는 입력 데이터 형태
      2. 두 번째 문자는 출력 데이터 형태
      3. 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)


변수 중요도 및 구간화


  • 변수 중요도
    • 변수 선택법과 유사한 개념
    • 종류
      1. klaR
        - 특정 변수가 주어졌을 때 클래스가 어떻게 분류되는지에 대한 에러율 계산, 그래픽으로 결과
        - greedy.wilks() : 세 번 화를 위한 stepwise forward 변수 선택을 위한 패키지, 종속변수에 가상 영향력을 미치는 변수를 wilks lambda를 활용하여 변수의 중요도를 정리
        * Wilk's Lamda = 집단내 분산/총 분산
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 변수 기준

  • 변수 구간화
    • 연속형 변수를 분석 목적에 맞게 활용하기 위해 구간화
    • 구간화 방법
      1. binning
        - eg. 변수를 오름차순 정렬 후 각각 동일한 개수의 레코드를 50개의 깡통(bin)에 나누어 담고 각 깡통의 부실률을 기준으로 병합하면서 최종 5~7개의 깡통으로 부실률의 역전이 생기지 않게 합치면서 구간화
      2. 의사결정 나무
        - 여러 번의 분리기준 사용으로 연속 변수가 반복적으로 선택될 경우, 각각의 분리기준값으로 연속형 변수를 구간화 할 수 있다.
728x90

댓글