새싹 인공지능 응용sw 개발자 양성 교육 프로그램 심선조 강사님 수업 정리 글입니다.
import pandas as pd
first_df = pd.read_csv('전국_평균_분양가격(2013년_9월부터_2015년_8월까지).csv',encoding='cp949')
first_df.head(2)
|
지역 |
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 |
서울 |
18189 |
17925 |
17925 |
18016 |
18098 |
19446 |
18867 |
18742 |
19274 |
... |
20242 |
20269 |
20670 |
20670 |
19415 |
18842 |
18367 |
18374 |
18152 |
18443 |
1 |
부산 |
8111 |
8111 |
9078 |
8965 |
9402 |
9501 |
9453 |
9457 |
9411 |
... |
9208 |
9208 |
9204 |
9235 |
9279 |
9327 |
9345 |
9515 |
9559 |
9581 |
2 rows × 22 columns
first_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 17 entries, 0 to 16
Data columns (total 22 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 지역 17 non-null object
1 2013년12월 17 non-null int64
2 2014년1월 17 non-null int64
3 2014년2월 17 non-null int64
4 2014년3월 17 non-null int64
5 2014년4월 17 non-null int64
6 2014년5월 17 non-null int64
7 2014년6월 17 non-null int64
8 2014년7월 17 non-null int64
9 2014년8월 17 non-null int64
10 2014년9월 17 non-null int64
11 2014년10월 17 non-null int64
12 2014년11월 17 non-null int64
13 2014년12월 17 non-null int64
14 2015년1월 17 non-null int64
15 2015년2월 17 non-null int64
16 2015년3월 17 non-null int64
17 2015년4월 17 non-null int64
18 2015년5월 17 non-null int64
19 2015년6월 17 non-null int64
20 2015년7월 17 non-null int64
21 2015년8월 17 non-null int64
dtypes: int64(21), object(1)
memory usage: 3.0+ KB
last_df = pd.read_csv('주택도시보증공사_전국_평균_분양가격(2019년_12월).csv', encoding='cp949')
last_df.head(2)
|
지역명 |
규모구분 |
연도 |
월 |
분양가격(㎡) |
0 |
서울 |
전체 |
2015 |
10 |
5841 |
1 |
서울 |
전용면적 60㎡이하 |
2015 |
10 |
5652 |
last_df.info()
<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
last_df.isna().sum()
지역명 0
규모구분 0
연도 0
월 0
분양가격(㎡) 277
dtype: int64
last_df['분양가격']=pd.to_numeric(last_df['분양가격(㎡)'],errors='coerce')
from numpy import nan
type(nan)
float
last_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4335 entries, 0 to 4334
Data columns (total 8 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
7 전용면적 4335 non-null object
dtypes: float64(2), int64(2), object(4)
memory usage: 271.1+ KB
last_df['평당분양가격']=last_df['분양가격']*3.3
last_df['평당분양가격'].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
last_df
|
지역명 |
규모구분 |
연도 |
월 |
분양가격(㎡) |
분양가격 |
평당분양가격 |
전용면적 |
0 |
서울 |
전체 |
2015 |
10 |
5841 |
5841.0 |
19275.3 |
전체 |
1 |
서울 |
전용면적 60㎡이하 |
2015 |
10 |
5652 |
5652.0 |
18651.6 |
60㎡~ |
2 |
서울 |
전용면적 60㎡초과 85㎡이하 |
2015 |
10 |
5882 |
5882.0 |
19410.6 |
60㎡~85㎡~ |
3 |
서울 |
전용면적 85㎡초과 102㎡이하 |
2015 |
10 |
5721 |
5721.0 |
18879.3 |
85㎡~102㎡~ |
4 |
서울 |
전용면적 102㎡초과 |
2015 |
10 |
5879 |
5879.0 |
19400.7 |
102㎡~ |
... |
... |
... |
... |
... |
... |
... |
... |
... |
4330 |
제주 |
전체 |
2019 |
12 |
3882 |
3882.0 |
12810.6 |
전체 |
4331 |
제주 |
전용면적 60㎡이하 |
2019 |
12 |
NaN |
NaN |
NaN |
60㎡~ |
4332 |
제주 |
전용면적 60㎡초과 85㎡이하 |
2019 |
12 |
3898 |
3898.0 |
12863.4 |
60㎡~85㎡~ |
4333 |
제주 |
전용면적 85㎡초과 102㎡이하 |
2019 |
12 |
NaN |
NaN |
NaN |
85㎡~102㎡~ |
4334 |
제주 |
전용면적 102㎡초과 |
2019 |
12 |
3601 |
3601.0 |
11883.3 |
102㎡~ |
4335 rows × 8 columns
last_df.규모구분.unique()
array(['전체', '전용면적 60㎡이하', '전용면적 60㎡초과 85㎡이하', '전용면적 85㎡초과 102㎡이하',
'전용면적 102㎡초과'], dtype=object)
last_df.전용면적 = last_df.규모구분.str.replace('전용면적', '')
last_df
|
지역명 |
규모구분 |
연도 |
월 |
분양가격(㎡) |
분양가격 |
평당분양가격 |
전용면적 |
0 |
서울 |
전체 |
2015 |
10 |
5841 |
5841.0 |
19275.3 |
전체 |
1 |
서울 |
전용면적 60㎡이하 |
2015 |
10 |
5652 |
5652.0 |
18651.6 |
60㎡~ |
2 |
서울 |
전용면적 60㎡초과 85㎡이하 |
2015 |
10 |
5882 |
5882.0 |
19410.6 |
60㎡~85㎡~ |
3 |
서울 |
전용면적 85㎡초과 102㎡이하 |
2015 |
10 |
5721 |
5721.0 |
18879.3 |
85㎡~102㎡~ |
4 |
서울 |
전용면적 102㎡초과 |
2015 |
10 |
5879 |
5879.0 |
19400.7 |
102㎡~ |
... |
... |
... |
... |
... |
... |
... |
... |
... |
4330 |
제주 |
전체 |
2019 |
12 |
3882 |
3882.0 |
12810.6 |
전체 |
4331 |
제주 |
전용면적 60㎡이하 |
2019 |
12 |
NaN |
NaN |
NaN |
60㎡~ |
4332 |
제주 |
전용면적 60㎡초과 85㎡이하 |
2019 |
12 |
3898 |
3898.0 |
12863.4 |
60㎡~85㎡~ |
4333 |
제주 |
전용면적 85㎡초과 102㎡이하 |
2019 |
12 |
NaN |
NaN |
NaN |
85㎡~102㎡~ |
4334 |
제주 |
전용면적 102㎡초과 |
2019 |
12 |
3601 |
3601.0 |
11883.3 |
102㎡~ |
4335 rows × 8 columns
last_df['전용면적'] = last_df.['전용면적'].str.replace('초과','~')
last_df
File "C:\Users\user\AppData\Local\Temp\ipykernel_14356\3079234100.py", line 1
last_df['전용면적'] = last_df.['전용면적'].str.replace('초과','~') #last_df.전용면적 = 제대로 안 들어감
^
SyntaxError: invalid syntax
last_df['전용면적'] = last_df['전용면적'].str.replace('이하','~')
last_df
|
지역명 |
규모구분 |
연도 |
월 |
분양가격(㎡) |
분양가격 |
평당분양가격 |
전용면적 |
0 |
서울 |
전체 |
2015 |
10 |
5841 |
5841.0 |
19275.3 |
전체 |
1 |
서울 |
전용면적 60㎡이하 |
2015 |
10 |
5652 |
5652.0 |
18651.6 |
60㎡~ |
2 |
서울 |
전용면적 60㎡초과 85㎡이하 |
2015 |
10 |
5882 |
5882.0 |
19410.6 |
60㎡~85㎡~ |
3 |
서울 |
전용면적 85㎡초과 102㎡이하 |
2015 |
10 |
5721 |
5721.0 |
18879.3 |
85㎡~102㎡~ |
4 |
서울 |
전용면적 102㎡초과 |
2015 |
10 |
5879 |
5879.0 |
19400.7 |
102㎡~ |
... |
... |
... |
... |
... |
... |
... |
... |
... |
4330 |
제주 |
전체 |
2019 |
12 |
3882 |
3882.0 |
12810.6 |
전체 |
4331 |
제주 |
전용면적 60㎡이하 |
2019 |
12 |
NaN |
NaN |
NaN |
60㎡~ |
4332 |
제주 |
전용면적 60㎡초과 85㎡이하 |
2019 |
12 |
3898 |
3898.0 |
12863.4 |
60㎡~85㎡~ |
4333 |
제주 |
전용면적 85㎡초과 102㎡이하 |
2019 |
12 |
NaN |
NaN |
NaN |
85㎡~102㎡~ |
4334 |
제주 |
전용면적 102㎡초과 |
2019 |
12 |
3601 |
3601.0 |
11883.3 |
102㎡~ |
4335 rows × 8 columns
last_df['전용면적'] = last_df['전용면적'].str.replace(' ','').str.strip()
last_df
|
지역명 |
규모구분 |
연도 |
월 |
분양가격(㎡) |
분양가격 |
평당분양가격 |
전용면적 |
0 |
서울 |
전체 |
2015 |
10 |
5841 |
5841.0 |
19275.3 |
전체 |
1 |
서울 |
전용면적 60㎡이하 |
2015 |
10 |
5652 |
5652.0 |
18651.6 |
60㎡~ |
2 |
서울 |
전용면적 60㎡초과 85㎡이하 |
2015 |
10 |
5882 |
5882.0 |
19410.6 |
60㎡~85㎡~ |
3 |
서울 |
전용면적 85㎡초과 102㎡이하 |
2015 |
10 |
5721 |
5721.0 |
18879.3 |
85㎡~102㎡~ |
4 |
서울 |
전용면적 102㎡초과 |
2015 |
10 |
5879 |
5879.0 |
19400.7 |
102㎡~ |
... |
... |
... |
... |
... |
... |
... |
... |
... |
4330 |
제주 |
전체 |
2019 |
12 |
3882 |
3882.0 |
12810.6 |
전체 |
4331 |
제주 |
전용면적 60㎡이하 |
2019 |
12 |
NaN |
NaN |
NaN |
60㎡~ |
4332 |
제주 |
전용면적 60㎡초과 85㎡이하 |
2019 |
12 |
3898 |
3898.0 |
12863.4 |
60㎡~85㎡~ |
4333 |
제주 |
전용면적 85㎡초과 102㎡이하 |
2019 |
12 |
NaN |
NaN |
NaN |
85㎡~102㎡~ |
4334 |
제주 |
전용면적 102㎡초과 |
2019 |
12 |
3601 |
3601.0 |
11883.3 |
102㎡~ |
4335 rows × 8 columns
last_df.전용면적.unique()
array(['전체', ' 60㎡이하', ' 60㎡초과 85㎡이하', ' 85㎡초과 102㎡이하', ' 102㎡초과'],
dtype=object)
last_df.columns
Index(['지역명', '규모구분', '연도', '월', '분양가격(㎡)', '분양가격', '평당분양가격', '전용면적'], dtype='object')
last_df.drop(columns=['규모구분','분양가격(㎡)'],inplace=True)
last_df.columns
Index(['지역명', '연도', '월', '분양가격', '평당분양가격', '전용면적'], dtype='object')
last_df.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
last_df.groupby(['지역명'])['평당분양가격'].mean().plot(kind='bar')
<AxesSubplot:xlabel='지역명'>
last_df.groupby(['지역명'])['평당분양가격'].mean().plot(kind='barh')
<AxesSubplot:ylabel='지역명'>
data=last_df.groupby(['지역명'])['평당분양가격'].mean().reset_index()
data.round(-1)
|
지역명 |
평당분양가격 |
0 |
강원 |
7890.0 |
1 |
경기 |
13360.0 |
2 |
경남 |
9270.0 |
3 |
경북 |
8380.0 |
4 |
광주 |
9950.0 |
5 |
대구 |
11980.0 |
6 |
대전 |
10250.0 |
7 |
부산 |
12090.0 |
8 |
서울 |
23600.0 |
9 |
세종 |
9800.0 |
10 |
울산 |
10010.0 |
11 |
인천 |
11920.0 |
12 |
전남 |
7570.0 |
13 |
전북 |
7720.0 |
14 |
제주 |
11240.0 |
15 |
충남 |
8230.0 |
16 |
충북 |
7630.0 |
pd.pivot_table(last_df,index=['전용면적','지역명'],values=['평당분양가격']).reset_index().round()
|
전용면적 |
지역명 |
평당분양가격 |
0 |
102㎡~ |
강원 |
8311.0 |
1 |
102㎡~ |
경기 |
14772.0 |
2 |
102㎡~ |
경남 |
10358.0 |
3 |
102㎡~ |
경북 |
9157.0 |
4 |
102㎡~ |
광주 |
11042.0 |
... |
... |
... |
... |
80 |
전체 |
전남 |
7284.0 |
81 |
전체 |
전북 |
7293.0 |
82 |
전체 |
제주 |
10785.0 |
83 |
전체 |
충남 |
7815.0 |
84 |
전체 |
충북 |
7219.0 |
85 rows × 3 columns
data = last_df.groupby(['지역명'])['평당분양가격'].mean()
data.sort_values(ascending=False).plot(kind='barh')
<AxesSubplot:xlabel='전용면적'>
last_df.groupby(['전용면적'])['평당분양가격'].mean().sort_index().plot(kind='bar')
<AxesSubplot:xlabel='전용면적'>
data = last_df.groupby(['연도'])['평당분양가격'].mean().plot(kind='bar')
data = last_df.groupby(['연도'])['평당분양가격'].mean()
data
연도
2015 9202.735802
2016 9683.025000
2017 10360.487653
2018 10978.938411
2019 12188.293092
Name: 평당분양가격, dtype: float64
data = last_df.pivot_table(index='월',columns='연도',values='평당분양가격')
data.plot(kind='box')
<AxesSubplot:>
import seaborn as sns
sns.boxplot(data=last_df,x='연도',y='평당분양가격',hue='전용면적')
<AxesSubplot:xlabel='연도', ylabel='평당분양가격'>
sns.violinplot(data=last_df,x='연도',y='평당분양가격')
<AxesSubplot:xlabel='연도', ylabel='평당분양가격'>
first_df
|
지역 |
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 |
서울 |
18189 |
17925 |
17925 |
18016 |
18098 |
19446 |
18867 |
18742 |
19274 |
... |
20242 |
20269 |
20670 |
20670 |
19415 |
18842 |
18367 |
18374 |
18152 |
18443 |
1 |
부산 |
8111 |
8111 |
9078 |
8965 |
9402 |
9501 |
9453 |
9457 |
9411 |
... |
9208 |
9208 |
9204 |
9235 |
9279 |
9327 |
9345 |
9515 |
9559 |
9581 |
2 |
대구 |
8080 |
8080 |
8077 |
8101 |
8267 |
8274 |
8360 |
8360 |
8370 |
... |
8439 |
8253 |
8327 |
8416 |
8441 |
8446 |
8568 |
8542 |
8542 |
8795 |
3 |
인천 |
10204 |
10204 |
10408 |
10408 |
10000 |
9844 |
10058 |
9974 |
9973 |
... |
10020 |
10020 |
10017 |
9876 |
9876 |
9938 |
10551 |
10443 |
10443 |
10449 |
4 |
광주 |
6098 |
7326 |
7611 |
7346 |
7346 |
7523 |
7659 |
7612 |
7622 |
... |
7752 |
7748 |
7752 |
7756 |
7861 |
7914 |
7877 |
7881 |
8089 |
8231 |
5 |
대전 |
8321 |
8321 |
8321 |
8341 |
8341 |
8341 |
8333 |
8333 |
8333 |
... |
8067 |
8067 |
8067 |
8067 |
8067 |
8145 |
8272 |
8079 |
8079 |
8079 |
6 |
울산 |
8090 |
8090 |
8090 |
8153 |
8153 |
8153 |
8153 |
8153 |
8493 |
... |
8891 |
8891 |
8526 |
8526 |
8629 |
9380 |
9192 |
9190 |
9190 |
9215 |
7 |
경기 |
10855 |
10855 |
10791 |
10784 |
10876 |
10646 |
10266 |
10124 |
10134 |
... |
10356 |
10379 |
10391 |
10355 |
10469 |
10684 |
10685 |
10573 |
10518 |
10573 |
8 |
세종 |
7601 |
7600 |
7532 |
7814 |
7908 |
7934 |
8067 |
8067 |
8141 |
... |
8592 |
8560 |
8560 |
8560 |
8555 |
8546 |
8546 |
8671 |
8669 |
8695 |
9 |
강원 |
6230 |
6230 |
6230 |
6141 |
6373 |
6350 |
6350 |
6268 |
6268 |
... |
6365 |
6365 |
6348 |
6350 |
6182 |
6924 |
6846 |
6986 |
7019 |
7008 |
10 |
충북 |
6589 |
6589 |
6611 |
6625 |
6678 |
6598 |
6587 |
6586 |
6586 |
... |
6724 |
6743 |
6749 |
6747 |
6783 |
6790 |
6805 |
6682 |
6601 |
6603 |
11 |
충남 |
6365 |
6365 |
6379 |
6287 |
6552 |
6591 |
6644 |
6805 |
6914 |
... |
6940 |
6989 |
6976 |
6980 |
7161 |
7017 |
6975 |
6939 |
6935 |
6942 |
12 |
전북 |
6282 |
6281 |
5946 |
5966 |
6277 |
6306 |
6351 |
6319 |
6436 |
... |
6583 |
6583 |
6583 |
6583 |
6542 |
6551 |
6556 |
6601 |
6750 |
6580 |
13 |
전남 |
5678 |
5678 |
5678 |
5696 |
5736 |
5656 |
5609 |
5780 |
5685 |
... |
5768 |
5784 |
5784 |
5833 |
5825 |
5940 |
6050 |
6243 |
6286 |
6289 |
14 |
경북 |
6168 |
6168 |
6234 |
6317 |
6412 |
6409 |
6554 |
6556 |
6563 |
... |
6881 |
6989 |
6992 |
6953 |
6997 |
7006 |
6966 |
6887 |
7035 |
7037 |
15 |
경남 |
6473 |
6485 |
6502 |
6610 |
6599 |
6610 |
6615 |
6613 |
6606 |
... |
7125 |
7332 |
7592 |
7588 |
7668 |
7683 |
7717 |
7715 |
7723 |
7665 |
16 |
제주 |
7674 |
7900 |
7900 |
7900 |
7900 |
7900 |
7914 |
7914 |
7914 |
... |
7724 |
7739 |
7739 |
7739 |
7826 |
7285 |
7285 |
7343 |
7343 |
7343 |
17 rows × 22 columns
first_df_melt = first_df.melt(id_vars='지역',var_name='기간', value_name='평당분양가격')
first_df_melt.head(2)
|
지역 |
기간 |
평당분양가격 |
0 |
서울 |
2013년12월 |
18189 |
1 |
부산 |
2013년12월 |
8111 |
last_df.columns
Index(['지역명', '연도', '월', '분양가격', '평당분양가격', '전용면적'], dtype='object')
last_df.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 int64
2 월 4335 non-null int64
3 분양가격 3957 non-null float64
4 평당분양가격 3957 non-null float64
5 전용면적 4335 non-null object
dtypes: float64(2), int64(2), object(2)
memory usage: 203.3+ KB
first_df_melt.columns
Index(['지역', '기간', '평당분양가격'], dtype='object')
first_df_melt['연도'] = first_df_melt['기간'].str.split('년').str.get(0).astype('int')
first_df_melt['월'] = first_df_melt['기간'].str.split('년').str.get(1).str.replace('월','').astype('int')
first_df_melt.columns = ['지역명', '기간', '평당분양가격','연도','월']
cols = ['지역명', '연도', '월', '평당분양가격']
data_last =last_df.loc[last_df['전용면적']=='전체',cols]
data_first = first_df_melt[cols]
result=pd.concat([data_first,data_last])
result
|
지역명 |
연도 |
월 |
평당분양가격 |
0 |
서울 |
2013 |
12 |
18189.0 |
1 |
부산 |
2013 |
12 |
8111.0 |
2 |
대구 |
2013 |
12 |
8080.0 |
3 |
인천 |
2013 |
12 |
10204.0 |
4 |
광주 |
2013 |
12 |
6098.0 |
... |
... |
... |
... |
... |
4310 |
전북 |
2019 |
12 |
8144.4 |
4315 |
전남 |
2019 |
12 |
8091.6 |
4320 |
경북 |
2019 |
12 |
9616.2 |
4325 |
경남 |
2019 |
12 |
10107.9 |
4330 |
제주 |
2019 |
12 |
12810.6 |
1224 rows × 4 columns