본캠프/TIL ♨

[TIL 14일차] 열혈QCC 오답노트,첫 파이썬 라이브세션.(실력쑥쑥, 문제 더 풀자!)

yssummer 2025. 3. 7. 17:29

 

🐱‍👤 하루 요약 

1.오후 5시 지금 상황: QCC 테스트로 불타없어지다...... 시험이 한시 반이었는데 시험 효과를 최대화하고 싶어서.. 자주 보는 것도 아닌데 해설 들을 때 모르는상태로 듣고 싶지 않아서.. 점심밥도 포기하고 9시부터 스트레이트로 섭쿼리와 조인문제를 풀었다.... 역시 조인문제가 나왔지만 내가 접근조차 안해본 스타일의 문제 나와서 결국 틀렸다 ㅋㅋㅋㅋ 그치만 힘겨운 방식으로라도(조인을 한번에 몰아서 안하고 서브쿼리 스타일로 감싸면서 악마의 환상궁합으로 풀었는데..이러니까 복잡해서 보기에 불편했다.) 내 실력으로는 복잡한 문제였지만 잘 하면 맞출 수 있을 것도 같아서 ㅠㅠㅠ 끝까지 열심히 풀었고 ㅠㅠㅠ 그래도 하긴 했다. 정말 대견하다.....ㅋㅋㅋㅋㅋ 9시 -5시가 언제 이렇게 흘렀는지.....

2. 계획: 두시반부터 네시? 정도까지 해설을 들었고, 해설 다시 들을 것도 있고, 캡쳐도 많이하고 필기도 여기저기 해놔서 til에 한번에 정리하고 있다. 다섯시 정도 되었는데 미리 저녁을 먹어야겠다. til 쓰고 잠시 쉬어야겠다 머리가 불타고 있다... 산책좀 하고 아까 한 파이썬 라이브세션 녹강 다시 들어야겠다...

3. 지쳐있지만 신나는 이유: 해설 듣고 공부가 많이 되다 !!!! 파이썬 세션 듣고 기대되다 ~~  튜터님들 진짜 손 완전빠르고 엄청 잘하셔서 대박이다... 내가 10분동안 읽을 거를 튜터님들은 10초만에 아는 것 같다....

4. 오늘 qcc 오답노트: 첫 문제는 나름 맞게 풀었는데 select시 프라이머리 키를 사용하지 않았다는 점에서 정답이 틀렸었다. 두번째 문제는 테이블 4개를 조인하는 건 낯설어서 비효율적 방식으로 풀이하여 어디선가 꼬여서 틀렸다. 다양한 조인문제를 접해볼 필요성을 느꼈다. 첫 문제에서 프라이머리 키 위주로 사용해야함을 느꼈다. 이 부분을 명심하고 가져가야겠다. (아무리 distinct를 쓰더라도 first name/last name 같은 건 워낙 겹쳐서 위험한 방식인듯. 모범답안테이블이 절대 나오지 않았다...)

전체적으로 잘한 점을 본다면, 풀이 방식은 틀렸지만 구조를 이해는 한 것 같다. 두 테이블 사이에 연결이 어떻게 되는지, 그래서 먼저 뭘 구하고 나중에 뭘 구해야 하는지, 셀렉트를 결국 뭘 해야되는지 순서와 구조는 나름 알고 있다고 느껴졌다. 그치만 조인을 3번 하니까 잠깐 한눈 팔면 뭔가 헷갈리기 시작한달까? 색깔로 쫙쫙 표시하면서 구문을 나눠봐야 할 것 같다. 이따가 어디에 색깔로 구분하면서 다시 뜯어봐야겠다.

5. 시험에 노출되면서 느낀점: 낯선 데이터베이스를 마구마구 접해버릇 해야 좋구나? 오늘 시험으로 첨보는 복잡한 여러 테이블을 보니까 좀 머리가 트인 것 같다, 코드카타에 꾸준히 노출되어야함을 느끼다. 자주 쓰던 테이블만 갖고 실습했었는데, 코드카타 문제들에도 애정을 가져야겠다.

😊계획

(뭐야..다중요하잖아)

중요 & 급함 덜중요 & 급함

qcc 테스트 ✅
qcc 해설강의


파이썬 라이브세션
파이썬 라이브세션 복습

sql온라인강의 완강을향해

 

중요 & 덜급함 덜중요 & 덜급함

틈틈이 5분 빡센운동... 뇌에 산소 공급✅
TIL 빠진 정보 메꾸기 in 머리가장 안돌아가는시간에

 

 

 

😊공부내용 디테일

