※ 해당 내용은 ADP 준비를 위해 데이터 마트 부분을 학습하며 정리한 내용입니다.

 

. 데이터 마이닝에서의 모델링

  → 다양한 분석 기법을 적용해 모델을 개발하는 과정, 데이터 마트를 개발해 놓으면 효율적이고 신속한 모델링 가능.

 

. 데이터 마트

  → 데이터의 한 부분, 특정 사용자가 관심을 갖는 데이터들을 담은 비교적 작은 규모의 데이터 웨어하우스.

 

. [참고] 데이터 웨어하우스와 마트 비교

  → 사용자의 기능 및 제공 범위를 기준으로 구분함.

  → 웨어하우스=전체의 상세 Data / 마트=특정 사용자 대상, 웨어하우스에 있는 일부 Data

 

1. R reshape를 활용한 데이터 마트 개발

① reshape

 

 reshape는 데이터 재정렬을 위한 기법 중 하나, 비견될 수 있는 기법 중 밀집화가 있다.

 

 . [참고] 밀집화

  → 데이터를 축소하고, 재정렬 ( ex) Excel Pivot )

  → 밀집화는 데이터가 간단하게 표시되지만, 원본이 손실되고, reshape는 원본이 유지된다는 점에서 차이가 있다.

 

 . melt() & cast 함수

  → reshape 패키지로 melt(), cast()만을 사용하여 데이터를 재구성 or 밀집화된 Data를 유연하게 생성 가능

  → melt로 데이터를 녹여 유연하게 만든 후 피벗과 비슷한 cast로 모양을 잡아준다고 생각하면 됨.

library(reshape)

names(airquality)
names(airquality) <- tolower(names(airquality)) #소문자 변환

# id에 있는 변수를 기준으로
# 각변수 Variable이란 이름의 데이터로 만듬
# [참고] na.rm = 결측값 제거
aqm <- melt(airquality, id=c("month","day"), na.rm = TRUE)
aqm

# cast를 이용해 엑셀의 Pivoting을 하듯이 자료를 변환

# cast( data, y축~x축~값 )

a <- cast(aqm, day~month~variable)
a

mean을 적용해 평균값을 산출할 수도 있다.

b <- cast(aqm, month~variable, mean) # 월별 평균값 계산
b

|를 이용하여 산출물을 분리해 표시도 가능하다. ( 조회에 적합 )

c <- cast(aqm, month ~ .|variable, mean)
c

margin 함수로 행/열의 소계도 산출 가능

# 행과 열의 소계 산출
d <- cast(aqm, month~variable, mean, margins=c("grand_row", "grand_col"))
d

 

특정 변수만 처리하고자 할 때 subset 옵션을 추가

# 특정변수만 처리하고자 할 때
e <- cast(aqm, month~variable, mean, subset = variable=="ozone")
e

 

range 옵션을 추가하면 min, max를 동시에 표시해 준다

 

# min, max 표시 ( min=_X1 / max=_X2 )
f <- cast(aqm, month~variable, range)
f

 

2. sqldf를 이용한 데이터 분석

sql를 R에서도 사용할 수 있도록 하는 패키지, 단순히 sqldf 괄호 안에 SQL 언어를 입력하여 사용하면 됨.

 

data(iris)
sqldf("select * from iris limit 10") # head와 같은 기능 구현

 

3. plyr : 데이터 분리+처리 후 결합

 

ply 함수와 multi-core 사용 함수를 이용하면 for loop를 간단하고 매우 빠르게 처리 가능

 

ply() 함수는 앞에 두 개 문자를 접두사로 가진다.

 

첫 번째 문자=입력하는 데이터 형태, 두 번째 문자= 출력하는 데이터 형태

 

  [ 접두사(데이터형태) 종류 ]

  가. d = 데이터 프레임 ( data.frame )

  나. a = 배열 ( array )

  다. l = 리스트 ( list )

 

실습에 사용할 Data 생성

set.seed(1) # 난수 고정, 같은 난수를 생성하도록 해줌

# runif( 생성할 난수 개수, 최소값, 최대값)
d = data.frame(year = rep(2012:2014, each=6), count = round(runif(9,0,20)))
d

. ddply을 사용해 데이터 프레임을 입력받아 sd와 mean의 비율인 변동계수 cv 구하기

 → test 결과 Rcpp 패키지도 추가해 주어야 함

