[2025.01.21]사전캠프 7일차 아티클스터디+cast/concat변환+Subquery

김명서·2025년 1월 21일
1

TIL_sparta

목록 보기
8/60

움,, 아티클 스터디 기록을 하기전에,,
팀원 한분은 나가신 것 같고 한분은 이번주 활동 참여가 없으시다ㅜㅜ😓
남아계신 분들은 매일 성실하게 열심히 스터디를 하셨던 분들이라, 사전/본캠프 활동까지 같이 마무리 할 수 있었으면 좋겠다. 나머지 팀원분들도 이렇게 생각하실 수 있게, 나도 앞으로 더 열심히 참여해야지🥲🔥

아티클 스터디 '데이터 분석가가 되어보니 중요한 것들'

https://yozm.wishket.com/magazine/detail/1863/
[주제]

  • 데이터분석가에 대한 업무정의와 실제 업무

[아티클 요약]

  • 현업에 몸담다 보니, 데이터 분석가=단순 모델링 하는 사람이 아닌 ‘좋은 의사결정을 하도록 돕는 사람’
    ⭐1)데이터기반
    분석 외에, 데이터를 효율적으로 활용하고 잘 쌓도록 조직을 구축하는 것 또한 중요

image.png

이 피라미드에는 위계구조,계층적 질서가 존재함

데이터가 잘 흐르는 조직을 만들기 위해서는,, 데이터를 쉽게 확인하고 주요 지표를 잘 인지하게 만드는 노력이 필요함!

BI툴 도입 → 여러 대시보드 형성

대시보드를 쉽게 말하면, 계기판!
[많은 정보가 중요도에 따라 크기와 강조 정도가 다르고, 관련 정보끼리 모아두어 가시성 확보]
지표가 많아지면 잘 찾을 수 있도록 대시보드 구현이 중요해짐.
✅카테코리별 분류,✅위계와 중요도를 시각적으로 표현,✅분석필터 제공,✅측정기준에 따라 별도 지표를 볼 수 있게 만들면 좋음.

SQL교육과 데이터 마트

sql문법을 숙지하는 것보다는, 어느 데이터가 어디에 쌓이고, 어떤 히스토리가 있는지 교육하기가 어려움

데이터 마트: 어디에 원하는 데이터가 있는지 몰라서 데이터를 사용하지 못하는 경우를 막기 위해, 미리 문서화하고, 여러 데이터를 모아 목적에 따라 가공해둔 것.

주요 지표 인지하기

데이터가 잘 흐르는 조직을 위해, 가벼운 리포트에 주요 지표 등을 꾸준히 공유하는 것이 도움된다!

💡
  1. 결과 지표 추이를 통해 예상되는 미래 상황과 목표를 고려했을 때 얼마나 잘하고 있는지를 알려주기
  2. 결과 지표에 선행하는 것으로 보이는 지표 소개
  3. 최근 액션에 대응하는 결과를 볼 수 있는 지표가 무엇인지, 현재 상황이 어떠한지 소개

*메트릭오너: 특정 지표에 오너십을 가진 사람
각자 담당 지표가 생기면 그 성과가 곧 본인의 성과이기 때문에 지표를 잘 이해+지표에 변화가 생길 때 관련된 주요 지표 뿐만 아니라 관련 지표까지 파악하기 위해 노력하게됨.

⭐2)성공 확률이 높은 의사결정

-상황을 정확하게 해석하기

데이터분석가=여러 지표를 적절히 조합하고 분석해, 편향되지 않게 해석하고 상황을 진단하는 사람

객관적 해석을 하지 못했거나 잘못된 해석, 놓친 부분이 있다면 이를 업데이트 해, 왜 이렇게 해석했는지 이유를 알리는 것이 필요

도메인 지식 = 생각의 프레임워크 지속적으로 기르기

