[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
df = pd.read_csv('https://bit.ly/ds-house-price')
|
지역명 |
규모구분 |
연도 |
월 |
분양가격(㎡) |
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
<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
|
연도 |
월 |
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()
|
지역명 |
규모구분 |
연도 |
월 |
분양가격 |
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(',', '')
지역명 서울
규모구분 전체
연도 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)
<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
|
지역명 |
규모구분 |
연도 |
월 |
분양가격 |
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
|
지역명 |
규모구분 |
연도 |
월 |
분양가격 |
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)
|
지역명 |
규모구분 |
연도 |
월 |
분양가격 |
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)
지역명 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 |
댓글남기기