본문 바로가기
R

20. 데이터 마트 - 1

by #Glacier 2018. 11. 21.
반응형

오늘은 데이터마트 개념에 대해서 알아볼 텐데요~! 데이터마트 음 어렵죠. 저도 처음 볼 땐 생소했습니다.

그럼 개념이 뭘까 한번 알아볼까요~

# 데이터 마트를 알아보는 이유?

-데이터 분석을 위해서는 분석기법에 맞게 데이터의 상세한 소스 정보와 가공된 분석용 데이터 셋(data set)이 필요하다. 

 이러한 자료가 DW에서는 Data mart로 주제별로 정리되어 있는 경우가 많으며, 

 빅데이터 분석에서도 이와 같은 형태로 변경해서 활용해야 한다. 

 변경하는 이유는 성능의 문제가 아니라 알고리즘에서 필요로 하는 데이터 형식을 충족시키기 위해서이다.


-빅데이터라고 해서 데이터 마트 없이 그대로 사용하여 데이터 마이닝의 classification model 등의 분석을 수행할 수 있는 것은 

 아니며, 가장 변경이 적은 association analysis도 목적에 맞게 데이터를 가공하여 변수를 선택하거나 데이터를 요약하는 일이 

 발생한다.


1. 분석 마트 구축 개요

 1) 과거 동향

 방법 : 분석을 위한 데이터 가공을 SQL 등의 별도 데이터 처리 프로그램으로 작업

 애로사항 : 작업과정의 복잡성, 오류 수정에 오랜 시간과 노력이 필요.


TIP) 분석용 마트를 만들기 위해 전문 ETL(Extraction Transformation Loading) 또는 

 ETT(Extraction Transformation Transportation)를 위한 전문 상업용 도구를 사용하면 GUI 환경에서 손쉽게 작업을 할 수 있지만

비용이 매우 높다. 특히 데이터 소스 시스템별로 프로그램을 설치해야 되므로 라이센스가 큰 부담으로 작용한다. 

그래서 보통 SQL이나 전문적인 프로그램을 작성해서 데이터를 처리하게 되는데, 이러한 과정에서 수작업 코딩으로

   인한 오류가 많고, 분석요구사항에 대한 부족한 이해로 반복적인 수정보완작업이 소요된다. 

   특히 성능상의 문제가 발생되기 쉬웠기 때문에 튜닝작업이 필연적으로 발생되어 관리가 어려웠고, 

   오류가 발생한 경우의 재작업에 대한 처리나 incremental한 처리 등이 복잡한 측면이 있다.


 2) 최근 동향

 방법 : 상용 분석 도구와 R 모두, 간단한 표준화된 방식으로 분석용 데이터 마트 구축 자동화 방법 제공

 장점 : 작업시간 단축 및 정확성 제고로 전반적인 업무 효율성 향상 등

 R에서의 마트 구축 패키지 : reshape, sqldf, plyr, data.table 등


TIP) 최근에는 빅데이터까지 포함한 다양한 오픈소스들이 있어서 비용적인 문제는 해결되었지만 

 이를 다룰 수 있는 기술력이 필요하기 때문에 장애요소가 일부 존재한다. 

 그러나 HBASE, HIVE 등에서 데이터를 처리하고 이에 대한 명령어를 R에서 DBMS에 전송하는 방식을 이용하면 

 메모리 제약을 넘어서 빠른 속도로 데이터 처리가 가능해진다. 

 특히 ETL에 대한 오픈소스 빅데이터 처리 도구가 있어도 분석자의 요구사항을 제대로 이해하기 힘들기 때문에,

 분석자는 분석 프로그램 환경에서 코딩하는 것이 더 효율적일 수 있다. 

 더욱 중요한 것은 모든 일이 순차적으로 완료되는 것이 아니라 분석하는 중간에도 마트를 변경해야 하는 일이 많다. 

 따라서 분석자가 유연하게 작업할 수 있는 점에서 분석도구 내에서 코딩을 하고 DBMS에서 부하를 갖고 처리하는

    방식은 매우 좋은 접근방법이다. 

     단, 해당 시스템에 대한 이해 및 코딩을 분석자가 해야 한다는 부담은 있으나, 분석적 관점을 개발자에게 이해시키기 위한

    문서화나 커뮤니케이션 노력을 고려한다면 직접 분석자가 다루는 것이 더 좋은 방법인 경우가 많다.


# 이 이후는 제가 조금 섞고, 덧붙여서 정리해봤습니다.


2. 마트를 구성하는 변수는 크게 주체에 대한 기본정보로 고객이면 고객 ID, 성, 연령 같은 사회인구통계정보와, 

  요약변수 및 파생변수로 구성된다.

