티스토리 뷰

반응형

날짜 데이터 요소

rolling

shift

 

무엇이 시계열 데이터인지를 잘 알아야 한다.

 

딥러닝 마지막 시간에 시계열 데이터 모델링

 

시계열 데이터

시계열 데이터란

행과 행에 시간의 순서가 있고

행과 행의 시간간격이 동일한 데이터

 

가장 많이 사용되는 것 = 판매량 예측, 주가 예측

 

날짜 요소 뽑기

우선 날짜 타입으로 변환한다. -> pd.to_datetime(df['date']) 

그 후에 해당 함수들을 적용한다.

df['date'].dt.date
df['date'].dt.year
df['date'].dt.month

이런식의 요소롤 쓴다.
df['date'].weekday

연 기준 몇 주 째인지도 있다.
df['date'].weekofyear

 

단계

1. 날짜는 문자 타임이므로, pd.to_datetime(df['date'])으로 바꿔준다.

pd.to_datetime(날짜 데이터, format=' 입력되는 날짜의 형식')

df['Date'] = pd.to_datetime(df['Date'])

 

이런식으로 Date의 시리즈를 업데이트 해준다.

 

미국에서는 mm/dd/yyyy를 쓰기도 하고, 다른곡에서는 dd/mm/yyyy를 쓰는 곳도 있다.

01/02/1999는

1월 2일인지, 2월 1일인지 모른다.

 

그래서 처음 포맷이 뭔지를 알려줘야 한다.

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior

 

yyyy/mm/dd면 안써도 된다.

d = pd.to_datetime(d, format = '%d-%m-%Y') #입력받은 날짜 데이터 형식이 '%d-%m-%Y'!

 

2. 날짜 요소 추출

df.dt.year #년
df.dt.month #월
df.dt.day #일
df.dt.weekday #주의 : 0이 월요일이다.
df.dt.day_name() #요일 이름

->바뀌었다. df.dt.isocalendar().week

 

datetime이 바뀌었다. isocalender를 써야 한다.

 

주가예측을 너무 거시적으로 접근한다.

장기투자?

 

Shift

2/1일날 주가를 가지고 내일 주가를 예측하려면, shift를 해서 표기하는 게 좋다.

shift는 시간의 흐름 전후로 데이터를 이동시킬 때 사용된다.

 

내일주가가 붙여져 있고, 이동평균 주가가 계산되어 있다.

열을 늘려가면서, 행을 맞추고 있다.

df['lag1']=temp['lag'].shift() #한칸씩 밀린 데이터
df['lag2']=temp['lag'].shift(2) #두칸씩 밀린 데이터
df['lag3']=temp['lag'].shift(-1) #한 칸 올라간 데이터

 

즉, 열 전체를 위나 아래로 내릴 수 있다고 생각하면 쉽다.

-1은 거의 없다.

rolling + 집계함수

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.rolling.html

 

시간의 흐름에 따라서 일정 기간 동안의 평균을 이동하면서 구한다.

rolling(n, min_periods= ).mean() 로 쓴다.

min_periods는 최소 데이터수를 의미한다. 이게 있으면 NaN이 채워진다.

 

한마디로, 이동평균을 구할 수 있다.

temp['A_1'] = temp['A'].rolling(7, min_periods = 1).mean()

 

일주일간의 이동평균을 구하는데, min_periods가 있으면 NaN이 표시되는 게 아니라 min_priods 만큼만 평균을 계산해서 채워준다.

	A_1	A_2
0	NaN	20.000000
1	NaN	1979.000000
2	NaN	2281.000000
3	NaN	2437.500000
4	NaN	2716.200000
5	NaN	2941.166667
6	2906.714286	2906.714286
7	3265.714286	3265.714286
8	3054.857143	3054.857143
9	2944.142857	2944.142857

 

이게 필요한 건 120일 이동평균을 계산할 떄 필요하다.

 

120을 NaN으로 만들 수는 없기 때문.

 

diff

diff는 특정 시점 데이터와 이전 시점 데이터와의 차이를 구한다.

diff 안에 들어가 있는 값만큼의 행 차이로 구해준다.

2이면 이틀 전의 값, 3이면 3일전의 값

 

이 방식을 차분한다고 한다.

temp['A2'] = temp['A'].diff(2)
temp.head(10)

 

주가관점에서 보면 등락. 즉, 변화량을 계산하는 것이다.

 

내일 종가 vs 변화량

컬럼을 떼어놓고 진행하는 게 마음 편하다.

tip.loc[:,'컬럼명1','컬럼명2']

# 전날 매출액
d['before']=d['A'].shift()

# 7일 전(전주 동 요일) 매출액
d['before_week'] = data['A'].shift(7)

# 3일 이동평균 매출액
d['rolling_3'] = data['A'].rolling(3).mean()

# 전날대비 매출액 증감여부 (증가 1, 감소 -1, 동일 0) np.where로 바꾼다.
d['up_and_down']=d['A'].diff()
d['up_and_down'].loc[d['up_and_down']>0]=1
d['up_and_down'].loc[d['up_and_down']<0]=-1
d['up_and_down'].loc[d['up_and_down']==0]=0
data

 

