멀리 보는 연습

머신러닝_서울시 구별 CCTV 현황 분석 본문

빅데이터 분석 서비스/머신러닝

머신러닝_서울시 구별 CCTV 현황 분석

푸실리 2021. 8. 29. 14:54

 1차 프로젝트가 끝난 후 본격적으로 머신러닝을 배우고 있다. 실습 위주로 진행 중인데, 실습 내용을 복습할 겸 정리하면 좋을 것 같아서 하나하나 정리하면서 올려볼 예정이다. 오늘 복습해볼 내용은 서울시 구별 CCTV 현황 분석인데, 복습을 하다보니, 복습이 아니라 새롭게 공부하는 느낌이 들 정도로 유익하다는 생각이 들었다. 그만큼 수업 시간에 놓치는 게 많다는 점ㅠㅠ 하루에 8시간씩 계속 집중하면서 수업듣는 일이 얼마나 어려운지 실감하고 있다. 수료할 때까지 열심히 배워봐야 겠다.

 


 

서울시 구별 CCTV 현황 분석하기

 

pandas, matplotlib 사용하기
- 서울시 각 구별 CCTV 현황 살펴보기
- 인구대비 CCTV 비율이 높거나 낮은 지역 알아보기

- 각 구별 CCTV 예측치 확인하고 그로부터 CCTV가 과하거나 부족한 지역 시각화

 

CCTV_in_Seoul.csv
0.00MB
population_in_Seoul.xls
0.02MB

 

import numpy as np     # 라이브러리 3개 불러오기 
import pandas as pd
import matplotlib.pyplot as plt

from matplotlib import rc
rc('font', family='Malgun Gothic')   # 한글 인코딩

 

1. csv 파일 읽기 - 서울시 구별 CCTV 현황

# '경로/파일명.확장자'
CCTV_Seoul = pd.read_csv('data/CCTV_in_Seoul.csv')
CCTV_Seoul.head()  # .head() : 기본 성절된 (디폴트) 5개 값 가져오는 함수

 

컬럼이름 변경 : rename(columns) -> 딕셔너리 사용

CCTV_Seoul.rename(columns={'기관명':'구'},inplace=True)   # inplace=True => 현재 분석한 결과를 저장하는 함수, 기본값은 False로 되어있음
CCTV_Seoul.head()

 

2. 엑셀파일 읽기 - 서울시 인구 현황

pop_Seoul = pd.read_excel('data/population_in_Seoul.xls')
pop_Seoul.head()

 

 

원하는 행, 열 데이터 읽기 : header, usecols

# header : 읽고 싶은 row index(0번 부터 시작) / header=2, 행데이터 가져오기 => 2번 로우 데이터부터 읽기
# usecols : 읽고 싶은 column 선택 / usecols='B,D,G,J,N', 컬럼데이터 가져오기 => 엑셀에 B,D,G,J,N 컬럼 데이터만 읽기

pop_Seoul = pd.read_excel('data/population_in_Seoul.xls', header=2, usecols='B,D,G,J,N')   
pop_Seoul.head()

 

 

컬럼명 변경

pop_Seoul.columns = ['구','인구수','한국인수','외국인수','65세이상고령자수']
pop_Seoul.head()

 

.info() => 변수 정보 확인

 

CCTV_Seoul.info()

 

pop_Seoul.info()

 

3. 결측치 확인

pop_Seoul['인구수'].isnull()   # 결과값 True/False로 반환

 

 

# boolean 인덱싱
# -> True 값만 인덱싱 

pop_Seoul['구']

 

 

# 결측치인 값만 가져오기

pop_Seoul[ pop_Seoul['인구수'].isnull()  ]

 

결측치 삭제

pop_Seoul.drop(26, inplace=True)   # 삭제한 결과값 바로 할당하기 => inpalce=True or 변수에 할당하기
pop_Seoul

 

4. CCTV 수가 많은/적은 지역 파악하기 (각각 5개)

- 많은 지역 5개

# 값을 기준으로 정렬, 기본값 : 오름차순
# ascending= False -> 내림차순 정렬

CCTV_Seoul.sort_values(by='소계', ascending=False).head()

 

- 적은 지역 5개

CCTV_Seoul.sort_values(by='소계').head()

 

CCTV_Seoul.sort_values(by='소계', ascending=False).tail()

 

5. 데이터 병합

CCTV_구_set = set(CCTV_Seoul['구'].unique())
CCTV_구_set

pop_구_set = set(pop_Seoul['구'].unique())
pop_구_set

차집합 연산

pop_구_set - CCTV_구_set   # pop에는 합계라는 데이터셋이 추가로 있다.

 

CCTV_구_set - pop_구_set

 

pop_Seoul.drop(0).head(3)

 

data_result=pd.merge(CCTV_Seoul,pop_Seoul, on="구")
data_result.head()

 

 

6. 인구수 대비 CCTV 비율이 높은/낮은 지역 알아보기

- 특성공학 : 컬럼끼리 연산을 통해 의미있는 컬럼을 만드는 직업

 

data_result['인구수대비 CCTV비율']=(data_result['소계']/data_result["인구수"])*100
data_result.head()

 

# 인구수 대비 CCTV가 적은 지역
data_result.sort_values(by="인구수대비 CCTV비율")

 

# 인구수 대비 CCTV가 많은 지역
data_result.sort_values(by="인구수대비 CCTV비율", ascending=False)

# 시각화
plt.figure(figsize=(10,7))
plt.grid()
plt.xlabel('인구대비 CCTV 비율')
plt.ylabel('구별')
plt.barh(gu,per)
plt.show()

gu=data_result.sort_values(by="인구수대비 CCTV비율")['구']
per=data_result["인구수대비 CCTV비율"].sort_values()

7. 각 구별 CCTV 예측 값을 만들어보자

 

- 상관관계, 상관계수를 확인해서 CCTV 설치 숫자와 관련된 컬럼을 알아보자.

 

 

# 구 컬럼을 인덱스로 설정
data_result.set_index('구', inplace=True)
data_result.head()

data_result.corr()['소계']

- 외국인수 -0에 가까운 약한 상관관계를 가짐.
- 13,14,15,16, 인구대비 CCTV 비율은 '소계' 컬럼을 계산 혹은 활용한 컬럼.
- ---> 부적합
- 인구수, 한국인수, 65세 이상 고령자수를 이용하자!

 

 

8. 머신러닝 모델을 이용해 학습을 해보자

 

from sklearn.linear_model import LinearRegression
model = LinearRegression() # 머신러닝 모델 생성
data_result

 

y=data_result['소계']
y  # 학습용 정답

model.fit(X,y)

model.predict([[2000, 1000, 500]])

8-2. 각 구별로 CCTV 숫자를 예측하게 해보자.

CCTV_pre = model.predict(X)
CCTV_pre

 

# 예측값과 실제값의 차이(오차) 구하기
error = np.abs(CCTV_pre - y) #절댓값
error

9. 결과 시각화

data_result['인구수'][0]

data_result['소계'][0]

 

 

plt.figure(figsize=(14,10))
plt.scatter(data_result['인구수'],data_result['소계'], s=150, c=error)
for i in range(25):
    plt.text(data_result['인구수'][i], 
             data_result['소계'][i], 
             data_result.index[i]) # 인구수, 소계 자리에 index(구)를 기입하겠다 
plt.colorbar()
plt.xlabel('인구수')
plt.ylabel('CCTV 설치수')
plt.savefig('result.png')
plt.show()

 

 

 

Comments