1. 앞서 했던 matplotlib의 한글 폰트를 잡자. 윈도우, 맥인지에 따라 다르다. Windows의 경우 맑은 고딕(Malgun Gothic)으로 바꾼다.
import matplotlib.pyplot as plt
import seaborn as sns
#%matplotlib inline
get_ipython().run_line_magic('matplotlib', 'inline')
from matplotlib import rc
plt.rcParams['axes.unicode_minus'] = False
rc('font', family='Malgun Gothic')
2. 먼저 pairplot기능으로 '강도', '살인', '폭력'에 대한 상관관계를 보자.

아직 더 시각화를 해야 하지만, 현재 페어플롯으로만 보면, 폭력-살인 그래프가 다른 사례들보다 점들이 좀 더 모여있는 것을 볼 수 있다. 로버스트 회귀 등으로 이상치를 제거해준다면 그 경향성이 더 강해질 것이다. 이는 폭력이 살인으로 이어지는 경우가 다른 경우들보다 좀 더 많다는 것을 알 수 있다.
3. 이번에는 CCTV와 살인, 강도와의 관계도 보자.
def drawPlot():
sns.pairplot(
crime_anal_norm, x_vars=['인구수', 'CCTV'], y_vars=['살인', '강도'], kind='reg', height=6, aspect=1.5
)
plt.show()
drawPlot()

인구수 - 강도 데이터를 보면, 인구수의 증가와 강도/살인의 연관성은 크게 높지 않은 것을 알 수 있다.(회귀분석선의 기울기가 거의 0에 가깝다.) 오히려, CCTV의 갯수와 강도/살인 발생의 연관성이 더 높은 것으로 나타난다. 이것은 CCTV의 갯수가 많을 수록 강도/살인 등의 범죄의 '확인율'이 높아지기 때문(또는 강도사건이 많이 발생했기 때문에 CCTV를 더 설치했기 때문)으로도 해석할 수 있다.
4. 이번에는 인구수, CCTV와 살인/폭력 검거율의 관계를 보자.
def drawPlot2():
sns.pairplot(
crime_anal_norm,
x_vars=['인구수', 'CCTV'],
y_vars=['살인검거율', '폭력검거율'],
kind='reg',
height=6,
aspect=1.5
)
plt.show()
drawPlot2()

이번에는 확실하게 인구수의 증가율이 폭력검거율에는 상관관계가 없다는 것이 나타난다. 반대로 인구수가 증가할 수록 살인검거율도 증가한다. 살인검거율의 경우 100 인근에 데이터가 모여있는 이유는, 이전에 데이터분석의 용이성을 위해 살인검거율이 100%를 넘었을 경우 무조건 100%으로 통일하도록 수정하였기 때문이다.
5. 이번에는 인구수, CCTV와 절도/강도 검거율을 보자.
def drawPlot3():
sns.pairplot(
crime_anal_norm,
x_vars=['인구수', 'CCTV'],
y_vars=['절도검거율', '강도검거율'],
kind='reg',
height=6,
aspect=1.5
)
plt.show()
drawPlot3()

인구수가 높아질수록 강도검거율/절도검거율이 낮아진다는 정보 외에 특별한 것은 없다.
6. 이번에는 검거율만 가지고 heatmap을 만들어보자. 타겟 컬럼(target_col)에 모든 검거율을 놓고, 모든 검거율의 평균값인 '검거'라는 컬럼을 기준값으로 정렬한 다음에 히트맵을 그릴 것이다.
def drawPlot4():
target_col = ['강간,추행검거율', '강도검거율', '살인검거율', '절도검거율', '폭력검거율', '검거율']
crime_anal_norm_sort = crime_anal_norm.sort_values(by='검거율', ascending=False) # 내림차순
plt.figure(figsize=(10,10))
sns.heatmap(
crime_anal_norm_sort[target_col],
annot=True, # 히트맵에 해당 값을 표시해줌
fmt='f', # 실수 형식으로 표시
linewidths=0.5, # 각 셀 사이의 경계선의 너비를 설정
cmap='RdPu', # 색상 맵을 설정
)
plt.title('범죄 검거 비율 (정규화된 검거의 합으로 정렬)') # 히트맵의 제목 설정
plt.show()
drawPlot4()

최근 데이터를 보면 종로구를 제외하면 대체로 검거율이 높게 나타난다.
7. 이번에는 범죄발생건수로 heatmap을 만들어보자. 대표값은 '범죄'로 두고 정렬해보자.
def drawGraph():
target_col=['강간,추행', '강도', '살인', '절도', '폭력', '범죄']
crime_anal_norm_sort = crime_anal_norm.sort_values(by='범죄', ascending=False)
plt.figure(figsize=(10,10))
sns.heatmap(
crime_anal_norm_sort[target_col],
annot=True,
fmt='f',
linewidths=0.5,
cmap='RdPu',
)
plt.title('범죄비율 (정규화된 발생 건수로 정렬)')
plt.show()
drawGraph()

최근 데이터를 보면, 모든 5대 범죄 항목에서 강남구가 가장 높게 나타난다. 이전에 가장 살인범죄가 빈발했던 것으로 유명했던 영등포구는 오히려 하위권으로 떨어졌고(대신 강도율은 모든 구 중 두 번째로 나타난다), 검거율이 가장 낮게 나타났던 종로구는 범죄 발생률에서는 중위권 정도로 나타난다. 특히 살인 항목에서는 모든 구 중 중구를 제외하고 최하위권으로 나타난다. 데이터를 정리한 뒤 시각화했을 때 한 눈에 얻어지는 정보가 이렇게나 많다!
여기서 궁금증이 생긴다. 이번 프로젝트의 목적은 '서울시의 구들이 안전한가'를 확인하기 위한 것이다. 강남구는 범죄 발생비율은 가장 높은데, 검거비율은 중위권으로 높지 않다. 그런데도 왜 사람들은 왜 강남3구에서 안전하다고 느끼는 걸까?
이제 인구대비 현황 등을 확인해볼 차례다. 그 전에 먼저 저장!
# 데이터 저장
crime_anal_norm.to_csv('../data/02. crime_in_seoul_final.csv', sep=',')'데이터분석 > 미니프로젝트 01. 서울시 CCTV 현황 분석' 카테고리의 다른 글
| 미니프로젝트 01-02-07. 서울시 범죄현황 시각화(folium), 추가 검증 (0) | 2024.03.30 |
|---|---|
| 미니프로젝트 01-02-06. Folium 지도 시각화 (1) | 2024.03.29 |
| 미니프로젝트 01-02-04. 서울시 범죄현황 데이터 최종 정리 (3) | 2024.03.26 |
| 미니프로젝트 01-02-03. googlemaps에서 구별 정보를 얻어 데이터 정리, 구별데이터로 변경하기 (1) | 2024.03.26 |
| 미니프로젝트 01-02-02. 서울시 범죄현황 데이터를 피벗테이블로 정리, pip와 install 명령 (1) | 2024.03.24 |