- FACTS :
- ✅ 오전 QCC 4회차 복습
- ✅ 오전 머신러닝 VOD강의 심화 1주차 1-6까지
- [ ] 오후
통계학 개념정리 1~23, 4, 5회차 -> 개인 노션에 정리 - ✅ 오후 개인과제 해설
- FEELINGS : 강의를 들으면서 통계학~머신러닝 부분의 개념부분이 많이 약하다는걸 느꼈다. 그래서 1회차 강의부터 복습하면서 개인 노션에 이해한 내용들을 정리하고 있다.(feat. 지난주에 공부하다가 빡쳐서 질러버린 개념서) 실시간 세션에서 튜터님이 지금 확실히 개념을 잡아두지 않으면 캠프가 끝나고 일주일만에 다 까먹을거라는 이야기에 너무너무 찔렸다. 캠프 진도와 타협하지말고 확실히 개념을 익히고 넘어가야겠다.
- FINDINGS : average와 mean 차이,
[파이썬] numpy의 std는 모표준편차(ddof=0)가 default값이고 [docs] / pandas의 std는 표본표준편차(ddof=1)를 default로 한다. [docs]
QCC4회차 복습 : 못 푼 문제 풀어보기
문제1
-- 문제1
-- 지역별로 매출이 가장 높은 매장의 매출을 조회하는 SQL 문을 작성해주세요. :group by region_name
-- 단, 해당 지역에 매장이 두 개 이상인 경우만 결과에 포함해주세요. : Where count(region_name) >= 2
-- 결과는 지역 이름을 기준으로 오름차순으로 정렬해주세요.: order by region_name
SELECT region_name,
MAX(SALES) AS "highest_sales"
FROM stores s
GROUP BY REGION_NAME
HAVING COUNT(REGION_NAME) >= 2
ORDER BY REGION_NAME;
문제2 : 중간까지 풀다가 union 못하고 제출
-- 중간 과정
-- 다음 조건에 해당되는 사용자 수를 출력해주세요 :
-- 조회: cnt
-- 조건:
-- 1. 결제를 하지 않고 상품을 주문한 사용자
-- 2. 첫 번째 결제일보다 이전에 상품을 주문한 사용자
-- 정렬: 없음
SELECT COUNT(order_userid)
FROM(
SELECT o.USER_ID, o.ORDER_DATE --union하기 위해 컬럼 갯수 맞추기
FROM orders o
LEFT JOIN payments p ON p.USER_ID = o.USER_ID
WHERE p.USER_ID IS NULL
GROUP BY o.USER_ID
UNION ALL
SELECT p.USER_ID, o.ORDER_DATE
FROM orders o
LEFT JOIN payments p ON p.USER_ID = o.USER_ID
GROUP BY p.USER_ID
HAVING MIN(p.PAY_DATE) > o.ORDER_DATE
) AS uni_all;
❗️에러 : SQL Error [1060] [42S21]: Duplicate column name 'USER_ID'
💡에러 이유 : UNION ALL은 중복값 포함 모두 합쳐지는 함수인데 위 테이블과 아래 테이블의 컬럼명 'USER_ID'가 중복되므로 합칠 수 없음. -> 두 컬럼값의 이름을 다르게 지정
-- 수정 쿼리
SELECT COUNT(order_userid) AS cnt
FROM(
SELECT o.USER_ID AS order_userid, o.ORDER_DATE
FROM orders o
LEFT JOIN payments p ON p.USER_ID = o.USER_ID
WHERE p.USER_ID IS NULL
GROUP BY o.USER_ID
UNION ALL
SELECT p.USER_ID AS payment_userid, o.ORDER_DATE
FROM orders o
LEFT JOIN payments p ON p.USER_ID = o.USER_ID
GROUP BY p.USER_ID
HAVING MIN(p.PAY_DATE) > o.ORDER_DATE
) AS uni_all;
-- 정답 쿼리
WITH first_payment AS ( -- 첫번째 결제일
SELECT
USER_ID,
MIN(PAY_DATE) AS FIRST_PAY_DATE
FROM payments
GROUP BY USER_ID
)
SELECT
COUNT(DISTINCT o.USER_ID) cnt
FROM orders o
LEFT JOIN first_payment fp
ON o.USER_ID = fp.USER_ID
WHERE fp.USER_ID IS NULL
OR o.ORDER_DATE < fp.FIRST_PAY_DATE;
‼️ 첫번째 결제일을 with문으로 먼저 구하고 원래 테이블과 JOIN후 두가지 조건을 만족시키는 쿼리를 작성..
문제 3
-- 조건1 : 제품 X와 Y가 같은 주문에 포함된 경우를 계산합니다.
-- 조건2 : 두 제품은 서로 다른 이름이어야 하며, 한 쌍의 경우(예: Coffee와 Sausages)는 다른 순서(예: Sausages와 Coffee)로도 포함됩니다.
-- 조건3 : 결과는 각 제품 쌍과 해당 제품이 함께 포함된 주문 수를 반환해야 합니다.
-- 정렬 : 제품 이름 X와 Y를 기준으로 알파벳 순으로 오름차순 정렬
-- 출력 : name_x, name_y, orders
SELECT A.NAME name_x,
B.NAME name_y,
COUNT(DISTINCT A.CART_ID) AS orders
FROM cart_products A
JOIN cart_products B
ON A.CART_ID = B.CART_ID -- 조건1
AND A.NAME <> B.NAME -- 조건2
GROUP BY 1,2
ORDER BY 1,2; -- 조건3
✔️고유 ID 뽑아낼때는 DISTINCT로 중복값 없애는 것 습관들이기!!!
✔️JOIN ON 절에서 여러 조건 넣을 수 있음! 위의 경우, A와 B의 cart_id가 같고 name이 다를 때
개인과제 1
반면 pandas의 std는 표본표준편차(ddof=1)를 default로 한다. [docs]
그러므로 생각없이 std()를 사용하면 모표준편차와 표본표준편차를 혼용하게 된다.
values를 통해 numpy로 변형하고 std를 호출하면 모표준편차가 계산된다는 것이다.
'내일배움캠프 > TIL' 카테고리의 다른 글
[TIL]250121_파이썬 print의 옵션, 딕셔너리 형태의 key, value이용법 (0) | 2025.01.21 |
---|---|
[TIL]250120_파이썬 베이직반 복습_수정중... (0) | 2025.01.20 |
[TIL]250116_파이썬 베이직 4회차 복습, 개인과제 문제6 (0) | 2025.01.16 |
[TIL]250115_통계학 개인과제 문제4,5 (0) | 2025.01.15 |
[TIL]250114_SQL,알고리즘 코드카타, 통계학 개인과제1~3번 (0) | 2025.01.14 |