도메인 지식은 책이나 강의를 통해 배워야하는 지식도 있겠지만, 대부분 회사에서 무엇을 했고 결과가 어땠는지에 대한 정보를 잘 축적하고, 그것을 합리적인 형태로 구조화하는 것으로도 많은 도움!

목표 설정하기

목표치- “로직을 구성하는 수치를 기대치와 의지치를 이용해 변경한 값”
<구조화된 로직에 과거 데이터를 활용한 예상치>
<새로운 액션에 대한 확신 수준, 시장이나 경쟁사 상황, 불확실성을 반영한 기대치>
<의지치>

성과 측정하기

가장 보편적으로 성과 측정은 시기 전후를 비교하는데,

통제할 수 없는 외부 요인까지 반영하기 위해 A/B테스트 실험을 하게됨. 무작위로 할당된 그룹 간 지표 차이를 통해 성과를 측정하는 것이 A/B테스트이고 외부 요인의 개입을 무력화할 수 있음. 단기적 성과 측정에 적극 활용하고 장기적 성과 측정은 다른 방법을 찾는게 도움이 될 수 있음.

⭐3)지속성

비즈니스 사이클 3단계

1)기회발굴, 아이디어 수집, 정책 설계 등의 planning

2)플래닝의 결과 실행 및 배포

3)성과 측정 및 후속 분석

종합적으로, 데이터 분석가는 조직의 전반적인 의사결정 퀄리티를 높이는 사람. 좋은 의사결정들을 모아 조직의 성공 확률을 높이는 사람

[인사이트]

데이터를 분석하는 것뿐만 아니라 전체적인 흐름과 전반적인 설계를 해내는 사람이 되기 위해서는, 왜 이러한 결과가 나왔는지, 이 결과가 다른 것에 어떠한 영향을 미치게 될지 까지 폭넓게 사고하는 방식을 길러야겠다고 생각했다. 또한 도메인 지식 중요성은 다시한 번 언급된 만큼, 지금부터 내가 취업하고 싶은 비즈니스에 대한 지식도 점차 쌓아가야겠다.

데이터분석에 오류가 있었을 때, 이에 대해 왜 잘못했는지, 무엇이 맞는것인지 공유를 해야한다고 했는데
내가 틀린것을 발견하고 인정해, 정정하는 것이 쉬운일은 아니라고 생각한다. 이에 대한 두려움이나 회피감을 떨쳐내는 것이 앞으로의 숙제가 아닐까한다.

데이터 타입에 대한 오류 해결하기

when? avg, substring 등 함수를 썼을 때 'datatype'단어로 에러메시지가..⚠️

--숫자로 변경
cast(if(rating='Not given', '1', rating) as decimal) 
--문자로 변경
concat(restaurant_name, '-', cast(order_id as char))

외우고 있기 보다는, 데이터 타입의 문제를 마주쳤을때
돌아와서 코드 복사해서 변환해주면 된다고 하셨다!🧐

3주차 숙제문제✒️

1트


case when then 뒤에 늦음이 아니라 '늦음'으로 해야했음
🔶문자로 수식입력할 때 작은 따옴표 !!!!

2트


이렇게 하니까 안늦었을때의 입력값이 없음.
응...이거 if로 써야하나...? 근데 if를 어따써... 고민시작

3트


else가 if문에서만 쓸 수 있는 줄 알았는데(지금 생각해보니까 왜그랬지,,? 의미상 '거짓'='참 else' 라서 그랬나보다..🗯)

CASE 구문은 SQL에서 조건문을 작성할 때 사용하며, ELSE는 조건을 만족하지 않는 나머지 경우를 처리하기 위해 사용.

🔻마지막으로 < else '안늦음' > 걸어주면 되는 거였다!🔻

select restaurant_name,
delivery_time,
day_of_the_week,
case when delivery_time>=25 and day_of_the_week='weekday'then '늦음'
when delivery_time>=30 and day_of_the_week='weekend'then '늦음'
else '안늦음' 
end"지연상태"
from food_orders

