ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로젝트] 서울시 지역별 한식당 창업 성공 예측 모델 (ML 예측 모델 구현)
    데이터 분석 공부/회고 2024. 7. 5. 12:33
    728x90

    🍙 한식당, 어디에 창업해야 성공할 수 있을까?

     

    학교 다닐 때부터, 회사를 다닐 때에도, 심지어 학원을 다니는 지금도

    "왜 든든한 밥 한 끼 먹을 곳이 마땅치 않을까?" 라는 말을 친구들과 많이 하곤 했는데요.

     

    이번 프로젝트원들과 주제를 고민하며 저녁을 먹을 때에도

    한식당이 왜 이렇게 없냐는 얘기를 하다가 한식당 창업 성공 예측 모델을 주제로 선정했습니다. 

     

    서울시 행정동별로 어떤 지역에 한식당을 창업하면 성공 확률이 높을지를 예측해 보겠습니다.

     

    Github 주소 : https://github.com/pladata-encore/DE31-2st_team4/tree/main

     

     

    1. Prologue

    1) 데이터셋 소개

    • 서울 열린데이터 광장의 서울시 상권분석 데이터
      • 행정동별 추정매출, 소득소비, 직장 인구, 상주 인구, 유동 인구, 점포 수, 임대료 데이터셋

    2) 분석 목표

    • 이 프로젝트는 서울시의 다양한 데이터를 활용하여 한식 전문점의 창업 성공 가능성을 예측하는 머신러닝 모델을 구축하는 것을 목표로 합니다. 이를 통해 예비 창업자들이 보다 합리적인 의사 결정을 할 수 있도록 지원합니다.
    • 이러한 분석을 통해 창업자들은 단순히 유행을 좇는 것이 아닌, 데이터에 기반한 신뢰성 있는 사업 계획을 수립할 수 있을 것입니다. 기업은 마케팅 전략을 보다 정교하게 수립하여 지속 가능한 성장을 도모할 수 있습니다.
    • 청년 창업자들에게 유용한 아이디어를 제공하고, 지역 경제 활성화와 소비자 만족도 증진에 기여할 수 있을 것입니다.
    • 특히, 본 프로젝트는 소비의 흐름 즉, ‘화폐’의 동향을 추적하여 경제의 핵심지표가 되는 소비자에 관한 유의미한 인사이트를 제공하면서, 향후 추가적인 금융 데이터 프로젝트로 발전할 가능성이 크다고 볼 수 있습니다.

    2. EDA

    1) 이상치, 결측치 확인

    1.  y값 (당월 매출 금액) 의 분산이 너무 크고 이상치가 많음 → 평균보다는 중간값을 기준으로 확인해야겠다고 판단
    2.  y값이 정규 분포와 얼마나 가까운지 확인

     

    2) y값에 영향을 미치는 Feature Importance 확인

    a. 변수 간 상관관계 분석 → 매출금액과 상관관계가 높은 피쳐는 유사업종점포수, 개업점포수, 폐업점포수, 당월매출금액, 직장인구 수, 유동인구 수

     

    b. y값과의 상관관계 분석 (랜덤포레스트 모델 돌려서 변수 중요도 확인)

     

     

    3) 분석에 사용할 컬럼 선택

    1. 상관관계가 너무 작은 컬럼 제외
    2. 유사한 컬럼은 묶어서 사용
      - 점포수 + 프랜차이즈점포수 = 유사업종점포수
    3. 다중공선성 확인
      - 매출 건수 <> 매출액 깊은 관계 있어 drop

     

    3. 전처리

    - null 값 처리 

    - 분석 범위의 데이터로만 필터링 (한식 음식점)

    - 데이터 머징 : 행정동별 소득소비, 직장인구, 상주인구, 유동인구, 점포 수, 임대료 데이터셋 merge

     

     

    4. 모델링

    1) 단순선형회귀 

    - 최소제곱법(OLS)을 활용한 단순 선형 회귀를 1차적으로 수행했음
        [ why? ] 
        - 처음에 데이터셋을 뽑아서 상관관계 파악
        - 수치형 데이터로 수치형 데이터(y값)를 예측하려고 하는 문제이기 때문에
        - 시계열 데이터이기 때문에 → 선형 관계의 핵심


    2) RMSLE

    (Root Mean Squared Logarithmic Error)

    실제 매출액보다 더 크게 예측을 하면 발생할 피해(손실)이 더 악영향을 준다고 판단.
    매출액을 실제보다 더 적게 예측하는 건 괜찮을 수 있지만, 더 크게 예측하는 것을 방지하고자 RMSE보다 RMSLE를 사용

    매출액의 분포가 왜곡 성향을 가짐 
    → 왜곡된 값을 정규 분포 형태로 바꾸는 가장 일반적인 방법인 로그를 적용해서 변환


    log 변환 전후 비교 시, 오류 값이 확연히 줄어들었음. 
    따라서 매출액을 실제보다 더 크게 예측하여 발생하는 손실 문제를 해결할 수 있음.
    이 log변환 데이터를 바탕으로 릿지 회귀를 실시함.

    3) 릿지 회귀 

    실제 매출액보다 더 크게 예측을 하면 발생할 피해(손실)이 더 악영향을 준다고 판단. 

    즉, 매출액을 실제보다 더 적게 예측하는 건 괜찮을 수 있지만, 더 크게 예측하는 것을 방지하고자 L2 규제를 사용

    릿지 회귀 결과

     


    5. 모델별 / 스케일러별 특징 & 선택 이유 

    1) 배깅 방식 ㅡ 랜덤포레스트

    각각의 분류기가 모두 같은 Decision Tree 알고리즘 기반으로, 데이터 샘플링을 다르게 가져가면서 개별적으로 학습을 수행해 보팅을 진행한 결과로 최총 예측 결과를 선정하는 방식
            
    랜덤 포레스트는 앙상블 알고리즘 중 비교적 빠른 수행 속도를 가지고 있으며, 높은 예측 성능을 보이고 있고 쉽고 직관적인 구조를 갖고 있다. 
            
    스케일링 방식을 나누어서 진행, 비교해 보았음. 
            
            - Standard Scaler : 개별 피처를 평균이 0이고 분산이 1인 값으로 표준화
            - MinMax Scaler : 데이터값을 0과 1 사이의 범위 값으로 변환

     

    2) 부스팅 방식 ㅡ catboost, xgboost, lightgbm

    여러 개의 분류기가 순차적으로 학습을 수행하되, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 분류기에 가중치를 부여하는 알고리즘. 
            
    특히 그래디언트 부스트 머신은 가중치 업데이트를 경사 하강법을 이용해 오류식을 최소화하는 방향으로 반복적으로 학습한다는 특징을 가짐
            
        - XGBoost : GBM의 단점인 느린 수행 시간 및 과적합 규제의 부재 문제를 해결해 각광 받는 알고리즘.
        - LightGBM : XGBoost 대비해서도 더 빠른 학습과 예측 수행 시간, 메모리 사용량이 더 적음
        - Catboost : 처음 데이터셋은 성별/시간대/연령대/요일이 모두 카테고리로 이루어진 범주형 데이터가 대부분이였기 때문에 범주형 데이터 처리에 특화된 모델인 캣부스트를 사용하려 했으나 전처리 및 추가적인 데이터 수집을 통해 수치형 데이터 세트로 통합되어 캣부스트는 다른 부스팅 알고리즘과의 성능 비교를 해 보고자 수행함

     

    6.  모델별 성능 설명 및 비교

    1) learning curve로 예측 vs 정답값 비교

    XGBoost 러닝 커브

     


    2) 하이퍼 파라미터 튜닝 


        2-1. 랜덤포레스트 ㅡ Grid Search
        2-2. 부스팅 방식 ㅡ Optuna / 그리드 서치

     

    3. 교차 검증

    교차 검증이란 주어진 데이터셋에 학습된 알고리즘이 얼마나 잘 일반화되어있는지 평가하기 위한 방법이며
    데이터를 여러 번 반복해서 나누고 여러 번의 모델 학습 및 검증 과정을 거칩니다.

    이러한 교차 검증을 활용하여 데이터셋 내의 모든 데이터를 훈련에 사용할 수 있고, 
    모델의 성능과 정확도를 향상시킬 수 있어 보다 일반화 된 모델을 만드는 것이 가능합니다.

    또한 데이터 부족으로 인한 과소적합을 방지할 수 있고 테스트 데이터가 편중되는 것을 방지할 수 있습니다.


    1) Kfold

    K-fold는 먼저 데이터셋을 훈련 세트와 테스트 세트로 나눕니다.
    그리고 훈련 세트를 이름과 같이 K개의 폴드 세트로 나누고 이 폴드 세트를 학습용 데이터와 검증용 데이터로 나눕니다.

     

    모델은 K-1개를 학습 세트로 사용하고 나머지 하나를 검증 데이터 세트로 설정하여 평가를 진행하는데,
    이 때 분리된 K개의 폴드 세트에 대하여 검증 데이터세틀 변경하며 K번의 검증을 수행하고 모델을 학습한 뒤
    K번의 평가 결과에 대한 평균을 내어 최종 모델의 성능을 구합니다.


    2) cross_val_score

    cross_val_score 는 교차 검증을 위해 사이킷런에서 제공하는 함수이며
    매개변수로 모델명, 훈련 데이터, 타겟 데이터, cv가 입력되며 여기서 cv는 폴드 수를 의미합니다.


    7. 창업 예측 분석

    1. inverse_transform을 통해 스케일링된 값을 원본 값으로 변환하여 예측 매출액 구하기 
    2. 행정동별 median값 계산하여 컬럼으로 추가하기 
    3. a와 b를 비교하여 예측 매출액이 동별 중앙값보다 큰 지 여부에 따라 창업 성공 컬럼에 성공(1)/실패(0) 으로 처리
    4. 창업 성공 컬럼의 평균값 계산하여 각 동별 창업 성공률 도출

     

    8. 최종 인사이트

    1) 예측 매출액을 통한 창업 성공/실패 여부판단

    • 모델링 목적 창업 성공 여부를 결정 짓기 위한 매출액의 예측값
    • 모델 평가
      • 정확도 97%
      • y값 매출액 단위 때문에 MSE 값의 단위도 크게 잡힘
    • 변수 [창업 성공/실패] 도출 과정
      • 행정동별 월 매출액 median 값과 비교하여 창업 성공/실패 여부를 도출했다
      • 그러나 창업 성공 여부를 판단하기 위해 매출액만 고려하는 것은 아니라고 생각해서 다른 피쳐들의 영향력을 반영하기 위한 방법을 고민했다

     

    2) <창업 성공예상점수> 방정식

     - 점포당_당월평균매출금액(Predicted)에 대한 파생변수들의 상관관계를 분석하여 가중치 설정


    - 창업 성공 예상 점수 컬럼 추가하여, 해당 변수 기준으로 시각화 


    9. 느낀 점

    해당 데이터셋으로 예측모델 구현을 해 보았는데, 여러 데이터셋과 결합하면

    의사결정에 매우 큰 도움이 되는 강력한 예측 모델이 될 수 있겠다는 생각을 했습니다.

     

    머신러닝 모델을 처음으로 직접 구현해 보았는데, 

    생각보다 모델 선택에 고려해야할 사항도 많고 머신러닝 돌릴 때 파라미터 코딩하는 것도 오류가 많이 나서 어려웠습니다.

     

    또 통계적인 부분에 있어서도 기초가 많이 부족하다는 걸 느꼈습니다.

    분석 결과를 해석할 때 어떤 검정 방법을 이용할 것인지, 해석은 어떻게 하는 것이 바람직할 지 등

    앞으로 지식과 경험을 쌓아가면서 노하우가 생겨야 될 것 같습니다. 

     

    추후에는 사용자로부터 직접 정보값을 입력받아 성공 예측 점수를 출력해주는 서비스로 이어보면 재밌을 것 같습니다! 

    댓글

Designed by Tistory.