Docker 기반 OpenRouteService를 활용한 도보 소요 시간 계산(3)

cmkkws·2025년 8월 26일

데이터 수집

의료접근도

  • 의료시설 병합(병원/약국,822건)
  • 약국은 규모 1로 지정
  • 규모를 고려한 접근도 변수 생성(3,824건 * 822건)
    • 3 구간으로 분류
    • 구간별 도보 소요시간에 해당하는 의료시설 규모 카운트

녹지 접근도

  • 인천광역시 서구 지역에 있는 공원과 근처에 있는 아파트를 매핑
  • 면적 규모에 따른 가중치 부여
  • 3구간 분류 및 녹지시설 규모 카운트

최종 데이터셋

  • 주택속성 변수(건축연한, 계약날짜, 유명브랜드, 명적, 층)

  • 교통 / 의료 / 교육 / 녹지 접근도 변수

  • 추가로 거시경제적 지표(KOSPI, GDP 성장률, EXCHANGE RATE)를 당시 계약 날짜에 맞추어 매핑

    • 주말 및 공휴일로 인한 비거래일에는 직전 거래일의 값을 보정하여 적용
    • 결측치 4건 3분기 gdp는 2분기 GDP 성장률로 보정하여 적용

최종 반응 변수:

  • 거래가격

최종 예측 변수:

  • 주택속성 변수(건축연한, 계약날짜, 유명브랜드, 면적, 층) 5개
  • 교통 / 의료 / 교육 / 녹지 접근도 변수 등 16개
  • 거시경제지표(KOSPI, GDP 성장률, EXCHANGE RATE) 3개

데이터 전처리 & 분석

EDA

  • 각 변수의 기초 통계량 확인

  • 종속 변수 데이터 분포 확인

  • 예측 변수간 상관계수 히트맵 확인

  • 상관계수가 0.7이상인 예측변수 쌍

  • 분석결과:

    • 유치원 / 학교 / 학원 접근도 결측치 비율이 80퍼센트 정도 되어 다시 한번 확인해볼 필요가 있음을 깨달았다.
    • 유치원 / 학교/ 학원 접근도간 상관관계 수치가 매우 높아 처리가 필요하다.

    회귀분석을 통한 모델 성능 확인

    모델 성능을 알아보고자 다중선형회귀분석(OLS 회귀) 결과를 확인해보았다.

  • 결정계수: 0.883, p-value: 00.00으로 모델 예측력이 높고, 통계적으로 유의함을 알 수 있었다.

    4개의 변수를 제외하고, 통계적으로 유의함을 알 수 있었다.

접근도 파생변수 생성

접근도 변수(교통, 녹지, 의료, 교육) 총 16개의 변수를 각각 부문별 접근도 총 4개의 파생변수로 만들었다.

교육 / 녹지 / 의료 접근도

  • 학교_A, 학교_B, 학교_C / 학원_A, 학원_B, 학원_C / 유치원_A, 유치원_B, 유치원_C
  • 공원_A, 공원_B, 공원_C
  • 의료_A, 의료_B, 의료_C
    도보시간을 기준으로 나눈 것을(A: 0~10분, B: 10~20분, C: 20~30분) 어떠한 기준으로 가중치를 부여해서 접근도 파생 변수를 만들 수 있을지 고민했다.
    • 가중치를 부여하는 과정에서 근거가 있게 할 것
    • A집단에 가중치를 더 많이 부여할 수 있도록 할 것
    • 선형함수보다는 비선형함수의 가중치가 될 수 있도록 할 것
  • 해당 조건을 생각하며 통제변수(아파트 속성, 거시경제지표)를 포함했을 때 가장 높은 결정계수를 가진 가중치 변수를 채택하기로 결정하였다.
    • 거리감쇠함수 eαde^{-\alpha d}를 통해 먼거리는 값이 작아지도록, 가까워질수록 급격히 증가하는 형태의 함수를 통해 접근도를 계산했다. α:감쇠계수,d:거리\alpha: 감쇠 계수, d: 거리
    • 성능평가는 5겹 cv를 통한 결정계수 평균을 통해 가장 높은 결정계수의 감쇠 계수를 선정했다.
    • 감쇠 계수는 총 5개[0.01, 0.02, 0.05, 0.1, 0.2]로 설정 후 진행하였다.
    • 교육 접근도는 먼저 학교, 학원, 유치원의 접근도로 통합한 후, 다시 가중치를 각각 0.5, 0.3, 0.2를 활용해서 최종 교유접근도 파생변수를 만들었다.


      상관계수 히트맵 확인

      교통 접근도

      수집 기간 2020. 11.11 ~ 2025.07.07 기간 중 개통 날짜는 2025.06.28으로 같은 접근도라도, 다른 가중치를 두어서 교통 접근도를 계산해야했다.
      (ex: 2020년 개통 5년 전 접근도와 2025년 7월 개통 후 접근도의 가중치를 다르게 계산)

