대리점 데이터의 특징
- 사람의 손을 타므로, 실수나 누락 등 오류가 많이 포함됨
- > 지저분한 뎅터를 처리하는 경험을 쌓자!
고객의 소리
: 고객정보를 엑셀로 관리
: 대리점 매출은 안정적인 상황
전제조건
: 상품 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()][["고객이름", "등록일"]]
'데이터 분석' 카테고리의 다른 글
비전공생 SQLD 일주일 합격 후기 feat) 요약자료 및 준비방법 (0) | 2023.12.29 |
---|---|
A/B test란? - 기초부터 간단한 예제까지 (0) | 2023.11.19 |
[미니 프로젝트] Yammer case 분석2. 검색기능 문제 (0) | 2023.08.21 |