앞서 인구대비 CCTV 개수도 그리고 경향도 표현했지만, 그래프 자체로는 아직 부족하다.
직선으로 표현한 값 -> 예측값
직선 위에 점이 있으면 예측값과 실제값이 일치하여 오차가 '0'이다.
반면, 직선과 점의 거리가 멀수록 오차가 크다.
여기서 오차가 많은 구를 찾아볼 것이다.
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
f1 = np.poly1d(fp1)
fx = np.linspace(100000, 700000, 100)
data_result.head(3)
data_result["오차"] = data_result["소계"] - f1(data_result["인구수"])
data_result.head(1)
df_sort_f = data_result.sort_values(by="오차", ascending=False) # 내림차순
df_sort_t = data_result.sort_values(by="오차", ascending=True) #오름차순
# 경향 대비 CCTV를 많이 가진 구
df_sort_f.head()
# 경향 대비 CCTV를 적게 가진 구
df_sort_t.head()
from matplotlib.colors import ListedColormap # 색깔을 지정하기 위해
# colormap 을 사용자 정의(user define)로 세팅
color_step = ["#e74c3c", "#2ecc71", "#95a5a6", "#2ecc71", "#3498db", "#3498db"]
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)
plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g")
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.colorbar()
plt.grid(True)
plt.show()
drawGraph()
data_result.head()
가장 첫 번째 인구수
data_result["인구수"][0] # 가장 첫 번째 인구수
-> 561052
가장 첫 번째 CCTV 개수
data_result["소계"][0] # 가장 첫 번째 CCTV 개수
-> 3238
가장 첫 번쨰 인덱스
data_result.index[0] # 가장 첫 번쨰 인덱스
-> '강남구'
def drawGraph():
plt.figure(figsize=(14, 10))
plt.scatter(data_result["인구수"], data_result["소계"], s=50, c=data_result["오차"], cmap=my_cmap)
plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g")
for n in range(5):
# 상위 5개
plt.text(
df_sort_f["인구수"][n] * 1.02, # x 좌표
df_sort_f["소계"][n] * 0.98, # y 좌표
df_sort_f.index[n], # title
fontsize=15,
)
# 하위 5개
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(True)
plt.show()
drawGraph()
data_result.to_csv("../data/01. CCTV_result.csv", sep=",", encoding="utf-8")