티스토리 뷰

반응형

Data Table(데이터 테이블)




데이터 테이블은 성능과 관련해서 중요한 개념입니다. 


Table 구조의 데이터의 특정 컬럼별 주소값을 갖는 index를 생성하여 key를 통한 연산 및 검색을 빠르게 수행


데이터 색인 혹은 연산 시 인덱스를 설정한 테이블과 설정하지 않은 테이블의 성능 차이가 데이터가 방대해질 수록 커지기 때문에 대용량의 데이터 처리를 위해 인덱스는 필수! 입니다.



데이터 테이블(data table) : 인덱스(목차) 설정이 가능한 데이터 프레임



Key별로 가지고 있는 주소값을 통해 저장공간을 효율적으로 색인(인덱싱)할 수 있습니다.


데이터 테이블은 찾고자 하는 정보 기반으로 주소를 저장하기 때문에, 조건 연산 수행 시 가장 빠른 특징이 있습니다.

특히, key를 통한 조건 검색(색인), key를 통한 그룹 연산, key를 통한 정렬 에 빠른 성능을 가지고 있습니다.


> install.packages("data.table")

> library(data.table)


data.table::data.table(..., column = value,    # 컬럼과 값 지정

                              stringsAsFactors = T) # 문자열 팩터 저장 여부


as.data.table(data)    # 데이터 프레임을 데이터 테이블 형태로 변환


tables()   # 생성된 테이블 정보


> iris_table <- as.data.table(iris)

> iris_table      # 데이터 프레임과 다르게 행 번호가 key 형식입니다.

     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species

  1:          5.1         3.5          1.4         0.2    setosa

  2:          4.9         3.0          1.4         0.2    setosa

  3:          4.7         3.2          1.3         0.2    setosa

 ---                                                            

149:          6.2         3.4          5.4         2.3 virginica

150:          5.9         3.0          5.1         1.8 virginica   




데이터 테이블(data table)의 색인


# 데이터 테이블의 색인 방법은 데이터 프레임 색인과 동일하게 적용

> iris_table[1,]      # row 색인

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1:          5.1         3.5          1.4         0.2  setosa 

 > iris_table[,Species]     # column 색인 (벡터로 출력)

  [1] setosa     setosa     setosa     setosa     setosa     setosa  ....

> iris_table[,'Species']      # column 색인 (데이터 테이블로 출력)

       Species

  1:    setosa

  2:    setosa

 ---          

149: virginica

150: virginica

> iris_table[Sepal.Length > 3,]

     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species

  1:          5.1         3.5          1.4         0.2    setosa

  2:          4.9         3.0          1.4         0.2    setosa

 ---                                                            

149:          6.2         3.4          5.4         2.3 virginica

150:          5.9         3.0          5.1         1.8 virginica

> iris_table[,Species == 'setosa']

  [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE ....




데이터 테이블(data table)의 그룹 연산


# 그룹 연산 (세 번째 인자 by에 그룹지을 변수 설정, 여러개일 경우 계속 나열)

> iris_table[, mean(Sepal.Length), by = 'Species']

      Species    V1

1:     setosa 5.006

2: versicolor 5.936

3:  virginica 6.588

> iris_table[, mean(Sepal.Length), by = 'Species,Petal.Width']

       Species Petal.Width       V1

 1:     setosa         0.2 4.972414

 2:     setosa         0.4 5.300000

...

10: versicolor         1.6 6.100000

11: versicolor         1.0 5.414286

...

26:  virginica         1.6 7.200000

27:  virginica         1.4 6.100000




데이터 테이블(data table)의 Key 설정


data.table::setkey(x,      # 데이터 테이블

                         ...)    # key로 사용할 컬럼


> setkey(iris_table, Species)

> tables()  

         NAME NROW NCOL MB                                                      COLS          KEY

1: iris_table  150    5  0 Sepal.Length,Sepal.Width,Petal.Length,Petal.Width,Species    Species

Total: 0MB




Q.

### 1. table 생성

> iris_big <- c()

> for (i in 1:1000 ) {

     iris_big <- rbind(iris_big, iris)

   }

> nrow(iris_big)

[1] 300000


### 2. key 설정(중요)

> library(data.table)

> iris_big_table <- as.data.table(iris_big)   # as.data.table 구조로 변경 

> setkey(iris_big_table, Species)  # Species 값별 주소를 갖는 index 저장(종별 색인 목적)


### 3. 속도 테스트

## 3-1) iris_big의 종별 평균 수행(data frame 구조)

> library(plyr)

> ddply(iris_big, .(Species), summarise, m1 = mean(Sepal.Length),

                                                      m2 = mean(Sepal.Width))

     Species    m1    m2

1     setosa 5.006 3.428

2 versicolor 5.936 2.770

3  virginica 6.588 2.974

> system.time(ddply(iris_big, .(Species), summarise, m1 = mean(Sepal.Length),   # system.time 함수로 시간 측정

                                                                       m2 = mean(Sepal.Width)))

 사용자  시스템 elapsed 

   0.02    0.00    0.02


## 3-2) iris_big_table의 종별 평균 수행(table 구조)

> ddply(iris_big_table, .(Species), summarise, m1 = mean(Sepal.Length),

                                                              m2 = mean(Sepal.Width))

     Species    m1    m2

1     setosa 5.006 3.428

2 versicolor 5.936 2.770

3  virginica 6.588 2.974

> system.time(ddply(iris_big_table, .(Species), summarise, m1 = mean(Sepal.Length),  # system.time 함수로 시간 측정

                                                                               m2 = mean(Sepal.Width)))

 사용자  시스템 elapsed 

   0.01    0.00    0.01           


# 데이터가 방대하지 않아서 결과에 큰 차이는 없어 보이지만, 데이터가 커질 수록 성능 차이도 커진답니다 !!




참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday