오늘 왜 이렇게 월요일 같지..?

어제 연휴 마지막이라고 무리해서 늦게 잤더니 아침에 일어나는 일이 참 고되다. 연휴 동안 개인 공부를 했으면 그 내용으로도 글을 작성했을 텐데 안 했다^^ 그래도 읽고 싶은 책을 실컷 읽긴 해서 만족한다.
오늘 한 일은,
- 네 번째 아티클 스터디 진행하기
- SQL 공부
- 온라인 강의 - [엑셀보다 쉽고 빠른 SQL] 4주차
- 개인 퀘스트(걷기반) - [SQL 문법을 연습해요] (10) ~ (11)
- 파이썬 공부
- 개인 퀘스트(걷기반) - [Python 알아보기] 반복문 연습하기 Part 3
- 온라인 강의 - [파이썬 문법 기초] 1주차 끝까지 수강하기
아티클 스터디 ④: 데이터 분석가가 되어보니 중요한 것들
오늘 읽은 아티클:
데이터 분석가가 되어보니 중요한 것들 | 요즘IT
개발자, 디자이너, 기획자, HR, 오퍼레이션 등 대부분의 직무에서 우리가 일하기 전 예상했던 업무와 실제 업무에는 차이점이 존재합니다. 비즈니스는 빠르게 변화하기 때문에, 학생 때 배운 교
yozm.wishket.com
이번 스터디에선 현업에 데이터 분석가로 종사하며 '데이터 분석가란 무슨 일을 하는 사람인가'에 대한 생각이 변한 저자가 생각하는 데이터 분석가에게 중요한 점을 세 가지 지점으로 구분하여 설명한 아티클을 읽었다.

각자 읽은 후 인사이트를 공유하며 나온 의견 중 어떤 스터디원 분이 "일단 데이터가 흐르지 않는다는 가정을 해본 적 없다"고 하셨는데 이 말에 공감이 갔다. 데이터 분석을 공부하는 입장에서 어떻게 하면 데이터 분석에 대한 지식을 쌓기 급급한 단계라서인지 실제 업무 현장에선 내가 다뤄야 할 데이터가 엉성하거나 심지어는 존재하지 않는 상황까진 생각해 본 적 없다. 올바른 데이터 분석에는 데이터 구축을 포함한 데이터 기반의 조직 환경을 만드는 일까지 포함된다는 것을 배웠다.
또한 다른 분의 인사이트에서 "데이터 분석이 단순히 기술적 작업에 국한 되는 것이 아니라 종래에는 비즈니스 성과와 연결된다"는 점을 염두에 두어야 한다는 생각을 했다. 그래서 '데이터 분석'이라는 말을 지엽적으로 이해할 게 아니라 실제로는 넓은 범위의 책임을 지고 있을 거라는 점을 명심해야 데이터 분석가로서 일을 하게 됐을 때 괴리감 없이 커리어를 밟아나갈 수 있겠다는 생각이 들었다(사실 이 점은 어떤 직업을 갖게 되든 공통적으로 적용되는 부분 같기도 하다). 알면 알수록 데이터 분석가의 업무 범위가 넓어진다. 나는 데이터 분석 능력을 갖춘 마케터로서 성장하려면 추가적으로 해야 할 일은 무엇인지에 대한 생각도 하게 된 스터디였다.
SQL 공부① : [엑셀보다 쉽고 빠른 SQL] - 4주차
(사실 오늘 SQL 강의 들을 계획 없었는데 걷기반 개인퀘스트 문제를 푸는데 테이블을 두 개 다루는 걸 보고 혹시나 하는 마음으로 온라인 강의 목록 내용을 확인해봤는데 딱 JOIN으로 테이블 2개 다루는 걸 알려주는 것 같아서 갑작스럽게 강의를 수강하게 됐다. 오히려 좋아!!)
SUBQUERY로 단계별로 쿼리를 작성하는 법
select column1, special_column
from
( /* subquery */
select column1, column2 special_column
from table1
) a
- 이름에서 짐작할 수 있듯 쿼리를 작성할 때 하위 쿼리를 작성할 수 있는 문법
- 괄호로 SUBQUERY문을 감싸주고, 해당 쿼리문에 해당하는 이름을 괄호 옆에 적는다(위의 경우는 a가 해당 SUBQUERY의 이름)
- 💡이렇게 여러 연산을 중첩하는 쿼리를 작성할 때는 단계마다 중간중간 한 번씩 실행하여 원하는 대로 결과를 도출하는지 확인해줘야 하는 습관을 들이자!
JOIN으로 2개 이상의 테이블 이용하여 쿼리를 작성하는 법
-- LEFT JOIN
select 조회 할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명
-- INNER JOIN
select 조회 할 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명
- 공통 컬럼을 기준으로 두 테이블을 합쳐서 각각의 테이블에서 필요한 정보를 조회할 수 있도록 만들어주는 문법
- ①LEFT JOIN : 공통 컬럼을 기준으로, 하나의 테이블에 값이 없더라도 모두 조회
- ②INNER JOIN : 공통 컬럼을 기준으로, 두 테이블 모두에 있는 값만 조회


