본문 바로가기

ADsP(데이터 분석 준전문가)/개념정리

[3-3. 데이터 마트] 1. 데이터 변경 및 요약

728x90

3장 데이터 마트
학습목표
• 데이터 마트를 구성하는 요약변수와 파생변수를 구분할 수 있다.
- 데이터 마트를 구성할 때 가장 중요한 부분 중 하나가 요약변수와 파생변수를 생성하 는 부분
- 요약변수 : 데이터를 특정 기준에 따라 사칙연 산을 통해 만들어 낸 변수
- 파생변수 : 사용자의 노하우를 기반으로 새롭게 만들 어 낸 변수

• reshape 패키지를 활용하여 데이터 마트를 생성할 수 있다.
reshape 패키지는 데이터 마트를 생성할 수 있도록 데이터를 녹이고(melt) 다시 형상화(cast)할 수 있는 R 패키지로, 분석용 마트 설계에서 잘 활용

• sqldf 패키지와 plyr 패키지를 활용하여 데이터를 핸들링할 수 있다.
-  R 프로그램에서도 SQL을 사용하기 위해 sqldf라는 패키지를 통해 SQL을 활용할 수 있다

• data.table 패키지를 이해하고 활용할 수 있다.
data.table 패키지는 dataframe 과 같은 구조를 가지고 있으나 key를 활용해서 훨 씬 빠른 연산이 가능하게 만든 패키지이다

1절. 데이터 변경 및 요약
1) R reshape를 이용한 데이터 마트 개발
1. 데이터 마트 
- 데이터 웨어하우스와 사용자 사이의 중간층에 위치
- 하나의 주제 또는 하나의 부서 중심의 데이터 웨어하우스라고 할 수 있다
- 데이터 마트 내 대부분의 데이터는 데이터 웨어하우스로부터 복제되지만, 자체적으로 수집될 수도 있다
- 관계형 데이터베이스나 다차원 데이터베이스를 이용하여 구축한다
- CRM 관련 업무 중에서 핵심 -> 고객 데이터 마트 구축
- 동일한 데이터 셋을 활용할 경우, 최신 분석기법 이용시 분석가의 역량에서 분석 효과가 크게 차이 나지 않음 
  → 데이터 마트를 어떻게 구축하느냐에 따라 분석 효과 차이

(*데이터마트를 만들 때 가장 중요한 데이터들은 데이터웨어하우스에서 받아오는 데이터이다. 받아온 데이터를 처리과정을 통해 분석에 적절하게 활용할 수 있는 자료로 변환 > 이렇게 만들어진 변수는 요약변수와 파생변수로 나뉜다.)

2. 요약변수
수집된 정보를 분석에 맞게 종합한 변수
- 데이터 마트에서 가장기본적인 변수로, 총구매금액, 금액횟수, 구매여부 등 데이터 분석을 위해 만들어지는 변수
- 많은 모델에 공통으로 사용 될 수 있어 재활용성이 높다
- 합계, 횟수와 같이 간단한 구조이므로 자동화하여 상황에 맞게 일반적인 자동화 프로그램으로 구축 가능
- 단점 : 얼마 이상이면 구매하더라도 기준값의 의미 해석이 애매 → 연속형 변수를 그룹핑해서 사용하면 좋다

3. 파생변수
사용자(분석자)가 특정 조건을 만족하거나 특정 함수에 의해 값을 만들어 의미를 부여한 변수
- 매우 주관적일 수 있으므로 논리적 타당성을 갖추어 개발
- 세분화, 고객행동 예측, 캠페인 반응 예측에 매우 잘 활용
- 특정 상황에만 유의미하지 않게 대표성을 나타나게 해야함

4. reshape
reshape는 R에서 데이터를 재구성하고 재배치하는데 사용되는 함수나 패키지
- melt() : 원데이터 형태로 만드는 함수 / 쉬운 casting을 위해 적당한 형태로 만들어주는 함수
- cast() : 요약 형태로 만드는 함수 / 데이터를 원하는 형태로 계산 또는 변형 시켜주는 함수

