아파트분양가격동향


전국 신규 민간 아파트 분양가격 동향

다운로드 위치 : https://www.data.go.kr/dataset/3035522/fileData.do

전국 평균 분양가격(2013년 9월부터 2015년 8월까지) 주택도시보증공사_전국 평균 분양가격(2019년 12월) 두 개의 다른 데이터를 합치기

데이터 불러오기



import pandas as pd
df_last = pd.read_csv("data/주택도시보증공사_전국 평균 분양가격(2019년 12월).csv", encoding="cp949", engine="python")
#encoding으로 한글 깨지는걸 방지 
# engine은 파이썬 
df_last.shape
 
(4335, 5)
df_last.head()
지역명규모구분연도분양가격(㎡)
0서울전체2015105841
1서울전용면적 60㎡이하2015105652
2서울전용면적 60㎡초과 85㎡이하2015105882
3서울전용면적 85㎡초과 102㎡이하2015105721
4서울전용면적 102㎡초과2015105879
df_last.tail()
# NaN는 결측치
지역명규모구분연도분양가격(㎡)
4330제주전체2019123882
4331제주전용면적 60㎡이하201912NaN
4332제주전용면적 60㎡초과 85㎡이하2019123898
4333제주전용면적 85㎡초과 102㎡이하201912NaN
4334제주전용면적 102㎡초과2019123601
#%ls data
df_first = pd.read_csv("data/전국 평균 분양가격(2013년 9월부터 2015년 8월까지).csv", 
                       encoding="cp949")
df_first.shape
(17, 22)
df_first.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_first.tail()
지역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월
12전북628262815946596662776306635163196436...6583658365836583654265516556660167506580
13전남567856785678569657365656560957805685...5768578457845833582559406050624362866289
14경북616861686234631764126409655465566563...6881698969926953699770066966688770357037
15경남647364856502661065996610661566136606...7125733275927588766876837717771577237665
16제주767479007900790079007900791479147914...7724773977397739782672857285734373437343

5 rows × 22 columns

데이터 요약하기

