221219 멋쟁이 사자처럼 AI스쿨 7기, 박조은 강사님 강의
✅ 텐서플로우 시계열 예측 튜토리얼
기존에는 데이터를 나눌 때 섞어서 나누었다. 그런데 시계열 데이터에서는 섞어서 나누지 않고 순서를 고려해서 나누게 된다.
자연어 텍스트를 시퀀스 인코딩 했던 것처럼 언어도 맥락이 있기 때문에 섞으면 원래 의미를 잃어버릴 수 있다. 시계열 데이터에서도 순서가 중요하다.
예를 들어 지난 일년 간의 데이터를 통해 앞으로 일주인 간의 데이터를 예측한다고 해보자. 윈도우를 밀어서 앞으로 예측할 일주일 데이터도 일주일치를 한번에 예측하게 하지 않고, 그 전날까지의 데이터를 가지고 와서 다음날을 예측하게 한다.
❓ 시계열 데이터로 예측해 볼 수 있는 것?
- 주가, 부동산 가격, 날씨, 식물의 성장 예측
- 비즈니스 측면 : 판매량, 재고량, 매출액, 서비스 이용 고객 수, 동시 접속자 수, 신선식품 업체의 유통량, 농수산물 가격, 트래픽량
✅ 1106 실습파일
주가 수집
- fdr.DataReader("수집하고자 하는 종목명", "연도")
- investing.com 에서 API 로 데이터를 호출해가는 것을 막았다. 결국 야후 finance로 가져오는 것으로 변경.
문제, 답안 나누기
ohlcv : open, high, low, close, volume, change
df_ohlcv = df.iloc[:, :-1]
dfx = df_ohlcv.drop(columns="Close")
dfy = df_ohlcv["Close"]
dfx.shape, dfy.shape
❓ 회귀와 시계열의 차이점?
- bike-sharing-demand 를 실습했을 때 날짜, 시간 데이터가 있었다. 그런데 그 데이터로 시계열 방법을 사용하기 보다는 회귀 방법을 사용했다. 시계열 사용해서 예측해 볼 수 있기도 하다. 왜 시계열 방법을 사용하지 않고 회귀 방법을 사용했을까?
- 시간대별로 binning 이 되어 있기는 한데, 지금 주가 데이터도 일자별로 binning 되어 있는 상태이다. bike-sharing-demand 데이터를 나누는 기준이 1~19일까지가 train, 나머지가 test로 되어 있었다. 여러 변수를 고려해서 수치데이터를 예측할 때 회귀 모델을 사용하기도 한다.
정규화
데이터 로드=> x,y 데이터셋 나누기 => 정규화(Min-Max) => 윈도우 방식으로 x, y 값 만들기 => 순서를 고려해서 데이터셋 나누기 => 모델 만들고 예측하기
-
나중에 복원하기 편리하게 하기 위해 x, y 를 따로 스케일링
-
y_mm = mmsx.fit_transform(dfy.to_frame())
-
fit_transform 을 할 때는 1차원 데이터는 받지 않는다.
-
y 값은 종가(Close) 컬럼의 값을 시리즈 형태로 가져왔기 때문에 2차원 형태로 변경할 필요가 있다.
-
len(x_mm), len(y_mm)
이 값은 변수별로 스케일링을 해준 값으로 윈도우를 고려하지 않은 값이다.
=> 이전 시점의 데이터가 각 행에 들어있지 않고 해당 시점의 스냅샷만 있는 상태이다.
윈도우를 고려해서 데이터를 만들 예정이다.
윈도우
윈도우를 하나씩 이동하면서 데이터를 만들어 줄 예정 => 범위는 start: 0 , stop: 10
x_mm[0:10], y_mm[10]
window_size=10
len(y_mm) - window_size
from tqdm import trange
x_data = []
y_data = []
for start in trange(len(y_mm)-window_size):
stop = start+window_size
x_data.append(x_mm[start:stop])
y_data.append(y_mm[stop])
1~9일 사이의 학습데이터로 타겟값 10일로 학습.
X : 1~9일
y : 10일
❓ 왜 X 값에 10일까지 넣어주지 않을까?
- 정형데이터에서 정답을 문제에 포함시키지 않는 것과 동일.
- 머신러닝의 학습과 같은 느낌.
- 정답을 학습 데이터에 넣어주면 데이터 누수.
데이터셋 나누기
당뇨병 데이터에서 사용했던 방법
소수점 579.2 가 나오기 때문에 int 로 바꿔준다
- split_size = int(len(x_data) * 0.8)
모델
🔥 return_sequences=True 해당 층 아래 RNN 층을 추가할 것인지 여부에 따라 설정
model.add(LSTM(units=10, activation='tanh', return_sequences=True, input_shape=X_train[0].shape))
원래 값으로 복원 후 비교
y_test_origin = dfy[10:][split_size:]
- 예측 원본 정답
윈도우 방식으로 데이터셋을 만들어 줄 때 10번째 데이터부터 사용했기 때문이다.
0-9 인덱스 데이터는 학습세트로 사용했다.
mmsy.inverse_transform(y_test).flatten()[:5]
- 복원하는 방법도 있지만 정답값은 원래 데이터프레임에서 추출한 값을 사용하면 날짜 정보가 있기 때문에
데이터프레임에서 추출했던 값을 사용하겠다.
✅ 1201 실습 파일
JD 에서 종종 봐 왔던 비즈니스 KPI 에 대해 알아보고 해당 데이터를 통해 추천 시스템까지 구현해볼 예정이다.
❓ 오거닉은 무슨 의미일까?
- 오가닉 트래픽(Organic Traffic)이란 광고나 소셜미디어, 리퍼럴 사이트와 같은 채널을 통해 사이트로 유도되는 트래픽을 제외하고 검색 엔진을 통해 곧바로 유입되거나 동일한 도메인 안에서 유입되는 트래픽을 말한다.
AARRR
시장 진입 단계에 맞는 특정 지표를 기준으로 서비스의 상태를 가늠할 수 있는 효율적인 기준
첫 방문 > 첫 회원가입 > 재구매 > 친구소개 > 첫구매
- Acquisition
- Activation
- 📌
Retention(재사용률) ex) 서버당, 캐릭터당, 컨텐츠 당 retention / 날짜별, 주간 리텐션
- 잔존율 분석(Retention rate analysis) : 고객이 이탈하는 방법과 이유를 이해하기 위해 사용자 메트릭을 분석하는 과정
- ❓ 온라인 강의에서 처음부터 평생 수강권을 주지 않고 30일 수강권을 주고 절반 이상 수강하면 평생 수강할 수 있게 해주고, 그 다음에 다른 강의를 수강할 수 있는 쿠폰을 준다?
- 회사나 제품마다 측정하는 메트릭이 다 다르다. 절반 이상 수강했다면 다른 강의를 수강할 확률이 높아진다. 등을 데이터 분석을 통해 얻을 수 있다.
- 데이터 분석을 통해 해당 제품에서 어떤 지표를 볼 것인지 정한다. 특정 제품에서 가장 중요시 여기는 지표를
북극성 지표라고 부르기도 한다.
- Referral
- Revenue
코호트 분석(Cohort analysis)
분석 전에 데이터 세트의 데이터를 관련 그룹으로 나누는 일종의 행동 분석
코호트는 '집단' 을 의미. 그룹 또는 집단은 일반적으로 정의된 시간 범위 내에서 같은 경험을 공유 : 시간 집단, 행동집단, 규모집단. 우리는 📌시간 집단을 중점적으로 볼 예정
EDA => RFM(segmentation) 을 판다스로 구하고 => 군집화로 고객 세분화(segmentation) => 유사도를 통한 추천시스템
❓ 여성의류 광고를 데이터 기반으로 집행한다면 어느 시간대가 분석에서 가장 많이 구매가 일어나는 시간대일까?
- 전체 주문금액 파생변수
- df["TotalPrice"] = df['Quantity'] * df['UnitPrice']
- 회원, 비회원 구매
- df.loc[df['CustomerID'].isnull(),"Country"].value_counts()
- df.loc[df['CustomerID'].
notnull(),"Country"].value_counts()
- ❓ 중복 데이터를 제거해주려고 한다. 어떻게 제거하면 될까? df.loc[df["StockCode"].isin(stock_sale.index), ["StockCode", "Description"]]
- stock_sale과 stock_desc을 연결
join 을 사용해도 되지만, index 값이 같은 값을 알아서 연결해준다.
- stock_sale["Desc"] = stock_desc
- ❓ Description 항목을 groupby 에 사용하지 않은 이유?
- Description 항목을 groupby 에 사용하면 StockCode 가 같은데도 다른 Description 이라면 함께 집계되지 않는다. StockCode 기준으로 집계하기 위해 집계 후에 Description을 구해주었다.
- 구매 취소 비율
- df[df["Quantity"]<0].head(2) 해보면 InvoiceNo 가 C로 시작한다. 취소 내역
- df["Cancel"] = df["Quantity"]<0
퀴즈
9/10문제
- RNN(순환신경망: Recurrent Neural Network)의 기본모델인 SimpleRNN의 용어가 아닌 것을 선택해주세요.
- 은닉상태, 타임스탭, 셀
- 셀 상태(cell state): input, forget, output 세 개의 게이트(gate)들을 이용하여 정보의 반영 여부를 결정 => LSTM 의 핵심 요소. 기존 RNN 의 문제를 해결하기 위한 요소
- LSTM을 변형시킨 알고리즘인 GRUs (Gated Recurrent Units)에 대한 설명으로 옳지 않은 것을 선택해주세요.
GRUs의 Update Gate는 과거의 상태를 반영하는 Gate이며, Reset Gate는 현 시점 정보와 과거 시점 정보의 반영 여부를 결정하는 Gate이다. => 맞는 것
GRUs는 메모리가 덮어씌워 질 가능성이 있으며 연산속도가 느리다는 단점이 있다. => 틀린 것