[TIL] transaction 가격 전처리 (2024-07-29)

SHU·2024년 7월 30일
0

H&M 데이터 분석

목록 보기
5/8

task

transaction data의 price가 아래와 같이 상품가격이라고 보기 어려운 단위로 제공됨
→ 온/오프라인 거래 비교, 온라인 쇼핑몰 구매 특성 분석이라는 분석 목적을 위해서는 가격을 사용할 필요가 있다고 판단.
→ 영문 데이터인 점 등을 고려하여 가격 단위를 달러로 맞추기로 결정

과정

조정 방법 설정

  • 현 데이터의 경우 최소값과 최대값이 34900배 차이.
    • 실제 H&M에서 최소값인 상품과 최대값인 상품의 가격 차는 100단위로, 34900은 실질적으로 발생할 수 없는 차이라고 판단

→ 단순히 10의 배수를 곱하는 방법은 부적절하다고 보임

  • 데이터 상 가격은 2018~2020 간 거래에서의 상품 가격이지만, 실제로 해당 기간의 상품 가격을 확인할 수 없음
  • 현재로부터 심하게 과거 시점이 아니며, H&M의 가격 변동이 그리 크지 않음

→ 현재 H&M 웹사이트의 가격을 참고하여 가격을 조정하기로 함

함수 제작

현재 H&M 웹사이트의 가격을 참고하고, 단순 배수가 아닌 가격 간격 조정이 필요하다는 결론
구체적 구현에 어려움을 겪어 튜터님의 조언을 구해 코드를 구상

로직

  1. 기존 상품 데이터의 최소/최댓값과 H&M 웹사이트의 상품들의 최소/최댓값을 구한 뒤,
  2. 원래 범위(상품 데이터 상 범위)에서의 상대적 위치를 계산
  3. 실제 웹사이트 상 최소/최댓값을 이용하여 새로운 가격 산출

코드

def scale_value(value, old_min = o_min, old_max = o_max, new_min = n_min, new_max = n_max):
    
    # 원래 범위에서의 상대적 위치 계산
    scaled_value = (value - old_min) / (old_max - old_min)
    
    # 새로운 범위로 변환
    scaled_value = scaled_value * (new_max - new_min) + new_min
    
    return scaled_value

함수 적용

transaction에 있는 price의 경우, 같은 상품이어도 값이 다른 경우가 다수 존재
→ 여러 국가의 판매가가 섞여 있어 동일 상품의 가장 높은 값을 정가로 간주할 수 없음. 실거래가만 생성

# 신규 데이터프레임 생성
new_hm = hm.copy()

# 실거래가 생성 - 함수 적용
new_hm['actual_price'] = new_hm['price'].apply(lambda x : scale_value(x))

# 소수점 2자리 라운드
new_hm['actual_price'] = new_hm['actual_price'].round(2)

오늘의 기록 - 이거 정말 필요할까?

price 전처리를 두고 가장 많이 했던 말, "이거 정말 필요할까?"
비단 이번 transaction 데이터에서의 price 뿐만 아니라, 다른 모든 데이터 분석을 하면서도 계속 던져야 할 질문이라는 생각이 들었다.
이번 경우 price를 쓸지 말지, 어떻게 쓸지에 대한 정의가 확립되지 않았기 때문에 구체적으로 어떤 전처리를 할지에 대한 논의가 미뤄졌다는 생각이 들었다.
이게 정말 필요한건지, 왜 해야 하는건지에 대한 확신이 없으면 전처리를 할 때도, 분석을 할 때도 어떤 방법을 사용할지마저 혼란이 오게 된다.

profile
슈의 코드뜨개질

0개의 댓글