앎을 경계하기

Machine Learning/Statistics

파이썬 데이터 분석 실무 테크닉 100 - 2장

양갱맨 2020. 12. 7. 16:04

 

 

 

 

 

 

 

 

 

 

대리점 데이터를 가공하는 테크닉 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]:
  purchase_date item_name item_price customer_name
0 2019-06-13 18:02 상품A 100.0 김가온
1 2019-07-13 13:05 상 품 S NaN 김우찬
2 2019-05-11 19:42 상 품 a NaN 김유찬
3 2019-02-12 23:40 상품Z 2600.0 김재현
4 2019-04-22 3:09 상품a NaN 김강현
In [58]:
kokyaku_data = pd.read_excel('/content/drive/MyDrive/파이썬데이터분석실무테크닉100/pyda100/2장/kokyaku_daicho.xlsx')
kokyaku_data.head()
Out[58]:
  고객이름 지역 등록일
0 김 현성 H시 2018-01-04 00:00:00
1 김 도윤 E시 42782
2 김 지한 A시 2018-01-07 00:00:00
3 김 하윤 F시 42872
4 김 시온 E시 43127
 

데이터 오류 확인

In [4]:
uriage_data['item_name'].head()
Out[4]:
0      상품A
1    상 품 S
2    상 품 a
3      상품Z
4      상품a
Name: item_name, dtype: object
 

상품명이 띄어쓰기가 포함된 다른 형태의 데이터로 표현되는 것을 알 수 있다. 그리고 영문이 대문자, 소문자가 혼용되기 때문에 집계 시, 다른 데이터로 집계되는 경우가 있어 정확한 결과를 얻을 수 없다.

In [5]:
uriage_data['item_price'].head()
Out[5]:
0     100.0
1       NaN
2       NaN
3    2600.0
4       NaN
Name: item_price, dtype: float64
 

상품 가격에 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]:
item_name 상 품 n 상품 E 상품 M 상품 P 상품 S 상품 W 상품 X 상품W 상 품O 상 품Q 상 품T 상 품V 상 품 S 상 품 a 상 품 q 상 품 s 상 품A 상 품C 상 품D 상 품E 상 품F 상 품G 상 품H 상 품I 상 품K 상 품M 상 품N 상 품O 상 품P 상 품T 상 품U 상 품V 상 품X 상 품Y 상 품s 상품 A 상품 B 상품 E 상품 F 상품 H ... 상품D 상품E 상품F 상품G 상품H 상품I 상품J 상품K 상품L 상품M 상품N 상품O 상품P 상품Q 상품R 상품S 상품T 상품U 상품V 상품W 상품X 상품Y 상품Z 상품a 상품c 상품d 상품e 상품g 상품i 상품j 상품k 상품l 상품o 상품p 상품r 상품s 상품t 상품v 상품x 상품y
purchase_month                                                                                                                                                                  
201901 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 2 0 1 0 0 0 0 0 ... 17 18 15 11 15 17 17 19 18 18 15 21 15 17 21 18 16 7 21 13 12 10 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0
201902 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 ... 20 16 14 13 17 11 13 16 11 15 19 18 19 22 21 21 22 19 21 24 14 11 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0
201903 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... 16 8 26 14 18 12 15 14 20 21 13 11 20 23 16 20 12 23 17 16 21 16 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
201904 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 3 0 0 0 0 2 0 ... 20 17 15 13 11 18 13 14 15 11 20 14 15 19 20 15 15 11 14 13 16 17 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0
201905 0 0 0 0 1 0 0 0 0 0 0 0 0 2 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 ... 14 19 17 23 15 16 10 16 12 17 19 18 20 12 22 16 15 16 8 20 16 19 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
201906 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 ... 19 13 18 13 12 18 22 15 15 17 16 14 17 15 16 21 12 17 19 16 14 13 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0
201907 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 ... 17 10 17 19 18 18 23 12 17 11 15 19 26 14 17 22 20 13 26 16 18 12 0 0 0 0 0 0 1 0 0 0 1 0 2 0 0 0 0 0

