TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 데이터 분석>

[파이썬] 서울시 범죄 현황 분석 - 2

by 기록자_Recordian 2024. 4. 15.
728x90
반응형
시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.
보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.

지난 번 분석 보기
 

[파이썬 데이터 분석] 서울시 범죄 현황 분석 - 1

시작에 앞서 해당 내용은 -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다. 보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다. 데이터 획득하기 하단 링크에 접속하여 서울

puppy-foot-it.tistory.com


시각화 도구 Seaborn을 통해 범죄 데이터 시각화하기 
sns.pairplot(crime_anal_norm, vars=["강도", "살인", "폭력"], kind='reg', size=3)
plt.show()

 
인구수와 CCTV 개수, 살인과 강도에 대한 상관관계 조사하기

sns.pairplot(crime_anal_norm, x_vars=["인구수", "CCTV"],
             y_vars=["살인", "강도"], kind='reg', size=3)
plt.show()

 

인구수와 CCTV 개수, 살인검거율과 폭력검거율에 대한 상관관계 조사하기

sns.pairplot(crime_anal_norm,
             x_vars=["인구수", "CCTV"],
             y_vars=["살인검거율", "폭력검거율"], kind='reg', size=3)
plt.show()

 

검거율의 합계인 검거 항목 최고값을 100으로 한정하고 정렬한 다음

tmp_max = crime_anal_norm['검거'].max()
crime_anal_norm['검거'] = crime_anal_norm['검거'] / tmp_max * 100
crime_anal_norm_sort = crime_anal_norm.sort_values(by='검거', ascending=False)
crime_anal_norm_sort.head()

 

 

heatmap 으로 각 범죄 검거율 데이터 시각화 하기
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=.5)
plt.title('범죄 검거 비율 (정규화된 검거의 합으로 정렬)')
plt.show()

데이터는 잘 들어가 있는데, 또 밑에는 안 나오네요.. 0_0

발생 건수의 합 heatmap 으로 시각화하기
target_col = ['강간', '강도', '살인', '절도', '폭력', '범죄']

crime_anal_norm['범죄'] = crime_anal_norm['범죄'] / 5
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=.5)
plt.title('범죄비율 (정규화된 발생 건수로 정렬)')
plt.show()

이것도 왜...??

 


서울시 범죄율 지도 시각화 하기

 
먼저 하단 링크로 접속하여 서울시 지도 json 파일 다운로드

 

DataScience/data/02. skorea_municipalities_geo_simple.json at master · PinkWink/DataScience

책) 파이썬으로 데이터 주무르기 - 소스코드 및 데이터 공개. Contribute to PinkWink/DataScience development by creating an account on GitHub.

github.com

 
지도 import 하기 (json 파일 로딩)

import json
geo_path = '../data/02. skorea_municipalities_geo_simple.json'
geo_str = json.load(open(geo_path, encoding='utf-8'))

 
또, folium 라이브러리도 설치해야 한다

pip install folium

 

 

※ 책에 나온대로 코드를 짜니 ''Map' object has no attribute 'choropleth'' 오류가 계속 떠서 결국 챗gpt에게 도움을 받아 해결했다.

 
먼저 import folium 를 하고
folium.Map() 을 통해 지도 초기화를 한 뒤,

map = folium.Map(location=[37.5502, 126.982], zoom_start=11, tiles='Stamen Toner')
folium.Choropleth(
    geo_data=geo_str,
    data=crime_anal_norm['살인'],
    columns=[crime_anal_norm.index, crime_anal_norm['살인']],
    fill_color='PuRd',
    key_on='feature.id'
).add_to(map)
map

chat gpt 최고다...

강간 발생 건수로 다시 그려보면,

map = folium.Map(location=[37.5502, 126.982], zoom_start=11, tiles='Stamen Toner')

folium.Choropleth(
    geo_data=geo_str,
    data=crime_anal_norm['강간'],
    columns=[crime_anal_norm.index, crime_anal_norm['강간']],
    fill_color='PuRd',
    key_on='feature.id'
).add_to(map)

map

 
이번엔 범죄 발생 건수로,

map = folium.Map(location=[37.5502, 126.982], zoom_start=11, tiles='Stamen Toner')

folium.Choropleth(
    geo_data=geo_str,
    data=crime_anal_norm['범죄'],
    columns=[crime_anal_norm.index, crime_anal_norm['범죄']],
    fill_color='PuRd',
    key_on='feature.id'
).add_to(map)

map

 
인구 대비 범죄 발생 비율도 파악해보자

tmp_criminal = crime_anal_norm['살인'] / crime_anal_norm['인구수'] * 1000000

map = folium.Map(location=[37.5502, 126.982], zoom_start=11, tiles='Stamen Toner')

folium.Choropleth(
    geo_data=geo_str,
    data=tmp_criminal,
    columns=[crime_anal_norm.index, tmp_criminal],
    fill_color='PuRd',
    key_on='feature.id'
).add_to(map)

map

 

 


서울시 경찰서별 검거율과 구별 범죄 발생율 시각화하기

 
검거만 따로 모으고, 각 경찰서의 위도와 경도 정보 이용

crime_anal_raw['lat'] = station_lat
crime_anal_raw['lng'] = station_lng

col = ['살인 검거', '강도 검거', '강간 검거', '절도 검거', '폭력 검거']
tmp = crime_anal_raw[col] / crime_anal_raw[col].max()

crime_anal_raw['검거'] = np.sum(tmp, axis=1)

crime_anal_raw.head()

 

 
경찰서의 위치 확인 하기

map = folium.Map(location=[37.5502, 126.982], zoom_start=11)

for n in crime_anal_raw.index:
    folium.Marker([crime_anal_raw['lat'][n],
                   crime_anal_raw['lng'][n]]).add_to(map)

map

 

 

버블맵으로 경찰서의 검거율 시각화 하기
map = folium.Map(location=[37.5502, 126.982], zoom_start=11)

for n in crime_anal_raw.index:
    folium.CircleMarker([crime_anal_raw['lat'][n], crime_anal_raw['lng'][n]],
                        radius = crime_anal_raw['검거'][n]*10,
    color='#3186cc', fill_color='#3186cc').add_to(map)

map

원이 넓을수록 검거율이 높다

 

범죄율과 검거율 동시에 표현하기
map = folium.Map(location=[37.5502, 126.982], zoom_start=11)

folium.Choropleth(
    geo_data=geo_str,
    data=crime_anal_norm['범죄'],
    columns=[crime_anal_norm.index, crime_anal_norm['범죄']],
    fill_color='PuRd',
    key_on='feature.id'
).add_to(map)

for n in crime_anal_raw.index:
    folium.CircleMarker([crime_anal_raw['lat'][n], crime_anal_raw['lng'][n]],
                        radius = crime_anal_raw['검거'][n]*10,
    color='#3186cc', fill_color='#3186cc').add_to(map)

map

 

실습하면서 오류가 몇 번 떴었는데, 구글링을 해봐도 안 나오면 오류 나온 내용 그대로 챗 gpt에 복붙 하고 해결법을 알려달라고 하면 알아서 코드도 짜준다... (찾으면 방법은 다 있다)
 


전체 코드
728x90
반응형