본문 바로가기

Programming/Machine Learning

서울시 구별 CCTV 현황 분석

CCTV_in_Seoul.csv
0.00MB
population_in_Seoul.xls
0.02MB

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

- 서울시 각 구별 CCTV수를 파악해보자.

- 인구대비 CCTV비율을 파악해서 순위를 비교해보자.

- 인구대비 CCTV의 예측치를 확인하고, CCTV가 부족한 구를 확인해보자.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
rc('font',family='Malgun Gothic')
import pandas as pd
pd.set_option('display.max_rows',1000)
pd.set_option('display.max_columns',1000)
pd.set_option('display.max_colwidth',-1)

 

 

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

CCTV_Seoul = pd.read_csv('data/CCTV_in_Seoul.csv',
                        encoding='utf-8')
CCTV_Seoul.head(10)

 

컬럼명 변경

CCTV_Seoul.rename(columns={CCTV_Seoul.columns[0]:"구별"},
                 inplace=True)
                 
CCTV_Seoul.head()

 

 

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

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

column에 문제가 있기 때문에 옵션

- header : 읽고 싶은 row index (0부터 시작)

- usecols : 읽고 싶은 column 선택

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

 

column명 바꾸기

# 구별,인구수,한국인,외국인,고령자
pop_Seoul.rename(columns={
    pop_Seoul.columns[0] : "구별",
    pop_Seoul.columns[1] : "인구수",
    pop_Seoul.columns[2] : "한국인",
    pop_Seoul.columns[3] : "외국인",
    pop_Seoul.columns[4] : "고령자"
}, inplace=True)
pop_Seoul.head()

 

 

3. CCTV 데이터 파악하기

CCTV가 가장 부족한 구를 알아보자

CCTV_Seoul.head()

CCTV_Seoul.sort_values(by='소계')

 

CCTV가 가장 많은 구를 알아보자

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

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

 

최근 3년동안 CCTV가 많이 설치된 지역을 알아보자.

CCTV_Seoul["최근 3년 증가율"] = (CCTV_Seoul['2016년']+CCTV_Seoul['2015년']+CCTV_Seoul['2014년']) / CCTV_Seoul['2013년도 이전'] * 100

CCTV_Seoul.sort_values(by='최근 3년 증가율',
                      ascending=False).head()

 

 

4. 서울시 인구 데이터 파악하기

pop_Seoul.head()

 

데이터 삭제하기

pop_Seoul.drop([0],inplace=True) # 열 삭제를 할때는 axis 속성 활용

pop_Seoul.head()

pop_Seoul['구별'].unique()

 

결측치 확인하기

pop_Seoul[ pop_Seoul['구별'].isnull() ]

del_index = pop_Seoul[ pop_Seoul['구별'].isnull() ].index
del_index

pop_Seoul.drop(del_index,inplace=True)

pop_Seoul.head()

 

인구수 대비 외국인의 비율,고령자의 비율 높은 구를 확인하자.

pop_Seoul['외국인비율'] = pop_Seoul['외국인'] / pop_Seoul['인구수'] * 100
pop_Seoul['고령자비율'] = pop_Seoul['고령자'] / pop_Seoul['인구수'] * 100
pop_Seoul.head()

pop_Seoul.sort_values(by='외국인비율',ascending=False).head(3)

pop_Seoul.sort_values(by='고령자비율',ascending=False).head(3)

 

 

5. CCTV 데이터와 인구 데이터 합치고 분석하기

2개의 데이터 구 종류 확인하기

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

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

CCTV_구별_set - pop_구별_set

 

구별 컬럼을 기준으로 병합

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

 

구별 CCTV 소계와 각 컬럼의 상관관계를 확인해보자.

소계를 제외하고 나머지 컬럼 삭제

del data_result['2013년도 이전']
del data_result['2014년']
del data_result['2015년']
del data_result['2016년']
data_result.head()

 

구별을 인덱스로 설정

data_result.set_index('구별',inplace = True)
data_result.head()

 

피어슨 상관계수(Pearson correlation coefficeint)

np.corrcoef( data_result['소계'] , data_result['인구수'] )

np.corrcoef( data_result['소계'] , data_result['고령자'] )

np.corrcoef( data_result['소계'] , data_result['외국인비율'] )

np.corrcoef( data_result['소계'] , data_result['외국인'] )

np.corrcoef( data_result['소계'] , data_result['최근 3년 증가율'] )

 

Scatter plot 시각화

plt.scatter(data_result['소계'],data_result['인구수'])
plt.show()

plt.scatter(data_result['소계'],data_result['최근 3년 증가율'])
plt.show()

 

 

6. CCTV와 인구현황 분석하기

인구수대비 CCTV설치수가 많은지역/적은지역을 알아보자.

# 1. 인구수대비 CCTV설치수를 feature engineering하기
data_result['인구수대비 CCTV수'] = (data_result['소계']/data_result['인구수'])*100

# 2. 정렬을 이용해서 많은지역/적은지역을 확인하기
data_result.sort_values(by='인구수대비 CCTV수')

data_result.sort_values(by='인구수대비 CCTV수', ascending=False)

data_result['인구수대비 CCTV수'].sort_values().plot(kind='barh', grid=True,
                                       figsize=(10,10))
plt.show()

 

인구대비 CCTV 비율 예측 값 만들기

from sklearn.linear_model import LinearRegression # 선형회귀 알고리즘을 가진 클래스

linear_model = LinearRegression()

linear_model.fit(data_result[['인구수']], data_result["소계"])

print('a', linear_model.coef_)
print('b', linear_model.intercept_)

predict_CCTV = linear_model.predict(data_result[['인구수']])
predict_CCTV

data_result['CCTV 오차'] = np.abs(data_result['소계'] - predict_CCTV.reshape(-1))

data_result.sort_values(by='CCTV 오차', ascending=False)

 

 

7. 최종결과 시각화

plt.figure(figsize=(14,10)) # 가로,세로
plt.scatter(data_result['인구수'], data_result['소계'],
            s=150, c=data_result['CCTV 오차'])

fx = np.linspace(100000,700000,100) # 10만부터 70만까지 똑같은 간격의 x추출
fy = linear_model.predict(fx.reshape(-1,1)) # 추출된 x로부터 예측값 생성
plt.plot(fx,fy,ls='dashed',color='green',lw=2)

# 오차가 많이나는 상위 10개지역을 이름을 표기
CCTV_error_top_10 = data_result.sort_values(by='CCTV 오차', ascending=False).head(10)

for n in range(10):
    plt.text(CCTV_error_top_10['인구수'][n],
             CCTV_error_top_10['소계'][n],
             CCTV_error_top_10.index[n],
             fontsize=15)
plt.colorbar()
plt.grid()
plt.savefig("./CCTV_result.png")
plt.show()

'Programming > Machine Learning' 카테고리의 다른 글

iris 품종분류  (0) 2020.02.17
BMI 학습하기  (0) 2020.02.16
Matplotlib교통사고데이터실습  (0) 2020.02.16
Matplotlib 실습  (0) 2020.02.16
DataFrame 실습  (0) 2020.02.16