10.6

류소리·2022년 10월 6일
0

데이터분석

목록 보기
11/11

https://colab.research.google.com/drive/141g4nouddDz6QjwbRltYWF-MXl_m_J5u#scrollTo=qrvL3OCyckCe

대통령과 외래객 입국 자료(2010.01 - 2020.05)

import pandas as pd
import numpy as np

1.데이터 불러오고 다듬기

2010년 1월부터 2019년 8월까지 총 116개 엑셀파일 통합하기(전처리 과정 포함)

(1) def 함수 생성

#create_kto_data 함수 생성
def kto_data(yy, mm):

#불러올 엑셀 파일 경로 지정
filepath = '/content/drive/MyDrive/입국자/kto{}{}.xlsx'.format(yy, mm)

(2) header, skipfooter, usecols

#엑셀 파일 불러오기
#1번 컬럼을 header로 보냄
#가장 아래쪽 4개의 통계를 skip함
#???
df = pd.read_excel(file_path, header = 1, skipfooter = 4, usecols = 'A:G')

(3) format

#'년월' 컬럼 추가
df['년월'] = '{}-{}'.format(yy, mm)

(4) isin

#'국적' 컬럼에서 대륙 데이터 제거
del_list = ['아시아주', '구주', '구주 기타']

#대륙정보 미포함 조건
condition = (df['국적'].isin(del_list) == False)

#대륙정보 제거
df_country = df[condition].reset_index(drop = True)

(5)

#대륙별로 볼 것이기 때문에 '대륙' 컬럼을 따로 추가
continents = ['아시아']25 + ['아메리카']5 + ['유럽']22 + ['오세아니아']2 + ['아프리카']3 + ['기타대륙']1 + ['교포']*1

df_country['대륙'] = continents

(6) if문

#대통령 컬럼 추가
if (2008 <= int(yy) and int(yy) < 2013 ) :
df_country['대통령'] = "이명박"
elif (2013 <= int(yy) and int(yy) < 2017 ) :
df_country['대통령'] = "박근혜 "
else :
df_country['대통령'] = "문재인 "

(7) return

#결과 출력
return(df_country)

2. 데이터프레임으로 만들고 월 맞춰주기

(1) pd.DataFrame()

#담아줄 빈 프레임생성
kto_data_df = pd.DataFrame()

#2010년부터 2021년까지 이중 for문
for yy in range(2010, 2021):
    for mm in range(1, 13):
        
        try:
            
            # zfill : 2자리 수로 맞추기
            # 1의 경우 01로 맞춰주는 것
            temp = kto_data(str(yy), str(mm).zfill(2)) 
            
            #???
            kto_data_df = pd.concat([kto_data_df, temp], ignore_index=True)
        
        except:
            
            # 2020년은 5월까지만 있으니까 아마도 여기서 Pass
            pass

(2) for문

#2010년부터 2021년까지 이중 for문
for yy in range(2010, 2021):
for mm in range(1, 13):

(3) zfill

#zfill : 2자리 수로 맞추기
#1의 경우 01로 맞춰주는 것
temp = kto_data(str(yy), str(mm).zfill(2))

(4) concat

#???
kto_data_df = pd.concat([kto_data_df, temp], ignore_index=True)

(5) Pass

#2020년은 5월까지만 있으니까 아마도 여기서 Pass
pass

3. datetime으로 년월 칼럼 생성하기

import matplotlib.pyplot as plt
from datetime import datetime

(1) str.slice

#year 컬럼 추가
kto_data_df['year'] = kto_data_df['년월'].str.slice(0,4)
kto_data_df[:10]

4. 칼럼의 데이터 추출

(1) iloc

#데이터 정리
#필요 데이터
#국적, 계, 년월, 대륙, 대통령, year
kto_data_df_trim = kto_data_df.iloc[ :,[0, 6, 7, 8, 9, 10]]
kto_data_df_trim

법정 감염병 발생현황 월별

pip install openpyxl

1. 데이터를 불러오면서 역치를 시켜 주기.

(1) read_excel

disease_data_1 = pd.read_excel('/content/drive/MyDrive/입국자/conta2009.xlsx', engine='openpyxl')
disease_data_2 = pd.read_excel('/content/drive/MyDrive/입국자/conta2020.xlsx', engine='openpyxl')

(2) .T

#데이터 역치 하는 법
disease_data_1 = disease_data_1.T
disease_data_2 = disease_data_2.T

2. 칼럼으로 질병코드로 올리고, 필요 없는 인덱스 지우기

(1) iloc

#데이터 값으로 있는 인덱스[1]을 칼럼으로 올리기
disease_data_1 = disease_data_1.rename(columns = disease_data_1.iloc[1])
disease_data_2 = disease_data_2.rename(columns = disease_data_2.iloc[1])

(2) drop

