본문 바로가기
v3 | Tableau Deep Dive

[3]-4 블렌딩 Hands-On

by VizLab 2019. 10. 11.

지난 두 차례의 포스트를 통해서 블렌딩에 대한 기초적인 내용을 살펴보았습니다

 

▪  첫번째 포스트에서는 블렌딩의 개념과 블렌딩을 만드는 방법을 집중적으로 공부하였고,

▪  두번째 포스트에서는 블렌딩의 키 필드와 관련하여 나올 수 있는 다양한 이슈를 건드려보았습니다

 

오늘은 블렌딩과 관련된 마지막 포스트로 실제 협업에서 블렌딩을 사용할 수 있는 케이스를 함께 만들어보면서

지금까지 익힌 내용들을 정리해보겠습니다 :D

 

 

 

조인 대신 블렌딩을 사용하면 좋은 경우


첫번째 포스트 마지막 즈음에서 질문을 던졌었죠

"조인이라는 광범위하게 쓰이는 개념이 있는데, 왜 블렌딩을 알아야 하나요?"

 

이 질문에 대해 태블로는, 아래와 같은 경우에 블렌딩을 쓰면 좋다고 말하고 있습니다

 

▪  You want to combine data from different databases that are not supported by cross-database joins.

▪  Data is at different levels of detail.

▪  You have lots of data.

 

(참고: Tableau Online Help, Blend Your Data [KOR] / [ENG])

 

먼저 두번째 코멘트부터 이야기해봅시다

 

데이터의 Level of Detail이 다를 때 블렌딩이 괜찮다, 라고 말하면서 조인을 사용할 경우 중복된 값이 생길 수 있음을 언급합니다

판매 금액은 월별로 집계되는데, 판매 목표는 분기별로 집계되면,

두 테이블을 조인했을 때 매월의 데이터에 분기 목표가 붙게되어 똑같은 목표가 3개의 월마다 동일하게 표시되겠지요

(예를 들어 1월 매출, 2월 매출, 3월 매출 옆에 1분기 목표 같은 금액이 세 번 붙는 것이지요)

 

그럼에도 불구하고 실제로 이 경우에도 조인을 많이 씁니다

매출 부분을 집계할 때 평균으로 집계하거나, LOD 표현식을 써주면 충분히 잡아줄 수 있습니다

 

다음 세번째 코멘트도 바로 납득하기는 조금 어렵다는 것이 제 생각입니다

 

데이터가 엄청나게 많을 때 블렌딩을 쓰는게 좋다는 것인데,

태블로가 말하는 근거는 조인은 Row Level에서 이루어지기 때문에 엄청나게 많은 데이터셋 두 개가 조인으로 붙을 때에는

한 줄 한 줄의 Row 단위에서 붙는데 시간이 오래 걸리고 퍼포먼스가 떨어진다는 말입니다

즉, 블렌딩처럼 먼저 집계를 한 후에 그 VLOD에서 양쪽을 붙이면 - Row Level에서 붙는 것 보다는 - 조금 더 빠르다는 의미이죠

 

그런데 그건 태블로 데이터 준비창에서 조인을 했을 때 그렇다는 것이지,

태블로로 데이터를 불러오기 전 단계에서 SQL을 통해 데이터 테이블을 만들어 놓고 태블로에 불러오면 크게 문제될게 없습니다

(실제로 퍼포먼스 측면에서는 이 방법이 가장 바람직합니다)

더욱이 블렌딩 또한 태블로의 리소스를 사용하기 때문에 블렌딩을 만드는 것 자체도 퍼포먼스에 영향을 주게 됩니다

그렇다면 어느 정도의 데이터 사이즈에서 조인이 낫고, 어느 정도 규모에서 블렌딩이 좋으냐의 질문으로 귀결되는데,

이런 류의 질문에 대한 대답은 그때 그때 다르죠

 

블렌딩이 가장 빛이 나는 순간은 바로 첫번째 코멘트입니다

 

You want to combine data from different databases that are not supported by cross-database joins

 

두 개의 데이터 원본에서 데이터를 붙이고 싶은데, 조인 자체가 지원이 안되거나 어려운 상황이라면,

바로 이 경우에 블렌딩은 그야말로 유일무이한 훌륭한 대안입니다

 

