* 데이터는 교육 받으면서 사측에서 제공 받았습니다
데이터 전처리는 고민을,, 많이 해야하는 부분🧐
파생변수 생성
1. 구매 개수 변수 생성
df['개수'] = .transform('size')df.groupby(['고객ID', '주문/판매 ID', '주문일자', '상품코드', '배송일자', '가격'])['고객ID']
고객이 같은 상품을 한번에 여러개 구매 하진 않았을까 해서 구매 개수 변수를 생성해보았지만, 모두 다 개수가 1개였다.
2. 매출 변수 생성
df['매출'] = df['개수'] * df['가격']
개수가 다 1개임을 알아버려서 의미가 없긴 했지만..! 상품의 가격과 매출을 엄연히 다른 정보니까, 가격*개수 값이 가격과 같아도 매출이라도 따로 명명해줬다
주문일자에 대한 정보는 년-월-시각 다 따로보기 위해 주문일자를 다 쪼개서 파생변수를 만들어줬다.
3. 주문 시각 변수 생성
df['주문_시각'] = df['주문일자'].str[8:10]
df['주문_시각'] = df['주문_시각'].astype(int)
4. 주문 년도 변수 생성
df['주문일자'] = pd.to_datetime(df['주문일자'], format='%d%b%y:%H:%M:%S')
df['주문_년도'] = df['주문일자'].dt.strftime('%Y')
원래 주문일자가 07JAN20:19:01:45 이런식으로 생겼기 때문에, datetime으로 변환을 먼저 해주고
strftime 함수를 사용해서 년도만 추출해 다시 문자열로 받아왔다. (참고 : https://dev-jy.tistory.com/5)
5. 주문 월 변수 생성
df['주문일자'] = pd.to_datetime(df['주문일자'], format='%d%b%y:%H:%M:%S')
df['주문_월'] = df['주문일자'].dt.strftime('%Y-%m')
주문 년도와 마찬가지
6. 주문 요일 변수 생성
# 주문일시에서 요일 추출하여 새로운 변수 생성 (0: 월요일, 1: 화요일, ..., 6: 일요일)
df['주문요일'] = df['주문일자'].dt.dayofweek
# 요일을 실제 요일명으로 변환
df['주문요일'] = df['주문요일'].map({0: '월요일', 1: '화요일', 2: '수요일', 3: '목요일', 4: '금요일', 5: '토요일', 6: '일요일'})
dayofweek 함수를 통해서 각 날짜를 요일에 맞게 숫자로 변환해주고, 숫자를 다시 요일명으로 변환해줌
7. 배송 기간 변수 생성
df['배송일자'] = pd.to_datetime(df['배송일자'], format='%d%b%Y:%H:%M:%S')
df['배송기간'] = abs(df['배송일자'] - df['주문일자']) # 0 days 08:16:15
df['배송기간'] = df['배송기간'].astype(str).apply(lambda x: x[:9]) # 0 days 08
자고로 이커머스란 배달도 매우 중요(ex. 로켓배송) 하기 때문에 주문일자에서 배송일자까지 얼마나 걸렸는지 보기 위해 배송 기간이란 변수를 생성해줬다
8. 연령대 변수 생성
def temp(t):
if t < 20:
return '미성년자'
elif t < 30:
return '20대'
elif t < 40:
return '30대'
elif t < 50:
return '40대'
elif t < 60:
return '50대'
else:
return '60대'
df['연령대'] = df['나이'].apply(temp)
9. 가구 형태 변수 생성
def temp(t):
if t == 0:
return '1인 가구'
elif t == 1:
return '2인 가구'
elif t == 2:
return '3인 가구'
else:
return '4인 가구'
df['가구형태'] = df['가족 인원수'].apply(temp)
가족 인원수는 사실 그대로 가져갔어도 됐지만, 가족 인원수 0명보다는 1인 가구가 더 나을 거 같다 생각해 따로 만들어줬다.
이렇게 파생 변수 생성 끝
중복행 처리
중복행 없음 확인
결측치 처리
역시 없음을 다시 확인
이상치 처리
이상치가 참말로,,, 주관과의 싸움같다
숫자형 변수를 가지고 박스 플랏을 그려봄
숫자형이기 때문에 다 그려졌지만, 나이랑 가족인원수, 개수, 주문 시각은 사실상 이상치가 없는 변수들이고
매출만 보면 되는디 (아 개수가 한개라 좀 이상해졌지만 가격 * 개수 이므로 매출만 보겠습니다) 이상치 처리를 안해주기로 판단했다.
IQR 방식으로 따지면 이상치겠지만 일단, IQR 방식으로 날리면 데이터 손실이 너무 많고 저렇게 연속적으로 따닥따닥 있는 것을 이상치로 볼 수 없다고 판단함
따라서 이상치 처리도 안해줬습니다
이렇게 데이터 전처리가 끝났고, 파생 변수등 많은 처리를 해줬기 때문에 다시 한번 더 데이터 정보를 봐보겠습니다.
다음으로는 판매 데이터 분석 커밍쑨