단순 CCTV 수와 인구대비 CCTV 비율을 볼 때 CCTV가 많은 구는 강남, 양천, 서초, 관악, 은평, 용산이다. 반면, CCTV 비율이 높은 구는 종로, 용산, 중구가 1위 그룹이다.
비율로 데이터를 보아도 전체 경향과 함께 보지 않으면 데이터를 제대로 이해시키 여러울 듯 하다.
따라서 경향을 파악할 필요가 있다!!
경향을 파악하기 위해서 먼저,
data_result.head()
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()
위의 그래프를 보면 인구 수가 높아질수록 CCTV가 증가하는 것이 보이긴 하다. (특별히 높거나 낮은 거를 제외하면)
이를 더 자세히 알아보기 위해서는 데이터를 하나의 직선으로 표현하여 확인해 불 수 있다. 이것을 '선형회귀(Linear Regression)'라고 한다.
데이터를 하나의 직선으로 표현하는 것을 의미한다.
numpy 가 제공하는 간단한 함수를 이용해서 1차 직선을 만들어 그래프로 비교해보자.
import numpy as np
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
fp1
-> array([1.11155868e-03, 1.06515745e+03])
x기울기가 1.11155868e-03, y절편이 1.06515745e+03이다.
f1 = np.poly1d(fp1)
f1
-> poly1d([1.11155868e-03, 1.06515745e+03])
f1에 polyfit 에서 찾은 계수를 넣어서 함수를 만들어 넣었기 때문에 변수가 아니라 함수가 된다.
f1(400000)
-> 1509.7809252413338
fx = np.linspace(100000, 700000, 100)
=> 10만부터 70만까지의 사이에 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(True)
plt.show()
drawGraph()
fx: 앞에서 정한 100개의 데이터
f1(fx): polyfit으로 만든 직선의 결괏값
lw: linewidth로, 선 굵기
인구대비 CCTV 개수도 그리고 경향도 표현했지만, 그래프 자체로는 아직 부족하다!