Python 데이터 분석 - 외국인 관광객 출입국 통계

Ek_5.4·2020년 7월 30일
0
post-thumbnail

실습환경: Windows 10 Pro, JupyterLab, Python 3
참고문헌: 직장인을 위한 데이터분석 실무 with 파이썬 - 위키북스
데이터 출처: 한국관광통계자료(https://kto.visitkorea.or.kr/)
2010년 1월부터 2019년 8월까지 외국인 관광객 목적별 입국 데이터셋(엑셀)파일 총 116개.

1. 데이터 확인

: 우선 첫 번째(2010년 1월)의 데이터 파일을 열어 대략적인 정보를 확인.

필요 컬럼이 2행부터 시작함을 확인.


데이터 마지막 4줄 필요없는 데이터 확인

import pandas as pd
kto_201001 = pd.read_excel("C:\\Users\\KIM EUNKI\\Dataset\\관광객 데이터(2010.01~2019.08)\\files\\kto_201001.xlsx"
                          , header = 1 	    # 두 번째 줄이 컬럼명.
                          , usecols = "A:G" # 필요컬럼 추출.
                          , skipfooter = 4) # 마지막 4줄 생략.
kto_201001.head()

kto_201001.tail()

kto_201001.info() # 국적 컬럼을 제외하고 모두 정수형임을 확인.

kto_201001.describe() # 정수형 변수들의 특성 확인.


최소값이 0인 데이터가 존재함을 인지.

# 최솟값이 0인 데이터는 어떤 이유인지 확인.
condition = (kto_201001['관광'] == 0) \
          | (kto_201001['상용'] == 0) \
          | (kto_201001['공용'] == 0) \
          | (kto_201001['유학/연수'] == 0)
kto_201001[condition]
# |(or) 조건을 활용해 4가지 변수 중 하나라도 입국객수가 0인 국적으로 필터링.
# 교포의 경우 통계 집계 시 기타 목적으로 분류됨을 확인.


2. 데이터 정제

  • 데이터프레임에 '기준년월' 항목 추가
    : 여러 데이터셋을 통합하여 활용해야하기 때문에 '기준년월' 정보 필요
kto_201001['기준년월'] = '2010-01'
kto_201001.head()

# 국적 데이터에 어떤 항목들이 있는지 확인.
kto_201001['국적'].unique()

# 대륙(continent) 레벨의 데이터가 존재하므로 국가명, 기타대륙을 제외한 아시아주 포함 7개 데이터를 저장하기위해 continents_list 변수 생성
continents_list = ['아시아주', '미주', '구주', '대양주', '아프리카주', '기타대륙', '교포소계']
continents_list
# 만들어놓은 continents_list에 포함되지 않는 국가명만 선택하여 확인.
condition = (kto_201001.국적.isin(continents_list) == False)
kto_201001_country = kto_201001[condition]
kto_201001_country['국적'].unique()

다시 데이터 확인.

kto_201001_country.head()

# 인덱스가 1번부터 시작(0번이었던 아시아주가 제거됨). 0번부터 시작하도록 다시 세팅.
kto_201001_country_newindex = kto_201001_country.reset_index(drop = True)
kto_201001_country_newindex.head()

  • '대륙' 컬럼 만들기
# 국가별로 매칭되는 대륙을 생각해보고 만들어야 함. 기존 데이터는 아시아주 하위그룹으로 아시아 국가들로 구성되어 있어 순서대로 만들면 됨.
# 아시아주 25개, 미주 5개, 유럽(구주) 23개, 오세아니아 3개, 아프리카주 2개, 기타대륙 1개, 교포소계 1개.
continents = ['아시아']*25 + ['아메리카']*5 + ['유럽']*23 + ['오세아니아']*3 + ['아프리카']*2 + ['기타대륙']*1 + ['교포']*1
print(continents)

# 만들어진 continents 변수로 데이터프레임에 '대륙' 컬럼 추가하기.
kto_201001_country_newindex['대륙'] = continents
kto_201001_country_newindex.head()

kto_201001_country_newindex.tail()

  • 국적별 관광객 비율 살펴보기
# '관광객비율(%)' 컬럼 생성.
kto_201001_country_newindex['관광객비율(%)'] = \
    round(kto_201001_country_newindex['관광'] / kto_201001_country_newindex['계'] * 100, 1)
kto_201001_country_newindex.head()

# 관광객 비율이 높은 순으로 내림차순 정렬.
kto_201001_country_newindex.sort_values(by = '관광객비율(%)', ascending = False).head()

# 대륙별 관광객 비율 평균(pivot_table 함수 활용)
kto_201001_country_newindex.pivot_table(values  = '관광객비율(%)',
                                        index   = '대륙',
                                        aggfunc = 'mean')
# 소득 수준이 낮은 국가(아프리카)에서는 관광 목적의 방문이 많지 않음을 알 수 있다.

  • 기준년월별로 전체 외국인 관광객 대비 국적별 관광객 비율 살펴보기
# 2010년 1월 외국인 관광객 전체 수 구하기(tourist_sum 변수 생성)
tourist_sum = sum(kto_201001_country_newindex['관광'])
tourist_sum
# 총 약 40만명.

# '전체비율(%)' 컬럼 생성하여 내림차순 정렬.
kto_201001_country_newindex['전체비율(%)'] = \
    round(kto_201001_country_newindex['관광'] / tourist_sum * 100, 1)
kto_201001_country_newindex.head()
kto_201001_country_newindex.sort_values(by = '전체비율(%)', ascending = False).head()

여기까지 2010년 1월 외국인 관광객 데이터 정리.


3. 이후 데이터셋을 위한 전처리 과정 함수로 만들기

  1. 불러올 데이터 형태 파악
  2. 엑셀 파일 파이썬으로 불러오기
  3. 데이터 탐색
  4. 기준년월 컬럼 추가
  5. 국적 데이터만 남기기(대륙 데이터 제거)
  6. 대륙 컬럼 생성
  7. 국적별 관광객 비율(%)
# 2010년 1월부터 2019년 8월까지 총 116개 엑셀파일 통합하기(전처리 과정 포함)
# create_kto_data 함수 생성
def create_kto_data(yy, mm):
# 1. 불러올 엑셀 파일 경로 지정
    file_path = 'C:\\Users\\KIM EUNKI\\Dataset\\관광객 데이터(2010.01~2019.08)\\files\\kto_{}{}.xlsx'.format(yy, mm)
# 2. 엑셀 파일 불러오기
    df = pd.read_excel(file_path, header = 1, skipfooter = 4, usecols = 'A:G')
# 3. '기준년월' 컬럼 추가
    df['기준년월'] = '{}-{}'.format(yy, mm)
# 4. '국적' 컬럼에서 대륙 데이터 제거
    ignore_list = ['아시아주', '구주', '아프리카주', '미주', '대양주', '기타대륙', '교포소계']
    condition = (df['국적'].isin(ignore_list) == False) #대륙정보 미포함 조건
    df_country = df[condition].reset_index(drop = True) #대륙정보 제거
# 5. '대륙' 컬럼 추가
    continents = ['아시아']*25 + ['아메리카']*5 + ['유럽']*23 + ['오세아니아']*3 + ['아프리카']*2 + ['기타대륙']*1 + ['교포']*1
    df_country['대륙'] = continents
# 6. '관광객비율(%)' 컬럼 추가
    df_country['관광객비율(%)'] = \
        round(df_country['관광'] / df_country['계'] * 100, 1)
# 7. '전체비율(%)' 컬럼 추가
    tourist_sum = sum(df_country['관광'])
    df_country['전체비율(%)'] = \
        round(df_country['관광'] / tourist_sum * 100, 1)
# 8. 결과 출력
    return(df_country)

실행 후 테스트를 위해 2018년 12월 데이터를 추출.

#함수 테스트
kto_test = create_kto_data(2018, 12)
kto_test.head()

  • 함수를 활용하여 116개 데이터셋 통합하여 엑셀로 저장하기
#데이터를 담을 빈 데이터프레임 만들기
df = pd.DataFrame()
#데이터 통합하여 df에 담기
#2019년 8월 이후로는 데이터가 없기 때문에 에러를 무시할 수 있도록 try 구문 활용
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
df.head()

df.tail()


성공적인 통합으로 총 6,960개의 데이터가 존재함을 확인.

#통합 데이터를 하나의 엑셀파일(kto_total)로 저장
df.to_excel('C:\\Users\\KIM EUNKI\\Dataset\\관광객 데이터(2010.01~2019.08)\\files\\kto_total.xlsx', index = False)

4. 데이터 시각화

: 상위 5개국 시계열 그래프 그리기

#한글 폰트 설정
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
  • 국가별 시계열 그래프
# 중국 국적 데이터 필터링
condition = (df['국적'] == '중국')
df_china = df[condition]
df_china.head()

#반복문 활용하여 관광객 수 상위 5개의 국가 그래프 그리기
cntry_list = ['중국', '일본', '미국', '대만', '홍콩']
for cntry in cntry_list:
    condition = (df['국적'] == cntry) #국적 관광객만 호출
    df_filter = df[condition]
#그래프 그리기
    plt.figure(figsize = (12, 4)) #그래프 크기 조절
    plt.plot(df_filter['기준년월'], df_filter['관광']) #그래프 내용 설정
    plt.title('{} 국적 관광객 추이'.format(cntry))
    plt.xlabel('기준년월')
    plt.ylabel('관광객수')
    plt.xticks(['2010-01', '2011-01', '2012-01', '2013-01', '2014-01', '2015-01', '2016-01', '2017-01', '2018-01', '2019-01']) #x축 눈금 값 설정
    plt.show()

# 상위 5개 국가 통합 그래프
condition = (df['국적'] == '중국')
df_china = df[condition]
condition = (df['국적'] == '미국')
df_usa = df[condition]
condition = (df['국적'] == '대만')
df_tai = df[condition]
condition = (df['국적'] == '홍콩')
df_hong = df[condition]
condition = (df['국적'] == '일본')
df_jap = df[condition]
plt.figure(figsize = (20, 10)) #그래프 크기 조절
plt.plot(df_china['기준년월'], df_china['관광'], label = '중국') #그래프 내용 설정
plt.plot(df_usa['기준년월'], df_usa['관광'], label = '미국')
plt.plot(df_jap['기준년월'], df_jap['관광'], label = '일본')
plt.plot(df_tai['기준년월'], df_tai['관광'], label = '대만')
plt.plot(df_hong['기준년월'], df_hong['관광'], label = '홍콩')
plt.title('국적별 관광객 추이')
plt.xlabel('기준년월')
plt.ylabel('관광객수')
plt.xticks(['2010-01', '2011-01', '2012-01', '2013-01', '2014-01', '2015-01', '2016-01', '2017-01', '2018-01', '2019-01']) #x축 눈금 값 설정
plt.legend() #우측 상단(기본) 범주 표시
plt.show()


중국인 관광객이 월등히 많은데 2016년까지 관광객 수가 꾸준히 증가하는 추세.
2015년과 2016년 사이에 메르스 여파로 관광객 급격히 감소

2017년도에 관광객 수가 사드 배치의 영향으로 급격히 감소

보통 매년 여름 즈음에 중국인 관광객이 가장 많음을 알 수 있다.

profile
Data analysis beginner

0개의 댓글