(SQL) 빅쿼리 날짜 함수

(SQL) 빅쿼리 날짜 함수



1. 날짜 함수란?


날짜 함수란 날짜 타입 ( DATE, DATETIME ,TIMESTAMP…) 의 데이터를 다룰때 사용하는 함수이다.

날짜의 출력 형식을 지정하거나 날짜를 계산할 때 사용한다.

  • Case 1 ) 날짜 출력 형식 :
    • YYYY-MM-DD 형식으로 값이 입력되어 있는 날짜 필드를 YYYYMMDD 형식으로 바꾸고 싶다.
    • ( ex. 2024-08-02 -> 20240802 )
  • Case 2 ) 날짜 계산 :
    • 현재 날짜 기준, n일전 데이터에서 전일자 데이터까지 조회하고 싶다.
    • ( ex. 2024년 8월 28일 기준 , 35일전인 데이터에서 전일자 데이터까지 조회하고 싶다 )

날짜 출력 형식을 지정할때는 어떤 함수를 쓰는지, 날짜를 계산할때는 어떤 함수를 쓰는지 아래에서 알아보자.


2. 날짜 함수 소개


앞서 소개했듯이, 날짜 함수는 크게 두가지로 분류할 수 있다.
( 내가 만든 분류이다. 공식적인 분류는 아니다. )

  • 출력 형식 지정 함수: 데이터 타입이나 출력 형태를 지정하는 함수
    • 대표 함수 : FORMAT_DATE , PARSE_DATE , DATE_TRUNC , EXTRACT
  • 계산 함수 : 날짜를 계산하는 함수
    • 대표 함수 : DATE_ADD , DATE_SUB , DATE_DIFF

각 대표 함수에 대한 설명은 아래 표에서 살펴 보자.



1) 출력 형식 지정 함수

함수명정의문법
FORMAT_DATEdate의 날짜값을 지정된 형식의 string값으로 출력한다FORMAT_DATE ( ‘출력하고자 하는 형식’ , 날짜 필드 )
PARSE_DATEstring 타입으로 된 날짜값을 date 타입으로 출력한다PARSE_DATE ( ‘입력된 형식’ , 날짜 필드 )
DATE_TRUNC날짜값을 지정된 범위까지 잘라낸다.지정된 범위 아래의 값은 내림 처림한다DATE_TRUNC(날짜 필드 , 날짜 부분 )
EXTRACT날짜값중 지정한 부분 (ex.월)을 뽑아낸다.EXTRACT ( 날짜 부분 from 날짜 필드 )


2) 계산 함수

함수명정의문법
DATE_ADD지정한 간격만큼 날짜를 더한다.DATE_ADD ( 날짜 필드 , interval n Day )
DATE_SUB지정한 간격만큼 날짜를 뺀다.DATE_SUB ( 날짜 필드, interval n Day )
DATE_DIFF두 날짜 끼리 빼준다. 두 날짜 사이의 간격을 구할 수 있다.DATE_DIFF ( 날짜 필드 1 , 날짜 필드 2 , 날짜 부분 )


특히 출력 형식 지정함수에서 FORMAT_DATE과 PARSE_DATE을 헷갈려하는 경우가 많다.
( ex. 20240825 -> 2024-08-25 )

둘은 서로 역의 관계라고 생각하면 된다.

FORMAT_DATE은 date를 string으로, PARSE_DATE은 string을 date로 바꿔서 출력한다.

특히 PARSE_DATE은 날짜를 나타내는, ‘%Y-%m-%d 형식이 아닌 string값을 날짜 타입으로 변경할때 유용하다.
( ex. 20240825 -> 2024-08-25 )

DATE( ) 사용해서 날짜 타입으로 변경 많이 하는데 %Y-%m-%d 형식이 아닌 string 값은 DATE( ) 함수 사용시 에러가 난다.
이 경우 PARSE_DATE( ) 를 사용해야한다. substr과 concat함수를 이용해서 조합하는 방법도 있지만
구문이 길어지기 때문에 PARSE_DATE( ) 을 사용하는 것을 권장한다.

DB를 일별로 수집한다고 했을때 테이블의 _table_suffix가 ‘%Y%m%d’ 형식으로 되어있는 경우가 많다.
불러온 _table_suffix를 그대로 날짜 필드로 넣고 싶을때 PARSE_DATE를 쓰면 된다.
( 예시: PARSE_DATE(‘%Y%m%d’,_table_suffix) AS yyyymmdd )


