데이터 분석

[day47] 하루가 너무 빨리 지나간다. 할 게 무진장 많기 때문이다.

경 민 2025. 4. 3. 21:02
👩🏻‍💻  Point of Today I LEARNED 
📌 SQL
● 코드카타

📌 Python 
● 통계 라이브세션 2회차 복습
● 통계학 기초 강의 3주차 (A/B 테스트)
● standard 세션 1회차 복습 (데이터프레임 핸들링)
● 코드카타

 

뭔가가 계속... 계속... 휘몰아치는데...

꾸역꾸역 어떻게든 해나가는 중..


1. SQL 

1-1. 코드카타 제한시간 두고 풀기

1) 코드카타 125번

https://leetcode.com/problems/list-the-products-ordered-in-a-period/

방법1. 조건필터링 → 조인

select
    p.product_name,
    a.unit
from (
    select
    product_id,
    sum(unit) unit
    from orders
    where order_date like '2020-02%'
    group by product_id
    having sum(unit) >= 100
    ) a
join products p
on a.product_id = p.product_id

 

방법2. 조인 → 조건필터링

select
    p.product_name,
    sum(unit) unit
from products p
join orders o 
on p.product_id = o.product_id
where o.order_date like '2020-02%'
group by o.product_id
having sum(unit) >= 100

2. Python

2-1. 통계 라이브세션 2회차 복습

✅ 변수들의 데이터 유형에 따른 통계적 검증방법

 

 A/B 테스트
  • 특히 마케팅에서 필수적인 통계적 가설검증 방법
  • 일종의 대조실험
  • 목적
    1. 고객의 니즈 파악 (UI/UX 서비스 개선)
    2. 최소 투자 최대 이익 (구매 전환율 증대, ROI 극대화)
  • 프로세스
    1. 현재 데이터 탐색
    2. 가설설정 (귀무가설, 대립가설)
    3. 유의수준 설정 (p-value를 어떻게 판단할지의 기준)
    4. 테스트 설계 및 진행
    5. 결과 분석 (t값, p-value 활용)
  • 주요 지표

1. 서비스 가입률

2. 재방문율

3. CTR(Click-through Rate) 노출 대비 클릭률 (= 광고 클릭해서 사이트 들어온 비율)

4. CVR 클릭 대비 전환율 (= 클릭해서 사이트 들어와서 구매까지 간 비율)

5. ROAS (Retrun On Ad Spend) 캠페인 비용 대비 캠페인 수익 (= 광고수익율)

6. eCPM (Effective Cost per Mile) 노출 1000회당 얻은 수익 '광고 노출 1000번해서 얼마 범?'

  • 계산방법 : (총 수익 / 노출 수) * 1000

7 .eCPC (Effective Cost per Click) 클릭 1번당 얻은 수익 '1클릭당 얼마 범?'

  • 계산방법 : (총 수익 / 클릭 수)

[ 캠페인 구매 방법 ] ☞ 지표로 활용 

  1. CPM (Cost per Mile) 노출 1000번당 광고비 '광고 노출 1000번하는 데 얼마 필요함?'
    • 광고 노출 수가 많은 대형 매체, 특정 인물에 적합
    • 계산방법 : (집행 비용 / 노출 수) * 1000
      • 노출(Impression) : 총 노출 횟수
      • 도달(Reach) : 광고를 본 총 유저 수
    • 예시
      • '네이버 배너 10000원 CPM' = 배너 1000회 뷰당 10000원
      • 제니 인스타그램 게시글 1개가 1000명에게 노출되는데 소요된 비용
  2. CPC (Cost per Click) 클릭 한 번당 비용 '1클릭당 얼마 필요함?'
    • 노출이 몇번 됐는지 관계없이 '실질적인 클릭 수'가 중요
    • 계산방법 : (집행 비용 / 클릭 수)
    • 예시
      • 네이버 파워링크, 위메프 핫딩 등 상단에 띄워놓고 1클릭당 100원으로 설정
      • 10만원을 광고비용으로 투자했다면 1000번 클릭될 때까지 상단 노출됨
      • 1000번 클릭을 통해 매출이 10만원을 초과해야 이익 발생
  3. CPA (Cost per Action) 특정 액션 1건당 비용
    • 여기서 액션이란, 마케터가 의도한/기대하는 고객의 행동
    • 예를 들어, 기대액션이 회원가입이라면
    • 특정 이미지,링크를 통해 사이트 진입해서 회원가입을 하면 1회원당 1000원 지불
  4. CPS (Cost per Sale) 판매 1건당 광고비
    • CPA의 일부 (특정 액션 = 구매)
    • 공동구매 수수료, 스마트 스토어 입점 등
  5. CPI (Cost per Install) 설치 1건당 광고비
    • CPA의 일부 (특정 액션 = 설치)
    • 앱테크할 때 어플리케이션 설치하면 1000포인트 주는 것 

  • 핵심 개념
유의수준
  • 신뢰수준의 반대개념 !!
  • 귀무가설을 기각하지 말지 판단하는 상한선
  • 제 1종 오류의 허용범위
  • 보통 0.05(5%) 사용