# 인구통계학적 정보들은 고객이 어느 연령대이고, 성별은 무엇이며, 지역은 어디 사는지 등이 나와있는데 

  이것은 분석 목적에 따라서 알맞게 이용할 수 있습니다.

  따라서 우리 제품이 어느 연령대에 인기가 있는지, 남성, 여성중에 어느 쪽이 더 선호하는지, 

  어느 지역에서 많이 구매했는지 이런 식으로 분석 목적에 맞게 사용할 수 있고, 요약변수와 같은 기간별 구매 금액, 횟수, 여부 같은

  것들을 이용해서 소비패턴을 알아내 예측하거나 소비 수준 등을 알 수 있죠.

  이런 것을 굉장히 잘 이용하는 아마존같이 어느 물건을 구매하면 그에 따른 다른 제품들을 혹 할만큼 잘 소개시켜 준다던가, 

  뭐 이런 분야에서 사용할 수 있겠죠.

  파생변수는 주관적인 변수로서, 

  의미를 부여한 변수로서 영화감독 지수와 같이 영화감독에 따른 영화관람객수 예측에 사용할 수도 있죠.

  여러분이 잘 아실만한 빅맥지수(각국의 통화가치가 적정 수준인지 살피기 위해 각국의 맥도널드 빅맥 햄버거 현지 통화가격을 

  달러로 환산한 가격)도 어떻게 보면 의미를 부여한 파생변수라고 할 수 있죠. 

  물가수준을 비교하는 구매력평가로서 이용할 수 있으니까요!


3. Reshape()함수

 -melt와 cast를 이용한 데이터 변경

 -melt(선택한 id column에 대해 변수명과 값으로 해체하여 저장-Table구조를 column-wise데이터구조로 전환)

  cast(원하는 형태와 function을 이용해 data를 요약함)


4. Reshape함수 사례

# tips 데이터는 한 웨이터가 몇 개월간 tip을 받은 정보를 기록한 data라고 합니다.


install.packages("reshape")
library(reshape)

data(tips)

head(tips)


  total_bill  tip    sex smoker day   time size
1      16.99 1.01 Female     No Sun Dinner    2
2      10.34 1.66   Male     No Sun Dinner    3
3      21.01 3.50   Male     No Sun Dinner    3
4      23.68 3.31   Male     No Sun Dinner    2
5      24.59 3.61 Female     No Sun Dinner    4
6      25.29 4.71   Male     No Sun Dinner    4


# 이렇게 팁데이터에 보면 총 계산금액과, 팁, 성별, 흡연여부, 해당요일, 시간대, size(인원수?) 변수가 있는 것을 알 수 있습니다.

tips$no<-1:nrow(tips)

#melt를 이용해서 id를 기준으로 나머지 변수는 variable과 value로 나누어 분해합니다. na.rm은 아시다시피 결측행값을 다 지워버립니다~

tips_melt <- melt(tips, id=c("no", "sex", "smoker", "day", "time"), na.rm=TRUE)

head(tips_melt, 2)


  no    sex smoker day   time   variable value
1  1 Female     No Sun Dinner total_bill 16.99
2  2   Male     No Sun Dinner total_bill 10.34


# 위에서처럼 id를 지정해서 melt를 하면 해당 변수들은 유지가 되고, 나머지 변수들은 variable값으로 들어가고, 변수들의 값은 value에 들어가게

  되는 형식으로 표준화 합니다.

# 구조를 한번 보구요~ variable에 total_bill, tip, size가 들어가있습니다.

 str(tips_melt)

'data.frame':   732 obs. of  7 variables:
 $ no      : int  1 2 3 4 5 6 7 8 9 10 ...
 $ sex     : Factor w/ 2 levels "Female","Male": 1 2 2 2 1 2 2 2 2 2 ...
 $ smoker  : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ day     : Factor w/ 4 levels "Fri","Sat","Sun",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ time    : Factor w/ 2 levels "Dinner","Lunch": 1 1 1 1 1 1 1 1 1 1 ...
 $ variable: Factor w/ 3 levels "total_bill","tip",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ value   : num  17 10.3 21 23.7 24.6 ...


table(tips_melt$variable)

total_bill        tip       size 
       244        244        244


#이제 cast해보겠습니다. cast는 위에서 나왔듯이, 원하는 형태로 data요약을 합니다.

tips_cast_time<-cast(tips_melt, time~variable, mean)
tips_cast_time
    time total_bill      tip     size
1 Dinner   20.79716 3.102670 2.630682
2  Lunch   17.16868 2.728088 2.411765


#요렇게 시간~variable(total_bill, tip, size)를 평균으로 요약이 되죠~

# cast(사용할data, row변수~column변수, function)이렇게 함수를 사용할 수 있습니다.

# 즉 우리는 tips_melt데이터를 사용하고, Row로는 Time으로 구분되었고, Column은 variable항목으로 구분되었고 평균으로 나타내졌죠.


TIP) cast는 OLAP도구에서 일정의 pivoting 기능으로 좌측과 상단에 변수를 가져다 놓고, 이에 대한 기준으로 변수의 평균이나 다양한 통계값을 보여주는

      역할을 한다. 이를 이용해서 id별로 생성한 데이터르 저장하면 마트를 간단히 생성할 수 있다. 중요한 점은 이렇게 만들어진 변수들에 대한 이름을

      자동으로 생성하기 때문에 사람이 개입해서 변수명을 잘못 만들어서 중복되거나 이후 처리에서 문제가 생기는 경우를 방지할 수 있다.


