Oh-Seung-Rok

안녕하세요. 정량적인 분석을 통해 제품-서비스를 개선하고 소비자들의 욕구를 먼저 파악하는 분석가가 되고 싶은 오승록입니다. 포트폴리오 [https://seungrok0317.com]

Project - 아파트 분양 가격 2013-2020 분석

19 Mar 2021 » Analyze_Project

아파트 가격 데이터

  • 정부의 대책에도 불구하고 주택에 대한 국민들의 불편함이 계속해서 나오고 있다.
  • 부동산 가격이 계속해서 오르고 있다는데 국민들이 가장 선호하는 주택 형태인 아파트에 그 변동이 적용되는지 알아보고자 한다.

데이터 셋

  • 공공데이터 포털 https://www.data.go.kr/data/15061057/fileData.do

전국 평균 분양가격(2013년 9월부터 2015년 8월까지)¶

주택도시보증공사 전국 신규 민간아파트 분양가격 동향 20201116

라이브러리 불러오기 & 폰트설정

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

plt.rc("font", family = "Malgun Gothic")
plt.rc("axes", unicode_minus=False)

from IPython.display import set_matplotlib_formats
set_matplotlib_formats("retina")

데이터 불러오기

df_2013 = pd.read_csv("./전국 평균 분양가격(2013년 9월부터 2015년 8월까지).csv", encoding="cp949")
df_2020 = pd.read_csv("./주택도시보증공사_전국 신규 민간아파트 분양가격 동향_20201116.csv", encoding="cp949")
df_2013.head()
지역2013년12월2014년1월2014년2월2014년3월2014년4월2014년5월2014년6월2014년7월2014년8월...2014년11월2014년12월2015년1월2015년2월2015년3월2015년4월2015년5월2015년6월2015년7월2015년8월
0서울181891792517925180161809819446188671874219274...20242202692067020670194151884218367183741815218443
1부산811181119078896594029501945394579411...9208920892049235927993279345951595599581
2대구808080808077810182678274836083608370...8439825383278416844184468568854285428795
3인천102041020410408104081000098441005899749973...10020100201001798769876993810551104431044310449
4광주609873267611734673467523765976127622...7752774877527756786179147877788180898231

5 rows × 22 columns

df_2020.head()
지역명규모구분연도분양가격(㎡)
0서울전체2015105841
1서울전용면적 60㎡이하2015105652
2서울전용면적 60㎡초과 85㎡이하2015105882
3서울전용면적 85㎡초과 102㎡이하2015105721
4서울전용면적 102㎡초과2015105879
df_2020.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5185 entries, 0 to 5184
Data columns (total 5 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
 0   지역명      5185 non-null   object
 1   규모구분     5185 non-null   object
 2   연도       5185 non-null   int64 
 3   월        5185 non-null   int64 
 4   분양가격(㎡)  4780 non-null   object
dtypes: int64(2), object(3)
memory usage: 202.7+ KB

필요한 columns 추가 및 결측치 확인

  • 2013 ~ 2015까지의 데이터는 가격만 제시되어있고 일반 분양가격(㎡)이 아닌 평당분양가격으로 제시되어 있다.
  • 데이터 취합을 위해 가격 기준을 맞추고 새로운 column을 생성한다.
df_2020.isnull().sum()
지역명          0
규모구분         0
연도           0
월            0
분양가격(㎡)    405
dtype: int64
  • 계산 가능하도록 문자열에서 숫자열로 변경
  • 분양가격에서 3.3을 곱한 평당분양가격 column을 추가해 비교가능하도록 설정한다.
df_2020["분양가격"] = pd.to_numeric(df_2020["분양가격(㎡)"], errors='coerce')

df_2020["평당분양가격"] = df_2020["분양가격"] * 3.3
df_2020.head()
지역명규모구분연도분양가격(㎡)분양가격평당분양가격
0서울전체20151058415841.019275.3
1서울전용면적 60㎡이하20151056525652.018651.6
2서울전용면적 60㎡초과 85㎡이하20151058825882.019410.6
3서울전용면적 85㎡초과 102㎡이하20151057215721.018879.3
4서울전용면적 102㎡초과20151058795879.019400.7
df_2020 = df_2020.drop(["분양가격(㎡)"], axis=1)
  • 2015이전 데이터는 이후 데이터와 형태가 다르다. 열데이터를 행데이터로 전환하여 데이터의 형태를 맞추어 준다.
  • 지역을 지역명으로, 기간을 연도와 월 형태로 나누어준다.
df_2013_melt = df_2013.melt(id_vars="지역",var_name="기간", value_name="평당분양가격")
df_2013_melt.columns =  ["지역명", "기간", "평당분양가격"] 
df_2013_melt.head()
지역명기간평당분양가격
0서울2013년12월18189
1부산2013년12월8111
2대구2013년12월8080
3인천2013년12월10204
4광주2013년12월6098
# 연,월 구분하는 함수 만들기

def split_year(date):
    year = date.split("년")[0]
    year = int(year) # 데이터가 int 타입이 되도록
    return year

def split_month(date):
    month = date.split("년")[-1].replace("월","")
    month = int(month)
    return month
df_2013_melt["연도"] = df_2013_melt["기간"].apply(split_year)
df_2013_melt["월"] = df_2013_melt["기간"].apply(split_month)
df_2013_melt.sample(5)
지역명기간평당분양가격연도
273부산2015년4월932720154
301전북2015년5월655620155
250전북2015년2월658320152
297세종2015년5월854620155
172대구2014년10월8403201410
# cols 사용할 column명들
cols = ['지역명', '연도', '월', '평당분양가격'] 

# 2015이전 데이터의 경우 규모구분이 따로 설정되어 있지 않아 비교를 위해 2015년이후는 '전체'에 해당하는 데이터만 추출
df_2020_compare = df_2020.loc[df_2020["규모구분"] == "전체",cols].copy()
df_2020_compare.head()
지역명연도평당분양가격
0서울20151019275.3
5인천20151010437.9
10경기20151010355.4
15부산20151010269.6
20대구2015108850.6
df_2013_compare = df_2013_melt[cols].copy()
df_2013_compare.head()
지역명연도평당분양가격
0서울20131218189
1부산2013128111
2대구2013128080
3인천20131210204
4광주2013126098

데이터 결합

  • concat을 이용하여 2015년 이전, 이후 데이터를 합쳐준다
df = pd.concat([df_2013_compare, df_2020_compare])
df
지역명연도평당분양가격
0서울20131218189.0
1부산2013128111.0
2대구2013128080.0
3인천20131210204.0
4광주2013126098.0
...............
5160전북2020108487.6
5165전남2020108969.4
5170경북20201010114.5
5175경남20201010253.1
5180제주20201015338.4

1394 rows × 4 columns

# 연도별 data의 개수는?
df["연도"].value_counts(sort=False)
2013     17
2014    204
2015    187
2016    204
2017    204
2018    204
2019    204
2020    170
Name: 연도, dtype: int64

데이터시각화

전국데이터

sns.barplot(data=df, x="연도", y="평당분양가격")
<matplotlib.axes._subplots.AxesSubplot at 0x2b496ad9b48>

output_26_1

# 히트맵을 사용하여 지역별, 연도별 가격을 확인한다.
table = pd.pivot_table(df, index="연도", columns="지역명", values="평당분양가격").round()

plt.figure(figsize=(12, 7))
sns.heatmap(table, cmap="Blues", annot=True, fmt=".0f")
<matplotlib.axes._subplots.AxesSubplot at 0x2b4971f8c88>

output_27_1

# pointplot으로 나타내기

plt.figure(figsize=(12,4))
sns.pointplot(data=df, x="연도", y="평당분양가격", hue="지역명")
plt.legend(bbox_to_anchor=(1.02, 1), loc=2, borderaxespad=0.)
<matplotlib.legend.Legend at 0x2b4973dedc8>

output_28_1

지역별데이터

plt.figure(figsize=(12,4))
sns.barplot(data=df, x="지역명", y="평당분양가격")
<matplotlib.axes._subplots.AxesSubplot at 0x2b496a57a48>

output_30_1

# violinplot으로 가시화를 더 쉽게하여 나타내본다.
plt.figure(figsize=(20, 4))
sns.violinplot(data=df, x="지역명", y="평당분양가격")
<matplotlib.axes._subplots.AxesSubplot at 0x2b49794de88>

output_31_1

# swarmplot으로 연도별 지역의 평균가격을 확인해본다.
plt.figure(figsize=(12, 4))
sns.swarmplot(data=df, x="지역명", y="평당분양가격", hue="연도")
plt.legend(bbox_to_anchor=(1.02, 1), loc=2, borderaxespad=0.)
<matplotlib.legend.Legend at 0x2b498bc7048>

output_32_1

  • 5.1 전국데이터 확인결과 해가 지나갈 수록 아파트 분양가격이 상승하고 있음을 확인할 수 있다.
  • 5.1 heatmap에서 확인할 수 있듯, 수도권(서울, 경기)의 집값이 다른 지역보다 높음을 알 수 있다.

  • 5.1 pointplot과 5.2지역별데이터의 경우 서울과 다른 지역의 분양가격 차이를 더욱 확연히 알 수 있다.
  • 5.2 swarmplot에서 확인할 수 있듯, 서울의 경우 2018년 이후의 데이터가 뚜렷하게 상승하고 있음을 알 수 있다.
  • 전국의 데이터 역시 2018년 이후상승하고 있음을 알 수 있다.(갈색, 연보라색, 회색)

2015년 이후 아파트 가격 데이터 자세하게 살펴보기

  • 2015년 이후 데이터는 이전과 다르게 교모구분 column을 통해 규모구분 별 데이터를 더욱 자세히 다룰 수 있다.
# 이런식으로 확인 가능.
df_2020.groupby(["지역명","규모구분"])["평당분양가격"].mean().round()
지역명  규모구분             
강원   전용면적 102㎡초과          9149.0
     전용면적 60㎡이하           7865.0
     전용면적 60㎡초과 85㎡이하     7752.0
     전용면적 85㎡초과 102㎡이하    8868.0
     전체                   7752.0
                           ...  
충북   전용면적 102㎡초과          8341.0
     전용면적 60㎡이하           7240.0
     전용면적 60㎡초과 85㎡이하     7365.0
     전용면적 85㎡초과 102㎡이하    8467.0
     전체                   7331.0
Name: 평당분양가격, Length: 85, dtype: float64
# 지역과 상관없는 규모구분별 가격
df_2020.groupby(["규모구분"])["평당분양가격"].mean()
규모구분
전용면적 102㎡초과          11882.902845
전용면적 60㎡이하           10700.634247
전용면적 60㎡초과 85㎡이하     10591.392729
전용면적 85㎡초과 102㎡이하    11620.084559
전체                   10594.894627
Name: 평당분양가격, dtype: float64
df_2020.groupby(["규모구분"])["평당분양가격"].mean().plot.bar(rot=30)
<matplotlib.axes._subplots.AxesSubplot at 0x2b498a2c148>

output_37_1

  • 60㎡이하의 아파트의 평균가격이 60㎡초과 85㎡이하의 아파트의 평균가격보다 높음을 확인할 수 있다.
  • 주어진 데이터로 유추하였을때 지역에 비해 수도권의 아파트 형태가 더욱 다양하고, 좁은 면적의 아파트 역시 많을것으로 가정한다면
  • 수도권의 적은 평수 아파트가 평균가격 인상에 영향을 미쳤음을 유추할 수 있다.