특별히 하나의 데이터 원본은 데이터베이스에서 계속해서 업데이트 되고 있고,

보안이 필요하거나 특별한 수정 없이 어느 정도의 기간 동안 유효한 파일은 로컬에 엑셀로 가지고 있을 수도 있습니다

그런데 이 두 데이터 원본을 섞어서 무엇인가 유의미한 인사이트를 뽑아낼 수 있다면,

여기에서는 블렌딩이 정답입니다.

 

바로 그 부분을 다음 섹션에서 실습해보자구요

 

 

 

Use Case: Actual Sales vs. Sales Target


이 사례는 실제로 고객사 프로젝트를 수행했던 경험을 기반으로 만들어졌습니다

현업에서 실제로 이런 경우가 일어난다는 의미겠죠

 

보통 회사의 거래는 데이터베이스에 쌓이면서, 새로운 거래가 발생하면 데이터베이스가 업데이트 되는 구조이지요

매출의 실적은 이렇게 데이터베이스에 남는 반면, 매출의 목표는 엑셀 파일에 기록하여 비밀번호를 걸어서 보관하는 경우가 많습니다

매출 실적처럼 매일 최신화 되는 데이터도 아닐뿐더러, 아무나 함부로 열람해서는 안되는 보안 파일이기 때문이죠

 

그런데 문제는 실적은 목표 대비로 봐야 비로소 그 성과가 뚜렷해진다는 것입니다

올해 사업을 잘했는지 못했는지를 판단하기 위해서는 '올해 얼마 팔았다', 이게 아니라,

'목표 대비 얼마나 더 팔았다, 덜 팔았다', 이렇게 봐야 되겠죠

여기가 바로 블렌딩이 들어오는 지점입니다

 

다음 두 데이터셋을 가지고 블렌딩을 연습해봅시다

 

먼저 Sample - Superstore 데이터셋을 약간 수정하여서, 2019년 10월 13일 이후의 데이터는 모두 삭제하였습니다

데이터베이스 환경으로 연습을 하면 제일 좋겠지만 상황이 여의치 않아,

지금의 이 데이터셋을 매일매일 업데이트 되는 데이터베이스라고 가정하도록 하겠습니다

Sample - Superstore - Modified.xls
2.90MB

 

다음은 몇몇 관계자들만 가지고 있는 - 또는 그럴 것으로 추측되는 - 매출 목표 데이터셋입니다

Sample - Superstore - 2019 Target.xlsx
0.01MB

 

Sample - Superstore의 Orders 테이블을 가져오는 것은 크게 어렵지 않지만,

목표 데이터셋의 Target 테이블을 가져올 때 난관에 부딪힙니다

Orders 테이블을 올린 후 Target 테이블을 가져오니, 이런 상황이 발생합니다

 

 

일단 테이블의 값이 가로로 길게 늘어서 있고, 필드명도 제대로 들어가있지 않습니다

데이터 부분의 두번째 줄이 실제 필드명으로 들어가있어야 할 것 같은데 말이죠

 

이럴 때 쓸 수 있는 기능은 데이터 해석기라고 말씀드렸었죠?

위의 그림 좌측 윗부분에 '데이터 해석기'라고 나와있는 부분의 박스를 클릭해봅시다

 

깔끔하게 정리되었습니다

 

 

그 다음 과정들도 두번째 대주제 Data Preparation 파트에서 상세하게 다루었습니다

 

옆으로 길게 누운 crosstab 형식을 columnar 형태로 바꾸어줘야겠죠? 그럴 때 쓰는 기능은 피벗입니다

피벗을 적용한 후 필드명과 형식을 적절하게 바꾸어주었습니다

 

 

이제 Target 테이블을 써먹을 수 있는 준비가 완료되었습니다 :D

 

 

10월까지의 매출만 나와있고, 10월의 데이터도 그나마 12일까지만 있다는 것을 염두에 두면 되겠습니다

 

블렌딩을 위해서 Target 테이블로 넘어가봤더니, 아래의 그림과 같이 두 테이블 간 연결고리가 생성되어 있지 않습니다

필드명이 다를 경우 태블로가 자동으로 인식할 수 없다고 지난 포스트에서 말씀드렸었죠?

 

 

