ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python 데이터분석 기초 45 - 관광정보 자료로 상관관계 분석(예제)
    Python 데이터 분석 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개국 상관계수로 시각화

     

     

     

     

     

     

     

     

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

     

    댓글

Designed by Tistory.