[250121] 사전캠프 7일차 아티클 스터디 + SQL (Subquery, 따옴표별 차이점)

이효원·2025년 1월 21일

아티클 스터디

데이터 분석가가 되어보니 중요한 것들
[주제]

데이터 분석가의 실무

[아티클 요약]

  • 데이터 분석가 대한 정의
    • 취업 전 착오 : 모델링 기술 집중
    • 현업을 통한 새로운 정의 : 데이터 기반 의사결정을 돕는 사람
  1. 데이터 기반
  • 데이터가 흐르는 조직을 만들어야, 위 단계로 나아갈 수 있음
    • BI 툴 도입 : 대시보드 생성
    • SQL 교육 : 데이터 형태 직접 파악해 깊이 있는 분석 가능해짐
    • 데이터 마트 : 원하는 데이터 찾지 못하는 사람 많음. 원천 데이터 아닌 데이터 마트 사용 유도
    • 주요 지표 인지 : 리포트 형태로 지표 공유
      • 결과 지표 추이를 통해 예상되는 미래 상황과 목표 대비 성과 전달
      • 결과 지표에 선행하는 것으로 보이는 지표 소개
      • 최근 액션에 대응하는 결과를 볼 수 있는 지표 및 현재 상황 소개
  1. 성공 확률이 높은 의사결정
  • 상황을 정확히 해석하기
    • 같은 지표 다르게 해석할 가능성 존재
    • 데이터 분석가는 여러 지표를 분석해 상황을 객관적으로 진단해야 함
    • 이를 위해 도메인 지식 기르는 것이 중요
      • 도메인 지식 = 생각의 프레임워크
  • 목표 설정
    • 목표치의 세가지 조합
      • 구조화된 로직에 과거 데이터를 활용한 예상치
      • 새로운 액션에 대한 확신 수준, 시장 상황 반영한 기대치
      • 의지치
    • 세가지의 합이 목표치가 아님
    • 예상치에 구조화된 로직이 있을 때, 그 로직을 구성하는 수치를 기대치와 의지치를 이용해 변경한 값 = 목표치
      • 구조화된 로직의 예 : 예상 매출 = 예상 방문자 수 구매 전환율 객단가
      • 예상 방문자 4만명
      • 예상 구매 전환율 10%
      • 예상 객단가 5만원
      • ⇒ 예상 매출 2억 원
  • 성과 측정
    • 조직에서 의도적으로 만든 변화로 인해 (해당 시기 이후로) 결과가 어떻게 바뀌었는가
    • A/B 테스트 : 통제할 수 없는 외부 요인 반영하기 위해서
    • 각 상황에 맞는 적절한 성과 측정 방법 필요함
  1. 지속성
  • 데이터 분석을 통한 결과가 최선이 아닐 가능성 존재
  • 체계적인 의사결정 축적을 통해 높은 성공 확률 확보
  • 지속성 확보 : 비즈니스 사이클에 맞게 분석
    • 분석 주제가 현재 회사의 집중하는 것과 같아야 함
    • 분석 주제의 결과물이 비즈니스 사이클에서 필요한 적절한 것이어야 함
    • 비즈니스 사이클의 단계
      • 플래닝 : 기회 발굴, 아이디어 수집, 정책 설계 등
      • 플래닝의 결과 실행 및 배포
      • 성과 측정 및 후속 분석
    • 비즈니스 사이클에 맞춘 데이터 분석가의 업무
      • 플래닝 시기 : 기회 발굴을 위한 탐색적 분석, 데이터 및 성과 측정 방법 설계
      • 실행 및 배포 시기 : 데이터 확인, 대시보드 관리
      • 후속 분석 시기 : 성과 측정 및 추가 데이터 분석을 통해 도출한 인사이트를 플래닝에 반영
  • 데이터 분석가가 본 데이터 분석가
    • 조직의 전반적인 의사결정의 퀄리티를 높이는 사람
    • 좋은 의사결정을 쌓아 조직의 성공 확률을 높이는 직무

[인사이트]

