티스토리 뷰

배달업종

[서울시 먹거리 분석 – 3] 전체 판매업종 이용 통화량 분석

sk datahub에서 배달 업종 데이터를 한번에 모아 분석해 보았다.
해당 자료는 경제/사회>경제에 있으며 링크는 https://www.bigdatahub.co.kr/product/list.do?menu_id=1000153 이다.
처음에는 데이터가 480만개 정도 됐는데, 데이터들을 처리하는 과정에서 groupby를 해버렸더니 18만개 정도로 줄어버렸다.
우선 이 정도 해놓고 시간이 날 때 다른 데이터들과 결합해서 분석해보겠다.

In [2]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
from scipy import stats
from sklearn.model_selection import train_test_split


# 노트북 안에 그래프를 그리기 위해
%matplotlib inline

# 그래프에서 격자로 숫자 범위가 눈에 잘 띄도록 ggplot 스타일을 사용
plt.style.use('ggplot')

# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False

/Users/whanh/delivery 디렉토리 안에 있는 모든 파일을 읽어오자.
파일들의 이름과 컬럼명을 미리 통일되도록 맞춰놓았다.

In [3]:
import os
directory = os.listdir('/Users/whanh/delivery')
In [4]:
print(directory)
['CALL_NDELIVERY_2013_08MONTH.csv', 'CALL_NDELIVERY_2013_09MONTH.csv', 'CALL_NDELIVERY_2013_10MONTH.csv', 'CALL_NDELIVERY_2013_11MONTH.csv', 'CALL_NDELIVERY_2013_12MONTH.csv', 'CALL_NDELIVERY_2014_01MONTH.csv', 'CALL_NDELIVERY_2014_02MONTH.csv', 'CALL_NDELIVERY_2014_03MONTH.csv', 'CALL_NDELIVERY_2014_04MONTH.csv', 'CALL_NDELIVERY_2014_05MONTH.csv', 'CALL_NDELIVERY_2014_06MONTH.csv', 'CALL_NDELIVERY_2014_07MONTH.csv', 'CALL_NDELIVERY_2014_08MONTH.csv', 'CALL_NDELIVERY_2014_09MONTH.csv', 'CALL_NDELIVERY_2014_10MONTH.csv', 'CALL_NDELIVERY_2014_11MONTH.csv', 'CALL_NDELIVERY_2014_12MONTH.csv', 'CALL_NDELIVERY_2015_01MONTH.csv', 'CALL_NDELIVERY_2015_02MONTH.csv', 'CALL_NDELIVERY_2015_03MONTH.csv', 'CALL_NDELIVERY_2015_04MONTH.csv', 'CALL_NDELIVERY_2015_05MONTH.csv', 'CALL_NDELIVERY_2015_06MONTH.csv', 'CALL_NDELIVERY_2015_07MONTH.csv', 'CALL_NDELIVERY_2015_08MONTH.csv', 'CALL_NDELIVERY_2015_09MONTH.csv', 'CALL_NDELIVERY_2015_10MONTH.csv', 'CALL_NDELIVERY_2015_11MONTH.csv', 'CALL_NDELIVERY_2015_12MONTH.csv', 'CALL_NDELIVERY_2016_01MONTH.csv', 'CALL_NDELIVERY_2016_02MONTH.csv', 'CALL_NDELIVERY_2016_03MONTH.csv', 'CALL_NDELIVERY_2016_04MONTH.csv', 'CALL_NDELIVERY_2016_05MONTH.csv', 'CALL_NDELIVERY_2016_06.txt', 'CALL_NDELIVERY_2016_06MONTH.csv', 'CALL_NDELIVERY_2016_07MONTH.csv', 'CALL_NDELIVERY_2016_08MONTH.csv', 'CALL_NDELIVERY_2016_09MONTH.csv', 'CALL_NDELIVERY_2016_10MONTH.csv', 'CALL_NDELIVERY_2016_11MONTH.csv', 'CALL_NDELIVERY_2016_12MONTH.csv', 'CALL_NDELIVERY_2017_01MONTH.csv', 'CALL_NDELIVERY_2017_02MONTH.csv', 'CALL_NDELIVERY_2017_03MONTH.csv', 'CALL_NDELIVERY_2017_04MONTH.csv', 'CALL_NDELIVERY_2017_05MONTH.csv', 'CALL_NDELIVERY_2017_06MONTH.csv', 'CALL_NDELIVERY_2017_07MONTH.csv', 'CALL_NDELIVERY_2017_08MONTH.csv', 'CALL_NDELIVERY_2017_09MONTH.csv', 'CALL_NDELIVERY_2017_10MONTH.csv', 'CALL_NDELIVERY_2017_11MONTH.csv', 'CALL_NDELIVERY_2017_12MONTH.csv', 'CALL_NDELIVERY_2018_01MONTH.csv', 'CALL_NDELIVERY_2018_02MONTH.csv', 'CALL_NDELIVERY_2018_03MONTH.csv', 'CALL_NDELIVERY_2018_04MONTH.csv', 'CALL_NDELIVERY_2018_05MONTH.csv', 'CALL_NDELIVERY_2018_06MONTH.csv', 'CALL_NDELIVERY_2018_07MONTH.csv', 'CALL_NDELIVERY_2018_08MONTH.csv', 'CALL_NDELIVERY_2018_09MONTH.csv', 'CALL_NDELIVERY_2018_10MONTH.csv', 'CALL_NDELIVERY_2018_11MONTH.csv', 'CALL_NDELIVERY_2018_12MONTH.csv', 'CALL_NDELIVERY_2019_01MONTH.csv', 'CALL_NDELIVERY_2019_02MONTH.csv']

