EDA - 02. Analysis Seoul Crime_part [2] Folium

jaam._.mini·2023년 12월 4일
0

정말 재밌는데, 어렵다..?!!

https://python-visualization.github.io/folium/latest/reference.html







Folium [지도 시각화]



folium 설치

!pip install folium

import folium
import pandas as pd
import json



folium.Map()

#구글맵에서 경도/위도 확인 후 입력
#zoom_start : 0 ~ 18

m = folium.Map(location=[37.545473, 127.053151], zoom_start=14) 
m



save()

m.save('./folium.html')



tiles option

m = folium.Map(
    location=[37.545473, 127.053151],
    zoom_start=14,
    tiles = 'OpenStreetMap') 
m



folium.Marker()

m = folium.Map(
    location=[37.544564958079896, 127.05582307754338],
    zoom_start=14,
    tiles = 'OpenStreetMap') 

### folium.Marker
# '뚝섬역' 마커를 생성(뚝섬역 위도, 경도).위에 있는 m에게 전달
folium.Marker((37.54712311308356, 127.04721916917774)).add_to(m)

### popup()
# '성수역' 클릭하면 팝업이 나오게 설정
folium.Marker(
    location=[37.544564958079896, 127.05582307754338], 
    popup = '<b>Subway<b>').add_to(m)

### tooltip()
# '성수역' 가까이 마우스를 두면 설명이 뜸
folium.Marker(
    location=[37.544564958079896, 127.05582307754338], 
    popup = '<b>Subway<b>',
    tooltip='<i>성수역</i>').add_to(m)

### html URL 팝업
folium.Marker((37.54558642069953,127.05729705810472),
              popup = "<a href='https://zero-base.co.kr/' target=_'blink'>데이터사이언스</a>",
              tooltip = 'zerobase').add_to(m)

m



folium.Icon()

m = folium.Map(
    location=[37.544564958079896, 127.05582307754338],
    zoom_start=14,
    tiles = 'OpenStreetMap') 

### folium.Marker
### icon basic
# '뚝섬역' 마커를 생성(뚝섬역 위도, 경도).위에 있는 m에게 전달
folium.Marker(
    (37.54712311308356, 127.04721916917774), 
    icon=folium.map.Icon(color='black', icon='info-sign')
).add_to(m)

### popup()
### icon icon_color
# '성수역' 클릭하면 팝업이 나오게 설정
folium.Marker(
    location=[37.544564958079896, 127.05582307754338], 
    popup = '<b>Subway<b>',
    icon=folium.map.Icon(
        color='red',
        icon_color='yellow',
        icon='cloud')
).add_to(m)

# ### tooltip()
# # '성수역' 가까이 마우스를 두면 설명이 뜸
# folium.Marker(
#     location=[37.544564958079896, 127.05582307754338], 
#     popup = '<b>Subway<b>',
#     tooltip='<i>성수역</i>').add_to(m)

### tooltip()
### html URL 팝업
folium.Marker((37.54558642069953,127.05729705810472),
              popup = "<a href='https://zero-base.co.kr/' target=_'blink'>데이터사이언스</a>",
              tooltip = 'zerobase').add_to(m)

### icon custom
folium.Marker(
    location = [37.54035903907497,127.06913328776446], # 건대입구
    popup='건대입구역',
    tooltip='Icon custom',
    icon=folium.map.Icon(
        color='purple',
        icon_color='white', 
        icon='android', #icon='bookmark'
        angle=50,
        prefix='fa'
        )
).add_to(m)


m



folium.ClickForMarker()

지도위에 마우스로 클릭했을 때 마커를 생성해준다

m = folium.Map(
    location=[37.544564958079896, 127.05582307754338], #성수역
    zoom_start=14,
    tiles = 'OpenStreetMap'
) 

m.add_child(folium.ClickForMarker(popup='ClickForMarker')) 
# m.add_child(folium.ClickForMarker()) : 위도/경도가 보임....짱신기해...



folium.LatelngPopup()

지도를 마우스로 클릭했을 때 위도 경도 정보를 반환해줌

m = folium.Map(
    location=[37.544564958079896, 127.05582307754338], #성수역
    zoom_start=14,
    tiles = 'OpenStreetMap'
) 

m.add_child(folium.LatLngPopup())



folium.Circle(), folium.CircleMarker()

지도에서 원형으로 표시해주는 기능

m = folium.Map(
    location=[37.544564958079896, 127.05582307754338], #성수역
    zoom_start=14,
    tiles = 'OpenStreetMap'
) 

#folium.Circle()
folium.Circle(
    location=[37.555243442409406, 127.04370422643919], #한양대학교역
    radius=100,
    fill=True, #원형 안에 색상을 채울 것인지 여부 결정
    color='red', # color picker 검색
    fill_color='red',
    popup='Circle popup',
    tooltip='Circle'    
).add_to(m) #m으로 반환해주는 코드

