서울시 구별 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 |