ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2월 3주차-2/18(4)]📊 월별 외국인 관광객 데이터 전처리 및 통합 분석
    Why Not SW CAMP 5기/수업 기록 2025. 2. 19. 10:23

    한국관광데이터랩에서 제공하는 2010년 1월부터 2020년 5월까지의 외국인 관광객 데이터를 수집하고, 전처리하여 하나의 파일로 통합하는 과정을 소개한다. 🚀


    1️⃣ 데이터 파일 확인 🧐

    우선, 하나의 데이터를 불러와서 구조를 확인해보자.

    import pandas as pd
    
    # 2019년 1월 데이터 불러오기
    kto_201901 = pd.read_excel('./data/kto_201901.xlsx',
                               header=1,
                               usecols='A:G',
                               skipfooter=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
    

    2️⃣ 데이터 전처리 필요 사항 ✨

    데이터를 분석하기 위해 다음과 같은 전처리가 필요하다.

    기준년월 칼럼 추가 → 연도와 월 구분을 위한 기준년월 컬럼 추가
    불필요한 행 제거 → '아시아주', '미주' 등 대륙별 총합 데이터 제거
    대륙 칼럼 추가 → 국가별 데이터를 대륙별로 구분
    관광객 비율 칼럼 추가 → 각 나라의 관광객 비율 계산
    전체 관광객 대비 비율 추가 → 전체 관광객 중 특정 국가 곽광객 비율 계산


    3️⃣ 데이터 전처리 함수 생성 🛠

    위 과정을 자동화하기 위해 월별 데이터를 불러와 전처리하는 함수를 만든다.

    def create_kto_data(yy, mm):
        file_path = './data/kto_{}{}.xlsx'.format(yy, mm)
        
        # 엑셀 파일 읽기
        df = pd.read_excel(file_path, header=1, skipfooter=4, usecols='A:G')
        
        # 기준년월 칼럼 추가
        df['기준년월'] = '{}-{}'.format(yy, mm)
        
        # 불필요한 대륙별 총합 데이터 제거 후 인덱스 재설정
        ignore_list = ['아시아주', '미주', '구주', '대양주', '아프리카주', '기타대륙', '교포소계']
        df_country = df[~df['국적'].isin(ignore_list)].reset_index(drop=True)
        
        # 대륙 컬럼 추가
        continents = ['아시아']*25 + ['아메리카']*5 + ['유럽']*23 + ['오세아니아']*3 + ['아프리카']*2 + ['기타대륙'] + ['교포']
        df_country['대륙'] = continents
        
        # 관광객 비율(%) 추가
        df_country['관광객비율(%)'] = round(df_country['관광'] / df_country['계'] * 100, 1)
        
        # 전체 관광객 대비 비율(%) 추가
        total_tourist = df_country['관광'].sum()
        df_country['전체비율(%)'] = round(df_country['관광'] / total_tourist * 100, 1)
        
        return df_country

    이제 함수 하나로 데이터를 깔끔하게 정리할 수 있다!


    4️⃣ 함수 실행 및 결과 확인 ✅

    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

    불필요한 데이터가 제거되고, 대륙, 관광객비율(%), 전체비율(%) 칼럼이 추가된 것을 확인할 수 있다!


    5️⃣ 2010~2020년 5월까지 데이터 통합 📂

    이제 2010년 1월부터 2020년 5월까지의 모든 데이터를 하나의 파일로 통합해보자.

    df = pd.DataFrame()
    
    # 2010년 1월 ~ 2020년 5월 데이터 병합
    for yy in range(2010, 2021):
        for mm in range(1, 13):
            try:
                temp = create_kto_data(str(yy), str(mm).zfill(2))
                df = pd.concat([df, temp], ignore_index=True)
            except:
                pass
    
    # 최종 데이터 저장
    df.to_excel('./files/kto_total.xlsx', index=False)
    

    모든 파일을 순차적으로 불러와 하나의 엑셀 파일(kto_total.xlsx)로 저장 완료!

     📌 코드 설명

    • str(mm).zfill(2): 월(MM)을 두 자리 숫자로 변환 (1 → '01')
    • try-except: 특정 월의 데이터가 없을 경우 오류 발생 방지


    6️⃣국가별 데이터 저장 하기

    cntry_list = df['국적'].unique()
    for cntry in cntry_list:
        # 국적으로 필터링
        df_filtered = df[df['국적'] == cntry]
        
        # 파일명 생성
        file_name = f'./files/[국적별 관광객 데이터] {cntry}.xlsx'
        
        # 저장
        df_filtered.to_excel(file_name, index=False)

    7️⃣국내 외국인 관광객 중 상위 5개 국가를 각각 시계열

    import pandas as pd
    import matplotlib.pyplot as plt
    from matplotlib import font_manager, rc
    import platform
    
    # 운영체제에 맞는 기본 폰트 설정
    if platform.system() == 'Darwin':
        rc('font', family = 'AppleGothic')
    elif platform.system() == 'Windows':
        path = 'c:/Windows/Fonts/malgun.ttf'
        font_name = font_manager.FontProperties(fname=path).get_name()
        rc('font', family=font_name)
    else:
        print("sorry")
        
    df = pd.read_excel('./files/kto_total.xlsx')
        
    cntry_list = ['중국', '일본', '대만', '미국', '홍콩']
    
    
    for cntry in cntry_list:
        df_filter = df[(df['국적'] == cntry)]
    
        # 2. 시계열: plot()
        plt.figure(figsize=(12,4))
    
        plt.plot(df_filter['기준년월'], df_filter['관광'])
    
        plt.suptitle(f'상위 5개 국가 관광객 시계열', fontsize=15)
        plt.title(f'{cntry}인 관광객 시계열', fontsize=11)
    
        plt.xlabel('기준년월',fontsize=14)
        plt.ylabel('관광객 수', fontsize=14)
    
        plt.xticks(['2010-01','2011-01','2012-01','2013-01','2014-01','2015-01',
                   '2016-01','2017-01','2018-01','2019-01','2020-01'])
    
        plt.show()



    7️⃣중국인 관광객 히트맵 🔥

    import seaborn as sns
    
    # 기준년월을 년도와 월로 분리
    df['년도'] = df['기준년월'].str[:4]
    df['월'] = df['기준년월'].str[5:]
    
    # 중국인 관광객 데이터 추출
    df_filter = df[df['국적'] == '중국']
    
    # 피벗 테이블 생성
    df_pivot = df_filter.pivot_table(index='년도', columns='월', values='관광')
    
    plt.figure(figsize=(12, 4))
    sns.heatmap(df_pivot, annot=True, fmt='.0f', cmap='rocket_r')
    plt.suptitle('중국인 관광객 히트맵', fontsize=15)
    plt.title('년 월에 따른 관광객 수', fontsize=11)
    plt.xlabel('월', fontsize=14)
    plt.ylabel('년', fontsize=14)
    plt.show()


    🎯 최종 정리 📌

    월별 외국인 관광객 데이터를 수집 및 전처리
    불필요한 데이터 제거 및 기준년월, 대륙, 비율 칼럼 추가
    2010년 1월부터 2020년 5월까지 데이터를 통합하여 Excel 파일로 저장

    이제 시계열 그래프와 히트맵을 활용해 관광객 데이터의 변화를 쉽게 분석할 수 있다! 🚀

     

     

Designed by Tistory.