TOP
class="layout-aside-left paging-number">
본문 바로가기
데이터분석 만능열쇠 [파이썬]/<파이썬 데이터 분석>

[파이썬] 시계열 데이터 다루기 - 1

by 기록자_Recordian 2024. 5. 6.
728x90
반응형
시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.
보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.

시계열 분석(feat. fbprophet) 을 위한 Visual C++ Build Tools 설치

 
- 시계열 데이터: 데이터가 시간의 흐름에 따라 변화하는 추이가 있는 데이터 (웹 트래픽, 주식 등)
- 시계열 분석은 원 데이터의 안정성을 판정하고, 안전한 형태로 변환하고, 예측 모델을 선정하고 검증하는 과정에서 통계학의 깊은 지식을 요구
 
- fbprophet 모듈: 페이스북에서 만든 간단한 데이터를 예측할 때에 유용한 도구
(윈도우 사용자들의 경우 Visual C++ Build Tools 설치 필요. 맥은 설치 불필요)
 
하단의 링크에서 다운로드 가능

 

Microsoft C++ Build Tools - Visual Studio

visualstudio.microsoft.com

 

Visual C++ Build Tools 다운로드
출처: 마이크로소프트

 

visual studio installer
visual studio 구성요소 설치


터미널에서 모듈 설치하기

 
Visual C++ Build Tools 설치 후, pystan 과 prophet 모듈 설치

pip install pystan
pip install prophet

