/////
Search
🏠

부동산

Tags
Archive
ETA
2025/11/19 → 2025/11/28
Main Task
Sub Task
담당자
메모
상태
In progress
생성 일시
2025/11/20 11:27
생성자
우선 순위
진행률 %
Task : 분석주제 정하기
생애주기별 실거주 아파트 매물 추천
Task : 분석 기획
기획은 러프하게 하셔도 됩니다. (기획한대로 데이터가 생기지 않았음)
데이터를 확인하면서(eda) → 살을 붙여나가는 형태로
반드시 우리팀만의 why(기준)이 있는 분석을 진행해주시기 바랍니다.
[11/21 메모]
2차 전처리 필요 ⇒ 분류 조건이 더 필요한 것 + 이상치 + 간소화
계약일이 2018년 이전인 경우 ⇒ 가계약을 고려해서 2017년부터로 하는 게 좋지 않을까 생각 > 2017년부터!
층수가 지하 2층 ~ 3층인 경우 ⇒ 해당하는 데이터가 많지 않음. 그 아파트의 지하에 거주 공간이 있는지 확인해서 넣을지 뺄지 결정: 91개 > 지상층부터!
매매한 평수가 3평, 4평 이런 친구들 ⇒ 평수 일부의 지분을 산건지 뭔지 모르겠음 > 일단 살림
매물 가격 이상치
컬럼도 좀 더 간소화 ⇒ 자치구코드 & 법정동코드 컬럼 제외하고 이외에 필요 없는 것들 생각해보고 제외
대주제: 고객 맞춤형 부동산 매물 추천, 생애주기별 매매전략
거주 = 평균값이 제일 낮은 지역 >>> 대출 규제 정책으로 주담대의 경우 6개월 이내 실거주 의무가 있음
투자 = 연평균 성장률이 높은 지역 (꾸준히 우상향)
매매 = 단기적으로 시세차익을 얻을 수 있는..
부동산이슈, 전세 사기, 대출 규제 등으로 인한 변화
계절별(월별) 계약 현황
필요한 데이터
학교, 학원, 병원, 복지시설, 마트, 공원
인구데이터: 연령별 등록 인구 (전입신고)
위/경도
5대 범죄 발생 현황 (20~24년)
구한 데이터 → 걸어갈 수 있는 정도 (500 ~ 1km) 차타고 가야하는 정도(3~5km)
대규모 점포 → 걸어가기도 애매, 차타고가기도 애매 → 2km
문화공간 3km v
병의원: 병원, 종합병원만 > 327개 (반경 5km)
초,중,고등학교 (반경 500m) v
공원 500m v
버스정류장 500m
지하철 → 구해야함 500m v
참고)
평수 = 건물면적 / 3.3
건축년도 = 얼마나 건물이 오래됐는지 확인 → null값, 0 존재 (7,344개) → 제외
본번이 null, 0인 것 제외 → 00C1처럼 문자 섞인 값 존재
취소일 있는 것 제외
부번 0인 것 > NULL
건물용도 = 아파트만
계약연도 = 계약일의 년도만 가져오기
“서울특별시” + 자치구명 + 법정동명 + 본번 + - + 부번 (ex: 서울특별시 은평구 녹번동 86-125) if 부번 is null (-)하이픈 안들어감
좌표가 없는 것 제외 = 본번 없는 경우, 주소가 잘못된 경우
페르소나 설정
3인 가구
세대원 수 : 3인(아이 나이 : 초등학생)
평수 : 30평 ~ 40평
종류 : 아파트(신/구축)
예산 : 10억 ~ 20억
목적 : 실거주
인프라
학교 : 초등학교, 중학교, 고등학교가 근방에 있어야 함
학원 : 학원이 몰려 있는 중심상가
병원 : 소아과병원
마트, 복지시설, 어린이 놀이시설
문화시설
지하철
신혼부부
세대원 수 : 2인 (반려견 있음)
평수 : 20평 ~ 25평
종류 : 아파트(구축 20년 이상)
예산 : 5억 ~ 6억
목적 : 실거주
인프라
대형마트
공원 (반려견놀이터)
문화시설
지하철/버스정류장
노년층
세대원 수 : 1 ~ 2명
평수 : 25평 ~ 30평
종류 : 아파트(구축)
예산 : 10억 미만
목적 : 실거주
인프라
대형병원
마트
공원
복지시설
지하철
전처리 진행 과정
[데이터 전체 행렬 개수 : 833,614 x 21]
1.
매물 추천을 위해 필요한 컬럼 선정 1) 자치구명 2) 법정동명 3) 본번 4) 부번 5) 건물명 6) 계약일 7) 물건금액(만원) 8) 건물면적(m²) 9) 층 10) 취소일 11) 건축년도 12) 건물용도
[데이터 전체 행렬 개수 : 833,614 x 12]
column
non-null count
dtype
자치구명
833,613
object
법정동명
833,614
object
본번
776,052
object
부번
776,052
object
건물명
776,065
object
계약일
833,614
int64
물건금액(만원)
833,614
int64
건물면적(㎡)
833,614
float64
776,119
float64
취소일
25,541
float64
건축년도
830,198
float64
건물용도
833,614
object
2.
데이터 정제 1) 건물용도 == 아파트 (1) ‘고객 맞춤형 아파트 매물 추천’ 주제에 맞게 용도가 아파트가 아닌 항목을 제외
# 아파트로 필터링 df_2018_2024 = df_2018_2024[df_2018_2024['건물용도'] == '아파트'].copy()
Python
복사
[데이터 전체 행렬 개수 : 393,389 x 12]
column
non-null count
dtype
자치구명
393,388
object
법정동명
393,389
object
본번
393,342
object
부번
393,342
object
건물명
393,389
object
계약일
393,389
int64
물건금액(만원)
393,389
int64
건물면적(㎡)
393,389
float64
393,389
float64
취소일
8,598
float64
건축년도
393,387
float64
건물용도
393,389
object
2) 계약일 ≥ 2017년 (1) 원본 데이터는 부동산 거래가 접수된 일자를 기준으로 작성이 되어 있기 때문에, 계약일이 더 이전인 경우가 존재 (2) 따라서, 현재 고객의 예산에 맞춘 최적의 추천을 위해서는 2018년 ~ 2024년 사이 에 계약이 이루어진 매물의 거래가로 매물별 가격대를 확인할 필요가 있으 므로, 2018년 이전 데이터는 제외 (3) 단, 2017년 데이터의 경우 가계약과 기준 연도와 인접한 계약이기 때문에 제외 하지 않고 유지
# 계약 연도 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
3.
결측치 처리 : NULL 값 제외 1) 본번 != NULL
# 본번 null 제외 필터링 df_2018_2024 = df_2018_2024[df_2018_2024['본번'].notna()].copy()
Python
복사
[데이터 전체 행렬 개수 : 393,298 x 12]
column
non-null count
dtype
자치구명
393,297
object
법정동명
393,298
object
본번
393,298
object
부번
393,298
object
건물명
393,298
object
계약일
393,298
int64
물건금액(만원)
393,298
int64
건물면적(㎡)
393,298
float64
393,298
float64
취소일
8,598
float64
건축년도
393,296
float64
건물용도
393,298
object
2) 건축 연도 != NULL
# 건축년도 null 제외 필터링 df_2018_2024 = df_2018_2024[df_2018_2024['건축년도'].notna()].copy()
Python
복사
[데이터 전체 행렬 개수 : 393,296 x 12]
column
non-null count
dtype
자치구명
393,295
object
법정동명
393,296
object
본번
393,296
object
부번
393,296
object
건물명
393,296
object
계약일
393,296
int64
물건금액(만원)
393,296
int64
건물면적(㎡)
393,296
float64
393,296
float64
취소일
8,598
float64
건축년도
393,296
float64
건물용도
393,296
object
3) 자치구명 != NULL
# 자치구명 null 제외 필터링 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
4.
이상치 처리 1) 건축년도 != 0
# 건축년도 0 제외 필터링 df_2018_2024 = df_2018_2024[df_2018_2024['건축년도'] != 0].copy()
Python
복사
[데이터 전체 행렬 개수 : 385,713 x 12]
column
non-null count
dtype
자치구명
385,713
object
법정동명
385,713
object
본번
385,713
object
부번
385,713
object
건물명
385,713
object
계약일
385,713
int64
물건금액(만원)
385,713
int64
건물면적(㎡)
385,713
float64
385,713
float64
취소일
8,328
float64
건축년도
385,713
float64
건물용도
385,713
object
2) 본번 != 0
# 본번 int화 df_2018_2024['본번'] = df_2018_2024['본번'].astype(int) # 본번 0 제외 필터링 df_2018_2024 = df_2018_2024[df_2018_2024['본번'] != 0].copy()
Python
복사
[데이터 전체 행렬 개수 : 385,614 x 12]
column
non-null count
dtype
자치구명
385,614
object
법정동명
385,614
object
본번
385,614
int64
부번
385,614
object
건물명
385,614
object
계약일
385,614
int64
물건금액(만원)
385,614
int64
건물면적(㎡)
385,614
float64
385,614
float64
취소일
8,324
float64
건축년도
385,614
float64
건물용도
385,614
object
3) 건물 면적, 물건 금액 != 0 - 변동 사항 없음
# 건물면적 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()
Python
복사
[데이터 전체 행렬 개수 : 385,614 x 12]
column
non-null count
dtype
자치구명
385,614
object
법정동명
385,614
object
본번
385,614
int64
부번
385,614
object
건물명
385,614
object
계약일
385,614
int64
물건금액(만원)
385,614
int64
건물면적(㎡)
385,614
float64
385,614
float64
취소일
8,324
float64
건축년도
385,614
float64
건물용도
385,614
object
4) 취소일 != NULL - 취소일이 있는 경우 실제 거래가 된 매물이 아니기 때문에 제외
# 취소일이 null로 필터링 df_2018_2024 = df_2018_2024[df_2018_2024['취소일'].isnull()].copy()
Python
복사
[데이터 전체 행렬 개수 : 377,290 x 12]
column
non-null count
dtype
자치구명
377,290
object
법정동명
377,290
object
본번
377,290
int64
부번
377,290
object
건물명
377,290
object
계약일
377,290
int64
물건금액(만원)
377,290
int64
건물면적(㎡)
377,290
float64
377,290
float64
취소일
0
float64
건축년도
377,290
float64
건물용도
377,290
object
5) 층 > 0 - 아파트에 따라 지하에 주거 공간이 존재 하는 경우도 있지만, 지하층 매물이 표준 적인 시장 시세를 왜곡할 수 있기 때문에, 지상층만 포함
# 아파트 층수가 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
5.
파생변수 생성 1) 계약 연도 컬럼 추가 - 계약 연도별로 가격을 확인하기 위함
# 계약일 -> 계약 연도 컬럼 추가(int 타입) df_2018_2024['계약 연도'] = df_2018_2024['계약일'] // 10000 # 계약일 컬럼 제거 df_2018_2024 = df_2018_2024.drop('계약일', axis=1)
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
float64
377,199
float64
취소일
0
float64
건축년도
377,199
float64
건물용도
377,199
object
계약 연도
377,199
int64
2) 평수 컬럼 추가(정수 반올림해서 int화) - 부동산 시장에서 통용되는 단위인 '평'으로 변환함과 동시에 평당가를 구하기 위함
# 평수 컬럼 추가(정수까지 반올림해서 int화) df_2018_2024['평수(평)'] = round(df_2018_2024['건물면적(㎡)'] / 3.3) df_2018_2024['평수(평)'] = df_2018_2024['평수(평)'].astype(int)
Python
복사
[데이터 전체 행렬 개수 : 377,199 x 13]
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
float64
377,199
float64
취소일
0
float64
건축년도
377,199
float64
건물용도
377,199
object
계약 연도
377,199
int64
평수(평)
377,199
int64
3) 평단가 컬럼 추가(정수 반올림해서 int화) - 서로 다른 규모의 매물들을 동일 선상에서 비교하여 가치를 평가하기 위함
# 평당가 계산(정수까지 반올림해서 int화) df_2018_2024['평당가(만원)'] = round(df_2018_2024['물건금액(만원)']/ df_2018_2024['평수(평)']) df_2018_2024['평당가(만원)'] = df_2018_2024['평당가(만원)'].astype(int)
Python
복사
[데이터 전체 행렬 개수 : 377,199 x 14]
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
float64
377,199
float64
취소일
0
float64
건축년도
377,199
float64
건물용도
377,199
object
계약 연도
377,199
int64
평수(평)
377,199
int64
평당가 (만원)
377,199
int64
4) GIS 시각화를 위한 주소 컬럼 추가
# 시명 : 서울특별시 추가 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) df_2018_2024
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
6.
데이터 최종 검토 1) 층, 건축년도 int화
# 층 int화 df_2018_2024['층'] = df_2018_2024['층'].astype(int) # 건축년도 int화 df_2018_2024['건축년도'] = df_2018_2024['건축년도'].astype(int)
Python
복사
[데이터 전체 행렬 개수 : 377,199 x 16]
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
float64
377,199
int64
취소일
0
float64
건축년도
377,199
int64
건물용도
377,199
object
계약 연도
377,199
int64
평수(평)
377,199
int64
평당가 (만원)
377,199
int64
시명
377,199
object
주소
377,199
object
2) 최종 정렬
# 최종 정렬 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
3) 위경도 컬럼 추가 및 위경도 != null
[데이터 전체 행렬 개수 : 376,591 x 18]
column
non-null count
dtype
계약 연도
376,591
int64
시명
376,591
object
자치구명
376,591
object
법정동명
376,591
object
본번
376,591
int64
부번
376,591
object
주소
376,591
object
건물명
376,591
object
물건금액 (만원)
376,591
int64
건물면적(㎡)
376,591
float64
평당가 (만원)
376,591
int64
평수(평)
376,591
int64
376,591
int64
취소일
0
float64
건축년도
376,591
int64
건물용도
376,591
object
lat
376,591
float64
lng
376,591
float64
인프라+매물 필터링
페르소나별
평수
가격
인프라
연식 = 2025 - 건축년도
결과: 평단가 낮음 + 평수가 큼 + 최신 계약연도
신혼부부 (전체 거래의 평균 평단가: 2,372 만원) - records: 200
3인가구
노년가구
대시보드
자치구별 단위 인구수 현황
자치구별 연평균 5대 범죄 발생 건수(20~24년) - 5대 범죄: 살인, 강도, 강간/강제추행, 절도, 폭력
고객의 성향과 니즈에 따라 건물 용도, 주변 인프라 등을 분석하여 지역, 매물 등을 추천해준다.
고객 성향과 니즈 분류 > 건물 용도에 따른 연평균 성장률, 주변 인프라 분석 > 지역, 매물 추천
1.
1인가구 역추적: 외부 데이터에서 1인 가구 분포도를 보고, 1인가구 밀집 지역 현황, 가격 확인 (왜 높은지, 왜 낮은지) 인프라 등을 알아보려고 합니다. (필요한 데이터 셋 : 구별 1인 가구현황, 구별 가격(제곱미터 당 가격, 평당가격), 인프라(버스정류장, 병원, 체육시설 etc) (걱정되는 점 : 분석량의 한계)
2.
생애주기별 매물추천: 청년, 중/장년, 노년층으로 나누어 페르소나를 정하여 매물을 추천하고자 합니다. (진행 방향 :청년_매매, 청년_투자, 청년_거주, 중/장년_매매, 중/장년_투자, 중장년_거주, 노인_매매, 노인_투자, 노인_거주) (걱정되는 점 : 시각화에 대한 우려)
3.
나이대별 부동산 거래 트랜드 - 외부 데이터에서 나이대별 탑 3의 분포를 보고, 지역 현황에서의 부동산 거래 트랜드 확인 (데이터셋 : 1번과 유사 (걱정되는 점 : 실제적으로 나이대별로 거래 트랜드의 차이가 유의미 하지않은 경우)
데이터에서 산/공백/블럭 제외, 취소일 있는 데이터 제외
블럭 > 재개발/신축
산 > 건물은 존재(구축)
공백 > 단독주택/ 아파트(힐스테이트 서초 젠트리스)인 경우도 있음
→ 건물 용도로 구분해서 보는 게 좋을 것 같음
건물 용도에 따른 평단가 계산
아파트, 연립다세대(빌라), 오피스텔 : 물건 가격 / (건물 면적 / 3.3)
단독다가구(단독 주택) : 물건 가격 / (토지 면적 / 3.3)
공시지가와 실거래액이 얼마나 차이가 적으면 주거, 차이가 크면 매매
CAGR (연평균성장률) 높은 곳: 투자
청년층의 정의로는 서울시 청년 기본조례 및 청년고용촉진특별법 시행령에 따르면 15~29세 이하를 청년층으로 정의하고 있다. 국토부는 청년층을 위한 공공임대주택 공급을 할 때에는 만 19세~39세 이하로 폭넓게 적용하는 것을 알 수 있으며 청년기본법에 따르면 19세 이상 34세 이하로 정의하고 있다. 노년층의 정의로는 국민연금, 기초연금 수급연령이 만 65세 이상으로 복지혜택 기준으로 만 65세 이상을 노인으로 노인복지법에 따르면 ‘65세 이상 경로우대 한다는 조항’으로 보아 65세 이상을 노년층으로 보고 있음을 알 수 있다.
Task : 역할 분담
1.
페르소나 설정 : ALL - DONE
2.
데이터 전처리 : 송기남, 허건 - DONE
3.
데이터 수집 : 서지연, 김경원, 정예지, 송기남
4.
데이터 분석 : ALL
5.
시각화: 서지연, 정예지
6.
지도시각화 : 김경원
8.
코드정리 :
9.
대시보드 : 김경원
10.
영상 발표: 정예지
11.
발표회: 서지연
실행 및 진행 사항 정리
정예지
서지연
송기남
허건
김경원