데이터 분석가의 현업 경험을 바탕으로 데이터 분석가에 대해 소개를 하는 아티클이라 굉장히 몰입이 됐다. 나도 아티클 저자처럼 데이터를 다루는 기술과, 모델링을 통해 인사이트를 제공하는 것에 관심이 많고 그것이 중요하다고 생각했다. 린 분석, 마케팅, A/B 테스트에 대해서는 전혀 관심도 없고 지식도 없는 상황이라 캠프를 진행하면서 조금씩 배워가고 싶다. 또, 데이터 분석가는 협업을 하더라도 분석팀을 중심으로 일을 진행할 것 같다고 느꼈는데, 조직 전체에 데이터 기반 의사결정을 도와주는 폭넓은 소통이 요구된다는 것을 느꼈다. 좋은 의사결정을 쌓아 조직의 성공 확률을 높이는 데이터 분석가라는 마지막 줄이 굉장히 흥미있게 다가왔고, 열심히 도전하고 싶은 마음이 커졌다.

SQL

3주차 과제

다음의 조건으로 배달시간이 늦었는지 판단하는 값을 만들어주세요.

주중 : 25분 이상, 주말 : 30분 이상
SQL 문의 기본 구조로 시작
조건을 여러번 적용할 때 if, case 문 중 어떤 것을 이용할지 결정
조건에 ‘주중, 주말’ 조건과 ‘배달시간’ 조건을 동시에 줄 때 사용 할 논리연산자 결정

SELECT 
	order_id,
	restaurant_name,
	day_of_the_week,
	delivery_time,
 	CASE 
 		WHEN day_of_the_week = 'Weekday' 
 			THEN IF (delivery_time >=25, 'Late', 'On-time')
 		WHEN day_of_the_week = 'Weekend'
 			THEN IF (delivery_time >=30, 'Late', 'On-time')
 	END AS '지연여부'
FROM food_orders;

사실 귀찮아서
ELSE IF (delivery_time >=30, 'Late', 'On-time')
이렇게 썼었다.
주어진 데이터처럼 day_of_the_week 컬럼에 Weekend 와 Weekday만 있으면 똑같은 값이 나오지만,
현업에서는 그렇지 않은 경우가 대다수이므로 조건을 확실히 지정해주는 것이 좋다고 한다.

여러번의 연산을 한번에 처리 Subquery

Subquery가 필요한 경우

  • 여러번의 연산 수행해야 할 때
  • 조건문에 연산 결과를 사용해야 할 때
  • 조건에 Query 결과를 사용하고 싶을 때
-- 
select column1, special_column
from
	--서브쿼리는 괄호로 위 아래 감싼다.
    (
    select column1, column2 special_column
    from table1
    -- 컬럼과 같이 서브쿼리에 a라는 이름을 부여한다.
    ) a
-- 조건에 쿼리 결과 사용
select column1, column2
from table1
where column1 = (select col1 from table2)

실습 문제

1) - 음식점의 평균 단가별 segmentation 을 진행하고, 그룹에 따라 수수료 연산하기

(수수료 구간 : ~5000원 미만 0.05%, ~20000원 미만 1%, ~30000원 미만 2%, 30000원 초과 3%)
문제를 풀다가 막혀서 시간을 많이 썼다. 결론적으로 서브쿼리를 잘 계산해놓고 활용을 못했다. GPT에게 답지랑 비교해 질문해서 문제를 파악했다.

서브쿼리에서 계산한 컬럼에 별칭을 지어야만, 위쪽 쿼리에서 재활용할 수 있다!!

SELECT 
    restaurant_name,
    # 마지막 계산 :수수료 구하기
    price_per_plate * ratio_of_add AS "수수료"
FROM 
(	# 2차 계산 : 수수료 구간 나누기
    SELECT 
        restaurant_name,
        price_per_plate,
        CASE 
            WHEN price_per_plate < 5000 THEN 0.005
            WHEN price_per_plate BETWEEN 5000 AND 19999 THEN 0.01
            WHEN price_per_plate BETWEEN 20000 AND 29999 THEN 0.02
            ELSE 0.03 
        END AS ratio_of_add
    FROM 
    (	# 1차 계산 : 음식점 별 평균 단가
        SELECT 
            restaurant_name, 
            -- 여기서 미리 계산 후 이름 부여
            AVG(price/quantity) AS price_per_plate
        FROM food_orders
        GROUP BY restaurant_name
    ) a 
) b;

2) 음식점의 지역과 평균 배달시간으로 segmentation 하기

