서울시 범죄 현황에 대한 지도 시각화

  • 데이터 불러오기
crime_anal_norms = 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")
  • 경계 그리기
folium.Choropleth(
    geo_data=geo_str, #우리나라 경계선 좌표값이 담긴 데이터
    data=crime_anal_norms['살인'],
    columns=[crime_anal_norms.index, crime_anal_norms['살인']],
    key_on='feature.id',
    fill_color='PuRd',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='정규화된 살인 발생 건수'
    ).add_to(my_map)

my_map

  • 성범죄 발생 건수 지도 시각화
my_map = folium.Map(
    location=[37.5502, 126.982],
    zoom_start=11,
    tiles="Stamen Toner")

# 경계 그리기
folium.Choropleth(
    geo_data=geo_str, #우리나라 경계선 좌표값이 담긴 데이터
    data=crime_anal_norms['강간'],
    columns=[crime_anal_norms.index, crime_anal_norms['강간']],
    key_on='feature.id',
    fill_color='PuRd',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='정규화된 성범죄 발생 건수'
    ).add_to(my_map)

my_map

  • 5대 범죄 발생 건수 지도 시각화
my_map = folium.Map(
    location=[37.5502, 126.982],
    zoom_start=11,
    tiles="Stamen Toner")

# 경계 그리기
folium.Choropleth(
    geo_data=geo_str, #우리나라 경계선 좌표값이 담긴 데이터
    data=crime_anal_norms['범죄'],
    columns=[crime_anal_norms.index, crime_anal_norms['범죄']],
    key_on='feature.id',
    fill_color='PuRd',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='정규화된 5대 범죄 발생 건수'
    ).add_to(my_map)

my_map

  • 인구 대비 범죄 발생 건수 지도 시각화
tmp_criminal = crime_anal_norms['범죄']/crime_anal_norms['인구수']

my_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_norms.index, tmp_criminal],
    key_on='feature.id',
    fill_color='PuRd',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='인구 대비 범죄 발생 건수'
    ).add_to(my_map)

my_map

  • 경찰서별 정보를 범죄발생과 함께 정리
crime_anal_station = pd.read_csv('../data/02. crime_in_Seoul_raw.csv', encoding='utf-8')

crime_anal_station.tail()

  • 정규화 후 검거 컬럼 추가
col = ["살인검거",'강도검거', '강간검거', '절도검거', '폭력검거']
tmp = crime_anal_station[col] / crime_anal_station[col].max() #정규화
crime_anal_station['검거'] = np.mean(tmp, axis=1)
crime_anal_station.tail()

  • 경찰서 위치 마커 표시
my_map = folium.Map(
    location=[37.5502, 126.982],
    zoom_start=11)

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

  • 검거에 값을 곱한 뒤 원의 넓이 적용
    my_map = folium.Map(
    location=[37.5502, 126.982],
    zoom_start=11)
folium.Choropleth(
    geo_data=geo_str,
    data=crime_anal_norms.범죄,
    columns=[crime_anal_norms.index, crime_anal_norms.범죄],
    key_on='feature.id',
    fill_color="PuRd",
    fill_opacity=0.7,
    line_opacity=0.2
).add_to(my_map)

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

서울시 범죄 현황 발생 장소 분석

  • 추가 검증
crime_loc_raw = pd.read_csv(
    '../data/02. crime_in_Seoul_location.csv', thousands=',', encoding='euc-kr')

crime_loc_raw.tail()

  • raw 데이터 확인

  • 장소를 index로 피봇테이블 생성

crime_loc = crime_loc_raw.pivot_table(
            crime_loc_raw, index='장소', columns="범죄명", aggfunc=[np.sum])

crime_loc

  • crime_loc의 멀티 인덱스를 삭제
crime_loc.columns = crime_loc.columns.droplevel([0,1])

crime_loc

  • 정규화
col = ['살인', '강도', '강간', '절도', '폭력']
crime_loc_norm=crime_loc/crime_loc.max() # 정규화
crime_loc_norm.head()

  • 종합점수 column 추가
crime_loc_norm['종합'] = np.mean(crime_loc_norm, axis=1)
crime_loc_norm.head()

  • heatmap 그리기
crime_loc_norm_sort = crime_loc_norm.sort_values(by='종합', ascending=False)
                                                 
def drawGraph() :
    plt.figure(figsize=(10,10))
    sns.heatmap(
        crime_loc_norm_sort,
        annot=True,
        fmt='f',
        linewidths=0.5,
        cmap='RdPu')
    plt.title('범죄발생장소')
    plt.show()
drawGraph()

profile
개발도상인 냄비짱

0개의 댓글