🔵qcc 해설강의

필기 사진, 텍스트 메모, 캡쳐 등

🧶문제1

쫌 떨렸음 ^^;; 설렘반 긴장반

🐬 내 답안

select distinct first_name, count(distinct first_name) as customer_count
from person
where person_type='IN' and email_promotion!=0

지금 알고나서 보니까 first_name 으로 잡은게 왜케 어이없게 보이지...? 

프라이머리 키가 번듯이 있는데 .... 이름은 모두에게 하나씩 있지! 이러고 이름으로 갔다ㅋㅋㅋㅋ 

그니까 이 부분이 문제였다.

모두에게 하나씩 있는 진정한 건 프라이머리 키라고..>!!!

이름 각자 있지 그치만 겹치잖아??? 겹치는 사람이 없을거라는 생각을 하다니

겹치는 이름들 있는지 미리 확인해보지도 않고서 (이 확인하는 과정도 튜터님은 엄청 빨랐음.... 쿼리 뭐라고 썼더라.... 뭐가 5이상 이런식으로 검색하시던데,,)

그 겹치는걸 다 빼겠다는 건데 (distinct) 어떻게 모든 데이터가 다 제대로 나오겠냐는거지~근데 아깐 정말 저렇게 생각했다. 그리고 더 생각할 마음의 여유도 없기도 했지만 진짜 몰라서 저렇게 한거다.. 이것이 나의 실력이다

아무리 머리싸매고 고민해도 모르다가 답안보고 뒤늦게 아! 한다고 해서 그걸 미리 알았다는 건 아니다

그 답안 쓸 생각을 1도 못했다

 

🐬 모범답안

SELECT COUNT(DISTINCT business_entity_id) as customer_count
FROM qcc.person
WHERE email_promotion > 0 -- 0 = 이메일 프로모션을 받지 않음
AND person_type = 'IN' -- IN = 개인(소매) 고객

 

🧶문제2

🐬 내 답안 (서브쿼리 만들듯이 레프트조인을 계속 해야하는 줄 알았다.)

select h.customer_id, p.first_name, p.last_name, sum_qty
(
select h.customer_id, sum_qty
from
(
select distinct h.customer_id, h.status, h.order_date, sum(order_qty) as sum_qty
from sales_order_header h left join sales_order_detail d on h.sales_order_id=d.sales_order_id
where status!=6
and order_date like '2011-10%'
and sum(order_qty)>=70
group by 1,2,3
) a 
left join sales_customer c on h.customer_id=c.customer_id
group by 1,2
) b 
left join person p on c.person_id=p.business_entity_id
group by 1,2,3,4
order by h.customer_id desc
;

#취소 주문 제외,고객 정보 포함하여 아이디, 이름, 성, 총주문수량 출력
#결과는 고객 아이디 기준으로 오름차순desc
#2011년 10월 한달간 구매한 회사제품 수량이 총 70개 이상인 고객 찾기

이거는 어디가 틀린지 몰라서 계속 수정하다가 엄청 많이 수정했는데,  흠... 완전 서브쿼리 한놈밖에 모르는 녀석의 풀이같아!!

튜터님 모범답안 보고 아?????? 이런 느낌이었다.... 그래 이건 조인문제인데 이렇게 몰아서 조인해도 되는구나 이러면서...그리고 다른 학생분들 답안중에서 되게 새로운 사고방식이라고 느낀 답안이 있었는데, 튜터님 모범답안처럼 (((1+2)+3)+4) 처럼 합치는게 아니라 ((1+2) + (3+4)) 이런 순서로 묶어준 분이 있었는데 오 좀 대단했다. 개연성있는 별칭으로 묶어주는 센스도 있는 분이셨는데 뭔가 1학년으로서 2,3학년한테 배우는 느낌이 들어서 좋았다.   

 

🐬 모범 답안

SELECT c.customer_id as customer_id
    , p.first_name as first_name
    , p.last_name as last_name
    , SUM(so.order_qty) AS total_quantity
FROM qcc.sales_customer c
INNER JOIN qcc.person p ON c.person_id = p.business_entity_id
INNER JOIN qcc.sales_order_header soh ON c.customer_id = soh.customer_id
INNER JOIN qcc.sales_order_detail so ON soh.sales_order_id = so.sales_order_id
WHERE DATE(order_date) BETWEEN '2011-10-01' AND '2011-10-31' -- 2011-10 주문
AND soh.status <> 6 -- 취소 비포함
GROUP BY c.customer_id, p.first_name, p.last_name
HAVING SUM(so.order_qty) >= 70    -- 총 주문 수량 70개 이상
ORDER BY c.customer_id            -- 고객 ID 오름차순 정렬

 

