부트캠프

멋쟁이사자처럼 부트캠프 그로스마케팅 4기 20일차(2)_260407

Yuuma 2026. 4. 7. 19:47

 

📅 2025.04.07  |  📚 데이터분석개론 Day 4

📝 TIL — Today I Learned

Pandas 데이터 정렬 & 필터링 완전 정복

그로스 마케팅 부트캠프 Day 4 수업 내용. 광고 캠페인 성과 데이터를 pandas로 정렬하고 필터링하는 실무 패턴을 익혔다. 엑셀로 하던 피벗·필터 작업을 코드 한 줄로 처리하는 감각을 체득!

📋 목차
  1. 왜 Pandas인가? — 엑셀 vs Pandas
  2. 오늘 사용할 데이터 구조
  3. 데이터 정렬 — sort_values()
  4. 데이터 필터링 — Boolean Indexing vs query()
  5. 특수 필터링 — isin() / str.contains() / between()
  6. 정렬 + 필터링 결합 — 실무 패턴
  7. 통계 함수 — mean vs median
  8. 치트시트 & 오늘의 핵심

1. 왜 Pandas인가? — 엑셀 vs Pandas

엑셀로도 데이터 분석은 할 수 있다. 근데 아래 표를 보면 왜 Pandas를 배워야 하는지 바로 느껴진다.

엑셀 vs Pandas 비교

▲ 같은 상황, 엑셀과 Pandas의 차이

💡

캠페인 데이터가 10만 행이 넘어가는 순간 엑셀은 버벅이기 시작한다. Pandas는 100만 행도 10초 안에 처리한다. 마케터에게 Pandas는 엑셀의 업그레이드 버전이다.

2. 오늘 사용할 데이터 구조

실제 Meta Ads / Google Ads 리포트와 비슷한 구조의 데이터를 기준으로 모든 예제를 실습했다.

python — 실습 데이터 준비
 
import pandas as pd

data = {
    "캠페인명": ["신규유저_봄할인", "리타겟팅_장바구니", "브랜드인지_여름",
               "리텐션_VIP", "신규유저_앱설치"],
    "채널":    ["Meta", "Meta", "Google", "카카오", "Google"],
    "광고비":  [1200000, 850000, 2300000, 450000, 1750000],
    "클릭수":  [3200, 1850, 4100, 920, 3600],
    "전환수":  [128, 204, 89, 98, 144],
    "매출액":  [3840000, 6120000, 2670000, 4900000, 4320000],
}
df = pd.DataFrame(data)

# 자주 쓰는 지표 미리 계산
df["ROAS"]  = (df["매출액"] / df["광고비"]).round(2)
df["CPC"]   = (df["광고비"] / df["클릭수"]).round(0)
df["전환율"] = (df["전환수"] / df["클릭수"] * 100).round(2)
📌

용어 정리: ROAS = 매출액 ÷ 광고비 (광고 1원으로 몇 원 벌었는지) / CPC = 광고비 ÷ 클릭수 (클릭 한 번당 비용) / 전환율 = 전환수 ÷ 클릭수 × 100

3. 데이터 정렬 — sort_values()

엑셀에서 특정 열 기준으로 오름차순/내림차순 정렬하는 것과 똑같다. sort_values(by="열이름") 한 줄이 핵심.

정렬 핵심 개념

▲ sort_values() — 기본, 복수 기준, 유용한 옵션들

기본 정렬

python — 기본 정렬
 
# ROAS 높은 순 (내림차순) — 성과 좋은 캠페인 찾기
roas_ranking = df.sort_values(by="ROAS", ascending=False)
print(roas_ranking[["캠페인명", "광고비", "매출액", "ROAS"]])

# CPC 낮은 순 (오름차순) — 클릭 효율 좋은 캠페인 찾기
cpc_ranking = df.sort_values(by="CPC", ascending=True)
print(cpc_ranking[["캠페인명", "클릭수", "CPC"]])
캠페인명 광고비 매출액 ROAS
리텐션_VIP 450,000 4,900,000 10.89
리타겟팅_장바구니 850,000 6,120,000 7.20
신규유저_봄할인 1,200,000 3,840,000 3.20
신규유저_앱설치 1,750,000 4,320,000 2.47
브랜드인지_여름 2,300,000 2,670,000 1.16
📊 마케터 인사이트: 리텐션_VIP 캠페인의 ROAS가 10.89로 압도적! 예산이 가장 적은데 성과가 가장 좋으니 → 예산을 더 늘려볼 것.

여러 기준으로 동시에 정렬

python — 복수 기준 정렬
 
# 채널별로 묶은 다음, 각 채널 안에서 ROAS 높은 순
channel_report = df.sort_values(
    by=["채널", "ROAS"],
    ascending=[True, False]  # 채널: 가나다순, ROAS: 내림차순
)
print(channel_report[["채널", "캠페인명", "ROAS", "전환율"]])

# 효율 점수 컬럼 직접 만들어서 정렬
df["효율점수"] = (df["ROAS"] * df["전환율"]).round(2)
best = df.sort_values(by="효율점수", ascending=False)
print(best[["캠페인명", "ROAS", "전환율", "효율점수"]])

ascending에도 기준 개수만큼 True/False를 넣어야 한다. 기준이 2개면 ascending=[True, False] 처럼 2개를 넣는다.

4. 데이터 필터링 — Boolean Indexing vs query()

