본문 바로가기
Programming/Python

[ 데이터 분석 실무 with python ] 1. 사드 배치의 영향으로 중국인 관광객이 얼마나 줄었을까?

by _S0_H2_ 2020. 5. 23.
728x90
반응형
THAAD
In [1]:
from IPython.core.display import display, HTML
display(HTML("<style> .container{width:90% !important;}</style>"))

한개의 파일

데이터 다운로드

In [2]:
! pip install xlrd
Collecting xlrd
  Downloading https://files.pythonhosted.org/packages/b0/16/63576a1a001752e34bf8ea62e367997530dc553b689356b9879339cf45a4/xlrd-1.2.0-py2.py3-none-any.whl (103kB)
Installing collected packages: xlrd
Successfully installed xlrd-1.2.0
In [26]:
import pandas as pd
kto_201901 = pd.read_excel('./datasalon-master/3_Tourists_Event/files/kto_201901.xlsx',
                          header = 1,
                          usecols = 'A:G',
                          skipfooter = 4) # pip install xlrd 해줘야 실행 가능하다
kto_201901.head()
Out[26]:
국적 관광 상용 공용 유학/연수 기타
0 아시아주 765082 10837 1423 14087 125521 916950
1 일본 198805 2233 127 785 4576 206526
2 대만 86393 74 22 180 1285 87954
3 홍콩 34653 59 2 90 1092 35896
4 마카오 2506 2 0 17 45 2570

데이터 확인

데이터 확인

In [27]:
kto_201901.shape
Out[27]:
(67, 7)
In [28]:
kto_201901.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 67 entries, 0 to 66
Data columns (total 7 columns):
국적       67 non-null object
관광       67 non-null int64
상용       67 non-null int64
공용       67 non-null int64
유학/연수    67 non-null int64
기타       67 non-null int64
계        67 non-null int64
dtypes: int64(6), object(1)
memory usage: 3.8+ KB
In [29]:
kto_201901.describe()
Out[29]:
관광 상용 공용 유학/연수 기타
count 67.00000 67.000000 67.000000 67.000000 67.000000 67.000000
mean 26396.80597 408.208955 132.507463 477.462687 5564.208955 32979.194030
std 102954.04969 1416.040302 474.406339 2009.484800 17209.438418 122821.369969
min 0.00000 0.000000 0.000000 0.000000 16.000000 54.000000
25% 505.00000 14.500000 2.500000 17.500000 260.000000 927.000000
50% 1304.00000 45.000000 14.000000 43.000000 912.000000 2695.000000
75% 8365.00000 176.500000 38.000000 182.000000 2824.500000 14905.500000
max 765082.00000 10837.000000 2657.000000 14087.000000 125521.000000 916950.000000

=> 관광의 목적으로 가장 많은 외국인이 입국하는 특징이 있을 것 같다

최소값이 0인 데이터 확인

관광, 상용, 공용, 유학/연수에서 최소값이 0인것이 있다. 어떤 파일인지 확인해보자.

In [30]:
# 각 컬럼에서 0인 부분을 필터링하자
mask = (kto_201901['관광'] == 0) | (kto_201901['상용'] == 0) | (kto_201901['공용'] == 0) | (kto_201901['유학/연수'] == 0)
kto_201901[mask]
Out[30]:
국적 관광 상용 공용 유학/연수 기타
4 마카오 2506 2 0 17 45 2570
20 이스라엘 727 12 0 9 57 805
22 우즈베키스탄 1958 561 0 407 2828 5754
38 스위스 613 18 0 19 97 747
45 그리스 481 17 4 0 273 775
46 포르투갈 416 14 0 13 121 564
51 크로아티아 226 12 0 3 250 491
54 폴란드 713 10 0 27 574 1324
59 대양주 기타 555 3 4 0 52 614
63 기타대륙 33 4 0 1 16 54
64 국적미상 33 4 0 1 16 54
65 교포소계 0 0 0 0 15526 15526
66 교포 0 0 0 0 15526 15526