3. Appendix


1) 다루고자 하는 날짜 타입 (Date, Datetime ,Timestamp )에 따라 함수명을 변경할 수 있다.

위에서 소개한 함수들은 DATE 타입을 기준으로 함수명을 써놓았는데 예시처럼 다 변경이 가능하다
ㄴ ex) FORMAT_DATE -> FORMAT_DATETIME , FORMAT_TIMESTAMP
ㄴ ex) DATE_ADD -> DATETIME_ADD , TIMESTAMP_ADD

참고로 DATE와 DATETIME, TIMESTAMP는 표현할 수 있는 날짜 범위에 차이가 있다.

  • DATE : 날짜를 년, 월 , 일 까지 저장하고 있는 날짜 타입
  • DATETIME : 날짜를 년 , 월 , 일 , 시 , 분 , 초 ,초 미만으로 저장하고 있는 날짜 타입
  • TIMESTAMP : 날짜를 마이크로초단위 ( 초 이하 소숫점 6자리 ) 로 정밀하게 저장하고 있는 날짜 타입

TIMESTAMP는 빅쿼리상에서는 타임존이 같이 출력된다. ( ex: 2024-01-01 12:30:12.000000 UTC )
빅쿼리 자체적으로는 마이크로초로 날짜값을 저장하고있는데 ( 고정된 초기 시점 이후 경과된 마이크로초 수 )
표기시에 변환해서 출력해주면서 타임존까지 같이 나타내주는것이다.

DATETIME과의 차이는 타임존을 포함하고 있다 정도로 보면 될것같다.

2) 날짜 출력 형식은 아래 표현을 참고하면 된다.

표현설명
%Y년도를 십진수로 표현
%m월을 십진수로 표현
%d일을 십진수로 표현
%H시간을 십진수로 표현
%M분을 십진수로 표현
%S초를 십진수로 표현
%F%Y-%m-%d
%T%H:%M:%S

데이터 야놀자 2024 후기

(행사 후기) 데이터 야놀자 2024 후기


1. 데이터 야놀자 2024 개요 및 참여 후기

데이터 야놀자 2024 개요

  • 행사 장소 : 광화문 Microsoft 사옥 13층
  • 행사 일시 : 2024-06-01 토요일 10:00 ~ 19:00
  • 행사 구성 : 3개의 강의실이 있고 각 강의실에서 연사가 강의하면 참가자가 원하는 강의를 듣는 형식
    강의는 데이터 분석과 관련된 다양한 주제로 진행된다.


참여 후기

내가 데이터 야놀자 2024를 신청한 이유는 크게 2가지였다.

  • 목표 1 : 다른 데이터 분석가들은 어떻게 분석을 하는지 알고싶었다.
  • 목표 2 : 다른 데이터 분석가들과 네트워킹을 해보고 싶었다. 특히 게임업계!

결과적으로 데이터 야놀자 2024 행사를 통해 이 2가지 목표를 다 이룰 수 있었다.

우선, 연사들의 강연을 통해 목표 1을 달성할 수 있었다.

실제 분석 사례 (강연1. 지서영님) , 그리고 데이터 분석을 위한 자세 (강연 2.김선영님) 와 분석 방법론 (강연6.정이태님, 강연7.신진수님) 대해 들을 수 있었다. 강연을 듣고나니, 내가 생각하던것과 크게 다르지는 않아 다행이다 라는 생각이 듦과 동시에 앞으로 공부를 정말로 열심히 해야겠다라는 생각이 들었다.

( 강의 요약은 아래에 정리해두었다. )

모든 연사들이 강연에서 강조했던 것이 드릴 다운해서 분석하는 것이였다.
이 부분은 나도 인지하고 있는 부분이고 분석시에 실제로 하는 부분이라 다행이라는 생각이 들었다.

목표 2도 달성할 수 있었다. 게임업계에서 일하는 다양한 데이터 분석가분들을 만나 얘기를 나누며 각 회사에서
어떻게 데이터 분석을 하는지 , 고민하고 있는 문제는 무엇인지 등을 공유할 수 있는 뜻깊은 자리였다.


2. 강연 요약