#위에서는 mean으로 했는데, 다른 함수와 함께 사용하고 싶으면, c(mean, length) 이런 식으로 해주면 됩니다.

#예시로 진행해서 빠르게 넘어가도록 하겠습니다.


cast(tips_melt, time~variable, c(mean, length))

    time total_bill_mean total_bill_length tip_mean tip_length size_mean
1 Dinner        20.79716               176 3.102670        176  2.630682
2  Lunch        17.16868                68 2.728088         68  2.411765
  size_length
1         176
2          68


#이렇게 평균과 length도 사용 하여 몇 개(몇 번)인지 알 수도 있죠.


# 이번 에는 좀 더 유용하다고 볼 수 있겠죠~?요일~variable~시간으로 하여서 나타내면 이렇게 자세하게 볼 수 있습니다.


 cast(tips_melt, day~variable~time, c(mean, length))


, , time = Dinner

      variable-result_variable
day    total_bill-mean total_bill-length tip-mean tip-length size-mean
  Fri         19.66333                12 2.940000         12  2.166667
  Sat         20.44138                87 2.993103         87  2.517241
  Sun         21.41000                76 3.255132         76  2.842105
  Thur        18.78000                 1 3.000000          1  2.000000
      variable-result_variable
day    size-length
  Fri           12
  Sat           87
  Sun           76
  Thur           1


, , time = Lunch

      variable-result_variable
day    total_bill-mean total_bill-length tip-mean tip-length size-mean
  Fri         12.84571                 7 2.382857          7  2.000000
  Sat          0.00000                 0      NaN        NaN       NaN
  Sun              NaN               NaN 0.000000          0       NaN
  Thur        17.66475                61 2.767705         61  2.459016
      variable-result_variable
day    size-length
  Fri            7
  Sat            0
  Sun            0
  Thur          61
 

#점심 저녘에 따른 요일별로도 볼 수 있습니다!


# 3차원 결과

 cast(tips_melt, day~ . |variable, mean)


$total_bill
   day    (all)
1  Fri 17.15158
2  Sat 20.44138
3  Sun 21.41000
4 Thur 17.68274

$tip
   day    (all)
1  Fri 2.734737
2  Sat 2.993103
3  Sun 3.255132
4 Thur 2.771452

$size
   day    (all)
1  Fri 2.105263
2  Sat 2.517241
3  Sun 2.842105
4 Thur 2.451613


#위와 같이 3차원으로 지정하면 결과가 3차원이므로 한 번에 나타내지 못하고, 3번째 차원을 하나씩 바꿔가며 table로 나타냅니다.

#list함수와 비슷해 보이지만 data구조는 list와 달리 변수 column이 3개가 있고, 값 column이 하나가 있다고 보면 됩니다.


# 마지막 행과 열에 해당 함수를 적용한 결과를 표시하는 옵션

cast(tips_melt, day~variable, mean, margins=c("grand_row", "grand_col"))

    day total_bill      tip     size    (all)
1   Fri   17.15158 2.734737 2.105263 7.330526
2   Sat   20.44138 2.993103 2.517241 8.650575
3   Sun   21.41000 3.255132 2.842105 9.169079
4  Thur   17.68274 2.771452 2.451613 7.635269
5 (all)   19.78594 2.998279 2.569672 8.451298
#즉 마지막 행에 총평균이 나타나있죠!?


#데이터의 일부분만을 이용해 요약하는 방법

cast(tips_melt, day~time, mean, subset=variable=="tip")
   day   Dinner    Lunch
1  Fri 2.940000 2.382857
2  Sat 2.993103      NaN
3  Sun 3.255132      NaN
4 Thur 3.000000 2.767705


#variable의 tip만을 이용해 평균을 냅니다.


#range를 이용해 min과 max를 산출하는 방법.

cast(tips_melt, day~variable, range)

   day total_bill_X1 total_bill_X2 tip_X1 tip_X2 size_X1 size_X2
1  Fri          5.75         40.17   1.00   4.73       1       4
2  Sat          3.07         50.81   1.00  10.00       1       5
3  Sun          7.25         48.17   1.01   6.50       2       6
4 Thur          7.51         43.11   1.25   6.70       1       6


#X1이 min값, X2가 max값으로 변수가 만들어집니다.


#위에서 cast로 만든 다양한 내용들을 동일한 id 변수들에 의해 생성했다면  cbind함수를 이용해 id를 기준으로 column을 결합하면 몇 개의 cast로

  수십 개에서 수백 개의 변수를 결합한 마트를 쉽게 생성 할 수 있습니다.


#오늘은 데이터마트에 대해 알아보고, reshape패키지 내의 cast와 melt를 사용하였는데요~

 다음 시간에는 데이터마트 패키지인 sqldf, plyr, data table에 대해 이어서 알아보겠습니다~~
 

반응형

'R' 카테고리의 다른 글

22. 데이터 가공  (2) 2018.11.21
21. 데이터마트 - 2  (2) 2018.11.21
19. 주성분 분석(Principal Component Analysis, PCA)  (5) 2018.11.21
18. 다차원척도법 (Multidimensional Scaling, MDS)  (4) 2018.11.21
17. 시계열 분석-2  (0) 2018.11.21