본문 바로가기
Analysis/Example

대리점 데이터 분석

by 5ole 2021. 1. 29.

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')

데이터의 정합성 문제 - item_name, item_price, 등록일

 

데이터에 나타나는 입력 오류, 표기 방법의 차이가 부정합을 일으킴

  • 등록일에서 보이는 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)

상품별 월별 구매수 : aggfunc='size'

 

  • 상품별 월별 매출액
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()]

집계기간동안 구매하지 않은 등록자

 

+ 참고 자료 및 출처

댓글