1. 이 연구의 LSTM 모델을 통한 분석 방법 정리
1.1. 연구 개요
- 목표: 지방세 시계열 데이터를 활용해, 특정 연도까지의 정보를 학습한 뒤 “2년 뒤 지방세 징수액”을 예측
- 데이터 구조: (지역 × 연도)의 피벗 테이블
- 모델: PyTorch 기반 LSTM
- 입출력: “(94년~N년) → (N+2년)” 형태의 시퀀스 예측
- 학습 시 동적 시퀀스 길이(packed sequence)를 지원
- Early Stopping, Validation Set 등을 통한 과적합 방지
1.2. 데이터 전처리
-
피벗테이블 생성
process_data()- 원본 DataFrame에서 특정 세목(필터)이나 지역을 골라 정리
- 행 = 지역, 열 = 연도 형태로 변환
- 양쪽 끝에서 전부 0인 연도(불필요 컬럼)는
trim_zero_columns()로 제거
-
노름 스케일링
scale_data()함수에서Normalizer(norm='l2')로 각 행(지역) 벡터를 길이(유클리디안 노름) 1이 되도록 정규화- 결과를 PyTorch 텐서로 변환하여 반환
1.3. 시퀀스 생성 (핵심 로직)
create_sequences(pivot, scaled_data, region, start_year, end_year)- 연도 루프를 돌며, (year ~ year+2) 데이터가 존재하면 시퀀스와 타깃을 생성
sequence = scaled_data[:, 0:i].T- 94년부터 (94 + i - 1)년까지의 구간(열 인덱스 0~i-1)을 추출
- 전치(
.T)하여 shape을 (시퀀스 길이 × 특성 차원)으로 맞춤
target = scaled_data[region_index, i+1]- 해당 지역(region)의 (i+1)번째 열 = “2년 뒤” 데이터를 타깃으로 설정
학습에 사용하는 입력 데이터
학습에 사용하는 입력 데이터는 전체 지역의 데이터입니다. 기초지자체 단위의 지방세라면, 모든 기초지자체(228개 전후)의 연도별 지방세 데이터를 X로 투입하여 특정 기초지자체(예: 서울관악구)의 2년 후 지방세가 다깃이 됩니다. 세목별 데이터의 경우 A 세목이 타깃이라면 (지역과 달리) 모든 세목이 아니라 A 세목의 데이터만 투입됩니다.
- 이렇게 “(94년~N년) → (N+2년)” 구간을 차례로 늘려가며, 모든 샘플을 생성
- 패딩(
pad_sequence) + 뒤에 2개 row(zeros) 추가- 시퀀스 길이가 제각각이므로 0으로 패딩
- 2년 뒤 예측 구조를 맞추기 위해 추가로 2행을 zero-padding
- 결과적으로, 여러 길이의 시퀀스가 (batch, max_seq_len, feature_dim) 형태로 정리되며, (target은 batch 길이만큼 스택)
1.4. LSTM 학습 및 예측
-
학습 단계:
train_model()- LSTM 모델(
LSTMModel)을 생성 - PackedSequence(
pack_padded_sequence)로 실제 시퀀스 길이를 인지시킴 - MSELoss를 사용, Adam 옵티마이저로 Backprop
- Validation Loss 모니터링 & Early Stopping
- LSTM 모델(
-
예측 단계:
predict_and_rescale()- 학습된 모델 로딩 → eval 모드
- 동일하게 PackedSequence로 입력
- 스케일링 복원(역스케일링) 작업
- 연구에서
np.linalg.norm(...)등을 활용해 각 지역 벡터의 노름을 다시 곱해줌 - 왜 노름을 이용하는가? scaling
- 연구에서
1.5. 정리
- 핵심 아이디어: “2년 뒤 예측”을 위해 94년부터 매년 시퀀스를 점진적으로 확대(94→96, 94~95→97, …)
- 장점: 모든 연도 구간을 활용해 다수의 (X, y) 샘플을 생성 → LSTM의 학습 데이터 증가
- 특징:
- 노름 스케일링으로 지역별 스케일 차이를 완화
- PackedSequence로 시퀀스 길이가 달라도 효과적으로 처리
- 결과: (region × 세목 × 연도)에 대한 세부 예측치를 얻어, 당초예산 및 실제 징수액과 비교 가능

