시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.
보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.
시계열 분석(feat. fbprophet) 을 위한 Visual C++ Build Tools 설치
- 시계열 데이터: 데이터가 시간의 흐름에 따라 변화하는 추이가 있는 데이터 (웹 트래픽, 주식 등)
- 시계열 분석은 원 데이터의 안정성을 판정하고, 안전한 형태로 변환하고, 예측 모델을 선정하고 검증하는 과정에서 통계학의 깊은 지식을 요구
- fbprophet 모듈: 페이스북에서 만든 간단한 데이터를 예측할 때에 유용한 도구
(윈도우 사용자들의 경우 Visual C++ Build Tools 설치 필요. 맥은 설치 불필요)
하단의 링크에서 다운로드 가능
터미널에서 모듈 설치하기
Visual C++ Build Tools 설치 후, pystan 과 prophet 모듈 설치
pip install pystan
pip install 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
그리고나서 다시 pystan을 설치하면 된다. (시간이 꽤 오래 걸리는데, 구글링을 해보니 원래 그런듯하다.)
이제 시계열 분석 준비가 완료되었다.
Numpy의 polyfit으로 회귀 (Regression) 분석하기
먼저 주가 데이터를 가져오기 위한 판다스 데이터 리더 모듈을 설치
pip install 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 파일(하단)을 다운로드 한 후에 주피터 노트북에서 불러온다.
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()
유입량 분석
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차, 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()
다음 챕터에서는 앞으로의 데이터를 예측 분석
다음글
'[파이썬 Projects] > <파이썬 데이터 분석>' 카테고리의 다른 글
[파이썬] 시계열 데이터 다루기 - 3 (0) | 2024.05.06 |
---|---|
[파이썬] 시계열 데이터 다루기 - 2 (0) | 2024.05.06 |
[파이썬] 19대 대선 결과 분석 -4 (0) | 2024.05.04 |
[파이썬] 19대 대선 결과 분석 -3 (0) | 2024.05.04 |
[파이썬] 19대 대선 결과 분석 -2 (0) | 2024.05.01 |