1. 이 연구의 LSTM 모델을 통한 분석 방법 정리

1.1. 연구 개요

  • 목표: 지방세 시계열 데이터를 활용해, 특정 연도까지의 정보를 학습한 뒤 “2년 뒤 지방세 징수액”을 예측
  • 데이터 구조: (지역 × 연도)의 피벗 테이블
  • 모델: PyTorch 기반 LSTM
    • 입출력: “(94년~N년) → (N+2년)” 형태의 시퀀스 예측
    • 학습 시 동적 시퀀스 길이(packed sequence)를 지원
    • Early Stopping, Validation Set 등을 통한 과적합 방지

1.2. 데이터 전처리

  1. 피벗테이블 생성

    • process_data()
      • 원본 DataFrame에서 특정 세목(필터)이나 지역을 골라 정리
      • 행 = 지역, 열 = 연도 형태로 변환
      • 양쪽 끝에서 전부 0인 연도(불필요 컬럼)는 trim_zero_columns()로 제거
  2. 노름 스케일링

    • scale_data() 함수에서 Normalizer(norm='l2')로 각 행(지역) 벡터를 길이(유클리디안 노름) 1이 되도록 정규화
    • 결과를 PyTorch 텐서로 변환하여 반환

1.3. 시퀀스 생성 (핵심 로직)

  • create_sequences(pivot, scaled_data, region, start_year, end_year)
    1. 연도 루프를 돌며, (year ~ year+2) 데이터가 존재하면 시퀀스와 타깃을 생성
    2. sequence = scaled_data[:, 0:i].T
      • 94년부터 (94 + i - 1)년까지의 구간(열 인덱스 0~i-1)을 추출
      • 전치(.T)하여 shape을 (시퀀스 길이 × 특성 차원)으로 맞춤
    3. target = scaled_data[region_index, i+1]
      • 해당 지역(region)의 (i+1)번째 열 = “2년 뒤” 데이터를 타깃으로 설정

학습에 사용하는 입력 데이터

학습에 사용하는 입력 데이터는 전체 지역의 데이터입니다. 기초지자체 단위의 지방세라면, 모든 기초지자체(228개 전후)의 연도별 지방세 데이터를 X로 투입하여 특정 기초지자체(예: 서울관악구)의 2년 후 지방세가 다깃이 됩니다. 세목별 데이터의 경우 A 세목이 타깃이라면 (지역과 달리) 모든 세목이 아니라 A 세목의 데이터만 투입됩니다.

  1. 이렇게 “(94년~N년) → (N+2년)” 구간을 차례로 늘려가며, 모든 샘플을 생성
  2. 패딩(pad_sequence) + 뒤에 2개 row(zeros) 추가
    • 시퀀스 길이가 제각각이므로 0으로 패딩
    • 2년 뒤 예측 구조를 맞추기 위해 추가로 2행을 zero-padding
  • 결과적으로, 여러 길이의 시퀀스가 (batch, max_seq_len, feature_dim) 형태로 정리되며, (target은 batch 길이만큼 스택)

1.4. LSTM 학습 및 예측

  1. 학습 단계: train_model()

    • LSTM 모델(LSTMModel)을 생성
    • PackedSequence(pack_padded_sequence)로 실제 시퀀스 길이를 인지시킴
    • MSELoss를 사용, Adam 옵티마이저로 Backprop
    • Validation Loss 모니터링 & Early Stopping
  2. 예측 단계: predict_and_rescale()

    • 학습된 모델 로딩 → eval 모드
    • 동일하게 PackedSequence로 입력
    • 스케일링 복원(역스케일링) 작업
      • 연구에서 np.linalg.norm(...) 등을 활용해 각 지역 벡터의 노름을 다시 곱해줌
      • 왜 노름을 이용하는가? scaling

1.5. 정리

  • 핵심 아이디어: “2년 뒤 예측”을 위해 94년부터 매년 시퀀스를 점진적으로 확대(94→96, 94~95→97, …)
  • 장점: 모든 연도 구간을 활용해 다수의 (X, y) 샘플을 생성 → LSTM의 학습 데이터 증가
  • 특징:
    • 노름 스케일링으로 지역별 스케일 차이를 완화
    • PackedSequence로 시퀀스 길이가 달라도 효과적으로 처리
  • 결과: (region × 세목 × 연도)에 대한 세부 예측치를 얻어, 당초예산 및 실제 징수액과 비교 가능