카테고리 보관물: 미분류

시계열데이터를 예측할 때 선형회귀(Linear Regression)를 사용하지 않는 이유

시계열 데이터 예측할 때 선형회귀를 안쓰는 이유?

시계열 데이터는 시간의 순서대로 측정된 데이터이기 때문에 시간에 따른 순서가 있습니다. 일반적인 선형 회귀모형인 최소제곱법을 사용할 경우, 예측값과 실제값의 차이를 제곱한 값을 최소화하는 것이 목표입니다. 이러한 최소제곱법은 잔차의 분포가 정규분포를 이루는 경우에만 적용됩니다. 시계열 데이터의 경우 잔차의 분포가 정규분포를 이루지 않을 수 있기 때문에 최소제곱법을 적용할 수 없습니다.

그렇기 때문에 시계열 데이터에서는 최소제곱법을 사용하는 선형 회귀모형 대신에, 잔차의 분포가 정규분포를 이루지 않더라도 적용할 수 있는 모형을 사용합니다. 이러한 모형에는 시계열 잔차의 자기상관계수가 일정한 수준 이하인 자기상관 선형 모형 (ARIMA), 시계열 잔차가 정규분포를 이루지 않는 경우에 적용할 수 있는 시계열 잔차의 분포가 일정한 수준 이하인 자기상관 선형 모형(ARIMAX) 등이 있습니다.

또한, 시계열 데이터의 경우 자기상관이 있을 수 있기 때문에 일반적인 선형 회귀모형과는 달리 자기상관을 제거하기 위해 차분(differencing) 작업을 수행할 수 있습니다. 차분은 시계열 데이터의 차이값(difference)을 사용하여 자기상관을 제거하는 과정입니다. 이렇게 차분한 시계열 데이터에 선형 회귀모형을 적용할 수 있습니다.

시계열 데이터에 선형 회귀모형을 적용하지 않을 수도 있습니다. 이 경우 시계열 데이터의 특성을 잘 반영할 수 있는 모형을 선택해야 합니다. 예를 들어, 시계열 데이터가 점선으로 그려지고 추세가 있는 경우 선형 회귀모형이 적합하지 않을 수 있습니다. 이 경우에는 추세를 반영할 수 있는 적절한 모형을 선택할 수 있습니다. 예를 들어 추세가 있는 시계열 데이터에는 추세를 고려한 선형 회귀모형인 전방산정모형(forward-looking regression model)과 지수선형회귀모형(exponential linear regression model) 등이 적용될 수 있습니다.

또한, 시계열 데이터의 경우 시간에 따른 추이가 있을 수 있기 때문에 시간에 따른 추이를 반영할 수 있는 모형도 적용할 수 있습니다. 예를 들어 시계열 데이터의 경우 시간에 따른 추이가 있고, 이를 선형으로 나타낼 수 없을 경우에는 시간에 따른 추이를 나타낼 수 있는 시계열 모형인 선형 추이선형회귀모형(linear trend linear regression model)과 지수선형 추이선형회귀모형(exponential trend linear regression model) 등이 적용될 수 있습니다.

정리하자면, 시계열 데이터에는 선형 회귀모형을 적용하기 어려울 수 있는 여러가지 이유가 있습니다. 시계열 데이터의 경우 잔차의 분포가 정규분포를 이루지 않을 수 있기 때문에 최소제곱법을 적용할 수 없기 때문입니다. 또한, 시계열 데이터는 자기상관이 있을 수 있기 때문에 차분을 통해 자기상관을 제거할 수 있습니다. 이 경우 차분한 시계열 데이터에 선형 회귀모형을 적용할 수 있습니다. 또한, 시계열 데이터의 경우 추세가 있거나 시간에 따른 추이가 있을 수 있기 때문에 이를 반영할 수 있는 모형을 적용할 수도 있습니다.

데이터베이스의 현재 타임존 확인하는 방법 – How to get current timezone on MySQL database

