[내배캠] 데이터분석 6기/사전캠프 기록

[사전캠프 3일차] 아티클 스터디 ②, SQL 복습, 파이썬 공부

물맨두 2025. 1. 22. 21:39
아.. 잠을 자도 피로가 안 풀리냐
- 박명수 - 

사전캠프 3일차 시작.

 

오늘 할 일은 크게 3가지다.

  • 두 번째 아티클 스터디 하기
  • 어제 공부한 SQL 복습을 사전캠프 개인 퀘스트로 복습하기: 걷기반/SQL 문법을 연습해요/"SQL 기초" ~ "3) 상품 주문이…"
  • 온라인 강의 수강하기: [파이썬 문법 기초]/1주차/"1-1. 파이썬 기초 문법 뽀개기"~"1-9. 함수"

 


아티클 스터디 ②: "데이터 분석가는 어떤 일을 하나요?"

오늘 읽은 아티클 : 

 

 

[데이터분석] 데이터 분석가는 어떤 일을 하나요?

데이터 분석가의 업무와 필요한 역량에 대해 설명합니다.

medium.com

**[주제]**

“데이터 분석가란?”

- 데이터 분석가란 뭐하는 사람인가?
- 데이터 분석에 필요한 지식
- 데이터 분석가에게 요구되는 역량

**[아티클 요약]**

- 데이터를 다루는 직군
 - 기본적인 구분
 - 데이터 분석가 (기획자)
 - 데이터 엔지니어 (개발자)
 - 데이터 사이언티스트 (개발자)
 - 그러나 현실에서는 이러한 구분과 채용 공고 내용이 일치하지 않기도 함.
 ⇒ 그래서 회사별 공고를 우선 확인하고, 내가 어떤 업무를 하고자 하는지 미리 정하는 것이 좋음
- 데이터 분석(Data Analysis)에 필요한 지식
250122 아티클을 읽으며 노션에 '개인 요약'을 기록했다

해당 아티클에선 '데이터 분석가'를 주제로, 데이터 분석가에게 필요한 지식과 역량을 전했다.

**[인사이트]**

- ✅데이터 관련 직군에 대한 구분은 알고 있었는데, 실제 채용 공고에서는 데이터 분석가라 해놓고 실제 업무 내용을 보면 데이터 엔지니어를 구하기도 한다는 것을 처음 알았다. 원하는 회사가 있다면 실제 공고 내용을 미리미리 읽어봐야겠다.
- ‼의사소통 능력은 배려에 기반한 센스 같다. 사실 모든 업무에서 의사소통 능력을 중요하게 보는데, 특히 데이터 분석가로서 필요한 의사소통 능력에 있어서는 데이터 시각화 능력을 갈고 닦을 필요가 있겠다.

아티클을 읽으며 인상 깊었던 점은 2가지였는데, 그 중에서도 의사소통에 관한 부분이 기억에 남는다.

의사소통은 모든 부분에서 중요한 역량입니다. 무엇보다도 수치를 기반으로 다른 사람이 이해할 수 있도록 풀어서 설명하는 소통방식은 데이터 분석가에게는 중요한 부분 중 하나라고 생각합니다. 열심히 분석한 내용을 다른 사람에게 전달을 할 때 상대방이 이해하지 못하게끔 전달이 된다면 분석한 내용 또한 의미 없는 내용이 될 수 있기 때문입니다.

[출처] 코크리, "[데이터분석] 데이터 분석가는 어떤 일을 하나요?", 모두의연구소 기술 블로그, 2022.01.14.

어제 SQL을 공부할 때 'SQL은 데이터베이스와 내가 서로 소통하기 위한 언어'라는 설명이 인상적이었는데, 오늘 아티클에서도 데이터 분석가로서 열심히 분석한 결과가 의미가 있으려면 결국엔 다른 사람들에게 잘 전달돼야지만 의미가 있다는 말이 인상적이었다. 기초통계학과 파이썬, SQL을 공부해 데이터를 열심히 분석하는 것만큼이나 이러한 정보들을 남에게 잘 전달하기 위한 노력 역시 그에 상응하는 중요성을 갖는다. 그 일환에서 데이터 시각화 툴을 다룰 줄 아는 것도 하나의 언어를 할 줄 아는 것으로 느껴졌다. SQL이 나와 데이터베이스 간의 언어라면, 데이터 시각화 툴을 다루는 것은 데이터 분석가와 비(非) 데이터 분석가를 잇는 하나의 언어일지도 모르겠다.

 