▶ 유의수준 해석

유의수준 0.05(5%)로 설정하겠다.

= 신뢰수준 95%로 진행하겠다.

= p-value 값을 어떻게 판단할 것인지 그 기준값을 0.05로 하겠다.

= 표본에서 100번 실험했을 때 귀무가설이 참인데도 기각하는 오류(=제 1종 오류)를 5번 이하로 허용하겠다.

 

p-value ≤ 0.05 해석

= 귀무가설이 참일 때 현재 t값(혹은 더 극단적인 값)이 우연히 나올 확률이 5%이하이다. 

= 두 그룹간 차이는 우연이라고 보기 어렵다. 서로 연관이 있다.

= 귀무가설을 기각한다. 대립가설을 채택한다.

 

 

 

t-value
  • A/B 두 그룹 간의 평균 차이가 어떠한지를 나타내는 값
  • 귀무가설을 기각하지 말지 결정하는 핵심 지표인 p-value를 산출하는 확률변수 (T 검정의 검정통계량)
p-value (Probability-value)
  • t-value가 '우연히' 나올 확률 (t-value가 아무리 높게 나와도 두 그룹간 차이가 우연인지 아닌지 판단해야 함)
  • 귀무가설을 채택할지 말지는 p-value와 유의수준으로 판단
  • 0~1 사이의 값 (당연. 확률이니까)

  • 주의사항
    1. 충분한 표본 크기 결정
    2. 동일 기간에 동일 조건으로 테스트
    3. 하나의 변수만 변경해서 focus 
    4. 각 그룹 무작위 추출
    5. 테스트 결과 되새김질 (이거 '실질적'으로 의미있는 거 맞아?)

2-2. standard 세션 1회차 복습 (데이터프레임 구조 핸들링)

Long Format ↔ Wide Format

Transpose
  • 열 ↔ 행
  • df.T
  • 데이터 크기 크면 오래 걸림. 구조 파악하고 실행할 것
Pivot Table
  • 자유롭게 원하는대로 표를 만들 수 있다.
  • pd.pivot_table(df, index='', columns= '', values='', aggfunc='')
  • columns는 선택, 나머지는 필수
  • 각 파라미터들 모두 list 형식으로 여러 개 지정 가능 (멀티 인덱스, 멀티 연산)
Melt
  • 컬럼 → 행 / Wide → Long
  • df.melt(id_vars= ' ', value_vars=' ', var_name= ' ', value_name= ' ', col_level= ' ', ignore_index=True/False)
  • 파라미터
    1. id_vars : 기준이 될 열 (like index)
    2. value_vars : 하위 카테고리를 나열할 열 선택
      • 기본값 = id_vars로 지정된 열 제외한 모든 열
    3. var_name : value_vars의 vars 카테고리들이 나열되면서 새로 생긴 열의 이름을 지정 
      • 기본값 = variable
    4. value_name : value_vars의 value 값들이 나열되면서 새로 생긴 열의 이름을 지정
      • 기본값 = value
    5. col_level : 멀티컬럼의 경우 melt를 수행할 컬럼의 레벨 지정
    6. ignore_index : 인덱스 재정렬할지 말지 결정
      • 기본값 = True
Stack

  • 컬럼 → 인덱스 / Wide → Long
  • 인덱스의 상위레벨(a,b)은 고정, 그 아래 하위레벨로 들어감
  • df.stack(level=-1, dropna=True)
  • 결측값 제거 안하고 대체하고 싶으면 .fillna() 해주면 됨
  • 파라미터
    1. level=-1 (기본값) : 멀티컬럼일 때, 어떤 컬럼을 인덱스로 변환할 건지 지정 (열의 레벨)
    2. dropna = True (기본값) : stack 수행 후 하위인덱스의 값이 모두 결측치일 경우 해당 열 제거
    3. level=(0,1) 이렇게 튜플로 묶어서 모든 계층을 인덱스로 변환할 수도 있음 ▶ series로 출력
Unstack

  • 컬럼의 상위레벨(0,1)은 고정, 그 아래 하위레벨로 들어감
  • df.unstack(level=-1, fill_value=None)
  • 결측치 대체 안하고 제거하고 싶으면 뒤에 .dropna() 하면 됨.
  • 파라미터
    1. level=-1 (기본값) : 멀티인덱스일 때, 어떤 인덱스를 하위열로 변환할 건지 지정 (인덱스의 레벨)
    2. fill_value (기본값) : unstack 수행 후 결측값을 채울 값 지정

☑️ 각 메서드의 차이

 

↪︎ 참고 링크 : https://kimpanda.tistory.com/99 

 

  • 정리
    1. melt는 id_vars를 기준으로 언피벗 (나열되는 vars값을 묶음으로 정렬하고 싶으면 melt)
    2. stack.reset_index()는 level에 해당하는 열 기준으로 언피벗한 형태 (기존 인덱스의 같은 그룹끼리 묶어서 정렬하고 싶으면 stack)