본문 바로가기

Dissecting Tableau

[3]-1. 조인 (2)

계속해서 조인 관련 내용을 조금 더 살펴봅니다

 

지난 포스트에서는 Inner Join, Left Outer Join, Right Outer Join, Full Outer Join 등 조인의 일반적인 내용에 대해 다루었다면

이번 포스트에서는 좀 특별한 형태의 조인에 대해서 몇 가지 소개하고자 합니다

 

특별하다는 말 자체가 일반적이지 않으며, 특수한 경우에 사용한다는 의미겠지요

따라서 이제부터 소개할 내용은 그리 흔히 사용되는 방법은 아니지만,

특정한 상황에서 유용하게 사용되거나, 반드시 사용해야만하는 기법들입니다

 

 

 

크로스 조인(Cross Join) = 카르테지안 조인(Cartesian Join)


먼저 소개할 기법은 크로스 조인입니다

카르테지안 조인이라고도 불리는 이 방법은 기본적으로 데이터를 뻥튀기 하는 작업이라고 이해하면 됩니다

 

데이터를 통해 직접 확인해보겠습니다. 간단한 샘플 데이터를 한 번 만들어보았습니다

SampleData2.xlsx
0.01MB

 

왼쪽은 연도 정보를 담고 있는 Table_A, 오른쪽은 월 정보를 가지고 있는 Table_B 입니다

크로스 조인이 작동하는 방식은 Table_A의 첫번째 행에 Table_B의 모든 행을 가져다 붙입니다

Table_A의 다음 행에도 동일한 방식으로 데이터가 붙고, 그 다음 행에도 마찬가지입니다

언제까지요? Table_A의 마지막 행까지입니다

 

 

위의 데이터셋을 보면 먼저 Table_A의 2007년 행에 Table_B의 1월 ~ 12월까지가 붙습니다

Table_A의 2008년 행에도 동일하게 Table_B의 모든 데이터가 붙고, 2009년에도, 2010년에도 계속 붙습니다

마지막에는 Table_A의 2018년 행까지 Table_B의 모든 데이터가 연결됩니다

 

그러면 조인의 결과 총 몇 개의 행이 나올까요?

12 * 12 = 144개의 행이 생성되겠지요

 

직접 한 번 확인해보죠

Link 필드를 이용해서 Table_A와 Table_B를 붙여보겠습니다

 

 

Inner Join으로 설정되어있고, 키 필드는 왼쪽과 오른쪽 테이블 모두 Link 필드로 잡혀있습니다

오른쪽 행의 개수가 144개로 나와있음을 확인할 수 있습니다

 

두 가지 질문이 나올 수 있습니다

 

크로스 조인을 위해서는 Link 필드가 항상 필요한가요?

사실 Link 필드는 두 테이블을 엮는 역할을 제외하곤 아무 쓸짝에 없는데 말이죠

 

Link 필드 없이도 크로스 조인이 가능합니다

조인을 Inner Join을 설정한 후 키 필드를 설정하는 부분을 보면 조그만한 역삼각형을 확인할 수 있습니다

저기를 누르면 제일 아래쪽에 조인 계산식을 입력할 수 있는 항목이 있습니다

클릭하면 아래와 같이 나오게 됩니다

(사용자들로부터 들은 이야기인데, 간혹 조인 계산식 항목이 나오지 않는 경우가 있다고 합니다

데이터를 드랍한 후 다시 올려보길 권하며, 그래도 안 될 경우에는 태블로를 껐다가 다시 켜보면... ㅠㅠ)

 

 

여기에서 왼쪽도 그냥 숫자 1, 오른쪽도 숫자 1 입력해주면 아래와 같이 144개의 행이 나오게되죠

결과는 Link 필드를 활용했을 경우와 동일합니다

 

다음은 조금 더 본질적이고, 중요한 질문입니다

크로스 조인은 언제, 어떤 경우에, 어떤 목적으로 사용하나요?

크로스 조인의 사용처가 당연히 이 경우에 국한되지는 않겠지만,
태블로에서는 커스텀 차트를 그릴 때 일종의 공식처럼 활용되는 경우가 많습니다

아래 그림은 최근 #MakeoverMonday 프로젝트를 통해 만들었던 생키 차트입니다

 

 

출발점에서 도착지까지 곡선이 스무스하게 연결된 것처럼 보이지만,

사실은 저 선 상에 수많은 점들이 들어가있고, 그 점들을 직선으로 연결한 것입니다

그 점들을 만들어주는 작업이 바로 크로스 조인입니다

 

2018년 9월의 #SportsVizSunday 작업도 크로스 조인을 활용한 예시입니다

 

 

미국과 유럽의 국기가 걸쳐져있는 반원 부분을 구현하기 위해서는 반드시 크로스 조인을 활용해야 합니다

 

태블로를 통해 뭔가 곡선을 구현하고 싶다, 그러면 어지간하면 크로스 조인을 쓰게 될 것입니다 :D

 

