[개인 프로젝트] COVID-19의 영향으로 중국인 관광객이 얼마나 줄었을까? - (1) 불러오기, 전처리

Jungmin·2023년 2월 20일
1

데이터 분석

목록 보기
21/24
post-thumbnail

📙코로나 바이러스(COVID-19)의 영향으로 중국인 관광객이 얼마나 줄었을까?

  • 데이터 출처 : 한국관광공사

💡외국인 관광객 수에 대한 데이터를 가공하여 시계열 그래프로 시각화해보고, 이를 통해 정보를 읽을 줄 아는 인사이트 능력을 길러보자.

1 데이터 불러오기 및 전처리

1.1 불러올 데이터의 형태 파악 & 1.2 파이썬에서 엑셀 데이터 불러오기

<엑셀 파일 상단>

<엑셀 파일 하단>

  • 첫번째 로우는 해당 데이터가 어느 시점의 어떤 데이터인지 서술되어 있으며, 데이터 분석 시 사용하지 않으므로 데이터를 불러올 때 제외한다.
  • 두번째 로우에 총 10개의 컬럼이 순서대로 나열되어 있다.
  • 2-69 로우에는 대륙/국가별 관광객 수 데이터가 있으며, 70-73번째 로우에는 계, 전년 동기 등 데이터의 요약 정보로 구성되어 있다. 이 경우도 분석 시 필요하지 않으므로 데이터 불러올 때에 제외한다.
import warnings
warnings.filterwarnings('ignore')
import pandas as pd 
# 2019년 01월 데이터 불러오기

kto_201901 = pd.read_excel('./files/kto_201901.xlsx', 
                          header=1, #두번째 로우에 변수명이 있음을 의미
                          usecols='A:G', #A~G 컬럼만 사용
                          skipfooter=4) # 밑에 있는 4줄은 생략
kto_201901.head()
국적 관광 상용 공용 유학/연수 기타
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
kto_201901.tail()
국적 관광 상용 공용 유학/연수 기타
62 아프리카 기타 768 718 90 206 908 2690
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

1.3. 데이터 전처리 하기