4주차 숙제
Q. 식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation하기
[조건]
- 평균 음식 주문 금액 기준 : 5,000원 이하 / ~10,000원 / ~30,000원 / 30,000원 초과
- 평균 연령 기준 : 20대 이하 / 30대 / 40대 / 50대 이상
- 두 테이블 모두에 데이터가 있는 경우만 조회하고 식당 이름 순(오름차순)으로 정렬하기
SELECT fo.restaurant_name ,
fo.price,
c.age
FROM food_orders fo inner join customers c on fo.customer_id =c.customer_id
우선 food_orders 테이블과 customers 테이블을 묶어준다. 이때 두 테이블 모두에 데이터가 있는 경우만 조회하라고 했으니 INNER JOIN을 사용한다.
SELECT fo.restaurant_name ,
avg(fo.price) avg_price,
avg(c.age) avg_age
FROM food_orders fo inner join customers c on fo.customer_id =c.customer_id
group by 1
그리고서 식당별로 평균 금액과 평균 연령을 계산하도록 작성하고
SELECT fo.restaurant_name ,
avg(fo.price) avg_price,
avg(c.age) avg_age
FROM food_orders fo inner join customers c on fo.customer_id =c.customer_id
group by 1
order by 1
그를 다시 식당 이름 순으로 정렬하도록 order by를 추가한다. 여기까지 작성한 것을 subquery로 묶고 segment를 진행하는 조건을 다음과 같이 작성했다.
SELECT restaurant_name,
case when avg_price<=5000 then '5,000원 이하'
when avg_price<=10000 then '~10,000원'
when avg_price<=30000 then '~30,000원'
else '30,000원 초과' end price_segment,
case when avg_age<30 then '20대 이하'
when avg_age<40 then '30대'
WHEN avg_age<50 then '40대'
else '50대 이상' end age_segment
FROM
(
SELECT fo.restaurant_name ,
avg(fo.price) avg_price,
avg(c.age) avg_age
FROM food_orders fo inner join customers c on fo.customer_id =c.customer_id
group by 1
order by 1
) a
그러면 다음과 같이 이런 식으로 데이터가 조회된다.


