제로베이스 데이터 파트타임 스쿨 학습 일지 [25.05.18]

[강의 요약]

[Part 04. EDA/웹 크롤링/파이썬 프로그래밍_ Ch 06. 시계열 분석] 강의 수강

클립 01~10까지 강의 수강하였음

10_실습 - 웹 유입량 데이터 분석까지

🐢 100일 챌린지 🔥 : [▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰░                                       ] 63/100일 (63%)

 

 

 

[클립 01~10까지 정리]

▶ 1. 함수 정의와 호출 (기본)

def test_def(a, b):
    return a + b
  • def : 함수 정의 키워드
  • test_def() 함수는 파라미터 a, b를 받아 합을 반환
  • return을 통해 값을 함수 외부로 전달하는 구조

 

c = test_def(2, 3)
print(c)  # 결과: 5

 

 

▶ 2. 전역 변수와 지역 변수 실험

전역변수를 함수에서 수정

a = 1

def edit_a(i):
    global a
    a = i

여기서 global a를 선언하지 않으면 함수 내부의 a는 새로운 지역 변수가 된다.

global을 지정하면 함수 안에서도 외부 a를 직접 수정할 수 있다.

edit_a(2)
print(a)  # 결과: 2

 

반대로 global을 쓰지 않으면 아래처럼 전역 변수에 영향을 주지 않는다.

def edit_a(i):
    a = i  # 지역변수로 작동

edit_a(5)
print(a)  # 결과는 여전히 2

 

 

▶ 3. 시각화 라이브러리 불러오기

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

 

  • matplotlib.pyplot : 파이썬에서 가장 많이 쓰이는 2D 시각화 도구
  • numpy : 수학적 계산을 위한 배열 라이브러리
  • %matplotlib inline : 주피터 노트북 안에서 그림을 출력하도록 설정

기본적인 내용이지만 실습 코드에 있으니 일단...

 

 

 

▶ 4. 사인파 그리기 함수 (파라미터 기반)

def plotSinWave(amp, freq, endTime, sampleTime, startTime, bias):
    time = np.arange(startTime, endTime, sampleTime)
    result = amp * np.sin(2 * np.pi * freq * time + startTime) + bias

    plt.figure(figsize=(12, 6))
    plt.plot(time, result)
    plt.grid(True)
    plt.xlabel("time")
    plt.ylabel("sin")
    plt.title(str(amp) + "*sin(2*pi" + str(freq) + "*t+" + str(startTime) + ")+" + str(bias))
    plt.show()

이 함수는 6개의 인자를 받아 사인파 그래프를 출력한다.

파라미터 설명은 다음과 같다.

 

  • amp : 진폭 (Amplitude)
  • freq : 주파수 (Frequency)
  • endTime : 종료 시간
  • sampleTime : 시간 간격 (샘플링 주기)
  • startTime : 위상 지연 (Phase Shift)
  • bias : 수직 이동

 

 

 

▶ 5. kwargs 방식 함수

실무에서는 인자 수가 많아질수록 kwargs 패턴이 유용하다.

def plotSinWave(**kwargs):
    amp = kwargs['amp']
    freq = kwargs['freq']
    endTime = kwargs['endTime']
    sampleTime = kwargs['sampleTime']
    startTime = kwargs['startTime']
    bias = kwargs['bias']

    time = np.arange(startTime, endTime, sampleTime)
    result = amp * np.sin(2 * np.pi * freq * time + startTime) + bias

    plt.figure(figsize=(12, 6))
    plt.plot(time, result)
    plt.grid(True)
    plt.xlabel("time")
    plt.ylabel("sin")
    plt.title(str(amp) + "*sin(2*pi" + str(freq) + "*t+" + str(startTime) + ")+" + str(bias))
    plt.show()

 

  • 키워드 인자 방식이므로 순서를 몰라도 이름만 정확하면 상관없다.

 

plotSinWave(amp=1, freq=2, endTime=8, sampleTime=0.01, startTime=0, bias=0)

이렇게 사용하면 된다.

 


▶ 6. 중복 실험, 변수 수정 테스트, 시각화 반복

모든 코드를 글에서 담기는 어렵다.

다양한 조합의 인자 값으로 여러 개의 사인파를 출력하는 코드가 이어지는데, 목적은 다음과 같다.

  • 특정 인자만 바꿔 그래프가 어떻게 바뀌는지 실험
  • plotSinWave()를 다양한 조건에서 호출해 동작 확인

 

이러한 반복 실험을 통해서 무엇을 알 수 있을까?

  • 진폭이 클수록 파형이 더 커진다
  • 주파수가 클수록 더 촘촘해진다
  • 시작 시간은 위상 이동을 의미한다
  • bias는 수직 이동을 나타낸다

위와 같은 개념을 직접 눈으로 확인할 수 있다.

 

 

▶ 7. Prophet을 이용한 시계열 예측

fbprophet은 Facebook에서 만든 시계열 데이터 예측 라이브러리다.

날짜 기반의 시계열 데이터(ex: 주가, 기온, 방문자 수 등)를 기반으로 미래 값을 예측하는 데

매우 간단하고 직관적인 API를 제공한다.

 

1) Prophet 모델 생성 및 학습

from fbprophet import Prophet

m = Prophet(yearly_seasonality=True, daily_seasonality=True)
m.fit(df)

 

  • yearly_seasonality=True : 연간 반복 패턴을 모델링
  • daily_seasonality=True : 일일 주기성도 함께 고려
  • m.fit(df) : Prophet 모델 학습

 

df는 반드시 아래와 같은 구조를 가져야 한다.

ds (datetime) y (target value)
2024-01-01 150
2024-01-02 160
... ...

 

 

2) 미래 날짜 생성 및 예측 수행

future = m.make_future_dataframe(periods=30)
forecast = m.predict(future)

 

  • make_future_dataframe(periods=30)은 기존 데이터 이후 30일을 자동으로 생성한다.
  • m.predict(future)를 호출하면 기존과 미래 데이터에 대한 예측 결과가 담긴 forecast 데이터프레임이 반환된다.

 

 

 

3) 예측 결과 시각화

m.plot(forecast);

이 함수 하나만으로 전체 예측 시계열 그래프가 출력된다.

  • 파란색 선 : 모델의 예측값 (yhat)
  • 파란색 음영 : 95% 신뢰구간
  • 검은색 점 : 실제 관측값

 

 

4) 컴포넌트 확인 (트렌드/주기)

m.plot_components(forecast);

이 그래프는 Prophet이 학습한 내부 구성요소를 시각적으로 보여준다.

  • 트렌드 (전반적인 상승/하락 패턴)
  • 주기성 (연간/주간/일간 등)
  • 휴일 효과 (설정한 경우)

 

 

 

[나의 생각 정리]

예전에 연구실에서 실험할 때 아날로그 신호를 입력값을 변경하면서 관측했는데 그때 생각이 나는 실습이였다.

Prophet으로 시계열 예측을 쉽게 적용하는 방법을 배웠다.

 

 

[적용점]

데이터 분석에서 사용

 

 

“이 글은 제로베이스 데이터 스쿨 주 3일반 강의 자료 일부를 발췌하여 작성되었습니다.”