교포는 기타로 등록되어있기 때문에 0이 4개이다.

데이터 전처리

데이터프레임에 기준년월 추가

In [31]:
kto_201901['기준년월'] = '2019-01'
In [32]:
kto_201901
Out[32]:
국적 관광 상용 공용 유학/연수 기타 기준년월
0 아시아주 765082 10837 1423 14087 125521 916950 2019-01
1 일본 198805 2233 127 785 4576 206526 2019-01
2 대만 86393 74 22 180 1285 87954 2019-01
3 홍콩 34653 59 2 90 1092 35896 2019-01
4 마카오 2506 2 0 17 45 2570 2019-01
... ... ... ... ... ... ... ... ...
62 아프리카 기타 768 718 90 206 908 2690 2019-01
63 기타대륙 33 4 0 1 16 54 2019-01
64 국적미상 33 4 0 1 16 54 2019-01
65 교포소계 0 0 0 0 15526 15526 2019-01
66 교포 0 0 0 0 15526 15526 2019-01

67 rows × 8 columns

국적 데이터만 남기기

In [33]:
kto_201901['국적'].unique()
Out[33]:
array(['아시아주', '일본', '대만', '홍콩', '마카오', '태국', '말레이시아', '필리핀', '인도네시아',
       '싱가포르', '미얀마', '베트남', '인도', '스리랑카', '파키스탄', '방글라데시', '캄보디아', '몽골',
       '중국', '이란', '이스라엘', '터키', '우즈베키스탄', '카자흐스탄', 'GCC', '아시아 기타', '미주',
       '미국', '캐나다', '멕시코', '브라질', '미주 기타', '구주', '영국', '독일', '프랑스',
       '네덜란드', '스웨덴', '스위스', '이탈리아', '덴마크', '노르웨이', '벨기에', '오스트리아', '스페인',
       '그리스', '포르투갈', '핀란드', '아일랜드', '우크라이나', '러시아', '크로아티아', '루마니아',
       '불가리아', '폴란드', '구주 기타', '대양주', '오스트레일리아', '뉴질랜드', '대양주 기타',
       '아프리카주', '남아프리카공화국', '아프리카 기타', '기타대륙', '국적미상', '교포소계', '교포'],
      dtype=object)

국적 column에 대륙이 포함되어있으므로 대륙은 제외해야한다.

대륙 mask를 만들어서 국적 column에서 지워주자

In [43]:
# 대륙 mask
continents = ['아시아주', '미주', '구주', '대양주', ' 아프리카주', '기타대륙', '국적미상','교포소계']
In [44]:
# 국적 column에서 대륙 mask지워주기
mask = ( kto_201901.국적.isin(continents) == False )
kto_201901_country = kto_201901[mask]
kto_201901_country['국적'].unique()
Out[44]:
array(['일본', '대만', '홍콩', '마카오', '태국', '말레이시아', '필리핀', '인도네시아', '싱가포르',
       '미얀마', '베트남', '인도', '스리랑카', '파키스탄', '방글라데시', '캄보디아', '몽골', '중국',
       '이란', '이스라엘', '터키', '우즈베키스탄', '카자흐스탄', 'GCC', '아시아 기타', '미국',
       '캐나다', '멕시코', '브라질', '미주 기타', '영국', '독일', '프랑스', '네덜란드', '스웨덴',
       '스위스', '이탈리아', '덴마크', '노르웨이', '벨기에', '오스트리아', '스페인', '그리스', '포르투갈',
       '핀란드', '아일랜드', '우크라이나', '러시아', '크로아티아', '루마니아', '불가리아', '폴란드',
       '구주 기타', '오스트레일리아', '뉴질랜드', '대양주 기타', '아프리카주', '남아프리카공화국',
       '아프리카 기타', '교포'], dtype=object)