데이터들을 쭉 열어보았더니 2013 8월 데이터의 일자 표시가 xxxx년xx월xx일로 되어있기 때문에 이를 xxxx-xx-xx 꼴로 고치도록 하자.
그리고 시간대가 xx시간대 이런형식으로 써 있는데 xx 처럼 숫자만 남겨주고 int형식으로 바꿔주자.(다른 데이터들이 그렇게 되어있다.)

In [5]:
df=pd.read_csv('C:/Users/whanh/delivery/CALL_NDELIVERY_2013_08MONTH.csv')
df.head()
Out[5]:
일자 요일 시간대 업종 통화건수
0 2013년08월01일 00시간대 족발/보쌈전문 115
1 2013년08월01일 01시간대 족발/보쌈전문 75
2 2013년08월01일 02시간대 족발/보쌈전문 38
3 2013년08월01일 03시간대 족발/보쌈전문 20
4 2013년08월01일 04시간대 족발/보쌈전문 22

xx시간대를 '시'를 기준으로 split하고 앞에 있는 xx를 선택한다.

In [6]:
df['시간대'] = df['시간대'].apply(lambda e: e.split('시')[0])
df.head()
Out[6]:
일자 요일 시간대 업종 통화건수
0 2013년08월01일 00 족발/보쌈전문 115
1 2013년08월01일 01 족발/보쌈전문 75
2 2013년08월01일 02 족발/보쌈전문 38
3 2013년08월01일 03 족발/보쌈전문 20
4 2013년08월01일 04 족발/보쌈전문 22

format='%Y년%m월%d일 은 20130801을 년월일로 인식하겠다는 의미이다.
넣어주지 않으면 20130801이 년월일이 아닌 microsec단위가 되어 버린다.

In [7]:
df['일자'] = pd.to_datetime(df['일자'],format='%Y년%m월%d일')
df.head()
Out[7]:
일자 요일 시간대 업종 통화건수
0 2013-08-01 00 족발/보쌈전문 115
1 2013-08-01 01 족발/보쌈전문 75
2 2013-08-01 02 족발/보쌈전문 38
3 2013-08-01 03 족발/보쌈전문 20
4 2013-08-01 04 족발/보쌈전문 22

시간대가 아직 문자열이므로 int형식으로 바꾼다.

In [8]:
df['시간대'] = df['시간대'].astype(int)
df.head()
Out[8]:
일자 요일 시간대 업종 통화건수
0 2013-08-01 0 족발/보쌈전문 115
1 2013-08-01 1 족발/보쌈전문 75
2 2013-08-01 2 족발/보쌈전문 38
3 2013-08-01 3 족발/보쌈전문 20
4 2013-08-01 4 족발/보쌈전문 22

일자는 요일형식으로 시간대는 int로 잘 바꼈는지 확인

In [9]:
df.dtypes
Out[9]:
일자      datetime64[ns]
요일              object
시간대              int32
업종              object
통화건수             int64
dtype: object

년도별로 리스트에 집어 넣자.
2016을 2개로 쪼갠 이유는 데이터가 2016년 6월부터 컬럼 개수가 바뀌었다.
컬럼 개수만 줄이면 된다고 생각할 수 있지만 차원을 줄일 경우 그 차원에 대해서 groupby를 해줘야 하기때문에 간편한 처리를 위해 나눴다.
2013년 8월 데이터를 넣지 않은 이유는 2013년 9월부터 2019년 2월까지 '일자'의 형식을 바꿔야 하므로 8월 데이터는 나중에 넣어주자.

In [10]:
list_2013=['C:/Users/whanh/delivery/CALL_NDELIVERY_2013_09MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2013_10MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2013_11MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2013_12MONTH.csv']
list_2014=['C:/Users/whanh/delivery/CALL_NDELIVERY_2014_01MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2014_02MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2014_03MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2014_04MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2014_05MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2014_06MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2014_07MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2014_08MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2014_09MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2014_10MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2014_11MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2014_12MONTH.csv']
list_2015=['C:/Users/whanh/delivery/CALL_NDELIVERY_2015_01MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2015_02MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2015_03MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2015_04MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2015_05MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2015_06MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2015_07MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2015_08MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2015_09MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2015_10MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2015_11MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2015_12MONTH.csv']
list_2016_1=['C:/Users/whanh/delivery/CALL_NDELIVERY_2016_01MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2016_02MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2016_03MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2016_04MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2016_05MONTH.csv' ]
list_2016_2=['C:/Users/whanh/delivery/CALL_NDELIVERY_2016_06MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2016_07MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2016_08MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2016_09MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2016_10MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2016_11MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2016_12MONTH.csv']
list_2017=['C:/Users/whanh/delivery/CALL_NDELIVERY_2017_01MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2017_02MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2017_03MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2017_04MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2017_05MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2017_06MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2017_07MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2017_08MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2017_09MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2017_10MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2017_11MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2017_12MONTH.csv']
list_2018=['C:/Users/whanh/delivery/CALL_NDELIVERY_2018_01MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2018_02MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2018_03MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2018_04MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2018_05MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2018_06MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2018_07MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2018_08MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2018_09MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2018_10MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2018_11MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2018_12MONTH.csv']
list_2019=['C:/Users/whanh/delivery/CALL_NDELIVERY_2019_01MONTH.csv', 'C:/Users/whanh/delivery/CALL_NDELIVERY_2019_02MONTH.csv']