따라서 다음과 같은 방법으로 교통접근도 파생변수를 만들었다.

  • 개통일까지 남은 일수에 대한 변수 생성
  • 가중치 함수 정의(지수함수, sigmoid함수)
  • 교차검증을 통한 가장 결정계수값이 높은 함수와 그 때의 계수 선정

분석 결과:

sigmoid 함수, beta = 0.1으로 최적의 교통 접근도 함수 및 파라미터를 선정하였다.

  • 교통 접근도에 가중치를 곱해 새로운 교통 접근도 파생변수를 생성했다.

해당 접근도를 활용해서 다중선형회귀분석을 진행한 결과 다음과 같다.

TimesNet을 활용한 분석

최종 데이터셋을 활용해 TimesNet 모델에 적용시키는 작업을 진행하고 있다.
TimesNet git에 있는 소스코드를 활용해 분석을 하도록 하였다.

실행은 run.py → exp/exp_long_term_forecasting.py → models/TimesNet.py 으로 진행된다.

requirements.txt에 명시된 라이브러리들의 호환성 문제로 인해 Python 3.10 이하 버전이 요구되며, 이에 따라 별도의 가상환경인 .venv310을 생성하여 해당 환경에서 프로젝트를 진행하였다.

해당 코드를 terminal에 입력하여 run.py를 실행하는데, 파라미터를 지정해주어야 한다.
파라미터는 run.py에서 확인 가능하다.

  • task_name long_term_forecast # 작업 유형: 장기 시계열 예측 (long-term forecasting)
  • is_training 1 # 학습 여부 (1=학습 모드, 0=테스트/추론 모드)
  • root_path ./dataset/ # 데이터셋이 위치한 루트 폴더
  • data_path final_final_final_datasets.csv # 실제 데이터 파일명
  • model TimesNet # 사용할 모델: TimesNet
  • model_id TimesNet_mydata_96_24 # 모델 실험 ID (로그/결과 저장용 식별자)
  • data custom # 데이터셋 타입: custom 데이터셋 사용
  • features M # 입력 데이터 특징 설정: M=다변량(multivariate), S=단변량(single), MS=다변량→단변량
  • seq_len 96 # 입력 시퀀스 길이 (과거 96개 타임스텝 사용)
  • label_len 48 # 디코더 입력으로 쓰일 과거 시퀀스 길이
  • pred_len 24 # 예측해야 하는 미래 시퀀스 길이 (24개 스텝 예측)
  • enc_in 12 # 인코더 입력 차원 (특징 개수)
  • dec_in 12 # 디코더 입력 차원 (특징 개수)
  • c_out 1 # 출력 차원 (예측 대상 변수 개수 = 1개: 거래가격)
  • e_layers 2 # 인코더 레이어 수
  • d_model 64 # 모델 hidden dimension (embedding 차원)
  • d_ff 64 # Feed-Forward 네트워크 차원
  • top_k 5 # TimesBlock에서 선택할 주요 주기(period) 개수 (FFT 기반)
  • num_kernels 6 # Inception block에서 사용하는 커널 수
  • train_epochs 10 # 학습 epoch 수
  • batch_size 32 # 배치 크기
  • learning_rate 0.001 # 학습률
  • patience 3 # Early stopping patience (성능 향상 없을 시 3 epoch 후 조기 종료)
  • des Exp_mydata # 실험 설명 태그 (log 저장용)
  • itr 1 # 실험 반복 횟수 (다회 반복 실험 시 설정)
  • target 거래가격 # 예측할 대상 변수 (target column: 거래가격)

현재 파라미터를 조정하면서 알맞은 값을 찾기 위해 진행 중에 있다.

0개의 댓글