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:

  1. 주피터 노트북(Jupyter notebook) - Matplotlib 한글 깨짐 현상 해결
  2. matplotlib/seaborn으로 시각화할 때 한글 폰트 깨짐현상 해결방법

Jupyter Notebook에서 그래프를 그릴 때 한글 깨짐 현상이 발생한다

1
df.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x179eb070ac8>

png

우리는 설정 파일을 수정하여 한글 폰트를 영구 등록함으로써 이 문제를 해결할 수 있다


(1) 설정 파일 위치 찾기

1
2
3
4
import matplotlib as mpl

#font 설정 파일 위치 출력
mpl.matplotlib_fname()
'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
2
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (8, 5)

설정을 완료한 후 jupyter notebook의 kernel을 리셋하고 다시 그래프를 그리면,
한글폰트가 깨지지 않고 잘 출력되는 것을 확인하실 수 있다.

1
df.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x179f01b0c48>

png



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
2
# index - 분양가
df["분양가"].plot(kind = 'line')
<matplotlib.axes._subplots.AxesSubplot at 0x179f01a0bc8>

png


(2) 연도에 따른 서울 분양가 변화 추세

1
2
3
# select "서울" data
df_seoul = df.loc[df["지역"] == "서울"]
df_seoul
지역 규모 연도 분양가
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
2
3
# group by "year" 
df_seoul_year = df_seoul.groupby('연도').mean()
df_seoul_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
2
# line plot
df_seoul_year["분양가"].plot(kind = 'line')
<matplotlib.axes._subplots.AxesSubplot at 0x179f028b5c8>

png


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
2
# 수직 바 그래프
df.groupby("지역")["분양가"].mean().plot(kind = 'bar')
<matplotlib.axes._subplots.AxesSubplot at 0x179f028b548>

png


1
2
# 수평 바 그래프
df.groupby("지역")["분양가"].mean().plot(kind = 'barh')
<matplotlib.axes._subplots.AxesSubplot at 0x179edd9d4c8>

png


히스토그램 (hist)

히스토그램은 분포-빈도 를 시각화하여 보여준다.
가로축에는 분포를, 세로축에는 빈도가 시각화되어 보여짐.


1
df["분양가"].plot(kind = "hist")
<matplotlib.axes._subplots.AxesSubplot at 0x179f021cc88>

png


커널 밀도 그래프 (kde)

  • 히스토그램과 유사하게 밀도를 보여주는 그래프다
  • 히스토그램과 유사한 모양새를 각추고 있다
  • 하지만 히스토그램과 다르게 부드러운 라인을 가지고 있다

1
df["분양가"].plot(kind = "kde")
<matplotlib.axes._subplots.AxesSubplot at 0x179f043d608>

png


고밀도 산점도 그래프 (hexbin)

  • hexbin은 고밀고 산점도 그래프다
  • x와 y 키 값을 넣어 주어야 한다
  • x, y 값 모두 numeric value 이어야한다
  • 데이터의 밀도를 추정한다

1
df.plot(kind = "hexbin", x = "분양가", y = "연도", gridsize = 20)
<matplotlib.axes._subplots.AxesSubplot at 0x179f028a9c8>

png


박스 플롯 (box)

1
df_seoul = df.loc[df["지역"] == "서울"]
1
df_seoul["분양가"].plot(kind = "box")
<matplotlib.axes._subplots.AxesSubplot at 0x179f226d748>

png


box plot 해석

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>

png


1
df.groupby("월")["분양가"].count().plot(kind = "area")
<matplotlib.axes._subplots.AxesSubplot at 0x179f2267588>

png


파이 그래프 (pie plot)

pie는 대표적으로 데이터의 점유율을 보유줄 때 유용하다


연도별 분양가 데이터 점유율

1
df.groupby("연도")["분양가"].count().plot(kind = 'pie')
<matplotlib.axes._subplots.AxesSubplot at 0x179f224fec8>

png


산점도 그래프 (scatter plot)

  • 점으로 데이터를 표기해준다
  • x, y값을 넣어주어야한다 (hexbin과 유사)
  • x축과 y축을 지정해주면 그에 맞는 데이터 분포를 볼 수 있다
  • 역시 numeric column 만 지정할 수 있다

1
df.plot(x = "월", y = "분양가", kind = "scatter")
<matplotlib.axes._subplots.AxesSubplot at 0x179f23372c8>

png