iammiori / 19_bigcontest

Bigcontest Innovation
1 stars 0 forks source link

카드 #4

Open iammiori opened 5 years ago

iammiori commented 5 years ago

4. 카드데이터 EDA

import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
import seaborn as sns
from collections import Counter
import math
import glob
df_card = pd.read_csv("CARD_SPENDING_190809.txt",sep='\t') 
#빅콘측에서 8월9일 카드데이터 업데이트함

df_card.head()

#df_card[(df_card['DONG_CD'] == 550) & (df_card['GU_CD'] != 110)]
#구,동 결합한 파생변수 생성
df_card.loc[:, 'GU_DONG_CD'] = 1000 * df_card.loc[:, 'GU_CD'] + df_card.loc[:, 'DONG_CD']
df_card.iloc[2:11, 0:11]

#GU_CD 변환
df_card.loc[df_card['GU_CD'] == 110,'GU_CD'] = ['종로구']
df_card.loc[df_card['GU_CD'] == 350,'GU_CD'] =['노원구'] 
df_card['GU_CD'].value_counts()
df_card.head()

#DONG_CD 변환
df_card['GUDONG_CD']=df_card['GU_DONG_CD'].astype("category")
df_card['GUDONG_CD'].cat.categories
df_card['GUDONG_CD'].cat.categories=['청운효자동','사직동','삼청동','부암동','평창동',
                                     '무악동','교남동','가회동','종로1,2,3,4가동','종로5,6가동',
                                     '이화동','혜화동', '창신1동', '창신2동', '창신3동','숭인1동',
                                     '숭인2동','월계1동','월계2동', '월계3동', '공릉1동', '공릉2동',
                                     '하계1동','하계2동','중계본동','중계1동','중계4동','중계2,3동',
                                     '상계1동', '상계2동', '상계3,4동', '상계5동', '상계6,7동', '상계8동',
                                     '상계9동', '상계10동']

df_card['TYPE']=df_card['MCT_CAT_CD'].astype("category")
df_card['TYPE'].cat.categories
df_card['TYPE'].cat.categories=["숙박","레저용품","레저업소","문화취미","가구","전기","주방용구","연료판매",
                         "광학제품","가전","유통업","의복","직물","신변잡화","서적문구","사무통신","자동차판매",
                         "자동차정비","의료기관","보건위생","요식업소","음료식품","수리서비스"]

# 필요한 변수만 남기기
df_card= df_card[['STD_DD','GU_CD','GUDONG_CD','SEX_CD','AGE_CD','TYPE','USE_CNT','USE_AMT']]
# 이름을 편하게
df_card = df_card.rename(columns = {'STD_DD': 'STD_YMD'})
df_card.head()

#일별 카드 데이터
amt_sum = df_card["USE_AMT"].groupby(df_card["STD_YMD"]).sum() # 일별 이용금액 총합
cnt_sum = df_card["USE_CNT"].groupby(df_card["STD_YMD"]).sum() # 일별 이용건수의 총합
amt_mean = df_card["USE_AMT"].groupby(df_card["STD_YMD"]).sum()/df_card["USE_CNT"].groupby(df_card["STD_YMD"]).sum()

card_day = pd.concat([amt_sum,cnt_sum,amt_mean],axis=1,
                    keys=['amt_sum','cnt_sum','amt_mean'])
card_day.head()

card_day.to_csv('card_day.csv')
card_day = pd.read_csv('card_day.csv',index_col='STD_YMD',parse_dates=True)

fig = plt.figure(figsize=(13,4))
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
ax1.set_title('USE_CNT')
ax1.boxplot(df_card['USE_CNT'],vert=False)
ax2.set_title('USE_AMT')
ax2.boxplot(df_card['USE_AMT'],vert=False)
#이용금액과 이용건은 둘다 left-skewed. 각각 median이 47만 9천원과 23건이지만, 상위 25%에서 차이가 가장큼. 

#가장 큰 소비금액 52억원은 2018년 6월 15일 50~59세 남성 샘플인구가 '종로구 종로1.2.3.4가동 (110615)'의 '의료기관(70)'에서 489건 소비함
df_card.ix[df_card['USE_AMT'].idxmax()]

df_card.iloc[418962:418982,0:10] #최대 소비금액을 (418972)을 기준으로 20개 케이스를 봄. 특별하게 더 많은 소비가 보이진 않음.

df_card.nlargest(50, ['USE_AMT']) 

df_card[df_card["USE_AMT"]>=1095046] 

