54일차

Suhyeon Lee·2024년 12월 16일

CodeKata

SQL

175. Contest Leaderboard

  • 작성한 쿼리
SELECT
  hacker_id
  , name
  , SUM(max_score) AS total_score
FROM
  (
  SELECT
    s.hacker_id
    , name
    , challenge_id
    , MAX(score) AS max_score
  FROM
    submissions s
    JOIN hackers h
    USING(hacker_id)
  GROUP BY
    s.hacker_id
    , name
    , challenge_id
) a
GROUP BY
  hacker_id
  , name
HAVING
  SUM(max_score) <> 0
ORDER BY
  SUM(max_score) DESC
  , hacker_id
;

→ 원래 WITH 구문 썼는데 제출이 안 돼서 서브쿼리로 바꿈
(해커 랭크에서는 버전 문제로 with절 사용 시 쿼리 실행이 안 될 때가 있다고 함)

Python

68. 햄버거 만들기

  • 작성한 코드
def solution(ingredient):
    answer = 0
    make_burger = [1, 2, 3, 1]
    stack = []
    for i in ingredient:
        stack.append(i)
        if len(stack) < 4:
            continue
        if stack[-4:] == make_burger:
            answer += 1
            for _ in range(4):
                stack.pop()
    return answer

참고할 만한 다른 풀이

def solution(ingredient):
    temp = []
    cnt = 0
    
    for i in ingredient:
        temp.append(i)
        if temp[-4:] == [1, 2, 3, 1]:
            cnt += 1
            for n in range(4):
                temp.pop() 
    
    return cnt
def solution(ingredient):
    ing = []
    cnt = 0
    
    for i in ingredient:
        ing.append(i)
        if ing[-4:] == [1, 2, 3, 1]:
            cnt += 1
            del ing[-4:]
    
    return cnt
-- 1
def solution(ingredient):
    ingredient = "".join(list(map(str, ingredient)))
    if len(ingredient) < 4:
        return 0

    stack = ingredient[:3]
    count = 0
    for v in ingredient[3:]:
        stack += v
        if stack[-4:] == "1231":
            stack = stack[:-4]
            count += 1
    return count 
    
-- 2
def solution(ingredient):
    s = ''.join(list(map(str, ingredient)))
    answer = 0
    while '1231' in s:
        if s.find('1231') >= 4:
            s = s[s.find('1231')-4:]
        s = s.replace('1231','',1)
        answer += 1
    return answer

태블로

매개변수와 계산된 필드

참고

매개변수

  • 계산, 필터, 참조 등에서 상수값으로 대체할 수 있는 숫자/날짜/문자열 등과 같은 통합 문서 변수
    • 예: 카페인 용량 80mg으로 지정한 용량에 따라 색상을 표현하는데 용량을 80mg이 아니라 100mg 기준으로 보고 싶을 때 아래와 같은 문제를 해결하는 방법 중 하나
      • 매번 계산식을 수정해야 할까?
      • 편집 권한이 없고 조회만 가능한 사용자를 위해서는 어떻게 해야 할까?
        → 10 - 100까지 범위의 매개변수를 써 주면 사용자가 원하는 용량 기준으로 유연하게 변경 가능

    예시

    측정값을 칼로리/카페인/당류 선택 가능하도록 하고, 선택한 카페인 함유량에 따라 카테고리 색상이 표시되도록 해 주세요

  1. 측정값 선택을 위한 매개변수 생성

    • 이름: 측정값 선택
    • 데이터 유형: 문자열
    • 허용 가능한 값: 목록
    • 값 목록: 칼로리, 카페인, 당류
  2. 위에서 만든 매개변수를 이용하는 '계산된 필드' 생성

    • [측정값 선택] 매개변수에서 선택에 따라 측정값 가져오도록 계산식 작성
      • '칼로리' 선택 시 [칼로리] 측정값 가져오기
      • '카페인' 선택 시 [카페인] 측정값 가져오기
      • '당류' 선택 시 [당류] 측정값 가져오기
  3. 매개변수를 표시 후, 카테고리별(열) 선택한 측정값(행) 배치

    • 측정값 선택에 따라 막대차트의 데이터가 변경됨

  1. 카페인 함유량별 색상 변경을 위해 또 다른 매개 변수 생성

    • 이름: 카페인 함유량 선택
    • 데이터 유형: 정수
    • 허용 가능한 값: 범위
    • 값 범위: 최소값 0, 최대값 200, 단계 크기 20
  2. 마찬가지로 매개 변수를 활용하는 계산된 필드 생성

  3. 카페인 함유량 선택 매개 변수를 표시하고, 선택한 카페인 필드를 마크 색상에 두면 카페인 항유량 선택 수치 변경에 따라 색상이 변경됨

  4. 시트 제목에 매개 변수를 삽입하여 [측정값 선택] 값에 따라서 제목이 변경되도록 설정

  • 선택한 측정값에 따라 시트 제목 또한 변경됨

