데이터 전처리 및 시각화

GroupBy 결합, apply/map 사용

myun0506 2026. 1. 20. 22:09

[ 전처리 시각화 세션 3-1 ]

- 1차 정제 (문자열/결측/타입 통일)

  • 날짜 → datetime 변환 + 파생피처 만들기

  • 메뉴 문자열 정리 (strip + 표기 통일)

  • price 정리 ("4,500원" → 4500)

  • qty 정리 (결측 처리 + 숫자형)

  • paid 정리 (TRUE/False/True 혼합 → bool)

  • 매출 컬럼 만들기 (paid가 True일 때만 매출 인정)

 

- GroupBy 기초 (단일 기준 집계)

  • 매장별 총 매출 / 주문수/ 결제 성공률
    • df.groupby("store") : 데이터를 store(매장)별로 묶고
    • .agg(...) : 각 매장 그룹에 대해 요약값(집계)을 계산함
    • .reset_index() : store가 인덱스로 올라가 있는 걸 다시 일반 컬럼으로 내려서 보기 좋게 만듦
    • paid_rate : True=1, False=0처럼 동작해서 mean() 처리하면 '결제 성공 비율'이 됨

  • 피벗 형태로 바꾸기(리포트용): unstack/pivot

 

- 데이터 결합 (merge / join / concat 차이 체감)

  • 카테고리 매핑 테이블 만들기

  • merge로 결합 (키 기반 결합)
    • how="left" : 원본(df)의 행은 유지하면서, 매칭되는 카테고리를 붙임
    • 만약 메뉴가 매핑표에 없으면 category가 NaN으로 남음(현업에서 "매핑 누락" 탐지 포인트)

 

- apply / map (언제 쓰는가)

  • map(딕셔너리 매핑): 채널 한글화 같은 "치환 작업"

  • apply : 행 단위 규칙이 필요할 때 (벡터화보다 느릴 수 있음)

 

 

- 종합 실습 (오늘의 목표: 요약 테이블 2개 만들기)

  • 요약 테이블 A: "월별 요일 매출 피벗 + 결제율"

  • 요약 테이블 B : "메뉴별(카테고리 포함) 매출/수량 TOP"

 

 

- 저장 & 재현성(검증 로드까지)

  • 저장
  • 다시 로드해서 확인 ("내가 저장한게 맞는지")

 

 

- GroupBy(그룹화) 이론

  • 메뉴별 매출 합계 / 매장별 주문 수 / 월별 결제 성공률

  • 집계 함수(aggregation) 핵심 5종
    • sum
    • mean
    • count
    • nunique: 고유값 개수 ex) 고유 고객 수, 고유 메뉴 수
    • min / max
    • paid가 True/False일 때, mean(paid)는 성공률처럼 해석될 수 있음
  • 단일 기준 vs 다중 기준 (리포트가 달라짐)
    • 단일 기준 그룹화
      • 기준: menu 하나만
      • 결과: "메뉴별 매출 TOP"처럼 단순하고 직관적인 표
    • 다중 기준 그룹화
      • 기준: ym(월) + day_name(요일)처럼 2개 이상
      • 결과: "월별-요일별 매출 패턴" 같은 리포트형 분석이 가능
      • ex) 1월은 월요일이 강하고, 금요일은 약하다와 같은 패턴

 

- 피벗(표 형태 변환) 이론: "리포트용 표 만들기"

  • pivot
    • 행/열/값을 지정해서 피벗 표를 만듦
    • 가독성 good

  • unstack
    • GroupBy 결과가 MultiIndex 일 때
    • 한 인덱스 레벨을 열로 펼친다는 느낌
    • pivot보다 조금 더 GroupBy 결과를 다루는 방식에 가까움

 

- 문자열 처리 이론(실무형) 확장

  • 왜 문자열 처리가 필수인가?
    • 같은 값인데 다르게 저장됨(표기 흔들림)
    • 숫자가 문자열로 섞여 들어옴(단위/쉼표/통화 기호)
    • 문자열 정리를 안 하면 생기는 문제
      • 메뉴별 매출 TOP이 잘못 나옴
      • 가격 합계가 안되거나(문자열이라) 일부만 변환돼 왜곡됨
  • 포함 여부 필터: contains

  • 치환: replace

 

- 시간 데이터 처리 이론

  • 왜 날짜 처리가 중요한가?
    • 리포트는 거의 항상 "시간축"이 들어감
    • 월별 매출, 주간 매출, 요일별 패턴,시간대별 피크 같은 분석은 전부 '시간'이 기준임
    • 정렬이 이상해짐(문자열 정렬 문제)
      • 문자열은 "시간 순서"가 아니라 "글자 순서(사전순)"로 정렬될 수 있음
      • 특히 dd/mm/yyyy 같은 형식은 시간 순서와 사전순이 잘 맞지 않아 더 문제가 잦음
    • 파생 피처를 못 만듦(월/요일/주차 등)
      • 월별/요일별 분석을 하려면 month, day_name 같은 파생 컬럼이 필요함
      • 날짜가 문자열이면 .dt(datetime 전용 기능)를 쓸 수 없어서 파생 피처 생성이 막힘
    • 기간 필터링이 어려움
      • "2026-01만 보기", "특정 기간만 자르기" 같은 작업이 날짜 계산 기반이라
      • 문자열 상태로는 실수(경계값, 포함/제외)가 늘어남

  • "datetime으로 바꾸고 파생 피처 만든다

 

- 데이터 결합(merge/join/concat)

  • merge = "키로 붙이는 조인"
    • how 옵션
      • left
      • inner
      • outer
    • 매핑표 붙일 때는 보통 left로 붙인 뒤,
      • category가 NaN인 행을 찾아서 "매핑 누락"을 수정함
      • indicator=True는 병합 결과에 행 출처를 표시해주는 홉션

  • concat
    • 위아래로 쌓아서(누적) 데이터 양을 늘릴 때 씀

 

- apply vs map

  • map: 값 치환/매핑에 특화(간단 + 빠름)
    • 실수 포인트
      • 매핑표에 없는 값은 결과가 NaN이 됨
      • 누락이 있을 수 있으니 확인하는 습관 필요

  • apply: 행 단위 규칙이 필요할 때
    • apply는 편하지만 느릴 수 있음
    • apply는 "파이썬 함수로 한 행씩 처리"하는 경우가 ㅁ낳아서 데이터가 커지면 느려질 수 있음

  • apply 대신 벡터화로 등급 만들기 (빠르고 깔끔)