7 rows × 99 columns

 

상품 수는 A부터 Z까지 총 26개이다. 그러나 대소문자 사용, 띄어쓰기 불일치로 인해 상품이 99 개로 확인된다.

 

상품명 오류 수정

In [7]:
print(len(pd.unique(uriage_data.item_name)))
 
99
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]:
  purchase_date item_name item_price customer_name purchase_month
0 2019-06-13 18:02:00 상품A 100.0 김가온 201906
1748 2019-05-19 20:22:00 상품A 100.0 김시훈 201905
223 2019-06-25 08:13:00 상품A 100.0 김유진 201906
1742 2019-06-13 16:03:00 상품A 100.0 김건희 201906
1738 2019-02-10 00:28:00 상품A 100.0 김하랑 201902
... ... ... ... ... ...
2880 2019-04-22 00:36:00 상품Y NaN 김동욱 201904
2881 2019-04-30 14:21:00 상품Y NaN 김하준 201904
1525 2019-01-24 10:27:00 상품Y 2500.0 김범준 201901
1361 2019-05-28 13:45:00 상품Y 2500.0 김수현 201905
3 2019-02-12 23:40:00 상품Z 2600.0 김재현 201902

2999 rows × 5 columns

In [12]:
print(len(pd.unique(uriage_data.item_name)))
print(pd.unique(uriage_data['item_name']))
 
26
['상품A' '상품S' '상품Z' '상품V' '상품O' '상품U' '상품L' '상품C' '상품I' '상품R' '상품X' '상품G'
 '상품P' '상품Q' '상품Y' '상품N' '상품W' '상품E' '상품K' '상품B' '상품F' '상품D' '상품M' '상품H'
 '상품T' '상품J']
 

금액의 결측치 수정

In [14]:
uriage_data.isnull().any(axis=0)
Out[14]:
purchase_date     False
item_name         False
item_price         True
customer_name     False
purchase_month    False
dtype: bool
 

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
 
/usr/local/lib/python3.6/dist-packages/pandas/core/indexing.py:670: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  iloc._setitem_with_indexer(indexer, value)
In [22]:
pd.unique(uriage_data['item_price'].isnull())
Out[22]:
array([False])
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()))
 
상품A의 최고가:100.0의 최저가 : 100.0
상품B의 최고가:200.0의 최저가 : 200.0
상품C의 최고가:300.0의 최저가 : 300.0
상품D의 최고가:400.0의 최저가 : 400.0
상품E의 최고가:500.0의 최저가 : 500.0
상품F의 최고가:600.0의 최저가 : 600.0
상품G의 최고가:700.0의 최저가 : 700.0
상품H의 최고가:800.0의 최저가 : 800.0
상품I의 최고가:900.0의 최저가 : 900.0
상품J의 최고가:1000.0의 최저가 : 1000.0
상품K의 최고가:1100.0의 최저가 : 1100.0
상품L의 최고가:1200.0의 최저가 : 1200.0
상품M의 최고가:1300.0의 최저가 : 1300.0
상품N의 최고가:1400.0의 최저가 : 1400.0
상품O의 최고가:1500.0의 최저가 : 1500.0
상품P의 최고가:1600.0의 최저가 : 1600.0
상품Q의 최고가:1700.0의 최저가 : 1700.0
상품R의 최고가:1800.0의 최저가 : 1800.0
상품S의 최고가:1900.0의 최저가 : 1900.0
상품T의 최고가:2000.0의 최저가 : 2000.0
상품U의 최고가:2100.0의 최저가 : 2100.0
상품V의 최고가:2200.0의 최저가 : 2200.0
상품W의 최고가:2300.0의 최저가 : 2300.0
상품X의 최고가:2400.0의 최저가 : 2400.0
상품Y의 최고가:2500.0의 최저가 : 2500.0
상품Z의 최고가:2600.0의 최저가 : 2600.0
 

