데이터 분석가가 되어보니 중요한 것들
[주제]
데이터 분석가의 실무
[아티클 요약]
[인사이트]
데이터 분석가의 현업 경험을 바탕으로 데이터 분석가에 대해 소개를 하는 아티클이라 굉장히 몰입이 됐다. 나도 아티클 저자처럼 데이터를 다루는 기술과, 모델링을 통해 인사이트를 제공하는 것에 관심이 많고 그것이 중요하다고 생각했다. 린 분석, 마케팅, A/B 테스트에 대해서는 전혀 관심도 없고 지식도 없는 상황이라 캠프를 진행하면서 조금씩 배워가고 싶다. 또, 데이터 분석가는 협업을 하더라도 분석팀을 중심으로 일을 진행할 것 같다고 느꼈는데, 조직 전체에 데이터 기반 의사결정을 도와주는 폭넓은 소통이 요구된다는 것을 느꼈다. 좋은 의사결정을 쌓아 조직의 성공 확률을 높이는 데이터 분석가라는 마지막 줄이 굉장히 흥미있게 다가왔고, 열심히 도전하고 싶은 마음이 커졌다.
다음의 조건으로 배달시간이 늦었는지 판단하는 값을 만들어주세요.
주중 : 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가 필요한 경우
-- 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)
(수수료 구간 : ~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;

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이 아닐 경우 큰 따옴표와 작은 따옴표를 엄격히 구분한다고 하니 알아놓자.
음식점수 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

할인 조건 :
수량이 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주차 마무리할 수 있으면 좋겠다.