AI 개발 공부 공간

AI, 머신러닝, 딥러닝, Python & PyTorch, 실전 프로젝트

딥러닝/딥러닝: 실전 프로젝트 학습

시계열 : 농산물 가격 예측 프로젝트 1 (데이터 이해)

qordnswnd123 2025. 1. 30. 13:26

1. 학습 및 테스트 데이터 로드

import pandas as pd
import numpy as np

train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

display(train.head())
display(test.head())

 

※ 결과 해석

데이터의 상위 행을 살펴보면, 두 데이터셋 모두 날짜 정보를 담은 'date' 컬럼과 8개 농산물 품목에 대한 거래량과 가격 정보를 포함하고 있습니다.

일반적으로 분류나 회귀 문제에서 다루는 train 데이터셋은 예측하려는 타겟 변수를 포함하고 있으며, test 데이터셋은 이 타겟 변수를 포함하지 않습니다. 그러나 이 경우에는 train과 test 데이터셋 모두 동일한 컬럼 구조를 가지고 있고, 날짜 정보만 다릅니다. 이러한 데이터셋 구조는 시계열 예측 문제에서 자주 볼 수 있는 형태입니다.


2. 학습 데이터와 테스트 데이터의 날짜 범위 확인

train_min_date = train['date'].min()
train_max_date = train['date'].max()

test_min_date = test['date'].min()
test_max_date = test['date'].max()

display(f"train 데이터 기간 : {train_min_date} ~ {train_max_date}")
display(f"test 데이터 기간 : {test_min_date} ~ {test_max_date}")

 

※ 결과 해석

train 데이터의 마지막 날짜와 test 데이터의 첫 날짜가 연속적임을 확인 할 수 있습니다.


3. 제출 파일 형식 확인

submission = pd.read_csv('sample_submission.csv')
display(submission.head())

※ 결과 해석

sample_submission.csv 파일은 ‘예측대상일자’와 8개 농산물 품목에 대한 가격 정보를 담고 있습니다. ‘예측대상일자’는 예측해야 할 특정 날짜와 그로부터 몇 주 뒤인지를 나타냅니다. 예를 들어, "2021-09-28+1week"은 2021년 9월 28일로부터 1주 후의 가격을 예측해야 한다는 것을 의미합니다. 초기에 모든 품목의 가격은 0으로 설정되어 있어, 이 부분은 모델을 통해 예측한 가격으로 채워야 합니다.
sample_submission.csv의 ‘예측대상일자’는 test 데이터의 날짜 범위인 "2021년 9월 28일부터 2021년 11월 4일까지"와 일치합니다. 이는 해당 기간 동안 매일 8개의 농산물 품목에 대해 1주, 2주, 4주 후의 가격을 예측하여 제출해야 함을 의미합니다.


4. 예측해야 하는 대상 및 대회 규정 이해

규칙에 다음과 같은 코멘트가 있습니다.
※ 답안 제출 기간 동안 매일 자정까지 답안을 제출해야함. API 사용하여 자동화 가능.
submission 파일의 ‘예측대상일자’ 컬럼의 처음행과 마지막행에서 알 수 있듯이, 9월 28일에서 11월 4일까지, 제공하는 API를 통해 실시간으로 업데이트되는 농산물 품목의 가격, 거래량 정보를 수집하여, 이를 기반으로 매일 자정까지 1,2,4주 후의 가격을 예측하여 submission 파일에 예측 가격을 채워서 제출해야 하는 규칙입니다.
“예측 대상: 2020년 10월 6일(화) ~ 2020년 11월 12일(목) 7개 내 품목 별 1주 후, 2주 후, 4주 후 가격”이라고 표기되어 있는 내용은, 아래 달력에서 보듯이 제출 첫날인 10월 28일에는 1주 후 (10월 5일) 가격, 2주후 후 (10월 12일) 가격, 4주후후 (10월 26일)가격을 예측하는 것입니다.

 

display(submission.tail(5))

 


5. 첫날, 둘째날 테스트 데이터 로드

test_day1.csv와 test_day2.csv 데이터를 불러와 출력해 보겠습니다.

이는 제공된 API를 통하여 첫째날과 둘째날에 농산물 가격을 수집한 상황을 모의 한 것입니다.

실제로 이와 같은 방식으로 수집한 데이터를 사용하여 각 날짜의 1주, 2주, 4주 후 가격을 예측하고, 그 결과를 sample_submission.csv 형식에 맞춰 제출해야 하는 상황임을 인지합니다.

test_day1 = pd.read_csv('test_day1.csv')
test_day2 = pd.read_csv('test_day2.csv')

display("첫째날 :")
display(test_day1)

