모던지 / 데이터분석 준전문가 / 데이터분석 3강. 데이터 마트

데이터분석 3강. 데이터 마트

분석용 데이터 마트는 분석 단위 하나가 한 행이 되도록 만든 표입니다. 고객을 분석하려면 거래 천만 건을 고객 백만 명의 표로 접어야 합니다.

풀고 시작

문제 1. 고객별 구매 성향을 분석하려는데 원천 데이터가 거래 한 건이 한 행인 표입니다. 분석용 데이터 마트는 어떤 모양으로 만드는 것이 알맞습니까?
분석하려는 대상이 고객이면 고객 한 명이 한 행이 되어야 모델이 고객마다 하나의 예측을 낼 수 있습니다. 그래서 거래를 고객별로 합치고 세어 총구매금액이나 구매 횟수 같은 변수를 만듭니다.

데이터 마트는 무엇을 위한 표인가

1과목 2강에서 데이터 웨어하우스(data warehouse)는 전사의 데이터를 주제별로 통합한 창고이고, 데이터 마트(data mart)는 그 가운데 특정 부서나 주제에 필요한 부분만 떼어 낸 작은 창고라고 했습니다. 3과목의 데이터 마트는 한 걸음 더 들어가 분석을 바로 돌릴 수 있게 가공한 표를 가리킵니다.

원천 데이터는 대개 사건이 일어날 때마다 한 줄씩 쌓입니다. 주문 한 번, 로그인 한 번, 상담 한 번이 각각 한 행이죠. 그런데 분석이 답하려는 질문은 보통 "이 고객이 이탈할까"처럼 고객 단위입니다. 그래서 데이터 마트를 만드는 일은 사건 단위의 긴 기록을 분석 단위 하나가 한 행이 되도록 접는 일입니다. 이 과정에서 새로 만드는 변수는 크게 두 종류입니다.

요약변수와 파생변수

요약변수(summary variable)는 원천 기록을 분석 단위로 모아 합치거나 센 변수입니다. 총구매금액, 구매 횟수, 최근 석 달 방문 일수, 특정 상품 구매 여부 같은 것이죠. 계산 방법이 분명하고 누가 만들어도 같은 값이 나오므로 여러 분석에 두루 다시 쓰기 좋습니다.

파생변수(derived variable)는 분석가가 특정한 조건이나 함수로 값을 만들어 의미를 부여한 변수입니다. 주로 이용하는 매장, 선호 시간대, 가격에 민감한 고객인지 같은 것이 여기에 속합니다. 분석가의 판단이 들어가므로 주관적일 수 있고, 그래서 그 기준이 왜 타당한지 논리적으로 설명할 수 있어야 합니다. 잘 만든 파생변수 하나가 모델 성능을 크게 바꾸기도 합니다.

넓은 표와 긴 표: reshape2

같은 데이터도 넓은 모양(wide)과 긴 모양(long)으로 담을 수 있습니다. 넓은 모양은 한 사람의 여러 측정을 열로 펼친 것이고, 긴 모양은 측정 하나마다 한 행을 둔 것입니다. 해들리 위컴(Hadley Wickham)이 만든 reshape2 패키지는 이 둘을 오가는 함수를 줍니다.

library(reshape2)
wide <- data.frame(id = c(1, 2), jan = c(10, 30), feb = c(20, 40))
long <- melt(wide, id.vars = "id")
#   id variable value
#    1      jan    10
#    2      jan    30
#    1      feb    20
#    2      feb    40
dcast(long, id ~ variable)   # 다시 넓은 모양으로

melt는 기준이 되는 열(id.vars)만 남기고 나머지 열을 variable과 value 두 열로 녹여 긴 표를 만듭니다. dcast는 거꾸로 식의 물결표 왼쪽을 행으로, 오른쪽을 열로 삼아 넓은 표로 되돌립니다. 모양만 바뀔 뿐 값은 하나도 사라지지 않습니다.

쪼개고 계산하고 합치기: sqldf, plyr, data.table

그룹별로 요약하는 방법도 여러 가지입니다. sqldf는 데이터프레임에 SQL 문을 그대로 써서 조회하게 해 줍니다. SQL에 익숙한 분이 R 문법을 몰라도 요약표를 만들 수 있다는 것이 장점입니다.

