7 분 소요

[Notice] [utilize data from public data in data.or.kr]

Practice Real Estate Data

DataFrame load

utilize data from public data in data.or.kr

import pandas as pd
df = pd.read_csv('https://bit.ly/ds-house-price')
df
지역명 규모구분 연도 분양가격(㎡)
0 서울 전체 2015 10 5841
1 서울 전용면적 60㎡이하 2015 10 5652
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721
4 서울 전용면적 102㎡초과 2015 10 5879
... ... ... ... ... ...
4500 제주 전체 2020 2 3955
4501 제주 전용면적 60㎡이하 2020 2 4039
4502 제주 전용면적 60㎡초과 85㎡이하 2020 2 3962
4503 제주 전용면적 85㎡초과 102㎡이하 2020 2 NaN
4504 제주 전용면적 102㎡초과 2020 2 3601

4505 rows × 5 columns

1. Column(rename)

df = df.rename(columns = {'분양가격(㎡)' : '분양가격'})
df
지역명 규모구분 연도 분양가격
0 서울 전체 2015 10 5841
1 서울 전용면적 60㎡이하 2015 10 5652
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721
4 서울 전용면적 102㎡초과 2015 10 5879
... ... ... ... ... ...
4500 제주 전체 2020 2 3955
4501 제주 전용면적 60㎡이하 2020 2 4039
4502 제주 전용면적 60㎡초과 85㎡이하 2020 2 3962
4503 제주 전용면적 85㎡초과 102㎡이하 2020 2 NaN
4504 제주 전용면적 102㎡초과 2020 2 3601

4505 rows × 5 columns

2. Data Overview

2-1. check values of NaN and Data Type

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4505 entries, 0 to 4504
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   지역명     4505 non-null   object
 1   규모구분    4505 non-null   object
 2   연도      4505 non-null   int64 
 3   월       4505 non-null   int64 
 4   분양가격    4210 non-null   object
dtypes: int64(2), object(3)
memory usage: 176.1+ KB
df.describe()
연도
count 4505.000000 4505.000000
mean 2017.452830 6.566038
std 1.311432 3.595519
min 2015.000000 1.000000
25% 2016.000000 3.000000
50% 2017.000000 7.000000
75% 2019.000000 10.000000
max 2020.000000 12.000000

3. Data Preprocessing

df.loc[df['분양가격'] == '  ']
지역명 규모구분 연도 분양가격
28 광주 전용면적 85㎡초과 102㎡이하 2015 10
29 광주 전용면적 102㎡초과 2015 10
34 대전 전용면적 102㎡초과 2015 10
81 제주 전용면적 60㎡이하 2015 10
113 광주 전용면적 85㎡초과 102㎡이하 2015 11
114 광주 전용면적 102㎡초과 2015 11
119 대전 전용면적 102㎡초과 2015 11
166 제주 전용면적 60㎡이하 2015 11
198 광주 전용면적 85㎡초과 102㎡이하 2015 12
199 광주 전용면적 102㎡초과 2015 12
204 대전 전용면적 102㎡초과 2015 12
251 제주 전용면적 60㎡이하 2015 12
283 광주 전용면적 85㎡초과 102㎡이하 2016 1
284 광주 전용면적 102㎡초과 2016 1
289 대전 전용면적 102㎡초과 2016 1
336 제주 전용면적 60㎡이하 2016 1
#remove blank
df['분양가격'] = df['분양가격'].str.strip()
df.loc[df['분양가격'] == '']
지역명 규모구분 연도 분양가격
28 광주 전용면적 85㎡초과 102㎡이하 2015 10
29 광주 전용면적 102㎡초과 2015 10
34 대전 전용면적 102㎡초과 2015 10
81 제주 전용면적 60㎡이하 2015 10
113 광주 전용면적 85㎡초과 102㎡이하 2015 11
114 광주 전용면적 102㎡초과 2015 11
119 대전 전용면적 102㎡초과 2015 11
166 제주 전용면적 60㎡이하 2015 11
198 광주 전용면적 85㎡초과 102㎡이하 2015 12
199 광주 전용면적 102㎡초과 2015 12
204 대전 전용면적 102㎡초과 2015 12
251 제주 전용면적 60㎡이하 2015 12
283 광주 전용면적 85㎡초과 102㎡이하 2016 1
284 광주 전용면적 102㎡초과 2016 1
289 대전 전용면적 102㎡초과 2016 1
336 제주 전용면적 60㎡이하 2016 1

Insert 0 for data with blank spaces

df.loc[df['분양가격'] == '', '분양가격'] = 0

Change NaN data by use fillna

df['분양가격'] = df['분양가격'].fillna(0)
df.loc[df['분양가격'] == '6,657']
지역명 규모구분 연도 분양가격
2125 서울 전체 2017 11 6,657

Remove comma