한 가지 주의해야할 점은, 

기본적으로 데이터를 뻥튀기하는 작업이기 때문에, 퍼포먼스 측면에서 이슈가 발생할 수 있습니다

따라서 대용량의 데이터에 대해서 크로스 조인을 수행하는 것은 그 필요성과 대체 방법의 존재 유무에 대해 꼼꼼히 따져봐야할 것입니다

 

 

 

셀프 조인(Self Join)


두번째 살펴볼 방법은 셀프 조인입니다

이제까지는 필요한 정보를 결합하기 위해 서로 다른 테이블 A와 테이블 B를 조인하는 방식이었다면,
셀프 조인은 - 그 이름에서도 넘겨짚을 수 있듯이 - 테이블 A를 테이블 A 자신과 조인하는 기법입니다

Table_C는 서울, 부산, 대구 세 도시의 위치 정보를 가지고 있습니다
자기 자신과 조인하기 위해 동일한 테이블을 오른쪽에 함께 위치시켰습니다

 

 

셀프 조인이 작동하는 방식은 앞서 살펴본 크로스 조인과 유사합니다

다만, 조인의 대상이 되는 테이블이 자기 자신이라는 것만 다를 뿐이지요

 

셀프 조인 결과를 확인해보겠습니다

 

 

Inner Join 선택 후 키 필드를 조인 계산식으로 들어가 1로 잡아줬습니다
자기 자신을 조인하되, 크로스 조인 형태로 만들어주기 위함입니다

동일한 테이블이 두 개 올라가는 것이기 때문에 둘을 구분하기 위해
처음 올린 왼쪽 테이블은 원래 이름 Table_C가 나오고 있고, 두번째로 올린 오른쪽 테이블은 Table_C1으로 표현되고 있네요

서울, 부산, 대구의 지점 데이터가,
서울 - 부산, 서울 - 대구, 부산 - 서울, 부산 - 대구, 대구 - 서울, 대구 - 부산 등 구간 데이터 형태로 전환되었다는 사실이 중요합니다

바로 이 부분이 셀프 조인의 활용법과 관련되어 있습니다

아래의 그림은 서울에 있는 347개 신한은행 지점을 좌표로 찍어본 화면입니다

 

 

오른쪽 지점 선택 필터를 통해 광화문 지점을 선택해보았습니다

 

 

광화문 지점(가운데 0으로 표기된 지점) 반경 1km 내에 있는 지점들이 지도 위에 클로즈업되어 표시되고 있습니다

 

셀프 조인을 통해 구간 형태로 데이터를 만들어주었기 때문에 이런 종류의 시각화가 가능하게 된 것이죠 :D

 

 

 

계산식을 활용한 조인(Join with Advanced Calculation)


마지막으로 소개하고 싶은 내용은 특별한 형태의 조인은 아니지만,

계산식을 통해 자유롭게 키 필드를 만들어줄 수 있는 예시를 두 가지 정도만 살펴보려고 합니다

 

첫번째 예시는 날짜 관련 함수를 활용하여 키 필드의 Level of Detail을 맞추는 기법입니다

먼저 왼쪽 테이블(Table_D)은 아래와 같은 연도별 매출 목표 정보입니다

 

 

오른쪽 테이블(Table_E)은 아래와 같이 매월 매출 실적을 기록한 정보입니다

2016년 1월부터 2018년 9월까지 총 33개의 행으로 구성되어 있습니다 

 

 

이 두 테이블은 하나로 정리되어 있어야 분석에 용이합니다

하지만 키 필드의 depth(level of detail)가 서로 다르기 때문에 (하나는 연도, 나머지 하나는 월), 두 테이블을 바로 붙이기는 어렵습니다

 

하지만 Table_E의 Date 필드에서 연도만 끄집어낸 후 Table_D와 Table_E를 Inner Join으로 붙이면 어떨까요?

 

흐름을 조금 더 세부적으로 살펴보면,

Table_E의 Date 필드에서 연도만 뽑아내면

제일 위의 12개 행(1-12월)은 2016, 다음의 12개 행(1-12월)은 2017, 다음의 9개 행(1-9월)은 2018이 되겠지요

2016, 2017, 2018은 Table_D의 Year 필드에 있는 값들입니다

따라서 조인이 가능하게 되지요

 

아래의 그림처럼 Table_D에서는 키 필드를 Year로 잡아주고,

Table_E에서는 조인 계산식을 YEAR([Date])로 만들어주면서, Date 필드에 있는 연월 정보 중 연도 정보만 뽑아냅니다

그렇게 되면 좌우의 키 필드가 맞아 떨어지면서 조인이 수행되는 것이죠

 

 

이처럼 날짜의 LOD가 맞지 않을 경우에는,

YEAR 함수, DATETRUNC 함수 등을 통해 적절히 맞추어줌으로써, 두 개의 테이블을 연결할 수 있습니다 :D

 

두번째 예시는 문자열 관련 함수를 활용하여 키 필드를 맞추는 방법입니다

 

