데이터분석/미니프로젝트 01. 서울시 CCTV 현황 분석

미니프로젝트 01-01-05. CCTV 데이터와 그래프로 표현하기(데이터시각화)

책다니엘 2024. 3. 22. 23:52

1. 지금까지 jupyter notebook(또는 vsc)를 이용하여, pandas라는 라이브러리를 통해 활용한 데이터를 matplotlib으로 시각화하였다. 이는 마치 웹개발에서 Spring Boot나 vsc를 이용하여 javascript, React, html5 등을 통해 코드를 작성하고 css로 시각화해주는 작업과 비슷하다고 느꼈다.

 

2. css의 활용 경험으로 생각해보면 matplotlib을 이용한 데이터 시각화는 좀 더 쉽게 이해할 수 있다. 먼저 plt.rcParams[]을 이용해 font family를 정해주어 한국어 사용 환경에서 폰트가 깨지지 않도록 해준다. .plot(figsize=(n,m)) 기능을 통해 데이터 시각화를 할 필드를 만들어준다. .plot(kind = '')를 통해 데이터 시각화를 할 방식(차트, 파이, 바 등)을 정해준다. 마지막으로 .show()를 통해 데이터를 시각화한다.

 

3. Pandas DataFrame은 데이터 변수에서 바로 plot()명령을 사용할 수 있다. 데이터(컬럼)가 많은 경우, 정렬한 후 그리는 것이 효과적일 때가 많다.

이렇게 데이터들을 단순시각화하는 것만으로는 부족하다.

 

'CCTV가 제일 많은 구'라는 제목으로, '총계'에 따라 데이터를 정렬하면 훨씬 보기 좋다.

 

지금까지 본 데이터에 따르면, 단순 CCTV 수와 인구대비 비율을 볼 때
1) CCTV가 많은 구는 강남-관악-서초-은평-구로구 순이었고,
2) CCTV 비율이 제일 높은 구는 성동-강남-용산-종로-서초 순이었다. 이렇게 비율로 데이터를 보아도 전체 경향과 함께 보지 않으면 데이터를 제대로 이해시키기 어렵다.

 

4. 여기서 선형회귀라는 개념을 사용한다. 

선형회귀(Linear Regression)이란?

 

머신러닝의 목적은 데이터의 알려진 속성들을 학습하여 예측 모델을 만드는데 있다. 이때 찾아 낼 수 있는 가장 직관적이고 간단한 모델은 선(line)이다. 선형회귀란 데이터를 가장 잘 대변하는 최적의 선을 찾은 과정이다.
아래 그래프에서 검정색 점이 데이터이다. 이 데이터를 가장 잘 표현하는 선이 파란색 직선이며, 이는 일차 함수() 형태로 나타난다.

 

여기서는 Numpy를 이용해 기초적으로 사용해본다.

np.polyfit
- 직선을 구성하기 위한 계수 계산
np.poly1d
- polyfit으로 찾은 계수로, python에서 사용할 함수로 만들어 줌

 

5. 다음과 같은 함수를 통해 데이터타입을 변경해주고, 데이터를 polyfit, poly1d를 통해 선형회귀적으로 활용한다.

 

 

6. 이제 선형회귀 기능을 이용하여 경향선을 그려 보자.

 

그래프를 보면, 경향선에서 지나치게 벗어나 있는 점이 있고, 또 경향선보다 아래에 있는 점들도 있다. 이런 점들을 강조해주면, 경향선에서 벗어난 데이터들의 의미를 추가적으로 조사해볼 수도 있을 것이다. 이렇듯 그래프를 구체적으로, 효과적으로 해석하기 위해 특정 데이터를 강조해주어야 한다.

 

7. 경향에서 벗어난 데이터를 조사하기 위해 오차 컬럼을 만들어 데이터를 정렬해주자.

 

노원, 송파, 강서, 도봉, 동작 순으로 경향보다 CCTV숫자가 더 적다.

 

8. 이제 이 데이터를 시각화해주자. 오차별로 df_sort_f(양의 오차가 더 큰 순), df_sort_t(음의 오차가 더 큰 순)으로 정렬한 변수를 선언해주었다. 그리고 for n in range(5)구문으로 각각 다섯개씩을 골라 주었다. 

 

** plt.text()부분은 그래프에 텍스트를 표시하는 함수이다. 여기서 '인구수'와 '총계' 데이터부분에 1.02, 0.98을 곱해주는 이유는, 실제로 표시했을 때 점끼리 겹치거나 비슷하게 위치하는 경우 텍스트 크기가 똑같아서 가려지는 문제를 최소화해주기 위해서이다. 일부러 좌표를 아주 조금씩 어긋나게 찍는 것이다.

 

최종 결과물

이로써 파편화된 데이터를 scatter함수로 그래프에 표시하고, numpy의 polyfit과 poly1d로 선형회귀적으로 경향선을 표시한 다음, matplotlib의 .text기능으로 경향선에서 벗어난 5개의 점들을 강조해주었다.

 

9. 지금까지 인구수, CCTV 데이터를 다루고 시각화까지 하였다. 이제 이 csv파일을 새로 저장해주자.

result_data.to_csv('../data/01. result_CCTV.csv', sep=',', encoding='utf-8')