In [45]:
# 남겨진 데이터를 확인해보자
kto_201901_country.head()
Out[45]:
국적 관광 상용 공용 유학/연수 기타 기준년월
1 일본 198805 2233 127 785 4576 206526 2019-01
2 대만 86393 74 22 180 1285 87954 2019-01
3 홍콩 34653 59 2 90 1092 35896 2019-01
4 마카오 2506 2 0 17 45 2570 2019-01
5 태국 34004 37 199 96 6998 41334 2019-01
In [46]:
# 인덱스를 재설정해주자 ( 0부터 시작하도록)
kto_201901_country_new = kto_201901_country.reset_index(drop=True)
kto_201901_country_new.head()
Out[46]:
국적 관광 상용 공용 유학/연수 기타 기준년월
0 일본 198805 2233 127 785 4576 206526 2019-01
1 대만 86393 74 22 180 1285 87954 2019-01
2 홍콩 34653 59 2 90 1092 35896 2019-01
3 마카오 2506 2 0 17 45 2570 2019-01
4 태국 34004 37 199 96 6998 41334 2019-01

대륙column을 만들자

image.png

엑셀로 각 대륙에 몇개국이 속해있는지 세어보니 다음과 같다.

아시아주 : 25

미주 : 5

구주(유럽) : 23

대양주(오세아니아) : 3

아프리카주 : 2

기타대륙 : 1

교포소계 : 1

대륙 column에 넣을 continents 리스트를 만들어보자

In [48]:
continents2 = ['아시아'] * 25 + ['아메리카'] * 5 + ['유럽'] * 23 + ['오세아니아'] * 3 + ['아프리카'] * 2 + ['기타대륙'] + ['교포']
In [49]:
print(continents2)
['아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아메리카', '아메리카', '아메리카', '아메리카', '아메리카', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '오세아니아', '오세아니아', '오세아니아', '아프리카', '아프리카', '기타대륙', '교포']

이렇게 만들어진 continents를 kto_201901_country_new 에 추가하자

In [52]:
kto_201901_country_new['대륙'] = continents2
kto_201901_country_new.tail()
Out[52]:
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙
55 대양주 기타 555 3 4 0 52 614 2019-01 오세아니아
56 아프리카주 1136 727 91 212 1524 3690 2019-01 아프리카
57 남아프리카공화국 368 9 1 6 616 1000 2019-01 아프리카
58 아프리카 기타 768 718 90 206 908 2690 2019-01 기타대륙
59 교포 0 0 0 0 15526 15526 2019-01 교포

데이터 분석

국적별 관광객 비율

In [53]:
kto_201901_country_new['관광객비율(%)'] = round(kto_201901_country_new['관광'] / kto_201901_country_new['계'] * 100, 1)
kto_201901_country_new.head()
Out[53]:
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%)
0 일본 198805 2233 127 785 4576 206526 2019-01 아시아 96.3
1 대만 86393 74 22 180 1285 87954 2019-01 아시아 98.2
2 홍콩 34653 59 2 90 1092 35896 2019-01 아시아 96.5
3 마카오 2506 2 0 17 45 2570 2019-01 아시아 97.5
4 태국 34004 37 199 96 6998 41334 2019-01 아시아 82.3
In [55]:
# 위를 내림차순으로 정렬해보자
kto_201901_country_new.sort_values(by = '관광객비율(%)', ascending=False).head()
Out[55]:
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%)
1 대만 86393 74 22 180 1285 87954 2019-01 아시아 98.2
3 마카오 2506 2 0 17 45 2570 2019-01 아시아 97.5
2 홍콩 34653 59 2 90 1092 35896 2019-01 아시아 96.5
0 일본 198805 2233 127 785 4576 206526 2019-01 아시아 96.3
55 대양주 기타 555 3 4 0 52 614 2019-01 오세아니아 90.4