오늘의 수확!! 이걸 알게된 거~~~

해설강의 스크린샷...하다가 너무 많이해서 포기했다 ㅋㅋㅋ

 

댓글창에 학생분들 질의응답 나도 궁금했던거 열심히 메모장에 메모ㅠㅠㅋㅋㅋ

count(1)을 하면 테이블의 첫번째 칼럼 기준으로 실행이 되나요?? 그리고 그 칼럼이 business_entity_id이고 pk라서 중복이 없으니까 count(distinct())랑 결과가 같은것인가요? --> 이게 맞는 설명
sales_customer 테이블의 person_id 에 null이 있는걸 봤는데, 문제에선 고객의 성, 이름을 출력하라고 나와있었습니다. 그런데 person 테이블과 sales_cutromer 테이블을 join 하려면 person_id 컬럼이 필수인데, 이런 경우엔 person_id가 NULL인 행은 정답과 관련이 없다고 생각하고 풀면 될까요? 네 날짜 추출할 때 like “2011-10%” 했는데 괜찮나요? 네
join할때 header랑 person은 공통점이 안 보이는데 join 순서를 어떻게 해야 할지 모르겠습니다. header랑 detail까지 조인은 알았는데 person이랑 customer_id 조인을 서브쿼리없이 같이 조인해도 되는건가요? 네
담겨있는 데이터만 같으면 이름이 다른 건 상관없어요! 순서가 중요
그리고 별칭을 만들면 나중에 쓸라면 그 전에 형성되어있어야함.
아 그러면 순서대로 병합되는 거죠? 예를 들어 1번째와 3번째가 연관이 없어도 2번째에서 병합이 되니까요! 네
이미 customer_id 가 pk이니까 마지막에 Group by 1 만 하면 안 되나요? 돼요
그냥 조인은 풀 아우터 조인이랑 같은건가요?INNER 입니다
on d.sales_order_id = h.sales_order_id   on h.customer_id = c.customer_id on c.person_id = p.Business_Entity_ID 조인 할때 순서를 이렇게 했는데 그럼 틀린건가요? 실무에서는 별 쓸거면 1씀 똑같고 더 빨라서.
distinct를 모르겠으면 무조건 넣는게 좋음 테이블 만들 때 실수가 있을 수도 있고 내가 보는 값이 pk값이 아닐수도 있으니까 보수적으로 함 테이블 너무나 클때는 안하는게 빠르긴함.
#주석 달면서 해주면 사고과정 봐줄 수 있어서 좋다 굿
댓글, person type따로 그룹바이 하고 셀렉해보시면 뭐 있는지 뜹니다5-6개 정도 종류가 있었어요

그룹바이가 없어...? 그룹바이를 안하는거구나.... 그리고 커스토머 아이디별로 구하는거가 가장 맞음.

 

 

 

 

🔵오늘 오전에 푼 조인문제들 중 하나

🧶문제에 합을 구하라고 하는 말 표현을 +로 이해했는데, 알고보니 sum을 구하는거였어가지고 

지우지 않고 그냥 sum으로 감쌌다...... 왕복잡한 쿼리가 돼서 웃겨서 캡쳐했다.




🔵파이썬 라이브세션 

🧶강의노트

🐬

설무아 튜터님 강의 메모

  • 쥬피터 노트북 사용(데이터 분석가에게 가장 유명한 이유는 블록 단위로 코드를 작성할 수 있고, 시각화도 할 수 있고, 노션처럼 마크다운 문서를 하나의 웹 기반 대화형 환경에서 제공함.)
  • 코랩 : 구글에서 제공하는 클라우드 기반인 것도 사용가능.
  • 본격적인 개발을 한다고 하면, VSCode 유명. 다양한 언어 지원 확장성 높은 오픈소스 인기 짱.
  • 파이참은 파이썬 전용이라서 강력한 디버깅과 자동완성 기능 제공하는데 이건 제대로 쓰려면 유료여서 vscode를 많이 씀.
  • 컴퓨터 용량이 파이참과 주피터 설치가 어려울 정도라면 데이터베이스 내려받는 등의 실습과정에 문제가 생기니 용량 해결해야 한다. 프로그램은 명령어들의 집합, 기존 연산을 사용해 더 복잡한 연산을 만들 수 있다☀코드카타 열심히 하면서 문제해결능력 기르길! 데이터 분석가에게는 중요도 낮춰지지만.
  • ☀사고 훈련을 하는 것이 아주 중요(개발자 코스, 코딩테스트 프리패스 수준을 원한다면 아주 중요),
  • 프로그래밍은 컴퓨터가 이해할 수 있는 언어로 문제 해결 과정을 체계적으로 작성하는 활동인데 이거 자체를 알고리즘이라고 함. 복잡한 문제를 작은 단계들로 나누어 해결하는 논리적 사고 과정임.
  • ☀컴퓨터적 논리적 사고 과정 매우 중요
  • 파이썬 프로그램 - 파이썬 인터프리터 - 운영체제의 관계에 대해서도 알려주심.
  • 인터프리터: 파이참 효과적으로 활용할 수 있는 개발도구임 (이건 파이참을 이미 설치해서 이해함)
  • 인터프리터가 사용자의 명령어를 운영체제가 이해하는 언어로 바꿔서 프로그램을 실행함.