강의명강연자
영상 크리에이터 파헤치기지서영 (넥슨)
드릴 다운, 분석가의 멘탈 모델김선영(마켓핏랩)
2년만에 110배 성장을 만든 데이터 문화 이야기홍서연(모요)
빅쿼리 Nested 칼럼을 CROSS JOIN으로 접근하면 데이터 분석을 망칩니다.김진석 (아이오트러스트)
커뮤니티를 그래프 관점으로 분석하다면 어떨까? 실 커뮤니티 데이터를 기반으로 진행하는 그래프 데이터 분석정이태 (GUG)


  • 강연1. 영상 크리에이터 파헤치기
    • 강연자 : 지서영 ( 넥슨 )
    • 내용 :
      • 컨텐츠의 가치 (화제성, 유지성)를 지표화 하는 일을 하고 있음
        • 커스텀 지표를 만들어 제공 : ex) 반응도= (좋아요 + 댓글수) / 조회수 * 100
      • 분석 대상을 드릴 다운하고 대상별로 분석 주제를 정함 : ex) 유튜브 -> 풀 영상 , 쇼츠 영상, 일반 VOD 영상
      • 분석시 기준이 되는 수식 첨부 ex) 회귀식 기반 기울기
    • 후기 :
      • 커스텀 지표를 만들고 이를 기반으로 분석하는 것이 인상깊었다. 단 보는 사람입장에서는 익숙치 않은 지표기때문에
        그 지표가 어떤 로직으로 이루어졌는지 같이 설명해줘야 한다는 것을 명심하자.

  • 강연2. 드릴 다운 , 분석가의 멘탈 모델
    • 강연자 : 김선영 (마켓핏랩)
    • 내용 :
      • 데이터 분석가에게 중요한 것은 드릴 다운하는 자세 ( 드릴 다운 : 측정 기준을 나눠서 판다 )
        • 단순히 2차원 분석에서 끝나지 말고 3차원 이상 다차원 분석을 해라.
        • 계속 고민하면서 나누고 쪼개라. 분석에 대한 집요함이 중요하다.
        • 집요하게 분석하려면 후천적 호기심이 중요하다.
          • 후천적 호기심을 기르는 대표적 방법 : 질문을 모아라. 단 맥락도 같이 수집하라. 맥락을 알아야 올바른 답을 줄 수 있다.
          • ex) 이 광고와 전환율의 상관 관계를 분석해줘.
          • 맥락 : 최근 홈쇼핑 광고가 단가가 올랐다. 그래서 이 광고가 진짜 비용을 태울만큼 효과가 있는지 알고싶다.
            맥락을 알면 질문자의 니즈에 맞는 분석을 해줄 수 있다.
        • 드릴 다운할때는 업에 대한 이해 , 즉 도메인 지식이 중요하다
      • 고객 세그먼트 분석, RFM 분석을 해보자
        - 파레토 법칙 ( 20%의 고객이 80%의 매출을 일으킨다는 법칙 )이 적용되는지 데이터 확인
        • 내 고객중 몇 %가 실제 매출의 대다수를 일으키는지? 이것을 알면 우리가 집중해야하는 고객군을 알수있다. 그러면 그 고객군에게 액션을 취할수 있다.
        • 고객 세그먼트의 기준은 업에 특성에 따라 다르다. 그러니까 꼭 내 데이터 가지고 실제로 고객 세분화해보자.
          그리고 이 과정을 끊임없이 반복하고 분석해야한다.
        • 세그먼트를 나누는 것의 목적은 그 세그먼트에 따라 다른 액션을 취해서 성과(돈)를 일으키기 위해서이다.
    • 후기 :
      • 드릴 다운의 중요성을 다시금 느낄 수 있었다. 파레토 법칙을 평소에 분석하는 데이터에도 적용해보자.

  • 강연3. 2년만에 110배 성장을 만든 데이터 문화 이야기
    • 강연자 : 홍서연 (모요)
    • 내용 :
      • 스쿼드 단위로 프로젝트가 운영
        • 각 스쿼드 : PO, PD (디자이너) , 기획자 , DA (데이터 분석가) 로 구성
      • 데이터 분석가가 스쿼드마다 붙어서 긴밀하게 도움을 줌 : 데이터를 직접 분석해주고 다른 직군의 사람들이 데이터를 분석할 수 있게 환경 구축
      • 로그 기획서 (테이블 명세서)를 전사 직원이 공유 : 로그가 어떻게 구성되어있는지 모든 직원들이 알고 있음.
      • 믹스 패널을 이용해 분석 실험
      • 분석 실험을 한 것은 모두 노션에 정리하여 공유하고 아카이빙함
    • 후기 :
      • 조직 구성원들이 기본적으로 로그에 대한 이해도를 갖추고 업무를 한다는게 인상깊었다.
        그런데 한편으로는 조직 구성원들이 많지 않기 때문에 가능한것이 아닐까라는 생각도 들었다.
        그리고 분석 실험을 한것을 모두 아카이빙해 공유하는 것이 데이터 기반 업무를 하는데 큰 도움이 될 것이라는 생각이 들었다.

  • 강연4. 빅쿼리 Nested 칼럼을 CROSS JOIN으로 접근하면 데이터 분석을 망칩니다.
    • 강연자 : 김진석 (아이오트러스트)
    • 내용 :
      • 구글 애널리틱스 to 빅쿼리 (GA to Big Query ) 할때 Nested 칼럼을 많이쓴다. 이때 UNNEST를 많이 이용하는데 이 방법은 문제가 있다.
        • Nested 칼럼 : 딕셔너리 형태로 되어있는 필드로 칼럼 안에서 특정 Key를 통해 Value를 조회한다.
        • Nested Repeated 칼럼 : Nested 필드가 한 레벨 더 들어가있는것 .칼럼 안에서 특정 key를 찾고 해당 Key와 동일한 레벨에 있는 value를 조회한다.
          파이썬의 딕셔너리의 리스트 형태라고 이해하면 편하다.
        • Nested 칼럼은 키값으로 Value를 뽑아낼수있으니 굳이 Cross Join으로 필드 더 다루지말자
    • 후기 :
      • 효율적으로 테이블을 다루고 쿼리하는 방법을 연구한 것이 인상깊었다. 추후 데이터 마트를 설계할때 참고할 수 있을 것으로 보인다.

  • 강연5. 커뮤니티를 그래프 관점으로 분석하다면 어떨까? 실 커뮤니티 데이터를 기반으로 진행하는 그래프 데이터 분석
    • 강연자 : 정이태 ( GUG : 그래프 데이터 사이언티스트 )
    • 내용 :
      • 커뮤니티 : 자기 자신을 온,오프라인에 표현하며 타인과 교류 (집단,표현,소통)
      • 기업이 커뮤니티에 관심을 갖는 이유 : 커뮤니티는 고객의 이야기인 ‘누가 사고 왜 사는지’를 듣고 의사결정을 할 수 있는 데이터가 모여있는곳
      • 커뮤니티 비즈니스 사례 : ex) 레딧 : 레딧 애즈(ads) - 광고
        • 데이터 제너레이션(Data generation) : 핵심.
        • 관심사가 유사한 사람들끼리 의견 교류를 통해 발생한 자연 데이터를 활용
        • 활용 방안
          • 커뮤니티 성격에 맞는 적절한 글 배치
          • 커뮤니티간 결합을 통해 재미 제공
        • 익명성은 양날의 검, 이를 어떻게 잘 조절할지가 중요
      • 그래프 : 데이터 간 연결 관계에 특화된 구조
        • Network 관점 - Node, Link / Graph 관점 - Vertex, Edge
        • 그래프 데이터 장점 : 데이터간 연관성을 관리하고 활용하는데 편리함
          • ~의 ~의 ~의에 특화
      • 그래프 분석 : 모든 조합을 연결해보고 필터링해서 솔팅하는것
    • 후기 :
      • 강연에서 말한 커뮤니티가 게임사 입장에서는 길드라고 보면 될 것 같다.
        그래프 분석이 관계 분석에 유용할 것으로 보이나 이를 위한 기반 작업이 상당히 필요할 것으로 보인다.

        예를 들어 대부분의 DB가 RDB로 이루어져있는데 그래프 분석을 위한 DB를 별도로 세팅해야한다(GBMS) .
        또한 각 그래프를 연결할때 넣어둔 메타 정보를 이용해서 관계를 지정하는데 새로운 메타 정보를 추가하려면 매번 로직을 새로 만들어줘야해서 실무에서 당장 적용하기는 어려워보인다. 추후 이 점만 개선된다면 활용하기 좋을 것 같다.

