데이터 분석

[day48] 분명 금요일인데 기쁘지가 않어. 주말이 없기 때문이야.

경 민 2025. 4. 4. 21:04
👩🏻‍💻  Point of Today I LEARNED 
📌 SQL
● QCC 복습

📌 Python 
● standard 세션 2회차 복습

 

오늘은 거의 QCC 복습, 응용 연습하는 데에 시간을 쏟았다.

후기는 아래에 계속 ,,


1. SQL 

1-1. QCC 복습

 

QCC 3회차

1번. 임직원 로그인 빈도 분석제출한 코드 (오답)select cnt as unique_logins, count(employee_id) as employee_countfrom(select l.employee_id, count(l.login_id) cntfrom logins ljoin employees eon l.employee_id = e.employee_idwhere l.login_time

rosenps3.tistory.com

아쉽다. 너무 아쉽다.

1번에 date_format만 걸어줬어도 만점인데 !!!!!!

 

하지만..

4번 문제 풀면서 서버 문제로 몇 차레 시험이 중단됐고,

그만큼 생각할 시간을 벌었기 때문에..

사실상 공평한 시험은 아니었다고 생각한다.

그래서 4번 문제 맞힌 것도 100% 실력은 아니라고 본다.

(본인에게 엄격한 편..?)

QCC 3회차 포인트
1. with 구문을 잘 활용하면 쿼리 짤 때 훨씬 간결해지고 헷갈리지 않을 것 같아서 모든 문제를 CTE 만들어서 새로 풀어보았다. 코드카타 풀 때도 의식적으로 써봐야겠음
2. ⭐️⭐️⭐️ datetime 형식의 데이터에 조건 걸 때는 반드시 date_format 걸어서 문자열로 형변환해주자. 그래야 원하는대로 정확하게 결과를 추출할 수 있다.
3. rank와 dense_rank의 차이
4. ⭐️ limit 찾을 행 개수(n) offset 시작 행(s) ➜ s행부터 시작해서 n개 행 추출
5. case when에 직접 sum 붙여줄 수 있음
6. ⭐️⭐️ 조건필터링한 테이블을 CTE로 만들어서 INNER JOIN 시키면 굳이 where ~ in 서브쿼리 안해줘도 됨

 


2. Python

2-1. standard 세션 2회차 복습

1) 파이썬의 Window 함수 (➊Shift, Rolling, Expanding)

Shift
  • SQL의 lag, lead 기능과 비슷
  • df.shift(periods=n , freq=None, axis=0, fill_value = ' ')
  • 파라미터
    1. periods : 이동할 기간(n)
      • 양수면 n번 앞 행의 날짜
      • 음수면 n번 뒤 행의 날짜
    2. freq : Y M D H T S / Timestamp / 'Infer' 등
    3. axis : 연산 축 방향 지정
      • axis=0 (기본값) : 행
      • axis=1 : 열
    4. fill_value : 결측치 대체값 지정
Rolling
  • SQL의 range between interval n day preceding and current row 기능과 비슷
  • df.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, close=None, method = 'single').집계메서드()
  • 파라미터
    1. window : 계산할 행/열의 개수
    2. min_periods : 계산할 최소 크기(기간), 기본적으로 window값과 동일
    3. center
      • False (기본값)
      • True : 중간 행 기준 계산
    4. win_type : 가중치 적용
    5. on : 시계열/시계열 느낌 나는 열을 지정해서 이 열 기준으로 연산 수행
    6. axis : 연산 축 방향 지정
      • axis=0 (기본값) : 행
      • axis=1 : 열
    7. closed : 연산 닫히는 방향 지정 (거의 안씀)
      • right (기본값) : 오른쪽 값 포함
      • left : 왼쪽 값 포함
      • both : 양쪽 다 포함
      • neither : 양쪽 다 미포함
    8. method : 연산 방식 지정 (현재 single만 사용 가능)
Expanding
  • df.expanding(min_periods=1, axis=0, method='single').집계메서드()
  • 누적값 출력
  • Rolling의 일부분이라고 보면 됨 (범위 지정 불가한 누적)
  • 파라미터
    1. min_periods : 연산 수행할 요소의 최소 개수
    2. axis : 연산 축 방향 지정
      • axis=0 (기본값) : 행
      • axis=1 : 열
    3. method : 연산방식
      • single (기본값) : 한 줄씩 연산
      • table : 전체 테이블에 대한 연산 → import numba 필요 

2) 데이터 타입별 상관관계

