대리점 데이터를 가공하는 테크닉 10¶
대리점 매출 이력과 고객정보 데이터를 이용해서 데이터 분석과 예측을 하기 위해 중요한 기술인 '데이터 가공'을 배운다.
대리점 데이터는 쇼핑몰 사이트와 다르게 사람의 손을 타게 된다. 날짜 등의 입력 실수나 데이터 누락 등 '오류'가 많이 들어가 있다.
대리점 데이터 이외에도 엑셀로 직접 입력하는 데이터가 있는 경우, 데이터가 점점 지저분해져서 데이터 분석에 바로 활용 불가해진다.
전제조건¶
해당 대리점에서는 A~Z, 총 26개의 상품을 취급한다. 매출 이력과 고객정보 데이터는 담당 사원이 직접 입력한다. 집계 기간에 상품 단가의 변동은 없었고 매출 이력은 시스템에서 CSV 파일로 출력한다. 고객 정보는 대리점에서 관리자가 주별로 집계해서 엑셀로 관리한다.
- uriage.csv - 매출이력, 기간은 2019년 1월 ~ 2019년 7월
- kokyaku_daicho.xlsx - 대리점에서 관리하는 고객 정보
데이터 읽기¶
In [1]:
import pandas as pd
In [2]:
uriage_data = pd.read_csv('/content/drive/MyDrive/파이썬데이터분석실무테크닉100/pyda100/2장/uriage.csv')
uriage_data.head()
Out[2]:
In [58]:
kokyaku_data = pd.read_excel('/content/drive/MyDrive/파이썬데이터분석실무테크닉100/pyda100/2장/kokyaku_daicho.xlsx')
kokyaku_data.head()
Out[58]:
데이터 오류 확인¶
In [4]:
uriage_data['item_name'].head()
Out[4]:
상품명이 띄어쓰기가 포함된 다른 형태의 데이터로 표현되는 것을 알 수 있다. 그리고 영문이 대문자, 소문자가 혼용되기 때문에 집계 시, 다른 데이터로 집계되는 경우가 있어 정확한 결과를 얻을 수 없다.
In [5]:
uriage_data['item_price'].head()
Out[5]:
상품 가격에 NaN이 있는 경우도 있음.
데이터에 오류가 있는 상태로 집계¶
In [6]:
uriage_data['purchase_date'] = pd.to_datetime(uriage_data["purchase_date"])
uriage_data["purchase_month"] = uriage_data["purchase_date"].dt.strftime("%Y%m")
res = uriage_data.pivot_table(index='purchase_month', columns='item_name', aggfunc='size', fill_value=0)
res
Out[6]:
상품 수는 A부터 Z까지 총 26개이다. 그러나 대소문자 사용, 띄어쓰기 불일치로 인해 상품이 99 개로 확인된다.
상품명 오류 수정¶
In [7]:
print(len(pd.unique(uriage_data.item_name)))
In [10]:
uriage_data['item_name']=uriage_data['item_name'].str.upper()
uriage_data['item_name']=uriage_data['item_name'].str.replace(" ",'')
uriage_data.sort_values(by=['item_name'], ascending=True)
Out[10]:
In [12]:
print(len(pd.unique(uriage_data.item_name)))
print(pd.unique(uriage_data['item_name']))
금액의 결측치 수정¶
In [14]:
uriage_data.isnull().any(axis=0)
Out[14]:
item_price에 결측치가 있음을 확인할 수 있다. 단가 변동이 없었기 때문에 결측치 없는 상품의 데이터를 사용해서 결측치를 수정할 수 있다.
In [19]:
flg_is_null = uriage_data['item_price'].isnull()
for trg in list(uriage_data.loc[flg_is_null, "item_name"].unique()):
price = uriage_data.loc[(~flg_is_null)&(uriage_data['item_name']==trg), 'item_price'].max()
uriage_data['item_price'].loc[(flg_is_null)&(uriage_data['item_name']==trg)]=price
In [22]:
pd.unique(uriage_data['item_price'].isnull())
Out[22]:
In [23]:
for trg in list(uriage_data['item_name'].sort_values().unique()):
print(trg+"의 최고가:"+str(uriage_data.loc[uriage_data['item_name']==trg]["item_price"].max())+"의 최저가 : "+str(uriage_data.loc[uriage_data['item_name']==trg]["item_price"].min()))
고객 이름 오류 수정¶
In [59]:
kokyaku_data['고객이름'].head()
Out[59]:
In [60]:
uriage_data['customer_name'].head()
Out[60]:
In [61]:
kokyaku_data["고객이름"]=kokyaku_data["고객이름"].str.replace(" ", "")
In [62]:
kokyaku_data["고객이름"].head()
Out[62]:
날짜 오류 수정¶
In [63]:
flg_is_serial = kokyaku_data["등록일"].astype("str").str.isdigit() # 숫자로 판단되는 데이터들
flg_is_serial.sum()
Out[63]:
In [67]:
fromSerial = pd.to_timedelta(kokyaku_data.loc[flg_is_serial, "등록일"].astype("float")-2, unit="D")+pd.to_datetime("1900/01/01") # 숫자를 날짜로 변환한다.
fromSerial
Out[67]:
In [68]:
fromString = pd.to_datetime(kokyaku_data.loc[~flg_is_serial,'등록일']) # 날짜로 변환된 데이터도 서식 통일해준다.
fromString
Out[68]:
In [69]:
kokyaku_data["등록일"] = pd.concat([fromSerial, fromString])
kokyaku_data
Out[69]:
In [70]:
kokyaku_data["등록연월"] = kokyaku_data["등록일"].dt.strftime("%Y%m")
rslt = kokyaku_data.groupby("등록연월").count()["고객이름"]
print(rslt)
print(len(kokyaku_data))
In [71]:
# 등록일 컬럼에 숫자 데이터 남아있는지 확인하기
flg_is_serial = kokyaku_data['등록일'].astype('str').str.isdigit()
flg_is_serial.sum()
Out[71]:
고객 이름으로 두 데이터 결합하기¶
In [72]:
join_data = pd.merge(uriage_data, kokyaku_data, left_on='customer_name', right_on='고객이름', how='left')
join_data = join_data.drop("customer_name", axis=1) # customer_name 컬럼 삭제
join_data
Out[72]:
정제한 데이터 덤프¶
In [73]:
dump_data = join_data[['purchase_date', 'purchase_month', 'item_name', 'item_price', '고객이름', '지역','등록일']]
dump_data
Out[73]:
In [74]:
dump_data.to_csv("/content/drive/MyDrive/파이썬데이터분석실무테크닉100/pyda100/2장/my_dump_data.csv", index=False)
In [75]:
import_data = pd.read_csv("/content/drive/MyDrive/파이썬데이터분석실무테크닉100/pyda100/2장/my_dump_data.csv")
import_data
Out[75]:
In [76]:
# 월별 상품 판매
byItem = import_data.pivot_table(index="purchase_month", columns='item_name', aggfunc='size', fill_value = 0)
byItem
Out[76]:
In [77]:
byPrice = import_data.pivot_table(index="purchase_month", columns='item_name', values='item_price', aggfunc='sum', fill_value=0)
byPrice
Out[77]:
In [78]:
byCustomer = import_data.pivot_table(index="purchase_month", columns='고객이름', aggfunc='size', fill_value=0)
byCustomer
Out[78]:
In [79]:
byRegion = import_data.pivot_table(index='purchase_month', columns='지역', aggfunc='size', fill_value=0)
byRegion
Out[79]:
In [80]:
# 구매이력 없는 사용자
away_data = pd.merge(uriage_data, kokyaku_data, left_on='customer_name', right_on='고객이름', how='right')
away_data[away_data['purchase_date'].isnull()][['고객이름', '등록일']]
Out[80]:
In [ ]:
'Machine Learning > Statistics' 카테고리의 다른 글
파이썬 데이터분석 실무 테크닉 100 - 6장 (1) | 2021.07.01 |
---|---|
파이썬 데이터분석 실무 테크닉 100 - 5장 (1) | 2021.03.03 |
파이썬 데이터분석 실무 테크닉 100 - 4장 (0) | 2021.01.07 |
파이썬 데이터 분석 실무 테크닉 100 - 3장 (0) | 2020.12.17 |
파이썬 데이터분석 실무 테크닉 100 - 1장 (0) | 2020.11.30 |