데이터를 다룰 때 날짜 타입이 있는 경우에는 타임존을 항상 신경써야 합니다.
어떤 날짜타입은 타임존을 내부에 가지고 있고 어떤 타입은 그렇지 않습니다.
데이터를 추가할 때 현재 날짜 또는 시각의 타임스탬프를 자동으로 추가하는 기능을 사용할 때는 어떤 타임존으로 설정되어 있는지 확인하고 사용해야 합니다.

# getting current timezone of database system
SELECT @@global.time_zone, @@session.time_zone;

# checking difference default timezone with UTC 
SELECT TIMEDIFF(NOW(), CONVERT_TZ(NOW(), @@session.time_zone, '+00:00'));

# example code for converting timezone
SELECT CONVERT_TZ(CURRENT_TIMESTAMP, '+09:00', '+00:00');

MySQL 데이터베이스 타임존 확인 하는 법

타임존(timezone) 문제는 항상 골치가 아픕니다.

특히 데이터와 관련된 문제에서는 더욱 더 그렇고, 돈과 관련된 데이터라면 더더욱 문제가 딥니다.

MySQL, MariaDB에서 현재 시스템의 타임존을 확인하는 방법입니다.

# 시스템 설정 확인하기
SELECT @@global.time_zone, @@session.time_zone;
# 실제 GMT와의 시간차이 확인하기
SELECT TIMEDIFF(NOW(), CONVERT_TZ(NOW(), @@session.time_zone, '+00:00'));
# tz 바꾸는 코드 테스트
SELECT CONVERT_TZ(CURRENT_TIMESTAMP, '+09:00', '+00:00');

신기한 Copilot 사용예 – 날짜목록 자동생성

오늘이 공휴일인지 아닌지 확인하는 간단한 코드를 Python으로 작성하는 것인데

이 예제에서 신기한 것은 Copilot이 주석의 내용을 보고 코드에 데이터를 자동으로 추가해주는 기능도 있다는 것입니다.

공휴일 날짜 데이터가 문제입니다.

자동으로 코드내에 공휴일데이터를 추가하는 방법을 알려드립니다.

아래 사이트에 접속해서 공휴일에 대한 정보를 복사합니다.

https://publicholidays.co.kr/ko/2023-dates/

Copilot이 설치된 vscode를 실행하고 코딩을 준비합니다.

아래의 코드에서 상단에 있는 것이 위의 사이트에서 복사해서 붙여넣은 데이터입니다.

복사한 후에 주석처리를 해놓고 밑에서 코드를 입력해서 완료하면 되는데

밑에 holiday_list = [ 라고 입력하고 Copilot의 추천을 기다리면 주석의 내용을 파악해서 공휴일에 해당하는 모든 데이터를 한 번에 또는 부분적으로 모두 완성해 줍니다.

여기서 신기한 것은 9월 28일 ~ 9월 30일과 같이 구간으로 표현된 것도 인지하고 날짜 목록에 나열해서 넣어 준다는 것입니다.

# 2023년 대한민국 공휴일
# 날짜	요일	공휴일
# 1월 1일	일요일	새해
# 1월 21일 ~ 1월 24일	토요일 ~ 화요일	설날
# 3월 1일	수요일	3·1 운동/삼일절
# 5월 5일	금요일	어린이날
# 5월 27일	토요일	부처님 오신 날
# 6월 6일	화요일	현충일
# 8월 15일	화요일	광복절
# 9월 28일 ~ 9월 30일	목요일 ~ 토요일	추석
# 10월 3일	화요일	개천절
# 10월 9일	월요일	한글날
# 12월 25일	월요일	크리스마스

# check if today is holiday or not
holiday_list = [
    '2023-01-01', '2023-01-21', '2023-01-22', '2023-01-23', '2023-01-24',
    '2023-03-01', '2023-05-05', '2023-05-27', '2023-06-06', '2023-08-15',
    '2023-09-28', '2023-09-29', '2023-09-30', '2023-10-03', '2023-10-09',
    '2023-12-25'
]

today = datetime.datetime.today().strftime('%Y-%m-%d')
if today in holiday_list:
    print('Today is holiday')
else:
    print('Today is not holiday')