- 지난 시간에 배운 산점도(plt.scatter())를 활용해서 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기 수강 中
'Data Science' 카테고리의 다른 글
[seaborn] 데이터 정리 및 다양한 시각화 실행 (0) | 2021.10.14 |
---|---|
[pandas.pivot_table] 피봇테이블, 개꿀. (0) | 2021.10.13 |
[matplotlib] 데이터 다듬어서 간단한 시각화 다뤄보기 (0) | 2021.10.13 |
[pandas] DataFrame(데이터프레임) 쪽지시험;Quiz 후기 (0) | 2021.10.07 |
[Pandas] DataFrame(데이터프레임) 알아보기 (0) | 2021.10.06 |
댓글