2013년 데이터부터 2019년 데이터까지 불러서 각 년도의 새로운 리스트에 집어 넣자.

In [11]:
data2013=[]
for a in list_2013:
    data_2013=pd.read_csv(a)
    data2013.append(data_2013)
In [12]:
data2014=[]
for a in list_2014:
    data_2014=pd.read_csv(a)
    data2014.append(data_2014)
In [13]:
data2015=[]
for a in list_2015:
    data_2015=pd.read_csv(a)
    data2015.append(data_2015)
In [14]:
data2016_1=[]
for a in list_2016_1:
    data_2016_1=pd.read_csv(a)
    data2016_1.append(data_2016_1)
In [15]:
data2016_2=[]
for a in list_2016_2:
    data_2016_2=pd.read_csv(a)
    data2016_2.append(data_2016_2)
In [16]:
data2017=[]
for a in list_2017:
    data_2017=pd.read_csv(a)
    data2017.append(data_2017)
In [17]:
data2018=[]
for a in list_2018:
    data_2018=pd.read_csv(a)
    data2018.append(data_2018)
In [18]:
data2019=[]
for a in list_2019:
    data_2019=pd.read_csv(a)
    data2019.append(data_2019)

2013 9월 ~ 2016 5월까지 concat 시키고 2016 6월~ 2019 2월까지 concat 시키자

In [21]:
concat2013=pd.concat(data2013)
concat2014=pd.concat(data2014)
concat2015=pd.concat(data2015)
concat2016_1=pd.concat(data2016_1)

concatAll_1=pd.concat([concat2013,concat2014,concat2015,concat2016_1])
concatAll_1.head()
Out[21]:
일자 요일 시간대 업종 통화건수
0 20130901 0 피자전문 54
1 20130901 0 음식점-족발/보쌈전문 109
2 20130901 0 음식점-중국음식 246
3 20130901 0 치킨 1239
4 20130901 1 피자전문 23
In [22]:
concat2016_2=pd.concat(data2016_2)
concat2017=pd.concat(data2017)
concat2018=pd.concat(data2018)
concat2019=pd.concat(data2019)
concatAll_2=pd.concat([concat2016_2,concat2017,concat2018,concat2019])
concatAll_2.head()
Out[22]:
일자 요일 시간대 업종 시도 시군구 읍면동 통화건수
0 20160601 0 음식점-족발/보쌈전문 서울특별시 강남구 논현동 5
1 20160601 0 음식점-족발/보쌈전문 서울특별시 강남구 삼성동 5
2 20160601 0 음식점-족발/보쌈전문 서울특별시 강남구 신사동 5
3 20160601 0 음식점-족발/보쌈전문 서울특별시 강남구 역삼동 5
4 20160601 0 음식점-족발/보쌈전문 서울특별시 강동구 명일동 5

2016년 6월 데이터 부터는 시도, 시군구, 읍면동 이라는 컬럼때문에 통화건수가 잘게 쪼개져있다.
이 통화건수를 groupby를 이용하여 모아보자. 그리고 reset_index()를 이용해 활용할수 있는 데이터 프레임으로 다시 바꾸자

In [27]:
concatAll_2_1=concatAll_2.groupby(['일자','요일','시간대','업종']).sum().reset_index()
concatAll_2_1.head(10)
Out[27]:
일자 요일 시간대 업종 통화건수
0 20160601 0 음식점-족발/보쌈전문 110
1 20160601 0 음식점-중국음식 228
2 20160601 0 치킨 531
3 20160601 0 피자 70
4 20160601 1 음식점-족발/보쌈전문 55
5 20160601 1 음식점-중국음식 171
6 20160601 1 치킨 287
7 20160601 1 피자 20
8 20160601 2 음식점-족발/보쌈전문 25
9 20160601 2 음식점-중국음식 165

그러면 2013년 9월부터 2019년 2월까지 모든 데이터를 concat 시키자

In [30]:
concatAll=pd.concat([concatAll_1,concatAll_2_1])
concatAll.head()
Out[30]:
일자 요일 시간대 업종 통화건수
0 20130901 0 피자전문 54
1 20130901 0 음식점-족발/보쌈전문 109
2 20130901 0 음식점-중국음식 246
3 20130901 0 치킨 1239
4 20130901 1 피자전문 23