library(plyr)
library(Rcpp)

ddply(d, "year", function(x){
  mean.count = mean(x$count)
  sd.count = sd(x$count)
  cv = sd.count/mean.count
  data.frame(cv.count=cv)
})

 

 . transform, summarise 옵션

  → summarise 옵션 = 변수에 명령된 평균이나 합 등을 계산해 줌

  → transform 옵션 = summarise 옵션과 달리 계산에 사용된 변수도 출력

 

ddply(d, "year", summarise, mean.count = mean(count))

ddply(d, "year", transform, total.count = sum(count))

4. 데이터 테이블 ( Data Table )

데이터 테이블은 데이터 프레임과 우사하지만 보다 빠른 그룹화, 순서화, 짧은 문장 지원 측면에서 매력적

 

data.frame과 같은 방법으로 생성되나, 행 번호가 콜론(:)으로 표시

# rnorm(n) 함수는 정규분포에서 n개의 난수 생성
DT <- data.table(x=c("b","b","b","a","a"),v=rnorm(5))
DT

 

기존 data.frame을 data.table 형식으로 변환 가능하다.

CARS <- data.table(cars)

. data.frame과 data.table 차이점

 → 데이터 테이블 = 인덱스(목차) 생성이 가능한 데이터 프레임

 → 따라서 검색과 같은 작업을 할 때 성능의 차이점을 보인다.

 → [참고] 검색 시 data.frame은 하나하나 비교해 찾는 벡터 검색 방식 / data.table은 목차를 이용, 바이너리 검색

※ 해당 글은 R 기초를 복습하면서 작성한 자료입니다.

 

R의 데이터 구조

① 벡터: 하나의 스칼라값, 혹은 하나 이상의 스칼라 원소들을 갖는 단순한 형태의 집합.

   → c함수를 활용하여 선언 ( 하나의 Column=열 이라고 생각 )

x <- c(1, 10, 24, 40) #c함수를 이용하여 벡터 선언

 

②행렬: 행과 열을 갖는 m x n 형태의 직사각형에 데이터를 나열한 데이터 구조

  → [주의] 각 열이 같은 데이터 Type이여야 함

  → matrix 함수를 활용하여 선언

mx <- matrix(c(1,2,3,4,5,6), ncol=2)

  →[참고] rbind와 cbind를 사용해 벡터를 행렬에 합칠 수도 있다.

     ( rbind= 행 결합 / cbind= 열 결합 )

 

r1 <- c(10,20)
rbind(mx, r1) # row bind, 행 결합

c1<- c(20,20,20)
cbind(mx, c1) # Column bind, 열 결합

 

③ 데이터 프레임: 행렬과 유사한 2차원 목록 데이터 구조

  → [행렬과 차이점] 각 열이 서로 다른 데이터 타입을 가질 수 있음

  → data.frame 함수로 선언

income <- c(100,200,150)
car <- c("kia", "hyundai", "toyota")
marriage <- c(FALSE, TRUE, FALSE)

mydata <- data.frame(income, car, marriage)

 

외부 데이터 불러오기

 

① csv 파일 불러오기

 → read.table 함수를 이용하여 R에 Data frame 형태로 불러옴

data1 <- read.table("파일경로\파일명.csv", header=T,sep=",")

 → [참고] read.csv를 써도 무방, 대신 사용 시 sep=","로 구분자 구분 X

 

② txt 파일 불러오기

  → sep=","로 구분자 구분 X

data2 <- read.table("파일경로\파일명.txt", header=T)

 

③ xls/xlsx 파일 불러오기

  → 2가지 존재, csv파일 변환 후 불러오거나 패키지 이용

  → ex) RODBC 패키지 이용

library(RODBC)
new <- odbcConnectExcel("파일경로")
yourdata <- sqlFetch(new,"Sheet이름")
close(new)

 

R 기초 함수

① 수열 생성하기

  . rep(): 첫 번째 인수를 두 번째 인수만큼 반속하는 수자 벡터 생성

rep(1,3) # 1을 3번 반복하는 벡터 생성

  . seq(): 첫 번째 인수부터 두 번째 인수까지 1씩 증가하는 수열을 숫자 벡터 생성

    → [옵션1] by=n 으로 설정하면 n씩 증가하는 벡터 생성 가능

    → [옵션2] length=m 으로 설정하면 전체 수열의 갯수가 m개가 되도록 자동적으로 증가하는 수열 생성 

