from IPython.core.display import display, HTML
display(HTML("<style> .container{width:90% !important;}</style>"))
한개의 파일¶
데이터 다운로드¶
! pip install xlrd
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()
데이터 확인¶
데이터 확인¶
kto_201901.shape
kto_201901.info()
kto_201901.describe()
=> 관광의 목적으로 가장 많은 외국인이 입국하는 특징이 있을 것 같다
최소값이 0인 데이터 확인¶
관광, 상용, 공용, 유학/연수에서 최소값이 0인것이 있다. 어떤 파일인지 확인해보자.
# 각 컬럼에서 0인 부분을 필터링하자
mask = (kto_201901['관광'] == 0) | (kto_201901['상용'] == 0) | (kto_201901['공용'] == 0) | (kto_201901['유학/연수'] == 0)
kto_201901[mask]
교포는 기타로 등록되어있기 때문에 0이 4개이다.
데이터 전처리¶
데이터프레임에 기준년월 추가¶
kto_201901['기준년월'] = '2019-01'
kto_201901
국적 데이터만 남기기¶
kto_201901['국적'].unique()
국적 column에 대륙이 포함되어있으므로 대륙은 제외해야한다.
대륙 mask를 만들어서 국적 column에서 지워주자
# 대륙 mask
continents = ['아시아주', '미주', '구주', '대양주', ' 아프리카주', '기타대륙', '국적미상','교포소계']
# 국적 column에서 대륙 mask지워주기
mask = ( kto_201901.국적.isin(continents) == False )
kto_201901_country = kto_201901[mask]
kto_201901_country['국적'].unique()
# 남겨진 데이터를 확인해보자
kto_201901_country.head()
# 인덱스를 재설정해주자 ( 0부터 시작하도록)
kto_201901_country_new = kto_201901_country.reset_index(drop=True)
kto_201901_country_new.head()
대륙column을 만들자¶
엑셀로 각 대륙에 몇개국이 속해있는지 세어보니 다음과 같다.
아시아주 : 25
미주 : 5
구주(유럽) : 23
대양주(오세아니아) : 3
아프리카주 : 2
기타대륙 : 1
교포소계 : 1
대륙 column에 넣을 continents 리스트를 만들어보자
continents2 = ['아시아'] * 25 + ['아메리카'] * 5 + ['유럽'] * 23 + ['오세아니아'] * 3 + ['아프리카'] * 2 + ['기타대륙'] + ['교포']
print(continents2)
이렇게 만들어진 continents를 kto_201901_country_new 에 추가하자
kto_201901_country_new['대륙'] = continents2
kto_201901_country_new.tail()
데이터 분석¶
국적별 관광객 비율¶
kto_201901_country_new['관광객비율(%)'] = round(kto_201901_country_new['관광'] / kto_201901_country_new['계'] * 100, 1)
kto_201901_country_new.head()
# 위를 내림차순으로 정렬해보자
kto_201901_country_new.sort_values(by = '관광객비율(%)', ascending=False).head()
대만, 마카오, 홍콩, 일본, 대양주 기타 국적의 국내 방문 외국인은 90% 이상이 관광을 목적으로 방문한다 !
# 오름차순으로 정렬하면 어떨까?
kto_201901_country_new.sort_values(by = '관광객비율(%)', ascending = True).head()
방글라데시, 스리랑카, 파키스탄, 캄보디아 국적의 외국인들은 관광목적으로 방문하는 비율이 25%가 안 됨을 알 수 있다.
대륙별 관광객 비율의 평균¶
# 피벗 테이블 !!
kto_201901_country_new.pivot_table(values = '관광객비율(%)', index = '대륙', aggfunc = 'mean')
평균 관광객 비율이 높은 대륙은 오세아니아임을 확인할 수 있다.
중국인 중에서 관광 목적으로 방문하는 비율¶
mask = (kto_201901_country_new.국적 == '중국')
kto_201901_country_new[mask]
중국인 중 약 81.5%가 관광 목적으로 우리나라를 방문하는 것으로 나타난다.
기준년월별로 전체 외국인 관광객 대비 국적별 관광객 비율¶
tourist_sum = sum(kto_201901_country_new['관광'])
tourist_sum
# 전체 비율(%) column 생성
kto_201901_country_new['전체비율(%)'] = round(kto_201901_country_new['관광'] / tourist_sum * 100, 1)
kto_201901_country_new.head()
# 내림차순으로 정렬해보자
kto_201901_country_new.sort_values('전체비율(%)', ascending = False).head()
중국, 일본, 대만, 미국, 홍콩 순으로 관광객수가 많음을 확인할 수 있다
여러개의 파일¶
함수 생성¶
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)
반복문으로 다수의 엑셀 데이터를 불러와 합치자¶
년월 데이터를 불러오기 위해 이중반복문 사용¶
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)
빈 데이터프레임 생성¶
df = pd.DataFrame()
구현해보자¶
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)
오류가 나는 이유는 excel file이 2019-08까지만 있기 때문이다. 나머지 파일은 잘 담겨있음을 아래를 통해 확인할 수 있다.
df.tail()
오류 없이 구현해보자¶
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.info()
데이터 시각화¶
시계열 그래프 그리기¶
# 한글이 정상적으로 표현되도록 출력시 글꼴 지정
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')
import matplotlib.pyplot as plt
# 중국 국적의 데이터 필터링
mask = (df['국적'] == '중국')
df2 = df[mask]
df2.head()
# 그래프 크기 조절
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년 여름에는 관광객 수가 큰 폭으로 감소한다
히트맵 그래프 그리기¶
df['년도'] = df['기준년월'].str.slice(0,4)
df['월'] = df['기준년월'].str.slice(5,7)
df.head()
# 중국 국적의 데이터 필터링
mask = (df['국적'] == '중국')
df2 = df[mask]
df2.head()
# pivot_table로 매트릭스 형태로 변환
df3 = df2.pivot_table(values='관광', index='년도', columns='월')
df3
! pip install seaborn
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월 이슈 : 메르스¶
2017년 3~6월 이슈 : 사드 보복 조치¶
'Programming > Python' 카테고리의 다른 글
f-string (0) | 2021.05.31 |
---|---|
통계분석_성별/혼인/피부/가격/재사용 등 (0) | 2020.05.24 |
[ 모두의 데이터 분석 with python ] 3.지하철 데이터 (0) | 2020.05.08 |
[ 모두의 데이터 분석 with python ] 2. 인구 데이터 (0) | 2020.05.05 |
[ 모두의 데이터 분석 with python ] 1. 기온 데이터 (0) | 2020.05.05 |