1. 전제조건
- 품목 : 상품 A~Z까지 26가지 상품
- 매출 이력, 고객정보 데이터는 직원이 직접 입력 - 오류 발생
- 상품 단가 변동은 없음
2. 데이터 정보
- uriage.csv : 매출 이력 (2019.01 ~ 2019.07)
( purchase_date, item_name, item_price, customer_name )
- kokyaku_daicho.xlsx : 고객 정보
(고객이름, 지역, 등록일)
import os
import pandas as pd
import matplotlib.pyplot as plt
os.chdir('C:\\Users\\leeso\\Downloads\\pyda100-master\\2장')
uriage=pd.read_csv('uriage.csv')
kokyaku=pd.read_excel('kokyaku_daicho.xlsx')
데이터에 나타나는 입력 오류, 표기 방법의 차이가 부정합을 일으킴
- 등록일에서 보이는 datetime 불일치
- item_name 에서 보이는 상품명의 불일치 - 띄어쓰기, 대문자
- item_price 에서 보이는 가격의 nan값
- 고객이름과 customer_name 의 불일치
3. 데이터 준비
(1) 날짜 오류
date_num=kokyaku['등록일'].astype('str').str.isdigit() #숫자로 읽히는 데이터 확인
date_num.sum() #22
correct_date = pd.to_timedelta(kokyaku.loc[date_num,'등록일'].astype("float"), unit="D") + pd.to_datetime("1900/01/01")
correct_date2 = pd.to_datetime(kokyaku.loc[~date_num,'등록일']) #슬래시 구분 서식을 -로 변경
kokyaku['등록일']=pd.concat([correct_date,correct_date2])
kokyaku.dtypes
(2) 상품명과 고객이름 일치시키기
len(pd.unique(uriage['item_name'])) # 99
uriage['item_name'] = uriage['item_name'].str.upper()
uriage['item_name'] = uriage['item_name'].str.replace(' ','')
len(pd.unique(uriage['item_name'])) # 26
kokyaku['고객이름'] = kokyaku['고객이름'].str.replace(' ','')
(3) 가격 NA값 채우기
uriage.isnull().sum()
check_null=uriage['item_price'].isnull()
for check in list(uriage.loc[check_null, "item_name"].unique()) : #결측치가 있는 item_name
price = uriage.loc[(~check_null) & (uriage['item_name']==check),'item_price'].max()
uriage.loc[(check_null) & (uriage['item_name']==check),'item_price'] = price
금액 수정한 결과가 맞는지 확인 ( max값과 min값 비교 )
for check in uriage['item_name'].sort_values().unique():
print(check + '의 max값 : ' + str(uriage.loc[uriage['item_name']==check]['item_price'].max(skipna=False)) +
' | min값 : '+ str(uriage.loc[uriage['item_name']==check]['item_price'].min(skipna=False)))
for check in uriage['item_name'].sort_values().unique(): #True로 결과값 나옴
print(uriage.loc[uriage['item_name']==check]['item_price'].max(skipna=False) == uriage.loc[uriage['item_name']==check]['item_price'].min(skipna=False))
4. 데이터 merge 및 저장
- 구매연월 열 추가
- 열 순서 변경
- csv파일로 정제파일 저장
uriage['purchase_date']=pd.to_datetime(uriage['purchase_date'])
uriage['purchase_month'] = uriage['purchase_date'].dt.strftime('%Y%m')
merge_data = pd.merge(kokyaku, uriage,left_on='고객이름', right_on='customer_name',how='right')
merge_data = merge_data.drop('customer_name',axis=1)
dump_data = merge_data[['purchase_date','purchase_month','item_name','item_price','고객이름','지역','등록일']] #분석 쉽게 데이터 순서 변경
dump_data.to_csv('renew_data.csv',index=False)
5. 데이터 집계
- 상품별 월별 구매수
import_data=pd.read_csv('renew_data.csv')
import_data.pivot_table(index='purchase_month',columns='item_name',aggfunc='count',fill_value=0)
- 상품별 월별 매출액
import_data.pivot_table(index='purchase_month',columns='item_name',values='item_price',aggfunc='sum',fill_value=0)
- 고객별 월별 구매수
import_data.pivot_table(index='purchase_month',columns='고객이름',aggfunc='size',fill_value=0)
- 도시별 연월 구매수
import_data.pivot_table(index='purchase_month',columns='지역',aggfunc='size',fill_value=0)
- 미구매자
non_customer = pd.merge(kokyaku, uriage,left_on='고객이름', right_on='customer_name',how='left')
non_customer.loc[non_customer['purchase_date'].isnull()]
+ 참고 자료 및 출처
- 책 <파이썬 데이터 분석 실무 테크닉 100>
- 데이터 github.com/wikibook/pyda100
'Analysis > Example' 카테고리의 다른 글
물류 데이터 분석 - 데이터 가공, 통계량 파악 (0) | 2021.02.15 |
---|---|
스포츠센터 회원 분석 - 의사결정나무 (0) | 2021.02.07 |
스포츠센터 회원 분석 - 클러스터링, 회귀분석 (0) | 2021.01.30 |
스포츠센터 회원 분석 - 데이터 가공, 통계량 파악 (0) | 2021.01.30 |
간단한 매출 데이터 분석 (2) | 2021.01.28 |
댓글