대만, 마카오, 홍콩, 일본, 대양주 기타 국적의 국내 방문 외국인은 90% 이상이 관광을 목적으로 방문한다 !

In [56]:
# 오름차순으로 정렬하면 어떨까?
kto_201901_country_new.sort_values(by = '관광객비율(%)', ascending = True).head()
Out[56]:
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%)
59 교포 0 0 0 0 15526 15526 2019-01 교포 0.0
14 방글라데시 149 126 27 97 848 1247 2019-01 아시아 11.9
12 스리랑카 157 54 5 28 1043 1287 2019-01 아시아 12.2
13 파키스탄 238 178 10 193 413 1032 2019-01 아시아 23.1
15 캄보디아 635 39 55 51 1915 2695 2019-01 아시아 23.6

방글라데시, 스리랑카, 파키스탄, 캄보디아 국적의 외국인들은 관광목적으로 방문하는 비율이 25%가 안 됨을 알 수 있다.

대륙별 관광객 비율의 평균

In [57]:
# 피벗 테이블 !!
kto_201901_country_new.pivot_table(values = '관광객비율(%)', index = '대륙', aggfunc = 'mean')
Out[57]:
관광객비율(%)
대륙
교포 0.000000
기타대륙 28.600000
아메리카 68.200000
아시아 59.624000
아프리카 33.800000
오세아니아 84.833333
유럽 63.826087

평균 관광객 비율이 높은 대륙은 오세아니아임을 확인할 수 있다.

중국인 중에서 관광 목적으로 방문하는 비율

In [58]:
mask = (kto_201901_country_new.국적 == '중국')
kto_201901_country_new[mask]
Out[58]:
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%)
17 중국 320113 2993 138 8793 60777 392814 2019-01 아시아 81.5

중국인 중 약 81.5%가 관광 목적으로 우리나라를 방문하는 것으로 나타난다.

기준년월별로 전체 외국인 관광객 대비 국적별 관광객 비율

In [60]:
tourist_sum = sum(kto_201901_country_new['관광'])
tourist_sum
Out[60]:
885396
In [62]:
# 전체 비율(%) column 생성
kto_201901_country_new['전체비율(%)'] = round(kto_201901_country_new['관광'] / tourist_sum * 100, 1)
kto_201901_country_new.head()
Out[62]:
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%) 전체비율(%)
0 일본 198805 2233 127 785 4576 206526 2019-01 아시아 96.3 22.5
1 대만 86393 74 22 180 1285 87954 2019-01 아시아 98.2 9.8
2 홍콩 34653 59 2 90 1092 35896 2019-01 아시아 96.5 3.9
3 마카오 2506 2 0 17 45 2570 2019-01 아시아 97.5 0.3
4 태국 34004 37 199 96 6998 41334 2019-01 아시아 82.3 3.8
In [63]:
# 내림차순으로 정렬해보자
kto_201901_country_new.sort_values('전체비율(%)', ascending = False).head()
Out[63]:
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%) 전체비율(%)
17 중국 320113 2993 138 8793 60777 392814 2019-01 아시아 81.5 36.2
0 일본 198805 2233 127 785 4576 206526 2019-01 아시아 96.3 22.5
1 대만 86393 74 22 180 1285 87954 2019-01 아시아 98.2 9.8
25 미국 42989 418 2578 229 16523 62737 2019-01 아메리카 68.5 4.9
2 홍콩 34653 59 2 90 1092 35896 2019-01 아시아 96.5 3.9

중국, 일본, 대만, 미국, 홍콩 순으로 관광객수가 많음을 확인할 수 있다

여러개의 파일

함수 생성