SQL 공부: [복습①]사전캠프 개인퀘스트 걷기반 (1)~(3)

0) 🔑SQL 기초

어제의 강의는 이미 있는 데이터베이스를 가지고 실습을 했기 때문에 해당 페이지를 통해 데이터베이스를 생성하는 명령어, 테이블을 생성하는 명령어 등 새로이 알게 된 명령어를 알게 됐다.

CREATE DATABASE 데이터베이스_이름

CREATE TABLE 테이블_이름 (
       컬럼1 데이터타입,
       컬럼2 데이터타입,
       ...
);

각 컬럼에 들어간 데이터 유형은 INT, VARCHAR( )로 지정할 수 있다.

  • INT: 정수형 데이터
  • VARCHAR( ): 문자 데이터     ※괄호 안에는 숫자로 최대 몇 자까지를 저장할 수 있는지 입력함

그리고 이후의 내용은 퀘스트 진도에 따라 공부하며 나아가면 될 것 같아 '2.3. 데이터 조회(SELECT)' 파트까지만 보고 문제로 넘어갔다.

 


 

1) 💵돈을 벌기 위해 일을 합시다!

id name position salary hire_date
1 르탄이 개발자 30000 2022-05-01
2 배캠이 PM 40000 2021-09-25
3 구구이 파트장 35000 2023-06-01
4 이션이 팀장 50000 2021-07-09

위의 테이블 sparta_employees에서 1번부터 4번까지의 문제 속 요구사항에 따라 특정 데이터만을 불러올 수 있는지를 묻는 문제였다.

1. 모든 직원의 이름과 직급을 불러오기

select name,
       position
from sparta_employees

 

2. 중복 없이 직급 데이터를 불러오기

select position
from sparta_employees

우선 여기까지 썼다.

 

사실 이미 겹치는 데이터가 없기 때문에 여기까지만 적어도 중복 없이 불러올 것이다. 하지만 '중복 없이'를 명령어에 포함해보려 한다. 어제 COUNT 함수를 배울 때 DISTINCT를 배웠기 때문에 DISTINCT를 써야 하는 걸 알지만 위치를 몰라 찾아봤다.

찾아보니, 해당 컬럼명 앞에 DISTINCT를 적으면 중복된 값을 제거한 데이터를 불러올 수 있다는 것을 알게 됐고 다음과 같이 쿼리를 작성했다.

[참고] https://shwank77.tistory.com/1887#5._DISTINCT_-_중복_제거 

select distinct position
from sparta_employees

 

3. 연봉이 40,000과 60,000 사이인 직원 데이터 불러오기

select *
from sparta_employees
where salary between 40000 and 60000

 

4. 2023년 1월 1일 이전에 입사한 직원 데이터 불러오기

'음... 이건 진짜 어제 배운 내용에 없었는데' 하고 바로 구글링에 들어갔다.

[참고] https://itconquest.tistory.com/entry/%ED%95%B4%EB%8B%B9-%EB%82%A0%EC%A7%9C-%EC%9D%B4%ED%9B%84%EC%97%90-%EB%93%A4%EC%96%B4%EC%98%A8-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0

 

음? 그냥 날짜도 비교연산자를 이용하면 되는 일이었다...! 어려울 것이 없어 바로 쿼리를 작성했다.

  • "2023년 1월 1일 이전" = 2023-01-01보다 작은(<)
  • 이때 2023-01-01은 하이픈(-)을 포함했기 때문에 작은 따옴표('')안에 입력
select *
from sparta_employees
where hire_date<'2023-01-01'

 


 

2) 🤩이제 좀 벌었으니 flex 한 번 해볼까요?!

여러분이 구매하고 싶은 상품들의 정보가 있는 products(상품) 테이블이 아래에 있습니다.

id product_name price category
1 맥북 프로 1200 컴퓨터
2 다이슨 청소기 300 생활가전
3 갤럭시탭 600 컴퓨터
4 드롱기 커피머신 200 주방가전

5. 제품명과 가격만 불러오기