선택한 측정값에 따라서 두 측정값의 상관 관계를 살펴보는 동적 시각화를 만들어 보세요.

  1. 첫 번째 매개 변수

    • 이름: X축 선택
    • 데이터 유형: 문자열
    • 허용 가능한 값: 목록
    • 값 목록: 카페인, 칼로리, 나트륨, 당류
  2. 두 번째 매개 변수

    • 이름: Y축 선택
    • 데이터 유형: 문자열
    • 허용 가능한 값: 목록
    • 값 목록: 카페인, 칼로리, 나트륨, 당류
  3. 첫 번째 매개 변수를 위한 계산된 필드

    • 이름: X축(열)
  4. 두 번째 매개 변수를 위한 계산된 필드

    • 이름: Y축(열)

→ X,Y축 각각 측정값을 선택할 수 있고, 선택한 측정값들의 상관관계를 나타낸다. (시트명도 매개변수 적용)
평균라인 추가 및 마크모양/색상/투명도를 통해 가독성을 높여주도록 하자.

세부 수준(LOD) 표현식의 이해

참고

LOD 표현식의 작동 방법: '세부 수준' 설명

  • 데이터 탐색의 핵심: 원본의 구조를 이해하는 것
  • 다음과 같은 질문에 대한 답변을 찾을 수 있도록 세부 수준(LOD) 표현식이라는 새로운 구문이 도입됨
    • 분기별로 회사의 주문이 100개 이상이었던 일 수를 파악하고 싶어요
    • 영업 담당자별로 성사된 거래 중 규모가 가장 큰 거래를 찾고 관리자별 평균을 파악하고 싶어요
    • 각 고객에게 처음 고객이 된 연도를 태그로 지정한 다음, 해당 태그를 사용하여 매출을 그룹화 하고 싶어요
  • 예: 가장 세부적인 수준이 주소별로 나열된 레스토랑 검사 데이터가 있을 때 데이터를 집계하여 우편 번호, 구/군/시, 시/도 또는 국가별로 속성을 확인
    • Tableau에서는 원하는 차원(예: 구/군/시, 시/도)을 뷰에 드롭해 이러한 작업을 수행할 수 있음
    • 뷰에 추가한 차원에 따라 데이터가 '비쥬얼라이제이션 세부 수준', 즉 비쥬얼라이제이션 LOD로 집계됨
      • 하이라이트 된 선반에 차원을 배치하면 비쥬얼라이제이션 LOD에 추가됨
    • 차원을 페이지, 필터 및 도구 설명 선반에 배치하면 비쥬얼라이제이션 LOD에 추가되지 않음
      • 시각적으로 표시하지 않으면서 뷰에 있는 데이터를 수정할 수 있음
  • LOD 표현식을 사용하면 세부 수준(예: 차원)을 비쥬얼라이제이션에 실제로 드롭하지 않고도 계산에서 사용되는 세부 수준을 결정할 수 있음

예시

  • 레스토랑 검사 데이터

  • 뷰에 더욱 세부적인 차원을 추가하면 비쥬얼라이제이션 LOD의 집계 수준이 낮아짐

    • Business ID를 세부 정보 선반에 드롭하여 비쥬얼라이제이션에 추가하면 비즈니스별 평균 사용자층을 볼 수 있음
      • 개별 비즈니스 비쥬얼라이제이션도 맵에서 원으로 변경됨
    • 비쥬얼라이제이션을 변경하지 않으려면 어떻게 해야 할까?
      • 비즈니스 ID별 총 고객층을 결정하고 구/군/시별 해당 값의 평균을 구하고 구/군/시별로 원을 하나씩만 표시하려면?
    • 구/군/시별 각 레스토랑의 평균 고객 수를 파악하려면 비쥬얼라이제이션에 차원을 드래그하지 않고 뷰에 차원을 추가해야 함 → LOD 표현식을 사용하면 해당 작업 수행 가능
      • Fans per Business(비즈니스별 고객 수)
        {FIXED [Business ID]: SUM([User Fans])}
      • 이 표현식을 사용하면 비쥬얼라이제이션에 사용된 다른 차원과 관계 없이 Tableau에서 각 Business ID에 대한 집계를 수행: LOD 표현식을 사용하여 Business ID별 총 User Fans(사용자 수)를 계산할 수 있음
      • 이 새 필드를 뷰에 드래그한 다음 구/군/시별 해당 값에 대한 평균을 구할 수 있음