library(sqldf)
sqldf("select class, avg(score) from df group by class")

plyr는 데이터를 그룹으로 쪼개고(split), 그룹마다 함수를 적용하고(apply), 결과를 다시 합치는(combine) 작업을 한 함수로 합니다. 함수 이름의 첫 글자가 입력 형태, 둘째 글자가 출력 형태를 뜻합니다. d는 데이터프레임, l은 리스트, a는 배열이라서 ddply는 데이터프레임을 받아 데이터프레임을 돌려주고, ldply는 리스트를 받아 데이터프레임을 돌려줍니다.

data.table은 데이터프레임을 넓힌 자료 구조로, 대용량에서 검색과 그룹 연산이 훨씬 빠릅니다. 열에 키(key)를 걸어 두면 정렬된 상태에서 찾기 때문에 빠르고, DT[행 조건, 계산, by = 그룹] 한 줄로 조건과 계산과 그룹을 한꺼번에 적습니다. 요즘에는 dplyr의 filter, group_by, summarise를 파이프로 이어 쓰는 방식도 널리 쓰입니다. 도구는 달라도 하는 일은 같습니다. 분석 단위로 접은 표를 만드는 것이죠.

인출 문제

문제 1. 요약변수와 파생변수의 차이로 가장 적절한 것은?
총구매금액처럼 모아 합친 것은 요약변수라 누가 만들어도 같고 재활용하기 좋습니다. 선호 시간대처럼 기준을 정해 의미를 붙인 것은 파생변수라 주관적일 수 있어 논리적 근거가 필요합니다. 첫째 보기는 둘을 뒤바꿔 적었습니다.
문제 2. reshape2의 melt가 하는 일로 옳은 것은?
melt는 넓은 표를 녹여 측정 하나가 한 행인 긴 표로 만듭니다. 거꾸로 긴 표를 넓은 표로 되돌리는 것은 dcast입니다.
문제 3. plyr 패키지의 ddply가 받는 입력과 돌려주는 출력의 형태로 옳은 것은?
plyr 함수 이름의 첫 글자는 입력, 둘째 글자는 출력을 뜻하고 d는 데이터프레임입니다. 그래서 ddply는 데이터프레임을 받아 데이터프레임을 돌려줍니다.
문제 4. data.table이 데이터프레임보다 빠른 이유로 가장 알맞은 것은?
data.table은 키를 설정하면 정렬된 구조를 이용해 원하는 행을 빠르게 찾고, 그룹 연산도 효율적으로 처리합니다. SQL로 바꿔 실행하는 것은 sqldf의 방식입니다.

더 풀기

출제기준의 세부항목을 따라 이 강의 범위에서 새로 낸 문제입니다. 모의고사도 여기에서 뽑습니다.

묶음 1