kto_201901.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 67 entries, 0 to 66
Data columns (total 7 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   국적      67 non-null     object
 1   관광      67 non-null     int64 
 2   상용      67 non-null     int64 
 3   공용      67 non-null     int64 
 4   유학/연수   67 non-null     int64 
 5   기타      67 non-null     int64 
 6   계       67 non-null     int64 
dtypes: int64(6), object(1)
memory usage: 3.8+ KB
# 정수혀 변수 특징 확인
kto_201901.describe()
관광 상용 공용 유학/연수 기타
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인 부분을 필터링
condition = (kto_201901['관광'] == 0) \
                |(kto_201901['상용'] == 0) \
                | (kto_201901['공용'] == 0) \
                | (kto_201901['유학/연수'] == 0) 
kto_201901[condition]
국적 관광 상용 공용 유학/연수 기타
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

| (or) 조건을 이용해 4가지 목적 중 한가지라도 입국객수가 0인 국적으로 필터링하여 확인.\
교포소계, 교포의 경우 기타목적을 분류되어 있어 위의 4개 컬럼 모두 '0'으로 나온다.

\
현재 활용할 데이터는 2019년1월 데이터로, 2020년 5월까지의 데이터를 활용할 예정이기 때문에 기준년월 정보를 추가해준다.

# 기준년월 컬럼 생성 
kto_201901['기준년월'] = '2019-01'
kto_201901.head()
국적 관광 상용 공용 유학/연수 기타 기준년월
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
# unique() 함수 활용하기 
kto_201901['국적'].unique()
array(['아시아주', '일본', '대만', '홍콩', '마카오', '태국', '말레이시아', '필리핀', '인도네시아',
       '싱가포르', '미얀마', '베트남', '인도', '스리랑카', '파키스탄', '방글라데시', '캄보디아', '몽골',
       '중국', '이란', '이스라엘', '터키', '우즈베키스탄', '카자흐스탄', 'GCC', '아시아 기타', '미주',
       '미국', '캐나다', '멕시코', '브라질', '미주 기타', '구주', '영국', '독일', '프랑스',
       '네덜란드', '스웨덴', '스위스', '이탈리아', '덴마크', '노르웨이', '벨기에', '오스트리아', '스페인',
       '그리스', '포르투갈', '핀란드', '아일랜드', '우크라이나', '러시아', '크로아티아', '루마니아',
       '불가리아', '폴란드', '구주 기타', '대양주', '오스트레일리아', '뉴질랜드', '대양주 기타',
       '아프리카주', '남아프리카공화국', '아프리카 기타', '기타대륙', '국적미상', '교포소계', '교포'],
      dtype=object)
# 대륙 목록 만들기 
continents_list = ['아시아주', '미주', '구주', '대양주', '아프리카주', '기타대륙', '교포소계']
continents_list
['아시아주', '미주', '구주', '대양주', '아프리카주', '기타대륙', '교포소계']
# 대륙 목록에 해당하는 값 제외 -> 국적 컬럼에는 국가명만 남도록
condition = (kto_201901.국적.isin(continents_list) == False) 
kto_201901_country = kto_201901[condition]
kto_201901_country['국적'].unique()
array(['일본', '대만', '홍콩', '마카오', '태국', '말레이시아', '필리핀', '인도네시아', '싱가포르',
       '미얀마', '베트남', '인도', '스리랑카', '파키스탄', '방글라데시', '캄보디아', '몽골', '중국',
       '이란', '이스라엘', '터키', '우즈베키스탄', '카자흐스탄', 'GCC', '아시아 기타', '미국',
       '캐나다', '멕시코', '브라질', '미주 기타', '영국', '독일', '프랑스', '네덜란드', '스웨덴',
       '스위스', '이탈리아', '덴마크', '노르웨이', '벨기에', '오스트리아', '스페인', '그리스', '포르투갈',
       '핀란드', '아일랜드', '우크라이나', '러시아', '크로아티아', '루마니아', '불가리아', '폴란드',
       '구주 기타', '오스트레일리아', '뉴질랜드', '대양주 기타', '남아프리카공화국', '아프리카 기타',
       '국적미상', '교포'], dtype=object)
# kto_201901_country 데이터 head() 함수로 확인 
kto_201901_country.head()
국적 관광 상용 공용 유학/연수 기타 기준년월
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
# index 재설정하기 (대륙 목록 필터링하면서 삭제된 데이터가 있기 때문에, 인덱스 다시 정렬)
kto_201901_country_newindex = kto_201901_country.reset_index(drop=True) 
kto_201901_country_newindex.head()
국적 관광 상용 공용 유학/연수 기타 기준년월
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
# 대륙 컬럼값 만들기
continents = ['아시아']*25 + ['아메리카']*5 + ['유럽']*23 + ['오세아니아']*3 \
+ ['아프리카']*2 + ['기타대륙'] + ['교포']
print(continents)
['아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아시아', '아메리카', '아메리카', '아메리카', '아메리카', '아메리카', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '유럽', '오세아니아', '오세아니아', '오세아니아', '아프리카', '아프리카', '기타대륙', '교포']
# 대륙 컬럼 생성
kto_201901_country_newindex['대륙'] = continents
kto_201901_country_newindex.head()
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙
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 아시아
# kto_201901_country_newindex 데이터 tail() 확인
kto_201901_country_newindex.tail()
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙
55 대양주 기타 555 3 4 0 52 614 2019-01 오세아니아
56 남아프리카공화국 368 9 1 6 616 1000 2019-01 아프리카
57 아프리카 기타 768 718 90 206 908 2690 2019-01 아프리카
58 국적미상 33 4 0 1 16 54 2019-01 기타대륙
59 교포 0 0 0 0 15526 15526 2019-01 교포
# 관광객비율(%) 컬럼 생성 
kto_201901_country_newindex['관광객비율(%)'] = \
round(kto_201901_country_newindex['관광'] / kto_201901_country_newindex['계'] * 100, 1)
kto_201901_country_newindex.head()
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%)
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
# 관광객비율(%) 컬럼으로 내림차순 정렬  
kto_201901_country_newindex.sort_values(by='관광객비율(%)', ascending=False).head()
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%)
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
# 관광객비율(%) 컬럼으로 오름차순 정렬
kto_201901_country_newindex.sort_values(by='관광객비율(%)', ascending=True).head()
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%)
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
# pivot_table() 함수 활용하여 대륙별 관광객 비율 평균 확인해보기
kto_201901_country_newindex.pivot_table(values = '관광객비율(%)',
                                       index = '대륙',
                                       aggfunc = 'mean')