df_last.info()
# 분양가격은 결측치도 있고 object형으로 되어있다.
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4335 entries, 0 to 4334
Data columns (total 5 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
 0   지역명      4335 non-null   object
 1   규모구분     4335 non-null   object
 2   연도       4335 non-null   int64 
 3   월        4335 non-null   int64 
 4   분양가격(㎡)  4058 non-null   object
dtypes: int64(2), object(3)
memory usage: 169.5+ KB

결측치 보기

df_last.isnull()
# null값은 true 
지역명규모구분연도분양가격(㎡)
0FalseFalseFalseFalseFalse
1FalseFalseFalseFalseFalse
2FalseFalseFalseFalseFalse
3FalseFalseFalseFalseFalse
4FalseFalseFalseFalseFalse
..................
4330FalseFalseFalseFalseFalse
4331FalseFalseFalseFalseTrue
4332FalseFalseFalseFalseFalse
4333FalseFalseFalseFalseTrue
4334FalseFalseFalseFalseFalse

4335 rows × 5 columns

# 결측치 수 구하기
df_last.isnull().sum()
지역명          0
규모구분         0
연도           0
월            0
분양가격(㎡)    277
dtype: int64

데이터 타입 변경

# object인 분양가격을 float형태로 바꿔주기(새로운 분양가격 칼럼을 만들어줌)
df_last["분양가격"] = pd.to_numeric(df_last["분양가격(㎡)"], errors='coerce')
df_last.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4335 entries, 0 to 4334
Data columns (total 6 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   지역명      4335 non-null   object 
 1   규모구분     4335 non-null   object 
 2   연도       4335 non-null   int64  
 3   월        4335 non-null   int64  
 4   분양가격(㎡)  4058 non-null   object 
 5   분양가격     3957 non-null   float64
dtypes: float64(1), int64(2), object(3)
memory usage: 203.3+ KB

두 파일 단위를 맞춰주기

# df_last 분양가격에 3.3을 곱해서 평당분양가격을 맞추어주기
df_last["평당분양가격"] = df_last["분양가격"] * 3.3
df_last.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_last.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4335 entries, 0 to 4334
Data columns (total 7 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   지역명      4335 non-null   object 
 1   규모구분     4335 non-null   object 
 2   연도       4335 non-null   int64  
 3   월        4335 non-null   int64  
 4   분양가격(㎡)  4058 non-null   object 
 5   분양가격     3957 non-null   float64
 6   평당분양가격   3957 non-null   float64
dtypes: float64(2), int64(2), object(3)
memory usage: 237.2+ KB
# object형 describe
df_last["분양가격(㎡)"].describe()
#df_last.shape
count     4058
unique    1753
top       2221
freq        17
Name: 분양가격(㎡), dtype: object
# float형 describe
df_last["분양가격"].describe()
count     3957.000000
mean      3238.128633
std       1264.309933
min       1868.000000
25%       2441.000000
50%       2874.000000
75%       3561.000000
max      12728.000000
Name: 분양가격, dtype: float64

규모구분칼럼을 전용면적 칼럼명 변경

df_last["규모구분"].unique()
array(['전체', '전용면적 60㎡이하', '전용면적 60㎡초과 85㎡이하', '전용면적 85㎡초과 102㎡이하',
       '전용면적 102㎡초과'], dtype=object)
df_last["전용면적"] = df_last["규모구분"].str.replace("전용면적", "") 
# 앞에 전용면적 text가 사라진다. > 칼럼명 전용면적을 만든다.
df_last["전용면적"] = df_last["전용면적"].str.replace("초과","~")
# 초과text가 사라지고 ~을 넣어준다.
df_last["전용면적"] = df_last["전용면적"].str.replace("이하","")
#이하 text가 사라진다.
df_last["전용면적"].str.replace(" ", "").str.strip() 
# " "을 ""으로 바꾸고 strip을 써서 앞 뒤 공백을 없애기
0             전체
1            60㎡
2        60㎡~85㎡
3       85㎡~102㎡
4          102㎡~
          ...   
4330          전체
4331         60㎡
4332     60㎡~85㎡
4333    85㎡~102㎡
4334       102㎡~
Name: 전용면적, Length: 4335, dtype: object
df_last
지역명규모구분연도분양가격(㎡)분양가격평당분양가격전용면적
0서울전체20151058415841.019275.3전체
1서울전용면적 60㎡이하20151056525652.018651.660㎡
2서울전용면적 60㎡초과 85㎡이하20151058825882.019410.660㎡~ 85㎡
3서울전용면적 85㎡초과 102㎡이하20151057215721.018879.385㎡~ 102㎡
4서울전용면적 102㎡초과20151058795879.019400.7102㎡~
...........................
4330제주전체20191238823882.012810.6전체
4331제주전용면적 60㎡이하201912NaNNaNNaN60㎡
4332제주전용면적 60㎡초과 85㎡이하20191238983898.012863.460㎡~ 85㎡
4333제주전용면적 85㎡초과 102㎡이하201912NaNNaNNaN85㎡~ 102㎡
4334제주전용면적 102㎡초과20191236013601.011883.3102㎡~

4335 rows × 8 columns

# 규모규분, 분양가격(㎡) 칼럼을 없애기 drop이용 
df_last = df_last.drop(["규모구분","분양가격(㎡)"], axis=1)
#axis=1로 해야지 칼럼이 제거된다.(중요) 기본값이 0이다.
df_last
지역명연도분양가격평당분양가격전용면적
0서울2015105841.019275.3전체
1서울2015105652.018651.660㎡
2서울2015105882.019410.660㎡~ 85㎡
3서울2015105721.018879.385㎡~ 102㎡
4서울2015105879.019400.7102㎡~
.....................
4330제주2019123882.012810.6전체
4331제주201912NaNNaN60㎡
4332제주2019123898.012863.460㎡~ 85㎡
4333제주201912NaNNaN85㎡~ 102㎡
4334제주2019123601.011883.3102㎡~

4335 rows × 6 columns

groupby로 데이터전처리

# 지역명이 같은거끼리 묶고, 평당분양가격의 평균값을 계산한다.
df_last.groupby(["지역명"])["평당분양가격"].mean()
지역명
강원     7890.750000
경기    13356.895200
경남     9268.778138
경북     8376.536515
광주     9951.535821
대구    11980.895455
대전    10253.333333
부산    12087.121200
서울    23599.976400
세종     9796.516456
울산    10014.902013
인천    11915.320732
전남     7565.316532
전북     7724.235484
제주    11241.276712
충남     8233.651883
충북     7634.655600
Name: 평당분양가격, dtype: float64
# 전용면적 묶고, 평당분양가격의 평균값을 계산한다.
df_last.groupby(["전용면적"])["평당분양가격"].mean()
전용면적
 102㎡~        11517.705634
 60㎡          10375.137421
 60㎡~ 85㎡     10271.040071
 85㎡~ 102㎡    11097.599573
전체            10276.086207
Name: 평당분양가격, dtype: float64
df_last.groupby(["지역명","전용면적"])["평당분양가격"].mean()
# 처음에 지역명으로 묶고, 두번째로 전용면적으로 묶는다.
지역명  전용면적      
강원    102㎡~        8311.380000
      60㎡          7567.098000
      60㎡~ 85㎡     7485.588000
      85㎡~ 102㎡    8749.557143
     전체            7477.536000
                      ...     
충북    102㎡~        8195.352000
      60㎡          7103.118000
      60㎡~ 85㎡     7264.488000
      85㎡~ 102㎡    8391.306000
     전체            7219.014000
Name: 평당분양가격, Length: 85, dtype: float64
df_last.groupby(["지역명","전용면적"])["평당분양가격"].mean().unstack()
# unstack을 이용하면 두번째로 있는 전용면적이 칼럼값으로 간다.
전용면적102㎡~60㎡60㎡~ 85㎡85㎡~ 102㎡전체
지역명
강원8311.3800007567.0980007485.5880008749.5571437477.536000
경기14771.79000013251.74400012523.56600013677.77400012559.602000
경남10358.3632658689.1750008618.67600010017.6120008658.672000
경북9157.3020007883.1720008061.3720008773.8146348078.532000
광주11041.5324329430.6666679910.6920009296.1000009903.630000
대구13087.33800011992.06800011778.69000011140.64285711771.298000
대전14876.8714299176.4750009711.3720009037.4307699786.018000
부산13208.25000011353.78200011864.82000012072.58800011936.166000
서울23446.03800023212.79400022786.83000025943.87400022610.346000
세종10106.9760009323.9270279775.4580009847.9260009805.422000
울산9974.4480009202.10689710502.5317078861.00769210492.712195
인천14362.03043511241.31800011384.40600011527.56000011257.026000
전남8168.4900007210.1700007269.2400007908.8625007283.562000
전북8193.5700007609.9320007271.3520008275.7812507292.604000
제주10522.78723414022.22105310621.31400010709.08235310784.994000
충남8689.1693887911.1560007818.9540009120.0450007815.324000
충북8195.3520007103.1180007264.4880008391.3060007219.014000
df_last.groupby(["지역명","전용면적"])["평당분양가격"].mean().unstack().round()
# round를 이용하면 소수점 한자리로 바꿀 수 있다.
전용면적102㎡~60㎡60㎡~ 85㎡85㎡~ 102㎡전체
지역명
강원8311.07567.07486.08750.07478.0
경기14772.013252.012524.013678.012560.0
경남10358.08689.08619.010018.08659.0
경북9157.07883.08061.08774.08079.0
광주11042.09431.09911.09296.09904.0
대구13087.011992.011779.011141.011771.0
대전14877.09176.09711.09037.09786.0
부산13208.011354.011865.012073.011936.0
서울23446.023213.022787.025944.022610.0
세종10107.09324.09775.09848.09805.0
울산9974.09202.010503.08861.010493.0
인천14362.011241.011384.011528.011257.0
전남8168.07210.07269.07909.07284.0
전북8194.07610.07271.08276.07293.0
제주10523.014022.010621.010709.010785.0
충남8689.07911.07819.09120.07815.0
충북8195.07103.07264.08391.07219.0
#연도,지역명으로 평당분양가격 평균 구하기
g = df_last.groupby(["연도","지역명"])["평당분양가격"].mean()
g
연도    지역명
2015  강원      7188.060000
      경기     11060.940000
      경남      8459.220000
      경북      7464.160000
      광주      7916.700000
                 ...     
2019  전남      8219.275862
      전북      8532.260000
      제주     11828.469231
      충남      8748.840000
      충북      7970.875000
Name: 평당분양가격, Length: 85, dtype: float64
df_last.groupby(["연도","지역명"])["평당분양가격"].mean().unstack().T
#unstack으로 지역명을 칼럼으로 보내고, T(transpose)로 칼럼과 행값을 바꿔준다.
연도20152016201720182019
지역명
강원7188.0607162.9038467273.5600008219.2550008934.475000
경기11060.94011684.97000012304.98000014258.42000015665.540000
경남8459.2208496.7300008786.7600009327.67000010697.615789
경북7464.1607753.4050008280.8000008680.7769239050.250000
광주7916.7009190.6833339613.9775519526.95333312111.675000
대구9018.90010282.03000012206.70000012139.25263214081.650000
대전8190.6008910.7333339957.15849110234.10666712619.200000
부산10377.40010743.53500011560.68000012889.96500013537.865000
서울20315.68021753.43500021831.06000023202.24500028286.830000
세종8765.0208857.8050009132.50555610340.46315811299.394118
울산9367.6009582.57413810666.93571410241.40000010216.250000
인천10976.02011099.05500011640.60000011881.53214313249.775000
전남6798.8806936.6000007372.9200007929.8450008219.275862
전북7110.4006906.6250007398.9735858174.5950008532.260000
제주7951.0759567.48000012566.73000011935.96800011828.469231
충남7689.8807958.2250008198.4222228201.8200008748.840000
충북6828.8007133.3350007473.1200008149.2950007970.875000

pivot table로 데이터 전처리

#aggfunc으로 mean, sum같은 계산이 가능하다.
pd.pivot_table(df_last, index=["지역명"], values=["평당분양가격"], aggfunc="mean")
평당분양가격
지역명
강원7890.750000
경기13356.895200
경남9268.778138
경북8376.536515
광주9951.535821
대구11980.895455
대전10253.333333
부산12087.121200
서울23599.976400
세종9796.516456
울산10014.902013
인천11915.320732
전남7565.316532
전북7724.235484
제주11241.276712
충남8233.651883
충북7634.655600
# 전용면적 그룹으로 평당분양가격 평균 구하기
pd.pivot_table(df_last, index="전용면적", values="평당분양가격", aggfunc="mean")
평당분양가격
전용면적
102㎡~11517.705634
60㎡10375.137421
60㎡~ 85㎡10271.040071
85㎡~ 102㎡11097.599573
전체10276.086207
# 지역명,전용면적 그룹으로 평당분양가격 평균 구하기
df_last.pivot_table(index=["전용면적","지역명"], values="평당분양가격", aggfunc="mean")
평당분양가격
전용면적지역명
102㎡~강원8311.380000
경기14771.790000
경남10358.363265
경북9157.302000
광주11041.532432
.........
전체전남7283.562000
전북7292.604000
제주10784.994000
충남7815.324000
충북7219.014000

85 rows × 1 columns

# 지역명,전용면적 그룹으로 평당분양가격 평균 구하기 (unstack으로 지역명 칼럼으로가게하기)
df_last.pivot_table(index="전용면적",columns="지역명", values="평당분양가격", aggfunc="mean").round()
지역명강원경기경남경북광주대구대전부산서울세종울산인천전남전북제주충남충북
전용면적
102㎡~8311.014772.010358.09157.011042.013087.014877.013208.023446.010107.09974.014362.08168.08194.010523.08689.08195.0
60㎡7567.013252.08689.07883.09431.011992.09176.011354.023213.09324.09202.011241.07210.07610.014022.07911.07103.0
60㎡~ 85㎡7486.012524.08619.08061.09911.011779.09711.011865.022787.09775.010503.011384.07269.07271.010621.07819.07264.0
85㎡~ 102㎡8750.013678.010018.08774.09296.011141.09037.012073.025944.09848.08861.011528.07909.08276.010709.09120.08391.0
전체7478.012560.08659.08079.09904.011771.09786.011936.022610.09805.010493.011257.07284.07293.010785.07815.07219.0
# 연도, 지역명으로 평당분양가격으로 평균 구하기

p = pd.pivot_table(df_last, index=["연도","지역명"], values="평당분양가격")

p.loc[2017] # loc는 행을 기준으로 가져온다.
# 2017년 데이터만 볼 수 있다.
평당분양가격
지역명
강원7273.560000
경기12304.980000
경남8786.760000
경북8280.800000
광주9613.977551
대구12206.700000
대전9957.158491
부산11560.680000
서울21831.060000
세종9132.505556
울산10666.935714
인천11640.600000
전남7372.920000
전북7398.973585
제주12566.730000
충남8198.422222
충북7473.120000

최근 데이터 시각화 하기

#지역명으로 분양가격의 평균 구하고 선그래프

#한글 폰트 사용하기 

import matplotlib.pyplot as plt
plt.rc("font", family="Malgun Gothic")

g = df_last.groupby(["지역명"])["평당분양가격"].mean().sort_values(ascending=False)
#sort_values는 기본값 오름차순
#ascending=False는 내림차순
#g.plot(kind="bar")
g.plot.bar(rot=0, figsize=(10, 3))
#rot=0 글씨 똑바로 보기

<matplotlib.axes._subplots.AxesSubplot at 0x171e4779a00>

png

#전용면적당 평당분양가격
df_last.groupby(["전용면적"])["평당분양가격"].mean().plot.bar(rot=0)
<matplotlib.axes._subplots.AxesSubplot at 0x171e4f31af0>

png

# 연도별 분양가격의 평균 막대그래프
df_last.groupby(["연도"])["평당분양가격"].mean().plot()
<matplotlib.axes._subplots.AxesSubplot at 0x171e4f38130>

png

# boxplot으로 연도별 평당분양가격 확인
df_last.pivot_table(index="연도", values="평당분양가격").plot.box()
<matplotlib.axes._subplots.AxesSubplot at 0x171e4ff6310>

png

# 연도에 따른 전용면적
df_last.pivot_table(index="월", columns="연도", values="평당분양가격").plot.box()
<matplotlib.axes._subplots.AxesSubplot at 0x171e5052370>

png

p = df_last.pivot_table(index="월", columns=["연도","전용면적"], values="평당분양가격")
p.plot.box(figsize=(15, 3), rot=30)
<matplotlib.axes._subplots.AxesSubplot at 0x171e5058c70>

png

p.plot.bar(figsize=(15, 3), rot=30)
<matplotlib.axes._subplots.AxesSubplot at 0x171e631b460>

png

p = df_last.pivot_table(index="연도", columns="월", values="평당분양가격")
p.plot.line(figsize=(15, 3), rot=30)
#분양가가 꾸준히 상승한것을 알 수 있다.
<matplotlib.axes._subplots.AxesSubplot at 0x171e67035b0>

png

# seaborn으로 시각화

import seaborn as sns

plt.figure(figsize=(10,3))
sns.barplot(data=df_last, x="지역명", y="평당분양가격", #기본값 평균
           ci = None) # ci는 신뢰구간,sd= 표준편차, 기본값 95
<matplotlib.axes._subplots.AxesSubplot at 0x171e7a58340>

png

#barplot으로 연도별 평당분양가격 그리기

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

png

# linplot으로 연도별 평당분양가격 그리기
plt.figure(figsize=(10,3))
sns.lineplot(data=df_last, x="연도", y="평당분양가격", hue="지역명")
#hue로 지역명에 따라 다른색으로 표현
#legend(범례값을 밖에 그리는 법)
plt.legend(bbox_to_anchor=(1.02, 1), loc=2, borderaxespad=0.)
<matplotlib.legend.Legend at 0x171e7b5e7c0>

png

#relplot는 col, coloption을 쓸 수 있다.
sns.relplot(data=df_last, x="연도", y="평당분양가격", 
            kind="line", hue="지역명", col="지역명", col_wrap=4, ci=None)
#col_wrap 4줄씩 지역명에 따라 그래프를 그려준다.
# relplot는 기본값 scatter이다.
<seaborn.axisgrid.FacetGrid at 0x171e7cdfb80>

png

#catplot으로 그리기 col, col_wrap 가능하다.
sns.catplot(data=df_last, x="연도", y="평당분양가격", 
           kind="bar", ci=None, col="지역명", col_wrap=4)
<seaborn.axisgrid.FacetGrid at 0x171e9c79e20>

png

#boxplot과 violinplot

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

png

# hue옵션을 주어 전용면적별로 다르게 표시해 보기
plt.figure(figsize=(12, 3))
sns.boxplot(data=df_last, x="연도", y="평당분양가격", hue="전용면적")
<matplotlib.axes._subplots.AxesSubplot at 0x171ea6bc6d0>

png

# 연도별 평당분양가격을 violinplot으로 그려보기

sns.violinplot(data=df_last, x="연도", y="평당분양가격")
# 데이터가 어디에 많은지 파악할 수 있다.
<matplotlib.axes._subplots.AxesSubplot at 0x171ec2dea90>

png

# lmplot과 swarmplot

sns.lmplot(data=df_last, x="연도", y="평당분양가격", hue="전용면적", 
           col="전용면적", col_wrap=3, x_jitter=.1)
<seaborn.axisgrid.FacetGrid at 0x171ec2b79d0>

png

# 연도별 평당분양가격을 swarmplot 으로 그려보기
# swarmplot은 범주형(카테고리) 데이터의 산점도를 표현하기에 적합
#plt.figure(figsize=(15, 3))
#sns.swarmplot(data=df_last, x="연도", y="평당분양가격", hue="전용면적")
#이상치 보기 

df_last["평당분양가격"].describe()
count     3957.000000
mean     10685.824488
std       4172.222780
min       6164.400000
25%       8055.300000
50%       9484.200000
75%      11751.300000
max      42002.400000
Name: 평당분양가격, dtype: float64

max_price = df_last["평당분양가격"].max()
max_price

42002.399999999994
df_last[df_last["평당분양가격"] == max_price]
지역명연도분양가격평당분양가격전용면적
3743서울2019612728.042002.485㎡~ 102㎡
3828서울2019712728.042002.485㎡~ 102㎡
3913서울2019812728.042002.485㎡~ 102㎡
3998서울2019912728.042002.485㎡~ 102㎡
4083서울20191012728.042002.485㎡~ 102㎡
4168서울20191112728.042002.485㎡~ 102㎡
4253서울20191212728.042002.485㎡~ 102㎡

수치데이터 히스토그램 그리기

h = df_last["평당분양가격"].hist(bins=10) # bins는 몇개의 구간에 담을것인가?

png

# 결측치 없는 데이터 가져오기 loc이용
price = df_last.loc[df_last["평당분양가격"].notnull(),"평당분양가격"]

price
0       19275.3
1       18651.6
2       19410.6
3       18879.3
4       19400.7
         ...   
4327    10114.5
4328    10715.1
4330    12810.6
4332    12863.4
4334    11883.3
Name: 평당분양가격, Length: 3957, dtype: float64

# distplot으로 평당 분양가격을 표현

sns.distplot(price, hist=False, rug=True)
<matplotlib.axes._subplots.AxesSubplot at 0x171ec7e0910>

png

# subplot 으로 표현해보기 (산마루)
#g = sns.FacetGrid(df_last, row="지역명",
#                  height=1.7, aspect=4,)
#g.map(sns.distplot, "평당분양가격", hist=False, rug=True);
# pairplot
df_last_notnull = df_last.loc[df_last["평당분양가격"].notnull(),
                              ["연도","월","평당분양가격","지역명","전용면적"]]
sns.pairplot(df_last_notnull, hue="전용면적")
<seaborn.axisgrid.PairGrid at 0x171edd96c40>

png

#전용면적 별로 value_counts를 사용하여 데이터를 집계

df_last["전용면적"].value_counts()
 102㎡~        867
 60㎡~ 85㎡     867
 85㎡~ 102㎡    867
전체            867
 60㎡          867
Name: 전용면적, dtype: int64

2015년 8월 이전 데이터 보기

pd.options.display.max_columns = 100 # 칼럼 전체보기
df_first.head()
지역2013년12월2014년1월2014년2월2014년3월2014년4월2014년5월2014년6월2014년7월2014년8월2014년9월2014년10월2014년11월2014년12월2015년1월2015년2월2015년3월2015년4월2015년5월2015년6월2015년7월2015년8월
0서울181891792517925180161809819446188671874219274194041975920242202692067020670194151884218367183741815218443
1부산811181119078896594029501945394579411925891109208920892049235927993279345951595599581
2대구808080808077810182678274836083608370844984038439825383278416844184468568854285428795
3인천10204102041040810408100009844100589974997399731001610020100201001798769876993810551104431044310449
4광주609873267611734673467523765976127622780277077752774877527756786179147877788180898231
# 결측치 확인
df_first.isnull().sum()
# 0이면 결측치가 없는것
지역          0
2013년12월    0
2014년1월     0
2014년2월     0
2014년3월     0
2014년4월     0
2014년5월     0
2014년6월     0
2014년7월     0
2014년8월     0
2014년9월     0
2014년10월    0
2014년11월    0
2014년12월    0
2015년1월     0
2015년2월     0
2015년3월     0
2015년4월     0
2015년5월     0
2015년6월     0
2015년7월     0
2015년8월     0
dtype: int64
df_last.head()
지역명연도분양가격평당분양가격전용면적
0서울2015105841.019275.3전체
1서울2015105652.018651.660㎡
2서울2015105882.019410.660㎡~ 85㎡
3서울2015105721.018879.385㎡~ 102㎡
4서울2015105879.019400.7102㎡~
# melt로 데이터형태를 바꿔서 같은 형태로 만들어주기
df_first_melt = df_first.melt(id_vars="지역", var_name="기간", value_name="평당분양가격")
# 지역만 칼럼으로 쓰고 나머지는 행으로 녹인다.
# var_name으로 variable 칼럼이름을 바꿔준다.
# value_name으로 평당분양가격으로 아름 바꿔줌
df_first_melt.head()
지역기간평당분양가격
0서울2013년12월18189
1부산2013년12월8111
2대구2013년12월8080
3인천2013년12월10204
4광주2013년12월6098
df_first_melt.columns = ["지역명", "기간", "평당분양가격"]
# columns로 칼럼이름 변경
df_first_melt.head()
지역명기간평당분양가격
0서울2013년12월18189
1부산2013년12월8111
2대구2013년12월8080
3인천2013년12월10204
4광주2013년12월6098
# 기간에 있는 연도, 월을 빼고 칼럼으로 만들기

#년도 반환 함수
def parse_year(date):
    year = date.split("년")[0] # 년기준 앞
    year = int(year) # object를 int로 바꿔줌
    
    return year

date = "2013년12월"


parse_year(date)
2013
#월 반환 함수
def parse_month(date):
    month = date.split("년")[-1].replace("월", "") # 년기준 맨 뒤
    month = int(month) # object를 int로 바꿔줌
    
    return month

parse_month(date)
12
df_first_melt["연도"] = df_first_melt["기간"].apply(parse_year) # 앞에서만든 parse_year함수 적용(apply)
df_first_melt.head()
지역명기간평당분양가격연도
0서울2013년12월181892013
1부산2013년12월81112013
2대구2013년12월80802013
3인천2013년12월102042013
4광주2013년12월60982013
df_first_melt["월"] = df_first_melt["기간"].apply(parse_month)
df_first_melt.head()
지역명기간평당분양가격연도
0서울2013년12월18189201312
1부산2013년12월8111201312
2대구2013년12월8080201312
3인천2013년12월10204201312
4광주2013년12월6098201312

두개의 데이터프레임 합치기

df_last[df_last["전용면적"] == "전체"]
#불리언인덱싱으로 전용면적이 전체인것만 가져오기
지역명연도분양가격평당분양가격전용면적
0서울2015105841.019275.3전체
5인천2015103163.010437.9전체
10경기2015103138.010355.4전체
15부산2015103112.010269.6전체
20대구2015102682.08850.6전체
.....................
4310전북2019122468.08144.4전체
4315전남2019122452.08091.6전체
4320경북2019122914.09616.2전체
4325경남2019123063.010107.9전체
4330제주2019123882.012810.6전체

867 rows × 6 columns

df_last.columns.to_list()
#리스트형태로 바꾸기
['지역명', '연도', '월', '분양가격', '평당분양가격', '전용면적']
cols = ['지역명', '연도', '월', '평당분양가격']
# 필요한 칼럼만 뽑기
df_last_prepare = df_last.loc[df_last["전용면적"] == "전체",
                              cols].copy()
# 필요한 칼럼만저장
df_last_prepare
지역명연도평당분양가격
0서울20151019275.3
5인천20151010437.9
10경기20151010355.4
15부산20151010269.6
20대구2015108850.6
...............
4310전북2019128144.4
4315전남2019128091.6
4320경북2019129616.2
4325경남20191210107.9
4330제주20191212810.6

867 rows × 4 columns

df_first_prepare = df_first_melt[cols].copy()
df_first_prepare.head()
지역명연도평당분양가격
0서울20131218189
1부산2013128111
2대구2013128080
3인천20131210204
4광주2013126098
# concat으로 두개의 데이터를 합치기

df = pd.concat([df_first_prepare, df_last_prepare])
df

#df.shape
지역명연도평당분양가격
0서울20131218189.0
1부산2013128111.0
2대구2013128080.0
3인천20131210204.0
4광주2013126098.0
...............
4310전북2019128144.4
4315전남2019128091.6
4320경북2019129616.2
4325경남20191210107.9
4330제주20191212810.6

1224 rows × 4 columns

df.shape
(1224, 4)
df["연도"].value_counts(sort=False)
2013     17
2014    204
2015    187
2016    204
2017    204
2018    204
2019    204
Name: 연도, dtype: int64

pivot_table로 heatmap 표현

#연도를 인덱스로, 지역명을 컬러믕로 평당분양가격을 피봇테일블로
t = pd.pivot_table(df, index="연도", columns="지역명",
               values="평당분양가격").round()

t
지역명강원경기경남경북광주대구대전부산서울세종울산인천전남전북제주충남충북
연도
20136230.010855.06473.06168.06098.08080.08321.08111.018189.07601.08090.010204.05678.06282.07674.06365.06589.0
20146332.010509.06729.06536.07588.08286.08240.09180.018997.08085.08362.010075.05719.06362.07855.06682.06620.0
20156831.010489.07646.07035.07956.08707.08105.09633.019283.08641.09273.010277.06109.06623.07465.07024.06700.0
20167011.011220.07848.07361.08899.010310.08502.010430.020663.08860.010209.010532.06489.06418.09129.07331.06770.0
20177127.011850.08120.07795.09464.011456.09045.011578.021376.09135.011345.010737.07188.07058.010831.07456.06763.0
20187681.013186.09019.08505.09856.012076.010180.012998.022889.010355.010241.011274.07789.07626.011891.08013.07874.0
20198142.014469.09871.08857.011823.013852.011778.013116.026131.011079.010022.012635.07902.08197.012138.08607.07575.0
plt.figure(figsize=(15, 7))
sns.heatmap(t, cmap="Blues", annot=True, fmt=".0f") 
# cmap으로 색 지정
# annot으로 수치 표현
#fmt로 수치가 잘보이게 표현(소수점 없이)
#서울이 가장 높다.
<matplotlib.axes._subplots.AxesSubplot at 0x171ec2a15e0>

png

# T는 transpose로 행과 열을 바꿔준다.
#t.T 
t.transpose()
연도2013201420152016201720182019
지역명
강원6230.06332.06831.07011.07127.07681.08142.0
경기10855.010509.010489.011220.011850.013186.014469.0
경남6473.06729.07646.07848.08120.09019.09871.0
경북6168.06536.07035.07361.07795.08505.08857.0
광주6098.07588.07956.08899.09464.09856.011823.0
대구8080.08286.08707.010310.011456.012076.013852.0
대전8321.08240.08105.08502.09045.010180.011778.0
부산8111.09180.09633.010430.011578.012998.013116.0
서울18189.018997.019283.020663.021376.022889.026131.0
세종7601.08085.08641.08860.09135.010355.011079.0
울산8090.08362.09273.010209.011345.010241.010022.0
인천10204.010075.010277.010532.010737.011274.012635.0
전남5678.05719.06109.06489.07188.07789.07902.0
전북6282.06362.06623.06418.07058.07626.08197.0
제주7674.07855.07465.09129.010831.011891.012138.0
충남6365.06682.07024.07331.07456.08013.08607.0
충북6589.06620.06700.06770.06763.07874.07575.0

plt.figure(figsize=(15, 7))
sns.heatmap(t.T, cmap="Blues", annot=True, fmt=".0f") 
<matplotlib.axes._subplots.AxesSubplot at 0x171ec2a1160>

png

g = df.groupby(["연도","지역명"])["평당분양가격"].mean().unstack().round()
# unstack이용하면 마지막 인덱스값이(지역명) 칼럼으로 간다
#round는 소수점 1자리 까지
plt.figure(figsize=(15, 7))
sns.heatmap(g.T, annot=True, fmt=".0f", cmap="Greens")
#fmt=".0f" 소수점 없이 표현
<matplotlib.axes._subplots.AxesSubplot at 0x171eee59a30>

png

2013년부터 최근 데이터까지 시각화

# barplot으로 연도별 평당분양가격 그리기

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

png

# pointplot으로 연도별 평당분양가격 그리기
plt.figure(figsize=(12, 4))
sns.pointplot(data=df, x="연도", y="평당분양가격", hue="지역명")
# 범례(legend) 밖으로 빼기
plt.legend(bbox_to_anchor=(1.02, 1), loc=2, borderaxespad=0.)

<matplotlib.legend.Legend at 0x171ef3774c0>

png

# 서울만 barplot으로 그리기
df_seoul = df[df["지역명"] == "서울"].copy()
#df_seoul.shape

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

png

#연도별 평당분양가격 boxplot 그리기
sns.boxplot(data=df ,x ="연도", y="평당분양가격")
<matplotlib.axes._subplots.AxesSubplot at 0x171ef7ab220>

png

#연도별 평당분양가격 boxenplot 그리기
sns.boxenplot(data=df ,x ="연도", y="평당분양가격")
<matplotlib.axes._subplots.AxesSubplot at 0x171ef872c40>

png

#연도별 평당분양가격 violinplot 그리기
plt.figure(figsize=(10, 4))
sns.violinplot(data=df ,x ="연도", y="평당분양가격")
<matplotlib.axes._subplots.AxesSubplot at 0x171ef907250>

png

#연도별 평당분양가격 lmplot 그리기
plt.figure(figsize=(10, 4))
sns.lmplot(data=df ,x ="연도", y="평당분양가격", x_jitter=.1)
<seaborn.axisgrid.FacetGrid at 0x171ef99dee0>




<Figure size 720x288 with 0 Axes>

png

지역별 평당분양가격 보기

# barplot으로 지역별 평당분양가격을 그리기

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

png

# boxenplot으로 지역별 평당분양가격을 그리기

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

png

# violinplot으로 지역별 평당분양가격을 그리기

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

png









© 2021.01. by 윤영재

Powered by 윤영재