Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

RUBY

[CRIME] 14. 서울시 범죄 현황에 대한 지도 시각화 본문

데이터 분석/EDA_웹크롤링_파이썬프로그래밍

[CRIME] 14. 서울시 범죄 현황에 대한 지도 시각화

ruby-jieun 2023. 2. 4. 23:38

 

 

 

 

서울시 범죄 현황 데이터 분석 프로젝트
14. 서울시 범죄 현황에 대한 지도 시각화

 


 

 

1. 지도 시각화에 필요한 json 파일을 구한다.

 * 현재 무료로 구할 수 있는 json 파일은 Lucy Park님의 자료가 유일하다..

GitHub - southkorea/southkorea-maps: South Korea administrative divisions in ESRI Shapefile, GeoJSON and TopoJSON formats.

 

GitHub - southkorea/southkorea-maps: South Korea administrative divisions in ESRI Shapefile, GeoJSON and TopoJSON formats.

South Korea administrative divisions in ESRI Shapefile, GeoJSON and TopoJSON formats. - GitHub - southkorea/southkorea-maps: South Korea administrative divisions in ESRI Shapefile, GeoJSON and Topo...

github.com

 

오래된 데이터라 한계가 있지만, 서울을 대상으로 하는 것에는 문제가 없을 것 같다..

 

 

Lucy Park님의 자료에서 서울 부분만 추려서 데이터를 만든다.

 

 

 

 

 

 

구별 범죄 현황 지도 시각화 시작하자..

 

 

 

 

2. 살인 사건 범죄율에 대한 지도 시각화

import json

crime_anal_norm = pd.read_csv(
    "../data/02. crime_in_Seoul_final.csv", index_col=0, encoding="utf-8"
)
geo_path = "../data/02. skorea_municipalities_geo_simple.json"
geo_str = json.load(open(geo_path, encoding="utf-8"))
my_map = folium.Map(location=[37.5502, 126.982], zoom_start=11, tiles="Stamen Toner")

my_map.choropleth(
    geo_data=geo_str,
    data=crime_anal_norm["살인"],
    columns=[crime_anal_norm.index, crime_anal_norm["살인"]],
    fill_color="PuRd",
    key_on="feature.id",
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name="정규화된 살인 발생 건수",
)

my_map

 

 

 

 

 

 

3. 성범죄 범죄율에 대한 지도 시각화

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

my_map.choropleth(
    geo_data=geo_str,
    data=crime_anal_norm["강간"],
    columns=[crime_anal_norm.index, crime_anal_norm["강간"]],
    fill_color="PuRd",
    key_on="feature.id",
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name="정규화된 강간 발생 건수",
)

my_map

 

 

 

 

4. 5대 범죄에 대한 지도 시각화

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

my_map.choropleth(
    geo_data=geo_str,
    data=crime_anal_norm["범죄"],
    columns=[crime_anal_norm.index, crime_anal_norm["범죄"]],
    fill_color="PuRd",
    key_on="feature.id",
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name="정규화된 범죄 발생 건수",
)

my_map

 

 

 

 

5. 인구 대비 범죄 발생 건수

tmp_criminal = crime_anal_norm["범죄"] / crime_anal_norm["인구수"] 

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

my_map.choropleth(
    geo_data=geo_str,
    data=tmp_criminal,
    columns=[crime_anal_norm.index, tmp_criminal],
    fill_color="PuRd",
    key_on="feature.id",
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name="정규화된 범죄 발생 건수",
)

my_map

 

 

 

 

6. 경찰서 별 검거현황과 구별 범죄발생 현황을 표현하자

 - 경찰서 별 정보를 가지고 범죄 발생과 함께 정리한다.

crime_anal_station = pd.read_csv(
    "../data/02. crime_in_Seoul_1st.csv", index_col=0, encoding="utf-8"
)
col = ["살인검거", "강도검거", "강간검거", "절도검거", "폭력검거"]
tmp = crime_anal_station[col] / crime_anal_station[col].max()
crime_anal_station["검거"] = np.mean(tmp, axis=1)
crime_anal_station.head()

 

 

 

7. 경찰서 위치를 지도에 표시

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

for idx, rows in crime_anal_station.iterrows():
    folium.Marker([rows["lat"], rows["lng"]]).add_to(my_map)
    
my_map

 

 

 

 

8. 검거에 적절한 값을 곱해서 원의 높이로 사용

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

for idx, rows in crime_anal_station.iterrows():
    folium.CircleMarker(
        [rows["lat"], rows["lng"]],
        radius=rows["검거"] * 50,
        popup=rows["구분"] + " : " + "%.2f" % rows["검거"],
        color="#3186cc",
        fill=True,
        fill_color="#3186cc",
    ).add_to(my_map)
    
my_map

 

 

 

 

9. 구별 범죄 현황과 경찰서별 검거율을 함께 표시

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

my_map.choropleth(
    geo_data=geo_str,
    data=crime_anal_norm["범죄"],
    columns=[crime_anal_norm.index, crime_anal_norm["범죄"]],
    fill_color="PuRd",
    key_on="feature.id",
    fill_opacity=0.7,
    line_opacity=0.2,
)

for idx, rows in crime_anal_station.iterrows():
    folium.CircleMarker(
        [rows["lat"], rows["lng"]],
        radius=rows["검거"] * 50,
        popup=rows["구분"] + " : " + "%.2f" % rows["검거"],
        color="#3186cc",
        fill=True,
        fill_color="#3186cc",
    ).add_to(my_map)
    
my_map

 

Comments