case when then end 조건 구문의 기본구조를 되짚고 넘어갈 수 있어서 좋은 문제였다고 생각한다!

4주차🚀

Subquery

언제 필요?
✔️여러번의 연산을 수행할 때
ex.→ 수수료를 부과할 수 있는 시간을 구하고
→ 구해진 시간에 주문 금액별로 가중치를 주고
→ 가중치를 적용한 결과로 최종 예상 배달비를 계산할 때 ..💭
✔️조건문에 연산결과를 사용해야할 때
ex.→ 음식 타입별 평균 음식 주문금액 따라 음식비 상/중/하 를 나누고 싶을 때
✔️조건에 query결과를 사용하고 싶을 때
ex.→ 30대 이상이 주문한 결과만 조회하고 싶을 때

일단 기본구조는 다음과 같다.

select column1, special_column
from
    ( /* subquery */
    select column1, column2 special_column
    from table1
    ) a
select column1, column2
from table1
where column1 = (select col1 from table2)

실습예제-음식 준비시간이 25분보다 초과한 시간을 가져오기

select order_id, restaurant_name, if(over_time>=0, over_time, 0) over_time
from 
(
select order_id, restaurant_name, food_preparation_time-25 over_time
from food_orders
) a

뒤에 a를 붙인건 서브쿼리 이름을 뜻하고,
결과적으로, 오버타임이 아니라면 0으로 뜨고 오버타임이라면 얼마나 오버타임이 되었는지 숫자로 나온다.

.

💦만약 subquery가 없었다면 ?


이런식으로 오버타임이 아닌경우에는 -가 붙어버린다

진짜실습!

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

(수수료 구간

~5000원 미만 0.05%

~20000원 미만 1%

~30000원 미만 2%

30000원 초과 3%)

💡사고과정
섭쿼리 안에 평균단가seg식 넣고 , 본 쿼리에 수수로연산 넣어야겠다

💡정답 코드

select restaurant_name,
     price_per_plate*ratio_of_add "수수료"
from 
(
select restaurant_name,
     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 ratio_of_add,
     price_per_plate
from 
(
select restaurant_name, avg(price/quantity) price_per_plate
from food_orders
group by 1
) a
) b

내가 생각 못한 것

▶️ group by 활용X

있고 없고의 차이는 다음과 같다
🔻group by 안했을 때,

🔻group by 했을 때(정답)

.

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

💡사고과정
seg에 case when 쓰고
(
select restaurant_name,
substr(addr,1,2) "지역"
avg(delivery_time) "평균 배달시간"
from food_orders
group by 1
) a

이렇게 서브쿼리 짜야겠다

음,,근데 평균배달시간을 뭐를 기준으로 나눠야하지....?🫥

강의를 듣기로..

💡정답코드

select restaurant_name,
       sido,
       avg_delivery_time,
       case when avg_delivery_time<=20 then '<=20'
            when avg_delivery_time>20 and avg_delivery_time <=30 then '20<x<=30'
            else '>30' end delivery_time_segment
from 
(
select restaurant_name,
       substring(addr, 1, 2) sido,
       avg(delivery_time) avg_delivery_time
from food_orders
group by 1, 2
) a

이렇게 나오는군. 타임세그가 20,30분 기준이었나보다
(이것도 문제에 미리 나와있었으면 좀 더 명확했을텐데,,)

여기서 group by 1,2혹시 다른 차이가 있나 해봤는데 결과값 차이❌
.
.

내일 할 것은

아티클 스터디하고,
마지막에 풀어봤던 실습 쓱 훑고
4-4강 실습문제 풀어보는 것으로 시작해야겠다
확실히 실습문제를 좀 풀어보면서 감을 익히는 듯 하다 !!
낼도 홧팅해야지 :)

profile
경영학도의 데이터분석 성장기💥

0개의 댓글

관련 채용 정보