Pandas 연습 문제 풀기 -8 🐼
# 파이썬에서 쓸 수 있는 엑셀과도 유사한 판다스 라이브러리를 불러옵니다.
import pandas as pd
import os
os.listdir('./data')
['국가_대륙_별_상품군별_온라인쇼핑_해외직접판매액.csv',
'전국 평균 분양가격(2013년 9월부터 2015년 8월까지).csv',
'주택도시보증공사_전국 평균 분양가격(2019년 12월).csv']
# 최근 분양가 파일을 로드해서 df_last 라는 변수에 담습니다.
# "./data/주택도시보증공사_전국 평균 분양가격(2019년 12월).csv"파일, encoding="cp949"
# 파일로드시 OSError가 발생한다면, engine="python"을 추가해 보세요.
df_last = pd.read_csv("./data/주택도시보증공사_전국 평균 분양가격(2019년 12월).csv", encoding="cp949", engine="python")
df_last.head(2)
지역명 | 규모구분 | 연도 | 월 | 분양가격(㎡) | |
---|---|---|---|---|---|
0 | 서울 | 전체 | 2015 | 10 | 5841 |
1 | 서울 | 전용면적 60㎡이하 | 2015 | 10 | 5652 |
# 행,열
df_last.shape
(4335, 5)
# head 로 파일을 미리보기 합니다.
df_last.head()
지역명 | 규모구분 | 연도 | 월 | 분양가격(㎡) | |
---|---|---|---|---|---|
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 |
# tail 로도 미리보기를 합니다.
df_last.tail()
지역명 | 규모구분 | 연도 | 월 | 분양가격(㎡) | |
---|---|---|---|---|---|
4330 | 제주 | 전체 | 2019 | 12 | 3882 |
4331 | 제주 | 전용면적 60㎡이하 | 2019 | 12 | NaN |
4332 | 제주 | 전용면적 60㎡초과 85㎡이하 | 2019 | 12 | 3898 |
4333 | 제주 | 전용면적 85㎡초과 102㎡이하 | 2019 | 12 | NaN |
4334 | 제주 | 전용면적 102㎡초과 | 2019 | 12 | 3601 |
2015년 부터 최근까지의 데이터 로드¶
전국 평균 분양가격(2013년 9월부터 2015년 8월까지) 파일을 불러옵니다. df_first 라는 변수에 담고 shape로 행과 열의 갯수를 출력합니다.
os.listdir('./data')
['국가_대륙_별_상품군별_온라인쇼핑_해외직접판매액.csv',
'전국 평균 분양가격(2013년 9월부터 2015년 8월까지).csv',
'주택도시보증공사_전국 평균 분양가격(2019년 12월).csv']
df_first = pd.read_csv("data/전국 평균 분양가격(2013년 9월부터 2015년 8월까지).csv", encoding="cp949")
df_first.shape
(17, 22)
# df_first 변수에 담긴 데이터프레임을 head로 미리보기 합니다.
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 | 서울 | 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 rows × 22 columns
# df_first 변수에 담긴 데이터프레임을 tail로 미리보기 합니다.
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 | 전북 | 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 |
5 rows × 22 columns
데이터 요약하기¶
# df_last 요약
df_last.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
# df_first 요약
df_first.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
결측치 보기¶
# df_last 결측치를 구합니다.
df_last.isnull().sum()
지역명 0
규모구분 0
연도 0
월 0
분양가격(㎡) 277
dtype: int64
데이터 타입 변경¶
분양가격이 object(문자) 타입으로 되어 있습니다. 문자열 타입을 계산할 수 없기 때문에 수치 데이터로 변경해 줍니다. 결측치가 섞여 있을 때 변환이 제대로 되지 않습니다. 그래서 pd.to_numeric 을 통해 데이터의 타입을 변경합니다.
# df_last의 '분양가격(㎡)'의 데이터 타입 확인
df_last['분양가격(㎡)'].dtypes
dtype('O')
# df_last의 '분양가격(㎡)'의 데이터 타입을 float(수치형으로)변경
# 변경결과를 새로운 열 '분양가격'을 생성하여 대입
df_last["분양가격"] = pd.to_numeric(df_last['분양가격(㎡)'], errors="coerce")
# df_last의 '분양가격'의 데이터 타입 확인
df_last["분양가격"].dtypes
dtype('float64')
평당분양가격 구하기¶
2013년부터의 데이터는 평당분양가격 기준으로 되어 있습니다. 분양가격을 평당기준으로 보기위해 3.3을 곱해서 "평당분양가격" 컬럼을 만들어 추가해 줍니다.
# df_last의 '분양가격'에 3.3을 곱해서 평당분양가격 열을 새로 생성
df_last["평당분양가격"] = df_last["분양가격"]*3.3
# df_last.head(1)
df_last.head(1)
지역명 | 규모구분 | 연도 | 월 | 분양가격(㎡) | 분양가격 | 평당분양가격 | |
---|---|---|---|---|---|---|---|
0 | 서울 | 전체 | 2015 | 10 | 5841 | 5841.0 | 19275.3 |
분양가격 요약하기¶
# df_last.info를 통해 분양가격을 봅니다.
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
# 변경 전 컬럼인 분양가격(㎡) 컬럼을 요약합니다.
df_last["분양가격(㎡)"].describe()
count 4058
unique 1753
top 2221
freq 17
Name: 분양가격(㎡), dtype: object
# 수치데이터로 변경된 분양가격 컬럼을 요약합니다.
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
규모구분을 전용면적 컬럼으로 변경¶
규모구분 컬럼은 전용면적에 대한 내용이 있습니다. 전용면적이라는 문구가 공통적으로 들어가고 규모구분보다는 전용면적이 좀 더 직관적이기 때문에 전용면적이라는 컬럼을 새로 만들어주고 기존 규모구분의 값에서 전용면적, 초과, 이하 등의 문구를 빼고 간결하게 만들어 봅니다.
이 때 str 의 replace 기능을 사용해서 예를들면 "전용면적 60㎡초과 85㎡이하"라면 "60㎡~85㎡" 로 변경해 줍니다.
# df_last 의 '규모구분'의 데이터 확인
df_last.규모구분.unique()
array(['전체', '전용면적 60㎡이하', '전용면적 60㎡초과 85㎡이하', '전용면적 85㎡초과 102㎡이하',
'전용면적 102㎡초과'], dtype=object)
df_last["전용면적"] = df_last["규모구분"].str.replace("전용면적", "")
df_last["전용면적"] = df_last["전용면적"].str.replace("초과", "~")
df_last["전용면적"] = df_last["전용면적"].str.replace("이하", "")
df_last["전용면적"] = df_last["전용면적"].str.replace(" ", "").str.strip()
df_last["전용면적"]
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.전용면적.value_counts()
전체 867
60㎡ 867
60㎡~85㎡ 867
85㎡~102㎡ 867
102㎡~ 867
Name: 전용면적, dtype: int64
필요없는 컬럼 제거하기¶
drop을 통해 전처리 해준 컬럼을 제거합니다.
# df_last.head(1)
df_last.head(1)
지역명 | 규모구분 | 연도 | 월 | 분양가격(㎡) | 분양가격 | 평당분양가격 | 전용면적 | |
---|---|---|---|---|---|---|---|---|
0 | 서울 | 전체 | 2015 | 10 | 5841 | 5841.0 | 19275.3 | 전체 |
# "규모구분", "분양가격(㎡)" 열 제거
df_last.drop(["규모구분", "분양가격(㎡)"], axis=1,inplace=True)
# 제거가 잘 되었는지 확인 합니다.
# df_last.head(1)
df_last.head(1)
지역명 | 연도 | 월 | 분양가격 | 평당분양가격 | 전용면적 | |
---|---|---|---|---|---|---|
0 | 서울 | 2015 | 10 | 5841.0 | 19275.3 | 전체 |
groupby 로 데이터 집계하기¶
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
지역명 | 연도 | 월 | 분양가격 | 평당분양가격 | 전용면적 | |
---|---|---|---|---|---|---|
0 | 서울 | 2015 | 10 | 5841.0 | 19275.3 | 전체 |
1 | 서울 | 2015 | 10 | 5652.0 | 18651.6 | 60㎡ |
2 | 서울 | 2015 | 10 | 5882.0 | 19410.6 | 60㎡~85㎡ |
3 | 서울 | 2015 | 10 | 5721.0 | 18879.3 | 85㎡~102㎡ |
4 | 서울 | 2015 | 10 | 5879.0 | 19400.7 | 102㎡~ |
... | ... | ... | ... | ... | ... | ... |
4330 | 제주 | 2019 | 12 | 3882.0 | 12810.6 | 전체 |
4331 | 제주 | 2019 | 12 | NaN | NaN | 60㎡ |
4332 | 제주 | 2019 | 12 | 3898.0 | 12863.4 | 60㎡~85㎡ |
4333 | 제주 | 2019 | 12 | NaN | NaN | 85㎡~102㎡ |
4334 | 제주 | 2019 | 12 | 3601.0 | 11883.3 | 102㎡~ |
4335 rows × 6 columns
# 전용면적으로 평당분양가격의 평균을 구합니다.
df_last.groupby("전용면적").평당분양가격.mean()
전용면적
102㎡~ 11517.705634
60㎡ 10375.137421
60㎡~85㎡ 10271.040071
85㎡~102㎡ 11097.599573
전체 10276.086207
Name: 평당분양가격, dtype: float64
# 지역명, 전용면적으로 평당분양가격의 평균을 구합니다.
# groupby결과를 unstack하고 반올림(round())한다.
df_last.groupby(["전용면적",'지역명']).평당분양가격.mean().round().unstack()
지역명 | 강원 | 경기 | 경남 | 경북 | 광주 | 대구 | 대전 | 부산 | 서울 | 세종 | 울산 | 인천 | 전남 | 전북 | 제주 | 충남 | 충북 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
전용면적 | |||||||||||||||||
102㎡~ | 8311.0 | 14772.0 | 10358.0 | 9157.0 | 11042.0 | 13087.0 | 14877.0 | 13208.0 | 23446.0 | 10107.0 | 9974.0 | 14362.0 | 8168.0 | 8194.0 | 10523.0 | 8689.0 | 8195.0 |
60㎡ | 7567.0 | 13252.0 | 8689.0 | 7883.0 | 9431.0 | 11992.0 | 9176.0 | 11354.0 | 23213.0 | 9324.0 | 9202.0 | 11241.0 | 7210.0 | 7610.0 | 14022.0 | 7911.0 | 7103.0 |
60㎡~85㎡ | 7486.0 | 12524.0 | 8619.0 | 8061.0 | 9911.0 | 11779.0 | 9711.0 | 11865.0 | 22787.0 | 9775.0 | 10503.0 | 11384.0 | 7269.0 | 7271.0 | 10621.0 | 7819.0 | 7264.0 |
85㎡~102㎡ | 8750.0 | 13678.0 | 10018.0 | 8774.0 | 9296.0 | 11141.0 | 9037.0 | 12073.0 | 25944.0 | 9848.0 | 8861.0 | 11528.0 | 7909.0 | 8276.0 | 10709.0 | 9120.0 | 8391.0 |
전체 | 7478.0 | 12560.0 | 8659.0 | 8079.0 | 9904.0 | 11771.0 | 9786.0 | 11936.0 | 22610.0 | 9805.0 | 10493.0 | 11257.0 | 7284.0 | 7293.0 | 10785.0 | 7815.0 | 7219.0 |
# 연도, 지역명으로 평당분양가격의 평균을 구합니다.
# groupby 결과를 unstack하고 transpose한다.
df_last.groupby(["연도","지역명"]).평당분양가격.mean().unstack().transpose()
연도 | 2015 | 2016 | 2017 | 2018 | 2019 |
---|---|---|---|---|---|
지역명 | |||||
강원 | 7188.060 | 7162.903846 | 7273.560000 | 8219.255000 | 8934.475000 |
경기 | 11060.940 | 11684.970000 | 12304.980000 | 14258.420000 | 15665.540000 |
경남 | 8459.220 | 8496.730000 | 8786.760000 | 9327.670000 | 10697.615789 |
경북 | 7464.160 | 7753.405000 | 8280.800000 | 8680.776923 | 9050.250000 |
광주 | 7916.700 | 9190.683333 | 9613.977551 | 9526.953333 | 12111.675000 |
대구 | 9018.900 | 10282.030000 | 12206.700000 | 12139.252632 | 14081.650000 |
대전 | 8190.600 | 8910.733333 | 9957.158491 | 10234.106667 | 12619.200000 |
부산 | 10377.400 | 10743.535000 | 11560.680000 | 12889.965000 | 13537.865000 |
서울 | 20315.680 | 21753.435000 | 21831.060000 | 23202.245000 | 28286.830000 |
세종 | 8765.020 | 8857.805000 | 9132.505556 | 10340.463158 | 11299.394118 |
울산 | 9367.600 | 9582.574138 | 10666.935714 | 10241.400000 | 10216.250000 |
인천 | 10976.020 | 11099.055000 | 11640.600000 | 11881.532143 | 13249.775000 |
전남 | 6798.880 | 6936.600000 | 7372.920000 | 7929.845000 | 8219.275862 |
전북 | 7110.400 | 6906.625000 | 7398.973585 | 8174.595000 | 8532.260000 |
제주 | 7951.075 | 9567.480000 | 12566.730000 | 11935.968000 | 11828.469231 |
충남 | 7689.880 | 7958.225000 | 8198.422222 | 8201.820000 | 8748.840000 |
충북 | 6828.800 | 7133.335000 | 7473.120000 | 8149.295000 | 7970.875000 |
pivot table 로 데이터 집계하기¶
- groupby 로 했던 작업을 pivot_table로 똑같이 해봅니다.
df_last.head(1)
지역명 | 연도 | 월 | 분양가격 | 평당분양가격 | 전용면적 | |
---|---|---|---|---|---|---|
0 | 서울 | 2015 | 10 | 5841.0 | 19275.3 | 전체 |
# 지역명으로 평당분양가격의 평균을 구합니다.
df_last.pivot_table(index="지역명",values="평당분양가격")
평당분양가격 | |
---|---|
지역명 | |
강원 | 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 |
# 전용면적으로 평당분양가격의 평균을 구합니다.
df_last.pivot_table(index="전용면적",values="평당분양가격")
평당분양가격 | |
---|---|
전용면적 | |
102㎡~ | 11517.705634 |
60㎡ | 10375.137421 |
60㎡~85㎡ | 10271.040071 |
85㎡~102㎡ | 11097.599573 |
전체 | 10276.086207 |
# 지역명, 전용면적으로 평당분양가격의 평균을 구합니다.
# round 반올림
df_last.pivot_table(index="전용면적", columns="지역명", values="평당분양가격").round()
지역명 | 강원 | 경기 | 경남 | 경북 | 광주 | 대구 | 대전 | 부산 | 서울 | 세종 | 울산 | 인천 | 전남 | 전북 | 제주 | 충남 | 충북 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
전용면적 | |||||||||||||||||
102㎡~ | 8311.0 | 14772.0 | 10358.0 | 9157.0 | 11042.0 | 13087.0 | 14877.0 | 13208.0 | 23446.0 | 10107.0 | 9974.0 | 14362.0 | 8168.0 | 8194.0 | 10523.0 | 8689.0 | 8195.0 |
60㎡ | 7567.0 | 13252.0 | 8689.0 | 7883.0 | 9431.0 | 11992.0 | 9176.0 | 11354.0 | 23213.0 | 9324.0 | 9202.0 | 11241.0 | 7210.0 | 7610.0 | 14022.0 | 7911.0 | 7103.0 |
60㎡~85㎡ | 7486.0 | 12524.0 | 8619.0 | 8061.0 | 9911.0 | 11779.0 | 9711.0 | 11865.0 | 22787.0 | 9775.0 | 10503.0 | 11384.0 | 7269.0 | 7271.0 | 10621.0 | 7819.0 | 7264.0 |
85㎡~102㎡ | 8750.0 | 13678.0 | 10018.0 | 8774.0 | 9296.0 | 11141.0 | 9037.0 | 12073.0 | 25944.0 | 9848.0 | 8861.0 | 11528.0 | 7909.0 | 8276.0 | 10709.0 | 9120.0 | 8391.0 |
전체 | 7478.0 | 12560.0 | 8659.0 | 8079.0 | 9904.0 | 11771.0 | 9786.0 | 11936.0 | 22610.0 | 9805.0 | 10493.0 | 11257.0 | 7284.0 | 7293.0 | 10785.0 | 7815.0 | 7219.0 |
# 연도, 지역명으로 평당분양가격의 평균을 구합니다.
df_last.pivot_table(index="지역명", columns="연도", values="평당분양가격")
연도 | 2015 | 2016 | 2017 | 2018 | 2019 |
---|---|---|---|---|---|
지역명 | |||||
강원 | 7188.060 | 7162.903846 | 7273.560000 | 8219.255000 | 8934.475000 |
경기 | 11060.940 | 11684.970000 | 12304.980000 | 14258.420000 | 15665.540000 |
경남 | 8459.220 | 8496.730000 | 8786.760000 | 9327.670000 | 10697.615789 |
경북 | 7464.160 | 7753.405000 | 8280.800000 | 8680.776923 | 9050.250000 |
광주 | 7916.700 | 9190.683333 | 9613.977551 | 9526.953333 | 12111.675000 |
대구 | 9018.900 | 10282.030000 | 12206.700000 | 12139.252632 | 14081.650000 |
대전 | 8190.600 | 8910.733333 | 9957.158491 | 10234.106667 | 12619.200000 |
부산 | 10377.400 | 10743.535000 | 11560.680000 | 12889.965000 | 13537.865000 |
서울 | 20315.680 | 21753.435000 | 21831.060000 | 23202.245000 | 28286.830000 |
세종 | 8765.020 | 8857.805000 | 9132.505556 | 10340.463158 | 11299.394118 |
울산 | 9367.600 | 9582.574138 | 10666.935714 | 10241.400000 | 10216.250000 |
인천 | 10976.020 | 11099.055000 | 11640.600000 | 11881.532143 | 13249.775000 |
전남 | 6798.880 | 6936.600000 | 7372.920000 | 7929.845000 | 8219.275862 |
전북 | 7110.400 | 6906.625000 | 7398.973585 | 8174.595000 | 8532.260000 |
제주 | 7951.075 | 9567.480000 | 12566.730000 | 11935.968000 | 11828.469231 |
충남 | 7689.880 | 7958.225000 | 8198.422222 | 8201.820000 | 8748.840000 |
충북 | 6828.800 | 7133.335000 | 7473.120000 | 8149.295000 | 7970.875000 |
import matplotlib.pyplot as plt
# 한글오류처리
plt.rc("font", family="Malgun Gothic")
# plt.rc("font", family="AppleGothic")
Pandas로 시각화 하기 - 선그래프와 막대그래프¶
pandas의 plot을 활용하면 다양한 그래프를 그릴 수 있습니다. seaborn을 사용했을 때보다 pandas를 사용해서 시각화를 할 때의 장점은 미리 계산을 하고 그리기 때문에 속도가 좀 더 빠릅니다.
# 지역명으로 평당분양가격의 평균을 구하고 선그래프로 시각화 합니다.
df_last.groupby("지역명").평당분양가격.mean().sort_values(ascending=False).plot()
<AxesSubplot:xlabel='지역명'>
# 지역명으로 평당분양가격의 평균을 구하고 막대그래프(bar)로 시각화 합니다.
df_last.groupby("지역명").평당분양가격.mean().sort_values(ascending=False).plot.bar(rot=0)
<AxesSubplot:xlabel='지역명'>
전용면적별 분양가격의 평균값을 구하고 그래프로 그려봅니다.
# 전용면적으로 평당분양가격의 평균을 구하고 막대그래프(bar)로 시각화 합니다.
df_last.groupby("전용면적").평당분양가격.mean().plot.bar()
<AxesSubplot:xlabel='전용면적'>
# 연도별 평당분양가격의 평균을 구하고 선그래프로 시각화 합니다.
df_last.groupby("연도").평당분양가격.mean().plot()
<AxesSubplot:xlabel='연도'>
df_last.head(1)
지역명 | 연도 | 월 | 분양가격 | 평당분양가격 | 전용면적 | |
---|---|---|---|---|---|---|
0 | 서울 | 2015 | 10 | 5841.0 | 19275.3 | 전체 |
# 월,연도별 평당분양가격 평균을 구하는 피벗테이블을 박스플롯으로 그리기
df_last.pivot_table(index="월",columns="연도", values="평당분양가격").plot.box()
<AxesSubplot:>
# 월, 연도,전용면적별 평당분양가격 평균을 구하는 피벗테이블을 박스플롯으로 그리기
df_last.pivot_table(index="월", columns=["연도","전용면적"],
values="평당분양가격").plot.box(figsize=(15,5), rot=45)
<AxesSubplot:>
# 연도, 지역별 평당분양가격 평균을 구하는 피벗테이블을 선그래프로 그리기
df_last.pivot_table(index="연도", columns="지역명", values="평당분양가격").plot(figsize=(15,5))
# 그래프의 밖에 legend 표시하도록 설정
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
<matplotlib.legend.Legend at 0x153bb945e50>
Seaborn 으로 시각화 해보기¶
# 라이브러리 임포트
import seaborn as sns
# barplot으로 지역별 평당분양가격을 그려봅니다.
plt.figure(figsize=(15,3))
sns.barplot(data=df_last, x="지역명", y="평당분양가격")
<AxesSubplot:xlabel='지역명', ylabel='평당분양가격'>
# barplot으로 연도별 평당분양가격을 그려봅니다.
sns.barplot(data=df_last, x="연도", y="평당분양가격")
<AxesSubplot:xlabel='연도', ylabel='평당분양가격'>
# 연도별, 평당분양가격을 catplot으로 그리기
# 지역명으로 나누기
sns.catplot(data=df_last, x="연도", y="평당분양가격", kind="bar", col="지역명", col_wrap=4)
<seaborn.axisgrid.FacetGrid at 0x153bbd245b0>
df_last.head(1)
지역명 | 연도 | 월 | 분양가격 | 평당분양가격 | 전용면적 | |
---|---|---|---|---|---|---|
0 | 서울 | 2015 | 10 | 5841.0 | 19275.3 | 전체 |
# lineplot으로 연도별 평당분양가격을 그려봅니다.
# hue 옵션을 통해 지역별로 다르게 표시해 봅니다.
plt.figure(figsize=(10,5))
sns.lineplot(data= df_last, x="연도", y="평당분양가격", hue="지역명")
plt.legend(bbox_to_anchor=(1.02, 1), loc=2, borderaxespad=0.)
<matplotlib.legend.Legend at 0x153bf3bffa0>
# 연도별, 평당분양가격을 relplot으로 그리기
# 지역명으로 나누기
sns.relplot(data=df_last, x="연도", y="평당분양가격", col="지역명", hue='지역명', col_wrap=4, kind="line")
<seaborn.axisgrid.FacetGrid at 0x153bfe9b6d0>
boxplot과 violinplot¶
# 연도별 평당분양가격을 boxplot으로 그려봅니다.
sns.boxplot(data=df_last, x="연도", y="평당분양가격")
<AxesSubplot:xlabel='연도', ylabel='평당분양가격'>
# hue옵션을 주어 전용면적별로 다르게 표시해 봅니다.
plt.figure(figsize=(15,5))
sns.boxplot(data=df_last, x="연도", y="평당분양가격", hue="전용면적")
<AxesSubplot:xlabel='연도', ylabel='평당분양가격'>
# 연도별 평당분양가격을 violinplot으로 그려봅니다.
sns.violinplot(data=df_last, x="연도", y="평당분양가격")
<AxesSubplot:xlabel='연도', ylabel='평당분양가격'>
lmplot과 swarmplot¶
# 연도별 평당분양가격을 regplot으로 그려봅니다.
sns.regplot(data=df_last, x="연도", y="평당분양가격")
<AxesSubplot:xlabel='연도', ylabel='평당분양가격'>
# 연도별 평당분양가격을 lmplot으로 그려봅니다.
# hue 옵션으로 전용면적을 표현해 봅니다.
sns.lmplot(data=df_last, x="연도", y="평당분양가격", hue="전용면적", col="전용면적", col_wrap=3)
<seaborn.axisgrid.FacetGrid at 0x153c141a460>
# 연도별 평당분양가격을 전용면적 구분stripplot 으로 그려봅니다.
plt.figure(figsize=(15,5))
sns.stripplot(data=df_last, x="연도", y="평당분양가격", hue="전용면적")
<AxesSubplot:xlabel='연도', ylabel='평당분양가격'>
이상치 보기¶
# 평당분양가격의 최대값을 구해서 max_price 라는 변수에 담습니다.
max_price = df_last.평당분양가격.max()
max_price
42002.399999999994
# 서울의 평당분양가격이 특히 높은 데이터가 있습니다. 해당 데이터를 가져옵니다.
# 즉, 평당분양가격이 가장높은 데이터만 추울
df_last[(df_last.지역명=="서울")&(df_last.평당분양가격==max_price)]
지역명 | 연도 | 월 | 분양가격 | 평당분양가격 | 전용면적 | |
---|---|---|---|---|---|---|
3743 | 서울 | 2019 | 6 | 12728.0 | 42002.4 | 85㎡~102㎡ |
3828 | 서울 | 2019 | 7 | 12728.0 | 42002.4 | 85㎡~102㎡ |
3913 | 서울 | 2019 | 8 | 12728.0 | 42002.4 | 85㎡~102㎡ |
3998 | 서울 | 2019 | 9 | 12728.0 | 42002.4 | 85㎡~102㎡ |
4083 | 서울 | 2019 | 10 | 12728.0 | 42002.4 | 85㎡~102㎡ |
4168 | 서울 | 2019 | 11 | 12728.0 | 42002.4 | 85㎡~102㎡ |
4253 | 서울 | 2019 | 12 | 12728.0 | 42002.4 | 85㎡~102㎡ |
수치데이터 히스토그램 그리기¶
# 평당분양가격의 히스토그램 그리기
# 판다스로 그리기
df_last.평당분양가격.plot.hist(grid=True)
<AxesSubplot:ylabel='Frequency'>
# seaborn distplot으로 평당분양가격을 표현해 봅니다.
sns.displot(data=df_last, x="평당분양가격")
<seaborn.axisgrid.FacetGrid at 0x153c354fcd0>
sns.histplot(data=df_last, x="평당분양가격")
<AxesSubplot:xlabel='평당분양가격', ylabel='Count'>
# sns.kdeplot
sns.kdeplot(data=df_last, x="평당분양가격")
<AxesSubplot:xlabel='평당분양가격', ylabel='Density'>
# 평당분양가격의 분포를 보기위해 boxplot그리기
sns.boxplot(data=df_last, y="평당분양가격")
<AxesSubplot:ylabel='평당분양가격'>
2015년 8월 이전 데이터 보기¶
pd.options.display.max_columns = 25
# df_last.head()
df_last.head()
지역명 | 연도 | 월 | 분양가격 | 평당분양가격 | 전용면적 | |
---|---|---|---|---|---|---|
0 | 서울 | 2015 | 10 | 5841.0 | 19275.3 | 전체 |
1 | 서울 | 2015 | 10 | 5652.0 | 18651.6 | 60㎡ |
2 | 서울 | 2015 | 10 | 5882.0 | 19410.6 | 60㎡~85㎡ |
3 | 서울 | 2015 | 10 | 5721.0 | 18879.3 | 85㎡~102㎡ |
4 | 서울 | 2015 | 10 | 5879.0 | 19400.7 | 102㎡~ |
# df_first.head()
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 | 서울 | 18189 | 17925 | 17925 | 18016 | 18098 | 19446 | 18867 | 18742 | 19274 | 19404 | 19759 | 20242 | 20269 | 20670 | 20670 | 19415 | 18842 | 18367 | 18374 | 18152 | 18443 |
1 | 부산 | 8111 | 8111 | 9078 | 8965 | 9402 | 9501 | 9453 | 9457 | 9411 | 9258 | 9110 | 9208 | 9208 | 9204 | 9235 | 9279 | 9327 | 9345 | 9515 | 9559 | 9581 |
2 | 대구 | 8080 | 8080 | 8077 | 8101 | 8267 | 8274 | 8360 | 8360 | 8370 | 8449 | 8403 | 8439 | 8253 | 8327 | 8416 | 8441 | 8446 | 8568 | 8542 | 8542 | 8795 |
3 | 인천 | 10204 | 10204 | 10408 | 10408 | 10000 | 9844 | 10058 | 9974 | 9973 | 9973 | 10016 | 10020 | 10020 | 10017 | 9876 | 9876 | 9938 | 10551 | 10443 | 10443 | 10449 |
4 | 광주 | 6098 | 7326 | 7611 | 7346 | 7346 | 7523 | 7659 | 7612 | 7622 | 7802 | 7707 | 7752 | 7748 | 7752 | 7756 | 7861 | 7914 | 7877 | 7881 | 8089 | 8231 |
# df_first 변수에 담겨있는 데이터프레임의 정보를 info를 통해 봅니다.
df_first.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
# 결측치가 있는지 봅니다.
df_first.isnull().sum()
지역 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
melt로 Tidy data 만들기¶
pandas의 melt를 사용하면 데이터의 형태를 변경할 수 있습니다. df_first 변수에 담긴 데이터프레임은 df_last에 담겨있는 데이터프레임의 모습과 다릅니다. 같은 형태로 만들어주어야 데이터를 합칠 수 있습니다. 데이터를 병합하기 위해 melt를 사용해 열에 있는 데이터를 행으로 녹여봅니다.
# df_first.head(1)
df_first.head(1)
지역 | 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 | 서울 | 18189 | 17925 | 17925 | 18016 | 18098 | 19446 | 18867 | 18742 | 19274 | 19404 | 19759 | 20242 | 20269 | 20670 | 20670 | 19415 | 18842 | 18367 | 18374 | 18152 | 18443 |
# pd.melt 를 사용하며, 녹인 데이터는 df_first_melt 변수에 담습니다.
df_first_melt = pd.melt(df_first, id_vars="지역", var_name="기간", value_name="평당분양가격")
df_first_melt
지역 | 기간 | 평당분양가격 | |
---|---|---|---|
0 | 서울 | 2013년12월 | 18189 |
1 | 부산 | 2013년12월 | 8111 |
2 | 대구 | 2013년12월 | 8080 |
3 | 인천 | 2013년12월 | 10204 |
4 | 광주 | 2013년12월 | 6098 |
... | ... | ... | ... |
352 | 전북 | 2015년8월 | 6580 |
353 | 전남 | 2015년8월 | 6289 |
354 | 경북 | 2015년8월 | 7037 |
355 | 경남 | 2015년8월 | 7665 |
356 | 제주 | 2015년8월 | 7343 |
357 rows × 3 columns
# df_first_melt 변수에 담겨진 컬럼의 이름을
# ["지역명", "기간", "평당분양가격"] 으로 변경합니다.
df_first_melt.columns = ["지역명", "기간", "평당분양가격"]
df_first_melt.head(1)
지역명 | 기간 | 평당분양가격 | |
---|---|---|---|
0 | 서울 | 2013년12월 | 18189 |
연도와 월을 분리하기¶
date = "2013년12월"
date
'2013년12월'
# split 을 통해 "년"을 기준으로 텍스트를 분리해 봅니다.
date.split("년")
['2013', '12월']
# 리스트의 인덱싱을 사용해서 연도만 가져옵니다.
date.split("년")[0]
'2013'
# 리스트의 인덱싱과 replace를 사용해서 월을 제거합니다.
date.split("년")[-1].replace("월", "")
'12'
# parse_year라는 함수를 만듭니다.
# 연도만 반환하도록 하며, 반환하는 데이터는 int 타입이 되도록 합니다.
def parse_year(date):
return int(date.split("년")[0])
# 제대로 분리가 되었는지 parse_year 함수를 확인합니다.
y = parse_year('2013년12월')
print(y)
print(type(y))
y
2013
<class 'int'>
2013
# parse_month 라는 함수를 만듭니다.
# 월만 반환하도록 하며, 반환하는 데이터는 int 타입이 되도록 합니다.
def parse_month(date):
return int(date.split("년")[-1].replace("월", ""))
# 제대로 분리가 되었는지 parse_month 함수를 확인합니다.
parse_month('2013년12월')
12
# df_first_melt의 '기간'열에 위에 정의한 parse_year를 적용한다.
# 결과를 새로운 '연도' 컬럼을 생성해서 대입한다.
df_first_melt["연도"] = df_first_melt["기간"].apply(parse_year)
df_first_melt.head(1)
지역명 | 기간 | 평당분양가격 | 연도 | |
---|---|---|---|---|
0 | 서울 | 2013년12월 | 18189 | 2013 |
# df_first_melt의 '기간'열에 위에 정의한 parse_month 를 적용한다.
# 결과를 새로운 '월' 컬럼을 생성해서 대입한다.
df_first_melt["월"] = df_first_melt["기간"].apply(parse_month)
df_first_melt.head(1)
지역명 | 기간 | 평당분양가격 | 연도 | 월 | |
---|---|---|---|---|---|
0 | 서울 | 2013년12월 | 18189 | 2013 | 12 |
# df_last와 병합을 하기 위해서는 컬럼의 이름이 같아야 합니다.
# sample을 활용해서 df_last데이터를 미리보기 합니다.
df_last.sample(1)
지역명 | 연도 | 월 | 분양가격 | 평당분양가격 | 전용면적 | |
---|---|---|---|---|---|---|
1348 | 경북 | 2017 | 1 | 2690.0 | 8877.0 | 85㎡~102㎡ |
df_last_prepare = df_last.loc[ df_last.전용면적=="전체", ['지역명', '연도', '월', '평당분양가격']].copy()
# 최근 데이터가 담긴 df_last 에는 전용면적이 있습니다.
# 이전 데이터에는 전용면적이 없기 때문에 df_last['전용면적']중 "전체"만 사용하도록 합니다.
# loc를 사용해서 전체에 해당하는 면적에 해당하는 데이터들의 '지역명', '연도', '월', '평당분양가격'을 추출하여
# copy로 복사해서 df_last_prepare 변수에 담습니다.
df_last_prepare.head(1)
지역명 | 연도 | 월 | 평당분양가격 | |
---|---|---|---|---|
0 | 서울 | 2015 | 10 | 19275.3 |
df_first_prepare = df_first_melt[['지역명', '연도', '월', '평당분양가격']].copy()
# df_first_melt에서 공통된 컬럼['지역명', '연도', '월', '평당분양가격']만 가져온 뒤
# copy로 복사해서 df_first_prepare 변수에 담습니다.
df_first_prepare.head(1)
지역명 | 연도 | 월 | 평당분양가격 | |
---|---|---|---|---|
0 | 서울 | 2013 | 12 | 18189 |
concat 으로 데이터 합치기¶
# df_first_prepare 와 df_last_prepare 를 합쳐 df를 만듭니다.
df = pd.concat([df_first_prepare, df_last_prepare])
df.head(3)
지역명 | 연도 | 월 | 평당분양가격 | |
---|---|---|---|---|
0 | 서울 | 2013 | 12 | 18189.0 |
1 | 부산 | 2013 | 12 | 8111.0 |
2 | 대구 | 2013 | 12 | 8080.0 |
# df의 행,열
df.shape
(1224, 4)
# 제대로 합쳐졌는지 미리보기를 합니다.
df
지역명 | 연도 | 월 | 평당분양가격 | |
---|---|---|---|---|
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
# 연도별로 데이터가 몇개씩 있는지 value_counts를 통해 세어봅니다.
# sort=False옵션
df.연도.value_counts(sort=False)
2013 17
2014 204
2015 187
2016 204
2017 204
2018 204
2019 204
Name: 연도, dtype: int64
pivot_table 사용하기¶
df데이터 이용
# 연도를 인덱스로, 지역명을 컬럼으로 평당분양가격을 피봇테이블로 그려봅니다.
# 소수점반올림 round()
df_p = pd.pivot_table(data=df, index="연도", columns="지역명", values="평당분양가격").round()
df_p
지역명 | 강원 | 경기 | 경남 | 경북 | 광주 | 대구 | 대전 | 부산 | 서울 | 세종 | 울산 | 인천 | 전남 | 전북 | 제주 | 충남 | 충북 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
연도 | |||||||||||||||||
2013 | 6230.0 | 10855.0 | 6473.0 | 6168.0 | 6098.0 | 8080.0 | 8321.0 | 8111.0 | 18189.0 | 7601.0 | 8090.0 | 10204.0 | 5678.0 | 6282.0 | 7674.0 | 6365.0 | 6589.0 |
2014 | 6332.0 | 10509.0 | 6729.0 | 6536.0 | 7588.0 | 8286.0 | 8240.0 | 9180.0 | 18997.0 | 8085.0 | 8362.0 | 10075.0 | 5719.0 | 6362.0 | 7855.0 | 6682.0 | 6620.0 |
2015 | 6831.0 | 10489.0 | 7646.0 | 7035.0 | 7956.0 | 8707.0 | 8105.0 | 9633.0 | 19283.0 | 8641.0 | 9273.0 | 10277.0 | 6109.0 | 6623.0 | 7465.0 | 7024.0 | 6700.0 |
2016 | 7011.0 | 11220.0 | 7848.0 | 7361.0 | 8899.0 | 10310.0 | 8502.0 | 10430.0 | 20663.0 | 8860.0 | 10209.0 | 10532.0 | 6489.0 | 6418.0 | 9129.0 | 7331.0 | 6770.0 |
2017 | 7127.0 | 11850.0 | 8120.0 | 7795.0 | 9464.0 | 11456.0 | 9045.0 | 11578.0 | 21376.0 | 9135.0 | 11345.0 | 10737.0 | 7188.0 | 7058.0 | 10831.0 | 7456.0 | 6763.0 |
2018 | 7681.0 | 13186.0 | 9019.0 | 8505.0 | 9856.0 | 12076.0 | 10180.0 | 12998.0 | 22889.0 | 10355.0 | 10241.0 | 11274.0 | 7789.0 | 7626.0 | 11891.0 | 8013.0 | 7874.0 |
2019 | 8142.0 | 14469.0 | 9871.0 | 8857.0 | 11823.0 | 13852.0 | 11778.0 | 13116.0 | 26131.0 | 11079.0 | 10022.0 | 12635.0 | 7902.0 | 8197.0 | 12138.0 | 8607.0 | 7575.0 |
# 위에서 그린 피봇테이블을 히트맵으로 표현해 봅니다.
plt.figure(figsize=(15,5))
sns.heatmap(data=df_p, cmap="Blues", annot=True, fmt=".0f")
<AxesSubplot:xlabel='지역명', ylabel='연도'>
# transpose 를 사용하면 행과 열을 바꿔줄 수 있습니다.
df_p.transpose()
연도 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 |
---|---|---|---|---|---|---|---|
지역명 | |||||||
강원 | 6230.0 | 6332.0 | 6831.0 | 7011.0 | 7127.0 | 7681.0 | 8142.0 |
경기 | 10855.0 | 10509.0 | 10489.0 | 11220.0 | 11850.0 | 13186.0 | 14469.0 |
경남 | 6473.0 | 6729.0 | 7646.0 | 7848.0 | 8120.0 | 9019.0 | 9871.0 |
경북 | 6168.0 | 6536.0 | 7035.0 | 7361.0 | 7795.0 | 8505.0 | 8857.0 |
광주 | 6098.0 | 7588.0 | 7956.0 | 8899.0 | 9464.0 | 9856.0 | 11823.0 |
대구 | 8080.0 | 8286.0 | 8707.0 | 10310.0 | 11456.0 | 12076.0 | 13852.0 |
대전 | 8321.0 | 8240.0 | 8105.0 | 8502.0 | 9045.0 | 10180.0 | 11778.0 |
부산 | 8111.0 | 9180.0 | 9633.0 | 10430.0 | 11578.0 | 12998.0 | 13116.0 |
서울 | 18189.0 | 18997.0 | 19283.0 | 20663.0 | 21376.0 | 22889.0 | 26131.0 |
세종 | 7601.0 | 8085.0 | 8641.0 | 8860.0 | 9135.0 | 10355.0 | 11079.0 |
울산 | 8090.0 | 8362.0 | 9273.0 | 10209.0 | 11345.0 | 10241.0 | 10022.0 |
인천 | 10204.0 | 10075.0 | 10277.0 | 10532.0 | 10737.0 | 11274.0 | 12635.0 |
전남 | 5678.0 | 5719.0 | 6109.0 | 6489.0 | 7188.0 | 7789.0 | 7902.0 |
전북 | 6282.0 | 6362.0 | 6623.0 | 6418.0 | 7058.0 | 7626.0 | 8197.0 |
제주 | 7674.0 | 7855.0 | 7465.0 | 9129.0 | 10831.0 | 11891.0 | 12138.0 |
충남 | 6365.0 | 6682.0 | 7024.0 | 7331.0 | 7456.0 | 8013.0 | 8607.0 |
충북 | 6589.0 | 6620.0 | 6700.0 | 6770.0 | 6763.0 | 7874.0 | 7575.0 |
# 바뀐 행과 열을 히트맵으로 표현해 봅니다.
plt.figure(figsize=(15,5))
sns.heatmap(data=df_p.transpose(), cmap="Blues", annot=True, fmt=".0f")
<AxesSubplot:xlabel='연도', ylabel='지역명'>
# "연도", "지역명"별로 평당분양가격의 평균을 groupby로 구하기
# 반올림
df_g = df.groupby(["연도","지역명"]).평당분양가격.mean().unstack().round()
df_g
지역명 | 강원 | 경기 | 경남 | 경북 | 광주 | 대구 | 대전 | 부산 | 서울 | 세종 | 울산 | 인천 | 전남 | 전북 | 제주 | 충남 | 충북 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
연도 | |||||||||||||||||
2013 | 6230.0 | 10855.0 | 6473.0 | 6168.0 | 6098.0 | 8080.0 | 8321.0 | 8111.0 | 18189.0 | 7601.0 | 8090.0 | 10204.0 | 5678.0 | 6282.0 | 7674.0 | 6365.0 | 6589.0 |
2014 | 6332.0 | 10509.0 | 6729.0 | 6536.0 | 7588.0 | 8286.0 | 8240.0 | 9180.0 | 18997.0 | 8085.0 | 8362.0 | 10075.0 | 5719.0 | 6362.0 | 7855.0 | 6682.0 | 6620.0 |
2015 | 6831.0 | 10489.0 | 7646.0 | 7035.0 | 7956.0 | 8707.0 | 8105.0 | 9633.0 | 19283.0 | 8641.0 | 9273.0 | 10277.0 | 6109.0 | 6623.0 | 7465.0 | 7024.0 | 6700.0 |
2016 | 7011.0 | 11220.0 | 7848.0 | 7361.0 | 8899.0 | 10310.0 | 8502.0 | 10430.0 | 20663.0 | 8860.0 | 10209.0 | 10532.0 | 6489.0 | 6418.0 | 9129.0 | 7331.0 | 6770.0 |
2017 | 7127.0 | 11850.0 | 8120.0 | 7795.0 | 9464.0 | 11456.0 | 9045.0 | 11578.0 | 21376.0 | 9135.0 | 11345.0 | 10737.0 | 7188.0 | 7058.0 | 10831.0 | 7456.0 | 6763.0 |
2018 | 7681.0 | 13186.0 | 9019.0 | 8505.0 | 9856.0 | 12076.0 | 10180.0 | 12998.0 | 22889.0 | 10355.0 | 10241.0 | 11274.0 | 7789.0 | 7626.0 | 11891.0 | 8013.0 | 7874.0 |
2019 | 8142.0 | 14469.0 | 9871.0 | 8857.0 | 11823.0 | 13852.0 | 11778.0 | 13116.0 | 26131.0 | 11079.0 | 10022.0 | 12635.0 | 7902.0 | 8197.0 | 12138.0 | 8607.0 | 7575.0 |
# 위내용을 heatmap으로 그려보기
plt.figure(figsize=(15,5))
sns.heatmap(df_g.T, annot=True, fmt=".0f", cmap="Greens")
<AxesSubplot:xlabel='연도', ylabel='지역명'>
# barplot 으로 연도별 평당분양가격 그리기
sns.barplot(data=df, x="연도", y="평당분양가격")
<AxesSubplot:xlabel='연도', ylabel='평당분양가격'>
# pointplot 으로 연도별 평당분양가격 그리기
sns.pointplot(data=df, x="연도", y="평당분양가격", hue="지역명")
plt.legend(bbox_to_anchor=(1.02, 1), loc=2, borderaxespad=0.)
<matplotlib.legend.Legend at 0x153c436aee0>
df[df.지역명=="서울"]
지역명 | 연도 | 월 | 평당분양가격 | |
---|---|---|---|---|
0 | 서울 | 2013 | 12 | 18189.0 |
17 | 서울 | 2014 | 1 | 17925.0 |
34 | 서울 | 2014 | 2 | 17925.0 |
51 | 서울 | 2014 | 3 | 18016.0 |
68 | 서울 | 2014 | 4 | 18098.0 |
... | ... | ... | ... | ... |
3910 | 서울 | 2019 | 8 | 26706.9 |
3995 | 서울 | 2019 | 9 | 26680.5 |
4080 | 서울 | 2019 | 10 | 26700.3 |
4165 | 서울 | 2019 | 11 | 26604.6 |
4250 | 서울 | 2019 | 12 | 26251.5 |
72 rows × 4 columns
# 서울만 barplot 으로 그리기
sns.barplot(data=df[df.지역명=="서울"], x="연도", y="평당분양가격")
<AxesSubplot:xlabel='연도', ylabel='평당분양가격'>
# 연도별 평당분양가격 boxplot 그리기
sns.boxplot(data=df, x="연도", y="평당분양가격")
<AxesSubplot:xlabel='연도', ylabel='평당분양가격'>
# 연도별 평당분양가격 violinplot 그리기
sns.violinplot(data=df, x="연도", y="평당분양가격")
<AxesSubplot:xlabel='연도', ylabel='평당분양가격'>
# 연도별 평당분양가격 stripplot 그리기
# 지역명 구분
sns.stripplot(data=df, x="연도", y="평당분양가격", hue="지역명")
plt.legend(bbox_to_anchor=(1.02, 1), loc=2, borderaxespad=0.)
<matplotlib.legend.Legend at 0x153c6915f70>
지역별 평당분양가격 보기¶
# barplot 으로 지역별 평당분양가격을 그려봅니다.
sns.barplot(data=df, x="지역명", y="평당분양가격")
<AxesSubplot:xlabel='지역명', ylabel='평당분양가격'>
# 위와 같은 그래프를 미리 연산을 하고 결과값으로 그리는 방법
# groupby 로 구하기
df.groupby("지역명",sort=False).mean().평당분양가격.plot.bar(rot="0")
<AxesSubplot:xlabel='지역명'>
df.head()
지역명 | 연도 | 월 | 평당분양가격 | |
---|---|---|---|---|
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 |
# groupby 로 했던 방법을 똑같이
# pivot_table 로 구하기
pd.pivot_table(data=df, index="지역명", values="평당분양가격", sort=False).plot.bar(rot="0")
<AxesSubplot:xlabel='지역명'>
pd.pivot_table(data=df, index="지역명", values="평당분양가격", sort=False)
평당분양가격 | |
---|---|
지역명 | |
서울 | 21543.750704 |
부산 | 11128.539437 |
대구 | 10762.745070 |
인천 | 10923.187324 |
광주 | 9235.133803 |
대전 | 9314.942254 |
울산 | 9846.438710 |
경기 | 11960.452113 |
세종 | 9347.860563 |
강원 | 7179.715493 |
충북 | 7052.671831 |
충남 | 7510.354930 |
전북 | 7042.340845 |
전남 | 6855.395775 |
경북 | 7667.684507 |
경남 | 8190.177465 |
제주 | 9874.488732 |
a= pd.pivot_table(data=df, index="지역명", values="평당분양가격", sort=False)
# 위내용으로 아래 그래프 그리기
# palette="Blues_r
sns.barplot(data=a, x=a.index, y="평당분양가격", palette="Blues_r")
<AxesSubplot:xlabel='지역명', ylabel='평당분양가격'>
# boxplot 으로 지역별 평당분양가격을 그려봅니다.
sns.boxplot(data=df, x="지역명", y="평당분양가격")
<AxesSubplot:xlabel='지역명', ylabel='평당분양가격'>
# violinplot 으로 지역별 평당분양가격을 그려봅니다.
plt.figure(figsize=(15,5))
sns.violinplot(data=df, x="지역명", y="평당분양가격")
<AxesSubplot:xlabel='지역명', ylabel='평당분양가격'>
# stripplot 으로 지역별 평당분양가격을 그려봅니다.
# 연도별구분
sns.stripplot(data=df, x="지역명", y="평당분양가격", hue="연도")
<AxesSubplot:xlabel='지역명', ylabel='평당분양가격'>
'😁 빅데이터 문제 풀기 & Study > - 이외 사이트 문제' 카테고리의 다른 글
[Pandas] Pandas 연습 문제 풀기 -8 🐼 (결측치, datetime, groupby 등) (0) | 2022.02.24 |
---|---|
[Pandas] Pandas 연습 문제 풀기 -7 🐼 (0) | 2022.02.24 |
[Pandas] Pandas 연습 문제 풀기 -6 🐼 (0) | 2022.02.23 |
[Pandas] Pandas 연습 문제 풀기 -5 🐼 (0) | 2022.02.23 |
[Pandas] Pandas 연습 문제 풀기 -4 🐼 (0) | 2022.02.22 |