LOD FIXED 함수

  • <제품 대분류> 수준에서 매출의 합계를 구하고 싶을 때
{ FIXED [제품 대분류]:SUM([매출])}
  • 고정하고 싶은 차원 : 집계하고 싶은 측정값
  • 결국, <제품 중분류> 차원을 고려하지 않겠다는 말과 같으므로 EXCLUDE를 써도 동일한 결과가 나옴

LOD EXCLUDE 함수

{ EXCLUDE [제품 중분류]:SUM([매출])}
  • 제외하고 싶은 차원 : 집계하고 싶은 측정값

LOD INCLUDE 함수

  • 뷰에는 포함되어 있지 않는 차원이지만, 계산식에는 고려해서 집계하고 싶을 때 사용
  • 주문 번호별 매출을 볼 때, '지역' 차원도 고려해서 보고 싶다면
{ INCLUDE [지역]:SUM([매출])}
  • 집계 수준: 합계
  • 집계 수준: 평균
    • 열 선반에 \<매출>과 \의 집계 수준을 둘 다 합계로 설정하면 차이가 없지만, 평균으로 설정하면 값이 달라짐
    • 집계 수준을 합계로 설정하면 \<매출>의 경우 각 주문 번호에 해당되는 모든 제품 코드의 매출의 합이 계산되고, \의 경우도 각 주문 번호 당 대응되는 지역이 하나이기 때문에 결국 동일한 값이 나옴
    • 반면, 집계 수준을 평균으로 설정하면 \<매출>의 경우 각 주문 번호 당 평균 매출(주문 번호 당 총 매출/제품 코드 수)이 계산되지만, \의 경우 각 지역 당 평균 매출이 계산되는데, 주문 번호와 지역은 하나씩 대응되므로 결국 합계로 집계한 것과 동일함

LOD FIXED 함수 응용

Q. 2014년에 처음 구매한 고객이 2017년 매출에 얼마나 기여하고 있을까?

{ FIXED [고객명] : MIN([주문 일자])}
  • 화면에는 추가되어 있지 않지만, 고객별로 최초 구매일자를 알고 싶을 때 위와 같이 계산식을 작성할 수 있음
  • 해당 그래프를 보면, 2014년에 처음 구매한 고객이 2017년에 73.62% 차지하고 있다는 것을 알 수 있음

예시: 주문 번호 당 평균 매출

  • 주문 번호 당 평균 매출을 구하고 싶은데, 위 사진처럼 <주문 번호> 차원이 화면에 포함되어 있을 때 말고 단순히 숫자 하나로만 표현하고 싶다면
{ INCLUDE [주문 번호]:SUM([매출])}
{ FIXED [주문 번호]:SUM([매출])}
  • 위와 같이 계산식을 작성하고 집계 수준을 평균으로 바꾸면 672.762가 출력됨
    • 이렇게 LOD 계산식을 사용하지 않고 단순히 <매출>의 집계 수준을 평균으로 설정하면, 주문 번호 당 매출의 평균이 아닌 전체 매출의 평균(332.467)이 출력됨

패널별 순위 / 정렬

  • 위와 같이 지역별 제품 중분류별 매출의 합계 그래프가 있다고 했을 때, \<합계(매출)> 차원을 ctrl을 누른 채로 마크의 '세부 정보'로 이동
    • 세부 정보에 추가하는 이유: 뷰를 변화시키지 않으면서 추가적인 계산 또는 속성을 변경하기 위해서
  • 마우스 우클릭 > 불연속형으로 변경

참고

  • 초록색 : 연속형 / 파란색 : 불연속형
    • 연속형 필드는 축을 생성하는 반면, 불연속형 필드는 머리글을 생성하고 만들어진 측정값을 분할하는 역할
  • 마우스 우클릭 > 퀵 테이블 계산 > 순위로 변경
    • 해당 필드를 행 선반으로 옮겨 \<지역>과 \<제품 중분류> 사이에 넣음

  • 순위가 계산되어 있긴 하지만 지역별로 순위가 아님
    • 지역별로 순위를 보고 싶으면 \<합계(매출)> 필드에서 마우스 우클릭 > 다음을 사용하여 계산 > 패널(아래로)
    • 만약, '매출의 순위' 열을 보고 싶지 않으면 합계(매출)> 필드에서 마우스 우클릭 > 머리글 표시 해제