select product_name,
       price
from products

 

6. 제품명에 '프로'가 들어가는 모든 제품 데이터를 불러오기

select*
from products
where product_name like '%프로%'

 

7. 제품명이 '갤'로 시작하는 모든 제품 데이터 불러오기

select*
from products
where product_name like '갤%'

 

8. 테이블 내 모든 제품을 구매하려면 얼마가 필요한지 계산하기

select sum(price)
from products

처음엔 위와 같이 작성했다. 이것도 맞다. 이렇게 해도 총합이 나오니까.

그러나 작성 후 정답과 맞춰보니 답안에선 조회했을 때 컬럼명이 더 보기 좋은 방식으로 표기되도록 별명을 붙여서 작성해놓았다. 쿼리를 작성할 때 최종적으로 조회될 때 보기 좋게 나오도록 쿼리를 작성하는 습관을 들여야겠다. 컬럼에 별명 붙이길 잊지 말자!!

 

그래서 아래와 같이 쿼리를 수정했다.

select sum(price) total_price
from products

 


 

3) 🛒상품 주문이 들어왔으니 주문을 처리해봅시다!

이제 상품 주문이 들어왔으니 어떤 고객에게 어떤 주문이 들어왔는지를 파악할 수 있는 orders(주문) 테이블이 아래에 있습니다.

id
customer_id
product_id
amount
shipping_fee
order_date
1
719
1
3
50000
2023-11-01
2
131
2
1
10000
2023-11-02
3
65
4
1
20000
2023-11-05
4
1008
3
2
25000
2023-11-05
5
356
1
1
15000
2023-11-09

 

9. 주문 수량이 2개 이상인 소비자 ID만 조회하기

select customer_id
from orders
where amount >=2

 

10. 2023년 11월 2일 이후에 주문된 건 중에 주문 수량이 2개 이상인 주문 데이터 조회하기

select *
from orders
where order_date>'2023-11-02' and amount>=2

 

11. 주문 수량이 3개 미만이면서 배송비가 15,000원보다 비싼 주문 데이터 조회하기

select *
from orders
where amount <3 and shipping_fee>15000

 

12. 주문 데이터를 높은 금액 순으로 정렬하기

select *
from orders
order by shipping_fee desc

 

이렇게 오늘치 SQL 연습 문제들을 다 풀었다. 아직까진 어려운 문제들이 없다. 

 

오늘 연습 문제를 풀며 기억할 점은,

  • 어떤 컬럼에서 중복된 값을 제외하고 데이터를 불러올 땐 SELECT DISTINCT 컬럼명 으로 작성한다
  • 특정 날짜를 기준으로 이전/이후 데이터들을 불러올 땐 WHERE 컬럼명 > 해당날짜데이터 작성한다
    • 이전 = 작다(그 날짜데이터보다 더 작은 값이니까) = <
    • 이후 = 크다(그 날짜데이터보다 더 큰 값이니까) = >
    • 날짜 데이터에 하이픈(-)이 있다면 작은 따옴표(' ') 안에 입력한다
  • 컬럼에 별명 붙이는 걸 잊지 말기

이렇게 SQL 복습은 마무리~~~


파이썬 공부: [파이썬 문법 기초] 1주차 1-1~1-7

어제오늘 뭐 깐다고 어쩐다고 너무 무리하는 내 노트북..

변수

  • 변수란 어떤 값이 들어있는 상자라 표현할 수 있다.
  • 파이썬에서 사용할 수 있는 값으로는 숫자, 문자, 참/거짓이 있다.

[실습] 1-3-(8). 숫자들의 평균 구하기

a = 24
b = 16
c = 26

print((a+b+c)/3)

 

[실습] 1-4-(10). 문자열의 앞의 반만 출력하기: "sparta"라는 글자에서 앞에 3글자인 "spa"만 출력하기

text = 'sparta'

result = text

print(result)

우선 위와 같이 써놓고 시작한다.

이렇게 문자열의 일부만을 잘라내는 것을 슬라이싱이라고 하는데 대괄호를 열어 입력한다.

text = 'sparta'

result = text[:3]

print(result)

이렇게 입력하면 text에 해당하는 sparta에서 첫 글자에서부터 3번째 글자까지를 출력한다.

 