seq(1,5) # 1부터 5까지 1씩 증가하는 벡터 생성
seq(1,5,by=2) # by 옵션을 추가하여 2씩 증가하도록 변경
seq(1,5,length=7) # length 옵션을 추가하여 수열을 갯수 7개로 자동계산

 

② 기초적인 수치 계산

  . 사칙연산 ( +, -, *, / )

    → 사칙연산을 수행하고자 할 때 기본적으로 백터의 크기는 같아야 함.

 

   . 전치행렬과 행렬곱

    → 전치행렬= t함수 활용, 행렬곱 = %*% ( 행렬에 * 사용 시 단순히 스칼라 곱 반환 )

a <- c(2,7,3)
t(a) # a의 전치행렬
A <- a%*%t(a)

   . 역행렬

     → solve 함수 사용 ( 단, 정방행렬이어야 함. )

solve(mx) #mx의 역행렬 계산

   . 기초 기술 통계량 계산

    → mean(): 평균 / var(): 분산 / sd(): 표준편차 / sum(): 합 / median(): 중간값 / log(): 자연로그값

    → cov(): 공분산 / cor(): 상관계수 / sumary(): 사분위 수 계산 및 정보 요약

 

R 데이터 핸들링

b = c(1,2,3,4,5) 라는 벡터가 존재할 때,

 

① 벡터형 변수

  → b[2] : 2번째 원소에 해당되는 값만 불러옴

  → b[-4] : -를 붙이면 4번째 원소에 해당되는 값을 제외 후 불러옴

  → b[ c(2,3) ] : 벡터의 2, 3번째 위치 값을 선택

 

 ② 행렬/데이터 프레임 변수

  → 대괄호 안에 두가지 숫자가 추가될 뿐, 방식은 벡터형 변수와 동일.

mydata[3,2] # 3행 2열을 값을 불러옴
mydata[ ,2] # 2열의 값을 불러옴
mydata[4, ] # 4행의 값을 불러옴

 

  ③ 반복 구문과 조건문

 

   . For 반복문 : i값을 하나씩 증가시켜가며 중괄호 { } 안의 구문은 반복실행

a = c() # 아무런 값도 포함되지 않은 벡터 생성
for(i in 1:9){
  a[i] = i*i
}

    . while 반복문 : 괄호 ( ) 조건 하에서 중관호 { } 안의 구문을 반복

x=0
while( x<5 ){
  x=x+1
  print(x)
}

    . if ~ else 조건문: 특정 조건이 만족하는 경우 이후의 구문을 실행

StatScore <- c(10,11,2,14,11,9,7,15,6,7)
over10 <- rep(0,10)

# 10이상의 점수의 수 구하기
for(i in 1:10){
  if ( StatScore[i] >= 10) over10[i] = 1
  else over10[i] = 0
}
sum(over10)

 

    . 사용자 정의 함수: function()을 이용, 함수를 정의하여 사용 가능

addto <- function(a){
  isum = 0
  for(i in 1:a){
    isum = isum+i
  }
  print(isum)
}
addto(100)

 

기타 유용한 기능들

① paste() : 입력받은 문자열들을 하나로 붙여줌. ( 'sep=' 옵션을 통해 문자열 사이 구분자 추가도 가능 ) 

number <- 1:10
alphabet <- c("a","b","c")
paste(number,alphabet, sep=" to the ")

② substr() : paste와 반대로 주어진 문자열에서 특정 문자열을 추출함.

   → 해당 기능을 통하여 출력 결과를 간소화 할 수 있다.

country <- c("Korea", "Japan", "China", "Singapore", "Russia")
substr(country, 1, 3)

 

③ 자료형 데이터 구조 변환

  → 주어진 객체의 데이터 구조를 바꾸자 할 때 사용

  

   가. as.data.frame(x) : 데이터 프레임 형식으로 변환

   나. as.list(x) : 리스트 형식으로 변환

   다. as.matrix(x) : 행렬 형식으로 변환

   라. as.vector(x) : 벡터 형식으로 변환

   마. as.factor(x) : 팩터 형식으로 변환

 

④ 문자열을 날짜로 변환

  → as.Date로 변환, 표준형식은 바로 변환되지만, 임의 형식은 Format을 지정해주어야 함.

 

⑤ 날짜를 문자열로 변환

+ Recent posts