In [75]:
def create_kto_data(yy, mm) :
    # 엑셀 파일 경로 지정
    file_path = './datasalon-master/3_Tourists_Event/files/kto_{}{}.xlsx'.format(yy, mm)
    
    # 엑셀 파일 불러오기
    df = pd.read_excel(file_path, header=1, skipfooter = 4, usecols = 'A:G')
    
    # '기준년월' 컬럼 추가
    df['기준년월'] = '{}-{}'.format(yy, mm)
    
    # '국적' 컬럼에서 '대륙' 제거하고 국가만 남기자
    ignore_continents = ['아시아주', '미주', '구주', '대양주', ' 아프리카주', '기타대륙', '국적미상','교포소계']
    mask = (df['국적'].isin(ignore_continents) == False)
    df2 = df[mask].reset_index(drop=True)
    
    # '대륙' 컬럼 추가
    continents = ['아시아'] * 25 + ['아메리카'] * 5 + ['유럽'] * 23 + ['오세아니아'] * 3 + ['아프리카'] * 2 + ['기타대륙'] + ['교포']
    df2['대륙'] = continents
    
    # 국가별 '관광객비율(%)' 컬럼 추가
    df2['관광객비율(%)'] = round(df2.관광 / df2. * 100, 1)
    
    # '전체비율(%)' 컬럼 추가
    tourist_sum = sum(df2['관광'])
    df2['전체비율(%)'] = round(df2['관광'] / tourist_sum * 100, 1)
    
    # 결과 출력
    return(df2)

반복문으로 다수의 엑셀 데이터를 불러와 합치자

년월 데이터를 불러오기 위해 이중반복문 사용

In [70]:
for yy in range(2010, 2020):
    for mm in range(1, 13):
        mm_str = str(mm).zfill(2) # 1을 01로 표현하기 위해 함수 사용
        yymm = '{}{}'.format(yy, mm_str)

빈 데이터프레임 생성

In [71]:
df = pd.DataFrame()

구현해보자

In [78]:
for yy in range(2010, 2020):
    for mm in range(1, 13):
        temp = create_kto_data(str(yy), str(mm).zfill(2))
        df = df.append(temp, ignore_index = True)
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-78-fb6bfcc3d452> in <module>
      1 for yy in range(2010, 2020):
      2     for mm in range(1, 13):
----> 3         temp = create_kto_data(str(yy), str(mm).zfill(2))
      4         df = df.append(temp, ignore_index = True)

<ipython-input-75-662c25e6ff90> in create_kto_data(yy, mm)
      4 
      5     # 엑셀 파일 불러오기
----> 6     df = pd.read_excel(file_path, header=1, skipfooter = 4, usecols = 'A:G')
      7 
      8     # '기준년월' 컬럼 추가

C:\python\envs\cpu_env\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs)
    206                 else:
    207                     kwargs[new_arg_name] = new_arg_value
--> 208             return func(*args, **kwargs)
    209 
    210         return wrapper

C:\python\envs\cpu_env\lib\site-packages\pandas\io\excel\_base.py in read_excel(io, sheet_name, header, names, index_col, usecols, squeeze, dtype, engine, converters, true_values, false_values, skiprows, nrows, na_values, keep_default_na, verbose, parse_dates, date_parser, thousands, comment, skip_footer, skipfooter, convert_float, mangle_dupe_cols, **kwds)
    308 
    309     if not isinstance(io, ExcelFile):
