728x90
# https://datalab.visitkorea.or.kr/datalab/portal/main/getMainForm.do
# 한국관광데이터랩>관광통계/실태조사>방한외래관광객>목적별
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Windows용 한글 폰트 오류 해결
from matplotlib import font_manager, rc
font_path = "C:/Windows/Fonts/malgun.ttf"
font_name = font_manager.FontProperties(fname = font_path).get_name()
rc("font", family = font_name)
kto_201001 = pd.read_excel("./data/외국인관광객_실습데이터/kto_201001.xlsx",
usecols = "A:G", header = 1, skipfooter = 4) # header = 1: 0번째 행은 안씀
kto_201001.head()
kto_201001.tail()
데이터 탐색
- 데이터가 2010년 01월부터 2020년 05월까지 월별로 분할되어 있기 때문에 각각 월별로 데이터를 하나씩 가져와 하나의 테이블로 통합해야함
kto_201001.shape
(67, 7)
kto_201001.dtypes
국적 object
관광 int64
상용 int64
공용 int64
유학/연수 int64
기타 int64
계 int64
dtype: object
kto_201001.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_201001.describe()
- 평균적으로 관광 목적으로 가장 많은 외국인이 입국함
- 계를 제외한 모든 컬럼에서 최솟값이 0임
- 확인 필요
kto_201001[(kto_201001["관광"] == 0) | (kto_201001["상용"] == 0) |(kto_201001["공용"] == 0) | (kto_201001["유학/연수"] == 0) | (kto_201001["기타"] == 0)]
- 교포소계와 교포는 4개 컬럼이 모두 0임
기준연월 추가
- 각 월별 데이터가 추가될 예정이기 때문에 각 데이터마다 기준연월 정보가 추가되어야 구별이 가능
kto_201001["기준연월"] = "2010-01"
kto_201001.head()
국적 확인
kto_201001["국적"].unique()
array(['아시아주', '일본', '대만', '홍콩', '마카오', '태국', '말레이시아', '필리핀', '인도네시아',
'싱가포르', '미얀마', '베트남', '인도', '스리랑카', '파키스탄', '방글라데시', '캄보디아', '몽골',
'중국', '이란', '이스라엘', '터키', '우즈베키스탄', '카자흐스탄', 'GCC', '아시아 기타', '미주',
'미국', '캐나다', '멕시코', '브라질', '미주 기타', '구주', '영국', '독일', '프랑스',
'네덜란드', '스웨덴', '스위스', '이탈리아', '덴마크', '노르웨이', '벨기에', '오스트리아', '스페인',
'그리스', '포르투갈', '핀란드', '아일랜드', '우크라이나', '러시아', '크로아티아', '루마니아',
'불가리아', '폴란드', '구주 기타', '대양주', '오스트레일리아', '뉴질랜드', '대양주 기타',
'아프리카주', '남아프리카공화국', '아프리카 기타', '기타대륙', '국적미상', '교포소계', '교포'],
dtype=object)
- 아시아주, 미주, 교포소계 등 국가가 아닌 값이 포함되어 있음
continents_list = ["아시아주", "미주", "구주", "대양주", "아프리카주", "기타대륙", "교포소계"]
kto_201001_country = kto_201001[kto_201001["국적"].isin(continents_list) == False]
kto_201001_country.head()
# 인덱스 번호 초기화
kto_201001_country_newindex = kto_201001_country.reset_index(drop = True)
kto_201001_country_newindex.head()
# 대륙 정보 파악
kto_201001[kto_201001["국적"].isin(contents_list)]
kto_201001.iloc[32:56]
- 대륙 컬럼의 내용은 순서대로 아시아 25개, 미주 5개, 유럽23개, 오세아니아 3개, 아프리카 2개, 기타 1개, 교포1개
continents = ["아시아"]*25+["아메리카"]*5+["유럽"]*23+["오세아니아"]*3+["아프리카"]*2+["기타"]+["교포"]
type(continents)
list
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("관광객비율(%)", ascending = False)
...
# 관광객 비율 컬럼으로 오름차순 정렬
kto_201001_country_newindex.sort_values("관광객비율(%)", ascending = True)
...
# 대륙별 관광객 비율 평균
kto_201001_country_newindex.groupby("대륙")["관광객비율(%)"].mean()
대륙
교포 0.000000
기타 76.900000
아메리카 60.760000
아시아 49.544000
아프리카 26.550000
오세아니아 79.733333
유럽 60.926087
Name: 관광객비율(%), dtype: float64
- 평균 관광객 비율이 높은 대륙은 오세아니아
- 아프리카에서 관광목적으로 방문하는 외국인은 26.6% 뿐임
- 아시아의 관광객 비율은 49.5%로 유럽보다 낮음
- 소득수준이 낮은 국가에서는 관광 목적으로 방문하는 외국인 비율이 낮은 것으로 보임
# 중국 국적 필터링
kto_201001_country_newindex[kto_201001_country_newindex["국적"] == "중국"]
전체 외국인 관광객 대비 국적별 관광객 비율
# 전체 외국인 관광객
tourist_sum = sum(kto_201001_country_newindex["관광"])
tourist_sum
400818
kto_201001_country_newindex["전체비율(%)"] = round(kto_201001_country_newindex["관광"] / tourist_sum * 100, 1)
kto_201001_country_newindex.head()
# 전체비율 컬럼 기준으로 내림차순 정렬
kto_201001_country_newindex.sort_values("전체비율(%)", ascending = False)
...
데이터 전처리
- 모든 파일에 대해 같은 작업을 반복해야하기 때문에 함수로 정리
def create_kto_data(yy, mm):
# 1. 불러올 엑셀 파일 경로를 지정
file_path = f"./data/외국인관광객_실습데이터/kto_{yy}{mm}.xlsx"
# 2. 엑셀 파일 불러오기
df = pd.read_excel(file_path, header = 1, skipfooter = 4, usecols = "A:G")
# 3. "기준연월" 컬럼 추가
df["기준연월"] = f"{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
"2".zfill(2) # 0이 포함된 2자리수
'02'
# 2010년 2월 데이터로 함수 테스트
kto_test = create_kto_data(2010, "2".zfill(2))
kto_test.head()
반복문을 통해 다수의 엑셀 데이터를 불러와서 합치기
df = pd.DataFrame()
for yy in range(2010, 2021):
for mm in range(1, 13):
tmp = create_kto_data(str(yy), str(mm).zfill(2))
df = pd.concat([df, tmp], ignore_index = True)
if yy == 2020 and mm == 5:
break
df.head()
df.tail()
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.to_excel("./data/kto_total.xlsx", index = False)
국적별 필터링 데이터 저장
- 관광객 데이터를 국적별로 필터링해서 엑셀 파일로 저장
df_filter = df[df["국적"] == "중국"]
df_filter.head()
# 국적 리스트
country_list = df["국적"].unique()
country_list
array(['일본', '대만', '홍콩', '마카오', '태국', '말레이시아', '필리핀', '인도네시아', '싱가포르',
'미얀마', '베트남', '인도', '스리랑카', '파키스탄', '방글라데시', '캄보디아', '몽골', '중국',
'이란', '이스라엘', '터키', '우즈베키스탄', '카자흐스탄', 'GCC', '아시아 기타', '미국',
'캐나다', '멕시코', '브라질', '미주 기타', '영국', '독일', '프랑스', '네덜란드', '스웨덴',
'스위스', '이탈리아', '덴마크', '노르웨이', '벨기에', '오스트리아', '스페인', '그리스', '포르투갈',
'핀란드', '아일랜드', '우크라이나', '러시아', '크로아티아', '루마니아', '불가리아', '폴란드',
'구주 기타', '오스트레일리아', '뉴질랜드', '대양주 기타', '남아프리카공화국', '아프리카 기타',
'국적미상', '교포'], dtype=object)
len(country_list)
60
# 국적별 데이터를 엑셀로 저장
for country in country_list:
df_filter = df[df["국적"] == country]
df_filter.to_excel(f"./data/country/[국적별_관광객_데이터]{country}.xlsx", index = False)
데이터 분석
꺾은 선 그래프
# 중국 국적 데이터 필터링
df_filter = df[df["국적"] == "중국"]
df_filter.head()
plt.figure(figsize = (12, 4))
plt.plot(df_filter["기준연월"], df_filter["관광"])
plt.title("중국 국적의 관광객 추이")
plt.xlabel("기준연월")
plt.ylabel("관광객수")
# 눈금이 많으므로 월별 데이터만 표시
x_tick = [f"{i}-01" for i in range(2010, 2021)]
plt.xticks(x_tick)
plt.show()
# 우리나라를 방문하는 외국인 관광객 중 상위 5개 국가의 시각화
country_list = ["일본", "중국", "대만", "미국", "홍콩"]
for country in country_list:
# 국적 관광객만 필터링
df_filter = df[df["국적"] == country]
# 그래프
plt.figure(figsize = (12, 4))
plt.plot(df_filter["기준연월"], df_filter["관광"])
plt.title(f"{country} 국적의 관광객 추이")
plt.xlabel("기준연월")
plt.ylabel("관광객수")
plt.xticks(x_tick)
plt.show()
히트맵
- x축에 month, y축에 year를 넣고 내용에는 관광객 숫자가 들어가는 히트맵
df.head()
df["연도"] = df["기준연월"].str[:4]
df["월"] = df["기준연월"].str[5:7]
df.head()
# 중국 데이터 필터링
df_filter = df[df["국적"] == "중국"]
df_filter.head()
df_pivot = df_filter.pivot_table(index = "연도", columns = "월", values = "관광")
df_pivot
plt.figure(figsize = (16, 10))
sns.heatmap(df_pivot, annot = True, fmt = ".0f", cmap = "rocket_r") # 디폴트값 cmap = "rocket"의 reverse
plt.title("중국 관광객 히트맵")
plt.show()
# 상위 5개국에 대한 히트맵
for country in country_list:
df_filter = df[df["국적"] == country]
df_pivot = df_filter.pivot_table(index = "연도", columns = "월", values = "관광")
plt.figure(figsize = (16, 10))
sns.heatmap(df_pivot, annot = True, fmt = ".0f", cmap = "rocket_r")
plt.title(f"{country} 관광객 히트맵")
plt.show()
시각화 해석
- 중국인 그래프에서 보이는 특징
- 2010년부터 2016년가지 관광객 수가 꾸준히 증가하는 추세
- 2017년 초에 관광객 수가 큰 폭으로 감소
- 2017년 중순부터 관광객 수가 완만하게 증가하는 추세
- 매년 여름에 관광객 수가 최댓값을 가짐
- 단, 2015년 여름에는 관광객 수가 큰 폭으로 감소
- 2020년 초에 관광객 수가 0에 가까워질 만큼 급격히 감소
- 계절적 특징
- 여름 > 봄, 가을 > 겨울 순으로 많이 방문함
- 트렌드
- 중국인 관광객 수가 계속 증가
- 이벤트
- 2015년 여름, 2017년 3월, 2020년 2월에 부정적인 이벤트가 있음
728x90
'07_Data_Analysis' 카테고리의 다른 글
20_별다방, 서울시 데이터 (2) | 2025.03.21 |
---|---|
19_Wordcloud, Polium_제주도 맛집 데이터 (6) | 2025.03.20 |
17_유투브 랭킹 데이터 분석 (0) | 2025.03.19 |
16_기온 데이터 분석 (0) | 2025.03.19 |
15_카이제곱 검정(교차분석) (0) | 2025.03.19 |