이 데이터의 '일자' 컬럼의 숫자를 날짜열로 바꾸자

In [31]:
concatAll['일자'] = pd.to_datetime(concatAll['일자'],format='%Y%m%d')
concatAll.head()
Out[31]:
일자 요일 시간대 업종 통화건수
0 2013-09-01 0 피자전문 54
1 2013-09-01 0 음식점-족발/보쌈전문 109
2 2013-09-01 0 음식점-중국음식 246
3 2013-09-01 0 치킨 1239
4 2013-09-01 1 피자전문 23

아까 만들어 놓았던 2013년 8월 데이터와 2013-9~2019-2 데이터를 결합하자

In [36]:
concatA=pd.concat([concatAll,df])
concatA.head()
Out[36]:
일자 요일 시간대 업종 통화건수
0 2013-09-01 0 피자전문 54
1 2013-09-01 0 음식점-족발/보쌈전문 109
2 2013-09-01 0 음식점-중국음식 246
3 2013-09-01 0 치킨 1239
4 2013-09-01 1 피자전문 23

info를 이용해 데이터를 확인해보고 빠진 데이터는 없는지 각 데이터들의 형식은 제대로 되어있는지 확인하자.

In [34]:
concatA.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 189608 entries, 0 to 2816
Data columns (total 5 columns):
일자      189608 non-null datetime64[ns]
요일      189608 non-null object
시간대     189608 non-null int64
업종      189608 non-null object
통화건수    189608 non-null int64
dtypes: datetime64[ns](1), int64(2), object(2)
memory usage: 8.7+ MB

업종과 요일이 제대로 분류가 되어있는지 확인하자

In [37]:
concatA['업종'].unique()
Out[37]:
array(['피자전문', '음식점-족발/보쌈전문', '음식점-중국음식', '치킨', '피자', '족발/보쌈전문', '중국음식'],
      dtype=object)
In [38]:
concatA['요일'].unique()
Out[38]:
array(['일', '월', '화', '수', '목', '금', '토'], dtype=object)

업종은 피자, 족발/보쌈, 중국음식이 2가지로 나눠져 있다.
이를 한 가지로 합쳐주는 작업을 하자.

위에서 나올 수 있는 7가지 경우에 대해서 각각 어떤 이름으로 바꿀지 딕셔너리를 만들어 주자.
바꿀 단어는 앞에 바뀔 단어는 뒤에

In [40]:
food={'족발/보쌈전문':'족발/보쌈전문','중국음식':'중국음식','치킨':'치킨','피자전문':'피자',
      '음식점-족발/보쌈전문':'족발/보쌈전문','음식점-중국음식':'중국음식','피자':'피자'}

apply 함수를 이용하여 업종컬럼에 있는 각 단어들을 원하는 단어로 바꿔주자

In [41]:
concatA['업종']=concatA['업종'].apply(lambda x: food[x.lower()])

그래프를 seaborn 라이브러리를 이용하여 그리겠다.

In [42]:
import seaborn as sns
from scipy import stats

연도, 월, 일 컬럼을 추가하자

In [43]:
concatA["year"] = concatA["일자"].dt.year
concatA["month"] = concatA['일자'].dt.month
concatA["day"] = concatA["일자"].dt.day

Delivery=concatA.sort_values('일자')
Delivery.head()
Out[43]:
일자 요일 시간대 업종 통화건수 year month day
0 2013-08-01 0 족발/보쌈전문 115 2013 8 1
66 2013-08-01 19 치킨 3005 2013 8 1
65 2013-08-01 18 치킨 2226 2013 8 1
64 2013-08-01 17 치킨 1270 2013 8 1
63 2013-08-01 16 치킨 851 2013 8 1

한글폰트가 깨지지 않도록~

In [45]:
%matplotlib inline

import platform

path = "c:/Windows/Fonts/malgun.ttf"
from matplotlib import font_manager, rc
if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Unknown system... sorry~~~~')

missingno 라이브러리를 이용해 null값이 있는지 확인할 수 있다. null값이 있으면 바코드처럼 하얀 선이 그러진다. 하얀선이 나타나면 하얀선 위치를 보고 null값의 위치를 파악할 수 있다.

In [46]:
import missingno as msno

msno.matrix(Delivery, figsize=(12,5))
Out[46]:
<matplotlib.axes._subplots.AxesSubplot at 0x256a984fd30>

년도별, 월별, 일별, 시간별, 요일별, 업종별 통화건수 막대그래프를 그려보자.
y축은 평균 통화건수를 의미한다.

In [47]:
figure, ((ax1,ax2,ax3), (ax4,ax5,ax6)) = plt.subplots(nrows=2, ncols=3)
figure.set_size_inches(18,8)

sns.barplot(data=Delivery, x="year", y="통화건수", ax=ax1)
sns.barplot(data=Delivery, x="month", y="통화건수", ax=ax2)
sns.barplot(data=Delivery, x="day", y="통화건수", ax=ax3)
sns.barplot(data=Delivery, x="시간대", y="통화건수", ax=ax4)
sns.barplot(data=Delivery, x="요일", y="통화건수", ax=ax5)
sns.barplot(data=Delivery, x="업종", y="통화건수", ax=ax6)
Out[47]:
<matplotlib.axes._subplots.AxesSubplot at 0x2569b689b70>

