이상치 처리
우선 이 데이터셋은 가격, 나이 이런 컬럼들은 이상치로 판별하면 안된다.
따라서 우리팀의 기준을 만들어서 배송비와 시간 컬럼들을 이상치로 판별하고 삭제하기로 했다.
[이상치 탐지]
- 배송비가 결제금액보다 더 크거나 같은 경
- 이상치 처리 배송시작 전에 배송 완료된 경우
- 결제 요청 전에 승인 된 경우 (이상치 0건으로 이상치 제거 제외)
- approval_delay_minutes 이 실제로는 0이 아닌데 0으로 나온 경우
- 배송 상태가 canceled 임에도 불구하고 배송 완료 일시가 나와있는 것이 7건 있어 삭제
##이상치 제거
# 1. 배송비가 제품 가격보다 큰 경우
cond1 = df['shipping_charges'] > df['price']
print("배송비 > 제품 가격:", cond1.sum(), "건")
# 2. 승인일이 배송일보다 늦은 경우
cond2 = df['order_approved_at'] > df['order_delivered_timestamp']
print("승인일 > 배송일:", cond2.sum(), "건")
# 3. 구매일이 승인일보다 늦은 경우
cond3 = df['order_purchase_timestamp'] > df['order_approved_at']
print("구매일 > 승인일:", cond3.sum(), "건")
df = df[~(df['shipping_charges'] > df['price'])]
df = df[~(df['order_approved_at']>df['order_delivered_timestamp'])]
df = df[~(df['order_purchase_timestamp']>df['order_approved_at'])]
#지연 승인 이상치 제거
df_tmp =df[(df['approval_delay_minutes']==0)&((df['order_approved_at'] - df['order_purchase_timestamp']).dt.total_seconds() / 60 != 0)]
print(len(df_tmp)) # 딜레이가 0인데 실제로 0이 아닌 것
print((df['approval_delay_minutes']==0).sum()) #딜레이가 0인것
df = df[~(df['approval_delay_minutes']==0)]
#취소된 데이터
df = df[~(df['order_status'] == 'canceled')]
군집을 위한 customer_id 집계
[ 집계함수 써서 컬럼 정리]
- payment_installments: mean
- shipping_charges, volume_cm3, weight_kg : mean
- price : mean
- delivery_delay_days : mean
- category 1, 2 : 최빈값
- review score : 최빈값
- approval_delay_minutes : mean
- payment_type : 최빈값
first로 하나만 가져오는 커럼들
- 'gender'
'country'
'marketing_info_agree'
,'agegroup'
df_customer = df.groupby('customer_id').agg(
payment_installments =('payment_installments','mean'),
shipping_charges =('shipping_charges','mean'),
volume_cm3 =('volume_cm3','mean'),
weight_kg =('weight_kg','mean'),
price = ('price','mean'),
delivery_delay_days = ('delivery_delay_days','mean'),
category1=('category1', lambda x: x.mode().iloc[0]),
category2=('category2', lambda x: x.mode().iloc[0]),
review_score=('review_score', lambda x: x.mode().iloc[0]),
approval_delay_minutes =('approval_delay_minutes','mean'),
gender=('gender','first'),
country = ('country','first'),
marketing_info_agree =('marketing_info_agree','first'),
payment_type = ('payment_type',lambda x: x.mode().iloc[0]),
agegroup =('agegroup','first')).reset_index()
인코딩
- [범주형 변수 인코딩]
1. 원핫인코딩
'country'
‘category 1’
‘category 2’
‘payment_type’
one_hot =['country','category1','category2','payment_type']
df_customer = pd.get_dummies(df_customer, columns=one_hot)
2. 라벨인코딩
'gender'
agegroup
'marketing_info_agree'
label = ['gender','agegroup','marketing_info_agree']
encoder = LabelEncoder()
for col in label:
df_customer[col] = encoder.fit_transform(df_customer[col])
표준화
standard_scaler = StandardScaler()
cols_to_scale= ['payment_installments','shipping_charges','volume_cm3','weight_kg','price','delivery_delay_days','review_score','approval_delay_minutes']
df_standard_scaled = pd.DataFrame(standard_scaler.fit_transform(df_customer[cols_to_scale]), columns=cols_to_scale)
'데이터분석 6기 > 본캠프' 카테고리의 다른 글
2025-04-23 심화프로젝트 3 실험 준비 (1) | 2025.04.23 |
---|---|
2025-04-22 심화 프로젝트 - 군집(PCA, KMeans, DBSCAN) (1) | 2025.04.22 |
2025-04-18 심화 프로젝트 EDA (0) | 2025.04.19 |
2025-04-17 머신러닝 총 정리 (회귀~분류) (0) | 2025.04.17 |
2025-04-16 통계 총 정리 (1) | 2025.04.16 |