2) sqldf를 이용한 데이터 분석
- R에서 sql명령어를 사용 가능하게 해주는 패키지
- SAS에서 PROC SQL과 같은 역할을 하는 패키지
- 예시
• sql에서 사용하는 명령어 : select* from [data frame]
- R에서 사용하는 명령어   : sqldf("select* from [data frame])
• sql에서 사용하는 명령어 : select * from [data frame] numrows 10
- R에서 사용하는 명령어   : sqldf("select * from [data frame] limit 10")
• sql에서 사용하는 명령어 : select * from [data frame] where [col] like char%'
- R에서 사용하는 명령어   : sqldf("select * from [data frame] where [col] like char%'")

• head([df]) : sqldf("select * from [df] limit 6")
-head(df): R에서는 데이터프레임의 처음 몇 개의 행을 보기 위해 사용됩니다.
-sqldf("select * from df limit 6"): SQL에서는 LIMIT 절을 사용하여 결과 행의 수를 제한하는데, 여기서는 처음 6개의 행을 선택합니다.

• subset([df], grep1("qn%", [col])): sqldf("select * from [df] where [col] like 'qn% ")
-subset(df, grep1("qn%", col)): R에서는 열(col) 값 중에서 "qn%"으로 시작하는 행을 선택합니다.
-sqldf("select * from df where col like 'qn%'"): SQL에서는 LIKE 연산자를 사용하여 "qn%"으로 시작하는 행을 선택합니다.

• subset([df], [col]%in% c("BF", "HF"): sqldf("select * from [df] where [col] in('BF', 'HF)")
-subset(df, col %in% c("BF", "HF")): R에서는 열(col) 값 중에서 "BF" 또는 "HF"인 행을 선택합니다.
-sqldf("select * from df where col in('BF', 'HF')"): SQL에서는 IN 연산자를 사용하여 "BF" 또는 "HF"인 행을 선택합니다.

• rbind/[df1], [df2]): sqldfl("select * from [df1] union all select * from [df2]")
-rbind(df1, df2): R에서는 데이터프레임 df1과 df2를 행으로 결합합니다.
-sqldf("select * from df1 union all select * from df2"): SQL에서는 UNION ALL을 사용하여 두 데이터프레임을 결합합니다.

• merge([df1], [df2]) : sqldf("select * from [df1], [df2]")
-merge(df1, df2): R에서는 두 데이터프레임을 공통된 열을 기준으로 병합합니다.
-sqldf("select * from df1, df2"): SQL에서는 두 테이블을 FROM 절에 나열하여 결합합니다.

• df[order([df]$[col], decreasing=T),]:sqldf("select * from [df] order by [col] desc")
-df[order(df$col, decreasing = TRUE), ]: R에서는 열(col)을 기준으로 내림차순으로 데이터프레임을 정렬합니다.
-sqldf("select * from df order by col desc"): SQL에서는 ORDER BY를 사용하여 열을 기준으로 내림차순으로 정렬합니다.

iris데이터를 활용한 예시
# sqldf 패키지 설치
# install.packages("sqldf")
# sqldf 패키지 로드
library(sqldf)
# iris 데이터 조회
sqldf("select * from iris")

3) plyr을 이용한 데이터 분석
plyr 패키지는 데이터 분석과 조작을 위한 유용한 도구들을 제공하는 R 패키지
데이터를 다루는데 있어서 분할(split), 적용(apply), 결합(combine)의 과정을 간편하게 수행할 수 있도록 도와준다
- apply함수에 기반해 데이터와 출력변수를 동시에 배열로 치환하여 처리하는 패키지
- split-apply-combine : 데이터를 분리하고 처리한 다음, 다시 결합하는 등 필수적인 데이터 처리 기능 제공
ddply(): 데이터프레임을 분할(split)하고 각 부분에 함수를 적용(apply)한 다음 결과를 결합(combine)
 > ddply(.data, .variables, .fun, ...)
  .data: 분할할 데이터프레임.
  .variables: 분할의 기준이 되는 열 이름들.
  .fun: 각 그룹에 적용할 함수.
- ldply(): 리스트로부터 데이터프레임을 생성
- adply(): 배열 또는 행렬에서 데이터프레임을 생성

4) 데이터 테이블
- data.table 패키지는 R에서 가장 많이 사용하는 데이터 핸들링 패키지
- 큰 데이터를 탐색, 연산, 병합하는 데 아주 유용
- 기존 data.frame보다 월등히 빠른 속도 (데이터프레임의 확장 버전)
- 특정 Column을 Key값으로 색인을 지정한 후 데이터 처리
- 빠른 그룹핑과 Ordering, 짧은 문장 지원 측면에서 데이터 프레임보다 유용

예시 
› install.packages ("data.table")
› library(data.table)
> DF <- data.frame(x = runif(2.6+07), y = rep(LETTERS, each = 10000)) (rep(LETTERS, each=10000)) : 대문자 알파벳을 A부터 각각 10000번씩 출력
> df < data.frame(x = runif(2.6+07), y = rep(letters, each = 10000)) (rep(letters, each=10000)) : 소문자 알파벳을 a부터 각각 10000번씩출력
> system.time(× ‹- DF[DF$y == "C", ])
사용자 시스템 elapsed
1.88 0.40 2.30
› DT <- as.data.table(DF)
> setkey (DT, y)
> system.time(x <- DT[J("C"), ])
사용자 시스템 elapsed
0.03 0.00 0.03
1.데이터 생성:
DF와 df는 각각 data.frame 형태로 생성된 데이터입니다. DF는 대문자 알파벳으로, df는 소문자 알파벳으로 채워진 2.6+07(26,000,000)개의 행을 가진 데이터프레임입니다.
2.Subset 작업의 시간 측정:
system.time(DF[DF$y == "C", ]): 대문자 알파벳인 "C"에 해당하는 행만 추출하는 작업을 data.frame에서 수행한 시간을 측정합니다.
system.time(x <- DT[J("C"), ]): data.table을 사용하여 특정 값을 가진 행을 추출하는 작업을 수행한 시간을 측정합니다.
3.결과 해석:
결과에서 elapsed 시간을 기준으로 보면, data.table을 사용한 경우가 data.frame에 비해 훨씬 빠른 것을 확인할 수 있습니다.
data.table은 내부적으로 효율적인 인덱싱을 사용하므로 데이터를 빠르게 처리할 수 있습니다.
4.data.table의 특징 활용:
setkey(DT, y): data.table에서는 인덱스를 설정할 수 있습니다. 여기서는 y 열을 기준으로 인덱스를 설정하였습니다.
DT[J("C"), ]: data.table에서는 J() 함수를 사용하여 조인 작업을 편리하게 수행할 수 있습니다. 여기서는 "C"를 가진 행을 추출합니다.

728x90