1. 시계열 데이터(Timeseries Data & Forecasting)와 예측 개요
1) 시계열 데이터
지금까지 머신러닝에서 다룬 데이터들을 생각해보면 각 샘플이 독립적이고, 순서가 중요하지 않았습니다.
하지만 우리 주변에는 이와는 다른 특성을 가진 데이터들이 있습니다.
바로 시계열 데이터입니다.
시계열 데이터란 시간에 따라 순차적으로 기록된 데이터를 말합니다.
예를 들어, 여러분의 일일 걸음 수나 매일의 주식 가격 같은 것들입니다.
- 순서가 중요합니다.
예측에 날씨가 오늘의 날씨에 영향을 미치듯, 시계열 데이터에서는 이전 데이터가 다음 데이터에 영향을 줍니다. - 시간에 따른 패턴이 있습니다.
계절에 따라 기온이 변하거나, 주말마다 영화관 관객 수가 늘어나는 것처럼 시간에 따른 특정 패턴이 나타날 수 있습니다. - 미래 예측에 활용됩니다.
과거의 데이터를 바탕으로 미래의 값을 예측하는 것이 주요 목표입니다.
내일의 주식 가격이나 다음 달의 제품 수요를 예측하는 것이 그 예입니다.
시계열 데이터는 크게 두 가지 유형으로 나눌 수 있습니다.
※ 일변량 시계열
하나의 변수를 시간에 따라 관찰한 데이터입니다.
예: 매일 측정한 체중 데이터
날짜체중 (kg)
2023-05-01 | 70 |
2023-05-02 | 69.5 |
2023-05-03 | 69.8 |
※ 다변량 시계열
여러 개의 변수를 동시에 시간에 따라 관찰한 데이터입니다.
2) 머신러닝/딥러닝의 분류/회귀 문제를 위한 데이터와 시계열 데이터의 특성(feature)의 차이
일반적인 머신러닝 데이터와 시계열 데이터를 비교해보면 마치 정적인 사진과 동적인 비디오의 차이 입니다.
※ 일반 회귀/분류 데이터의 특성
일반적인 머신러닝 데이터는 시간의 흐름과 무관한 스냅샷과 같습니다.
각 데이터 포인트는 독립적이고, 순서는 중요하지 않습니다.
예를 들어, 집값 예측 모델을 생각해보겠습니다.
면적(㎡), 방 개수, 위치, 가격(만원)
85 | 3 | 강남구 | 80000 |
120 | 4 | 송파구 | 75000 |
70 | 2 | 마포구 | 50000 |
이 데이터에서는 각 행의 순서를 바꿔도 결과에 영향을 주지 않습니다.
시간의 흐름은 고려되지 않습니다.
※ 시계열 데이터의 특성
반면, 시계열 데이터는 마치 영화의 프레임처럼 시간에 따른 변화와 패턴이 중요합니다.
각 데이터 포인트는 이전 데이터와 연결되어 있고, 순서가 매우 중요합니다.
예를 들어, 주식 가격 예측 모델을 보겠습니다.
날짜, 주가(원), 거래량, 뉴스 관심 지수
2023-05-01 | 50000 | 100000 | 0.8 |
2023-05-02 | 51000 | 120000 | 0.9 |
2023-05-03 | 49500 | 90000 | 0.8 |
여기서는 데이터의 순서가 중요합니다.
5월 2일의 주가는 5월 1일의 영향을 받았을 것이고, 이는 다시 5월 3일에 영향을 줍니다.
※ 특성 엔지니어링의 차이
일반 데이터: 주로 현재 상태를 나타내는 특성을 사용합니다. 예를 들어, 집값 예측에서는 방 개수, 층수, 주차장 유무 등이 중요한 특성이 됩니다.
시계열 데이터: 과거의 패턴을 포함하는 특성이 중요합니다.
'어제와의 가격 차이', '지난 7일 평균 대비 현재 가격' 등의 특성을 만들어 사용합니다.
※ 도전과제의 차이
- 일반 데이터: "이 특성을 가진 집의 가격은 얼마일까?"와 같은 정적인 질문에 답합니다.
- 시계열 데이터: "다음 날 이 주식의 가격은 어떻게 변할까?"와 같은 동적인 예측을 수행합니다.
※ 사고방식의 차이
시계열 데이터를 다룰 때는 시간 연속성이 되어야 합니다.
과거를 통해 현재를 이해하고, 미래를 예측하는 것입니다.
반면, 일반 데이터는 현재의 스냅샷을 정확히 해석하는 것이 중요합니다.
2. Python datetime을 활용한 날짜 및 시간 데이터 처리
앞에서 살펴본 바와 같이, 순서가 중요하고 시간에 따른 패턴이 있는 시계열 데이터를 분석하거나 전처리할 때 가장 기본이 되는 것은 날짜와 시간을 자유롭게 다룰 수 있는 능력입니다.
날짜와 시간을 다루는 데 있어서 datetime과 Timestamp 클래스에 대한 이해와 활용 능력이 그 첫걸음이라고 할 수 있습니다.
이러한 클래스들은 다양한 형식의 날짜 및 시간 데이터를 표준화하고, 시계열 데이터의 분석을 위한 시간 연산을 가능하게 합니다.
이를 통해 데이터를 적절하게 정렬, 필터링, 집계할 수 있으며, 나아가 예측 모델링과 같은 고급 분석에 필요한 기반을 제공합니다.
Python의 datetime 모듈은 날짜와 시간을 처리하기 위한 기본 내장 모듈입니다.
시계열 데이터 전처리에 있어 핵심적인 역할을 합니다.
시계열 데이터 분석은 시간의 흐름에 따른 패턴을 찾는 과정이기 때문에, 날짜와 시간을 다루는 것은 필수적입니다.
※ datetime 모듈의 주요 클래스
- datetime.datetime : 날짜와 시간을 모두 포함하는 클래스입니다. 특정 날짜와 시간을 생성하고, 두 datetime 객체 간의 차이를 계산하거나, 날짜와 시간을 포맷팅하는 데 사용됩니다.
- datetime.date : 날짜만을 포함하는 클래스입니다. 연도, 월, 일 정보를 다루며, 날짜 간의 차이를 계산할 수 있습니다.
- datetime.time : 시간만을 포함하는 클래스입니다. 시, 분, 초, 마이크로초 정보를 다룹니다.
- datetime.timedelta : 두 datetime 객체 간의 차이를 나타내는 클래스입니다. 시간 간격을 계산하고, 날짜와 시간에 간격을 더하거나 뺄 수 있습니다.
이러한 클래스를 이용하면 날짜와 시간을 쉽게 다룰 수 있습니다.
예를 들어, 특정 날짜와 시간을 생성하거나, 두 날짜 간의 차이를 계산하거나, 날짜와 시간을 특정 형식으로 포맷할 수 있습니다.
문자열을 datetime 객체로 변환: 데이터셋에서 날짜와 시간이 문자열로 저장된 경우, 이를 datetime 객체로 변환하여 다양한 시간 연산을 수행할 수 있습니다.
시간 간격 계산: 두 시간 사이의 시간 간격을 계산하여 분석에 활용할 수 있습니다.
날짜/시간 정규화: 날짜와 시간을 표준 형식으로 변환하여 일관된 데이터 처리를 할 수 있습니다.
특정 시점 추출: 월별, 분기별 등의 특정 시점을 추출하여 분석할 수 있습니다.
시간 기반 특성 생성: 연도, 월, 분기 등의 시간 기반 특성을 생성하여 모델링에 활용할 수 있습니다.
1) 현재 시간 및 특정 날짜/시간 생성
Python의 datetime 모듈은 날짜와 시간 데이터를 처리하는 데 필수적인 도구입니다.
이 모듈은 현재 시간을 얻고, 특정 날짜와 시간을 생성하는 데 사용할 수 있습니다.
datetime 객체를 사용하면 날짜와 시간 정보를 쉽게 다룰 수 있으며, 다양한 연산과 조작이 가능합니다.
※ 현재 시간 얻기
현재 시간을 얻기 위해 datetime 모듈의 datetime.now() 메서드를 사용합니다.
이 메서드는 호출된 순간의 시스템 시간을 datetime 객체로 반환합니다.
이 객체는 년, 월, 일, 시, 분, 초, 마이크로초 등의 정보를 포함하며, 이를 통해 정확한 현재 시점을 얻을 수 있습니다.
※ 특정 날짜/시간 생성
datetime 클래스는 특정 날짜와 시간을 지정하여 생성할 수 있는 강력한 도구입니다.
이를 통해 과거 또는 미래의 특정 시점에 대한 날짜와 시간을 설정할 수 있습니다.
예를 들어, datetime(2023, 7, 29, 12, 30)과 같이 연도, 월, 일, 시, 분을 지정하여 datetime 객체를 생성하면, 2023년 7월 29일 12시 30분의 시점을 나타내는 객체를 생성할 수 있습니다.
이 방법은 이벤트의 타임스탬프를 기록하거나, 특정 기간의 데이터를 조작하는 데 활용될 수 있습니다.
※ 예시 코드
from datetime import datetime
# 현재 시간 얻기
now = datetime.now()
print(f"현재 시간('now'):{now}")
print(f"'now' 타입:{type(now)}" )
# 특정 날짜/시간 생성
specific_date = datetime(2023, 7, 29, 12, 30)
print("특정 날짜 'specific_date':", specific_date)
print(f"'specific_date' 타입 :{type(specific_date)}")
현재 시간('now'):2025-01-20 09:42:54.653000
'now' 타입:<class 'datetime.datetime'>
특정 날짜 'specific_date': 2023-07-29 12:30:00
'specific_date' 타입 :<class 'datetime.datetime'>
2) 미래 날짜 계산
datetime 모듈은 파이썬에서 날짜와 시간을 다루는 데 가장 많이 사용되는 모듈 중 하나입니다.
이 모듈의 timedelta 클래스는 특정 기간(일, 시간, 분, 초 등)을 표현하고, 이를 이용해 날짜 및 시간의 연산을 수행할 수 있습니다.
※ 현재 날짜와 시간 가져오기
datetime 모듈은 파이썬에서 날짜와 시간을 다루는 데 가장 많이 사용되는 모듈 중 하나입니다. 이 모듈의 timedelta 클래스는 특정 기간(일, 시간, 분, 초 등)을 표현하고, 이를 이용해 날짜 및 시간의 연산을 수행할 수 있습니다.
now = datetime.now()
이 메서드는 현재의 시스템 시간을 기준으로 datetime 객체를 반환합니다.
이 객체는 날짜(연도, 월, 일)와 시간(시, 분, 초, 마이크로초) 정보를 모두 포함하고 있습니다.
※ timedelta 클래스를 이용한 날짜 연산
timedelta 클래스는 기간을 표현하며, 날짜나 시간에 더하거나 빼는 연산에 사용됩니다.
예를 들어, 100일 후의 날짜를 계산하려면 timedelta(days=100)을 현재 날짜에 더해주면 됩니다.
future_date = now + timedelta(days=100)
이렇게 계산된 future_date는 100일 후의 정확한 날짜와 시간을 포함한 datetime 객체입니다.
※ 날짜만 추출
경우에 따라 시간 부분을 제외하고 날짜만 필요할 수 있습니다.
이때는 datetime 객체의 .date() 메서드를 사용하여 날짜 부분만 추출할 수 있습니다.
future_date_only = future_date.date()
이로써 날짜 연산을 통해 미래의 특정 날짜를 추출하고, 이를 다양한 형식으로 표현할 수 있게 됩니다.
※ 예시 코드
from datetime import datetime, timedelta
# 현재 날짜와 시간
now = datetime.now()
print(f"현재 날짜와 시간: {now}")
# 100일 뒤의 날짜 계산
n_days = 100
future_date = now + timedelta(days=100)
print(f"{n_days}일 뒤의 날짜와 시간: {future_date}")
# 날짜만 출력
future_date_only = future_date.date()
print(f"{n_days}일 뒤의 날짜: {future_date_only}")
현재 날짜와 시간: 2025-01-20 10:03:54.076000
100일 뒤의 날짜와 시간: 2025-04-30 10:03:54.076000
100일 뒤의 날짜: 2025-04-30
3) 시간 차이 측정
두 날짜 간의 시간 차이를 계산하는 것은 다양한 시계열 데이터 분석에서 필수적인 작업입니다.
예를 들어, 프로젝트 마감일까지 남은 시간을 계산해 일정 관리를 효율적으로 할 수 있으며, 과거 주식 가격과 현재 가격 간의 차이를 비교해 시장 변동성을 분석하는 데 활용할 수 있습니다.
또한, 중요한 이벤트나 기념일까지 남은 시간을 계산하여 그에 맞춰 준비할 수 있습니다.
※ 시간 차이 계산
두 날짜 간의 차이는 datetime 객체 간의 뺄셈을 통해 계산할 수 있습니다.
이 연산의 결과는 timedelta 객체로 반환되며, 이 객체는 일(day), 초(second), 마이크로초(microsecond) 단위의 차이를 포함합니다.
※ timedelta 객체의 속성
timedelta 객체는 두 날짜 간의 차이를 일, 초, 마이크로초 단위로 표현합니다.
이를 활용하여 다양한 단위로 차이를 계산할 수 있습니다.
- days: 일 단위 차이
- seconds: 초 단위 차이 (일 단위를 제외한 초)
- microseconds: 마이크로초 단위 차이 (초 단위를 제외한 마이크로초)
- total_seconds(): 전체 시간을 초 단위로 반환
※ 시간 단위로 변환
timedelta 객체의 total_seconds() 메서드를 사용하면 전체 시간을 초 단위로 변환할 수 있습니다.
이를 시간 단위로 변환하려면 초를 3600으로 나누면 됩니다.
이렇게 하면 두 날짜 간의 차이를 시간 단위로 쉽게 변환할 수 있습니다.
※ 과거 날짜 계산
미래 날짜를 계산하는 것과 마찬가지로, 과거 날짜도 쉽게 계산할 수 있습니다.
예를 들어, 어제 날짜를 계산하려면 현재 날짜에서 timedelta(days=1)을 빼면 됩니다.
이를 통해 특정 이벤트가 언제 발생했는지, 또는 특정 일자의 이전의 날짜를 쉽게 알 수 있습니다.
※ 예시 코드
from datetime import datetime, timedelta
# 현재 날짜와 시간
now = datetime.now()
# 100일 뒤의 날짜 계산
n_days = 100
future_date = now + timedelta(days=n_days)
# 두 날짜 사이의 차이 계산
time_diff = future_date - now
print(f"{n_days}일 뒤까지의 시간 차이: {time_diff}")
# 시간 단위로 변환
hours_diff = time_diff.total_seconds() / 3600
print(f"시간 차이 (시간 단위로): {hours_diff:.2f} 시간")
# 과거 날짜 계산 (예: 어제)
yesterday = now - timedelta(days=1)
print(f"어제 날짜와 시간: {yesterday}")
100일 뒤까지의 시간 차이: 100 days, 0:00:00
시간 차이 (시간 단위로): 2400.00 시간
어제 날짜와 시간: 2025-01-19 11:11:42.819000
4) 기념일로부터 경과 시간 계산
※ datetime.date 클래스
- 날짜 정보만 포함: datetime.date 클래스는 연도, 월, 일 정보를 포함하여 날짜만을 다룹니다. 시간 정보는 포함되지 않습니다.
- 현재 날짜 얻기: date.today() 메서드를 사용하여 현재 날짜를 얻을 수 있습니다.
- 특정 날짜 생성: date(연, 월, 일) 형식으로 특정 날짜를 생성할 수 있습니다. 예를 들어, date(2024, 12, 25)는 2024년 12월 25일을 나타냅니다.
- 날짜 비교 및 연산: 날짜 간의 비교 (<, >, <=, >=)가 가능하며, 특정 이벤트가 이미 지났는지, 다가오고 있는지를 확인할 수 있습니다. 이는 일정 관리나 이벤트 추적에 유용합니다.
※ datetime.time 클래스
- 시간 정보만 포함: datetime.time 클래스는 시, 분, 초, 마이크로초 정보를 포함하여 시간만을 다룹니다. 날짜 정보는 포함되지 않습니다.
- 현재 시간 추출: datetime.now().time() 메서드를 사용하여 현재 시간의 시간 부분만 추출할 수 있습니다.
- 특정 시간 생성: time(시, 분, 초, 마이크로초) 형식으로 특정 시간을 생성할 수 있습니다. 예를 들어, time(14, 30)는 오후 2시 30분을 나타냅니다.
- 시간 간 비교 및 범위 설정: 시간 간의 비교 연산이 가능하며, 특정 시간 범위를 설정하여 현재 시간이 그 범위에 속하는지를 확인할 수 있습니다. 이는 스케줄 관리나 자동화된 시스템 제어에서 유용합니다.
※ 예시 코드
first_meet_day = datetime(2023, 12, 25, 16, 0)
print(f"처음 만난 날 ('first_meet_day') : {first_meet_day}")
time_diff = now - first_meet_day
print(f"만난 지 {time_diff.days}일이 지났습니다.")
print(f"만난 지 {time_diff.total_seconds()/3600}시간이 지났습니다.")
처음 만난 날 ('first_meet_day') : 2023-12-25 16:00:00
만난 지 391일이 지났습니다.
만난 지 9403.1952275시간이 지났습니다.
5) datetime의 date 클래스 생성과 날짜 비교
datetime 모듈의 date 클래스는 연도, 월, 일 정보를 포함하는 날짜 객체를 생성하는 데 사용됩니다.
이 객체는 날짜와 관련된 연산, 비교 등을 수행하는 데 매우 유용합니다.
예를 들어, 오늘 날짜와 특정 날짜를 비교하여 중요한 기념일이나 마감 일이 다가왔는지 확인할 수 있습니다.
※ 예시 코드
from datetime import date
# 오늘 날짜 가져오기
today = date.today()
print(f"오늘 날짜: {today}")
# 특정 날짜 설정
special_day = date(2024, 12, 25)
print(f"특별한 날: {special_day}")
# 날짜 비교
if today < special_day:
print("특별한 날이 아직 오지 않았습니다.")
elif today == special_day:
print("오늘은 특별한 날입니다!")
else:
print("특별한 날이 지났습니다.")
오늘 날짜: 2025-01-20
특별한 날: 2024-12-25
특별한 날이 지났습니다.
6) datetime의 time 클래스 생성과 시간 비교
datetime 모듈의 time 클래스는 시, 분, 초, 마이크로초 정보를 포함하는 시간 객체를 생성하는 데 사용됩니다.
이 객체는 하루의 특정 시간대를 표현하고, 시간과 관련된 연산이나 비교를 수행하는 데 유용합니다.
예를 들어, 현재 시간이 업무 시간 내에 속하는지 확인하는 데 사용할 수 있습니다.
※ 예시 코드
from datetime import datetime, time
# 현재 시간 가져오기
now = datetime.now()
current_time = now.time()
print(f"현재 시간: {current_time}")
# 특정 시간 설정
start_time = time(9, 0)
end_time = time(17, 0)
print(f"업무 시작 시간: {start_time}, 종료 시간: {end_time}")
# 시간 비교
if start_time <= current_time <= end_time:
print("현재는 업무 시간입니다.")
else:
print("현재는 업무 시간이 아닙니다.")
현재 시간: 11:19:25.871000
업무 시작 시간: 09:00:00, 종료 시간: 17:00:00
현재는 업무 시간입니다.
7) datetime의 date와 time 결합하여 datetime 생성
datetime 모듈의 date 클래스는 연도, 월, 일 정보를, time 클래스는 시, 분, 초, 마이크로초 정보를 각각 포함하는 객체를 생성하는 데 사용됩니다.
때로는 특정 날짜와 특정 시간을 결합하여 하나의 시점(datetime 객체)을 표현해야 할 때가 있습니다.
이때 datetime.combine() 메서드를 사용하면 날짜와 시간을 결합하여 datetime 객체를 생성할 수 있습니다.
※ 예시 코드
from datetime import datetime, date, time
# 특정 날짜와 시간 설정
meeting_date = date(2024, 1, 15)
meeting_time = time(14, 30)
# 날짜와 시간을 결합하여 datetime 객체 생성
meeting_datetime = datetime.combine(meeting_date, meeting_time)
print(f"회의 일시: {meeting_datetime}")
회의 일시: 2024-01-15 14:30:00
8) 날짜 포맷팅: strftime을 활용한 날짜 및 시간 형식 지정
strftime 메서드는 datetime 객체를 특정 형식의 문자열로 변환하는 강력한 도구입니다.
이 메서드를 사용하면 날짜와 시간을 다양한 형식으로 포맷팅할 수 있어, 보고서 작성, 데이터 시각화, 로그 기록 등에서 유용하게 활용할 수 있습니다.
※ 주요 포맷 코드
- %Y: 4자리 연도 (예: 2024)
- %m: 2자리 월 (01-12)
- %d: 2자리 일 (01-31)
- %H: 2자리 24시간제 시간 (00-23)
- %I: 2자리 12시간제 시간 (01-12)
- %M: 2자리 분 (00-59)
- %S: 2자리 초 (00-59)
- %p: AM/PM 표시
- %A: 요일 (예: Wednesday)
- %B: 월 이름 (예: August)
- %Y-%m-%d: ISO 8601 표준 날짜 형식
- %d %B %Y: 일-월이름-연도 날짜 형식 (예: 07 August 2024)
※ 예시 코드
from datetime import datetime
# 현재 시간 얻기
now = datetime.now()
# 기본 포맷으로 출력 (예시: 2024-08-07 05:40:28)
basic_format = now.strftime('%Y-%m-%d %H:%M:%S')
print(f"기본 포맷: {basic_format}")
# 한글 포맷으로 출력 (예시: 2024년 08월 07일 05시 40분 28초)
korean_format = now.strftime('%Y년 %m월 %d일 %H시 %M분 %S초')
print(f"한글 포맷: {korean_format}")
# 날짜만 출력 (예시: 2024/08/07)
date_only_format = now.strftime('%Y/%m/%d')
print(f"날짜만: {date_only_format}")
# 12시간제 시간만 출력 (예시: 05:40 AM)
time_12h_format = now.strftime('%I:%M %p')
print(f"12시간제 시간만: {time_12h_format}")
# 요일과 월 이름 포함 포맷 (예시: Wednesday, 07 August 2024)
weekday_month_format = now.strftime('%A, %d %B %Y')
print(f"요일과 월 이름 포함 포맷: {weekday_month_format}")
# ISO 8601 표준 포맷 (예시: 2024-08-07T05:40:28)
iso_format_basic = now.strftime('%Y-%m-%dT%H:%M:%S')
print(f"ISO 8601 표준 포맷 (기본): {iso_format_basic}")
# ISO 8601 표준 포맷 (예시: 2024-08-07T05:40:28+0900)
# 시간대 포함
iso_format_with_timezone = now.strftime('%Y-%m-%dT%H:%M:%S%z')
print(f"ISO 8601 표준 포맷 (시간대 포함): {iso_format_with_timezone}")
기본 포맷: 2025-01-20 11:24:55
한글 포맷: 2025년 01월 20일 11시 24분 55초
날짜만: 2025-01-20
12시간제 시간만: 11:24 AM
요일과 월 이름 포함 포맷: Monday, 20 January 2025
ISO 8601 표준 포맷 (기본): 2025-01-20T11:24:55
ISO 8601 표준 포맷 (시간대 포함): 2025-01-20T11:24:55
'딥러닝 > 딥러닝: 시계열 데이터' 카테고리의 다른 글
RNN 구현 (0) | 2025.01.22 |
---|---|
RNN 원리와 구조 (0) | 2025.01.22 |
시계열 데이터 분석과 파생 변수 생성 (0) | 2025.01.21 |
시계열 데이터 분석 및 전처리 (0) | 2025.01.21 |
pandas를 활용한 날짜 및 시간 데이터 처리 (0) | 2025.01.21 |