display("둘째날 :")
display(test_day2)

 


6. 첫째날 데이터를 기반으로 naive forcasting 하여 제출 파일 생성

이 코드는 test_day1.csv의 마지막 날짜 데이터를 기반으로 나이브 포캐스팅 방법을 사용하여 1주, 2주, 4주 후의 농산물 가격을 예측합니다. 나이브 포캐스팅이란 가장 최근의 관측값을 이용해 미래 값을 예측하는 가장 단순한 형태의 시계열 예측 방법입니다.

# 빈 submission_day1 DataFrame 생성
submission_day1 = pd.DataFrame(columns=submission.columns)

# test_day1의 마지막 날짜 정보 가져오기
date = test_day1.iloc[-1]['date']

# 예측대상일자 추가
submission_day1['예측대상일자'] = [f'{date}+1week', f'{date}+2week' , f'{date}+4week']

target_items = submission_day1.columns[1:]

# 3개의 행에 대한 나이브 예측 수행
for item in target_items:

    last_observation = test_day1.iloc[-1][item]

    submission_day1.loc[submission_day1['예측대상일자'] == f'{date}+1week', item] = last_observation
    submission_day1.loc[submission_day1['예측대상일자'] == f'{date}+2week', item] = last_observation
    submission_day1.loc[submission_day1['예측대상일자'] == f'{date}+4week', item] = last_observation

display(submission_day1)

 

※ 코드설명

  1. 빈 DataFrame 생성
    • submission_day1 = pd.DataFrame(columns=submission.columns)
    • 기존 submission DataFrame과 동일한 컬럼을 가지는 새로운 DataFrame을 생성합니다.
  2. 마지막 날짜 정보 가져오기
    • date = test_day1.iloc[-1]['date']
    • test_day1에서 마지막 행의 날짜 정보를 가져옵니다.
  3. 예측대상일자 설정
    • submission_day1['예측대상일자'] = [f'{date}+1week', f'{date}+2week', f'{date}+4week']
    • test_day1의 마지막 날짜를 기준으로 1주, 2주, 4주 후의 예측 날짜를 생성하여 submission_day1의 예측대상일자 컬럼에 추가합니다.
  4. 타겟 컬럼 선택
    • target_items = submission_day1.columns[1:]
    • 예측대상일자 컬럼을 제외한 나머지 컬럼(즉, 예측해야 할 항목들)을 리스트로 저장합니다.
  5. 나이브 예측 수행
    • for item in target_items:을 통해 모든 예측 대상 항목(농산물 품목 등)에 대해 반복 실행합니다.
    • last_observation = test_day1.iloc[-1][item]
      • test_day1에서 해당 항목의 마지막 값을 가져옵니다.
    • submission_day1.loc[...] = last_observation
      • 예측대상일자가 해당 주차(1주, 2주, 4주 후)인 행을 찾아서 마지막 값을 그대로 채웁니다.
  6. 결과 확인
    • display(submission_day1)을 통해 최종적으로 예측값이 들어간 submission_day1 DataFrame을 출력합니다.

※ 결과 해석

생성된 submission_day1 DataFrame은 첫째날의 마지막 관측값을 기반으로 1주, 2주, 4주 후의 농산물 가격을 예측한 결과를 담고 있습니다. 이는 실제 예측 모델을 만들어 예측을 수행하기 전에 간단한 예측 방법을 연습하는 의미도 있습니다. 이 예측은 매우 단순하므로 실제 가격 변동성을 반영하지 못할 수 있지만, 초기 베이스라인으로서 의미가 있을 수 있습니다.


7. 둘째날 데이터를 기반으로 naive forcasting 하여 제출 파일 생성하기

둘째날의 데이터를 이용하여 1주일, 2주일, 4주일 후의 8개 품목의 가격을 Naive Forecasting 방법으로 예측합니다. 이 예측 결과는 첫째날 기반으로 예측한 submission_day1의 결과와 결합하여 최종 제출 파일을 생성합니다.

# 빈 submission_day2 DataFrame 생성
submission_day2 = pd.DataFrame(columns=submission.columns)

# test_day2의 마지막 날짜 정보 가져오기
date = test_day2.iloc[-1]['date']

# 예측대상일자 추가
submission_day2['예측대상일자'] = [f'{date}+1week', f'{date}+2week', f'{date}+4week']

# 품목별로 나이브 예측 수행
for item in target_items:
    last_observation = test_day2.iloc[-1][item]  # 마지막 관측치
    submission_day2[item] = last_observation

# submission_day1과 submission_day2 결합
final_submission = pd.concat([submission_day1, submission_day2]).reset_index(drop=True)

display(final_submission)