본문 바로가기

데이터 분석

[DB분석 실무 테크닉 100] ch2. 대리점 데이터를 가공하는 테크닉10

대리점 데이터의 특징

- 사람의 손을 타므로, 실수나 누락 등 오류가 많이 포함됨

- > 지저분한 뎅터를 처리하는 경험을 쌓자!

 

고객의 소리

: 고객정보를 엑셀로 관리

: 대리점 매출은 안정적인 상황

 

전제조건

: 상품 A-Z까지 26개의 상품을 취급

: 매출이력과 고객 정보는 시스템에 직접 입력

: 상품 단가 변동은 없으며 매출 이력은 csv파일로 저장됨

: 고객정보는 대리점 관리가 주별로 집계하여 관리

 

no 파일 이름 개요
1 uriage.csv 매출이력
기간 : 2019.01~2019.07
2 kokyaku_daicho.xlsx 대리점에서 관리하는 정보

테크닉 11. 데이터를 읽어들이자

import pandas as pd
uriage_data= pd.read_csv("/content/drive/MyDrive/파이썬 실무테크닉100/2장. 대리점 데이터를 가공하는 테크닉/uriage.csv")
uriage_data.head()

customer= pd.read_excel("/content/drive/MyDrive/파이썬 실무테크닉100/2장. 대리점 데이터를 가공하는 테크닉/kokyaku_daicho.xlsx")
customer.head()

=>데이터 정합성에 문제가 있는 모습


테크닉12. 데이터의 오류를 살펴보자

=> 공백 간격이 안맞음

=> A, a 등이 혼합 사용됨

 

 

=> 결측치 NaN 확인


테크닉13. 데이터의 오류가 있는 상태로 집계해보자

=> 데이터 오류가 어느정도로 집계에 영향을 미치는지 확인

 

상품별 월 매출 합계

# 날짜 데이터로 변환
uriage_data["purchase_date"]= pd.to_datetime(uriage_data["purchase_date"])

#날짜 형식을 맞춘 문자열로 변환
uriage_data["purchase_month"]= uriage_data["purchase_date"].dt.strftime('%y%m')

#행이 purchase_mont, 열이 item_name인 pivot_table 작성
res= uriage_data.pivot_table(index="purchase_month", columns="item_name", aggfunc="size", fill_value=0)
res

=> 상품 S와 상품s가 따로 집계됨

=> 또한 데이터가 7x99개가 나옴

=> 상품 데이터는 26개인디?

 

 

res= uriage_data.pivot_table(index="purchase_month", columns="item_name", aggfunc="sum", values="item_price", fill_value=0)
res


테크닉14. 상품명 오류를 수정하자

=> 공백 오류 수정

 

>> 초기 고유 상품명의 개수

 

>>공백오류 제거

uriage_data['item_name']= uriage_data['item_name'].str.upper() #모두 대문자로 바꿈
uriage_data["item_name"]= uriage_data["item_name"].str.replace(" ", "") #공백제거
uriage_data["item_name"]= uriage_data["item_name"].str.replace("  ", "") #공백제거
uriage_data.sort_values(by="item_name" , ascending=True)

 

>>결과 검증


 

테크닉15. 금액의 결측치를 수정하자

 

>결측치 확인

>> 결손치 수정

flg_isnull=uriage_data["item_price"].isnull() #비트 마킹

# 결손치가 있는 행의 item_name을 넣어줌
for trg in list(uriage_data.loc[flg_isnull, "item_name"].unique()):
  
  #price <- 결손치가 없는 행의 가격을 받아줌
  price= uriage_data.loc[(~flg_isnull) & (uriage_data["item_name"]==trg), "item_price"].max()
  
  #결손치가 있었던 행들을 채워줌
  uriage_data["item_price"].loc[(flg_isnull) & (uriage_data["item_name"]==trg)]=price

uriage_data.head()

 

>>결과 검증

for trg in list(uriage_data["item_name"].sort_values().unique()):
  print("{}의 최고가 : {} {}의 최저가 : {} ".format(trg,\
        uriage_data.loc[uriage_data["item_name"]==trg]["item_price"].max(), trg, \
        uriage_data.loc[uriage_data["item_name"]==trg]["item_price"].min(skipna=False)))

=> 모두 일치하는 모습

 

 


테크닉16. 고객 이름의 오류를 수정하자

=> 공백 제거

 

>>데이터 확인

=> 공백제거가 필요함

 


 

테크닉17 . 날짜오류를 수정하자

-> 등록일 오류를 수정해보자

 

>>데이터 확인

: 서식이 다른 데이터가 섞여있음

 

=> 날짜를 동일한 포맷으로 통일할 필요가 있음!

 

>>숫자로 읽히는 데이터 확인

 

>>숫자를 날짜로 수정

fromSerial = pd.to_timedelta(customer.loc[flg_is_serial,"등록일"].astype("float"), unit="D")+pd.to_datetime("1900/01/01")
fromSerial

=> pd.to_timedelta를 통해 날짜로 변경됨

 

>> 날짜로 변환된 데이터도 서식을 통일

 

>>변경된 데이터 통합

=> 등록일이 깨끗히 수정된 모습

 

>> 등록월을 추출하여 분석

=> 등록연월별 고객 수 집계

 

>>숫자로 읽히는 데이터가 있는 지 확인


테크닉18. 고객 이름을 키로 두개의 데이터를 결합하자

customer uriage_data

우리가 할 것 -  uriage_data left join customer on ="고객이름"

 

#고객 이름 기준으로 결합
join_data= pd.merge(uriage_data, customer, left_on="customer_name", right_on="고객이름", how="left")
join_data =join_data.drop("customer_name", axis=1)
join_data

 


테크닉19. 정제한 데이터를 덤프하자

: 파일로 덤프해두면 다시 정제를 할 필요가 없음

 

>칼럼의 배치 조정

- purchase_date와 purchase_month를 가까이 두는 편이 분석하기 쉬움

 

>>csv 덤프

dump_data.to_csv("dump_data.csv", index=False)

테크닉20. 데이터를 집계하자

 

>덤프 파일 읽기

import_data= pd.read_csv("dump_data.csv")
import_data

 

>>purchase_month를 세로축 /상품별로 집계

byitem= import_data.pivot_table(index="purchase_month", columns="item_name", aggfunc="size", fill_value=0)
byitem

 

>>purchase_month를 세로축 / 매출금액, 고객, 지역을 집계

#구입연월, 상품별 매출액
byPrice= import_data.pivot_table(index="purchase_month", columns="item_name", values="item_price", aggfunc="sum", fill_value=0)
byPrice

 

#구입연월, 고객별 판매수
byCustomer= import_data.pivot_table(index="purchase_month", columns="고객이름", aggfunc="size", fill_value=0)
byCustomer

#구입연월, 지역별 판매수
byRegion= import_data.pivot_table(index="purchase_month", columns="지역", aggfunc="size", fill_value=0)
byRegion

 

>>구매이력이 없는 사용자

#구매이력이 없는 사용자
away_data= pd.merge(uriage_data, customer, left_on="customer_name", right_on="고객이름", how="right")
away_data.loc[away_data["purchase_date"].isnull()][["고객이름", "등록일"]]