티스토리 뷰
스타벅스 데이터 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 생성
오늘의 좋은 일)

'내일배움캠프 데이터 분석' 카테고리의 다른 글
| 61일차) 내일배움캠프 데이터 분석 TIL - 실전 프로젝트(5) (0) | 2026.03.24 |
|---|---|
| 60일차) 내일배움캠프 데이터 분석 TIL - 실전 프로젝트(4) (0) | 2026.03.23 |
| 58일차) 내일배움캠프 데이터 분석 TIL - Tabpy, 실전 프로젝트(2) (0) | 2026.03.19 |
| 57일차) 내일배움캠프 데이터 분석 TIL - Tableau(5), AI 활용 텍스트 데이터 분석(5) (0) | 2026.03.18 |
| 56일차) 내일배움캠프 데이터 분석 TIL - Tableau(4), AI 활용 텍스트 데이터 분석(4) (0) | 2026.03.17 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 중학생코딩
- Til
- Python
- github
- 머신러닝
- 텍스트분석
- SQL
- 태블로
- 통계
- Tableau
- 코드카타
- 프로그래밍입문
- 판다스
- 데이터시각화
- 구글코랩
- 내일배움캠프
- git
- 비전공자코딩
- 코딩기초
- 데이터분석
- 코딩처음
- 파이썬
- 데이터분석입문
- GoogleColab
- 파이썬입문
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함
