본문 바로가기
Data Science

[matplotlib] colormap 형태의 산점도와 선형 회귀식, 그리고 오차 표현

by 루크 Luke 2021. 10. 13.
반응형

- 지난 시간에 배운 산점도(plt.scatter())를 활용해서 data_result의 인구수와 소계를 표현

산점도를 찍어낼 data_result 데이터프레임은 위와 같다.

def drawGraph():
    plt.figure(figsize=(14,10))
    plt.scatter(
    	data_result["인구수"],
        data_result["소계"],
        s=50
    )
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.grid()
    plt.show()
    
drawGraph()

 

 

산점도는 위와 같이 표현된다.

 

선형회귀, Linear Regression

- numpy에서 지원하고 있기 때문에, 항상 import numpy as np를 불러주고 시작한다.

- np.polyfit(x, y, 차수) : 선형회귀식의 각 계수를 찾는 함수

- np.poly1d(계수) : 계수를 넣으면 선형회귀식을 만들어주는 함수

- 이를 활용해서, data_result의 인구수와 소계의 관계를 보여주는 선형회귀식을 만들어봤다.

fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)  # x, y, 1차를 각각 넣고
f1 = np.poly1d(fp1)  # 그 계수를 넣어서 회귀식을 만들고
f1(400000)  # 인구 40만 명일 때의 CCTV 소계를 구할 수 있다.

- 이 회귀식을 산점도에 추가하기 위해서, x데이터를 생성하고, 아까 그 그래프에 회귀식을 추가한다.

- x데이터 추가는, np.linspace()를 활용한다.

fx = np.linspace(100000, 700000, 100)  # 1만부터 7만까지 100개의 등간격 데이터 생성
def drawGraph():
    plt.figure(figsize=(14,10))
    plt.scatter(data_result["인구수"], data_result["소계"], s=50)  # 점 크기를 50으로 잡았다.
    plt.plot(fx, f1(fx), linestyle="dashed", linewidth=3, color="green")
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.grid()
    plt.show()

drawGraph()

- 그려놓고 보니까, 회귀식이 데이터들을 대표한다고 보기가 애매한 점들이 있다.

- 이런 점들에 별도의 조치를 하기 위해서는, 실제 값과 회귀식 값과의 차를 '오차'로 정리해두자.

data_result["오차"] = data_result["소계"] - f1(data_result["인구수"])
data_result.head()

오차 컬럼이 추가된 것을 알 수 있다.

- 오차는 양의 값도 가지고, 음의 값도 가진다. 양으로 5개, 음으로 5개의 값에 특수한 장치를 하기 위해서,

- 내림차순(큰 순), 오름차순(작은 순) 정리한 데이터프레임을 각각 만든다.

# 내림차순
df_sort_f = data_result.sort_values(by="오차", ascending=False)
# 오름차순
df_sort_t = data_result.sort_values(by="오차", ascending=True)

- 컬러맵(with 컬러바) 형태의 산점도와 회귀식을 함께 그려보자. 오차 상하위 10개는 특별히 점 옆에 해당 구 이름을 넣어보았다.

- 기본 컬러맵은 자동으로 제공되지만, 우리는 구글에 있는 hex color를 따와서 그려봤다.

- ListedColormap을 임포트하자.

- 그래프에 글자를 넣으려면 plt.text()를 이용한다.

from matplotlib.colors import ListedColormap
color_step = ["#3273a8", "#3252a8", "#3632a8", "#7132a8", "#661d45"]  # HEX color picker 구글에 치면 바로 나온다. 6개의 컬러를 선택하자.
my_cmap = ListedColormap(color_step)  # 우리가 골라온 색상을 넣어서 컬러맵 색 만들기

def drawGraph():
    plt.figure(figsize=(14,10))
    plt.scatter(
    	data_result["인구수"], 
        data_result["소계"], 
        s=50, 
        c=data_result["오차"],  # 컬러는 오차 기준으로 적용하고,
        cmap=my_cmap  # 컬러맵 옵션은 우리가 골라온 my_cmap으로
    )
    plt.plot(fx, f1(fx), linestyle="dashed", color="grey")
    
    # 오차 상하위 10개는 특별히 구 이름 명시
    # plt.text(x좌표, y좌표, 텍스트, fontsize=X)
    # 좌표 그대로 들어가면, 점이랑 겹치니까, 1.02, 0.08배해서 글자 보이도록 지정
    
    for n in range(5):
    	plt.text(df_sort_f["인구수"][n]*1.02, df_sort_f["소계"][n]*0.08, df_sort_f.index[n], fontsize=15)
    for n in range(5):
    	plt.text(df_sort_t["인구수"][n]*1.02, df_sort_t["소계"][n]*0.08, df_sort_t.index[n], fontsize=15)
        
    plt.grid()
    plt.colorbar()
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.show()

위와 같이 출력된다.

- 편집한 데이터프레임을 csv 파일로 저장한다.

data_result.to_csv("../ds_study/data/01. CCTV.result.csv", sep=',', encoding="utf-8")

 

 


시각화 셋째 날 후기

데이터를 우리가 직관적으로 볼 수 있도록 하는 시각화는 정말 강력하다.

데이터 분석에 무조건 필요하다는 느낌이 든다.

더 많은 모듈과 기술들을 바탕으로, 함께하는 이들에게 효과적으로 의사전달을 하고 싶다.

 

 

- 네카라쿠배 데이터사이언스 오프라인 1기 수강 中

https://zero-base.co.kr/

 

제로베이스 - 밑바닥부터 끝까지 듣는 온라인 강의

무조건 간다! 개발자 스쿨 '네카라쿠배', 끝까지 공부하는 '온라인 완주반', 전문가가 베스트셀러를 해석해 주는 '한달한권' 등 교육 서비스로 삶의 전환점을 제공하는 제로베이스입니다.

zero-base.co.kr

 

반응형

댓글