[삼성 SDS Brightics] 데이터 전처리 학습③ - 데이터 결합, 행/열 결합 및 데이터 형태 변환
안녕하세요!
Brightics 서포터즈 2기 yeenn입니다.
지난 포스팅에서는 데이터 전처리 과정 중 데이터 정제에 관한 학습과정을 다루었는데요,
이번 포스팅에서는 효율적인 데이터 분석을 위해 꼭 필요한 과정인 데이터 결합 및 형태 변환 과정을 살펴보겠습니다!
데이터 결합과 변환과정은 왜 중요할까?
빅데이터 시대가 도래하면서 데이터의 활용 범위가 점점 확대되고 있는 추세인데요,
이에 따라 한 분야의 정형 데이터만을 분석하는 것보다는, 다양한 데이터를 결합, 변환 분석하여 예상치 못한 새로운 가치를 발견하는 과정이 더욱 중요해졌습니다.
※ 예)
심야시간 통화 데이터 x 택시 승하차 데이터 → 심야버스 노선 수립
농가 데이터 x 차량이동 데이터 → 조류독감 확산 예측
(출처: 데이터 산업 활성화 전략 의결 안건 보고서)
.
.
.
브라이틱스에서는 이러한 데이터 전처리를 위한 다양하고 유용한 function들을 제공하고 있는데요,
아래 실습을 통해
1) 데이터 결합
2) 행/열 결합
3) 데이터 형태 변환
과정을 자세히 살펴보도록 하겠습니다!
※ 실습 데이터는 Brightics github에 수록되어 있는 실습데이터 math.txt, english.txt를 이용하였습니다.
[데이터 결합]
1. Data Flow Model 생성
이제는 너무도 익숙해진 과정!
Create a new model항목 에서 새로운 데이터 모델을 생성해줍니다.
그 다음, 위와 같은 data flow model을 구성합니다.
데이터를 결합할 때 사용하는 함수는 Join 함수입니다.
여기서 잠깐! Join함수의 종류와 쓰임을 알아볼까요?
Join은 데이터 결합의 가장 기본적인 방법으로, 데이터베이스 내의 여러 테이블들을 결합하여 하나의 테이블로 나타내는 방식을 의미합니다!
Join연산에는 다음과 같은 6가지 type이 있습니다.
이너조인(inner join) | 두 테이블에 키(key)가 공통으로 존재하는 레코드(record)만 결합하는 방식 |
풀아우터조인(full outer join) | 좌측 또는 우측에 키가 존재하면, 다른 한 쪽에 데이터가 없더라도 결합하는 방식 |
레프트조인(left join) | 좌측에 있는 테이블(brightics의 join에 먼저 연결된 테이블)의 키를 기준으로 우측에 있는 테이블(brightics의 join에 나중에 연결된 테이블)을 결합하는 방식 |
라이트조인(right join) | 레프트 조인과 반대로 우측 테이블의 키를 기준으로 좌측 테이블을 결합하는 방식 |
레프트익스클루딩조인(left excluding join) | 좌측 테이블의 key값을 기준으로 결합하는 방식 |
라이트익스클루딩조인(right excluding join) | 우측 테이블의 key값을 기준으로 결합하는 방식 |
보통 가장 많이 사용되는 join 방법은 이너조인과 레프트조인인데요,
join 함수를 여러개 사용하여 두개 뿐 아니라 세 개이상의 테이블 결합도 손쉽게 가능합니다!
Brightics의 join type에는 위의 연산 개념을 벤다이어그램 형태의 아이콘으로 제공하고 있어,
보다 직관적으로 데이블 결합방식을 판단할 수 있습니다. (효율성 끝판왕 브라이틱스..bbb)
※ 위 벤다이어그램 아이콘은 좌측부터 순서대로
풀아우터조인(full outer join) - 레프트조인(left join) - 라이트조인(right join) - 이너조인(inner join) - 레프트익스클루딩조인(left excluding join) - 라이트익스클루딩조인(right excluding join)을 나타냅니다!
2. Data Load
Join함수에 대한 설명이 이해가 되셨다면,
다시 돌아와서 실습을 마저 진행해보도록 하겠습니다.
데이터 결합 실습에서 사용할 dataset은
학생별 수학성적 math.txt와 영어성적 english.txt입니다.
local file에서 데이터를 불러온 후,
math.txt와 english.txt는 각 변수가 tab으로 구분된 데이터이므로,
Delimiters를 'Tab'으로 지정해주세요!
정수 변인으로 이루어진 data이므로,
data type를 모두 integer로 변경하여 데이터를 업로드 해주세요.
위와 같은 과정을 english.txt에도 반복하여 업로드해주시면 data load는 완료됩니다!
3. 데이터 결합
수학성적과 영어성적이 모두 있는 학생만 한 테이블로 합치기 위해서는 어떤 join 연산을 사용해야 할까요?
→ inner join을 수행하면 됩니다!
이너조인은 두 테이블에 key가 공통으로 존재하는 레코드(record)만 결합하는 방식이므로,
left keys와 right keys를 모두 id로 지정한 후, inner join type을 선택하여 run을 누릅니다.
이너조인을 실행하였기 때문에, 수학성적과 영어성적이 모두 있는 학생들의 레코드만 결합되는 것을 확인할 수 있습니다!
[행결합]
1. Data Flow Model 구성
이번에는, 학생의 수학성적 data와 영어성적 data를 행결합하는 방법에 대해 실습해보도록 하겠습니다.
먼저, 분석에 필요한 data flow 모델을 위와 같이 구성해줍니다.
그런데 이번 flow model에서는 join함수가 없네요! 왜일까요?
앞서 살펴본 join과 다르게,
행결합과 열결합은 키 변수를 필요로 하지 않습니다.
행 결합은 키가 없이 행을 기준으로 위아래로 결합하는 방식이고, 열결합은 키가 없이 열을 기준으로 좌우로 결합하는 방식인데요, 이 때 결합은 'Bind Row Column' 함수를 사용합니다.
두 입력데이터의 변수명이 동일한 경우에는 정상적으로 결합이 수행되지만,
두 입력데이터의 변수명이 동일하지 않은 경우에는, 채울 수 없는 셀에는 아래와 같이 null이 출력됩니다.
따라서, 두 데이터의 column명을 score, subject로 동일하게 맞춰준 후, 행결합을 진행해보도록 하겠습니다.
이를 위해서는, 파생변수를 생성하고, column 명을 변경해줄 수 있는 Add Function Column과 Select Column 이 필요합니다.
2. Data Load
앞서 사용했던 math.txt와 english.txt를 load해주세요.
3. Add Function Column으로 파생변수 생성
Add Function Column 설정창에서,
New Column Name항목에는 공통 파생변수 subject를 입력해주시고,
Expression 항목에는 'math'를 입력해주세요!
(※ '-' 따옴표 잊지말고 입력해주세요!)
english dataset도 마찬가지 방법으로 파생변수 subject를 생성해주세요!
4. Select Column으로 파생변수 생성
그 다음, 행결합에 용이한 공통변수를 생성하기 위해, 각 dataset에서 math, english로 명명되어 있던 column을 Select Column을 사용해 'score'로 column명을 변경하도록 하겠습니다.
Select Column의 용도는?
"컬럼명, 컬럼타입, 컬럼순서 등을 변경가능한 함수"
우선, Select Column 설정창은 다음과 같습니다.
가운데 'Selected Column'박스를 클릭하면
아래와 같은 화면이 나오게 되는데요,
math.txt의 math column의 New name을 'score'로,
english.txt의 english column의 New name을 'score'로 변경해줍니다.
이제 데이터 행 결합을 위한 모든 준비가 완료되었습니다!
5. Bind Row Column으로 행결합
그 다음, Bind Row Column 함수를 실행하면,
다음과 같이 행결합이 완료된 것을 확인할 수 있습니다!
[열결합]
다음은, 열결합에 대해 알아보겠습니다.
1. Data Flow Model 구성
우선, 위와 같은 data flow model을 구성해줍니다.
다음은 math.txt와 english.txt의 data table인데요,
학생의 수학성적의 경우 1-10까지 순서대로 id가 정렬되어있는데 반해,
영어성적의 경우, id가 순서대로 정렬되어있지 않고 id:10이 missing되어있는 것을 확인할 수 있습니다.
따라서, 열결합을 진행하기 전에 id순으로 정렬을 한 후, 공통 data를 중심으로 열을 결합하기 위해
id가 10미만인 학생의 데이터만을 가져온 후 열결합을 진행해보도록 하겠습니다!
2. Data Load
앞서 동일한 방식으로 math.txt와 english.txt을 load해주세요!
3. ID 순으로 정렬
Sort 함수의 설정항목에서 Id Column을 선택하고,
오름차순(1↓9)으로 정렬하여 Run을 눌러주세요!
* 정렬 전 → 후
english data의 열 정렬이 완료되었네요!
4. Filter로 필요한 행만 선택
다음은, 공통 데이터를 결합시키기 위해, 두 dataset모두 id가 10보다 작은 경우만 필터링해보겠습니다.
Select Column 항목에 fitering 대상 data를 불러온 후, 필터링 조건(id<10)을 선택하여 Ok를 눌러주시면 됩니다.
(Filter 함수를 사용하면, 상단의 And/Or을 통해 여러개의 filter조건문을 중첩할 수도 있습니다!)
5. 열결합(Bind Row Column)
이후, Bind Row Column의 Column항목을 선택하여 Run을 누르면, 열결합이 성공적으로 이루어지는 것을 확인할 수 있습니다!
다음은, 이번 포스팅의 마지막 순서인
"데이터 형태 변환"과정을 살펴보겠습니다.
[데이터 형태 변환]
dataset은 앞선 data와 동일한 math.txt와 english.txt를 사용합니다!
앞서 join함수를 통한 데이터 결합을 다룰 때, 학생의 수학성적과 영어성적을 한 테이블로 결합하는 과정을 살펴보았는데요, 이번 데이터 변환 실습에서는 Unpivot함수를 통해 데이터를 변환해보겠습니다.
데이터 형태 변환실습 목표
1) Unpivot 함수를 통해 join된 데이터 형태 변환
2) 학생들의 평균 성적 구하기
1. Data Flow Model 생성
우선, 위의 데이터 결합실습에서 이너조인컬럼을 통해 결합시킨 데이터를 불러와 데이터 플로우 모델을 생성하겠습니다.
2. Unpivot함수로 데이터 형태 변환
Unpivot함수는 특정한 column을 기준으로 여러 column을 행 형태로 변환하고자 할 때 사용하는 함수입니다.
기준이 되는 column을 identifier에, 행 형태로 변경하고자 하는 column을 values에 지정하면 됩니다.
실습과정을 통해 자세히 살펴볼까요?
최상단의 Values항목에는 출력하려는 data인 수학성적과 영어성적을 넣고,
Identifier항목에는 기준인 id를 넣어줍니다.
변환 후의 기존 컬럼명은 variable항목에, 기존 값은 value항목에 담겨있는데요,
'variable column name'과 'value column name'에 새 이름을 넣어 변경또한 가능합니다!
저는 'variable column name' 에는 과목 'subject'를,
'value columne name'에는 점수 'score'을 넣어줬습니다.
id를 기준으로 데이터 형태 변환이 완료되었네요!
데이터 변환과정은 끝났으나, 이대로 끝내기는 아쉬우니,, 앞서 목표에서 언급한 다양한 함수를 이용한 간단한 추가실습과정(학생별 평균성적 산출)을 진행보겠습니다.
3.1. Pivot 함수로 학생별 평균성적 산출
'학생 별 평균성적'을 산출하기 위해서, Row에는 학생인 id를 지정하고, Values에는 성적 score을, Aggregate Function에는 평균 MEAN을 지정합니다.
학생별 평균성적이 잘 산출이 되었네요!
3.2. Statistic Summary로 학생별 평균성적 산출
다음은, 동일한 데이터를 statistic summary함수를 통해 분석해보겠습니다.
Statistic Summary는 데이터 탐색용으로 자주 활용되는 함수인데요,
앞으로 Brightics를 이용하며 자주 이용될 함수 top3안에 들지 않을까 생각합니다!
마찬가지로, 학생별 평균성적을 산출하기 위해,
Input Columns에는 산출될 데이터인 성적 score을,
Target statistics에는 평균 Average를,
Group by에는 학생 id를 넣고 Run을 누릅니다.
역시 깔끔하게 성적 평균이 잘 산출되었네요!
3.3. Add Function Column으로 학생별 평균성적 산출
Average, MEAN과 같은 집계방식을 선택하면 바로 평균이 산출되기도 하지만,
이보다 복잡한 수식의 경우, 버튼 하나로 바로 수식을 계산하기 어려운 경우가 생기기도 합니다.
이와 같은 경우에는, Add Function 함수를 통해 수식을 직접 넣어 결과를 산출해볼 수 있습니다!
New Column name에는 산출될 결과의 새 이름 '평균'을 넣어주고,
Expression 항목에는 평균을 구하는 수식인 '(math+english)/2'를 넣고 Run을 돌렸습니다.
앞의 과정과 마찬가지로 학생별 성적 평균이 정상적으로 산출되었네요!
이상으로, 데이터 결합과 변환에 관한 실습을 마치도록 하겠습니다!
데이터를 다룰 때, 매번 위 과정들을 엑셀이나 SPSS로 진행했었는데, 이제는 Brightics를 더 많이 활용하게 될 것 같습니다ㅎㅎ 정말 처리속도와 프로세스 구상이 말도 안되게 빨라요.
Brightics 최고...♡
-본 게시물은 Brightics 서포터즈 활동의 일환으로 작성된 포스팅 입니다.