CCTV 데이터와 그래프로 표현하기
import matplotlib.pyplot as plot
import matplotlib as mpl
from matplotlib import rc
plt.rcParams["axes.unicode_minus"] = False #마이너스 부호 때문에 한글이 깨질 수 있어 주는 설정
rc("front",family="Malgun Gothic")
%matplotlib inline
def drawGraph():
data_result["CCTV비율"].sort_values().plot(
kind="barh",
grid=True,
title="가장 CCTV가 많은 구",
figsize=(10, 10)
);
데이터 경향 표시
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()
Numpy를 이용한 1차 직선만들기
np.polyfit
: 직선을 구성하기 위한 계수 계산(numpy에서 데이터를 1차 함수로 표현하고자 할 때 계수를 찾아주는 명령어)np.poly1d1
: polyfit으로 찾은 계수로 python에서 사용할 수 있는 함수로 만들어 줌 import numpy as np
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
fp1
인구가 40만인 구에서 서울시의 전체 경량에 맞는 적당한 CCTV 수?
데이터의 경향을 직선으로 표현하기
np.linspace(a, b, n)
: a부터 b까지 n개의 등간격 데이터 생성 fx = np.linspace(100000, 700000, 100)
그래프 그리기
def drawGraph():
plt.figure(figsize=(14, 10))
plt.scatter(data_result["인구수"], data_result["소계"], s=50)
plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g")
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.grid()
plt.show()
drawGraph()
강조하고 싶은 데이터 시각화
f1(data_result["인구수"]
data_result["소계"]
: 현재값 데이터 세팅
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
f1 = np.polyld(fp1)
fx = np.linspace(100000, 700000, 100)
오차
data_result["오차"] = data_result["소계"] - f1(data_result["인구수"])
#경향과 비교해서 데이터의 오차가 너무 나는 데이터
#경향 대비 CCTV 많이 가진 구
df_sort_f = data_result.sort_values(by="오차", ascending=False)
#경향 대비 CCTV 적게 가진 구
df_sort_t = data_result.sort_values(by="오차", ascending=True)
그래프로 나타내기
from matplotlib.colors import listedColormap
color_step = ["#e74c3c", "#2ecc71", "#95a9a6", "#2ecc71", "#3498db", "#3498db"]
my_cmap = listedColormap(color_step)
그래프 그리기
plt.text
: 글자를 찍는 함수(좌표 주기)df_sort_f["인구수"][n] * 1.02
df_sort_f["소계"][n] * 0.98
df_sort_f.index[n]
: 넣을 이름fontsize = 15
: 폰트 사이즈s
: 마커의 크기c
: color 세팅에 방금 계산한 경향과의 오차 적용 cmap
: 사용자 정의한 맵을 적용 def drawGraph():
plt.figure(figsize=(14, 10))
plt.scatter(data_result["인구수"], data_result["소계"], c=data_result["오차"], s=50, cmap=my_cmap)
plt.plot(fx, f1(fx), ls="dashed", lw=3, color="grey")
for n in range(5):
plt.text(
df_sort_f["인구수"][n] * 1.02,
df_sort_f["소계"][n] * 0.98,
df_sort_f.index[n],
fontsize=15,
)
plt.text(
df_sort_t["인구수"][n] * 1.02,
df_sort_t["소계"][n] * 0.98,
df_sort_t.index[n],
fontsize=15,
)
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.colorbar()
plt.grid()
plt.show()