Task :
데이터 소개
1.
데이터 출처 : 서울 열린데이터 광장의 부동산 실거래가 정보에 제공된 데이터
2.
2018 ~ 2024년 7개년 데이터, 모든 테이블의 컬럼이 같아 CONCAT 함수를 사용하여 병합
필요한 컬럼 선정
•
본 프로젝트의 핵심 목표인 페르소나별 아파트 매물 추천을 위해 필요한 컬럼 선정
[전체 데이터 행렬 : 833,614 x 21]
column | non-null count | dtype |
접수연도 | 833,614 | int64 |
자치구코드 | 833,614 | int64 |
자치구명 | 833,613 | object |
법정동코드 | 833,614 | int64 |
법정동명 | 833,614 | object |
지번구분 | 776,043 | float64 |
지번구분명 | 776,043 | object |
본번 | 776,052 | object |
부번 | 776,052 | object |
건물명 | 776,065 | object |
계약일 | 833,614 | int64 |
물건금액(만원) | 833,614 | int64 |
건물면적(㎡) | 833,614 | float64 |
토지면적(㎡) | 668,824 | float64 |
층 | 776,119 | float64 |
권리구분 | 7,614 | object |
취소일 | 25,541 | float64 |
건축년도 | 830,198 | float64 |
건물용도 | 833,614 | object |
신고구분 | 225,344 | object |
신고한 개업공인중개사 시군구명 | 183,916 | object |
데이터 전처리
•
데이터 필터링
◦
건물 용도가 아파트 : 아파트 매물 추천 목적에 맞게 건물 용도를 아파트로만 필터링
◦
계약일 2017년 이후 : 가계약 고려
# 아파트로만 필터링
df_2018_2024 = df_2018_2024[df_2018_2024['건물용도'] == '아파트'].copy()
# 계약 연도가 2017년부터
df_2018_2024 = df_2018_2024[df_2018_2024['계약일'] >= 20170101].copy()
Python
복사
•
필터링 이후
[전체 데이터 행렬 : 393,345 x 12]
column | non-null count | dtype |
자치구명 | 393,344 | object |
법정동명 | 393,345 | object |
본번 | 393,298 | object |
부번 | 393,298 | object |
건물명 | 393,345 | object |
계약일 | 393,345 | int64 |
물건금액(만원) | 393,345 | int64 |
건물면적(㎡) | 393,345 | float64 |
층 | 393,345 | float64 |
취소일 | 8,598 | float64 |
건축년도 | 393,343 | float64 |
건물용도 | 393,345 | object |
•
결측치 확인
◦
취소일의 결측치는 실제 계약이 되었다고 판단할 수 있는 기준이 되기 때문에 제거하면 안됨
column | non-null count | dtype |
자치구명 | 393,344 | object |
법정동명 | 393,345 | object |
본번 | 393,298 | object |
부번 | 393,298 | object |
건물명 | 393,345 | object |
계약일 | 393,345 | int64 |
물건금액(만원) | 393,345 | int64 |
건물면적(㎡) | 393,345 | float64 |
층 | 393,345 | float64 |
취소일 | 8,598 | float64 |
건축년도 | 393,343 | float64 |
건물용도 | 393,345 | object |
•
결측치 처리
◦
자치구명, 본번, 건축년도 결측치 제거 : 부번은 본번 결측치 제거시 함께 사라짐
# 본번 결측치 제거
df_2018_2024 = df_2018_2024[df_2018_2024['본번'].notna()].copy()
# 건축년도 결측치 제거
df_2018_2024 = df_2018_2024[df_2018_2024['건축년도'].notna()].copy()
# 자치구명 결측치 제거
df_2018_2024 = df_2018_2024[df_2018_2024['자치구명'].notna()].copy()
Python
복사
•
결측치 처리 이후
[데이터 전체 행렬 개수 : 393,295 x 12]
column | non-null count | dtype |
자치구명 | 393,295 | object |
법정동명 | 393,295 | object |
본번 | 393,295 | object |
부번 | 393,295 | object |
건물명 | 393,295 | object |
계약일 | 393,295 | int64 |
물건금액(만원) | 393,295 | int64 |
건물면적(㎡) | 393,295 | float64 |
층 | 393,295 | float64 |
취소일 | 8,598 | float64 |
건축년도 | 393,295 | float64 |
건물용도 | 393,295 | object |
•
이상치 처리
◦
건축년도, 본번, 건물 면적(㎡), 물건금액(만원)이 0인 경우 제외
◦
취소일에 값이 있는 경우 제외
◦
아파트의 층수가 1층 미만인 경우 제외
# 건축년도 0 제외
df_2018_2024 = df_2018_2024[df_2018_2024['건축년도'] != 0].copy()
# 본번 0 제외
df_2018_2024['본번'] = df_2018_2024['본번'].astype(int)
df_2018_2024 = df_2018_2024[df_2018_2024['본번'] != 0].copy()
# 건물면적 0 제외
df_2018_2024 = df_2018_2024[df_2018_2024['건물면적(㎡)'] != 0.0].copy()
# 물건금액 0 제외
df_2018_2024 = df_2018_2024[df_2018_2024['물건금액(만원)'] != 0].copy()
# 취소일이 null인 경우
df_2018_2024 = df_2018_2024[df_2018_2024['취소일'].isnull()].copy()
# 아파트 층수가 1층 이상
df_2018_2024 = df_2018_2024[df_2018_2024['층'] > 0].copy()
Python
복사
•
이상치 처리 이후
[데이터 전체 행렬 개수 : 377,199 x 12]
column | non-null count | dtype |
자치구명 | 377,199 | object |
법정동명 | 377,199 | object |
본번 | 377,199 | int64 |
부번 | 377,199 | object |
건물명 | 377,199 | object |
계약일 | 377,199 | int64 |
물건금액(만원) | 377,199 | int64 |
건물면적(㎡) | 377,199 | float64 |
층 | 377,199 | float64 |
취소일 | 0 | float64 |
건축년도 | 377,199 | float64 |
건물용도 | 377,199 | object |
•
파생 변수 생성
◦
계약 연도 : 계약 연도별로 가격 확인을 위함(계약일에서 연도만 추출)
◦
평수(평) : 부동산 시장에서 통용되는 단위인 '평'으로 변환함과 동시에 평당가를 구하기 위함
◦
평당가(만원) : 서로 다른 규모의 매물들을 동일 선상에서 비교하여 가치를 평가하기 위함
◦
주소 : 시군구 본-부번의 형태의 데이터로 GIS 시각화를 위함
# 계약 연도 컬럼 추가
## 계약일 -> 계약 연도 컬럼 추가(int 타입)
df_2018_2024['계약 연도'] = df_2018_2024['계약일'] // 10000
## 계약일 컬럼 제거
df_2018_2024 = df_2018_2024.drop('계약일', axis=1)
# 평수 컬럼 추가(정수까지 반올림해서 int화)
df_2018_2024['평수(평)'] = round(df_2018_2024['건물면적(㎡)'] / 3.3)
df_2018_2024['평수(평)'] = df_2018_2024['평수(평)'].astype(int)
# 평당가 계산(정수까지 반올림해서 int화)
df_2018_2024['평당가(만원)'] = round(df_2018_2024['물건금액(만원)']/ df_2018_2024['평수(평)'])
df_2018_2024['평당가(만원)'] = df_2018_2024['평당가(만원)'].astype(int)
# 주소 컬럼 추가
## 서울특별시를 시명으로 추가
df_2018_2024['시명'] = "서울특별시"
## 부번 정수화
df_2018_2024['부번'] = df_2018_2024['부번'].astype(int)
## 부번 0 -> Null 처리
df_2018_2024['부번'] = df_2018_2024['부번'].replace(0, None)
## 주소 컬럼 생성
main_num = df_2018_2024['본번'].fillna(0).astype(float).astype(int).astype(str)
sub_num = df_2018_2024['부번'].fillna(0).astype(float).astype(int).astype(str)
hyphen_str = np.where((df_2018_2024['부번'].isna()) | (df_2018_2024['부번'] == 0), "", "-" + sub_num)
df_2018_2024['주소'] = (df_2018_2024['시명'].fillna('') + ' ' + df_2018_2024['자치구명'].fillna('') + ' ' + df_2018_2024['법정동명'].fillna('') + ' ' + main_num + hyphen_str)
Python
복사
•
파생변수 생성 이후
[데이터 전체 행렬 개수 : 377,199 x 16]
column | non-null count | dtype |
자치구명 | 377,199 | object |
법정동명 | 377,199 | object |
본번 | 377,199 | int64 |
부번 | 97,807 | object |
건물명 | 377,199 | object |
물건금액(만원) | 377,199 | int64 |
건물면적(㎡) | 377,199 | float64 |
층 | 377,199 | float64 |
취소일 | 0 | float64 |
건축년도 | 377,199 | float64 |
건물용도 | 377,199 | object |
계약 연도 | 377,199 | int64 |
평수(평) | 377,199 | int64 |
평당가
(만원) | 377,199 | int64 |
시명 | 377,199 | object |
주소 | 377,199 | object |
•
데이터 검토
◦
층, 건축년도 int화
◦
컬럼, 인덱스 정렬
# 층 int화
df_2018_2024['층'] = df_2018_2024['층'].astype(int)
# 건축년도 int화
df_2018_2024['건축년도'] = df_2018_2024['건축년도'].astype(int)
# 최종 정렬
df_2018_2024 = df_2018_2024[['계약 연도', '시명', '자치구명', '법정동명', '본번', '부번', '주소', '건물명', '물건금액(만원)', '건물면적(㎡)', '평단가(만원)', '평수(평)', '층', '취소일', '건축년도', '건물용도']]
# 인덱스 번호 정렬
df_2018_2024 = df_2018_2024.reset_index(drop=True)
Python
복사
•
최종 검토 이후
[데이터 전체 행렬 개수 : 377,199 x 16]
column | non-null count | dtype |
계약 연도 | 377,199 | int64 |
시명 | 377,199 | object |
자치구명 | 377,199 | object |
법정동명 | 377,199 | object |
본번 | 377,199 | int64 |
부번 | 377,199 | object |
주소 | 377,199 | object |
건물명 | 377,199 | object |
물건금액
(만원) | 377,199 | int64 |
건물면적(㎡) | 377,199 | float64 |
평당가
(만원) | 377,199 | int64 |
평수(평) | 377,199 | int64 |
층 | 377,199 | int64 |
취소일 | 0 | float64 |
건축년도 | 377,199 | int64 |
건물용도 | 377,199 | object |
•
외부 데이터를 활용해 컬럼 추가 및 전처리
◦
lat, lng : 위경도 좌표 ← 이 부분은 경원님에게 물어보시면 좋을 것 같아요
실행 및 진행 사항 정리
결과