#인덱스 2개 지우기
disease_data_1 = disease_data_1.drop(disease_data_1.index[0])
disease_data_1 = disease_data_1.drop(disease_data_1.index[0])
disease_data_1
disease_data_2 = disease_data_2.drop(disease_data_2.index[0])
disease_data_2 = disease_data_2.drop(disease_data_2.index[0])
disease_data_2

3. 필요한 칼럼만 뽑아내기

disease_data_1 = disease_data_1[["지카바이러스감염증", "중동호흡기증후군", "신종인플루엔자"]]
disease_data_2 = disease_data_2[["중동호흡기증후군", "신종인플루엔자", "신종감염병증후군","지카바이러스 감염증"]]

4. 두 데이터의 칼럼명 맞추고 합치기

(1) rename

#지카바이러스가 칼럼 이름이 달라 합치기 전에 하나로 묶어주었다.
disease_data_2 = disease_data_2.rename(columns={"지카바이러스 감염증":"지카바이러스감염증"},inplace=True)
disease_data_2

(2) concat

#두 데이터 합하기
disease_data = pd.concat([disease_data_1, disease_data_2])
disease_data

5. 결측치 0값으로 만들기

(1) fillna

#결측치는 모두 0으로 대체
disease_data = disease_data.fillna(0)
disease_data

(2) np.where

#문자열을 "0"으로 만들어주기
disease_data['중동호흡기증후군'] =np.where(disease_data['중동호흡기증후군'] == '-', '0', disease_data['중동호흡기증후군'] )
disease_data['중동호흡기증후군']
disease_data['지카바이러스감염증'] =np.where(disease_data['지카바이러스감염증'] == '-', '0', disease_data['지카바이러스감염증'] )
disease_data['지카바이러스감염증']
disease_data['신종인플루엔자'] =np.where(disease_data['신종인플루엔자'] == '-', '0', disease_data['신종인플루엔자'] )
disease_data['신종인플루엔자']

(3) astype

#데이터 타입 바꾸기
disease_data['지카바이러스감염증'] = disease_data['지카바이러스감염증'].astype(float)
disease_data['중동호흡기증후군'] = disease_data['중동호흡기증후군'].astype(float)
disease_data['신종인플루엔자'] = disease_data['신종인플루엔자'].astype(float)

6. 큰 데이터와 '년월'로 합치기 위해 칼럼 추가하기

(1) data.index

#index에 있는 년월을 '년월'컬럼으로 추가하기
disease_data['년월'] = disease_data.index
disease_data

7. '년월' 4개글자 결측값 만든기

(1) map

#map을 사용 결측값 만들기
disease_data['년월'] = disease_data['년월']disease_data['년월'].map(len) != 4]
disease_data

외래국과 감염병 자료 합쳐주기

1. 외래객 입국 데이터와 합쳐주기 위해 컬럼 형식 맞춰주기

(1) query

#년월 컬럼을 날짜 형식으로
disease_data['년월'] = pd.to_datetime(disease_data['년월'])
disease_data = disease_data.query('"2010-01" <= 년월 <= "2020-05"')

(2) astype, str.slice

#월만 보이게 잘라주기
disease_data['년월'] = disease_data['년월'].astype(str)
disease_data['년월'] = disease_data['년월'].str.slice(0, 7)
disease_data

2. DataFrame으로 바꿔주고 데이터 묶어주기

(1) DataFrame

#DataFrame 만들기
combined_data = pd.DataFrame()

(2) merge

#merge(가로)로 외래객,감염병 "년월"로 묶어주기
combined_data = pd.merge(kto_data_df_trim, disease_data, left_on = '년월', right_on = '년월', how = 'inner')
combined_data

그래프 그리기

#(1)신종감염병증후군

import seaborn as sns
import matplotlib.pyplot as plt

plt.plot(combined_data['년월'], combined_data['신종감염병증후군'], color='gray', linestyle='-') ## 선 그래프 출력
plt.xticks(["2010-01", "2011-01", "2012-01", "2013-01", "2014-01", "2015-01", "2016-01", "2017-01", "2018-01", "2019-01", "2020-01"])

merged_data.년월 = merged_data.년월.astype(str)

fig, ax1 = plt.subplots(figsize=(20,15))
ax2=ax1.twinx()
sns.barplot(x='년월', y='계', data=merged_data,color = 'pink', ax=ax1)
sns.lineplot(x='년월',y='지카바이러스감염증', data=merged_data,marker='d', ax=ax2)
sns.lineplot(x='년월',y='신종인플루엔자', data=merged_data,marker='d', ax=ax2)
sns.lineplot(x='년월',y='중동호흡기증후군', data=merged_data,marker='d', ax=ax2)
sns.lineplot(x='년월',y='신종감염병증후군', data=merged_data,marker='d', ax=ax2)
plt.show()

profile
새싹 빅테이터 개발자

0개의 댓글