그러면 이렇게 하지 말고, np.where를 중첩해서 쓰면 된다.

 

pd.cut도 써도 된다.

다양한 방법이 있다.

d['up_and_down']=np.where(d['up_and_down']>0,1,  
                             np.where(d['up_and_down']==0,0,-1) )

 

pd.cut(data['up_and_down'], bins=[-np.inf,-0.5,0.5,np.inf],labels=[-1,0,1])

 

cut은 정수일 경우 사용 가능.이게 Nan이 나오기 때문에 더 좋다.

 

다시 CRISP-DM

무엇이 문제인가?

  • 비즈니스 문제정의
  • 데이버분석 방향, 목표 결정
  • 초기 가설 수립(x->y)
  • 영향을 주는 요인이 무엇인가?

데이터 이해

  • 원본식별
  • 하나의 데이터프레임 형태로 정리
  • 데이터분석 EDA & CDA
  • ->비즈니스 관점으로 해석해야 하기 때문에, 제일 어려운 단계이다.

 

모델링을 위한 데이터 구조 만들기

 

모델을 만들고 검증하기

 

문제가 해결되었는가?

 

Business Understanding - 가설 수립

문제를 정의하고 요인을 파악하기 위해서 가설을 수립한다.

이미 있는 것을 귀무가설

새로운 연구 가설 대립가설

 

가설 수립 절차

1.해결해야 할 문제가 무엇인가?(목표, 관심사, y)

2. y를 설명하기 위한 요인 찾기(x)

3. 가설의 구조를 정의(x->y)

 

운영에서 고객이 렌탈료 체납.

연락이 안된다. 이걸 비정상 계약이라고 한다.

비정상계약을 승인 단계에서 거르기 위해서 확률 예측.

 

데이터 이해

데이터 원본 식별 및 취득

취득 조차 불가능한 영역을 알아야 한다.

 

  • 있는 데이터 - 그대로 사용가능,가공해야 사용가능
  • 없는 데이터 - 취득 가능, 취득 불가능
  • 가용 데이터 - 그대로 사용가능, 가공해야 사용가능, 취득 가능

 

데이터 탐색 : EDA(탐색적 데이터 분석), CDA(확증적 데이터 분석)

데이터를 탐색하는 두 가지 방법 - 통계량과 시각화

 

EDA : 개별 데이터의 분포, 가설이 맞는지 파악한다. NA나 이상치를 파악한다.

CDA : 탐색으로 파악하기 어려우면 통계적 분석 도구(가설 검정)를 사용한다.

 

확증적 데이터 분석은 가설검정, 실험(통계학 개론- 가설검정) 도구 사용

 

3가지 사항을 익혀야 한다.

  • 언제, 어떤 그래프를 그리고 어떻게 해석하는지
  • 언제 어떤 통계량을 구하고 어떻게 해석하는지
  • 언제 어떤 가설검정 방법을 사용하고 어떻게 해석하는지

 

&&&

Note = NaN은 어떻게 처리해야 할까?

비즈니스 관점에서 볼 때 0으로 채우는 게 의미가 있는지 아닌지 파악해야 한다.

타당한지를 따져봐야 한다.

일반적으로 Shift 했을 때 첫째날에 해당하는 값은 그냥 행을 빼버린다.

 

중간에 Nan이 있을 때는 이후 값에 대한 데이터는 별로 안 쓴다(Data leak)

그래도 통계적인 접근이 아니라, 비즈니스 관점에서 타당한지가 1순위다.

 

도메인 지식이 필요하다.

&&&

 

EDA 및 CDA를 진행

 

1. 단변량 분석은 개별 변수의 분포를 비교한다.

 

2 .이변량 분석1 : feature과 target 간의 관계를 확인한다.

객실등급(독립변수) -> 생존여부(종속변수) = 객실등급에 따라서 생존여부에 차이가 있는가?

 

3. 이변량 분석 2: feature들 간의 관계를 확인한다. (피어슨 상관계수, 스피어맨 상관 계수)

 

모델링을 위한 데이터 준비 후, 모델링

데이터로부터 패턴을 찾는 과정이다.

오차를 최소화 하는 패턴

결과물 : 모델(모델은 수학식으로 표현된다)

 

모델링을 위해 필요한 두 가지는 학습 데이터알고리즘이다.

 

데이터를 합치거나 만들 때 어떤 데이터를 기준으로 판단하는가?

sales =트랜잭션 data / 상품의 데이터가 연결되는 데이터 

 

products - 상품 = 마스터 데이터 제품을 판매한다.

 

실제 데이터 테이블에서는 인조식별자가 있다.

입사해가지고 실제로 하려면 행을 어떻게 만들어야 하는지부터 고민해야 한다.

 

merge = 값을 기준으로 합치는 데, 값을 기준으로 합치는 것을 조인키라고 한다.

반응형