효과적인 드릴다운을 위한 집합 동작(Set Action)

  • 대시보드 내 세부 정보를 효과적으로 드릴다운할 수 있는 방법 중 하나인 집합 동작 활용 방법 알아보기
  1. 태블로(Tableau)에서 대시보드의 세부 정보를 효과적으로 드릴다운하는 방법
  2. 집합 동작(Set Action)을 활용한 드릴다운 기법
  3. 사용자 친화적인 대시보드를 만들기 위한 팁

집합 동작 활용

  • 집합 동작을 활용하여 태블로의 드릴다운 기능을 사용하면 사용자들이 필요한 정보를 쉽게 찾아볼 수 있어 대시보드의 활용도를 크게 높일 수 있음

  • '대분류>중분류'별 매출을 나타낸 두 막대 차드 중 오른쪽 차트가 눈에 더 잘 들어옴
    • 왼쪽 차트의 경우 대분류와 중분류를 모두 펼친 형태이지만 오른쪽 차트는 선택된 항목의 세부 정보를 나타내는 차트를 활용 → 한눈에 필요 정보를 더욱 명확하게 표현할 수 있음

실습

  1. 대분류별 매출 막대 그래프 만들기

    • [대분류]를 행 선반 위에, [매출]을 열 선반 위에 올려 대분류별 매출을 나타낸 막대 그래프 생성
  2. 대분류 집합 생성하기

    • 왼쪽 데이터 패널 차원의 [대분류] 필드를 마우스 오른쪽 클릭하여 '만들기>집합'을 선택
    • 이름을 [대분류 집합]으로 설정하고 '목록에서 선택' 유형으로 선택
      • 어떠한 값도 선택하지 않고 확인 누르기
  3. 계산식 만들기

    • [대분류 집합]에 IN(포함)되는 경우 [대분류]+'-중분류별' 텍스트가 보이게 하고, OUT(미포함)되는 경우 '+' 버튼이 나타나도록 계산식 만들기
      • 예를 들어, [대분류 집합]의 '가구'를 'IN'으로 선택했을 때 '가구 - 중분류별'로 나오게, 선택되지 않은 항목의 경우 '+'로 나오게 설정
      • 즉, [대분류 집합]이 'IN'에 해당하는 경우, [중분류] 수준으로 세분화되어 나타나게 하고, 'OUT'인 경우 [대분류]와 수준이 동일하도록 아래와 같은 계산식을 만들어 주는 것

집합을 IF식에서 사용할 때 → IF [집합] THEN ~ END = 집합의 ‘IN’값을 TRUE로 반환

  1. 드릴다운 설정
  • 행 선반의 맨 오른쪽에 만들어 놓은 계산식을 올려 [대분류 집합]에서 IN인 항목만 중분류 수준으로 드릴다운 되도록 설정
    • 이 외 'OUT' 항목은 대분류 수준으로 나타나는 것을 확인
  1. 필요 없는 내용 제외
    • 굳이 보시 않아도 되는 내용은 숨김 및 제외 처리
      • 행 선반의 맨 위쪽 [대분류] 필드 '머리글 표시' 해제
      • 행 선반에 올린 필드 이름을 시트에서 '행에 대한 필드 레이블 숨기기' 선택
  1. 색상 지정용 계산식 만들기

    • 선택한 대분류와 나머지에 대한 구분을 쉽게 하기 위해 대분류 집합 'IN'인 항목과 'OUT' 항목을 구분하는 계산식을 만들어 색상 마크 위에 올리기
  2. 대시보드

    • 음영을 다른 색상으로 변경하여 사용자로 하여금 [대분류] 버튼을 선택하여 상세 정보 확인이 용이하도록 만듦
    • 대시보드 상단 탭에서 대시보드 > 동작 > 집합 값 변경을 통해 클릭할 때마다 선택된 대분류 집합이 변경되도록 설정
      • 실행 조건: 선택

동작 실행 조건

  • 선택 = 마우스 클릭
  • 마우스 오버 = 커서를 가져다 대면 동작 실행
  • 메뉴 = 마우스 클릭 시 별도의 창 팝업, 창 내에서 클릭
  • 대상 집합 = 어떤 집합의 값을 변경할 것인지 지정

회고

  • 내일부터 프로젝트 시작! 화이팅~
profile
2 B R 0 2 B

0개의 댓글