년도가 지날수록 통화건수가 점점 줄어든다.
선선한 날씨인 8~10월에 가장 많은 통화를 한다는 것을 알 수 있다.
일별 통화량은 31일에 특히 통화건수가 많다는 것을 볼 수 있다.
하루중에 점심시간12~1시와 6시,7시 전후로 통화건수가 많음을 확인할 수 있다.
요일별로는 주말과 금요일이 통화건수가 많다.
업종별로는 치킨과 중국음식이 압도적으로 많음을 확인할 수 있다.

그래프를 조금 더 세부적으로 그려보자.
시간대-통화건수 그래프를 업종, 요일, 월별로 나눠보고, 일별-통화건수 그래프를 업종별로 나눠보자.

In [48]:
fig,(ax1,ax2,ax3,ax4,ax5)= plt.subplots(nrows=5)
fig.set_size_inches(18,25)

sns.pointplot(data=Delivery, x="시간대", y="통화건수", ax=ax1)

sns.pointplot(data=Delivery, x="시간대", y="통화건수", hue="업종", ax=ax2)

sns.pointplot(data=Delivery, x="시간대", y="통화건수", hue="요일", ax=ax3)

sns.pointplot(data=Delivery, x="시간대", y="통화건수", hue="month", ax=ax4)

sns.pointplot(data=Delivery, x="day", y="통화건수", hue="업종", ax=ax5)
Out[48]:
<matplotlib.axes._subplots.AxesSubplot at 0x256a05fb438>

시간대-통화건수를 업종별로 나타낸 그래프를 통해 재미있는 결과를 확인할 수 있다. 점심시간대에는 중국음식의 통화량이 압도적으로 많고, 저녁 시간에는 치킨이 중국음식의 통화량 보다 조금 더 많은 경향이 있다. 하지만 치킨은 저녁 시간부터 자정이 될 때 까지 지속적으로 높은 통화건수를 기록하고 있다. 그리고 족발과 피자 통화건수는 아주적지만 그래도 재미있는 결과를 볼 수 있는데, 오전 10시부터 저녁이 될 때까지 통화량이 조금씩 증가하는 경향을 띈다는 것이다.

시간대-통화건수를 요일별로 나타낸 그래프에서도 재미있는 사실이 몇가지 있는데, 평일보다 주말 통화량이 많고 평일 그래프는 너무나도 비슷한 형태를 띄고 있다는 점. 그리고 금요일 토요일 그래프를 보면 7시 이후 통화량이 다른 요일보다 많은데, 아마도 다음날이 쉬는 날이다 보니 야식을 먹기 위해 통화를 하는 경우가 많다라고 추측이 된다.

시간대-통화건수를 월별로 나타낸 그래프에서는 저녁 6시 7시를 보면 그래프가 X가로 교차하고 있는 것을 볼 수 있다. 그래프 색깔을 잘 비교해보면 추운 계절에는 6시가 더 높고 더운 계절에는 7시가 더 높은데 해가 떨어지는 시간도 저녁시간에 영향을 주는 요인인 것 같다.

일별-통화건수를 업종별로 나타낸 그래프를 보면 그래프가 전체적으로 평탄하지만 31일에 치킨 통화건수만 많다는 것을 볼 수 있다. 31일이 많다는것이 월 말을 기념하는 사람들이 많아서 그럴까? 아니면 12월 31일 같은 년 말을 기념하는 날 때문에 그럴까? 31일은 일년에 7번 밖에 없기때문에 12월 31일 같은 날 때문에 평균 통화량에 큰 영향을 줄 것 같기도 하다. 이 부분은 더 조사해 봐야겠다.

다음은 요일별-통화건수와 월별-통화건수를 업종별로 분석해 보았다.

In [49]:
fig,(ax1,ax2)= plt.subplots(nrows=2)
fig.set_size_inches(18,10)

sns.pointplot(data=Delivery, x="요일", y="통화건수", hue="업종", ax=ax1)

sns.pointplot(data=Delivery, x="month", y="통화건수", hue="업종", ax=ax2)
Out[49]:
<matplotlib.axes._subplots.AxesSubplot at 0x256b37e53c8>

위에서 분석했던 내용과 큰 차이가 없다.

전체적으로 시간이 지나며 어떤 추이를 보이는지 알기 위해 이번에는 데이터에 year_month 컬럼을 추가해 보자.

In [93]:
def concatenate_year_month(datetime):
    return "{0}-{1}".format(datetime.year, datetime.month)

Delivery["year_month"] = Delivery["일자"].apply(concatenate_year_month)

print(Delivery.shape)
Delivery[["일자", "year_month"]].head()
(189608, 9)
Out[93]:
일자 year_month
0 2013-08-01 2013-8
66 2013-08-01 2013-8
65 2013-08-01 2013-8
64 2013-08-01 2013-8
63 2013-08-01 2013-8

