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개국 상관계수로 시각화

 

 

 

 

 

 

 

 

상관관계를 활용하여 관광지 성향을 알 수 있다.