고객 이름 오류 수정

In [59]:
kokyaku_data['고객이름'].head()
Out[59]:
0    김 현성
1    김 도윤
2    김 지한
3    김 하윤
4    김 시온
Name: 고객이름, dtype: object
In [60]:
uriage_data['customer_name'].head()
Out[60]:
0    김가온
1    김우찬
2    김유찬
3    김재현
4    김강현
Name: customer_name, dtype: object
In [61]:
kokyaku_data["고객이름"]=kokyaku_data["고객이름"].str.replace(" ", "")
In [62]:
kokyaku_data["고객이름"].head()
Out[62]:
0    김현성
1    김도윤
2    김지한
3    김하윤
4    김시온
Name: 고객이름, dtype: object
 

날짜 오류 수정

In [63]:
flg_is_serial = kokyaku_data["등록일"].astype("str").str.isdigit() # 숫자로 판단되는 데이터들
flg_is_serial.sum()
Out[63]:
22
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]:
1     2017-02-16
3     2017-05-17
4     2018-01-27
21    2017-07-04
27    2017-06-15
47    2017-01-06
49    2017-07-13
53    2017-04-08
76    2018-03-29
80    2018-01-10
99    2017-05-30
114   2018-06-03
118   2018-01-29
122   2018-04-16
139   2017-05-25
143   2017-03-24
155   2017-01-19
172   2018-03-22
179   2017-01-08
183   2017-07-24
186   2018-07-13
192   2018-06-08
Name: 등록일, dtype: datetime64[ns]
In [68]:
fromString = pd.to_datetime(kokyaku_data.loc[~flg_is_serial,'등록일']) # 날짜로 변환된 데이터도 서식 통일해준다.
fromString
Out[68]:
0     2018-01-04
2     2018-01-07
5     2017-06-20
6     2018-06-11
7     2017-05-19
         ...    
195   2017-06-20
196   2018-06-20
197   2017-04-29
198   2019-04-19
199   2019-04-23
Name: 등록일, Length: 178, dtype: datetime64[ns]
In [69]:
kokyaku_data["등록일"] = pd.concat([fromSerial, fromString])
kokyaku_data
Out[69]:
  고객이름 지역 등록일
0 김현성 H시 2018-01-04
1 김도윤 E시 2017-02-16
2 김지한 A시 2018-01-07
3 김하윤 F시 2017-05-17
4 김시온 E시 2018-01-27
... ... ... ...
195 김재희 G시 2017-06-20
196 김도영 E시 2018-06-20
197 김이안 F시 2017-04-29
198 김시현 H시 2019-04-19
199 김서우 D시 2019-04-23

200 rows × 3 columns

In [70]:
kokyaku_data["등록연월"] = kokyaku_data["등록일"].dt.strftime("%Y%m")
rslt = kokyaku_data.groupby("등록연월").count()["고객이름"]
print(rslt)
print(len(kokyaku_data))
 
등록연월
201701    15
201702    11
201703    14
201704    15
201705    14
201706    13
201707    17
201801    13
201802    15
201803    17
201804     5
201805    19
201806    13
201807    17
201904     2
Name: 고객이름, dtype: int64
200
In [71]:
# 등록일 컬럼에 숫자 데이터 남아있는지 확인하기
flg_is_serial = kokyaku_data['등록일'].astype('str').str.isdigit()
flg_is_serial.sum()
Out[71]:
0
 

고객 이름으로 두 데이터 결합하기

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]:
  purchase_date item_name item_price purchase_month 고객이름 지역 등록일 등록연월
