In [1]:
import os
import numpy as np
import pandas as pd
In [2]:
os.getcwd() #현재 디렉토리 확인
Out[2]:
'/Users/limjongjun/Desktop/JayJay/Growth/Python/Class101_Pandas'
In [3]:
df1 = pd.read_csv('01_Contract_Data.csv')
df1.head()
Out[3]:
Index | Member_ID | Sales_Type | Contract_Type | Channel | Datetime | Term | Payment_Type | Product_Type | Amount_Month | Customer_Type | Age | Address1 | Address2 | State | Overdue_count | Overdue_Type | Gender | Credit_Rank | Bank | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 66758234 | 렌탈 | 일반계약 | 영업방판 | 2019-05-06 | 60 | CMS | DES-1 | 96900 | 개인 | 42.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | 9.0 | 새마을금고 |
1 | 2 | 66755948 | 렌탈 | 교체계약 | 영업방판 | 2020-02-20 | 60 | 카드이체 | DES-1 | 102900 | 개인 | 39.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 남자 | 2.0 | 현대카드 |
2 | 3 | 66756657 | 렌탈 | 일반계약 | 홈쇼핑/방송 | 2019-02-28 | 60 | CMS | DES-1 | 96900 | 개인 | 48.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | 8.0 | 우리은행 |
3 | 4 | 66423450 | 멤버십 | 멤버십3유형 | 재계약 | 2019-05-13 | 12 | CMS | DES-1 | 66900 | 개인 | 39.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 남자 | 5.0 | 농협회원조합 |
4 | 5 | 66423204 | 멤버십 | 멤버십3유형 | 재계약 | 2019-05-10 | 12 | CMS | DES-1 | 66900 | 개인 | 60.0 | 경기도 | 경기도 | 기간만료 | 12 | 있음 | 남자 | 8.0 | 농협회원조합 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
51296 | 51298 | 66579515 | 렌탈 | 프로모션계약 | 대형마트A | 2019-03-01 | 60 | CMS | DES-3A | 96900 | 개인 | 47.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 남자 | NaN | 기업은행 |
51297 | 51299 | 66799558 | 렌탈 | 일반계약 | 대형마트A | 2019-04-01 | 60 | CMS | DES-1 | 96900 | 개인 | 42.0 | 경기도 | 경기도 | 계약확정 | 0 | 없음 | 여자 | 8.0 | 새마을금고 |
51298 | 51300 | 66799197 | 렌탈 | 프로모션계약 | 영업방판 | 2019-04-01 | 39 | 카드이체 | ERA | 120900 | 개인 | 65.0 | 서울특별시 | 서울특별시 | 계약확정 | 0 | 없음 | 여자 | 1.0 | 롯데카드 |
51299 | 51301 | 66792778 | 렌탈 | 일반계약 | 홈쇼핑/방송 | 2020-02-06 | 60 | 카드이체 | DES-1 | 96900 | 개인 | 54.0 | 서울특별시 | 서울특별시 | 계약확정 | 0 | 없음 | 여자 | 2.0 | 롯데카드 |
51300 | 51302 | 66799607 | 렌탈 | 일반계약 | 홈쇼핑/방송 | 2019-04-24 | 60 | CMS | DES-1 | 96900 | 개인 | 53.0 | 서울특별시 | 서울특별시 | 계약확정 | 0 | 없음 | 여자 | 8.0 | 신한은행 |
51301 rows × 20 columns
In [79]:
#고객들의 유입 채녈별 월 랜탈 비용
df1.pivot_table(index = 'Channel', values = 'Amount_Month') #default = 평균
Out[79]:
Amount_Month | |
---|---|
Channel | |
대형마트A | 97016.330159 |
대형마트C | 95276.974790 |
대형마트E | 100423.647295 |
대형마트H | 100025.333333 |
대형마트N | 76514.457831 |
영업방판 | 100322.794631 |
자체홈페이지 | 98402.500000 |
재계약 | 67176.744186 |
전단홍보 | 104048.571429 |
전문매장H | 72514.008677 |
전문매장Z | 98127.363184 |
직영계열사A | 104970.000000 |
직영계열사B | 111300.000000 |
직영유통사 | 119011.117021 |
홈쇼핑/방송 | 89092.232411 |
홈쇼핑/인터넷 | 96685.600000 |
In [80]:
df1.pivot_table(index = 'Channel', values = 'Amount_Month', aggfunc = 'sum')
Out[80]:
Amount_Month | |
---|---|
Channel | |
대형마트A | 458402160 |
대형마트C | 11337960 |
대형마트E | 150334200 |
대형마트H | 22505700 |
대형마트N | 6350700 |
영업방판 | 2384371860 |
자체홈페이지 | 11808300 |
재계약 | 147318600 |
전단홍보 | 58267200 |
전문매장H | 234002706 |
전문매장Z | 118341600 |
직영계열사A | 2099400 |
직영계열사B | 2114700 |
직영유통사 | 22374090 |
홈쇼핑/방송 | 1156149900 |
홈쇼핑/인터넷 | 36257100 |
In [82]:
#차원 복수개일 때
df1.pivot_table(index = ['Gender','Channel'], values = 'Amount_Month', aggfunc = 'sum')
Out[82]:
Amount_Month | ||
---|---|---|
Gender | Channel | |
남자 | 대형마트A | 135033600 |
대형마트E | 51570900 | |
대형마트H | 8149500 | |
대형마트N | 3120900 | |
영업방판 | 761853300 | |
자체홈페이지 | 4813500 | |
재계약 | 51653700 | |
전단홍보 | 17594700 | |
전문매장H | 49461600 | |
전문매장Z | 47891700 | |
홈쇼핑/방송 | 352808400 | |
홈쇼핑/인터넷 | 9774900 | |
여자 | 대형마트A | 323368560 |
대형마트C | 11337960 | |
대형마트E | 98763300 | |
대형마트H | 14356200 | |
대형마트N | 3229800 | |
영업방판 | 1622518560 | |
자체홈페이지 | 6994800 | |
재계약 | 95664900 | |
전단홍보 | 40672500 | |
전문매장H | 184541106 | |
전문매장Z | 70449900 | |
직영계열사A | 2099400 | |
직영계열사B | 2114700 | |
직영유통사 | 22374090 | |
홈쇼핑/방송 | 803341500 | |
홈쇼핑/인터넷 | 26482200 |
In [84]:
#차원 & 측정값 복수개일 때
df1.pivot_table(index = ['Gender','Channel'], values = ['Amount_Month','Overdue_count'], aggfunc = ['sum','min','max'])
Out[84]:
sum | min | max | |||||
---|---|---|---|---|---|---|---|
Amount_Month | Overdue_count | Amount_Month | Overdue_count | Amount_Month | Overdue_count | ||
Gender | Channel | ||||||
남자 | 대형마트A | 135033600 | 351 | 55200 | 0 | 185700 | 12 |
대형마트E | 51570900 | 89 | 81900 | 0 | 185700 | 13 | |
대형마트H | 8149500 | 21 | 87900 | 0 | 142200 | 12 | |
대형마트N | 3120900 | 0 | 75900 | 0 | 78900 | 0 | |
영업방판 | 761853300 | 2083 | 78900 | 0 | 215700 | 15 | |
자체홈페이지 | 4813500 | 1 | 84900 | 0 | 126900 | 1 | |
재계약 | 51653700 | 167 | 55200 | 0 | 105900 | 12 | |
전단홍보 | 17594700 | 21 | 87900 | 0 | 185700 | 7 | |
전문매장H | 49461600 | 128 | 81900 | 0 | 145200 | 13 | |
전문매장Z | 47891700 | 43 | 81900 | 0 | 145200 | 10 | |
홈쇼핑/방송 | 352808400 | 476 | 80400 | 0 | 145200 | 15 | |
홈쇼핑/인터넷 | 9774900 | 20 | 80400 | 0 | 138900 | 13 | |
여자 | 대형마트A | 323368560 | 553 | 55200 | 0 | 185700 | 12 |
대형마트C | 11337960 | 0 | 87930 | 0 | 126900 | 0 | |
대형마트E | 98763300 | 103 | 81900 | 0 | 185700 | 14 | |
대형마트H | 14356200 | 22 | 81900 | 0 | 144900 | 12 | |
대형마트N | 3229800 | 0 | 75900 | 0 | 102900 | 0 | |
영업방판 | 1622518560 | 2804 | 78900 | 0 | 215700 | 15 | |
자체홈페이지 | 6994800 | 3 | 78900 | 0 | 105900 | 2 | |
재계약 | 95664900 | 148 | 55200 | 0 | 96600 | 12 | |
전단홍보 | 40672500 | 80 | 66900 | 0 | 215700 | 13 | |
전문매장H | 184541106 | 64 | 54603 | 0 | 145200 | 14 | |
전문매장Z | 70449900 | 88 | 81900 | 0 | 145200 | 13 | |
직영계열사A | 2099400 | 0 | 82200 | 0 | 112200 | 0 | |
직영계열사B | 2114700 | 0 | 93900 | 0 | 126900 | 0 | |
직영유통사 | 22374090 | 172 | 96900 | 0 | 180750 | 1 | |
홈쇼핑/방송 | 803341500 | 795 | 72900 | 0 | 144900 | 14 | |
홈쇼핑/인터넷 | 26482200 | 47 | 80400 | 0 | 124200 | 8 |
In [86]:
df1.pivot_table(index = 'Sales_Type', values = 'Amount_Month', columns = 'Datetime', aggfunc = 'sum')
Out[86]:
Datetime | 2019-01-01 | 2019-01-02 | 2019-01-03 | 2019-01-04 | 2019-01-05 | 2019-01-06 | 2019-01-07 | 2019-01-08 | 2019-01-09 | 2019-01-10 | ... | 2020-07-29 | 2020-07-30 | 2020-07-31 | 2020-08-01 | 2020-08-02 | 2020-08-03 | 2020-08-04 | 2020-08-05 | 2020-08-06 | 2020-08-07 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Sales_Type | |||||||||||||||||||||
렌탈 | 4346700.0 | 4957800.0 | 7011300.0 | 5276700.0 | 5170950.0 | 4445700.0 | 8282400.0 | 5970150.0 | 5577600.0 | 6996900.0 | ... | 5478600.0 | 7551300.0 | 10361100.0 | 6187500.0 | 2779200.0 | 2953500.0 | 2732700.0 | 3034260.0 | 2523000.0 | 2111100.0 |
멤버십 | 209700.0 | 66900.0 | 255900.0 | 133800.0 | 334500.0 | 142800.0 | 255900.0 | NaN | 133800.0 | 133800.0 | ... | 302361.0 | 383322.0 | 730365.0 | 671079.0 | 188403.0 | 192039.0 | 125643.0 | 245382.0 | 247758.0 | 58743.0 |
2 rows × 577 columns
In [87]:
df1['Datetime(dt)'] = pd.to_datetime(df1['Datetime'])
In [92]:
df1['Year'] = df1['Datetime(dt)'].dt.year
df1['Month'] = df1['Datetime(dt)'].dt.month
In [94]:
df1.pivot_table(index='Sales_Type', columns = ['Year','Month'], values = 'Amount_Month')
Out[94]:
Year | 2019 | 2020 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Month | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Sales_Type | ||||||||||||||||||||
렌탈 | 96172.046784 | 97606.305005 | 97285.737931 | 97112.037150 | 97051.854305 | 97039.029484 | 97091.540608 | 97473.732591 | 97348.261894 | 96986.906574 | 97392.284672 | 97608.871939 | 97245.266171 | 97389.391892 | 96849.702970 | 97615.522023 | 97588.512111 | 97147.594937 | 97624.743276 | 97472.751092 |
멤버십 | 67474.117647 | 62307.452113 | 63324.780822 | 62145.128834 | 63300.847176 | 63442.086957 | 63271.810881 | 63127.223176 | 62816.128631 | 62210.300353 | 62704.071429 | 62721.843416 | 62037.849711 | 63822.093750 | 62531.109091 | 63413.446154 | 62665.296296 | 62259.808989 | 63186.853659 | 64038.777778 |
In [97]:
df1.pivot_table(index = 'Product_Type', values = 'Amount_Month', aggfunc = 'sum', columns= 'Year', margins = True) #margin : 전체합 옵션
Out[97]:
Year | 2019 | 2020 | All |
---|---|---|---|
Product_Type | |||
DES-1 | 2946278610 | 748837116 | 3695115726 |
DES-2 | 631877970 | 155779320 | 787657290 |
DES-3A | 157162560 | 39922500 | 197085060 |
DES-R4 | 33891300 | 8437200 | 42328500 |
ERA | 62944500 | 14171100 | 77115600 |
MMC | 17540100 | 5193900 | 22734000 |
All | 3849695040 | 972341136 | 4822036176 |
In [99]:
df11 = df1.pivot_table(index = 'Product_Type', values = 'Amount_Month', aggfunc = 'sum', columns= 'Year')
In [103]:
#YoY 계산
df11['증감액'] = df11[2020] - df11[2019]
df11['증감비율'] = (((df11[2020] - df11[2019]) / df11[2019])*100).round(1).astype(str) + '%'
df11
Out[103]:
Year | 2019 | 2020 | 증감액 | 증감비율 |
---|---|---|---|---|
Product_Type | ||||
DES-1 | 2946278610 | 748837116 | -2197441494 | -74.6% |
DES-2 | 631877970 | 155779320 | -476098650 | -75.3% |
DES-3A | 157162560 | 39922500 | -117240060 | -74.6% |
DES-R4 | 33891300 | 8437200 | -25454100 | -75.1% |
ERA | 62944500 | 14171100 | -48773400 | -77.5% |
MMC | 17540100 | 5193900 | -12346200 | -70.4% |
In [118]:
df12 = df1.loc[((df1['Year'] == 2019) & (df1['Month'] <= 8 )) | (df1['Year'] == 2020)]
In [119]:
df13 = df12.pivot_table(index = 'Product_Type', values = 'Amount_Month', aggfunc = 'sum', columns= 'Year', margins = True) #margin : 전체합 옵션
In [120]:
#YoY 계산
df13['증감액'] = df13[2020] - df13[2019]
df13['증감비율'] = (((df13[2020] - df13[2019]) / df13[2019])*100).round(1).astype(str) + '%'
df13
Out[120]:
Year | 2019 | 2020 | All | 증감액 | 증감비율 |
---|---|---|---|---|---|
Product_Type | |||||
DES-1 | 2236446810 | 748837116 | 2985283926 | -1487609694 | -66.5% |
DES-2 | 486777810 | 155779320 | 642557130 | -330998490 | -68.0% |
DES-3A | 117017160 | 39922500 | 156939660 | -77094660 | -65.9% |
DES-R4 | 25721700 | 8437200 | 34158900 | -17284500 | -67.2% |
ERA | 46972800 | 14171100 | 61143900 | -32801700 | -69.8% |
MMC | 14077500 | 5193900 | 19271400 | -8883600 | -63.1% |
All | 2927013780 | 972341136 | 3899354916 | -1954672644 | -66.8% |