파이썬으로 무엇을 할 수 있냐면…

  • 데이터 분석이 빠.르.다.! (그러나 배우는 게 쉽다고는 안했다…. 현재 배워나갈 게 두가지라 더 어렵게 느껴질수도 있음: 컴퓨팅 사고 + 라이브러리 사용방법 익히기)
    • ex) 데이터 셋 구축 및 관리, 데이터 전처리 및 정제, EDA, 시각화, 머신러닝 모델 개발 및 평가. 전반적으로 sql에서 하는 것보다 더 간결하다고 한다. 기대기대~
  • 인공지능 모델링 및 활용 : 인공지능 기반은 거의 다 파이썬.
    • 이미지 인식 및 분석, 자연어 처리 등등)
  • 시각화 및 대시보드
    • 상상한 모든 그래프 만들 수 있음. 데이터 기반 리포트 자동화도 가능. 막강해짐~
  • 기타 응용 분야
    • 웹서버, 앱, 게임 개발, 업무 자동화 및 매크로 프로그래밍 (반복적인 작업 스크립트로 자동화)

파이썬 활용 실무 사례

  • 빅테크 기업: 구글, 페북, 넷플 - 표준언어로 자리잡고 있다. 데이터 파이프라인 구축, 데이터 분석 이것으로 하고 있음.
  • 의료분야 : 영상분석, 질병 예측 모델링, 임상 데이터 분석
  • 이커머스: 고객 행동 분석, 개인화된 추천 시스템 개발, 수요 예측
  • 금융 산업: 위험 분석, 알고리즘 트레이딩, 사기 탐지 시스템

파이썬 학습 로드맵

  1. 기초 문법과 자료구조
    1. 기초 문법: 변수, 조건문, 반복문, 함수, 클래스, 연산자 (모든 언어의 기본)
    2. 자료구조: 리스트, 딕셔너리, 튜플, 셋 (기본만 해도 충분, 외에는 그래프 자료구조, 해쉬 자료구조 등)
  2. 데이터 분석 라이브러리 다음주부터 진행한다고 함
    1. 넘파이, 판다스 이용
  3. 데이터 시각화 도구
    1. 매츠프롯라이브러리, 시본, 플롯틀리
  4. 머신러닝 기초
    1. 기본 알고리즘 이해: 선형 회귀, 로지스틱 회귀, 결정 트리 등등
    2. 사이킷 런을 많이 이용
  5. 실전 프로젝트 : 프로젝트 기반 학습, 실제 데이터셋을 활용한 종합 분석, 문제 정의부터 결과 해석까지 전체 워크플로우를 경험하면서 실력이 쌓임.