0 2019-06-13 18:02:00 상품A 100.0 201906 김가온 C시 2017-01-26 201701
1 2019-07-13 13:05:00 상품S 1900.0 201907 김우찬 C시 2018-04-07 201804
2 2019-05-11 19:42:00 상품A 100.0 201905 김유찬 A시 2018-06-19 201806
3 2019-02-12 23:40:00 상품Z 2600.0 201902 김재현 D시 2018-07-22 201807
4 2019-04-22 03:09:00 상품A 100.0 201904 김강현 D시 2017-06-07 201706
... ... ... ... ... ... ... ... ...
2994 2019-02-15 02:56:00 상품Y 2500.0 201902 김정민 B시 2017-07-01 201707
2995 2019-06-22 04:03:00 상품M 1300.0 201906 김재원 E시 2018-03-31 201803
2996 2019-03-29 11:14:00 상품Q 1700.0 201903 김지율 B시 2017-03-15 201703
2997 2019-07-14 12:56:00 상품H 800.0 201907 김승주 E시 2018-07-13 201807
2998 2019-07-21 00:31:00 상품D 400.0 201907 정준기 B시 2017-02-05 201702

2999 rows × 8 columns

 

정제한 데이터 덤프

In [73]:
dump_data = join_data[['purchase_date', 'purchase_month', 'item_name', 'item_price', '고객이름', '지역','등록일']]
dump_data
Out[73]:
  purchase_date purchase_month item_name item_price 고객이름 지역 등록일
0 2019-06-13 18:02:00 201906 상품A 100.0 김가온 C시 2017-01-26
1 2019-07-13 13:05:00 201907 상품S 1900.0 김우찬 C시 2018-04-07
2 2019-05-11 19:42:00 201905 상품A 100.0 김유찬 A시 2018-06-19
3 2019-02-12 23:40:00 201902 상품Z 2600.0 김재현 D시 2018-07-22
4 2019-04-22 03:09:00 201904 상품A 100.0 김강현 D시 2017-06-07
... ... ... ... ... ... ... ...
2994 2019-02-15 02:56:00 201902 상품Y 2500.0 김정민 B시 2017-07-01
2995 2019-06-22 04:03:00 201906 상품M 1300.0 김재원 E시 2018-03-31
2996 2019-03-29 11:14:00 201903 상품Q 1700.0 김지율 B시 2017-03-15
2997 2019-07-14 12:56:00 201907 상품H 800.0 김승주 E시 2018-07-13
2998 2019-07-21 00:31:00 201907 상품D 400.0 정준기 B시 2017-02-05

2999 rows × 7 columns

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]:
  purchase_date purchase_month item_name item_price 고객이름 지역 등록일
0 2019-06-13 18:02:00 201906 상품A 100.0 김가온 C시 2017-01-26 00:00:00
1 2019-07-13 13:05:00 201907 상품S 1900.0 김우찬 C시 2018-04-07 00:00:00
2 2019-05-11 19:42:00 201905 상품A 100.0 김유찬 A시 2018-06-19 00:00:00
3 2019-02-12 23:40:00 201902 상품Z 2600.0 김재현 D시 2018-07-22 00:00:00
4 2019-04-22 03:09:00 201904 상품A 100.0 김강현 D시 2017-06-07 00:00:00
... ... ... ... ... ... ... ...
2994 2019-02-15 02:56:00 201902 상품Y 2500.0 김정민 B시 2017-07-01 00:00:00
2995 2019-06-22 04:03:00 201906 상품M 1300.0 김재원 E시 2018-03-31 00:00:00
2996 2019-03-29 11:14:00 201903 상품Q 1700.0 김지율 B시 2017-03-15 00:00:00
2997 2019-07-14 12:56:00 201907 상품H 800.0 김승주 E시 2018-07-13 00:00:00
2998 2019-07-21 00:31:00 201907 상품D 400.0 정준기 B시 2017-02-05 00:00:00

2999 rows × 7 columns

