2023.01.29 - [부동산] - 파이썬을 이용한 투자용 주택 찾기 (1)
2023.02.05 - [부동산] - 파이썬을 이용한 투자용 주택 찾기 (2)
이전 글에서는 KB 시세를 이용해 투자용 주택을 찾아봤습니다. 보통 부동산 투자는 크게 두 가지로 나뉩니다. 하나는 저번 글에서 소개한 것처럼 전세와 매매의 차이가 적은 부동산을 싼 값에 매입해 매매가가 상승할 경우 차익으로 이득을 보는 시세차익형, 다른 하나는 오피스텔처럼 월세를 받는 수익형 부동산입니다. 이번 글에서는 실거래가를 이용해 수익형 부동산들을 찾아보겠습니다.
우선 실거래가 자료를 받아야겠죠? 4차 산업혁명 때문인지 정부도 데이터를 많이 공개해줘서 편합니다. 국토교통부 홈페이지(http://rtdown.molit.go.kr/)로 가시면
요런 화면이 있습니다. 오 전국의 전체 거래내역을 한 번에 준단 말이야? 생각했는데 전국 데이터는 1개월 단위로 조회가 됩니다. 시/도 단위로 조회하면 1년 단위로 조회가 가능하니 경기도의 오피스텔 매매 및 전월세 자료(20년~22년)를 긁어와서 해보겠습니다.
전월세 자료는 이렇게 생겼습니다. 그럼 매매 자료도 한번 보시죠.
보아하니 시군구, 번지, 본번, 부번, 단지명, 전용면적을 공유하는군요. 엑셀을 파이썬으로 일단 읽어옵니다.
trade_path = "./trade/"
rent_path = "./rent/"
rent_prefix = "오피스텔(전월세)_실거래가_"
years = ['2020','2021','2022']
trade_file_list = os.listdir(trade_path)
rent_file_list = os.listdir(rent_path)
df_merge_trade = []
df_merge_rent = []
for f in trade_file_list:
area = f.split('_')[2]
df = pd.read_excel(trade_path + f, skiprows = 15)
df = df.rename(columns = df.iloc[0])
df = df[1:]
y = f.split('_')[-1].split('.')[0]
print('year',y)
df_trade = pd.read_excel(trade_path + f, skiprows = 15, thousands = ',')
df_trade = df_trade.rename(columns = df_trade.iloc[0])
df_trade = df_trade[1:]
df_rent = pd.read_excel(rent_path + rent_prefix + area + '_' + y + '.xlsx' , skiprows = 15, thousands = ',')
df_rent = df_rent.rename(columns = df_rent.iloc[0])
df_rent = df_rent[1:]
df_trade_ID_cols = ['시군구','번지','단지명','전용면적(㎡)']
df_trade['ID'] = df_trade[df_trade_ID_cols].apply(lambda row: '_'.join(row.values.astype(str)), axis=1)
df_rent_ID_cols = ['시군구','번지','단지명','전용면적(㎡)']
df_rent['ID'] = df_rent[df_rent_ID_cols].apply(lambda row: '_'.join(row.values.astype(str)), axis=1)
df_rent_m = df_rent[df_rent['전월세구분'] == "월세"]
df_rent_m['월세'] = df_rent_m['보증금(만원)'].astype(float)*0.04/12 + df_rent_m['월세(만원)'].astype(float)
df_trade['거래금액(만원)'] = df_trade['거래금액(만원)'].astype(float)
df_merge_trade.append(df_trade)
df_merge_rent.append(df_rent_m)
read_excel 함수를 이용해 읽어옵니다. skiprows는 처음에 15줄은 의미없는 값이므로 건너뛰라는 의미입니다. ID 칼럼을 생성하는데 이건 이후에 두 dataframe의 join을 위해 공유하는 값을 미리 만들어 두는 겁니다. 시군구, 번지, 단지명, 전용면적이 같으면 같은 주택이니까요. 보증금도 월세로 전환해야 제대로된 수익율 계산이 되므로, 보증금 금리를 4%로 감안해서 12로 나누어서 월세에 더해주었습니다. 요샌 금리가 좀 올랐으니 다르게 계산해야 할지도 모르겠네요.
df_r_merged = pd.concat(df_merge_rent, axis = 0)
df_t_merged = pd.concat(df_merge_trade, axis = 0)
df_r = df_r_merged[['ID', '월세']].copy().groupby('ID')
df_t = df_t_merged[['ID', '거래금액(만원)']].copy().groupby('ID')
df_r_mean = df_r.mean()
df_r_mean['월세거래횟수'] = df_r.count()
df_t_mean = df_t.mean()
df_t_mean['매매거래횟수'] = df_t.count()
보통 append하면 list 처럼 그냥 바로 뒤에 붙을 것 같은데, dataframe은 concat을 안 해주면 결합이 안됩니다. 이렇게 만들어진 dataframe을 아까 만든 ID를 이용해서 그룹화하면 해당 평수에 대한 평균 매매가, 평균 월세, 거래횟수 등을 위의 코드처럼 구할 수 있습니다. 그럼 이제 join을 해보죠.
df_m = pd.merge(df_t_mean, df_r_mean, left_on = "ID", right_on = "ID", how = "inner")
df_m['수익률'] = df_m['월세'].astype(float)*12 / df_m['거래금액(만원)'] *100
df_m = df_m.sort_values(by = ['수익률'], axis = 0, ascending = False)
df_m.to_excel('output.xlsx')
아까 ID를 만들어뒀으니 전월세, 매매 기록이 모두 존재하는 오피스텔들은 평균 매매가와 전월세가를 이용해 수익률을 구할 수 있습니다. 사람이 봐야하니 이걸 엑셀에 쓰면 아래와 같이 나옵니다.
다음 글에서는 이제 이 자료 가지고 손품을 좀 팔아보겠습니다.