df['분양가격'] = df['분양가격'].str.replace(',', '')
df.iloc[2125]
지역명       서울
규모구분      전체
연도      2017
월         11
분양가격    6657
Name: 2125, dtype: object
df['분양가격'] = df['분양가격'].fillna(0)
df.loc[df['분양가격'] == '-']
지역명 규모구분 연도 분양가격
3683 광주 전용면적 85㎡초과 102㎡이하 2019 5 -
3686 대전 전용면적 60㎡이하 2019 5 -
3688 대전 전용면적 85㎡초과 102㎡이하 2019 5 -
3690 울산 전체 2019 5 -
3691 울산 전용면적 60㎡이하 2019 5 -
3692 울산 전용면적 60㎡초과 85㎡이하 2019 5 -
3693 울산 전용면적 85㎡초과 102㎡이하 2019 5 -
3694 울산 전용면적 102㎡초과 2019 5 -
3696 세종 전용면적 60㎡이하 2019 5 -
df['분양가격'] = df['분양가격'].str.replace('-', '')
df['분양가격'] = df['분양가격'].fillna(0)
df.loc[df['분양가격'] == '', ['분양가격']] = 0
df['분양가격'] = df['분양가격'].astype(int)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4505 entries, 0 to 4504
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   지역명     4505 non-null   object
 1   규모구분    4505 non-null   object
 2   연도      4505 non-null   int64 
 3   월       4505 non-null   int64 
 4   분양가격    4505 non-null   int64 
dtypes: int64(3), object(2)
memory usage: 176.1+ KB

Remove ‘unnecessary dedicated area’ in size classification column

df
지역명 규모구분 연도 분양가격
0 서울 전체 2015 10 5841
1 서울 전용면적 60㎡이하 2015 10 5652
2 서울 전용면적 60㎡초과 85㎡이하 2015 10 5882
3 서울 전용면적 85㎡초과 102㎡이하 2015 10 5721
4 서울 전용면적 102㎡초과 2015 10 5879
... ... ... ... ... ...
4500 제주 전체 2020 2 3955
4501 제주 전용면적 60㎡이하 2020 2 4039
4502 제주 전용면적 60㎡초과 85㎡이하 2020 2 3962
4503 제주 전용면적 85㎡초과 102㎡이하 2020 2 0
4504 제주 전용면적 102㎡초과 2020 2 3601

4505 rows × 5 columns

df['규모구분'] = df['규모구분'].str.replace('전용면적', '')
df['규모구분'].value_counts()
전체               901
 60㎡이하           901
 60㎡초과 85㎡이하     901
 85㎡초과 102㎡이하    901
 102㎡초과          901
Name: 규모구분, dtype: int64

Check the average sale price by area name

df.groupby('지역명')['분양가격'].mean()
지역명
강원    2339.807547
경기    4072.667925
경남    2761.275472
경북    2432.128302
광주    2450.728302
대구    3538.920755
대전    2479.135849
부산    3679.920755
서울    7225.762264
세종    2815.098113
울산    1826.101887
인천    3578.433962
전남    2270.177358
전북    2322.060377
제주    2979.407547
충남    2388.324528
충북    2316.871698
Name: 분양가격, dtype: float64
df.loc[df['분양가격'] < 100]
지역명 규모구분 연도 분양가격
28 광주 85㎡초과 102㎡이하 2015 10 0
29 광주 102㎡초과 2015 10 0
34 대전 102㎡초과 2015 10 0
81 제주 60㎡이하 2015 10 0
113 광주 85㎡초과 102㎡이하 2015 11 0
... ... ... ... ... ...
4461 세종 60㎡이하 2020 2 0
4488 전남 85㎡초과 102㎡이하 2020 2 0
4493 경북 85㎡초과 102㎡이하 2020 2 0
4499 경남 102㎡초과 2020 2 0
4503 제주 85㎡초과 102㎡이하 2020 2 0

320 rows × 5 columns

df.loc[df['분양가격'] < 100].index
Int64Index([  28,   29,   34,   81,  113,  114,  119,  166,  198,  199,
            ...
            4418, 4448, 4453, 4458, 4459, 4461, 4488, 4493, 4499, 4503],
           dtype='int64', length=320)
idx = df.loc[df['분양가격'] < 100].index
idx
Int64Index([  28,   29,   34,   81,  113,  114,  119,  166,  198,  199,
            ...
            4418, 4448, 4453, 4458, 4459, 4461, 4488, 4493, 4499, 4503],
           dtype='int64', length=320)
df
지역명 규모구분 연도 분양가격
0 서울 전체 2015 10 5841
1 서울 60㎡이하 2015 10 5652
2 서울 60㎡초과 85㎡이하 2015 10 5882
3 서울 85㎡초과 102㎡이하 2015 10 5721
4 서울 102㎡초과 2015 10 5879
... ... ... ... ... ...
4500 제주 전체 2020 2 3955
4501 제주 60㎡이하 2020 2 4039
4502 제주 60㎡초과 85㎡이하 2020 2 3962
4503 제주 85㎡초과 102㎡이하 2020 2 0
4504 제주 102㎡초과 2020 2 3601

4505 rows × 5 columns