1번 문제가 서브쿼리에 대한 이해가 없어서 못풀었다면,
2번 문제는 조건이 없어서 문제 자체가 이해가 안됐다.
그런데 강의 보니까 그냥 조건이 없는게 맞았다... 조건은 말로만 설명해주셨다.
시간 아까워라...
조건 : 20분 이하, 20분 초과 30분 이하, 30분 초과

SELECT 
	restaurant_name,
	`도시`,
	`평균 배달 시간`,
	CASE 
		WHEN `평균 배달 시간` <= 20 THEN '배달 빠름'
		WHEN `평균 배달 시간` > 20 AND `평균 배달 시간` <= 30 THEN '배달 보통'
		WHEN `평균 배달 시간` > 30 THEN '배달 느림'
	END AS `분류`
FROM 
	(
	SELECT 
		restaurant_name,
		SUBSTR(addr,1,2) `도시`,
		AVG(delivery_time) `평균 배달 시간`
	FROM food_orders 
	GROUP BY restaurant_name
	) a;

맞게 썻다고 생각했는데 컬럼명을 자꾸 문자로 취급해서 답이 틀렸다.
이유는 따옴표 때문!

따옴표의 기능

  • 큰따옴표: 주로 식별자(identifier)를 감싼다.
    • 컬럼명, 테이블명 등.
    • 공백이나 특수 문자가 포함된 이름, 대소문자 구분이 필요한 경우
    • MySQL 에서는 큰따옴표를 식별자로 인식하지 못한다.
  • 작은따옴표: 데이터 값(문자열)을 표현.
  • 백틱 ` - 큰따옴표를 대신해 MySQL 에서 식별자 인식
    • 맥북 기준 option키 누르고 ₩누르면 작동
    • 그냥 편하게 영어로 컬럼 이름 만들자...

딱히 중요하지 않아 보이지만... MySQL이 아닐 경우 큰 따옴표와 작은 따옴표를 엄격히 구분한다고 하니 알아놓자.

3) 음식 타입별 총 주문수량과 음식점 수를 연산하고, 주문수량과 음식점수 별 수수료율을 산정하기

음식점수 5개 이상, 주문수 30개 이상 → 수수료 0.5%
음식점수 5개 이상, 주문수 30개 미만 → 수수료 0.8%
음식점수 5개 미만, 주문수 30개 이상 → 수수료 1%
음식점수 5개 미만, 주문수 30개 미만 → 수수로 2%

SELECT 
	cuisine_type,
    sum_quantity,
    num_name,
	CASE 
		WHEN num_name >= 5 THEN IF (sum_quantity >= 30, 0.005, 0.008)
		WHEN num_name < 5 THEN IF (sum_quantity >= 30, 0.01, 0.02)
	END AS "수수료율"
FROM
		(	
		SELECT 
			cuisine_type,
			SUM(quantity) sum_quantity,
			COUNT(DISTINCT restaurant_name) num_name
		FROM food_orders
		GROUP BY 1
		) a

4) 음식점의 총 주문수량과 주문 금액을 연산하고, 주문 수량을 기반으로 수수료 할인율 구하기

할인 조건 :
수량이 5개 이하 → 10%,
수량이 15개 초과, 총 주문금액이 300000 이상 → 0.5%,
이 외에는 일괄 1%

SELECT 
	restaurant_name,
	total_quantity,
	total_price,
	CASE 
		WHEN total_quantity < 5 THEN 0.1
		WHEN total_quantity > 15 AND total_price >= 30000 THEN 0.005
		ELSE 0.01
	END `수수료 할인율`
FROM 
	(
	SELECT
		restaurant_name,
		SUM(quantity) total_quantity,
		SUM(price) total_price
	FROM food_orders
	GROUP BY 1
	) a 

느낀점

오랜만에 아티클 스터디를 하고 SQL 공부했다.
실습 문제에서 자꾸 막혀서 시간을 많이 잡아먹었다.
따옴표 때문에 20분 헤메고,
문제 조건 때문에 헤메고,
WHEN 과 THEN 사이에 쉼표를 넣어버려서 또 10분 헤맸다.
점점 쿼리가 길어지고 계산이 복잡해지는데,
아직 익숙하지 않아서 그런 것 같다.
오류가 났을 때 당황하지 말고 한 줄 씩 잘 찾아보자.
내일 4주차 마무리할 수 있으면 좋겠다.

0개의 댓글