SQL 공부② : 사전캠프 개인퀘스트(걷기반) - [SQL 문법을 연습해요]
10) 👆이젠 테이블이 2개입니다
다음과 같은 직원(employees) 테이블과 부서(departments) 테이블이 있습니다.
- employees 테이블
id | department_id | name |
1 | 101 | 르탄이 |
2 | 102 | 배캠이 |
3 | 103 | 구구이 |
4 | 101 | 이션이 |
- departments 테이블
id | name |
101 | 인사팀 |
102 | 마케팅팀 |
103 | 기술팀 |
38. 현재 존재하는 총 부서의 수를 구하기
select count(*) "부서 수"
from departments
39. 모든 직원과 그들이 속한 부서의 이름을 나열하기
select e.name name,
d.name department
from employees e left join departments d on e.department_id=d.id
40. 기술팀 부서에 속한 직원들의 이름 나열하기
select e.name name
from employees e left join department d on e.department_id=d.id
where d.name='기술팀'
41. 부서별로 직원 수를 계산하기
select d.name department,
count(e.name) count
from employees e left join departments d on e.department_id=d.id
group by 1
42. 직원이 없는 부서명 찾기
select d.name department
count(e.name) count
from employees e left join departments d on e.department_id=d.id
where count(e.name)=0
처음엔 이렇게 작성했다.
쿼리 작성 후 정답을 확인했는데 where절에 null 값을 사용해 작성한 것이 아닌가.SQL에서 null 값을 어떻게 이용하는지 찾아봤다.
- NULL : 값이 입력돼 있지 않은, 비어 있는 상태를 의미.
- WHERE절에서 (컬럼명) IS NULL로 지정할 수 있음. 단, NULL은 상태이므로 논리연산자를 사용해선 안 됨. '=' 사용해서 입력X
select d.name department
from employees e left join departments d on e.department_id=d.id
where d.name is null
즉 NULL 값을 이용해서 쿼리를 수정하면 다음과 같다.
43. 마케팅팀에만 속한 직원들의 이름 나열하기
select e.department_id department,
e.name name
from employees e left join departments d on e.department_id=d.id
where d.name='마케팅팀'
11) 🎁마지막 연습 문제 !
다음과 같은 상품(products) 테이블과 주문(orders) 테이블이 있습니다.
- products 테이블
id | name | price |
1 | 랩톱 | 1200 |
2 | 핸드폰 | 800 |
3 | 타블렛 | 400 |
- orders 테이블
id | product_id | quantity | order_date |
101 | 1 | 2 | 2023-03-01 |
102 | 2 | 1 | 2023-03-02 |
103 | 3 | 5 | 2023-03-04 |
44. 모든 주문의 주문 ID와 주문된 상품의 이름을 나열하기
select o.id order_id,
p.name product
from products p left join orders o on p.id=o.product_id
45. 총 매출(price*quantity의 합)이 가장 높은 상품의 ID와 해당 상품의 총 매출을 조회하기
select p.id product_id
sum(p.price*o.quantity) total_sales
from product p left join order o on p.id=o.product_id
group by 1
order by 2 desc limit 1
46. 각 상품 ID별로 판매된 총 수량 계산하기
select product_id,
sum(quantity) total_sales
from orders
group by 1
47. 2023년 3월 3일 이후에 주문된 모든 상품의 이름 나열하기
select p.name product
from products p left join orders o on p.id=o.product_id
where o.order_date>'2023-03-03'
48. 가장 많이 판매된 상품의 이름 조회하기
select p.name product
sum(o.quantity) total_sales
from product p left join orders o on p.id=o.product_id
group by 1
order by 2 desc limit 1
49. 각 상품 ID별로 평균 주문 수량 계산하기
select product_id,
avg(quantity) avg_quantity
from orders
group by 1
50. 판매되지 않은 상품의 ID와 이름 조회하기
select p.id product_id,
p.name product_name
from product p left join orders o on p.id=o.product_id
where o.quantity is null

