본문 바로가기
풀스택 개발 학습 과정/데이터

[데이터 분석] Pandas 문제 실습 - 3 품목별 수출입실적 분석

by 육츠 2023. 11. 16.

엑셀을 읽기 위해서는 따로 다운 받을 패키지가 존재한다."

!pip install openpyxl

 

데이터 읽어오기

import pandas as pd
df = pd.read_excel('import_export.xls', skiprows= [0,1,2,3], engine='openpyxl')
df.head()

skiprow() 의 이유: 표를 만들기 위해 사용된 행 서식을 제거

불필요한 행 삭제 및 인덱스 초기화

0 , 485 행 : '총계', '설명' 에 해당하는 row 삭제

df = df.drop(0) # 0행만
# df.drop(len(df), inplace= True) # 마지막행

import numpy as np
df.index = np.arange(485)
df.head()

# df = df.reset_index(drop=True) # 0부터 초기화한 인데스

485행이 불필요한 행이라고 생각되지 않아 삭제하지 않았다.
np.arange() 를 이용하여 다시 번호를 매기는 방법도 있으며 reset_index(drop = True) 를 사용하여 인덱스 번호를 다시 매겨준다.

 

컬럼 데이터 타입 변경

# 수출중량~무역수지 : Object 타입 ==> float으로 데이터 타입 변경
df[['수출중량','수입중량','수출금액','수입금액','무역수지']] = df[['수출중량','수입중량','수출금액','수입금액','무역수지']].replace('[,]','',regex=True).astype(float)

df.info()

# df.loc[:,'수출중량':'무역수지'] 행과 열을 지정하여 조회 가능
# df.loc[:,'수출중량':'무역수지'] = df.loc[:,'수출중량':'무역수지'].replace(',', '', rgex=True).astype(float)

# df[df.columns[3:]] = df[df.columns[3:]].astype(np.float32)
# 부분 일치하는 문자열

열의 순서를 이용해서 인덱싱을 할 수 없다. (잊지말기!)
열의 순서를 통해 인덱싱이나 슬라이싱 하려면  columns 속성을 이용해야 한다. => 그래서 값을 각각 나열한 이유
때문에 loc() 로 모든 행과 변경하고 싶은 열을 슬라이싱 하여 컬럼의 데이터 타입을 변경해준다.

연도별 무역수지 평균 및 합계

df.groupby('기간')['무역수지'].agg(['mean','sum'])

grouped = df.groupby('기간')[['무역수지']].agg(['mean','sum

grouped.columns = ['평균 무역수지','총 무역수지']
# 천단위 , 와 소수점 두 자리까지
for col in ['평균 무역수지','총 무역수지']:
    grouped[col] = grouped[col].apply(lambda x : f'{x:,.2f}')
grouped

밑에는 시각적으로 보기 좋게 데이터를 변경해준 요소들이다.

연도별 무역수지가 가장 적은 품목은?

grouped = df.groupby('기간')[['품목명','무역수지']]

for year,group in grouped:
    print('연도', year)
    display(group.sort_values('무역수지').head(1))
    print('-'* 20)
    print()

for문 안에 year 은 df 의 '기간'이 group 에는 '품목명'과 '무역수지' 가 들어있다. 그 중 무역수지에 관해 값을 정렬하여 첫 번 째 값을 뽑는다.

** # 전체 데이터 안에서 무역수지 가장 적은 품목은?

df[df['무역수지'].min() == df['무역수지']][['기간','품목명','무역수지']]

** # 전체 데이터 안에서 무역수지 가장 많은 품목은?  

df[df['무역수지'].max() == df['무역수지']][['기간','품목명','무역수지']]

 

데이터 시각화

import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'Malgun Gothic'

 

필요한 패키지 다운로드 & 폰트 설정

df2 = df.groupby('기간')[['수출금액','수입금액']].sum()
df2
plt.plot(df2.index, df2['수출금액'], 'bo--', label = '수출금액')
plt.plot(df2.index, df2['수입금액'], 'r^:', label = '수입금액')
plt.title('연도별 수입수출 현황')
plt.xlabel('연도')
plt.ylabel('금액')
plt.legend()

plt.show()

수출금액은 파란색의 동그란마킹의 부분선, 수입금액은 붉은색으로 세모마킹의 점선으로 그려진다.