(SQL) 모든 필드의 소계 구하기 - UNNEST 이용하여 CUBE 계산

(SQL) 모든 필드의 소계 구하기 - UNNEST 이용하여 CUBE 계산



1. 문제 발생


유저 id , 마켓 , 국가 , 고객 유형, 매출이 각각 필드로 저장되어 있는 데이터가 있다.


유저들의 매출 총액을 마켓 , 국가 , 고객 타입별로 구하려고 하며 소계총계도 같이 보려고 한다.

즉 , 각 필드를 기준으로 CUBE 계산을 하려고 한다.
( CUBE 계산 : 결합 가능한 모든 값에 대하여 다차원 집계를 생성하는 것을 말함)

결과적으로 ,아래 이미지와 같이 집계 결과를 출력하면 된다.
( (ALL)로 적혀있는 부분이 해당 필드의 전체 경우 라고 보면 된다.)



ROLLUP 구문을 이용하고 싶었으나, ROLLUP은 인수 순서에 따라
소계 집계가 계층별로 이루어져 모든 조합(필드)에 대한 소계치를 볼 수 없었다.

아래 이미지가 rollup 구문으로 출력한 결과다.
( [null]로 적혀있는 부분이 해당 필드의 전체 경우라고 보면 된다.)



-- rollup 구문 
SELECT
 market
 , country
 , customer_type
 , SUM(won) AS krw
