데이터분석 6기/본캠프

2025-04-21 심화 프로젝트 EDA 2

seyeon1130 2025. 4. 21. 21:02

이상치 처리

 

우선 이 데이터셋은 가격, 나이 이런 컬럼들은 이상치로 판별하면 안된다.

따라서 우리팀의 기준을 만들어서 배송비와 시간 컬럼들을 이상치로 판별하고 삭제하기로 했다.

 

[이상치 탐지]

  • 배송비가 결제금액보다 더 크거나 같은 경
  • 이상치 처리 배송시작 전에 배송 완료된 경우
  • 결제 요청 전에 승인 된 경우 (이상치 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)