이로써 걷기반 SQL 개인퀘스트는 끝!
2월부터는 달리기반 가보자고~~
파이썬 공부① : [파이썬 문법 기초] 1주차 1-10 ~ 1-18
- 튜플(tuple) : 리스트와 비슷하게 생겼는데 튜플은 불변형.
그런데 우리 수준에선 튜플을 사용할 가능성은 거의 없고, 그냥 이런 형태가 나오면 '이건 튜플이구나' 알아보면 된다고 - 집합(set) : 리스트를 집합으로 선언하면 중복이 제거됨. 집합을 활용해서 합집합, 교집합, 차집합을 사용할 수도 있음.
- 합집합 : a_set | b_set
- 교집합 : a_set & b_set
- 차집합 : a_set - b_set
- f-string : 문자열을 더 깔끔하게 쓸 수 있는 문법. f'{변수1}의 점수는 {변수2}점입니다.'와 같은 형태로 씀.
- try-except문 : 'try 안에 있는 내용으로 진행하다가 무언가 에러가 발생하면 except로 빠져라'라는 문법.
그러나 남용하면 뭔가 이상해짐.. - from 파일명 import * : '파일명'에서 전부 가져와라. 이렇게 다른 파일 속 내용을 불러올 수도 있음
- 한 줄로 파이썬 작성하기 : if문 - 삼항연산자, for문
for문보다는 if문을 이런 식으로 쓸 경우가 많다 - 어려울 수 있음. 그러나 나중을 위해서 한번 들어둬라 : map, filter, lambda

어째저째 [파이썬 문법 기초] 강의를 수강 완료했다.
지금 이 상태를 강의를 다 들었다고 해도 되는 건지 아리송하긴하다(강의를 다 듣긴 했어.. 그치만 지금 내 상태를 봐!).
그래도 이제 시작인 거니까!
아직 들을 강의도 더 있고, 파이썬 관련 문제들도 더 풀어보면 지금보다 더 나아질 일밖에 없다(사실 그럴 수밖에 없는 상태임).

파이썬 공부② : 사전캠프 개인퀘스트(걷기반) - [Python 알아보기]
3️⃣ 반복문 연습하기 Part 3
파이썬으로 5!(5팩토리얼) 계산하기

사실 잘 감이 안 와서 구글링으로 파이썬으로 팩토리얼을 계산하는 법을 찾아서 참고하며 공부했다. 검색 결과를 보니 파이썬 내장함수를 이용하는 법도 있고, 다른 여러 가지 방법으로 팩토리얼을 구할 수 있는 듯했다.
나는 반복문을 공부하는 입장에서 for를 이용한 방법을 참고해서 작성했다.
[참고] https://manniz.tistory.com/entry/Python%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%8C%A9%ED%86%A0%EB%A6%AC%EC%96%BCfactorial-%EA%B5%AC%ED%98%84-3%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95for%EC%9E%AC%EA%B7%80math%EC%86%8C%EC%8A%A4-%EC%BD%94%EB%93%9C
number = 5
5! = 5*4*3*2*1이다.
for문을 사용해 1부터 number인 5에 도달할 때까지 +1씩 증가한 수를 전부 곱하기를 반복해야 한다.
number = 5
for number in range(1, number+1):
'변수 number를 1부터 시작해서 number까지 1씩 증가하며 반복하라'까지 썼다. 이제 1부터 5까지 1씩 증가하며 "곱하라"를 적어줘야 한다.
number = 5
factorial = 1
for number in range(1, number+1):
factorial *= number
print(factorial)
그를 위해 변수 factorial을 추가했다. 그리고서 할당연산자 *=를 사용해서 계속해서 곱해주라는 것을 적었다.

그러면 이렇게 120이 출력된다..!

오늘 공부 끄읕..
이렇게 1월도 마무리 됐다.
'[내배캠] 데이터분석 6기 > 사전캠프 기록' 카테고리의 다른 글
[사전캠프 8일차] 아티클 스터디⑥, SQLD 공부 (0) | 2025.02.04 |
---|---|
[사전캠프 7일차] 아티클 스터디⑤, SQL 공부 (0) | 2025.02.03 |
[사전캠프 5일차] 아티클 스터디③, 스타터노트 작성, SQL 복습, 파이썬 복습 (1) | 2025.01.25 |
[스타터 노트] 데이터 분석 트랙을 신청한 이유 (0) | 2025.01.24 |
[사전캠프 4일차] 파이썬 복습, SQL 복습 및 학습 (0) | 2025.01.23 |