관광객비율(%)
대륙
교포 0.000000
기타대륙 61.100000
아메리카 68.200000
아시아 59.624000
아프리카 32.700000
오세아니아 84.833333
유럽 63.826087
# 중국 국적만 필터링 
condition = (kto_201901_country_newindex['국적'] == '중국')
kto_201901_country_newindex[condition]
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%)
17 중국 320113 2993 138 8793 60777 392814 2019-01 아시아 81.5
# 2019년 1월 우리나라 방문하는 전체 외국인 관광객 숫자 구하기 
tourist_sum = sum(kto_201901_country_newindex['관광'])
tourist_sum 
884293
# 전체비율(%) 컬럼 생성
kto_201901_country_newindex['전체비율(%)'] = \
    round(kto_201901_country_newindex['관광'] / tourist_sum * 100, 1)
kto_201901_country_newindex.head()
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%) 전체비율(%)
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
# 전체비율(%) 컬럼 기준으로 내림차순 정렬
kto_201901_country_newindex.sort_values('전체비율(%)', ascending=False).head()
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%) 전체비율(%)
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

1.4. 데이터 전처리 과정 함수로 만들기

# create_kto_data 함수 생성
def create_kto_data(yy, mm):  
    #1. 불러올 Excel 파일 경로를 지정
    file_path = "C:/Users/jjung/바탕 화면/개인Study/DA_prac/02/4_Tourists_Event/files/kto_{}{}.xlsx".format(yy, mm)  

    # 2. Excel 파일 불러오기 
    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 + ['기타대륙'] + ['교포']    # 대륙 컬럼 생성을 위한 목록 만들어 놓기 
    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)
# create_kto_data() 함수를 활용해서 2018년 12월 데이터 불러오기  
kto_test = create_kto_data(2018, 12)
kto_test.head()
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%) 전체비율(%)
0 일본 252461 1698 161 608 3593 258521 2018-12 아시아 97.7 22.7
1 대만 85697 71 22 266 1252 87308 2018-12 아시아 98.2 7.7
2 홍콩 58355 41 3 208 939 59546 2018-12 아시아 98.0 5.2
3 마카오 6766 0 1 20 36 6823 2018-12 아시아 99.2 0.6
4 태국 47242 42 302 58 6382 54026 2018-12 아시아 87.4 4.2

1.5. 반복문(for문)을 통해 다수의 엑셀 데이터 불러와서 합치기

# 이중 반복문으로 기준년월 출력
for yy in range(2010, 2021): 
    for mm in range(1, 13): 
        yymm = '{}{}'.format(yy, mm)
        print(yymm)
    20101
    20102
    20103
    20104
    20105
    20106
    20107
...
    20206
    20207
    20208
    20209
    202010
    202011
    202012
  • zfill() 함수 : 괄호안의 숫자만큼 0을 채워서 자릿수를 맞춰주는 함수
# 숫자 1 출력
mm = 1 
print(mm) 
1
# zfill() 함수 이용 - 1(0을 포함한 두 자리로 출력하기)
print(str(mm).zfill(2))
01
# zfill() 함수 이용 - 2(0을 포함한 3자리, 4자리로 출력하기)
print(str(mm).zfill(3))
print(str(mm).zfill(4))
001
0001
# 6자리로 정렬하여 기준년월 출력하기 
for yy in range(2010, 2021):
    for mm in range(1, 13):
        mm_str = str(mm).zfill(2)
        yymm = '{}{}'.format(yy, mm_str)
        print(yymm)
    201001
    201002
    201003
    201004
    201005
    201006
...
    202006
    202007
    202008
    202009
    202010
    202011
    202012
# 통합 데이터 생성
df = pd.DataFrame()