[실습] 1-4-(11). 전화번호의 지역번호 출력하기

phone = "02-123-1234"

result = phone

print(result)

우선 문제에서 주어진 'phone = "02-123-1234"'를 이용해 위와 같이 적어준다.

지역번호를 출력하기 위해 스플릿을 이용한다.

phone = "02-123-1234"

result = phone.split('-')[0]

print(result)

이렇게 하면 지역번호가 02든 031이든 잘 출력한다.

 

값을 담는 방법, 리스트와 딕셔너리

  • 리스트는 순서에 따라 값을 담는다.
    • 리스트는 대괄호 안에 쉽표로 값을 나열해가며 입력한다.
    • 컴퓨터는 숫자를 0부터 센다.
    • 리스트 안에 리스트를 담을 수도 있다. 액자식 구성이잖냐 이거...
  • 딕셔너리는 키와 밸류로 값을 담는다.
    • 딕셔너리는 중괄호 안에 콜론으로 키와 밸류를 묶어서 쓰고, 마찬가지로 쉼표로 값을 나열해가며 입력한다.
    • 딕셔너리에는 순서가 없다.
    • 대괄호를 열어 키를 입력하면 해당 키의 밸류를 출력할 수 있다.
  • 리스트와 딕셔너리는 조합하여 함께 쓸 수도 있다.

[실습] 1-5-(15). 딕셔너리에서 원하는 정보를 찾아보기

people = [
    {'name': 'bob', 'age': 20, 'score':{'math':90,'science':70}},
    {'name': 'carry', 'age': 38, 'score':{'math':40,'science':72}},
    {'name': 'smith', 'age': 28, 'score':{'math':80,'science':90}},
    {'name': 'john', 'age': 34, 'score':{'math':75,'science':100}}
]

print(people)

주어진 코드스니펫을 이용하여 스미스의 과학 점수를 출력해야 한다. 스미스의 데이터는 리스트의 2번째에 위치해있다.

people = [
    {'name': 'bob', 'age': 20, 'score':{'math':90,'science':70}},
    {'name': 'carry', 'age': 38, 'score':{'math':40,'science':72}},
    {'name': 'smith', 'age': 28, 'score':{'math':80,'science':90}},
    {'name': 'john', 'age': 34, 'score':{'math':75,'science':100}}
]

print(people[2])

 

그러면 스미스의 나이, 수학 점수, 과학 점수 데이터가 출력된다. 이제 딕셔너리에서 원하는 밸류를 출력하기 위해 키를 입력한다.

people = [
    {'name': 'bob', 'age': 20, 'score':{'math':90,'science':70}},
    {'name': 'carry', 'age': 38, 'score':{'math':40,'science':72}},
    {'name': 'smith', 'age': 28, 'score':{'math':80,'science':90}},
    {'name': 'john', 'age': 34, 'score':{'math':75,'science':100}}
]

print(people[2]['score']['science'])

그러면 드디어 90만 가져온다.

 

반복문

[실습] 1-7-(19). 20살이 넘는 사람들만 출력하기

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

for person in people:
    print(person)

주어진 코드스니펫을 이용하여 우선 이렇게 적는다. 이렇게 실행하면 저 중괄호 한 줄, 한 줄 출력한다.

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

for person in people:
    name = person['name']
    age = person['age']
    print(name, age)

이렇게 입력하면 이제는 'bob 20' 이런 식으로 밸류 값만 가져온다.

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

for person in people:
    name = person['name']
    age = person['age']
    if age > 20:
        print(name, age)

마지막으로 20살이 넘는 사람들의 데이터만 출력하기 위해 if를 사용하여 출력하면 드디어 원하는 값만 가져올 수 있다!

 


음, 원래 계획은 파이썬 진도를 심화 문법에 들어가기 전인 '1-9. 함수'까지 들을 계획이었다. 

 

그런데 1-7. 반복문까지 듣고 나니 꽤 배운 내용도 많고 다음 1-8이 연습 문제를 풀면서 복습하는 파트라서 오늘 하루에 다 끝내기보단 이틀에 걸쳐서 반복해서 공부하는 편이 내게 파이썬이 익숙해지는 데 더 나은 방법이란 생각이 들었다. 

 

내일은 파이썬을 복습하고 SQL도 공부해야겠다!