그래서 상단 메뉴 데이터 --> 관계 편집을 통해 두 테이블의 관계를 직접 만들어주도록 하겠습니다

여기에서 주의해야할 점이 있습니다

Orders 테이블 Order Date 필드의 Level of Detail과 Target 테이블 Target Date 필드의 Level of Detail이 다르다는 점입니다

 

 

Order Date 필드(좌측)는 일자 단위에서 날짜가 표현되고 있는 반면,

Target Date 필드(우측)는 월 단위에서 날짜가 표현되고 있습니다

따라서 두 필드의 관계를 잡아줄 때 월 단위에서 맞추어주어야만, 블렌딩이 문제 없이 이루어지게 됩니다

 

조인에서도 날짜의 LOD가 맞지 않을 경우 계산식을 통해 DATETRUNC 함수를 사용하여 두 테이블을 연결했던 적이 있습니다

그 이슈와 정확하게 동일한 현상이라고 보면 되겠지요

 

그래서 두 테이블의 관계를 아래 그림과 같이 잡아주도록 하겠습니다

 

 

단순한 Order Date = Target Date가 아니라, 연월(Order Date) = 연월(Target Date)임을 주의해야합니다!

이제 블렌딩을 만들어보겠습니다

Target 테이블로 넘어가서 두 개의 체인을 연결한 후 Target Sales 필드를 행 선반에 올려보았습니다

 

 

Actual Sales와 Target Sales를 조금 더 선명하게 비교하기 위해서는,

(1) 참조선 방법과 (2) Gantt Chart 방법, 두 가지를 사용할 수 있습니다

 

결과는 크게 다르지 않지만 화면의 자유도 측면에서 유리할 수 있는 (2) Gantt Chart 방법으로 가보겠습니다

 

먼저 마크 카드에서 Sales 필드의 차트 타입은 막대로, Target Sales 필드의 차트 타입은 간트로 선택하겠습니다

 

 

그 다음은 예상할 수 있듯이 이중축이 들어가고, 양쪽의 축을 동기화하면 되겠죠

 

 

화면에서 불필요한 클러터들을 없애주고, 카테고리 필터를 적용하면서 블렌딩이 제대로 작동하고 있는지 살펴보죠

 

 

각각의 카테고리에서 목표(주황색 라인) 대비 실적(파란색 바)이 잘 나오고 있음이 확인됩니다 :D

 

여기에서 우리가 화면의 사용자를 배려하여 한 단계만 더 나아가보면,

목표 대비 실적이 낮았던 월을 조금 더 쉽게 확인할 수 있도록 만들어줄 수 있겠지요!

 

가벼운 계산된 필드 하나만 만들어주면 됩니다

블렌딩을 사용했을 때 양쪽 테이블을 함께 사용하여 계산된 필드를 만들어야 하는 상황에서는

마스터 테이블에서 만들 수도 있고, 보조 테이블에서도 만들 수 있습니다

특별한 상황이 아니라면 저는 마스터 테이블에서 만들어주는 방식을 선호합니다

 

그래서 Orders 테이블에서 아래 그림과 같은 계산된 필드를 만들었습니다

 

 

목표가 실제보다 클 경우 참(목표를 달성하지 못한 경우), 작을 경우 거짓(목표를 달성한 경우)입니다

 

이 필드를 바 차트의 마크 카드 색상 위로 올린 후 약간의 터치를 해주면 아래와 같이 훨씬 더 눈에 들어오는 화면을 만들 수 있답니다 :D

 

 

여기까지입니다

실제 현업에서 블렌딩이 사용될 수 있는 케이스를 상세하게 살펴보았고,

그 과정에서 몇 가지 소소한 팁이나, 주의해야할 점 등을 짚어보았습니다

 

천천히 한 번 따라서 만들어보시고, 막히는 부분이나 어려운 부분은 댓글로 남겨주세요 :D

 

'v3 | Tableau Deep Dive' 카테고리의 다른 글

[3]-3. 블렌딩 (2)  (0) 2019.10.11
[3]-3. 블렌딩 (1)  (0) 2019.10.11
[3]-2. 유니온  (1) 2019.10.07
[3]-1. 조인 (2)  (3) 2019.10.07
[3]-1. 조인 (1)  (1) 2019.10.06