Snoopy [Mini-Project 2] 최근 11년간 소비자물가지수 데이터 EDA
프로젝트/AIS

[Mini-Project 2] 최근 11년간 소비자물가지수 데이터 EDA

Sooyoon Jeong 2022. 11. 11.

본 프로젝트는 2022년 10월 13일 ~ 2022년 10월 16일에 진행했던 프로젝트입니다.


1. 데이터 출처 및 설명

[링크] KOSIS

 

kosis에서 제공하는 소비자 물가지수 데이터로 최근 11년간 소비자 물가지수를 전처리한 후 EDA하는 프로젝트를 진행했다.

데이터는 연도 및 월별, 지출목적별, 시도별에 따른 소비자 물가지수가 포함되어 있다.

 

*기간:  2012.01 ~ 2022.09

*지출목적: 총 지수를 포함한 13개 지출목적

'총지수', '식료품 및 비주류음료', '주류 및 담배', '의류 및 신발', '주택, 수도, 전기 및 연료', '가정용품 및 가사 서비스', '보건', '교통', '통신', '오락 및 문화', '교육', '음식 및 숙박', '기타 상품 및 서비스'

*지수 기준: 2020 = 100

* 시도: 17개 시도

 

2. 라이브러리 로드

사용할 라이브러리를 불러와줬다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from glob import glob
import koreanize_matplotlib

# 그래프에 retina display 적용
%config InlineBackend.figure_format = 'retina'

 

3. 파일 로드 및 파일 미리보기

file_name = glob("*.csv")[0]
df = pd.read_csv(file_name, encoding = "cp949")
df.shape

 

head(3)
tail(2)

 

head와 tail로 파일의 일부를 확인해 본 결과, 분석에 용이한 tidy data 형태가 아님을 확인 할 수 있다.

추후 melt를 통해 tidy data로 변형해줄 예정이다.

 

melt로 녹이기 전에 df의 컬럼을 확인해보았다.

df의 컬럼명

 

'Unnamed: 133'이라는 불필요한 컬럼이 들어있는 것을 확인하여  drop으로 삭제해주었다.

불필요한 컬럼을 삭제한 후의 컬럼명 확인

 

'Unnamed: 133' 컬럼이 삭제되고 컬럼수도 134에서 133으로 줄은 것을 확인할 수 있다.

 

4. 데이터 전처리

1️⃣ melt로 tidy data 만들기

melt를 이용하여 시도별, 지출목적별, 항목, 단위 컬럼은 남겨주고  날짜 컬럼을 녹여주었다.

그리고 값은 소비자물가지수라는 컬럼명으로 넣어주었다.

 

그런데 지출목적별 컬럼을 보면 지출목적의 코드와 지출목적이 함께 기재되어 있다.

숫자를 지출목적 코드 변수로, 지출목적을 지출목적명 변수로 만들어주었다.

 

2️⃣ '지출목적별' 컬럼을 숫자와 문자로 구분하여 '지출목적명'컬럼과 '지출목적코드'컬럼에 담아주기

# 지출목적명 만들기
import re
spend_name = []
for i in range(len(df_melt["지출목적별"])):
    a = re.sub(r'[0-9]+', '',df_melt["지출목적별"][i]).strip()
    spend_name.append(a)
    
df_melt["지출목적명"] = pd.DataFrame(spend_name)
display(df_melt.head(3))
print(df_melt.shape)

지출목적명 컬럼에 숫자는 제거되고, 문자만 깔끔하게 담긴 것을 확인할 수 있다.

 

# 지출목적코드 만들기
spend_code = []
for i in range(len(df_melt["지출목적별"])):
    a = re.sub(r'[^0-9]', '',df_melt["지출목적별"][i]).strip()
    spend_code.append(a)
    
df_melt["지출목적코드"] = pd.DataFrame(spend_code)
display(df_melt.head(3))
df_melt.tail(3)

지출목적코드에 숫자만 깔끔하게 담긴 것을 확인할 수 있다.

 

3️⃣ 날짜컬럼을 구분하여, 연도 컬럼과 월 컬럼으로 생성하기

날짜 컬럼을 보면 '2012.01 월' 형식으로

연도와 월이 함께 들어가있고 '월'이라는 글자도 함께 있음을 확인할 수 있다.

 

이를 연도와 월로 구분하여 각각의 컬럼에 담아주었다.

# 연, 월 만들기
df_melt["연도"] = df_melt["날짜"].str.replace("월", "").str.strip().str[:4].astype("int")
df_melt["월"] = df_melt["날짜"].str.replace("월", "").str.strip().str[-2:].astype("int")
df_melt.head(3)
df_melt.tail(3)

 

4️⃣ 사용하지 않을 컬럼 삭제하기

사용하지 않을 컬럼인  ["지출목적별", "항목", "단위", "단위", "날짜"]을 삭제해주었다.

 

5️⃣ 컬럼 순서 변경하기

지출목적과 기간이 먼저 나오고 소비자물가지수가 나오는 것이 좋을 것 같아 순서를 바꿔주었다.

 

최종 완성된 데이터프레임이다.

 

5. 시도를 입력하면 해당 시도에 대한 소비자물가지수가 출력되는 함수 만들기

최종 데이터프레임에는 총 17개의 시도가 포함되어 있어서 시도를 구분해서 보는 것도 좋을 것 같다는 생각이 들었다.

시도명을 입력하면 해당 시도에 대한 소비자물가지수 데이터프레임만 출력되도록 하는 함수를 만들어 보았다.

 

def df_dist(city):
    from glob import glob
    file_name = glob("*.csv")[0]
    
    df = pd.read_csv(file_name, encoding = "cp949")
    df = df.drop(columns = "Unnamed: 133")
    
    df = df.loc[df["시도별"] == f'{city}', :]
    df_melt = pd.melt(df, id_vars = df.columns[:4], var_name = "날짜", value_name = "소비자물가지수")
    
    import re
    spend_name = []
    for i in range(len(df_melt["지출목적별"])):
        a = re.sub(r'[0-9]+', '',df_melt["지출목적별"][i]).strip()
        spend_name.append(a)
    
    df_melt["지출목적명"] = pd.DataFrame(spend_name)
    
    
    spend_code = []
    for i in range(len(df_melt["지출목적별"])):
        a = re.sub(r'[^0-9]', '',df_melt["지출목적별"][i]).strip()
        spend_code.append(a)
    
    df_melt["지출목적코드"] = pd.DataFrame(spend_code)
    
    df_melt["연도"] = df_melt["날짜"].str.replace("월", "").str.strip().str[:4].astype("int")
    df_melt["월"] = df_melt["날짜"].str.replace("월", "").str.strip().str[-2:].astype("int")
    
    df_city = df_melt.drop(columns = ["지출목적별", "항목", "단위", "단위", "날짜"])
    
    return  df_city

 

함수에 "제주특별자치도:를 입력하면 제주시에 대한 데이터프레임만 출력되는 것을 확인할 수 있다.

jeju = df_dist("제주특별자치도")
display(jeju)
jeju["시도별"].unique()

 

댓글