# 패턴 분석결과를 이중 반복문을 통해 구현 
for yy in range(2010, 2021):
    for mm in range(1, 13):
        # try 이하 구문을 실행 
        try:
            # 앞서 만든 create_kto_data 함수로 Excel 데이터를 temp 에 불러오기 
            temp = create_kto_data(str(yy), str(mm).zfill(2))

            # temp 로 불러온 데이터를 df 밑으로 추가하기 
            df = df.append(temp, ignore_index=True)
            
        # 만약 try 구문에서 에러가 발생하면 except 이후를 실행 
        except:
            pass
# df 데이터 info() 함수로 확인
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7500 entries, 0 to 7499
Data columns (total 11 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   국적        7500 non-null   object 
 1   관광        7500 non-null   int64  
 2   상용        7500 non-null   int64  
 3   공용        7500 non-null   int64  
 4   유학/연수     7500 non-null   int64  
 5   기타        7500 non-null   int64  
 6   계         7500 non-null   int64  
 7   기준년월      7500 non-null   object 
 8   대륙        7500 non-null   object 
 9   관광객비율(%)  7500 non-null   float64
 10  전체비율(%)   7500 non-null   float64
dtypes: float64(2), int64(6), object(3)
memory usage: 644.7+ KB
df.tail()
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%) 전체비율(%)
7495 대양주 기타 1 0 1 0 3 5 2020-05 대양주 20.0 0.0
7496 남아프리카공화국 1 0 3 0 25 29 2020-05 아프리카 3.4 0.0
7497 아프리카 기타 3 1 3 6 118 131 2020-05 아프리카 2.3 0.0
7498 국적미상 1 0 0 0 3 4 2020-05 기타대륙 25.0 0.0
7499 교포 0 0 0 0 790 790 2020-05 교포 0.0 0.0

1.6 통합 데이터를 엑셀 파일로 저장하기

# df 데이터 엑셀로 저장하기
df.to_excel('./files/kto_total.xlsx', index = False)

1.7 국적별 필터링된 데이터를 엑셀 파일로 저장하기

# 중국인 관광객 데이터만 필터링하기 
condition = (df['국적'] == '중국')
df_filter = df[condition]
df_filter.head()
국적 관광 상용 공용 유학/연수 기타 기준년월 대륙 관광객비율(%) 전체비율(%)
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.6
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 17.0
# 중국인 관광객 파일 저장 
file_path = './files/[국적별 관광객 데이터] 중국.xlsx'
df_filter.to_excel(file_path, index = False)
# 국가 리스트 만들기
cntry_list = df['국적'].unique()
cntry_list
array(['일본', '대만', '홍콩', '마카오', '태국', '말레이시아', '필리핀', '인도네시아', '싱가포르',
       '미얀마', '베트남', '인도', '스리랑카', '파키스탄', '방글라데시', '캄보디아', '몽골', '중국',
       '이란', '이스라엘', '터키', '우즈베키스탄', '카자흐스탄', 'GCC', '아시아 기타', '미국',
       '캐나다', '멕시코', '브라질', '미주 기타', '영국', '독일', '프랑스', '네덜란드', '스웨덴',
       '스위스', '이탈리아', '덴마크', '노르웨이', '벨기에', '오스트리아', '스페인', '그리스', '포르투갈',
       '핀란드', '아일랜드', '우크라이나', '러시아', '크로아티아', '루마니아', '불가리아', '폴란드',
       '구주 기타', '오스트레일리아', '뉴질랜드', '대양주 기타', '남아프리카공화국', '아프리카 기타',
       '국적미상', '교포'], dtype=object)
# 개별 국적별 관광객 데이터 저장하기 
for cntry in cntry_list: 
    # 국적으로 필터링 
    condition = (df['국적'] == cntry)
    df_filter = df[condition]
    
    # 국적이름을 반영한 파일명 만들기 
    file_path = './files/[국적별 관광객 데이터] {}.xlsx'.format(cntry)
    
    # 정해 놓은 파일명으로 저장하기 
    df_filter.to_excel(file_path, index = False)
profile
데이터분석 스터디노트🧐✍️

0개의 댓글