티스토리 뷰
지난 블로그: [서울시 먹거리 분석] - 1월 치킨 판매업종 이용 통화량 분석
https://jfun.tistory.com/82
이번에는 지난 블로그에 이어서 1월 치킨 판매 업종 통화량을 여러 각도로 보도록 해보자.
1. Data 확인¶
먼저 Data에 대한 전반적인 확인을 해보자.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('CALL_CHICKEN_01MONTH.csv')
data.head()
모든 날짜가 나타나 있는지 확인하자¶
d2=data['기준일'].unique()
d2, len(d2)
len(d2)가 31개이므로 빠진 날짜는 없다.
날짜를 숫자열이 아닌 날짜열로 바꿔보자¶
data.dtypes
pd.to_datetime(d2,format='%Y%m%d')
대부분의 날짜 형식은 datetime을 이용하면 날짜열로 바꿔줄수 있다.
제대로 안되는경우 문자열로 바꿔준 다음 날짜열로 바꿔보던가, 아니면 format을 이용해본다.
d3 = d2.astype('float')
2. 빠진 정보가 없는지 확인해 보자.¶
null값 판단방법1¶
data.info()
- RangeIndex: 29850 entries, 0 to 29849
0부터 29849까지 총 29850개의 데이터가 있음을 의미 - 모든 데이터가 29850개 이머 non-null이므로 데이터가 빠짐 없이 존재함을 알 수 있다.
null값 판단방법2¶
d1=data.isnull()
d1.head()
df.isnull()을 하면 모든 데이터에 대해서 null값일 경우 True, 아니면 False로 처리한다.
반면 df.notnull()을 하면 반대로 처리한다.
d1.sum()
위에서 bull값으로 처리한 데이터를 열(column)별로 더하는 작업이다. True=1, False=0을 의미한다.
더했을때 값이 0이 나오므로 이를 통해서도 null값이 없음을 알 수 있다.
3.어떻게 분석을 해볼까? 도메인 지식!¶
이제 이 데이터를 어떻게 다룰지 방향을 잡아보자. 데이터를 다룰때는 도메인 지식을 가지고 있어야지만 데이터에 의미를 부여할 수 있다. 우리가 알고 있는 약간의 지식을 활용하여 질문을 던져보자.
통화건수에 요일은 영향을 미칠까?
금요일이나 토요일에 가장 많은 주문을 할 것 같다.연령에 따라 통화 건수의 차이가 클까?
금전적으로 여유가 있는 30대 40대가 더 많은 주문을 할 것 같다.스포츠 경기나 중요 행사등이 영향을 미칠까?
1월에 있었던 아시안게임의 축구경기가 영향을 미쳤을 것 같다.
4.분석을 위해 Data를 구축해 보자¶
Groupby
https://rfriend.tistory.com/383
집단별 크기는 grouped.size(), 집단별 합계는 grouped.sum(), 집단별 평균은 grouped.mean() 을 사용
from PIL import Image
img = Image.open('Groupby.jpg')
size=(500,500)
img.thumbnail(size) # 불러온 이미지를 사이즈에 맞춰 조절
img
이제 Data를 group by를 이용하여 요약해 보자.
요일은 보기 좋게 순서대로 나오도록 설정하자.
다음은 groupby의 구조가 딕셔너리라는 점을 이용해서 for문을 짜봤다.
week = data['통화건수'].groupby(data['요일'])
W = week.sum()
week_s = {}
for w in ['월','화','수','목','금','토','일']:
week_s[w] = W[w]
week_s
인덱서를 사용해 나타내보자.
loc : 라벨값 기반의 2차원 인덱싱
iloc : 순서를 나타내는 정수 기반의 2차원 인덱싱
loc인덱서를 이용해 나타내 보았다.
여기서는 이게 베스트 인듯.
loc 인덱서를 사용하려면 df.loc[행 인덱스, 열 인덱스]와 같은 형태로 사용한다.
https://datascienceschool.net/view-notebook/704731b41f794b8ea00768f5b0904512/
week = data['통화건수'].groupby(data['요일'])
W = week.sum()
W.loc[['월','화','수','목','금','토','일']]
책에서 보고 따라한건데 ix인덱서는 loc 인덱서와 iloc 인덱서로 대체 되었나보다.
week = data['통화건수'].groupby(data['요일'])
W = week.sum()
W.ix[['월','화','수','목','금','토','일']]
연령대별로 요약해보자
age = data['통화건수'].groupby(data['연령대'])
age.sum()
피벗테이블을 이용해 요일과 연령대 정보를 통합하여 통화건수 정보를 추출해 보았다.¶
data1=data[['요일','연령대','통화건수']]
data1.head()
data1=data.pivot_table(values='통화건수',index='요일',columns='연령대', aggfunc=sum, margins=True).loc[['월','화','수','목','금','토','일']]
data1
순서를 세기 위해 'All' 컬럼을 삭제하자.
data2 = data1.drop('All',axis=1)
data2
data2.idxmax(axis=0)
data2.idxmax(axis=1)
이 정보를 통해 40대가 가장 많이 주문 했음을, 그리고 토요일에 가장 많이 주문 했음을 알 수 있다.
한눈에 보기 좋게 전체 데이터를 나열해보자.¶
data3=np.array(data2)
np.sort(data3) , len(data3)*6
I=[]
labels1 = ['10대','20대','30대','40대','50대','60대이상']
labels2 = ['월','화','수','목','금','토','일']
for i in range(5):
for j in range(6):
I.append([data3[j,i], labels1[i], labels2[j]])
np.array(I)
data4 = pd.DataFrame(I)
data4.rename(columns = {data4.columns[0] : '총 통화건수',
data4.columns[1] : '연령대',
data4.columns[2] : '요일'}, inplace = True)
data4.sort_values('총 통화건수', ascending=False).head(15)
40대 다음으로 30대 20대 순으로 주문량이 많았음을 한눈에 알아볼 수 있다.
30대 40대의 치킨주문량이 많은 이유는 금전적으로 여유가 있기 때문인것 같다.
그리고 사회활동이 왕성한 30대보다 40대 치킨 주문량이 많은것에 대해 의아하게 생각할 수 있는데, 40대의 경우 자녀들이 부모님의 핸드폰으로 치킨을 주문하는 경우가 있기 때문인 것 같다.
아시안컵 대한민국 축구 일정에 따른 주문건수 분석¶
- 1차전
대한민국:필리핀
20190107 (월) 오후 10:30
- 2차전
대한민국:키르기스스탄
20190112 (토) 오전 01:00
- 3차전
대한민국:중국
20190116 (수) 오후 10:30
- 16강
대한민국:바레인
20190122 (화) 오후 10:00
- 8강
대한민국:카타르
20190125 (금) 오후 10:00
신기하게도 모든 축구경기 요일이 다르기 때문에, 각 축구경기가 있던 날의 주문량과 각 요일의 평균을 비교해보면 뻔하면서도 재미있는 결과를 알 수 있을 것 같다.
위 데이터를 이용하여 DataFrame을 만들어보자.
Asia = {'경기일':[20190107,20190112,20190116,20190122 ,20190125 ],
'경기국가':['대한민국:필리핀', '대한민국:키르기스스탄','대한민국:중국','대한민국:바레인','대한민국:카타르'],
'요일':['월','토','수','화','금']}
Asia_df = pd.DataFrame(Asia)
Asia_df
전체 데이터에서 해당 날짜 데이터만 가져오자
year = Asia_df['경기일']
data['기준일'].isin(year)
data_soccer = data[data['기준일'].isin(year)]
data_soccer.head(10)
data_soccer_G = data_soccer['통화건수'].groupby(data_soccer['기준일'])
data_soccer_G.sum()
I=[]
for i in np.array(data_soccer_G.sum()):
I.append(i)
Asia_df['주문량']=I
Asia_df
week = data['통화건수'].groupby(data['요일'])
W2 = week.sum()
W3=W2.loc[['월','토','수','화','금']]
J=[]
for i in np.array(W3):
J.append(i)
J
평균을 구하기 위해 한달간 요일별로 몇 일이 있는지 구해보자.
data_z=data.drop_duplicates(['기준일'])
data_z.head(5)
data_y=data_z['기준일'].groupby(data_z['요일'])
data_y.count()
1월은 월요일, 금요일, 토요일 4번, 화요일, 수요일 5번 있었으므로 각각 나눠주자.
Asia_df['평균주문량']=[38808/4, 64817/4, 55211/5, 59152/5, 63117/4]
Asia_df
처음 두 경기는 평균 주문량보다 조금 더 많이 주문받은 정도 였지만, 16강의 명운이 달린 3번째 경기부터는 치킨주문량이 대폭 늘었으며, 그 후 16강 그리고 8강으로 더 높은 경기를 할수록 사람들이 기대감에 더 많은 시청을 하게 되고 그로인해 더 많은 치킨을 주문받은 것으로 보인다.
'beginner > 데이터 분석 스터디' 카테고리의 다른 글
[서울시 먹거리 분석 – 4] 전체 판매업종 이용 통화량 분석 (0) | 2019.04.02 |
---|---|
[서울시 먹거리 분석 – 3] 1월 중국집 판매업종 이용 통화량 분석 (0) | 2019.03.25 |
Plot 스터디 (0) | 2019.03.02 |
[서울시 먹거리 분석] - 1월 치킨 판매업종 이용 통화량 분석 (0) | 2019.02.27 |