#folium.CircleMarker()
folium.CircleMarker(
    location=[37.54347089498245, 127.04439204503049], #한양대학교역
    radius=30,
    fill=True, #원형 안에 색상을 채울 것인지 여부 결정
    color='blue', # color picker 검색
    fill_color='blue',
    popup='Circle popup',
    tooltip='Circle'    
).add_to(m) #m으로 반환해주는 코드

m



folium.Choropleth

import json
state_data = pd.read_csv('../data/02. US_Unemployment_Oct2012.csv')
state_data.tail(2)



번외. USA

m = folium.Map([43,-102], zoom_start=3)

folium.Choropleth(
    geo_data='../data/02. us-states.json', # 경계선 좌표값이 담긴 데이터가 있음
    data=state_data,
    columns=['State', 'Unemployment'],
    key_on = 'feature.id',
    fill_color='BuPu',
    fill_opacity=1, # 잘 보이기 위해 1, 실업률이 높으면  진하게.
    line_opacity=1,
    legend_name='Unemployment rate(%)'
).add_to(m)

m







Folium [범죄현황 시각화]



준비

import json
import folium
import pandas as pd
crime_anal_norm = pd.read_csv(
    '../data/02. crime_in_Seoul_final_zb.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'))
crime_anal_norm.tail(2)



살인 발생 건수 지도 시각화

서울시가 중앙에 위치하도록 시각화 하는 코드

my_map = folium.Map(
    location=[37.5502, 126.982],
    zoom_start=11,
    tiles = 'cartodb positron'
)

#살인 발생 건수 시각화
folium.Choropleth(
    geo_data= geo_str, #우리나라 경계선 좌표값이 담긴 데이터
    data = crime_anal_norm['살인'],
    columns=[crime_anal_norm.index, crime_anal_norm['살인']], # 2가지 컬럼 지정 (지역, 살인수)
    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 = 'cartodb positron'
)

#발생 건수 시각화
folium.Choropleth(
    geo_data= geo_str, #우리나라 경계선 좌표값이 담긴 데이터
    data = crime_anal_norm['범죄'],
    columns=[crime_anal_norm.index, crime_anal_norm['범죄']], # 2가지 컬럼 지정 (지역, 범죄수)
    key_on='feature.id',
    fill_color='PuRd',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='정규화된 살인 발생 건수'
).add_to(my_map)

my_map



인구대비, 5대 범죄 건수 시각화

인구 대비 범죄율

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

# 서울시가 중앙에 위치하도록 시각화 하는 코드
my_map = folium.Map(
    location=[37.5502, 126.982],
    zoom_start=11,
    tiles = 'cartodb positron'
)

#발생 건수 시각화
folium.Choropleth(
    geo_data= geo_str, #우리나라 경계선 좌표값이 담긴 데이터
    data = tmp_criminal,
    columns=[crime_anal_norm.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_zb.csv', encoding='utf-8')
crime_anal_station.tail(2)

col = ['강간검거','강간발생', '강도검거', '강도발생', '살인검거']

# 정규화
tmp = crime_anal_station[col] / crime_anal_station[col].max()

# numpy - axis=1 : 가로 / pandas - axis=1 : 세로
crime_anal_station['검거'] = np.mean(tmp, axis=1) 

crime_anal_station.tail()



모든 경찰서 위치 마커 표시

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

#iterrows() - 값 2개 반환(idx, rows)
for idx, rows in crime_anal_station.iterrows():
    folium.Marker(
        location=[rows.lat, rows.lng], # 위치값 지정
    ).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_norm['범죄'],
    columns=[crime_anal_norm.index, crime_anal_norm['범죄']],
    key_on='feature.id',
    fill_color='PuRd',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='인구대비 범죄 발생 건수'
).add_to(my_map)

for idx, rows in crime_anal_station.iterrows():
    folium.CircleMarker(
        location=[rows.lat, rows.lng],
        radius=rows.검거 * 50, # 검거 컬럼에 50을 곱해줌.
        popup = rows['구분'] + ':' + '%.2f' % rows['검거'], #각 구의 이름:검거 데이터값(소수점 2자리까지)
        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(2)

crime_loc_raw['장소'].unique()

crime_loc= crime_loc_raw.pivot_table(
    values=crime_loc_raw, # pivot_table 기본요소 1. 데이터 넣기
    index='장소', # pivot_table 기본요소 2. 인덱스
    columns='범죄명', # pivot_table 기본요소 3. 컬럼
    aggfunc=[np.sum] # pivot_table 기본요소 4. 2/3에 담기는 값들
)
crime_loc.head()

crime_loc.columns = crime_loc.columns.droplevel([0,1])
crime_loc.head()

crime_loc_norm = crime_loc / crime_loc.max()
crime_loc_norm.head()

crime_loc_norm['종합'] = np.mean(crime_loc_norm, axis=1)
crime_loc_norm.head()

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', # 실수형
        linewidth = 0.5, 
        cmap = 'RdPu' # 컬러
    )
    plt.title('범죄 발생 장소')
    plt.show()

drawGraph()

데이터 저장

crime_anal_norm.to_csv('../data/02. crime_in_Seoul_final.csv', sep=',', encoding='utf-8')
profile
비전공자의 데이터 공부법

0개의 댓글