--> 310         io = ExcelFile(io, engine=engine)
    311     elif engine and engine != io.engine:
    312         raise ValueError(

C:\python\envs\cpu_env\lib\site-packages\pandas\io\excel\_base.py in __init__(self, io, engine)
    817         self._io = _stringify_path(io)
    818 
--> 819         self._reader = self._engines[engine](self._io)
    820 
    821     def __fspath__(self):

C:\python\envs\cpu_env\lib\site-packages\pandas\io\excel\_xlrd.py in __init__(self, filepath_or_buffer)
     19         err_msg = "Install xlrd >= 1.0.0 for Excel support"
     20         import_optional_dependency("xlrd", extra=err_msg)
---> 21         super().__init__(filepath_or_buffer)
     22 
     23     @property

C:\python\envs\cpu_env\lib\site-packages\pandas\io\excel\_base.py in __init__(self, filepath_or_buffer)
    357             self.book = self.load_workbook(filepath_or_buffer)
    358         elif isinstance(filepath_or_buffer, str):
--> 359             self.book = self.load_workbook(filepath_or_buffer)
    360         else:
    361             raise ValueError(

C:\python\envs\cpu_env\lib\site-packages\pandas\io\excel\_xlrd.py in load_workbook(self, filepath_or_buffer)
     34             return open_workbook(file_contents=data)
     35         else:
---> 36             return open_workbook(filepath_or_buffer)
     37 
     38     @property

C:\python\envs\cpu_env\lib\site-packages\xlrd\__init__.py in open_workbook(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows)
    109     else:
    110         filename = os.path.expanduser(filename)
--> 111         with open(filename, "rb") as f:
    112             peek = f.read(peeksz)
    113     if peek == b"PK\x03\x04": # a ZIP file

FileNotFoundError: [Errno 2] No such file or directory: './datasalon-master/3_Tourists_Event/files/kto_201909.xlsx'

오류가 나는 이유는 excel file이 2019-08까지만 있기 때문이다. 나머지 파일은 잘 담겨있음을 아래를 통해 확인할 수 있다.

In [80]:
df.tail()
Out[80]:
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%) 전체비율(%)
6955 대양주 기타 519 1 6 9 74 609 2019-08 오세아니아 85.2 0.0
6956 아프리카주 2715 599 166 852 2419 6751 2019-08 아프리카 40.2 0.2
6957 남아프리카공화국 634 6 1 11 1235 1887 2019-08 아프리카 33.6 0.1
6958 아프리카 기타 2081 593 165 841 1184 4864 2019-08 기타대륙 42.8 0.2
6959 교포 0 0 0 0 16560 16560 2019-08 교포 0.0 0.0

오류 없이 구현해보자

In [81]:
for yy in range(2010, 2020):
    for mm in range(1, 13):
        try :
            temp = create_kto_data(str(yy), str(mm).zfill(2))
            df = df.append(temp, ignore_index = True)
        except :
            pass
In [82]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 13920 entries, 0 to 13919
Data columns (total 11 columns):
국적          13920 non-null object
관광          13920 non-null int64
상용          13920 non-null int64
공용          13920 non-null int64
유학/연수       13920 non-null int64
기타          13920 non-null int64
계           13920 non-null int64
기준년월        13920 non-null object
대륙          13920 non-null object
관광객비율(%)    13920 non-null float64
전체비율(%)     13920 non-null float64
dtypes: float64(2), int64(6), object(3)
memory usage: 1.2+ MB

데이터 시각화

시계열 그래프 그리기

In [88]:
# 한글이 정상적으로 표현되도록 출력시 글꼴 지정
from matplotlib import font_manager, rc
import platform

if platform.system() == 'Windows':
    path = 'c:/Windows/Fonts/malgun.ttf'
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family = font_name)
elif platform.system() == 'Darwin' :
    rc('font', family = 'AppleGothic')
else:
    print('Check yoiur OS system')
In [90]:
import matplotlib.pyplot as plt

# 중국 국적의 데이터 필터링
mask = (df['국적'] == '중국')
df2 = df[mask]
df2.head()
Out[90]:
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%) 전체비율(%)
17 중국 40425 11930 55 2751 36091 91252 2010-01 아시아 44.3 10.1
77 중국 60590 7907 68 29546 42460 140571 2010-02 아시아 43.1 13.5
137 중국 50330 13549 174 14924 62480 141457 2010-03 아시아 35.6 9.2
197 중국 84252 13306 212 2199 47711 147680 2010-04 아시아 57.1 15.5
257 중국 89056 12325 360 2931 49394 154066 2010-05 아시아 57.8 16.9
In [95]:
# 그래프 크기 조절
plt.figure(figsize = (12, 4))