년별-통화건수를 업종별로 년_월별-통화건수를 업종별로 나타낸 그래프를 그려봤다.

In [53]:
fig,(ax1,ax2)= plt.subplots(nrows=2)
fig.set_size_inches(18,10)

sns.pointplot(data=Delivery, x='year', y="통화건수", hue="업종", ax=ax1)

sns.pointplot(data=Delivery, x='year_month', y="통화건수", hue="업종", ax=ax2)
plt.xticks(rotation=45)
Out[53]:
(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
        17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
        34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
        51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66]),
 <a list of 67 Text xticklabel objects>)

년별-통화건수 그래프를 통해서는 통화건수가 점점 줄어들는 것을 볼 수 있다. 여기에는 여러가지 요인이 있을 수 있는데, 요식업계 어플 사용량이 점점 증가하고 있는 점이 큰 이유 인 것 같다.
년_월별-통화건수 그래프를 보면 이상한점이 있다. 유난히 2013년 8,9월 2014년 9,10월의 데이터 값이 크게 나왔다. 위에서 분석했을때 8~10월이 선선한 계절이라 많이 팔렸다고 판단했었는데, 저 4개의 점이 특이점 역할을 한 것 같다는 생각이 든다. 이 부분에 대해서 조금 더 분석이 필요할 것 같다.

년_월별-통화량 그래프를 막대그래프로도 그려봤다.

In [54]:
fig, ax3 = plt.subplots(nrows=1, ncols=1)
fig.set_size_inches(18, 5)


sns.barplot(data=Delivery, x="year_month", y="통화건수", ax=ax3)
plt.xticks(rotation=45)
Out[54]:
(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
        17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
        34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
        51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66]),
 <a list of 67 Text xticklabel objects>)

그래프가 점차 감소하는 추세인데 2014-9와 2014-10만 뾰족하게 솟아있다.
데이터가 더 추가된건 아닌지 8월부터 11월까지 데이터 수를 검사해보자.

In [89]:
Delivery[Delivery['year_month']=='2014-8'].info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2941 entries, 61 to 2883
Data columns (total 9 columns):
일자            2941 non-null datetime64[ns]
요일            2941 non-null object
시간대           2941 non-null int64
업종            2941 non-null object
통화건수          2941 non-null int64
year          2941 non-null int64
month         2941 non-null int64
day           2941 non-null int64
year_month    2941 non-null object
dtypes: datetime64[ns](1), int64(5), object(3)
memory usage: 229.8+ KB
In [90]:
Delivery[Delivery['year_month']=='2014-9'].info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2831 entries, 63 to 2769
Data columns (total 9 columns):
일자            2831 non-null datetime64[ns]
요일            2831 non-null object
시간대           2831 non-null int64
업종            2831 non-null object
통화건수          2831 non-null int64
year          2831 non-null int64
month         2831 non-null int64
day           2831 non-null int64
year_month    2831 non-null object
dtypes: datetime64[ns](1), int64(5), object(3)
memory usage: 221.2+ KB
In [91]:
Delivery[Delivery['year_month']=='2014-10'].info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2946 entries, 62 to 2913
Data columns (total 9 columns):
일자            2946 non-null datetime64[ns]
요일            2946 non-null object
시간대           2946 non-null int64
업종            2946 non-null object
통화건수          2946 non-null int64
year          2946 non-null int64
month         2946 non-null int64
day           2946 non-null int64
year_month    2946 non-null object
dtypes: datetime64[ns](1), int64(5), object(3)
memory usage: 230.2+ KB
In [92]:
Delivery[Delivery['year_month']=='2014-11'].info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2853 entries, 64 to 2784
Data columns (total 9 columns):
일자            2853 non-null datetime64[ns]
요일            2853 non-null object
시간대           2853 non-null int64
업종            2853 non-null object
통화건수          2853 non-null int64
year          2853 non-null int64
month         2853 non-null int64
day           2853 non-null int64
year_month    2853 non-null object
dtypes: datetime64[ns](1), int64(5), object(3)
memory usage: 222.9+ KB

데이터 수는 31일 기준 최대 2976개, 30일 기준 최대 2880개이므로 데이터가 중복해서 들어간 것 같지 않다.

In [88]:
fig,(ax1,ax2,ax3,ax4)= plt.subplots(nrows=4)
fig.set_size_inches(18,10)

sns.pointplot(data=Delivery[Delivery['year_month']=='2014-8'], x="day", y="통화건수", hue="업종", ax=ax1)

sns.pointplot(data=Delivery[Delivery['year_month']=='2014-9'], x="day", y="통화건수", hue="업종", ax=ax2)

sns.pointplot(data=Delivery[Delivery['year_month']=='2014-10'], x="day", y="통화건수", hue="업종", ax=ax3)

sns.pointplot(data=Delivery[Delivery['year_month']=='2014-11'], x="day", y="통화건수", hue="업종", ax=ax4)
Out[88]:
<matplotlib.axes._subplots.AxesSubplot at 0x256ccf225c0>

지금 흐름과는 상관 없는 정보인데 재미있는게 보인다.
2014년 9월 8일이 중국음식이 유난히 안팔렸다.
왜 그런지 조사해 보자