가장 큰 소비가 일어나는  50곳들은 지역별 특정 소비 패턴이 보임
- 종로구 종로1.2.3.4가동 (110 615) 의료기관(70) =>"서울대학교 병원" 추정
- 노원구 상계6.7동 (350 695), 중계본동(350 619) 주유소, LPG가스와 같은 연료판매(33) => 상계 6,7동 "SK엔크린 양지진흥상계주유소", 중계본동 "S-Oil 주유소"
- 주로 4,50대 소비자들
- 의료기관에서는 건당 평균 1억원 정도, 연료판매에서는 건당 평균 7만원 정도.

from matplotlib import rc
rc('font', family='AppleGothic')
plt.rcParams["font.size"] = 11
def bindo(df,wid):## char  데이터 빈도 분석, 그래프까지 반환
    dong = Counter(df)
    dong_cd = list(dong.keys())
    dong_va = list(dong.values())
    dong_df = pd.DataFrame()
    dong_df['cd'] = dong_cd
    dong_df['value'] = dong_va##장르 이름
    print("가장 큰 값 :\n",dong_df[dong_df['value']==dong_df['value'].max()])##가장 큰 값
    print("가장 작은 값 :\n",dong_df[dong_df['value']==dong_df['value'].min()])##가장 작은값
    plt.rcParams["font.size"] = 11
    plt.figure(figsize = (40,20))
    plt.bar(dong_cd, dong_va,width=wid)
    plt.xlabel('code', fontsize = 14)
    plt.xticks(fontsize = 14)
    plt.yticks(fontsize = 14)
    return 

#bindo(df_card['GU_CD'],3)
# 노원 종로 큰 차이가 없다.
bindo(df_card['GUDONG_CD'], .5) #빈도가 가장 많은 곳(종로1.2.3.4가동)과 가장 작은 곳(창신3동)의 차이는 약 4배 이상.

# 행정도별 카드 매출
df_card.head()
df_cd= df_card.copy()
dong_amt= df_cd['USE_AMT'].groupby([df_card["GUDONG_CD"]]).mean()
dong_amt.plot("box")
plt.figure(figsize = (6,1.5))
sns.boxplot(dong_amt)
plt.show()
dong_amt.values
temp_x = dong_amt.index
temp_y = dong_amt.values
print("최소값:",temp_y.min(),"최대값: ",temp_y.max())
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from matplotlib import rc
mpl.rcParams['axes.unicode_minus'] = False
font_name = fm.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
plt.rcParams["font.size"] = 10 ## 폰트 크기 결정
plt.figure(figsize = (7,5))
dong_amt.plot("bar")

# 연령카드 매출
tmp_age = df_cd['USE_AMT'].groupby([df_card["AGE_CD"],df_card["SEX_CD"]]).mean()
tmp_sex = df_cd['USE_AMT'].groupby([df_card["SEX_CD"],df_card["AGE_CD"]]).mean()
tmp_sex = df_cd[['USE_AMT','AGE_CD']].groupby([df_card["SEX_CD"]]).mean()
tmp_sex 
 = pd.DataFrame(tmp_sex)
tmp_age
tmp_age.plot("bar")
tmp_age.plot("bar")

# 업종별 카드 매출
df_cdty = df_cd.rename(columns={'TYPE':'업종'})
tmp_ty = df_cdty['USE_AMT'].groupby([df_cdty["업종"]]).mean()

plt.figure(figsize=(9,5))
tmp_ty.plot("bar",width=0.6)
plt.xticks(fontsize = 12)
plt.xlabel("업종별 평균 카드 매출액",fontsize = 14)
print("최대매출 : ",tmp_ty.argmax(),tmp_ty.max())
print("최소매출 : ",tmp_ty.argmin(),tmp_ty.min())
tmp_ty = df_cdty['USE_CNT'].groupby([df_cdty["업종"]]).sum()
print("최대매출건수 : ",tmp_ty.argmax(),tmp_ty.max())
print("최소매출 건수: ",tmp_ty.argmin(),tmp_ty.min())
plt.figure(figsize=(9,5))
tmp_ty.plot("bar",width=0.6)
plt.xticks(fontsize = 12)
plt.xlabel("업종별 평균 카드 매출건수",fontsize = 14)

tmp_ty = df_cd['USE_AMT'].groupby([df_card["TYPE"]]).mean()
plt.figure(figsize=(9,5))
tmp_ty.plot("bar",width=0.5)