Table_F는 서울시의 인구정보를 담고 있습니다

 

 

Table_G는 서울시 각 자치구의 인구정보를 가지고 있습니다

 

 

이 두 테이블을 하나로 엮기 위해서는 키 필드가 필요합니다

명칭으로는 일치하는 값이 전혀 없기 때문에 코드를 활용해야 합니다

서울시의 코드는 11로 시작하고 뒤에는 0이 붙어있고, 서울시 각 자치구들도 11로 시작한 후 각 구의 고유한 숫자들이 붙어있습니다

따라서 코드의 첫 두자리를 키 필드로 삼으면 두 테이블을 연결할 수 있을 것 같습니다

 

그러기 위해서는 코드의 첫 두자리를 가져오는 LEFT 함수를 써야하는데,

LEFT, RIGHT, MID 등의 함수는 문자열 필드를 대상으로만 작동합니다

 

그래서 먼저 각 테이블의 코드 필드를 숫자 타입(#)에서 문자열 타입(ABC)으로 바꾸어주겠습니다

 

 

다음으로 Table_F와 Table_G 사이의 벤다이어그램을 클릭해 조인 설정창을 연 후

Table_F에서는 조인 계산식을 LEFT([시도 코드], 2), Table_G에서는 조인 계산식을 LEFT([시군구 코드], 2),

이렇게 입력해주면 됩니다

LEFT 함수는 각 문자열 필드에서 왼쪽으로부터 2개의 글자를 가지고 오라는 의미입니다

우리가 원하는 바와 정확히 일치하는 함수이죠

 

아래의 그림을 통해 두 테이블이 의도했던 바대로 연결되었음을 확인할 수 있습니다

 

 

두 가지의 예시만 소개했을 뿐, 조인 계산식을 활용해 테이블을 원하는 형태로 연결하는 방법이 이것 뿐이 아니겠지요
원본 테이블의 필드가 원하는 형태로 제시되어 있지 않을 때 사용을 한 번 고려해보는 것도 괜찮을 것 같습니다 :D

조인은 여기까지입니다
다음 포스트에서는 유니온으로 찾아오겠습니다!

 

사업자 정보 표시
비즈랩 | 최정민 | 경기도 용인시 기흥구 중부대로746번길 21, 210-1503 | 사업자 등록번호 : 534-02-01239 | TEL : 070-8095-4524 | 통신판매신고번호 : 제2020-용인기흥-0205호 | 사이버몰의 이용약관 바로가기

'Dissecting Tableau' 카테고리의 다른 글

[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
[2]-6. 사용자 지정 SQL  (1) 2019.10.06
[2]-5. Data Prep Hands-On  (1) 2019.10.05
  • VizLab 2019.10.07 13:03 신고

    2018년 10월, 네이버 포스트에 작성했던 글을 마이그레이션 하였습니다 🙂

  • 박지영 2020.06.18 20:14

    안녕하세요. 너무 좋은글 잘 봤습니다. 강의도 들었었는데 제가 기초부터 듣지 않아서 어렵네요.
    데이터 조인 중 셀프 조인이 궁금해서 와봤는데 지금 여기서는 self inner join 만 되어 있어서요 !
    동일한 결제이력이 있는 테이블을 self left join 하여 당월 이력과 전월이력을 한번에 보려고 했는데요
    자꾸 추출할 때마다 이 데이터가 어떻게 연결되어 있는 것인지 헷갈려서 행에다 필드를 올릴 때, 기준이 되는 테이블의 필드를 써야하는지
    아니면 left join 되는 오른쪽 테이블의 필드를 써야하는지 헷갈립니다.

    혹시 SELF LEFT JOIN 시 데이터가 어떻게 붙게 되는지 ... 알려주실 수 있나요 ㅠ?

    • VizLab 2020.06.18 20:34 신고

      카르테지안 조인 자체가 왼쪽 한 행, 한 행에 오른쪽 모든 행을 붙인다는 개념이기 때문에 셀프 조인을 inner 방식을 하든 left 방식으로 하든 결과는 같습니다

      말씀하신대로 카르테지안 조인 기법으로 데이터를 붙이게 되면 똑같은 이름을 가진게 두 개가 생겨나기 때문에 매우 헷갈립니다 +_+

      기본적으로 왼쪽(또는 primary table)에 있는 녀석을 기준으로 사용을 하시되, 측정값 올리실 때 주의하셔야 합니다. 데이터 행의 개수만큼 뻥튀기 된 value가 나올 것이기 때문에 이걸 AVG 집계 또는 LOD 표현식을 통해 적절히 잡아줘야 합니다

      셀프 조인 자체가 데이터가 뻥튀기 될 수 밖에 없는 퍼포먼스를 해치는 방법이기 때문에, 내가 당면한 문제를 해결하기 위해 반드시 이 방법 밖에 사용할 수 없는지 한 번 더 고민해보시고, 대안이 있으면 그 방법을 고려해보시길 추천드립니다 :D