In [104]:
Delivery[(Delivery['일자']=='2014-09-08')&(Delivery['시간대']>=9)].sort_values('시간대')
Out[104]:
일자 요일 시간대 업종 통화건수 year month day year_month
690 2014-09-08 9 치킨 5 2014 9 8 2014-9
691 2014-09-08 9 피자 5 2014 9 8 2014-9
689 2014-09-08 9 중국음식 24 2014 9 8 2014-9
688 2014-09-08 9 족발/보쌈전문 6 2014 9 8 2014-9
695 2014-09-08 10 피자 22 2014 9 8 2014-9
692 2014-09-08 10 족발/보쌈전문 8 2014 9 8 2014-9
694 2014-09-08 10 치킨 12 2014 9 8 2014-9
693 2014-09-08 10 중국음식 70 2014 9 8 2014-9
696 2014-09-08 11 족발/보쌈전문 12 2014 9 8 2014-9
697 2014-09-08 11 중국음식 200 2014 9 8 2014-9
698 2014-09-08 11 치킨 52 2014 9 8 2014-9
699 2014-09-08 11 피자 160 2014 9 8 2014-9
703 2014-09-08 12 피자 324 2014 9 8 2014-9
702 2014-09-08 12 치킨 204 2014 9 8 2014-9
701 2014-09-08 12 중국음식 256 2014 9 8 2014-9
700 2014-09-08 12 족발/보쌈전문 18 2014 9 8 2014-9
704 2014-09-08 13 족발/보쌈전문 38 2014 9 8 2014-9
705 2014-09-08 13 중국음식 334 2014 9 8 2014-9
707 2014-09-08 13 피자 478 2014 9 8 2014-9
706 2014-09-08 13 치킨 352 2014 9 8 2014-9
708 2014-09-08 14 족발/보쌈전문 44 2014 9 8 2014-9
711 2014-09-08 14 피자 496 2014 9 8 2014-9
709 2014-09-08 14 중국음식 290 2014 9 8 2014-9
710 2014-09-08 14 치킨 520 2014 9 8 2014-9
712 2014-09-08 15 족발/보쌈전문 78 2014 9 8 2014-9
714 2014-09-08 15 치킨 668 2014 9 8 2014-9
713 2014-09-08 15 중국음식 262 2014 9 8 2014-9
715 2014-09-08 15 피자 460 2014 9 8 2014-9
719 2014-09-08 16 피자 498 2014 9 8 2014-9
718 2014-09-08 16 치킨 1090 2014 9 8 2014-9
717 2014-09-08 16 중국음식 328 2014 9 8 2014-9
716 2014-09-08 16 족발/보쌈전문 86 2014 9 8 2014-9
720 2014-09-08 17 족발/보쌈전문 148 2014 9 8 2014-9
721 2014-09-08 17 중국음식 468 2014 9 8 2014-9
723 2014-09-08 17 피자 646 2014 9 8 2014-9
722 2014-09-08 17 치킨 1624 2014 9 8 2014-9
726 2014-09-08 18 치킨 2952 2014 9 8 2014-9
727 2014-09-08 18 피자 862 2014 9 8 2014-9
725 2014-09-08 18 중국음식 474 2014 9 8 2014-9
724 2014-09-08 18 족발/보쌈전문 218 2014 9 8 2014-9
730 2014-09-08 19 치킨 4370 2014 9 8 2014-9
731 2014-09-08 19 피자 964 2014 9 8 2014-9
729 2014-09-08 19 중국음식 272 2014 9 8 2014-9
728 2014-09-08 19 족발/보쌈전문 218 2014 9 8 2014-9
732 2014-09-08 20 족발/보쌈전문 176 2014 9 8 2014-9
733 2014-09-08 20 중국음식 152 2014 9 8 2014-9
734 2014-09-08 20 치킨 4358 2014 9 8 2014-9
735 2014-09-08 20 피자 812 2014 9 8 2014-9
738 2014-09-08 21 치킨 3704 2014 9 8 2014-9
736 2014-09-08 21 족발/보쌈전문 98 2014 9 8 2014-9
737 2014-09-08 21 중국음식 90 2014 9 8 2014-9
739 2014-09-08 21 피자 526 2014 9 8 2014-9
742 2014-09-08 22 치킨 3340 2014 9 8 2014-9
743 2014-09-08 22 피자 330 2014 9 8 2014-9
740 2014-09-08 22 족발/보쌈전문 112 2014 9 8 2014-9
741 2014-09-08 22 중국음식 32 2014 9 8 2014-9
746 2014-09-08 23 치킨 1938 2014 9 8 2014-9
745 2014-09-08 23 중국음식 24 2014 9 8 2014-9
744 2014-09-08 23 족발/보쌈전문 58 2014 9 8 2014-9
747 2014-09-08 23 피자 100 2014 9 8 2014-9

조사해보니 중국집 강세인 점심때도 유난히 안팔렸다.
무슨날인지 찾아보니, 추석 당일 이었다.

