Python 데이터 분석
Python 데이터분석 기초 45 - 관광정보 자료로 상관관계 분석(예제)
코딩탕탕
2022. 11. 10. 15:35
# data.go.kr 제공 관광정보 자료로 상관관계 분석
# 미국, 중국, 일본 관광객이 국내 유료관광지(5대 궁) 방문관련
import json
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rc('font', family = 'malgun gothic')
# 그래프 작성용 함수
def makeGraph(tour_table, all_table, tourPoint):
# 계산할 관광지명에 해당하는 자료만 뽑아 외국인 관광객 자료와 합치기
tour = tour_table[tour_table['resNm'] == tourPoint]
# print(tour)
# resNm ForNum
# yyyymm
# 201101 창덕궁 14137
# 201102 창덕궁 18114
merge_table = pd.merge(tour, all_table, left_index = True, right_index = True)
print(merge_table)
# resNm ForNum china japan usa
# yyyymm
# 201101 창덕궁 14137 91252 209184 43065
# 201102 창덕궁 18114 140571 230362 41077
# 상관계수를 구하고 3개국 선포도 시각화
fig = plt.figure()
fig.suptitle(tourPoint + '상관관계 분석')
plt.subplot(1,3,1)
plt.xlabel('중국인 입국자 수')
plt.ylabel('중국인 입장객 수')
lamb1 = lambda p:merge_table['china'].corr(merge_table['ForNum'])
r1 = lamb1(merge_table)
# print('r1 : ', r1)
plt.title('r={:.5f}'.format(r1))
plt.scatter(merge_table['china'], merge_table['ForNum'], alpha=0.8, s=6, c='red') # 여기서 alpha는 투명도이다.
plt.subplot(1,3,2)
plt.xlabel('일본인 입국자 수')
plt.ylabel('일본인 입장객 수')
lamb2 = lambda p:merge_table['japan'].corr(merge_table['ForNum'])
r2 = lamb2(merge_table)
# print('r2 : ', r2)
plt.title('r={:.5f}'.format(r2))
plt.scatter(merge_table['japan'], merge_table['ForNum'], alpha=0.8, s=6, c='green') # 여기서 alpha는 투명도이다.
plt.subplot(1,3,3)
plt.xlabel('미국인 입국자 수')
plt.ylabel('미국인 입장객 수')
lamb3 = lambda p:merge_table['usa'].corr(merge_table['ForNum'])
r3 = lamb3(merge_table)
# print('r3 : ', r3)
plt.title('r={:.5f}'.format(r3))
plt.scatter(merge_table['usa'], merge_table['ForNum'], alpha=0.8, s=6, c='blue') # 여기서 alpha는 투명도이다.
plt.tight_layout() # plot 사이의 공간을 자동 조절
plt.show()
return [tourPoint, r1, r2, r3]
def goGo():
# json 자료를 읽어 DataFrame에 담기
fname = '서울특별시_관광지입장정보_2011_2016.json'
jsonTP = json.loads(open(fname, mode = 'r', encoding = 'utf-8').read()) # json decoding str -> dict
# print(jsonTP)
tour_table = pd.DataFrame(jsonTP, columns =('yyyymm', 'resNm', 'ForNum')) # 년월, 관광지명, 입장객수
tour_table = tour_table.set_index('yyyymm')
print(tour_table)
# resNm ForNum
# yyyymm
# 201101 창덕궁 14137
resNm = tour_table.resNm.unique()
# print('resNm(관광지명) :', resNm)
print('resNm(관광지명) :', resNm[:5])
# 중국인 관광객 정보를 읽어 DataFrame에 담기
cdf = "중국인방문객.json"
jdata = json.loads(open(cdf, mode = 'r', encoding = 'utf-8').read())
# print(jdata)
china_table = pd.DataFrame(jdata, columns =('yyyymm', 'visit_cnt'))
china_table = china_table.rename(columns = {'visit_cnt' : 'china'})
china_table = china_table.set_index('yyyymm')
# print(china_table)
# china
# yyyymm
# 201101 91252
# 201102 140571
# 일본인 관광객 정보를 읽어 DataFrame에 담기
jdf = "일본인방문객.json"
jdata = json.loads(open(jdf, mode = 'r', encoding = 'utf-8').read())
# print(jdata)
japan_table = pd.DataFrame(jdata, columns =('yyyymm', 'visit_cnt'))
japan_table = japan_table.rename(columns = {'visit_cnt' : 'japan'})
japan_table = japan_table.set_index('yyyymm')
# 미국인 관광객 정보를 읽어 DataFrame에 담기
udf = "미국인방문객.json"
jdata = json.loads(open(udf, mode = 'r', encoding = 'utf-8').read())
# print(jdata)
usa_table = pd.DataFrame(jdata, columns =('yyyymm', 'visit_cnt'))
usa_table = usa_table.rename(columns = {'visit_cnt' : 'usa'})
usa_table = usa_table.set_index('yyyymm')
# 중국, 일본, 미국 DataFrame merge
all_table = pd.merge(left = china_table, right = japan_table, left_index = True, right_index = True)
all_table = pd.merge(all_table, usa_table, left_index = True, right_index = True)
# print(all_table[:3], ' ', len(all_table))
r_list=[]
for tourPoint in resNm[:5]:
r_list.append(makeGraph(tour_table, all_table, tourPoint))
r_df =pd.DataFrame(r_list, columns=('고궁명', '중국', '일본', '미국'))
r_df=r_df.set_index('고궁명')
print(r_df)
print('고궁명별 3개국 상관계수로 시각화')
#r_df를 이용해서 막대그래프 그리기
r_df.plot(kind='bar', rot=60)
plt.show()
if __name__ == '__main__':
goGo()
<console>
resNm ForNum
yyyymm
201101 창덕궁 14137
201101 운현궁 0
201101 경복궁 40224
201101 창경궁 697
201101 종묘 6837
... ... ...
201609 국립중앙박물관 12218
201609 덕수궁 25843
201609 서대문자연사박물관 0
201609 트릭아이미술관 13677
201609 헌릉ㆍ인릉 17
[894 rows x 2 columns]
resNm(관광지명) : ['창덕궁' '운현궁' '경복궁' '창경궁' '종묘']
resNm ForNum china japan usa
yyyymm
201101 창덕궁 14137 91252 209184 43065
201102 창덕궁 18114 140571 230362 41077
201103 창덕궁 28749 141457 306126 54610
201104 창덕궁 33551 147680 239075 59616
201105 창덕궁 33678 154066 241695 59780
... ... ... ... ... ...
201605 창덕궁 52772 618083 188420 70891
201606 창덕궁 44328 315095 101206 62550
201607 창덕궁 41816 255632 81748 62627
201608 창덕궁 40729 513275 148632 63522
201609 창덕궁 43682 591242 157313 63793
[69 rows x 5 columns]
resNm ForNum china japan usa
yyyymm
201101 운현궁 0 91252 209184 43065
201102 운현궁 0 140571 230362 41077
201103 운현궁 0 141457 306126 54610
201104 운현궁 0 147680 239075 59616
201105 운현궁 0 154066 241695 59780
201106 운현궁 0 150119 231718 64412
201107 운현궁 0 195188 227541 59443
201108 운현궁 0 241987 262157 56377
201109 운현궁 0 176196 267886 56304
201110 운현궁 0 181428 302570 63956
201111 운현궁 0 136152 274889 49082
201112 운현궁 0 119061 229806 45167
201201 운현궁 1093 113927 196301 44152
201202 운현궁 1130 157019 221318 43500
201203 운현궁 1602 163261 268355 54135
201204 운현궁 2439 153875 220142 58220
201205 운현궁 2631 152347 234626 61077
201206 운현궁 1856 179508 254872 61208
201207 운현궁 1916 244573 275317 60522
201208 운현궁 1999 276299 325927 57817
201209 운현궁 3209 231462 321231 56103
201210 운현궁 2457 214681 340172 65158
201211 운현궁 1082 174164 331721 51094
201212 운현궁 546 159080 299069 48517
resNm ForNum china japan usa
yyyymm
201101 경복궁 40224 91252 209184 43065
201102 경복궁 44906 140571 230362 41077
201103 경복궁 73166 141457 306126 54610
201104 경복궁 89972 147680 239075 59616
201105 경복궁 80539 154066 241695 59780
... ... ... ... ... ...
201605 경복궁 303498 618083 188420 70891
201606 경복궁 276101 315095 101206 62550
201607 경복궁 352717 255632 81748 62627
201608 경복궁 283115 513275 148632 63522
201609 경복궁 211357 591242 157313 63793
[69 rows x 5 columns]
resNm ForNum china japan usa
yyyymm
201101 창경궁 697 91252 209184 43065
201102 창경궁 914 140571 230362 41077
201103 창경궁 1664 141457 306126 54610
201104 창경궁 1687 147680 239075 59616
201105 창경궁 1872 154066 241695 59780
... ... ... ... ... ...
201605 창경궁 5519 618083 188420 70891
201606 창경궁 3364 315095 101206 62550
201607 창경궁 3931 255632 81748 62627
201608 창경궁 3270 513275 148632 63522
201609 창경궁 5496 591242 157313 63793
[69 rows x 5 columns]
resNm ForNum china japan usa
yyyymm
201101 종묘 6837 91252 209184 43065
201102 종묘 8534 140571 230362 41077
201103 종묘 13186 141457 306126 54610
201104 종묘 13436 147680 239075 59616
201105 종묘 15798 154066 241695 59780
... ... ... ... ... ...
201605 종묘 10762 618083 188420 70891
201606 종묘 5564 315095 101206 62550
201607 종묘 6164 255632 81748 62627
201608 종묘 6094 513275 148632 63522
201609 종묘 8185 591242 157313 63793
[69 rows x 5 columns]
중국 일본 미국
고궁명
창덕궁 -0.058791 0.277444 0.402816
운현궁 0.445945 0.302615 0.281258
경복궁 0.525673 -0.435228 0.425137
창경궁 0.451233 -0.164586 0.624540
종묘 -0.583422 0.529870 -0.121127
고궁명별 3개국 상관계수로 시각화
상관관계를 활용하여 관광지 성향을 알 수 있다.