In [76]:
# 월별 상품 판매
byItem = import_data.pivot_table(index="purchase_month", columns='item_name', aggfunc='size', fill_value = 0)
byItem
Out[76]:
item_name 상품A 상품B 상품C 상품D 상품E 상품F 상품G 상품H 상품I 상품J 상품K 상품L 상품M 상품N 상품O 상품P 상품Q 상품R 상품S 상품T 상품U 상품V 상품W 상품X 상품Y 상품Z
purchase_month                                                    
201901 18 13 19 17 18 15 11 16 18 17 20 19 19 16 24 16 17 21 20 17 7 22 13 14 10 0
201902 19 14 26 21 16 14 14 17 12 14 16 11 15 20 19 19 22 22 22 23 19 22 24 16 11 1
201903 17 21 20 17 9 27 14 18 12 16 14 20 22 13 11 21 23 16 20 12 23 18 16 21 16 0
201904 17 19 24 20 18 17 14 11 18 13 14 15 11 20 15 15 20 20 16 16 11 15 14 16 20 0
201905 24 14 16 14 19 18 23 15 16 11 18 13 18 19 18 20 13 22 18 16 16 9 21 16 20 0
201906 24 12 11 19 13 18 15 13 19 22 15 15 17 16 15 18 15 16 21 12 18 20 17 15 13 0
201907 20 20 17 17 12 17 19 19 19 23 12 17 11 15 22 26 15 19 23 21 13 28 16 18 12 0
In [77]:
byPrice = import_data.pivot_table(index="purchase_month", columns='item_name', values='item_price', aggfunc='sum', fill_value=0)
byPrice
Out[77]:
item_name 상품A 상품B 상품C 상품D 상품E 상품F 상품G 상품H 상품I 상품J 상품K 상품L 상품M 상품N 상품O 상품P 상품Q 상품R 상품S 상품T 상품U 상품V 상품W 상품X 상품Y 상품Z
purchase_month                                                    
201901 1800 2600 5700 6800 9000 9000 7700 12800 16200 17000 22000 22800 24700 22400 36000 25600 28900 37800 38000 34000 14700 48400 29900 33600 25000 0
201902 1900 2800 7800 8400 8000 8400 9800 13600 10800 14000 17600 13200 19500 28000 28500 30400 37400 39600 41800 46000 39900 48400 55200 38400 27500 2600
201903 1700 4200 6000 6800 4500 16200 9800 14400 10800 16000 15400 24000 28600 18200 16500 33600 39100 28800 38000 24000 48300 39600 36800 50400 40000 0
201904 1700 3800 7200 8000 9000 10200 9800 8800 16200 13000 15400 18000 14300 28000 22500 24000 34000 36000 30400 32000 23100 33000 32200 38400 50000 0
201905 2400 2800 4800 5600 9500 10800 16100 12000 14400 11000 19800 15600 23400 26600 27000 32000 22100 39600 34200 32000 33600 19800 48300 38400 50000 0
201906 2400 2400 3300 7600 6500 10800 10500 10400 17100 22000 16500 18000 22100 22400 22500 28800 25500 28800 39900 24000 37800 44000 39100 36000 32500 0
201907 2000 4000 5100 6800 6000 10200 13300 15200 17100 23000 13200 20400 14300 21000 33000 41600 25500 34200 43700 42000 27300 61600 36800 43200 30000 0
In [78]:
byCustomer = import_data.pivot_table(index="purchase_month", columns='고객이름', aggfunc='size', fill_value=0)
byCustomer
Out[78]:
고객이름 김가온 김강민 김강현 김건우 김건희 김경민 김규민 김규현 김다온 김대현 김도경 김도영 김도원 김도윤 김도율 김도하 김도현 김도훈 김동건 김동우 김동욱 김동하 김동현 김라온 김민건 김민규 김민기 김민서 김민석 김민수 김민우 김민재 김민준 김민찬 김민혁 김민호 김범준 김상민 김상현 김서윤 ... 김지혁 김지호 김지환 김지후 김지훈 김진우 김찬영 김찬우 김태경 김태민 김태양 김태영 김태우 김태윤 김태인 김태준 김태현 김태훈 김하람 김하랑 김하민 김하윤 김하율 김하준 김하진 김한결 김현민 김현서 김현석 김현성 김현수 김현승 김현우 김현준 김현진 김호준 정도형 정영훈 정우석 정준기
purchase_month                                                                                                                                                                  
201901 1 2 1 2 5 3 1 1 1 5 4 0 0 2 2 2 0 3 2 2 2 1 3 3 3 1 3 1 4 2 0 3 3 0 4 4 5 1 2 2 ... 3 5 2 2 2 1 6 5 1 2 1 2 3 4 0 0 0 1 1 2 3 3 2 1 7 1 0 1 3 2 3 2 4 2 1 1 4 4 4 3
201902 3 1 4 3 3 5 2 3 1 5 1 6 4 4 1 2 4 3 1 2 0 1 1 3 1 1 3 2 2 3 3 3 9 0 5 2 2 0 1 2 ... 3 0 1 1 1 1 1 3 4 1 1 0 1 2 2 0 0 1 2 3 3 2 1 0 2 0 4 4 5 3 5 3 7 0 0 1 2 0 2 2
201903 4 0 3 1 1 2 2 1 1 5 3 0 3 3 0 2 4 2 5 1 1 0 3 1 2 1 5 5 1 0 1 5 1 1 1 1 3 3 0 6 ... 4 4 2 1 1 3 0 3 2 2 3 4 3 2 4 2 4 3 1 2 2 1 2 1 1 4 0 5 0 2 3 2 1 2 1 2 1 2 3 4
201904 1 0 3 0 2 1 2 6 2 4 1 3 1 3 1 4 2 2 1 4 4 1 1 3 2 2 4 2 0 1 2 1 0 2 5 4 2 3 2 2 ... 1 4 3 1 0 4 1 1 1 5 4 1 0 0 2 1 3 5 0 5 3 4 4 4 1 0 1 4 4 3 0 4 3 1 1 2 2 4 3 1
201905 0 0 2 2 1 4 6 3 3 1 3 2 3 2 2 1 1 1 2 2 0 2 4 4 0 1 2 2 2 1 3 1 3 5 2 1 2 1 2 2 ... 3 2 6 3 4 0 0 2 2 4 2 5 1 0 3 1 1 1 1 5 4 4 2 1 1 2 2 2 0 2 2 2 1 4 3 0 0 0 1 2
201906 5 0 3 0 2 1 6 1 1 1 2 2 5 4 2 1 1 2 1 3 1 2 2 3 3 4 3 3 6 2 1 2 1 2 0 2 1 3 4 4 ... 0 1 3 1 1 2 2 1 4 4 1 3 2 3 2 3 1 2 2 0 2 3 2 3 0 1 1 1 1 4 2 4 1 0 4 2 2 0 0 2
201907 3 1 3 2 2 1 4 1 4 3 4 2 1 1 3 2 3 1 1 3 5 2 1 2 2 1 1 2 2 1 5 0 3 4 2 2 5 4 4 2 ... 2 0 1 2 5 2 2 4 6 1 1 5 2 2 4 1 2 2 2 2 2 2 2 4 1 0 1 3 2 4 2 1 0 4 0 2 6 1 2 3

7 rows × 199 columns

In [79]:
byRegion = import_data.pivot_table(index='purchase_month', columns='지역', aggfunc='size', fill_value=0)
byRegion
Out[79]:
지역 A시 B시 C시 D시 E시 F시 G시 H시
purchase_month                
201901 59 55 72 34 49 57 49 42
201902 71 46 65 48 61 52 43 63
201903 64 52 57 43 52 59 51 59
201904 64 48 54 45 48 58 40 52
201905 57 52 68 48 59 65 35 43
201906 53 47 61 30 51 51 58 58
201907 76 53 61 42 54 64 47 54
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]:
  고객이름 등록일
2999 김서우 2019-04-23
In [ ]: