작성자	승인자

빈집 정비 통합 지원 시스템 구축 사업

데이터 전처리 설계서

단계 구분 : 구현

업무 구분 : 개발

문서 번호 : -

문서 버전 : V1.0

Copyright ⓒ 2025 All Rights Reserved.

사전 승인 없이 본 내용의 전부 또는 일부에 대한 복사, 배포, 사용을 금합니다.

		데이터 전처리 설계서

빈집 정비 통합 지원 시스템 구축 사업

개 정 이 력

Ver	작성일	변경내용	작성자	승인자
1.0	2025.11.04	최초 작성	권지윤	조용래

목  차

1. 공통 유틸리티 함수	3

1.1. 컬럼 정규화	3

1.2. 키 정규화 (normalize_key)	4

1.3. 그룹 연산 전 1차원 키 보장 (safe_one_dim_key)	5

1.4. 안전 병합 (safe_join)	5

1.5. 연도 컬럼 탐색 및 추세 계산	6

1.5.1. 연도 컬럼 탐색(scan_year_cols)	6

1.5.2. 추세 계산(add_trend)	6

1.5.3. 인구 대비 비율 계산 (add_per_capita)	6

1.6. 원본 컬럼 정리 (_clean_feature_columns)	7

2. 외부데이터 관련 함수	9

2.1. 인구 파생 변수 생성 (build_population_features)	9

2.2. 사회·복지 파생 변수 생성 (build_social_features)	10

2.3. 시설 관련 파생 변수 생성 (build_facility_features)	11

3. 내부데이터 관련 함수	12

3.1. 건축물 파생 변수 생성 (process_building)	12

3.2. 토지 파생 변수 생성 (process_land)	13

3.3. 전기 사용량 파생 변수 생성 (process_energy)	13

3.4. 내부 데이터 통합 집계 (aggregate_by_type)	14

공통 유틸리티 함수

컬럼 정규화

1.1.1. 목적

데이터를 병합하는 과정에서 key값을 ‘oa_cd’즉 집계구로 사용하는데, 이를 병합하는 과정에서 혹시 모를 중복화가 발생할 수 있음. 예를 들어, 같은 “집계구 코드”를 의미하더라도 oa_cd, oa_cd_x, OA_CD, oa_cd 등 다양한 형태로 존재함. 이러한 불일치는 데이터 병합 및 연산 과정에서 동일한 변수가 다르게 인식되거나 누락될 위험이 있음. 이에 따라 컬럼 정규화는 데이터의 컬럼명을 표준화하고 구조를 일관되게 유지하기 위한 사전 정비 단계임. 이를 통해 데이터 간 병합, 그룹화, 파생변수 계산 등 후속 처리가 안정적으로 수행되도록 함.

1.1.2. 주요 처리 단계

(1) 다단 컬럼(MultiIndex) 해제: 엑셀 피벗이나 데이터 추출 시 발생하는 다단 헤더 구조를 '전기_2020'과 같이 단일 문자열 형태로 변환함.

예: ('전기', '2020') → '전기_2020’

(2) 공백 및 특수문자 제거: 컬럼명 앞뒤의 공백, 줄바꿈, 불필요한 문자 등을 제거하여 일관된 명명 규칙을 적용함.

예: ‘oa_cd’ → ‘oa_cd’

(3) 중복 컬럼 제거: 동일한 이름을 가진 컬럼이 여러 번 존재할 경우 마지막 컬럼만 남기고 나머지를 삭제함. 이는 병합 과정에서 자동 생성되는 _x, _y 접미 컬럼으로 인한 중복 문제를 방지하기 위함임.

1.1.3. 효과

데이터의 구조적 일관성을 확보함.

컬럼명 불일치로 인한 병합 오류를 예방함.

불필요한 중복 컬럼 제거로 메모리 사용량을 절감함.

자동화된 파생변수 생성 및 분석 절차의 정확도를 향상시킴.

키 정규화

1.2.1. 목적

데이터셋 간 병합의 기준이 되는 대표 키(oa_cd)를 일관되게 유지하기 위함임. 각 데이터셋은 동일한 키를 보유하더라도 컬럼명 표기가 상이하거나, 공백 및 결측값이 포함될 수 있음. 따라서 키 정규화는 데이터 병합의 기준 식별자를 단일화하고 신뢰성 있는 매칭을 보장하기 위한 전처리 과정임.

1.2.2. 주요 처리 단계

(1) oa_cd, oa_cd_x, oa_cd_y 등 유사한 컬럼명을 자동 탐색함.

(2) 복수 컬럼이 존재할 경우, 비어 있지 않은 값을 기준으로 하나의 컬럼으로 통합.

(3) 모든 값을 문자열(str)로 변환하고 공백을 제거함.

(4) 불필요한 중복 컬럼은 삭제함.

1.2.3. 효과

데이터 병합 시 키 불일치로 인한 누락 방지.

각기 다른 출처의 데이터가 동일 기준으로 매칭 가능.

병합 과정에서 발생하는 메모리 낭비 및 키 충돌 문제 최소화.

그룹 연산 전 1차원 키 보장 (safe_one_dim_key)

1.3.1. 목적

일부 데이터셋에서는 키 컬럼(oa_cd)이 Series(1차원)가 아닌 DataFrame(2차원) 형태로 인식되는 경우가 있음. 이로 인해 그룹 연산(groupby) 수행 시 “Grouper for 'oa_cd' not 1-dimensional” 오류가 발생함. 본 함수는 이러한 문제를 사전에 방지하여 안정적인 그룹 연산이 가능하도록 함.

1.3.2. 주요 처리 단계

(1) oa_cd가 DataFrame 형태인 경우 첫 번째 열만 추출하여 1차원 Series로 변환함.

(2) 문자열 변환 및 공백 제거를 수행함.

1.3.3. 효과

그룹화 연산 시 오류 발생을 근본적으로 방지함.

데이터 구조의 일관성을 유지함.

1.4. 안전 병합 (safe_join)

1.4.1. 목적

서로 다른 데이터셋(예: 내부 데이터와 외부 데이터)을 병합할 때, 인덱스 불일치나 중복 키로 인해 발생하는 데이터 손실 및 메모리 과다 사용을 방지하기 위함임. 대용량 병합 시 인덱스 기반 join은 비효율적이므로, 명시적 키(oa_cd) 기반 병합을 적용함.

1.4.2. 주요 처리 단계

(1) 병합 전 두 데이터셋의 키(oa_cd)를 normalize_key()로 정규화함.

(2) pd.merge(on='oa_cd', how='left') 방식으로 병합 수행.

(3) 병합 후 생성된 중복 컬럼 제거 및 컬럼명 정리.

1.4.3. 효과

대용량 데이터 병합 시 메모리 사용 효율을 개선함.

인덱스 불일치로 인한 데이터 누락 방지.

병합 후 데이터 구조의 일관성을 보장함.

1.5. 연도 컬럼 탐색 및 추세 계산

1.5.1. 연도 컬럼 탐색 (scan_year_cols)

(1) 목적: 연도별 데이터를 자동으로 식별하고 파생변수 생성의 기준 정보를 확보하기 위함임.

(2) 처리방식: 컬럼명 내 (19|20)\d{2} 정규식을 탐색하여 연도 패턴을 추출함.

탐색된 결과를 {‘2018’: [‘2018_총인구’, …]} 형태의 딕셔너리로 반환함.

(3) 효과: 연도별 지표 계산 시 수작업 없이 자동 매핑 가능.

1.5.2. 추세 계산 (add_trend)

(1) 목적: 시점 간 변화율 또는 차이를 정량화하기 위함임.

(2) 처리방식: 첫 연도(c0)와 마지막 연도(c1) 값을 비교하여 증감률((c1 - c0) / c0) 또는 절대차(c1 - c0) 계산. 분모가 0인 경우 NA로 대체하여 오류 방지.

(3) 효과: 연도 간 추세 파악 및 장기 변화 요인 분석 가능.

1.5.3. 인구 대비 비율 계산 (add_per_capita)

(1) 목적: 단순 규모 비교가 아닌 인구수 대비 상대적 크기를 파악하기 위함임.

(2) 처리방식: 동일 연도 내 인구 컬럼(총인구)을 분모로 하여 1인당 또는 천 명당(per 1000) 지표 산출.

(3) 효과: 지역 간 규모 차이를 보정하여 객관적인 비교가 가능함.

1.6. 원본 컬럼 정리 (_clean_feature_columns)

1.6.1. 목적

파생변수 생성 이후에는 동일 정보가 중복 표현되거나, 분석에 불필요한 원본 컬럼이 잔존하는 경우가 많음. 예를 들어, 2018_총인구, 2019_총인구와 같은 연도별 원본 컬럼은 이미 추세(총인구증감률)나 비율 변수(고령인구비율, 외국인비율)로 대체될 수 있음. 이러한 컬럼을 그대로 유지하면 데이터 크기가 불필요하게 커지고, 모델 학습 과정에서 다중공선성 및 과적합 위험이 증가함. 이에 따라 본 함수는 파생 완료 후의 데이터셋에서 불필요한 컬럼을 체계적으로 제거하고 핵심 변수만을 남기는 역할을 수행함.

1.6.2. 주요 처리 단계

(1) 접두(prefix) 기준 필터링: 특정 주제 또는 원본 출처를 의미하는 접두어가 있는 컬럼을 식별하여 삭제함.

예: _in_age_, 외국인, 기초생활수급자수 등과 같이 원본 정보를 의미하는 컬럼은 이미 요약된 파생변수로 대체되므로 삭제 대상임.

(2) 연도 및 일련번호 패턴 제거: 정규식을 이용하여 컬럼명이 _001, _2020 등 숫자 3자리 이상으로 끝나는 컬럼을 탐지하여 제거함. 이는 연도별 원시 데이터 또는 내부 코드로만 사용되는 컬럼을 필터링하기 위함임.

(3) 핵심 식별자 유지: oa_cd(집계구 코드)는 데이터 병합과 그룹화의 기준이므로 항상 유지함. 그 외 파생된 주요 통계·비율·추세 변수만을 남김.

(4) 중복 컬럼 제거: 컬럼 정규화 과정 이후에도 일부 병합 단계에서 중복 컬럼이 생성될 수 있으므로, 중복된 이름을 가진 컬럼은 하나만 남기고 삭제함.

(5) 결측 및 형식 정리: 필터링 후 남은 컬럼의 결측값을 0 또는 NaN으로 일괄 정리하여 모델 입력 전 데이터 안정성을 확보함.

1.6.3. 효과

불필요한 원본 컬럼을 제거하여 데이터의 용량을 감소시키고 처리 속도를 향상시킴.

동일 정보가 중복 표현되는 문제를 제거하여 분석 결과의 일관성을 확보함.

1핵심 변수만 유지되어, 이후 클러스터링 및 모델 학습에서 변수 중요도 분석의 명확성을 높임.

1데이터 구조가 단순화되어 시각화·리포트 작성 등 후속 단계의 활용성이 개선됨.

전체 데이터 파이프라인에서 자동화된 변수 관리 체계를 구축함으로써, 수작업 컬럼 관리의 오류 가능성을 최소화함.

1.6.4. 요약

원본 컬럼 정리 단계는 데이터 파생 및 병합 이후의 후처리 안정화 절차로, 데이터셋을 분석 친화적인 구조로 재정렬함. 이 과정은 모델 학습 전 단계에서 데이터 품질을 보정하는 최종 단계로서,결과적으로 정제된 변수 집합(clean feature set) 을 제공함. 따라서 이후 단계에서 수행되는 외부·내부 통합, 클러스터링, 변수 중요도 분석이 일관된 구조 위에서 재현 가능하게 수행될 수 있음.

외부 데이터 관련 함수

인구 파생 변수 생성 (build_population_features)

2.1.1. 목적

집계구 단위의 인구 데이터는 연령별 세분화(_in_age_)된 형태로 존재함. 본 함수는 이를 이용하여 연령대별 인구 규모 및 비율, 그리고 연도 간 인구 변화 추세를 파생함. 이는 지역별 인구 구조 특성을 정량화하여, 고령화·청년층 유출, 인구 변화의 추세 등의 현상을 분석하기 위함임.

2.1.2. 주요 처리 단계

(1) 연도별 컬럼 자동 탐색: scan_year_cols() 함수를 이용하여 _in_age_ 접두가 포함된 컬럼을 연도별로 분류함.

(2) 연령대별 인구 합산: 유년인구(0–14세), 청년인구(15–34세), 중년인구(35–64세), 고령인구(65세 이상)를 구분하여 연도별 합계를 산출함. 각 연령대의 합계는 2018_유년인구, 2018_청년인구 등으로 생성함.

(3) 총인구 및 비율 계산: 각 연도의 총인구({연도}_총인구)를 계산하고,

{연도}_유년인구비율 = 유년인구 / 총인구 형식으로 비율 변수 생성함.

(4) 인구 추세(증감률) 계산: 시점 간 총인구 변화를 비율로 계산하여 총인구증감률 파생함.

(5) 불필요한 원본 컬럼 정리: _in_age_ 접두로 시작하는 원본 컬럼 제거함.

2.1.3. 효과

연령대별 인구 구조를 파악할 수 있음.

연도 간 인구 변화를 통해 인구 유출입·고령화 패턴을 분석할 수 있음.

데이터셋의 구조가 단순화되어 이후 모델링에서 변수 관리 효율이 향상됨.

사회·복지 파생 변수 생성 (build_social_features)

2.2.1. 목적

외국인 인구 및 기초생활수급자 데이터를 활용하여 사회적 취약성 및 복지 수요를 정량화함. 이는 지역 내 인구 구성의 다양성과 복지 지원 수준을 파악하기 위한 목적임.

2.2.2. 주요 처리 단계

(1) 외국인 데이터 처리: 외국인 키워드를 포함하는 연도별 컬럼을 자동 탐색함. /연도별 외국인 총합({연도}_외국인_총합) 계산함. / 총인구({연도}_총인구) 대비 외국인비율(외국인_총합 / 총인구) 산출함. / add_trend() 함수를 통해 외국인증감률 계산함.

(2) 기초생활수급자 데이터 처리: 기초생활수급자수 컬럼을 연도별로 탐색하여 합계 및 비율 산출함. / {연도}_기초수급자비율 = 기초수급자_총합 / 총인구 계산함. add_trend() 함수를 이용해 기초수급자증감률 산출함.

(3) 불필요한 원본 컬럼 정리: 외국인, 기초생활수급자수 접두로 시작하는 원본 컬럼 제거함.

2.2.3. 효과

외국인 및 복지 관련 변수의 비율화로 지역 간 비교 가능성이 확보됨.

복지 수요, 다문화 인구 분포 등 사회적 요인을 모델링에 반영할 수 있음.

원본 데이터의 복잡성을 낮춰 분석 효율성을 향상시킴.

시설 관련 파생 변수 생성 (build_facility_features)

2.3.1. 목적

의료, 문화, 돌봄, 체육, 휴식, 교육 등 주요 생활 인프라의 접근성을 정량화하고, 인구 대비 시설 분포 및 연도별 증감 추세를 산출함. 이는 지역별 인프라 불균형, 생활편의 수준 등을 정량적으로 평가하기 위함임.

2.3.2. 주요 처리 단계

(1) 연도별 컬럼 그룹화: _collect_yearly_single() 함수를 통해 문화시설_총합_, 의료시설_총합_ 등 접두별 컬럼을 연도별로 그룹화함.

(2) 합성 지표 생성: 교통시설→ 교통시설_충전소 + 교통시설_수소충전소 / 교육시설→ 교육시설_총합 + 학습시설_총합 / 녹지시설→ 휴식시설_공원 + 휴식시설_쉼터

이들을 각각 {연도}_교통시설총합, {연도}_교육시설총합, {연도}_녹지시설총합으로 생성함.

(3) 인구 대비 비율 계산: 동일 연도의 총인구를 분모로 하여 시설비율 변수(per 1000명 기준)를 계산함.

(4) 시설 증감률 계산: 연도 간 시설 변화율(시설증감률)을 add_trend() 함수를 통해 산출함.

(5) 불필요한 원본 컬럼 제거: 시설별 원시 연도 컬럼을 정리하여 요약 변수만 남김.

2.3.3. 효과

인구 대비 시설 공급 수준을 수치화하여 지역별 편의성 비교가 가능함.

시설 증가 또는 감소 추세를 파악하여 지역 인프라 변화 분석에 활용 가능함.

다차원적 시설 정보를 하나의 통합 구조로 단순화함.

3.1. 건축물 파생 변수 생성 (process_building)

3.1.1. 목적

건축물대장 데이터를 활용하여 건물의 물리적 상태, 구조적 특성, 노후도 등을 정량화함. 이는 건물 수준에서 빈집 발생 가능성 또는 주거환경 수준을 평가하기 위한 주요 기초 데이터임.

3.1.2. 주요 처리 단계

(1) 건물구조 분류: TRCT_CD_NM 기준으로 건물 구조를 “양호(철근콘크리트, 철골 등)”와 “불량(기타)”으로 구분함. 더미화 후 oa_cd 기준 평균 비율 산출함.

(2) 지붕형태 분류: GS_JUB 컬럼을 기준으로 “양호(정방형, 가정형 등)”와 “불량”으로 구분함. 더미화 후 평균 비율 산출함.

(3) 소유구분 분류: TBOOK_SOYUH 코드를 사유지, 국공유지, 단체로 매핑함. 더미화 후 평균 비율 산출함.

(4) 노후주택비율 계산: USEAPR_DATE(준공일자)로 건물 연령 계산. 30년 이상 또는 결측치를 노후로 간주하여 비율 산출함.

3.1.3. 효과

건물 구조적 특성을 정량화하여 주거환경의 물리적 수준을 평가할 수 있음.

노후주택 비율 산출로 지역 내 건물 노후화 정도를 비교할 수 있음.

파생변수를 통해 건물 단위 데이터를 집계구 단위로 일관성 있게 변환함.

3.2. 토지 파생 변수 생성 (process_land)

3.2.1. 목적

토지대장 정보를 활용하여 지목 및 면적 구성 비율을 분석함. 이는 토지 이용 특성을 반영하여 지역의 용도 구조를 정량적으로 표현하기 위함임.

3.2.2. 주요 처리 단계

(1) 지목 분류: JMOK_NM을 대지, 농지, 임야, 공업지, 공공, 기타로 매핑함. 더미화 후 oa_cd 기준 평균 비율 산출함.

(2) 용도지역(UCODE) 처리: 본 파이프라인에서는 한 셀에 다중 코드가 포함된 형태로 되어 있어 UCODE 컬럼 처리는 일시적으로 제외함. 추후 explode 및 매핑 방식으로 확장 예정임.

(3) 면적 비율 계산: TBOOK_AREA의 총합 대비 지목별 면적 비율(지목면적비율_*)을 계산함.

3.2.3. 효과

토지의 지목별 분포를 통해 지역의 개발 가능성 및 이용 구조를 분석할 수 있음.

면적 비율 기반의 변수로 각 토지유형의 상대적 비중을 객관적으로 평가함.

3.3. 전기사용량 파생 변수 생성 (process_energy)

3.3.1. 목적

전기사용량 데이터를 이용하여 지역의 에너지 소비 특성과 빈집 발생의 선행 신호(사용량 급감 등)를 정량적으로 파악함.

3.3.2. 주요 처리 단계

(1) 월별 평균 사용량 계산: U_ 접두의 컬럼들을 대상으로 평균 전력 사용량(mean_kwh) 산출함.

(2) 감소율(drop_ratio) 계산: 전월 대비 30% 이상 감소한 월의 비율을 산출함. (pct_change(axis=1).lt(-0.3)) 방식으로 계산함.

(3) 급감 지속비율(sudden_drop_ratio): 50% 이상 감소가 3개월 창에서 2회 이상 연속 발생한 비율을 계산함. 사용 패턴의 급격한 변화를 탐지하여 비정상적 소비를 반영함.

(4) 집계구 단위 평균화: oa_cd 기준으로 각 지표를 평균 처리하여 최종 결과 생성함.

3.3.3. 효과

에너지 사용 패턴을 통해 주거공간의 실질적 이용 여부를 간접 추정 가능함.

급감율, 지속감소율 등의 변수는 빈집 발생 예측 모델의 주요 설명 변수로 활용될 수 있음.

3.4. 내부데이터 통합 집계 (aggregate_by_type)

3.4.1. 목적

건축물, 토지, 전기사용량 등 서로 다른 성격의 내부 데이터를 일관된 집계 규칙으로 통합하기 위함임. 이는 다양한 단위(비율·합계·평균·최빈값)를 자동 분류하여 적절한 통계량으로 집계하는 단계임.

3.4.2. 주요 처리 단계

(1) 컬럼별 집계 방식 자동 분류: “비율”, “ratio”, “rate” 포함 시 평균(mean).

“AREA”, “AGE”, “HEIGHT”, “면적”, “높이” 포함 시 평균(mean).

“_수”, “_cnt”, “_총합”, “_합계”, “_sum” 포함 시 합계(sum).

일반 숫자형 컬럼은 평균(mean), 문자열형은 최빈값(mode).

(2) 그룹 연산 수행: oa_cd 기준으로 groupby 집계 수행함.

(3) 결과 정리: 중복 컬럼 제거 및 결측값 보정. 집계 결과를 표준 구조로 반환함.

3.4.3. 효과

변수명에 기반하여 자동으로 적절한 집계 방식을 선택하므로 수작업 설정이 불필요함.

다양한 내부 데이터 유형을 하나의 통합 규칙으로 처리 가능함.

데이터 일관성을 확보하여 외부 데이터 병합 및 클러스터링 입력 단계로의 연결성을 강화함.