KT 에이블스쿨 : 5차 미니프로젝트 (2일차) - 시계열 데이터 전처리 - 모델링

      




    5차 미니프로젝트

    2일차 : 24.04.25 (목)  

    어제 데이터 탐색을 하면서 실패한 merge 부분을 생각하면서 

    데이터 전처리 및 모델링을 했다. 


    처음부터 끝까지 함수화해서 파이프라인을 만들때 써먹을 수 있도록 노력했다.

    함수화를 하니까 merge한 데이터프레임, 전처리, 모델링을 통일성 있게 할 수 있어서 오늘 실습을 하면서도 효율성이 높아진게 느껴졌다. 



    시계열 데이터 전처리

    merge

    0. 날짜를 담고있는 date 컬럼 - datetime 형으로 변환

    1. sales 데이터프레임

    - 44번 매장 데이터 추출

    - product_ID별 데이터 추출 : product_ID = 'Total' 이면, 44매장의 전체 상품을 필터

    - 상품별 Qty를 합쳐서 하루에 1개의 행을 가지도록 groupby

    * 상품별 동일 카테고리의 판매량 합계를 나타내는 새로운 열을 추가 

    * 1일전 판매량(shift(1)) ~ 3일전 판매량(shift(3)) 을 나타내는 열 추가

    * 최근 7일간 판매량 평균 df[f'Qty_Lag_{7}_mean'] = df['Qty'].rolling(7, min_periods = 1).mean()



    2. orders 데이터프레임

    - 44번 매장 데이터 필터

    - 불필요한 컬럼(매장ID) 삭제

    - Date로 월 / 요일 컬럼 새롭게 만듦

    * 매장 44번과 동일한 지역의 매장 방문객 수를 나타내는 새로운 열 추가 


    3. oil_price 데이터프레임

    - 이 데이터프레임에는 결측치가 간혹 있어서, 14일간의 유가 평균으로 함 

    df['WTI_Price'] = df['WTI_Price'].rolling(14, min_periods=1).mean()


    4. customer 데이터프레임

    - 1일별 고객 방문수


    5. target 

    df['Target'] = df['Qty'].shift(-2)



    ** 중요 **

    시계열 데이터다 보니, 인덱스가 쭉 이어져야함. 

    여러개의 데이터프레임을 합치고, 붙이고 하다보면 인덱스가 뒤죽박죽이라 인덱스 정리가 필수

    df.dropna(inplace=True) 

    df.reset_index(drop=True, inplace= True)




    전처리 함수

    처음 함수화할때는 전처리 + 모델링 둘다 한번에 하는 함수로 만들었는데

    전처리, 모델링 이렇게 나누는게 맞는 것 같아서 3일차에는 나눔

    1. 결측치 처리 : sales 데이터프레임의 결측치만 선형보간법으로 대체했음

    (이유) 결측치가 있는 날짜가 매년 새해, 크리스마스인 경우였기에 판매량은 임의의 값이나, 삭제를 하면 안된다고 생각했음


    2. 데이터 분리x = df.drop(columns = ['Date', 'Target'])


    3. 가변수화 

    '요일', '월' 컬럼은 정확히 n개로 범주화 되어있는거기에 그냥 가변수화를 시키면 안됨 

    학습데이터와 평가데이터가 다를수도 있기때문이다.

    ex) 학습 데이터에서는 1월~12월 (12개) 있어서, 12개 가변수화를 했는데

    평가데이터에서는 1월 (1개)만 있을수도 있음. 똑같이 가변수화를 하면 컬럼 갯수가 달라져서 오류남

     




    모델링 

    1. 학습용, 평가용 데이터 짜를때

    시계열 데이터의 경우에는 시간의 흐름을 고려해서 짤라야함 

    x_train, x_val, y_train, y_val = train_test_split(x, y, test_size=120, shuffle=False, random_state=30)

    test_size = 120 으로 두면, 30 * 4 로 4개월의 데이터를 평가용으로 나누겠다는 것 


    만약 x나 y가 120개의 행만큼 값이 없으면 오류가 남 

    실제로 학습데이터에서는 위와 같이 120을 줬을때 잘 실행됐지만,

    평가데이터는 한달치(30개행)이라 test_size = 120 부분에서 계속 오류가 나, 애먹었다 


    2. 스케일링

    스케일링했을때 미세하게 예측성능이 더 좋아서 스케일링 






    모델링 성능 

    1. 기본 데이터셋

    파생변수를 추가하지 않았던 첫번째 데이터셋 예측 성능 

    중간에 값이 크게 다름

    비슷한 추이
    (강사님이 직접 넣은 상품 데이터라 그럼) 




    2. 파생변수 + 데이터셋

    이것저것 추가했던 데이터셋의 linear regression 

    (상품42는 데이터셋, 모델 상관없이 성능이 잘나와서 생략)


    아무것도 추가하지 않은 데이터셋의 linear regression보다 성능이 좋게나왔음

    그렇지만, 중간에 크게 튀는 값은 예측 못함



    3. Random forest

    그래프는 위의 2번 그래프랑 비슷하게 나오는데

    대체적으로 조금 더 성능이 좋게나옴 

    but, 곡식에서는 random forest가 성능 가장 낮음


    4. Light GBM

    5. XGBM

    6. KNN


    여러 모델을 사용해봤는데 상품별로 좋은 모델이 다 달랐음 



    추가


    merge한 최종 df에서 상관계수를 확인했을때

    음수인 컬럼은 삭제하면 더 좋을듯





    댓글

    이 블로그의 인기 게시물

    [KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

    KT 에이블스쿨 : IT 인프라 (1일차~5일차) 공부 정리

    KT 에이블스쿨 : 핀테크 아이디어 공모전