Pandas - 데이터 시각화
1 | import pandas as pd |
1 | df = pd.read_csv("house_price_clean.csv") |
1 | df |
지역 | 규모 | 연도 | 월 | 분양가 | |
---|---|---|---|---|---|
0 | 서울 | 60㎡이하 | 2015 | 10 | 5652 |
1 | 서울 | 60㎡초과 85㎡이하 | 2015 | 10 | 5882 |
2 | 서울 | 85㎡초과 102㎡이하 | 2015 | 10 | 5721 |
3 | 서울 | 102㎡초과 | 2015 | 10 | 5879 |
4 | 인천 | 60㎡이하 | 2015 | 10 | 3488 |
... | ... | ... | ... | ... | ... |
3288 | 경남 | 60㎡초과 85㎡이하 | 2020 | 2 | 3065 |
3289 | 경남 | 85㎡초과 102㎡이하 | 2020 | 2 | 3247 |
3290 | 제주 | 60㎡이하 | 2020 | 2 | 4039 |
3291 | 제주 | 60㎡초과 85㎡이하 | 2020 | 2 | 3962 |
3292 | 제주 | 102㎡초과 | 2020 | 2 | 3601 |
3293 rows × 5 columns
0. 준비 – 한글폰트 깨짐현상 해결
reference:
Jupyter Notebook에서 그래프를 그릴 때 한글 깨짐 현상이 발생한다
1 | df.plot() |
<matplotlib.axes._subplots.AxesSubplot at 0x179eb070ac8>
우리는 설정 파일을 수정하여 한글 폰트를 영구 등록함으로써 이 문제를 해결할 수 있다
(1) 설정 파일 위치 찾기
1 | import matplotlib as mpl |
'D:\\Anaconda\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc'
(2) 설정 파일 수정하기
맨 마지막 matplotlibrc 는 우리가 수정해야할 파일의 이름이다
-
step 1. 한글 폰트 적용
수정전: # font.family : sans-serif
수정후: font.family : Malgun Gothic -
step 2. minus 깨짐 방지
수정전: # axes.unicode_minus : True ## use unicode for the minus symbol
수정후: axes.unicode_minus : False ## use unicode for the minus symbol
(3) Tip: 전역으로 시각화 figsize 조절
1 | import matplotlib.pyplot as plt |
설정을 완료한 후 jupyter notebook의 kernel을 리셋하고 다시 그래프를 그리면,
한글폰트가 깨지지 않고 잘 출력되는 것을 확인하실 수 있다.
1 | df.plot() |
<matplotlib.axes._subplots.AxesSubplot at 0x179f01b0c48>
1. Plot 그래프
df_name [ col_name ] .plot ( kind = ‘…’ )
- plot은 일반 선그래프를 나타난다
- kind 옵션을 통해 원하는 그패프를 그릴 수 있다
kind 옵션:
-
line: 선 그래프
-
bar: 바 그래프
-
barh: 수평 바 프래프
-
hist: 히스토르램
-
kde: 커널 밀도 그래프
-
hexbin: 고밀도 산점도 그래프
-
box: 박스 플롯
-
area: 면적 그래프
-
pie: 파이 그래프
-
scatter: 산점도 그래프
line 그래프
line 그래프는 데이터가 연속적인 경우 사용하기 적절하다. (예를 들면, 주가 데이터)
1 | df |
지역 | 규모 | 연도 | 월 | 분양가 | |
---|---|---|---|---|---|
0 | 서울 | 60㎡이하 | 2015 | 10 | 5652 |
1 | 서울 | 60㎡초과 85㎡이하 | 2015 | 10 | 5882 |
2 | 서울 | 85㎡초과 102㎡이하 | 2015 | 10 | 5721 |
3 | 서울 | 102㎡초과 | 2015 | 10 | 5879 |
4 | 인천 | 60㎡이하 | 2015 | 10 | 3488 |
... | ... | ... | ... | ... | ... |
3288 | 경남 | 60㎡초과 85㎡이하 | 2020 | 2 | 3065 |
3289 | 경남 | 85㎡초과 102㎡이하 | 2020 | 2 | 3247 |
3290 | 제주 | 60㎡이하 | 2020 | 2 | 4039 |
3291 | 제주 | 60㎡초과 85㎡이하 | 2020 | 2 | 3962 |
3292 | 제주 | 102㎡초과 | 2020 | 2 | 3601 |
3293 rows × 5 columns
(1) 모든 observation의 분양가 살펴보기
1 | # index - 분양가 |
<matplotlib.axes._subplots.AxesSubplot at 0x179f01a0bc8>
(2) 연도에 따른 서울 분양가 변화 추세
1 | # select "서울" data |
지역 | 규모 | 연도 | 월 | 분양가 | |
---|---|---|---|---|---|
0 | 서울 | 60㎡이하 | 2015 | 10 | 5652 |
1 | 서울 | 60㎡초과 85㎡이하 | 2015 | 10 | 5882 |
2 | 서울 | 85㎡초과 102㎡이하 | 2015 | 10 | 5721 |
3 | 서울 | 102㎡초과 | 2015 | 10 | 5879 |
64 | 서울 | 60㎡이하 | 2015 | 11 | 6320 |
... | ... | ... | ... | ... | ... |
3178 | 서울 | 102㎡초과 | 2020 | 1 | 8779 |
3234 | 서울 | 60㎡이하 | 2020 | 2 | 8193 |
3235 | 서울 | 60㎡초과 85㎡이하 | 2020 | 2 | 8140 |
3236 | 서울 | 85㎡초과 102㎡이하 | 2020 | 2 | 13835 |
3237 | 서울 | 102㎡초과 | 2020 | 2 | 9039 |
212 rows × 5 columns
1 | # group by "year" |
월 | 분양가 | |
---|---|---|
연도 | ||
2015 | 11.0 | 6201.000000 |
2016 | 6.5 | 6674.520833 |
2017 | 6.5 | 6658.729167 |
2018 | 6.5 | 7054.687500 |
2019 | 6.5 | 8735.083333 |
2020 | 1.5 | 9647.375000 |
1 | # line plot |
<matplotlib.axes._subplots.AxesSubplot at 0x179f028b5c8>
bar 그래프
bar 그패프는 그룹별로 비교할 때 유용하다
지역별 평균 분양가 살펴보기
1 | df.groupby("지역")["분양가"].mean() |
지역
강원 2448.156863
경기 4133.952830
경남 2858.932367
경북 2570.465000
광주 3055.043750
대구 3679.620690
대전 3176.127389
부산 3691.981132
서울 7308.943396
세종 2983.543147
울산 2990.373913
인천 3684.302885
전남 2326.250000
전북 2381.416268
제주 3472.677966
충남 2534.950000
충북 2348.183962
Name: 분양가, dtype: float64
1 | # 수직 바 그래프 |
<matplotlib.axes._subplots.AxesSubplot at 0x179f028b548>
1 | # 수평 바 그래프 |
<matplotlib.axes._subplots.AxesSubplot at 0x179edd9d4c8>
히스토그램 (hist)
히스토그램은 분포-빈도 를 시각화하여 보여준다.
가로축에는 분포를, 세로축에는 빈도가 시각화되어 보여짐.
1 | df["분양가"].plot(kind = "hist") |
<matplotlib.axes._subplots.AxesSubplot at 0x179f021cc88>
커널 밀도 그래프 (kde)
- 히스토그램과 유사하게 밀도를 보여주는 그래프다
- 히스토그램과 유사한 모양새를 각추고 있다
- 하지만 히스토그램과 다르게 부드러운 라인을 가지고 있다
1 | df["분양가"].plot(kind = "kde") |
<matplotlib.axes._subplots.AxesSubplot at 0x179f043d608>
고밀도 산점도 그래프 (hexbin)
- hexbin은 고밀고 산점도 그래프다
- x와 y 키 값을 넣어 주어야 한다
- x, y 값 모두 numeric value 이어야한다
- 데이터의 밀도를 추정한다
1 | df.plot(kind = "hexbin", x = "분양가", y = "연도", gridsize = 20) |
<matplotlib.axes._subplots.AxesSubplot at 0x179f028a9c8>
박스 플롯 (box)
1 | df_seoul = df.loc[df["지역"] == "서울"] |
1 | df_seoul["분양가"].plot(kind = "box") |
<matplotlib.axes._subplots.AxesSubplot at 0x179f226d748>
box plot 해석
-
IQR (Inter Quantile Range) = 3Q - 1Q
-
Upper fence = 75th Percentile + 1.5*IQR
-
Lower fence = 25th Percentile - 1.5*IQR
box plot은 데이터 outlier 감지할 때 가장 많이 활용되며, 25%, median, 75% 분위값을 활용하는 용도로도 많이 활용된다
area plot
area plot은 line 그래프에서 아래 area를 모두 색칠해 주는 것이 특징이다.
1 | df |
지역 | 규모 | 연도 | 월 | 분양가 | |
---|---|---|---|---|---|
0 | 서울 | 60㎡이하 | 2015 | 10 | 5652 |
1 | 서울 | 60㎡초과 85㎡이하 | 2015 | 10 | 5882 |
2 | 서울 | 85㎡초과 102㎡이하 | 2015 | 10 | 5721 |
3 | 서울 | 102㎡초과 | 2015 | 10 | 5879 |
4 | 인천 | 60㎡이하 | 2015 | 10 | 3488 |
... | ... | ... | ... | ... | ... |
3288 | 경남 | 60㎡초과 85㎡이하 | 2020 | 2 | 3065 |
3289 | 경남 | 85㎡초과 102㎡이하 | 2020 | 2 | 3247 |
3290 | 제주 | 60㎡이하 | 2020 | 2 | 4039 |
3291 | 제주 | 60㎡초과 85㎡이하 | 2020 | 2 | 3962 |
3292 | 제주 | 102㎡초과 | 2020 | 2 | 3601 |
3293 rows × 5 columns
1 | df.groupby("월")["분양가"].count().plot(kind = "line") |
<matplotlib.axes._subplots.AxesSubplot at 0x179f22a6688>
1 | df.groupby("월")["분양가"].count().plot(kind = "area") |
<matplotlib.axes._subplots.AxesSubplot at 0x179f2267588>
파이 그래프 (pie plot)
pie는 대표적으로 데이터의 점유율을 보유줄 때 유용하다
연도별 분양가 데이터 점유율
1 | df.groupby("연도")["분양가"].count().plot(kind = 'pie') |
<matplotlib.axes._subplots.AxesSubplot at 0x179f224fec8>
산점도 그래프 (scatter plot)
- 점으로 데이터를 표기해준다
- x, y값을 넣어주어야한다 (hexbin과 유사)
- x축과 y축을 지정해주면 그에 맞는 데이터 분포를 볼 수 있다
- 역시 numeric column 만 지정할 수 있다
1 | df.plot(x = "월", y = "분양가", kind = "scatter") |
<matplotlib.axes._subplots.AxesSubplot at 0x179f23372c8>