티스토리 뷰
제 2장 서울시 범죄 현황 분석¶
구성 및 블로깅 진행과정¶
2-1 데이터 획득하기
2-2 pandas를 이용하여 데이터 정리하기
2-3 지도 정보를 얻을 수 있는 Google Maps
2-4 Google Maps를 이용해서 주소와 위도, 경도 정보 얻기
-------------------------------------------------------
2-5 pandas의 pivot_table 학습하기
2-6 pivot_table을 이용해서 데이터 정리하기
2-7 데이터 표현을 위해 다듬기
-------------------------------------------------------
2-8 좀 더 편리한 시각화 도구 - Seaborn
2-9 범죄 데이터 시각화하기
-------------------------------------------------------
2-10 지도 시각화 도구 - folium
2-11 서울시 범죄율에 대한 지도 시각화
2-12 서울시 경찰서별 검거율과 구별 범죄 발생율을 동시에 시각화하기
출처: 파이썬으로 데이터 주무르기 by 민형기
2-5 pandas의 pivot_table 학습하기¶
pandas 관련 예제가 많은 chris1610님 공개 데이터 인용 https://github.com/chris1610/pbpython/tree/master/data
import pandas as pd
import numpy as np
# 데이터 불러오기
df= pd.read_excel('pydata/salesfunnel.xlsx')
df.head()
#Name 항목으로만 정렬하고 싶을때 pivot_table을 사용한다.
pd.pivot_table(df,index=['Name'])
# Index를 여러 개 지정할 수 있다.
pd.pivot_table(df,index=['Name','Rep','Manager'])
# 특정 value만 지정해서 나타나도록 할 수도 있다.
pd.pivot_table(df,index=['Manager','Rep'], values=['Price'])
pivot_table 인덱스에 대해서 value 값이 여러개 있을 경우 평균치가 값으로 지정된다.
# value 값의 합계를 구하고 싶다면, aggfunc 옵션의 np.sum을 사용한다.
pd.pivot_table(df, index=['Manager','Rep'],values=["Price"],aggfunc=np.sum)
#Index와 value를 지정하고, 각 value에 대해 합과 평균을 표시하도록 한다.
#Nan이 나타나면 0으로 채운다.
pd.pivot_table(df, index=['Manager','Rep','Product'],
values=['Price','Quantity'],
aggfunc=[np.sum,np.mean],fill_value=0,margins=True)
2-6 Pivot_tabel을 이용해서 데이터 정리하기¶
# 2-4에서 저장했던 데이터 불러오기
crime_anal_raw = pd.read_csv('pydata/02. crime_in_Seoul_include_gu_name.csv',
encoding='utf-8')
crime_anal_raw.head()
#index_col=0을 사용하면 저장되어 있는 index를 index로 사용한다.
crime_anal_raw = pd.read_csv('pydata/02. crime_in_Seoul_include_gu_name.csv',
encoding='utf-8', index_col=0)
# pivot_table을 이용하여 데이터를 관서별에서 구별로 바꾸자
crime_anal = pd.pivot_table(crime_anal_raw, index='구별',aggfunc=np.sum)
crime_anal.head()
crime_anal['강간검거율'] = crime_anal['강간 검거'] / crime_anal['강간 발생'] * 100
crime_anal['강도검거율'] = crime_anal['강도 검거'] / crime_anal['강도 발생'] * 100
crime_anal['살인검거율'] = crime_anal['살인 검거'] / crime_anal['살인 발생'] * 100
crime_anal['절도검거율'] = crime_anal['절도 검거'] / crime_anal['절도 발생'] * 100
crime_anal['폭력검거율'] = crime_anal['폭력 검거'] / crime_anal['폭력 발생'] * 100
# 검거 건수는 검거율로 대체할 수 있어서 삭제한다.
del crime_anal['강간 검거']
del crime_anal['강도 검거']
del crime_anal['살인 검거']
del crime_anal['절도 검거']
del crime_anal['폭력 검거']
crime_anal.head()
데이터를 보면 이상한 점이 보인다. 바로 검거율에 100이 넘는 숫자들이 보인다는 것이다. 아마도 그 전년도 발생 건수에 대한 검거가 포함되기 때문이라고 예상되는데, 사실 그 부분에 대해서 일일히 조사하여야 하지만 이 데이터는 학습목적으로 진행하고 있으니 깊은 고민 없이 100이 넘는 숫자는 100으로 처리하자.
con_list = ['강간검거율', '강도검거율', '살인검거율', '절도검거율', '폭력검거율']
for column in con_list:
crime_anal.loc[crime_anal[column] > 100, column] = 100
crime_anal.head()
# 컬럼명에 발생이라는 단어를 삭제하자.
crime_anal.rename(columns = {'강간 발생':'강간',
'강도 발생':'강도',
'살인 발생':'살인',
'절도 발생':'절도',
'폭력 발생':'폭력'}, inplace=True)
crime_anal.head()
2-7 데이터 표현을 위해 다듬기¶
위 데이터를 보면 강도, 살인 사건은 두 자릿수인데, 절도와 폭력은 네 자릿수이다. 물론 숫자 그 자체로도 중요하지만 각각을 비슷한 범위에 놓고 비교하는 것이 편리할 수 있다.
각 항목의 최대값을 1로 두면 추후 범죄 건수를 종합적으로 비교할 때 편리할 것이다. 우리는 이런 방법을 정규화 라고 한다.
# 발생 건수 정규화
from sklearn import preprocessing
col = ['강간', '강도', '살인', '절도', '폭력']
x = crime_anal[col].values
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x.astype(float))
crime_anal_norm = pd.DataFrame(x_scaled,
columns = col,
index = crime_anal.index)
col2 = ['강간검거율', '강도검거율', '살인검거율', '절도검거율', '폭력검거율']
crime_anal_norm[col2] = crime_anal[col2]
crime_anal_norm.head()
#1장 학습결과에서 구별 인구수와 CCTV 개수를 가져오자
result_CCTV = pd.read_csv('pydata/01. CCTV_result.csv', encoding='UTF-8',
index_col='구별')
crime_anal_norm[['인구수','CCTV']] = result_CCTV[['인구수','소계']]
crime_anal_norm.head()
# 각 범죄 발생 건수에 대해 합을 구해 '범죄'라는 컬럼을 만들자
col = ['강간', '강도', '살인', '절도', '폭력']
crime_anal_norm['범죄'] = np.sum(crime_anal_norm[col],axis=1)
crime_anal_norm.head()
# 위와 마찬가지로 각 검거율의 합을 구하여 '검거'라는 컬럼을 만들자
col = ['강간검거율','강도검거율','살인검거율','절도검거율','폭력검거율']
crime_anal_norm['검거'] = np.sum(crime_anal_norm[col], axis=1)
crime_anal_norm
이 데이터를 어떻게 하면 효과적으로 인식할 수 있을까??
sort 하면 된다고 생각하는 사람들도 있겠지만 그렇지 않다. 그것보다 효과 적인 방법을 공부해 보자.
'beginner > 파이썬 분석' 카테고리의 다른 글
서울시 범죄 현황 분석 -4 (2) | 2019.07.03 |
---|---|
서울시 범죄 현황 분석 -3 (0) | 2019.07.03 |
서울시 범죄 현황 분석 -1 (0) | 2019.07.03 |
서울시 구별 CCTV 현황 분석 -3 (0) | 2019.06.29 |
서울시 구별 CCTV 현황 분석-2 (0) | 2019.06.28 |