FROM sample_table
WHERE 1=1
GROUP BY ROLLUP (market, country , customer_type)

즉, 위의 rollup 구문은 인수인 market,country,customer 순으로 CUBE 계산을 하기 때문에
아래 이미지처럼 노란 형광펜으로 칠해진 부분을 구할수 없다.


어떻게 쿼리 구문을 짜야 모든 필드를 기준으로 소계를 구할수 있을까?


2. 문제 해결

UNNEST를 이용하여 배열을 만들고 ,그 배열을 소계를 구하고자 하는 필드에 덮어씌워
GROUP BY 해줌으로써 이를 구현할 수 있다.

말이 복잡해보일 수 있는데 , 정리하자면 아래 구문을 이용한다고 보면 된다.

/* UNNEST([필드1,'전체']) AS 필드 1
   GROUP BY 필드 1 
*/
	
SELECT
  필드1
  , SUM(won) AS krw
FROM sample_table
, UNNEST([필드1,'전체']) AS 필드1 -- 기존 필드와 UNNEST문에서 배열을 풀면서 지정한 필드명은 동일해야함.
WHERE 1=1
GROUP BY 필드1

소계 계산할 칼럼을 UNNEST로 묶어준다.
‘전체’를 값으로 넣은 배열을 만들어주고 UNNEST 해줘서 풀어버린후 집계해준다.
( 전체 대신 “ALL”로 전체치를 표시하고 싶으면 ‘전체’ 대신 “ALL” 을 넣으면 된다)

이때 주의할점은 UNNEST문에서 배열을 풀어줄때 별칭으로 지정하는 필드명과
SELECT문에서 사용할 필드명이 동일해야 된다는 것이다.

지정하는 필드명이 동일해야 GROUP BY로 집계하면서 필드가 덮어씌어지는 효과가 난다.
만약 UNNEST문의 필드명을 SELECT문의 필드명과 다르게 지정한다면 해당 이름으로 된 필드가 하나 더 생기게 된다.
이렇게 될 경우 헷갈릴 가능성이 크므로 위의 예시처럼 필드명을 동일하게 지정하는 것이 좋다.

문제 상황에 적용해보면 아래 구문이 될것이다.

-- unnest로 cube하기 
# (Google BIGQUERY)

SELECT
 market
 , country
 , customer_type
 , SUM(won) AS user_cnt
FROM  blog.post1_unnest_cube 
,UNNEST([market,'(ALL)']) AS market
,UNNEST([country,'(ALL)']) AS country
,UNNEST([customer_type,'(ALL)']) AS customer_type 
GROUP BY market,country,customer_type
;

-- unnest로 cube하기 
# (PostgreSQL)

SELECT
 market2 AS market
 , country2 AS country
 , customer_type2 AS customer_type
 , SUM(won) AS krw
FROM blog.post1_unnest_cube 
, UNNEST(ARRAY[market,'(ALL)'] ) AS market2
, UNNEST(ARRAY[country,'(ALL)']) AS country2
, UNNEST(ARRAY[customer_type,'(ALL)']) AS customer_type2
GROUP BY market2,country2,customer_type2
;