파이썬 코드카타를 열심히 하는 것을 개인적으로는 추천(제조업 데이터 분석가는 파이썬으로 시험 봄. 대기업 희망할 경우 코드카타 꾸준하게 해야 함 사고훈련이 꾸준하게 되어야하기 때문.

 

 

서정욱 튜터님 강의 메모

 

이후 시연으로 뭘 할 수 있는지 보여주셨는데 대박

서정욱 튜터님 강의메모

초보들이 많이 하는 실수와 질문 위주로 소개

  • 파이썬 계산이 이상해요
    • 따옴표 안에 들어가면 문자. 숫자 덧셈 할 때 따옴표 주의
    • print(”2”+2) 는 에러 (type error, 문자냐 숫자냐 에러를 의미)
  • 왜 안되나요
    • fruits = [”apple”, “banana”, “cherry”]
    • print(fruits[3]) 하면 에러다. 0부터 세어야해서 2를 하거나 -1(뒤에서부터 세기) 해야 체리가 나온다.
    • for i in range(1, 10):for i in range(1, 10+1)라고 쓰면 11이라고 쓰는 것보다 직관적으로 눈에 보이니까 실수 덜 됨.
    • print(i)
    • print(i) 를 했는데 1에서 9까지 뱉음. 그 이유는 파이썬이 range함수도 그렇고 슬라이싱 할떄도 [1:10]라고 쓸 때도 마찬가지인데, 원래 한칸 앞에까지만 감. 코드 복잡해지면 이거를 깜빡할 수 있음. 그래서 본인의 경우 이런식으로 사용하는데,
  • 단골 질문
    • def greet():message=greet()그다음 print(message)를 하면왜 hello!를 출력하지 않는가? 반환값과 출력값이 다르기 때문이다!반환해주는 건 return이라는 거다. (이건 출력을 하는게 아니라서 우리눈에는 안보인다 그렇지만 메시지에 결과값이 잘 들어가고 반환은 해준다. 반환= 결과값을 내보내줌. 아예 줌. 출력=보여주기만하고 주지 않음. 그냥 자랑만(?)함. 뷰어로 보는거랑 다운로드 되는 거랑 다르듯이?def greet(): return “Hello!” 반환은 해주고 출력은 안해줌.print(message) 하면 이제는 됨
    • Hello!
    • message = greet() 할 때 메세지라는 변수 안에 잘 담김.
    • 그래서 반환이 되게 쓰려면 (함수에서는 인풋과 아웃풋이 중요한데 반환이 아웃풋인듯)
    • print라는 것은 출력을 해주는 것이지 반환을 해주는 것은 아니다.
    • None을 뱉음.
    • 여기까지 하면 Hello!를 뱉음
    • print(”Hello!”)
    말하자면 이런거지
  • 맞게 짠 것 같은데 아닌가?
    • score=100print(”Pass”) —> 이 경우 Identation error 뜸
    • 왜일까? 들여쓰기가 문제였다. 들여쓰기에 예민한 언어! print 앞에서
    • if score > 50:
  • while 문 쓸 때 코드가 끝이 안날 때가 있다. 무섭. 무한반복 될 수 있음. ㅠㅠ
    • 빨간 경고문 나오고 exceeded라는문구가 나오면 빨리 닫아야됨!!! 나중에 재부팅해야됨.
    • 코드를 중시시키는 단축키 컨트롤 씨
    • 그렇게 안되게 하는 법은 탈출할 수 있는 조건문을 만들어줘야하는 건데,
    • i = 1print( “어쩌구”)
    • i += 1 —> 이 친구를 꼭 써줘야 합니다~~
    • while i < 10:
  • 주피터 계열 프로그램 쓸 때 값이 제대로 안나오는 오류
  • 네임에 서정욱을 넣었는데 프린트 해보니 설무아가 나옴.
  • 중간에 넣어놓은 적 있는데 그 이후에 삭제하면 그렇게 됨.
  • 코드가 길어지다보면 똑같은 변수에 담는경우가 있음.
  • 그러다가 중간에 그걸 지워버릴 수가 있음, 중간에 다른게 담긴거임
  • 이것때문에 연쇄적으로 문제가 생기는 경우를 많이 봤기 떄문에 변수를 이왕이면 중복된 것 쓰지 말고, 다른 거 써라. 확실하게 아는 경우에만 겹치는 변수 써라. 지울때도 이거 지워도 아무 문제 없는지 잘 생각해봐야한다. 지워버려서 원인 모를 때는 왼쪽 숫자보면 분명 없어진 게 있을 것임.
  • 애초에 변수를 잘 구분하면 지워도 별 문제가 발생 안함.
  • 아예 새로고침한 후 정갈하게 다시 짜던가.
  • 주피터는 한번 실행하면 메모리에 그대로 가지고 있음. 눈에만 안보이지 메모리에 저장됨.
  • 파이참이나 vscode는 실행하면 메모리에 있는거 다 비워줌.
  • 지역변수와 전역변수는 무엇인가?
    • x = 10
    • def func():
      • x=20 —> 20이 나옴 지역변수 지역변수는 반드시 함수 내에서만 사용됨
      • print(x) —> 이렇게 하면 엑스에 이십 담은건 여기서 없어짐
    func()지역변수는 함수 내에서만 쓴다 라고 기억하면 됨.여기 나온 것 정도만 잘 지키면 큰 실수를 많이 막을 수 있을 것.
  • 전역변수는 지역변수가 함수 안에 개입하고 있지 않은이상 모두 그의 손아귀에있다.
  • print(x)—> 함수 밖에서는 20이랑 아무 상관 없이 10이 출력됨.

 

🔵주말과 다음주 계획