문제 1. 3과목에서 말하는 분석용 데이터 마트의 뜻으로 가장 알맞은 것은?
분석용 데이터 마트는 사건 단위의 원천 기록을 고객 같은 분석 단위로 접어 모델에 바로 넣을 수 있게 만든 표입니다. 실시간 기록을 쌓는 것은 운영 시스템인 OLTP의 몫입니다.
문제 2. 원천 데이터가 대개 어떤 단위로 쌓이는지 가장 잘 설명한 것은?
원천 데이터는 사건이 일어날 때마다 한 줄씩 기록되는 경우가 많습니다. 그래서 고객 단위 분석을 하려면 이 긴 기록을 고객 한 명이 한 행이 되도록 접어야 합니다.
문제 3. 다음 가운데 요약변수에 가장 가까운 것은?
총구매금액은 거래 금액을 고객별로 합친 값이라 계산 방법이 분명한 요약변수입니다. 나머지는 분석가가 기준을 정해 의미를 부여한 파생변수에 가깝습니다.
문제 4. 다음 가운데 파생변수에 가장 가까운 것은?
선호 시간대는 분석가가 어떤 기준으로 가장 자주 사는 시간대를 정할지 판단해 만든 것이라 파생변수입니다. 구매 횟수와 금액, 구매 여부는 모아 세거나 합친 요약변수입니다.
문제 5. 요약변수의 장점으로 가장 알맞은 것은?
요약변수는 모으고 합치는 방법이 분명해 재활용성이 높습니다. 논리적 근거를 설명해야 하는 쪽은 주관이 들어가는 파생변수입니다.
문제 6. 파생변수를 만들 때 특히 주의해야 할 점으로 가장 알맞은 것은?
파생변수는 조건이나 함수로 의미를 부여하는 과정에 분석가의 판단이 들어갑니다. 그래서 그 기준이 왜 합리적인지 논리적으로 뒷받침해야 합니다.
문제 7. 한 사람의 1월과 2월 측정값을 jan과 feb라는 두 열에 나란히 담은 표는 어떤 모양입니까?
측정을 열로 펼쳐 한 사람이 한 행에 여러 측정을 가진 모양이 넓은 모양입니다. 측정 하나마다 한 행을 두면 긴 모양이 됩니다.
문제 8. id 두 명과 jan, feb 두 열로 된 넓은 표를 melt(wide, id.vars = "id")로 녹이면 몇 행이 됩니까?
id가 두 명이고 녹일 열이 jan과 feb 둘이므로 두 명 곱하기 두 달로 네 행이 됩니다. 값은 하나도 사라지지 않고 모양만 바뀝니다.
문제 9. melt로 만든 긴 표에 새로 생기는 두 열의 기본 이름으로 옳은 것은?
melt는 녹인 열의 이름을 variable 열에, 그 값을 value 열에 담습니다. 이 두 열을 dcast로 다시 펼치면 원래의 넓은 표가 됩니다.
문제 10. reshape2를 만든 사람으로 옳은 것은?
reshape2는 해들리 위컴이 만든 패키지입니다. 로스 이하카는 R을 만든 사람, 에드거 커드는 관계형 모델을 제안한 사람, 존 튜키는 탐색적 자료 분석을 주창한 통계학자입니다.

묶음 2

문제 1. dcast(long, id ~ variable)이 하는 일로 옳은 것은?
dcast는 식의 물결표 왼쪽을 행, 오른쪽을 열로 삼고 value 값을 채워 넓은 표로 되돌립니다. 넓은 표를 긴 표로 녹이는 것은 melt입니다.
문제 2. melt와 dcast를 차례로 적용했을 때 값에 일어나는 일로 옳은 것은?
melt와 dcast는 표의 모양을 넓은 것과 긴 것 사이에서 바꿀 뿐 값을 버리거나 요약하지 않습니다. 그래서 둘을 차례로 적용하면 원래 표로 돌아옵니다.
문제 3. sqldf 패키지의 가장 큰 장점으로 알맞은 것은?
sqldf는 select, where, group by 같은 SQL 문으로 데이터프레임을 다루게 해 줍니다. 모양을 바꾸는 것은 reshape2, 키로 빠르게 찾는 것은 data.table입니다.
문제 4. sqldf로 반별 평균 점수를 구하는 SQL에서 반별로 묶는 역할을 하는 절은 무엇입니까?
group by가 같은 반끼리 묶고 avg가 그 묶음의 평균을 구합니다. where는 행을 거르고, order by는 정렬하며, from은 어느 표에서 가져올지 정합니다.
문제 5. plyr가 따르는 작업 흐름으로 옳은 것은?
plyr는 split, apply, combine의 흐름을 한 함수로 처리합니다. 녹이고 펼치는 것은 reshape2의 melt와 dcast입니다.
문제 6. plyr의 ldply가 받는 입력과 돌려주는 출력의 형태로 옳은 것은?
첫 글자 l은 입력이 리스트, 둘째 글자 d는 출력이 데이터프레임이라는 뜻입니다. 데이터프레임을 받아 리스트를 돌려주는 것은 dlply입니다.
문제 7. plyr 함수 이름에서 a가 가리키는 형태는 무엇입니까?
plyr에서 d는 데이터프레임, l은 리스트, a는 배열을 뜻합니다. 그래서 aaply는 배열을 받아 배열을 돌려줍니다.
문제 8. data.table의 DT[행 조건, 계산, by = 그룹] 문법이 뜻하는 것으로 옳은 것은?
data.table은 한 줄의 대괄호 안에 행 조건과 계산과 그룹을 함께 적어 거르고 계산하고 묶는 일을 한 번에 합니다.
문제 9. 대용량 데이터에서 특정 고객의 행을 반복해서 빠르게 찾아야 할 때 가장 알맞은 도구는 무엇입니까?
data.table은 키를 걸어 정렬된 상태에서 찾기 때문에 반복 검색이 빠릅니다. melt와 dcast는 표의 모양을 바꾸는 도구라 검색 속도와는 관계가 없습니다.
문제 10. dplyr에서 그룹별 요약을 할 때 흔히 이어 쓰는 함수의 조합으로 가장 알맞은 것은?
dplyr에서는 group_by로 그룹을 정하고 summarise로 그룹마다 요약값을 계산합니다. melt와 dcast는 reshape2의 모양 바꾸기 함수입니다.