집계 결과가 원하는대로 나온 것을 알 수 있다.




(SQL) null과 관련된 조건식 _ coalesce, nullif, ifnull

(SQL) NULL과 관련된 조건식 _ coalesce, nullif, ifnull


✋🏾 Google BigQuery을 이용하여 쓰인 포스팅입니다.



1. NULL과 관련된 조건식 _ coalesce, nullif, ifnull 란?


BigQuery 조건식 중에 null을 이용하는 조건식은 대표적으로 3가지가 있다.

  • COALESCE(expr1,expr2,[expr3…….)
    • 인수로 들어간 표현식(expr) 중에 null이 아닌 첫번째 표현식 값을 반환한다.
    • 값이 반환되면 나머지 표현식은 평가되지 않는다.
    • 입력 표현식에는 모든 데이터 타입이 입력 가능하다.

  • NULLIF(expr1, expr2)
    • expr1과 expr2가 값이 같으면, null을 반환하고 그렇지 않으면 expr1을 반환한다.
    • expr1과 expr2는 같은 상위 데이터 타입에 속해야하며, 비교 가능해야 한다.

  • IFNULL(expr1, expr2)
    • expr1이 null이면 expr2를 반환한다. 그렇지 않으면 expr1을 반환한다.
    • expr1과 expr2에는 모든 데이터 타입이 입력될 수 있다.
    • COALESCE(expr1,expr2)와 같은 표현이다.


2. 예시


예시 데이터셋은 아래와 같다.

-- 예시 데이터 셋 제작 코드 
WITH ex_table AS 
( 
    SELECT 30 AS col1, 37 AS col2 , 55 AS col3
  UNION ALL SELECT null AS col1, 17 AS col2 , 1 AS col3
  UNION ALL SELECT null AS col1, null AS col2 , 1 AS col3
  UNION ALL SELECT 3 AS col1, 3 AS col2 , null AS col3 
)

SELECT 
  co11
  ,co12
  ,col3
FROM ex_table
;


위 예시 데이터에 null과 관련된 조건식( coalesce,nullif,ifnull)을 넣고 결과를 비교해보자
출력 결과는 테이블 맨 우측에 위치한 result 칼럼에서 확인할 수 있다.

  • COALESCE 구문 예시
/*
coalesce 예시
*/
WITH ex_table AS ( 
SELECT 30 AS col1, 37 AS col2 , 55 AS col3
UNION ALL SELECT null AS col1, 17 AS col2 , 1 AS col3
UNION ALL SELECT null AS col1, null AS col2 , 1 AS col3
UNION ALL SELECT 3 AS col1, 3 AS col2 , null AS col3
)

SELECT
  *,
  coalesce(col1,col2,col3) as result_coalesce
FROM ex_table;





  • NULLIF 구문 예시

/*
nullif 예시
*/
WITH ex_table AS ( 
SELECT 30 AS col1, 37 AS col2 , 55 AS col3
UNION ALL SELECT null AS col1, 17 AS col2 , 1 AS col3
UNION ALL SELECT null AS col1, null AS col2 , 1 AS col3
UNION ALL SELECT 3 AS col1, 2 AS col2 , null AS col3 
)

SELECT
  col1,
  col2,
 nullif(col1,col2) as result_nullif -- nullif는 expr 총 2개만 비교 가능
FROM ex_table



  • IFNULL 구문 예시

/*
ifnull 예시
*/
WITH ex_table AS ( 
SELECT 30 AS col1, 37 AS col2 , 55 AS col3
UNION ALL SELECT null AS col1, 17 AS col2 , 1 AS col3
UNION ALL SELECT null AS col1, null AS col2 , 1 AS col3
UNION ALL SELECT 3 AS col1, 3 AS col2 , null AS col3
 )

SELECT
  col1,
  col2,
 ifnull(col1,col2) as result_ifnull
FROM ex_table





3. 정리


이처럼 null과 관련된 조건식 3가지를 알아보았다.

나는 특히 실무에서 IFNULL 구문을 주로 활용한다.
(거의 IFNULL만 사용한다)

데이터 추출시 LEFT JOIN을 이용하여 테이블끼리 매칭하고 집계하는 경우가 많은데,
이 때 매칭이 안되는 집계 결과(null)를 0으로 바꿔줄때 많이 사용한다.

ex) IFNULL(t2.won,0) AS won

