요즘 뉴스를 보면 "물가가 너무 높다"는 이야기가 빠지지 않는다. 편의점에 라면 하나를 사러가도 가격이 전과 다르다는 걸 체감하고, 외식비도 만 원 근처로 쓰는게 당연한 세상이 왔다. 내 월급만 빼고 다 올랐다.
한국의 물가상승률 추이를 살펴보면 리만브라더스 사태가 발생한 2008년보다 2022년에 더 높은 물가상승률을 기록했다. 러시아와 우크라이나 전쟁의 여파로 생각되는데 이렇게 수치로 직접 확인해보니 체감물가 뿐만아니라 실제물가도 확실히 많이 오르긴 했나보다.
근데 나는 구체적으로 어떤 상품의 가격이 가장 많이 올랐는지가 문득 궁금해졌다. 한번 확인해보자
활용 데이터
농산물유통정보 KAMIS API
전국 도·소매시장에서 실제로 거래되는 농수산물의 가격을 API 형식으로 제공해준다.
연도별 소비자물가 등락률 - KOSIS
평균적으로 물가가 얼마나 올랐는지 확인하고 상품 개별의 물가상승률과 비교하기 위해서 수집했다.
분석 과정 및 결론
1. KAMIS API를 이용한 농수산물 가격 데이터 수집
KAMIS API는 다양한 형식의 농수산물 가격 데이터를 제공한다. 나는 그 중에서 나는 월별 도·소매 가격정보 API를 이용했고, 제공되는 데이터는 아래와 같이 전달된다.
데이터를 살펴보던 중 쌀과 같이 거래가 활발한 상품은 가격정보의 결측값이 없었으나, 쑥갓과 같은 상품들의 가격정보에는 결측값이 존재했다. 그래서 'yearavg' 즉 해당 연도의 평균가격 데이터를 사용했다. 그렇게 전쟁발발 이후인 2022년부터 현재까지의 농수산물 연도별 평균 가격데이터를 확보했다.
2. 물가상승률 계산
상승률은 "( 최종값 - 초기값 ) ÷ 초기값 × 100" 으로 계산한다. 이 공식을 이용하여 2022년 부터 2025년까지 상품별로 물가가 얼마나 올랐는지 계산했다.
수산물 중에서는 고등어의 가격이 가장 많이 상승했다. 고등어는 15도 정도의 따뜻한 물에서 서식하는 난류성 어종이다. 그러나 최근 이상기후로 인해 수온이 급등하면서 고등어가 우리 해역에서 다른 해역으로 이동하여 어획량이 대폭 줄어들었다. 그렇게 공급이 줄면서 가격이 상승한 것으로 보인다.
농산물 중에서는 감귤의 가격이 159.1%상승하며 가장 큰 폭으로 올랐다. 2022년 부터 2025년까지 3년간 평균 물가상승률은 11%와 비교하면 엄청난 수치이다. 제주도 감귤진흥과에 따르면 2013년 부터 지금까지 2023년까지 감귤 재배면적과 생산량이 꾸준하게 줄어들고 있다. 거기에 더해 수산물과 마찬가지로 여름의 폭염과 잦은 강우로 인해 수확량이 줄어드는 것도 한 목 했다.
쌀 가격은 오히려 떨어졌다는 것이 신기했다. 쌀은 정부가 직접 쌀을 매입해 공급량을 조절하여 평년 가격 수준을 유지하려고 노력한다. 또, 우리나라의 주식이다 보니 쌀 농사를 짓는 사람이 많아 매년 과잉공급 되어 가격이 잘 오르지 않는다.
가장 큰 폭으로 상승한 상품은 감귤이었다. 올 겨울 집에 귤이 잘 안보이던 이유가 이것 때문이었나 보다. 주식 말고 감귤에 투자했다면...
또 기후변화의 영향을 체감할 수 있었다. 지난 의성산불도 그렇고 지구가 걱정된다.
쿠키
나는 치킨을 굉장히 좋아한다. 1주일에 1마리는 먹는거같은데 오죽했으면 부모님이 다음생에는 닭으로 태어날거라고 이야기하신다. 근데 요즘 치킨 가격이 너무 비싸다. 이게 물가 상승 때문인지 대기업의 횡포인지 확인해 보고 싶었다.
치킨의 주재료 닭, 식용유, 밀가루 가격 변동을 살펴봤다.
2022년에 가격이 많이 올랐다. 러시아 우크라이나 전쟁의 여파다. 근데 2023년 이후로는 모든 재료의 가격이 떨어지고 있다. 근데 치킨값은 왜 떨어질 생각을 안하고 계속 올라가는 것일까? 한 번 올라간 가격은 절대 떨어지지 않는 다더니 그 말이 맞나보다.
최종코드
!pip install koreanize_matplotlib
import koreanize_matplotlib
import requests
import numpy as np
import pandas as pd
from tqdm import tqdm
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
# API 요청
df = pd.DataFrame(columns=['품목명', '품목코드']) # 빈 데이터프레임 생성
for idx in tqdm(range(len(code_df))):
name = code_df.loc[idx, '품목명']
code = code_df.loc[idx, '품목코드']
params = {
"p_cert_key": API_KEY,
"p_cert_id": ID,
"p_returntype": "json",
"p_yyyy": "2025",
"p_period": "3",
"p_itemcode": code, # 품목코드
"p_convert_kg_yn": "Y", # KG 단위 환산
"p_graderank": "1" # 물품 등급
}
response = requests.get(url, params=params)
try:
data = response.json()
price_data = data.get('price', [])
if not price_data:
continue # 가격 정보가 없으면 건너뜀
df.at[idx, '품목명'] = name
df.at[idx, '품목코드'] = code
if isinstance(price_data, list):
for price_list in price_data:
if price_list.get('productclscode') == '01': # 제품 분류 코드 확인
for price in price_list.get('item', []):
df.at[idx, price['yyyy']] = int(price['yearavg'].replace(",", ""))
elif isinstance(price_data, dict):
if price_data.get('productclscode') == '01': # 단일 딕셔너리 데이터 처리
for price in price_data.get('item', []):
df.at[idx, price['yyyy']] = int(price['yearavg'].replace(",", ""))
except (requests.exceptions.RequestException, ValueError, KeyError, AttributeError) as e:
print(f"Error at index {idx}: {e}") # 에러 메시지 출력 후 다음 루프로 진행