df = df.drop(idx, axis = 0)
df.count()
지역명     4185
규모구분    4185
연도      4185
월       4185
분양가격    4185
dtype: int64
df.groupby('지역명')['분양가격'].mean()
지역명
강원    2412.642023
경기    4072.667925
경남    2814.376923
경북    2547.486166
광주    3049.028169
대구    3663.335938
대전    3128.433333
부산    3679.920755
서울    7225.762264
세종    2984.004000
울산    3043.503145
인천    3633.275862
전남    2304.969349
전북    2348.648855
제주    3432.795652
충남    2501.604743
충북    2316.871698
Name: 분양가격, dtype: float64
df.groupby('지역명')['분양가격'].count()
지역명
강원    257
경기    265
경남    260
경북    253
광주    213
대구    256
대전    210
부산    265
서울    265
세종    250
울산    159
인천    261
전남    261
전북    262
제주    230
충남    253
충북    265
Name: 분양가격, dtype: int64
df.groupby('지역명')['분양가격'].max()
지역명
강원     3906
경기     5670
경남     4303
경북     3457
광주     4881
대구     5158
대전     4877
부산     4623
서울    13835
세종     3931
울산     3594
인천     5188
전남     3053
전북     3052
제주     5462
충남     3201
충북     2855
Name: 분양가격, dtype: int64
df.groupby('지역명')['분양가격'].min()
지역명
강원    2012
경기    3079
경남    2200
경북    2106
광주    2251
대구    2503
대전    2425
부산    2930
서울    5061
세종    2572
울산    2422
인천    2890
전남    1906
전북    1900
제주    2225
충남    2099
충북    1868
Name: 분양가격, dtype: int64
df.groupby('연도')['분양가격'].mean()
연도
2015    2788.707819
2016    2934.250000
2017    3143.311795
2018    3326.951034
2019    3693.422149
2020    3853.960526
Name: 분양가격, dtype: float64

make pivot tale

pd.pivot_table(df, index = '연도', columns = '규모구분', values = '분양가격')
규모구분 102㎡초과 60㎡이하 60㎡초과 85㎡이하 85㎡초과 102㎡이하 전체
연도
2015 2980.977778 2712.583333 2694.490196 2884.395833 2694.862745
2016 3148.099476 2848.144279 2816.965686 3067.380435 2816.073529
2017 3427.649746 3112.538071 2981.950980 3204.075145 3008.279412
2018 3468.355932 3286.184783 3227.458128 3467.184211 3235.098522
2019 4039.854839 3486.910112 3538.545918 3933.538462 3515.974490
2020 4187.566667 3615.968750 3594.852941 4532.090909 3603.911765

Find out prices by year and size

df.groupby(['연도', '규모구분'])['분양가격'].mean()
연도    규모구분         
2015   102㎡초과          2980.977778
       60㎡이하           2712.583333
       60㎡초과 85㎡이하     2694.490196
       85㎡초과 102㎡이하    2884.395833
      전체               2694.862745
2016   102㎡초과          3148.099476
       60㎡이하           2848.144279
       60㎡초과 85㎡이하     2816.965686
       85㎡초과 102㎡이하    3067.380435
      전체               2816.073529
2017   102㎡초과          3427.649746
       60㎡이하           3112.538071
       60㎡초과 85㎡이하     2981.950980
       85㎡초과 102㎡이하    3204.075145
      전체               3008.279412
2018   102㎡초과          3468.355932
       60㎡이하           3286.184783
       60㎡초과 85㎡이하     3227.458128
       85㎡초과 102㎡이하    3467.184211
      전체               3235.098522
2019   102㎡초과          4039.854839
       60㎡이하           3486.910112
       60㎡초과 85㎡이하     3538.545918
       85㎡초과 102㎡이하    3933.538462
      전체               3515.974490
2020   102㎡초과          4187.566667
       60㎡이하           3615.968750
       60㎡초과 85㎡이하     3594.852941
       85㎡초과 102㎡이하    4532.090909
      전체               3603.911765
Name: 분양가격, dtype: float64
pd.DataFrame(df.groupby(['연도', '규모구분'])['분양가격'].mean())
분양가격
연도 규모구분
2015 102㎡초과 2980.977778
60㎡이하 2712.583333
60㎡초과 85㎡이하 2694.490196
85㎡초과 102㎡이하 2884.395833
전체 2694.862745
2016 102㎡초과 3148.099476
60㎡이하 2848.144279
60㎡초과 85㎡이하 2816.965686
85㎡초과 102㎡이하 3067.380435
전체 2816.073529
2017 102㎡초과 3427.649746
60㎡이하 3112.538071
60㎡초과 85㎡이하 2981.950980
85㎡초과 102㎡이하 3204.075145
전체 3008.279412
2018 102㎡초과 3468.355932
60㎡이하 3286.184783
60㎡초과 85㎡이하 3227.458128
85㎡초과 102㎡이하 3467.184211
전체 3235.098522
2019 102㎡초과 4039.854839
60㎡이하 3486.910112
60㎡초과 85㎡이하 3538.545918
85㎡초과 102㎡이하 3933.538462
전체 3515.974490
2020 102㎡초과 4187.566667
60㎡이하 3615.968750
60㎡초과 85㎡이하 3594.852941
85㎡초과 102㎡이하 4532.090909
전체 3603.911765

댓글남기기