pystan, prophet 설치

 
그런데, pystan 모듈을 설치하는 과정에서 하단의 오류가 뜬다. (prophet 모듈은 설치가 잘 되었다)

  error: subprocess-exited-with-error
  
  python setup.py egg_info did not run successfully.
  exit code: 1
  
  [6 lines of output]
  Traceback (most recent call last):
    File "<string>", line 2, in <module>
    File "<pip-setuptools-caller>", line 34, in <module>
    File "C:\Users\niceq\AppData\Local\Temp\pip-install-k1c109j1\pystan_06555ca40b11469181a7cafe43a041ec\setup.py", line 122, in <module>
      from Cython.Build.Inline import _get_build_extension
  ModuleNotFoundError: No module named 'Cython'
  [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

Encountered error while generating package metadata.

See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.

 
역시 Chat GPT에 검색

이 에러는 파이스탄이라는 파이썬 패키지 설치와 관련된 오류가 발생하는 것 같은데, 특히 싸이톤 모듈을 찾을 수 없기 때문입니다. 오류를 정리하고 이 문제를 해결할 수 있는 방법을 알아보겠습니다.

모듈을 찾을 수 없음 오류: '사이튼'이라는 이름의 모듈이 없습니다:
이 오류는 pystan의 종속성인 Cython 모듈이 시스템에 설치되어 있지 않음을 나타냅니다. Cython은 Python용 C 확장자를 작성하기 위한 컴파일러입니다. Python 코드를 C로 변환하여 속도를 높이는 데 자주 사용됩니다.
오류: 메타데이터-생성-failed:
이 오류 메시지는 Cython 의존성 문제로 인해 패키지의 메타데이터를 생성하지 못한 결과입니다.

 
해결책은 pystan 모듈 설치 이전에 Cython 모듈을 먼저 설치하고 다시 pystan 모듈을 설치하면 될 것으로 보인다.

pip install Cython

 

cython 모듈 설치

그리고나서 다시 pystan을 설치하면 된다. (시간이 꽤 오래 걸리는데, 구글링을 해보니 원래 그런듯하다.)

pystan 설치
설치 완료

이제 시계열 분석 준비가 완료되었다.


Numpy의 polyfit으로 회귀 (Regression) 분석하기

 
먼저 주가 데이터를 가져오기 위한 판다스 데이터 리더 모듈을 설치

pip install pandas_datareader

pandas_datareader 설치

그리고나서 이번 분석에 사용할 모듈과 한글 폰트 문제 해결을 위한 코드를 실행

#경고메시지를 무시하도록 설정 (경고 모듈 가져옴)
import warnings
warnings.filterwarnings("ignore")

# pandas, numpy 모듈 import
import pandas as pd
import pandas_datareader.data as web #주가 데이터를 가져오기 위한 판다스 데이터 리더 모듈을 가져옴
import numpy as np

# 운영 체제 정보를 확인하고, matplotlib을 사용하여 그래프 그릴 준비하기
import platform
import matplotlib.pyplot as plt #데이터를 시각화하기 위한 맷플롯립 모듈의 플롯 함수를 가져.

# 주피터 노트북에서 맷플롯립 그래프를 인라인으로 표시하도록 설정

%matplotlib inline 

from prophet import Prophet #Prophet이라는 라이브러리에서 Prophet 클래스를 가져옴. Prophet은 시계열 데이터를 예측하기 위한 라이브러리.
from datetime import datetime #날짜 및 시간을 다루기 위한 datetime 모듈에서 datetime 클래스를 가져옴.

#한글 폰트 문제 해결
path = "c:/Windows/Fonts/malgun.ttf"

from matplotlib import font_manager, rc
if platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Sorry')

plt.rcParams['axes.unicode_minus'] = False

분석을 위한 csv 파일 불러오기

 
저자의 블로그 웹 트래픽 자료가 담긴 csv 파일(하단)을 다운로드 한 후에 주피터 노트북에서 불러온다.

08. PinkWink Web Traffic
0.01MB

 

pinkwink_web = pd.read_csv('../data/08. PinkWink Web Traffic.csv',
                           encoding='utf-8', thousands=',',
                           names = ['date','hit'], index_col=0)
pinkwink_web = pinkwink_web[pinkwink_web['hit'].notnull()] #'hit' 열이 null이 아닌 행들만 선택하여 새로운 데이터프레임으로 할당.
pinkwink_web.head()

csv 파일 불러오기


유입량 분석
pinkwink_web['hit'].plot(figsize=(12,4), grid=True);


2016년 7월 1일부터 17년 6월 16일까지의 유입량을 그려본다.

유입량분석

 

좀 더 정확한 주기성 확인하기 (1차, 2차, 3차, 15차 다항식)

 
먼저 시간축(time)을 만들고 웹 트래픽의 자료를 traffic 변수에 저장
회귀 작업을 위해 모델을 1차, 2차, 3차, 15차 다항식으로 표현하고 그 결과를 확인

time = np.arange(0, len(pinkwink_web))
traffic = pinkwink_web['hit'].values

fx = np.linspace(0, time[-1], 1000)
[함수 설명 with Chat GPT]
1. time = np.arange(0, len(pinkwink_web)): 주어진 데이터의 길이에 따라 0부터 그 길이까지의 시간 배열을 생성합니다. 이 배열은 데이터의 인덱스와 같습니다.

2. traffic = pinkwink_web['hit'].values: 주어진 데이터프레임에서 'hit' 열의 값을 가져와서 NumPy 배열로 저장합니다. 이는 웹 트래픽 데이터입니다.

3. fx = np.linspace(0, time[-1], 1000): 0부터 마지막 시간까지의 범위를 1000등분하여 값을 생성합니다. 이것은 나중에 시간을 예측하기 위해 사용될 수 있습니다.

따라서, 이 코드는 주어진 데이터에 대한 시간 배열과 트래픽 데이터를 생성하는 단계입니다.

 
모델의 접학성을 확인하기 위해 참 값과 비교해서 에러(error)를 계산하기 위해 에러 함수 정의

#error 함수가 x, y, f를 인자로 받고, 함수 내에서 주어진 식을 계산한 후 결과를 반환.
def error(f, x, y):
    return np.sqrt(np.mean((f(x) - y) ** 2))

 
polyfit과 polyld 를 사용하여 1차, 2차, 3차, 15차 함수로 표현

f1p = np.polyfit(time, traffic, 1)
f1 = np.poly1d(f1p)

f2p = np.polyfit(time, traffic, 2)
f2 = np.poly1d(f2p)

f3p = np.polyfit(time, traffic, 3)
f3 = np.poly1d(f3p)

f15p = np.polyfit(time, traffic, 15)
f15 = np.poly1d(f15p)

print(error(f1, time, traffic))
print(error(f2, time, traffic))
print(error(f3, time, traffic))
print(error(f15, time, traffic))

 

다차원 함수
1차, 2차, 3차의 에러 비슷

 

1차, 2차, 3차, 15차 다항식 그래프로 표현하기
plt.figure(figsize=(10,6)) #그림의 크기를 지정. 너비는 10이고 높이는 6.
plt.scatter(time, traffic, s=10) #주어진 데이터를 산점도로 나타냄. x축은 시간이고 y축은 트래픽, s=10은 점의 크기

#함수에 대한 그래프그리기
plt.plot(fx, f1(fx), lw=4, label='f1')
plt.plot(fx, f2(fx), lw=4, label='f2')
plt.plot(fx, f3(fx), lw=4, label='f3')
plt.plot(fx, f15(fx), lw=4, label='f15')

plt.grid(True, linestyle='-', color='0.75') #그리드를 추가하며, 선의 스타일을 지정
plt.legend(loc=2) #범례를 추가하고 위치를 지정
plt.show()

시계열 데이터 산점도

 
다음 챕터에서는 앞으로의 데이터를 예측 분석


다음글

[파이썬] 시계열 데이터 다루기 - 2

 

728x90
반응형