티스토리 뷰

스타벅스 데이터 EDA 및 전처리 진행 내용 정리

1. 데이터 로드 및 구조 확인

분석에 사용한 데이터는 총 4개 테이블이다.

  • transcript : 고객 행동 로그 데이터
  • portfolio : 오퍼(혜택/프로모션) 정보 데이터
  • profile : 고객 프로필 데이터
  • menu : 메뉴 영양정보 데이터

각 테이블에 대해 먼저 아래를 확인했다.

  • 데이터 크기(shape)
  • 컬럼명 및 데이터 타입(info)
  • 상위 몇 개 행(head)
  • 기초통계량(describe)
  • 컬럼별 고유값 개수(nunique)

이를 통해 각 테이블의 역할과 주요 컬럼 의미를 파악했다.


2. 불필요한 인덱스 컬럼 제거

원본 csv에 포함되어 있던 Unnamed: 0 컬럼은 실제 분석에 필요하지 않은 인덱스 컬럼이므로
모든 테이블에서 제거했다.

처리 대상:

  • df_transcript
  • df_portfolio
  • df_profile
  • df_menu

3. 컬럼 의미 파악

각 테이블의 주요 컬럼 의미를 정리했다.

transcript

고객 행동 로그 테이블

  • person : 고객 ID
  • event : 고객 행동 종류
  • value : 행동 상세 정보
  • time : 행동 발생 시점

portfolio

오퍼 정보 테이블

  • reward : 보상 금액
  • channels : 오퍼 전달 채널
  • difficulty : 오퍼 달성 조건
  • duration : 오퍼 유효 기간
  • offer_type : 오퍼 유형
  • id : 오퍼 ID

profile

고객 정보 테이블

  • gender : 성별
  • age : 나이
  • id : 고객 ID
  • became_member_on : 회원 가입일
  • income : 소득

menu

메뉴 정보 테이블

  • 제품명, 제품코드, 칼로리, 당류, 카페인 등 영양정보 포함

4. 고유값 확인을 통한 데이터 구조 이해

컬럼별 고유값 개수를 확인해 데이터 구조를 파악했다.

transcript

  • person : 17,000개
  • event : 4개
  • value : 5,121개
  • time : 120개

해석:

  • 약 17,000명의 고객 행동 로그가 존재
  • 이벤트 종류는 4개
  • value 컬럼은 다양한 상세 정보가 들어 있어 추후 평탄화 필요 가능성 확인

profile

  • gender 고유값 확인 결과: F, M, O, 결측치
  • 고객 ID 컬럼은 기본키 역할로 해석 가능

menu

  • 제품코드는 195행인데 고유값은 187개로 확인되어 중복 가능성 발견

5. 중복 데이터 확인 및 처리

5-1. transcript 중복 확인

전체 행 기준 중복을 확인한 결과,

  • 397건의 완전 중복 행이 존재했다.

중복 샘플을 직접 확인한 결과,

  • person
  • event
  • value
  • time

이 모두 동일한 행이 2번 이상 반복되는 경우가 있었다.

해석:

  • 실제로 다른 행동이라기보다 동일 로그가 중복 적재된 것으로 판단

처리:

  • drop_duplicates()를 사용해 완전 중복 제거
  • 결과: 306,534건 → 306,137건
  • 총 397건 제거

5-2. menu 중복 확인

전체 행 기준 중복을 확인한 결과,

  • 8건의 완전 중복 행이 존재했다.

중복 행을 확인한 결과,

  • 제품코드와 영양정보가 완전히 동일한 행이 2개씩 반복되어 있었다.

해석:

  • 메뉴 기준정보가 중복 적재된 것으로 판단

처리:

  • drop_duplicates()로 제거
  • 결과: 195건 → 187건
  • 총 8건 제거

6. 결측치 확인

transcript

  • 결측치 확인 진행

portfolio

  • 결측치 확인 진행

profile

결측치 확인 결과,

  • gender : 2,175건 결측
  • income : 2,175건 결측

추가 확인 결과,

  • gender와 income 결측 2,175건은 모두 동일한 행에서 동시에 발생했다.

해석:

  • 일부 고객은 프로필 정보 자체가 누락된 것으로 판단

처리 방향:

  • 해당 행들을 삭제하지 않고 유지
  • 소득 결측 여부를 관리하기 위해 income_missing 파생 컬럼 생성

추가 처리:

  • gender 결측치는 Other(O)와 구분하기 위해 Unknown으로 대체

즉, 성별 값은 최종적으로 다음 범주로 관리:

  • F
  • M
  • O
  • Unknown

menu

  • 결측치 확인 진행

7. 데이터 타입 변환

transcript

  • event 컬럼은 문자열이지만 실제로는 행동 유형을 나타내는 범주형 변수이므로 category 타입으로 변환

portfolio

  • offer_type 컬럼은 bogo, discount, informational 세 가지 유형으로 구성되어 있어 category 타입으로 변환
  • channels 컬럼은 단일 값이 아니라 채널 조합 리스트 형태 문자열이라 단순 범주형 변환은 보류
  • 향후 채널별 파생 컬럼 생성 필요성 확인

profile

  • became_member_on 컬럼은 20170212 같은 int 형식 날짜였기 때문에 datetime 타입으로 변환
  • gender 컬럼은 범주형(category)으로 변환

8. 이상치 확인 및 처리

age 컬럼 이상치 탐색

기초통계량 확인 결과,

  • age의 최댓값이 118로 확인되었다.

박스플롯(Box Plot)으로 시각화해본 결과,

  • 118 값이 이상치처럼 두드러지게 나타남

추가 확인 결과,

  • age == 118인 행 수는 2,175건
  • 이 수치는 앞서 gender, income 결측 행 수와 동일
  • 해당 행들의 income도 모두 결측

해석:

  • 실제 118세 고객이라기보다 고객 정보 미입력/누락을 나타내는 대체값일 가능성이 높다고 판단

처리:

  • age == 118을 결측치(NaN)로 변환
  • 별도 관리용 파생 변수 age_missing 생성

현재까지 전처리 결과 요약

완료한 작업

  • 원본 데이터 4개 테이블 로드 및 구조 확인
  • 불필요한 인덱스 컬럼 제거
  • 기초통계량 및 고유값 확인
  • transcript 중복 397건 제거
  • menu 중복 8건 제거
  • profile의 gender, income 결측 구조 확인
  • income_missing 파생 컬럼 생성
  • gender 결측을 Unknown으로 처리
  • event, offer_type, gender 범주형 변환
  • became_member_on 날짜형 변환
  • age == 118을 결측으로 처리하고 age_missing 생성

오늘의 좋은 일)

사전합격나이쓰~

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함