# 그래프 내용 설정
plt.plot(df2['기준년월'], df2['관광'])

# 그래프 타이틀 , x축, y축 이름 설정
plt.title('중국 국적의 관광객 추이')
plt.xlabel('기준년월')
plt.ylabel('관광객수')

# x축 눈금 값 설정
plt.xticks(['2010-01', '2012-01', '2013-01', '2014-01', '2015-01', '2016-01', '2017-01', '2018-01', '2019-01'])

# 그래프 표현하기 
plt.show()

1 ) 2010년부터 2016년까지 관광객 수가 꾸준히 증가하는 추세를 보인다

2 ) 2017년 초에 관광객 수가 큰 폭으로 감소한다

3 ) 2017년 중순부터 관광객 수가 완만하게 증가한다

4 ) 매년 여름에 관광객 수가 최대값을 가진다

5 ) 2015년 여름에는 관광객 수가 큰 폭으로 감소한다

히트맵 그래프 그리기

In [96]:
df['년도'] = df['기준년월'].str.slice(0,4)
df['월'] = df['기준년월'].str.slice(5,7)
df.head()
Out[96]:
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%) 전체비율(%) 년도
0 일본 202825 1750 89 549 3971 209184 2010-01 아시아 97.0 50.5 2010 01
1 대만 35788 41 17 37 516 36399 2010-01 아시아 98.3 8.9 2010 01
2 홍콩 13874 55 0 21 595 14545 2010-01 아시아 95.4 3.5 2010 01
3 마카오 554 0 0 0 0 554 2010-01 아시아 100.0 0.1 2010 01
4 태국 13374 39 13 53 4335 17814 2010-01 아시아 75.1 3.3 2010 01
In [97]:
# 중국 국적의 데이터 필터링
mask = (df['국적'] == '중국')
df2 = df[mask]
df2.head()
Out[97]:
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%) 전체비율(%) 년도
17 중국 40425 11930 55 2751 36091 91252 2010-01 아시아 44.3 10.1 2010 01
77 중국 60590 7907 68 29546 42460 140571 2010-02 아시아 43.1 13.5 2010 02
137 중국 50330 13549 174 14924 62480 141457 2010-03 아시아 35.6 9.2 2010 03
197 중국 84252 13306 212 2199 47711 147680 2010-04 아시아 57.1 15.5 2010 04
257 중국 89056 12325 360 2931 49394 154066 2010-05 아시아 57.8 16.9 2010 05
In [98]:
# pivot_table로 매트릭스 형태로 변환
df3 = df2.pivot_table(values='관광', index='년도', columns='월')
df3
Out[98]:
01 02 03 04 05 06 07 08 09 10 11 12
년도
2010 40425.0 60590.0 50330.0 84252.0 89056.0 87080.0 122432.0 142180.0 93545.0 107237.0 75686.0 58987.0
2011 55070.0 53863.0 72003.0 86397.0 85668.0 108060.0 170524.0 178937.0 144704.0 141824.0 113856.0 101605.0
2012 106606.0 74895.0 110965.0 166843.0 154841.0 179074.0 258907.0 268988.0 203857.0 204866.0 155503.0 148320.0
2013 148118.0 169395.0 182850.0 250549.0 196306.0 280319.0 417991.0 472005.0 353359.0 249850.0 208175.0 210950.0
2014 230706.0 219533.0 313400.0 429419.0 410971.0 429991.0 540683.0 588181.0 423133.0 459708.0 381118.0 345957.0
2015 327225.0 413096.0 386386.0 536428.0 517154.0 223101.0 172075.0 372990.0 453670.0 518651.0 409635.0 381722.0
2016 456636.0 424232.0 500018.0 601460.0 614636.0 671493.0 823016.0 747818.0 611538.0 588561.0 452082.0 456882.0
2017 489256.0 458952.0 263788.0 158784.0 172527.0 181507.0 207099.0 226153.0 229172.0 244541.0 223743.0 260983.0
2018 236825.0 237075.0 281020.0 283533.0 284317.0 303405.0 332657.0 360982.0 326438.0 382922.0 327664.0 345135.0
2019 320113.0 324291.0 369165.0 410542.0 413949.0 395196.0 439699.0 451570.0 NaN NaN NaN NaN
In [101]:
! pip install seaborn
Collecting seaborn
  Downloading https://files.pythonhosted.org/packages/c7/e6/54aaaafd0b87f51dfba92ba73da94151aa3bc179e5fe88fc5dfb3038e860/seaborn-0.10.1-py3-none-any.whl (215kB)