위의 케이스처럼 IFNULL을 LEFT JOIN과 같이 활용하면 매우 유용하니 한번 활용해봐도 좋을 것 같다.


(Tableau) Spotify Music Characteristic Dashboard

Spotify Music Characteristic Dashboard

(tableau) Spotify Music Characteristic Dashboard


1. 대시보드 소개



이 대시보드는 2010년부터 2019년까지 스포티파이의
인기곡 정보를 모아놓은 데이터를 태블로로 제작한 것이다.
(캐글의 Top Spotify songs from 2010-2019-By Year 데이터 활용)

“인기곡의 특성을 한눈에 볼 수 없을까?”라는 주제를 잡고 대시보드를 제작했다.

  • Duration : 음악의 길이
  • Tempo (bpm) : 음악의 빠르기
  • Energy : 음악의 에너지
  • Liveness : 음악의 생동감
  • Valence: 음악이 주는 긍정적인 느낌

이 5가지 특성을 보았으며 Duration과 Tempo는 음악의 형식과 관련된 특성으로
Energy, Liveness, Valence는 음악이 주는 느낌과 관련된 특성으로 분류하였다.

이 분류에 따라 특성의 표현 색상을 구분했다. Duration과 Tempo는 회색으로
Energy,Liveness,Valence는 주황색으로 표현했다.

또한 각 특성값은 0~1의 값으로 정규화해준후 100을 곱해 100점 척도로 바꾸었다.
(MinMax Scaler 활용)

특성값을 100점 척도로 바꾼 이유는 2가지이다.

  • 깂의 범위가 특성에 따라 차이가 커, 한 차트에 나타내기 쉽지 않기 때문이다.
  • 100점 척도는 보는사람이 인식하기 쉽다.

위와 같은 작업을 거쳐 대시보드를 완성했다.

대시보드의 세부내용은 아래에서 살펴보자


2. 대시보드 세부 설명


각 인기곡의 5가지 특성 값을 보드를 이용해 나타냈다.

아래에서 언급할 DJ차트는 각 특성의 레이블이 차트에 표현되지 않는다.
따라서 이 보드를 통해 정확한 특성 값을 확인할 수 있도록 했다.



5가지 특성의 연도별 평균값을 이은 라인차트이다.
이 차트를 통해 각 특성의 평균값 추이를 볼 수 있다.

또한 DJ 차트를 통해 파악한 곡의 특성을 이 차트와 비교해
그 해의 유행과 유사한지를 알 수 있다.

전체 년도의 특성값을 보는 차트이기 때문에 이 대시보드에서 사용되는
필터(년도, 타이틀 기준)은 작동되지 않게 해놓았다.

동작무시를 사용하면 이 차트는 필터가 적용되지 않는다.

예를 들어 2019년의 Ed sheeran의 ‘I Don’t Care’는
2019년도의 유행하는 템포보다는 느리고 곡의 길이는 긴 것을 알 수 있다.

또한 이 곡이 주는 생동감과 에너지는 2019년의 유행보다는 적지만
긍정적인 느낌을 더 준다는 것을 파악할 수 있다.


년도를 선택하는 옵션칸이다.

이 옵션칸에서 선택한 년도 기준으로 곡 리스트 테이블이 세팅된다.
(필터로 작용)


이 대시보드의 핵심인 DJ차트이다.
DJ들이 사용하는 이퀄라이저의 형상을 본따 만든 차트이다.

곡 리스트 테이블에서 특정곡을 선택하면 그 곡의 특성값이 이 차트에 나타난다.


곡 리스트 테이블이다.
타이틀 - 아티스트 - 장르 - 인기도 순으로 구성되어있다.
인기도 값을 기준으로 내림차순 정렬해놨다.

위에서부터 아래로 인기있는 곡이라고 보면 될 것같다.


3. 피드백 및 느낀점

여태까지 작업했던 태블로 대시보드 중 가장 만족스럽게 나온 대시보드이다.
디자인과 구성이 깔끔하게 나와 뿌듯한 작업물이다.

이 대시보드의 포맷은 다른 데이터에도 충분히 활용될 수 있을 것 같다.
추후 다른 데이터에도 이 디자인과 구성을 활용해 대시보드를 제작해봐야겠다.

Pagination


© 2024. All rights reserved.