티스토리 뷰
1. Data 확인¶
먼저 Data에 대한 전반적인 확인을 해 보자.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('CALL_CFOOD_2019_01MONTH.csv')
data.head()
모든 날짜가 나타나 있는지 확인하자¶
d2 =data['기준일'].unique()
d2, len(d2)
날짜를 숫자열이 아닌 날짜열로 바꿔보자¶
data.dtypes
data['기준일']=pd.to_datetime(data['기준일'],format='%Y%m%d')
data.head()
대부분의 날짜 형식은 datetime을 이용하면 날짜열로 바꿔줄수 있다.
제대로 안되는경우 문자열로 바꿔준 다음 날짜열로 바꿔보던가, 아니면 format을 이용해본다.
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대가 더 많은 주문을 할 것 같다.
4.분석을 위해 Data를 구축해 보자¶
이제 Data를 group by를 이용하여 요약해 보자.
요일은 보기 좋게 순서대로 나오도록 설정하자.
인덱서를 사용해 나타내보자.
loc : 라벨값 기반의 2차원 인덱싱
week = data['통화건수'].groupby(data['요일'])
W = week.sum()
week_s = []
for w in ['월','화','수','목','금','토','일']:
week_s.append([w,W[w]])
W1=pd.DataFrame(week_s)
W1.rename(columns = {W1.columns[0] : '요일',
W1.columns[1] : '통화건수'}, inplace = True)
W1
목,수,토,일 요일에 판매량이 높음을 알 수 있다.
연령대별로 요약해보자
age = data['통화건수'].groupby(data['연령대'])
age.sum()
40대의 중국집 통화량이 압도적으로 높음을 볼 수 있다. 그 다음은 30대와 50대.
피벗테이블을 이용해 요일과 연령대 정보를 통합하여 통화건수 정보를 추출해 보았다.¶
data1=data.pivot_table(values='통화건수',index='요일',columns='연령대',aggfunc=sum,margins=True).loc[['월','화','수','목','금','토','일']]
data1.head()
순서를 세기 위해 'All' 컬럼을 삭제하자.
data2=data1.drop('All',axis=1)
data2
data2.idxmax(axis=0)
data2.idxmax(axis=1)
이 정보를 통해 40대가 가장 많이 주문 했음을, 그리고 목요일에 가장 많이 주문 했음을 알 수 있다.
한눈에 보기 좋게 전체 데이터를 나열해보자.¶
data3=np.array(data2)
I=[]
labels1 = ['10대','20대','30대','40대','50대','60대이상']
labels2 = ['월','화','수','목','금','토','일']
for i in range(6):
for j in range(7):
I.append([data3[j,i], labels1[i], labels2[j]])
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대 50대 순으로 주문량이 많았음을 한눈에 알아볼 수 있다.
30대 40대의 중국집 주문량이 많은 이유는 금전적으로 여유가 있기 때문인것 같다. 그리고 지난번 치킨 분석때는 20대가 3번째로 많았던 것과는 다르게 50대 주문량이 많은 이유는, 치킨은 술과 함께 먹는 경우도 많지만 중국집 음식은 주로 식사로 먹기 때문이다.
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
data["year"] = data["기준일"].dt.year
data["month"] = data["기준일"].dt.month
data["day"] = data["기준일"].dt.day
data.shape
data.head()
%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~~~~')
w2=[]
for i in ['월','화','수','목','금','토','일']:
k=np.sum(data['요일']==i)
w2.append(k)
w2
W3 = pd.DataFrame({'요일' : ['월','화','수','목','금','토','일'], '통화건수' : w2})
W3
sex = data['통화건수'].groupby(data['성별'])
S = sex.sum()
sex1 = []
for s in ['남','여']:
sex1.append([s,S[s]])
S1=pd.DataFrame(sex1)
S1.rename(columns = {S1.columns[0] : '성별',
S1.columns[1] : '통화건수'}, inplace = True)
S1
age = data['통화건수'].groupby(data['연령대'])
A = age.sum()
age1 = []
for a in ['10대','20대','30대','40대','50대','60대이상']:
age1.append([a,A[a]])
A1=pd.DataFrame(age1)
A1.rename(columns = {A1.columns[0] : '연령대',
A1.columns[1] : '통화건수'}, inplace = True)
A1
figure, ((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2, ncols=2)
figure.set_size_inches(18,8)
sns.barplot(data=data, x="day", y="통화건수", ax=ax1)
sns.barplot(data=W1, x="요일", y="통화건수", ax=ax2)
sns.barplot(data=S1, x="성별", y="통화건수", ax=ax3)
sns.barplot(data=A1, x="연령대", y="통화건수", ax=ax4)
Re = np.unique(data['시군구'])
region = data['통화건수'].groupby(data['시군구'])
R = region.sum()
region1 = []
for r in Re:
region1.append([r,R[r]])
R1=pd.DataFrame(region1)
R1.rename(columns = {R1.columns[0] : '시군구',
R1.columns[1] : '통화건수'}, inplace = True)
R1.head()
figure.set_size_inches(18,8)
sns.barplot(data=R1, x="시군구", y="통화건수")
plt.xticks(rotation=90)
ddong = np.unique(data['읍면동'])
region2 = data['통화건수'].groupby(data['읍면동'])
R_ = region2.sum()
region3 = []
J=[]
for r in ddong:
if R_[r]>1000:
region3.append([r,R_[r]])
else:
J.append(r)
R2=pd.DataFrame(region3)
R2.rename(columns = {R2.columns[0] : '읍면동',
R2.columns[1] : '통화건수'}, inplace = True)
R2.head()
fig = plt.figure(figsize=[50,20])
sns.barplot(data=R2, x="읍면동", y="통화건수")
plt.xticks(fontsize=40,rotation=90)
print('')
'beginner > 데이터 분석 스터디' 카테고리의 다른 글
[서울시 먹거리 분석 – 4] 전체 판매업종 이용 통화량 분석 (0) | 2019.04.02 |
---|---|
[서울시 먹거리 분석 – 2] 1월 치킨 판매업종 이용 통화량 분석_2 (0) | 2019.03.17 |
Plot 스터디 (0) | 2019.03.02 |
[서울시 먹거리 분석] - 1월 치킨 판매업종 이용 통화량 분석 (0) | 2019.02.27 |