피어슨 상관계수
  • 연속형 ↔ 연속형
  • df.corr(method='pearson')
  • 1에 가까우면 비례관계, -1에 가까우면 반비례관계, 0이면 아무런 상관 관계 없음
  • 즉 |상관계수|가 1에 가까울수록 높은 상관관계를 가진다는 의미
    • 현업에서 보통 0.7 이상이면 높다고 판단, 0.5이하는 거의 관계 없다고 판단

 

Point biserial 상관계수 (점이연 상관계수)
  • 연속형 ↔ 범주형 (범주 2개(이분형))
  • 범주를 0,1로 코딩해서 숫자형으로 변환 ➜ 피어슨 상관계수 계산
    • (범주형 독립변수) 쇼핑레터 구독 (예/아니오) → 예(0), 아니오(1)
    • (연속형 종속변수) 총 구매 가격
  • scipy 라이브러리의 pointbiserialr 함수
    • stats.pointbiserialr(df['컬럼'],df['컬럼'])
    • 상관계수(r), p-value 동시에 반환
    • 상관계수가 통계적으로 유의미한지 p-value를 통해 판단
Q. 두 집단의 차이를 비교한다는 점에서 독립표본 t-검정과 비슷하다고 느껴진다. 뭐가 다른거지?
✔︎ 독립표본 t-검정 : 두 집단 간의 평균의 차이(얼마나 다른지)가 통계적으로 유의미한지 확인 (t, p-value)
✔︎ Point biserial 상관계수 : 두 변수 간의 상관 정도(얼마나 연관되어있는지)를 정량적으로 측정 (r, p-value)

✅ 정리

1. t-검정 결과 t값이 높게 나왔고, p-value가 0.05 이하로 나와서 두 그룹 간 차이가 유의미하게 크다는 게 증명됨
(= 쇼핑레터 구독을 한 그룹과 안 한 그룹 간의 총 구매 가격의 평균 차이가 크다.)
2. Point biserial 상관계수를 산출했을 때 쇼핑레터 구독한 그룹~총구매가격의 상관계수가 1에 가깝게 나왔고,  p-value가 0.05이하로 나와서 두 변수 간의 상관정도가 높다는 게 증명됨
(= 쇼핑레터 구독할수록 더 많이 구매한다.)

 

ANOVA (분산 분석, Analysis of Variance)
  • 연속형 ↔ 범주형 (범주 3개 이상)
  • (Polyseiral도 가능) 하지만 범주형이 순서형일 때 적합
  • 분석할 때 보통 명목형 데이터가 더 많고, 현재 python에서 Polyseiral 지원 X
  • 범주형 변수에 따라 연속형 변수들의 '평균'의 차이가 얼마나 나는지 검정
    • (범주형 독립변수) 나라별 (한국, 미국, 프랑스, ...)
    • (연속형 종속변수) 총 매출액
  • scipy 라이브러리의 f_oneway 함수
    • stats.f_oneway(df['컬럼'],df['컬럼'])
    • f-statistic, p-value 동시에 반환
    • f값이 통계적으로 유의미한지 p-value를 통해 판단
  • 결과값 
F-Statistic 해석
F < 1 무의미
1 ≤ F < 3 거의 무의미
3 ≤ F < 10 경우에 따라 유의미
10 ≤ F < 50 유의미 (강한 차이)
F > 50 거의 확실한 유의미 (아주 강한 차이)
F >= 100 확실한 유의미 (매우 강한 차이)
t-검정 vs ANOVA
t-검정 :  변수 2개 (독립변수:범주형, 종속변수:연속형)
ANOVA : 변수 3개 이상 (독립변수:범주형, 종속변수:연속형)

 카이제곱검정 vs ANOVA
카이제곱검정 : 범주형 데이터의 비율 비교 (독립변수, 종속변수 모두 범주형)
ANOVA : 범주형 데이터에 따른 연속형 데이터의 평균 비교 (독립변수:범주형, 종속변수:연속형)

 

파이 상관계수
  • 범주형(이분형) ↔ 범주형(이분형)
  • 두 범주 모두 이분형 & 명목형(순서가 없는)일 때만 사용 가능
  • 범주를 0,1로 코딩해서 숫자형으로 변환 ➜ 피어슨 상관계수 계산
 Cramer's V
  • 범주형 ↔ 범주형
  • 변수 중 하나라도 범주가 3개 이상일 때 사용
  • 범주 각각 LabelEncoding ➜ define a function ➜ 혼동행렬 생성
  • scipy, sklearn 라이브러리
  • 결과값
 Cramer's V 계수 해석
0 ~ 0.1 무시해도 되는 관계
0.1 ~ 0.2 약한 상관관계
0.2 ~ 0.4 보통 상관관계
0.4 ~ 0.6 약한 상관관계
0.6 ~ 0.8 강한 상관관게
0.8 ~ 1.0 매우 강한 상관관계