필터링은 조건을 만족하는 행만 골라내는 것. 엑셀의 자동필터와 같은 개념이다. 2가지 방법이 있다.

필터링 2가지 방법 비교

▲ Boolean Indexing vs query() — 같은 결과, 다른 가독성

python — 필터링 기본
 
# Boolean Indexing 방식
high_roas = df[ df["ROAS"] >= 3 ]

# AND 조건 — 각 조건을 괄호로, & 사용 (and 아님!)
good = df[ (df["ROAS"] >= 3) & (df["클릭수"] >= 2000) ]

# OR 조건 — | 사용 (or 아님!)
notable = df[ (df["ROAS"] >= 5) | (df["전환수"] >= 150) ]

# query() 방식 — 훨씬 읽기 쉬움
result = df.query("ROAS >= 3 and 클릭수 >= 2000")

# 변수를 query 안에서 사용 — @ 기호 사용
target_roas = 3.0
high = df.query("ROAS >= @target_roas")
⚠️

Pandas에서는 and, or 사용 불가! Boolean Indexing에서는 반드시 &(AND), |(OR), ~(NOT) 사용. 그리고 각 조건을 반드시 괄호로 감싸야 한다.

5. 특수 필터링 — isin() / str.contains() / between()

특수 필터링 메서드

▲ isin() / str.contains() / between() — 문자열과 범위 필터링

python — 특수 필터링
 
# isin(): 특정 값들 중 하나라도 포함되면 True
perf_ch = df[ df["채널"].isin(["Meta", "Google"]) ]

# ~(NOT): 카카오 제외
no_kakao = df[ ~df["채널"].isin(["카카오"]) ]

# str.contains(): 캠페인명에 특정 단어 포함 여부
acq = df[ df["캠페인명"].str.contains("신규유저") ]

# | 로 OR 조건: "신규유저" 또는 "리타겟팅" 포함
multi = df[ df["캠페인명"].str.contains("신규유저|리타겟팅") ]

# between(): 광고비 50만 ~ 150만 사이
mid = df[ df["광고비"].between(500000, 1500000) ]

# ROAS 2.0 ~ 5.0 사이 — 개선 여지 있는 캠페인
mid_roas = df[ df["ROAS"].between(2.0, 5.0) ]

6. 정렬 + 필터링 결합 — 실무 패턴

실무에서는 필터링으로 범위를 좁힌 다음 정렬하는 방식을 가장 많이 쓴다. 순서: df[조건].sort_values(...)

python — 실무 패턴: 주간 리포트 자동화
 
# Google 채널만 → ROAS 높은 순 → 상위 3개
google_top3 = (
    df[ df["채널"] == "Google" ]          # ① 필터링
    .sort_values(by="ROAS", ascending=False)  # ② 정렬
    .head(3)                                   # ③ 상위 3개
)
print("Google Top 3 (ROAS 기준)")
print(google_top3[["캠페인명", "광고비", "ROAS", "전환율"]])

# 클릭은 많은데 전환 안 되는 캠페인 → 랜딩페이지 개선 대상
lp_fix = (
    df[
        (df["클릭수"] >= df["클릭수"].median()) &  # 클릭 많음
        (df["전환율"] <  df["전환율"].mean())    # 전환율 낮음
    ]
    .sort_values(by="전환율", ascending=True)
)
print("랜딩페이지 개선 우선순위:")
print(lp_fix[["캠페인명", "클릭수", "전환율", "ROAS"]])
📊 마케터 인사이트: "클릭은 많은데 전환이 안 되는 캠페인"은 광고 소재가 아니라 랜딩페이지 문제일 가능성이 높다. A/B 테스트 우선순위 리스트로 활용할 수 있다.

7. 통계 함수 — mean vs median 차이

필터링에 평균(mean)과 중앙값(median)을 기준으로 쓰는 경우가 많다. 이 둘의 차이를 정확히 알아야 한다.

함수 의미 특징 사용 예
mean() 평균 이상치에 민감 일반적인 성과 평균
median() 중앙값 이상치에 강함 ✅ 이상치 있을 때 기준
std() 표준편차 데이터 분산 정도 성과 편차 확인
sum() 합계 전체 총합 총 광고비, 총 매출
min() / max() 최솟값/최댓값 범위 확인 최소·최대 ROAS
💡

mean vs median 실전 팁: 데이터에 이상치(너무 크거나 작은 값)가 섞여 있다면 mean()보다 median()이 더 정확한 '보통'의 기준이 된다. 월급 데이터에 억대 연봉이 1명 섞이면 평균은 실제보다 훨씬 높게 잡힌다.

8. 치트시트 & 오늘의 핵심

Pandas 치트시트

▲ 정렬 + 필터링 핵심 패턴 한눈에 — 실무에서 바로 쓰는 코드

🌿 오늘의 핵심 3가지

  • 정렬은 sort_values(by="열이름", ascending=True/False) — 복수 기준은 리스트로, ascending도 리스트로.
  • 필터링은 df[조건] 또는 df.query("조건") — Pandas에서 and→&, or→|, not→~. 각 조건은 괄호로 감싸야!
  • 결합 패턴: df[조건].sort_values(...).head(N) — 필터링 → 정렬 → 상위 N개. 실무에서 가장 많이 쓰는 흐름.
  • 문자열 필터링: isin() (리스트 포함 여부) / str.contains() (단어 포함) / between() (범위)
  • 이상치 있는 데이터의 기준값은 mean 대신 median을 쓰는 게 더 정확하다.