묶음 3

문제 1. 1과목에서 본 데이터 웨어하우스와 데이터 마트의 관계로 옳은 것은?
데이터 웨어하우스가 전사 규모의 통합 저장소라면 데이터 마트는 부서나 주제 단위로 좁힌 저장소입니다. 3과목의 분석용 데이터 마트는 여기서 한 걸음 더 나아가 분석에 바로 쓰도록 가공한 표입니다.
문제 2. 이탈 예측 모델을 고객 단위로 만들 때 데이터 마트에서 고객 한 명이 여러 행에 걸쳐 있으면 생기는 문제로 가장 알맞은 것은?
분석 단위가 고객인데 한 고객이 여러 행이면 모델은 같은 사람을 여러 번 학습하고 예측도 여러 개가 나옵니다. 그래서 분석 단위 하나가 한 행이 되도록 먼저 접어야 합니다.
문제 3. 거래 기록을 고객별로 모아 구매 횟수를 세는 작업은 무엇을 만드는 일입니까?
거래를 고객 단위로 모아 센 값은 계산 방법이 분명한 요약변수입니다. 목표변수는 모델이 예측하려는 값이라 따로 정합니다.
문제 4. 다음 가운데 모양만 바꿀 뿐 값을 요약하지 않는 작업은 무엇입니까?
melt는 열을 행으로 녹일 뿐 값을 합치거나 평균 내지 않습니다. 나머지 셋은 여러 값을 하나로 요약합니다.
문제 5. 측정 하나마다 한 행을 두는 긴 모양(long)의 표가 쓸모 있는 경우로 가장 알맞은 것은?
긴 모양은 측정 시점이나 항목이 사람마다 달라도 행만 늘리면 되므로 유연합니다. 사람마다 한 행이 필요할 때는 넓은 모양이 알맞습니다.
문제 6. SQL에 익숙하지만 R 문법이 낯선 분석가가 데이터프레임을 바로 조회하고 싶을 때 가장 알맞은 도구는 무엇입니까?
sqldf는 데이터프레임에 SQL 문을 그대로 쓰게 해 주므로 R 문법을 몰라도 조회와 요약을 할 수 있습니다.
문제 7. 반마다 평균 점수를 구하려고 데이터를 반으로 나눈 뒤 각각 평균을 구하고 결과를 한 표로 모았습니다. 이 흐름의 이름으로 알맞은 것은?
쪼개고 적용하고 합치는 흐름을 split, apply, combine이라고 부르며 plyr가 이 흐름을 한 함수로 처리합니다.
문제 8. 잘 만든 파생변수에 관한 설명으로 가장 적절한 것은?
파생변수는 분석가의 업무 이해를 변수로 옮긴 것이라 잘 만들면 모델이 스스로 찾기 어려운 신호를 줍니다. 대신 주관적이라 재활용성은 요약변수보다 떨어질 수 있습니다.
문제 9. reshape2, sqldf, plyr, data.table을 두루 쓰는 공통 목적으로 가장 알맞은 것은?
네 도구는 방법이 다를 뿐 모두 데이터를 요약하고 모양을 바꿔 분석용 데이터 마트를 만드는 데 씁니다.
문제 10. 데이터 마트에 관한 진술로 옳지 않은 것은?
키를 걸어 빠르게 찾는 것은 data.table이고, sqldf는 데이터프레임에 SQL 문을 그대로 쓰게 해 주는 패키지입니다. 나머지 셋은 옳은 진술입니다.

이전: 2강 R로 데이터 다루기 · 다음: 4강 결측값과 이상값

모던지 · 궁금하면 모던지 GitHub · 2026-09-30