티스토리 뷰
날짜 데이터 요소
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 = 값을 기준으로 합치는 데, 값을 기준으로 합치는 것을 조인키라고 한다.