데이터 시각화 4

ganadara·2022년 11월 25일
0

복습

목록 보기
9/49
post-custom-banner

새싹 인공지능 응용sw 개발자 양성 교육 프로그램 심선조 강사님 수업 정리 글입니다.

import pandas as pd
first_df = pd.read_csv('전국_평균_분양가격(2013년_9월부터_2015년_8월까지).csv',encoding='cp949')
#UnicodeDecodeError 이 자료는 유니코드가 아님, encoding='cp949' -> 보통 해결됨
#encoding='cp949' utf-8 -> utf949로 바꿔줌?
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() #null값 합계 구하기
지역명          0
규모구분         0
연도           0
월            0
분양가격(㎡)    277
dtype: int64
last_df['분양가격']=pd.to_numeric(last_df['분양가격(㎡)'],errors='coerce') #문자형 -> 숫자형
from numpy import nan
type(nan) #nan값은 float이기때문에 숫자형으로 바꾸기 편하다.
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.전용면적 = 제대로 안 들어감
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='평당분양가격') #column값이 따로 있어야 한다.
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') #to_numeric과 차이 .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

profile
DL 공부중
post-custom-banner

0개의 댓글