Requirement already satisfied: numpy>=1.13.3 in c:\python\envs\cpu_env\lib\site-packages (from seaborn) (1.18.1)
Requirement already satisfied: scipy>=1.0.1 in c:\python\envs\cpu_env\lib\site-packages (from seaborn) (1.4.1)
Requirement already satisfied: matplotlib>=2.1.2 in c:\python\envs\cpu_env\lib\site-packages (from seaborn) (3.1.2)
Requirement already satisfied: pandas>=0.22.0 in c:\python\envs\cpu_env\lib\site-packages (from seaborn) (0.25.3)
Requirement already satisfied: python-dateutil>=2.1 in c:\python\envs\cpu_env\lib\site-packages (from matplotlib>=2.1.2->seaborn) (2.8.1)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in c:\python\envs\cpu_env\lib\site-packages (from matplotlib>=2.1.2->seaborn) (2.4.6)
Requirement already satisfied: kiwisolver>=1.0.1 in c:\python\envs\cpu_env\lib\site-packages (from matplotlib>=2.1.2->seaborn) (1.1.0)
Requirement already satisfied: cycler>=0.10 in c:\python\envs\cpu_env\lib\site-packages (from matplotlib>=2.1.2->seaborn) (0.10.0)
Requirement already satisfied: pytz>=2017.2 in c:\python\envs\cpu_env\lib\site-packages (from pandas>=0.22.0->seaborn) (2019.3)
Requirement already satisfied: six>=1.5 in c:\python\envs\cpu_env\lib\site-packages (from python-dateutil>=2.1->matplotlib>=2.1.2->seaborn) (1.13.0)
Requirement already satisfied: setuptools in c:\python\envs\cpu_env\lib\site-packages (from kiwisolver>=1.0.1->matplotlib>=2.1.2->seaborn) (42.0.2.post20191203)
Installing collected packages: seaborn
Successfully installed seaborn-0.10.1
In [102]:
import matplotlib.pyplot as plt
import seaborn as sns

# 그래프 크기 설정
plt.figure(figsize = (16, 10))

# 히트맵 그리기
sns.heatmap(df3, annot=True, fmt = '.0f', cmap='rocket_r')
# annot : 각 칸에 실제 값 표시
# fmt = '.0f' : 소수점이 없는 실수형으로 표현
# cmap : 그래프의 색깔 조합 지정

# 타이틀
plt.title('중국 관광객 히트맵')

# 그래프
plt.show()

1 ) 2010년 1월부터 2017년 3월까지 관광객 수가 꾸준히 증가한다

2 ) 각 연도를 기준으로 7~8월에 가장 관광객이 많이 방문하고, 4월 10월 순으로 나타난다

3 ) 2015년 6 ~ 8월은 관광객 수가 적다

4 ) 2017년 3 ~ 6월은 관광객 수가 매우 적다

5 ) 2017년 7월부터 2019년 4월까지 관광객 수가 점차 많아진다

이슈 확인

2015년 6~8월 이슈 : 메르스

image.png

2017년 3~6월 이슈 : 사드 보복 조치

image.png

728x90
반응형