In [119]:
Delivery_cfood08_sum=Delivery[(Delivery['year_month']=='2014-8')&(Delivery['업종']=='중국음식')]['통화건수'].sum()
Delivery_cfood08_sum
Out[119]:
550660
In [121]:
cfood08=pd.read_csv('CALL_CFOOD_8MONTH.csv')
cfood08['이용건수'].sum()
Out[121]:
533909
In [111]:
Delivery_cfood09_sum=Delivery[(Delivery['year_month']=='2014-9')&(Delivery['업종']=='중국음식')]['통화건수'].sum()
Delivery_cfood09_sum
Out[111]:
910083
In [112]:
cfood09=pd.read_csv('CALL_CFOOD_9MONTH.csv')
cfood09['통화건수'].sum()
Out[112]:
881412
In [113]:
Delivery_cfood10_sum=Delivery[(Delivery['year_month']=='2014-10')&(Delivery['업종']=='중국음식')]['통화건수'].sum()
Delivery_cfood10_sum
Out[113]:
1006292
In [114]:
cfood10=pd.read_csv('CALL_CFOOD_10MONTH.csv')
cfood10['통화건수'].sum()
Out[114]:
974836
In [122]:
Delivery_cfood11_sum=Delivery[(Delivery['year_month']=='2014-11')&(Delivery['업종']=='중국음식')]['통화건수'].sum()
Delivery_cfood11_sum
Out[122]:
514525
In [123]:
cfood11=pd.read_csv('CALL_CFOOD_11MONTH.csv')
cfood11['통화건수'].sum()
Out[123]:
499648
In [124]:
Delivery_chicken08_sum=Delivery[(Delivery['year_month']=='2014-8')&(Delivery['업종']=='치킨')]['통화건수'].sum()
Delivery_chicken08_sum
Out[124]:
660948
In [126]:
chicken08=pd.read_csv('CALL_CHICKEN_8MONTH.csv')
chicken08['이용건수'].sum()
Out[126]:
644802
In [115]:
Delivery_chicken09_sum=Delivery[(Delivery['year_month']=='2014-9')&(Delivery['업종']=='치킨')]['통화건수'].sum()
Delivery_chicken09_sum
Out[115]:
1128171
In [116]:
chicken09=pd.read_csv('CALL_CHICKEN_9MONTH.csv')
chicken09['통화건수'].sum()
Out[116]:
1100961
In [117]:
Delivery_chicken10_sum=Delivery[(Delivery['year_month']=='2014-10')&(Delivery['업종']=='치킨')]['통화건수'].sum()
Delivery_chicken10_sum
Out[117]:
1255270
In [118]:
chicken10=pd.read_csv('CALL_CHICKEN_10MONTH.csv')
chicken10['통화건수'].sum()
Out[118]:
1225187
In [127]:
Delivery_chicken11_sum=Delivery[(Delivery['year_month']=='2014-11')&(Delivery['업종']=='치킨')]['통화건수'].sum()
Delivery_chicken11_sum
Out[127]:
636948
In [128]:
chicken11=pd.read_csv('CALL_CHICKEN_11MONTH.csv')
chicken11['통화건수'].sum()
Out[128]:
623059

가장 많은 판매량을 가지고 있는 치킨과 중국집에 대해 수집해놓은 다른 파일의 결과와 비교해 봤지만 값에 큰 차이는 없다
그렇다고 9월 10월 데이터를 믿기에는 근처 다른 달(月)과 차이가 너무 크다.
검색해 보았지만 9월 10월에 주문량이 오를만한 특별한 이벤트가 없었고, 주문 음식 4종이 모두 증가했다는건 데이터 수집 방법에서 잘못되지 않았나 싶다.

2014년 11월부터 데이터를 모아서 월별-통화건수와 년_월별-통화건수를 업종별로 그려보자

In [140]:
Delivery201411=Delivery[(Delivery['year']>=2015)|(Delivery['year_month']=='2014-11')|(Delivery['year_month']=='2014-12')]
Delivery201411.head()
Out[140]:
일자 요일 시간대 업종 통화건수 year month day year_month
64 2014-11-01 16 족발/보쌈전문 194 2014 11 1 2014-11
65 2014-11-01 16 중국음식 1306 2014 11 1 2014-11
66 2014-11-01 16 치킨 1142 2014 11 1 2014-11
71 2014-11-01 17 피자 852 2014 11 1 2014-11
68 2014-11-01 17 족발/보쌈전문 376 2014 11 1 2014-11
In [138]:
fig,(ax1,ax2)= plt.subplots(nrows=2)
fig.set_size_inches(18,10)

sns.pointplot(data=Delivery201411, x='month', y="통화건수", hue="업종", ax=ax1)

sns.pointplot(data=Delivery201411, x='year_month', y="통화건수", hue="업종", ax=ax2)
plt.xticks(rotation=45)
Out[138]:
(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
        17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
        34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
        51]), <a list of 52 Text xticklabel objects>)

전체적인 그래프를 보면 12월 통화량이 다른 월보다 많은 편이라는 것을 알 수 있다. 그리고 족발과 피자는 16년 6월을 기점으로 통화량이 크게 증가후 서서희 감소하는 것을 볼 수 있다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함