- https://data.seoul.go.kr/

- 서울시 5대 점죄 발생현황 통계 데이터

- crime.txt

 

 

 

1. 데이터 가져오기

import pandas as pd
import folium
import json

criminal = pd.read_csv('./data/crime.txt', sep='\t', thousands=',', encoding='utf-8')

 

 

 

 

 

2. 데이터 전처리

 

# 불필요한 컬럼 제거

criminal.drop(['기간', '합계검거', '살인검거', '강도검거', '강간검거', '절도검거', '폭력검거'], axis=1, inplace=True)
criminal.drop([0], inplace=True)

 

 

# 컬럼 이름 설정

criminal.rename(columns={'살인발생':'살인', '강도발생':'강도', '강간발생':'강간', '절도발생':'절도', '폭력발생':'폭력'}, inplace=True)

 

 

# 인덱스 설정

criminal.set_index('자치구', inplace=True)

 

 

 

 

3. 단계 구분도

geo_path = './data/seoul.json'
geo_str = json.load(open(geo_path, encoding='utf-8'))
map = folium.Map(location=[37.5502, 126.982], zoom_start=11,
                 tiles='Stamen Toner')
folium.Choropleth(geo_data = geo_str,
               data = criminal['살인'],
               columns = [criminal.index, criminal['살인']],
               fill_color = 'YlGnBu',
               key_on = 'feature.id').add_to(map)
map

 

 

 

 

 

4. 주소와 위도 경도 가져오기

# 경찰서 이름 만들기

station_name = []
for name in criminal.index:
    station_name.append('서울' + str(name[:-1]) + '경찰서')

print(station_name)
['서울종로경찰서', '서울중경찰서', '서울용산경찰서', '서울성동경찰서', '서울광진경찰서', '서울동대문경찰서', '서울중랑경찰서', '서울성북경찰서', '서울강북경찰서', '서울도봉경찰서', '서울노원경찰서', '서울은평경찰서', '서울서대문경찰서', '서울마포경찰서', '서울양천경찰서', '서울강서경찰서', '서울구로경찰서', '서울금천경찰서', '서울영등포경찰서', '서울동작경찰서', '서울관악경찰서', '서울서초경찰서', '서울강남경찰서', '서울송파경찰서', '서울강동경찰서']

 

 

# 카카오 지오코딩 API를 이용해서 경찰서 주소와 위도, 경도 찾아오기

import requests
import json
from urllib.parse import quote

#경찰서 주소와 위도, 경도 찾아오기
station_address = []
station_lat = []
station_lng = []
for name in station_name:
    q = quote(name)
    url = 'https://dapi.kakao.com/v2/local/search/keyword.json?query=' + q
    headers = {'Authorization': 'KakaoAK {}'.format('c454c0e64688ce2bde2dfff9cceced87')}
    data = requests.post(url, headers=headers)
    result = json.loads(data.text) #파싱한 결과
    documents = result["documents"]
    
    address = documents[0]["address_name"]
    x = documents[0]["x"]
    y = documents[0]["y"]
    
    station_address.append(address)
    station_lat.append(y)
    station_lng.append(x)
print(station_address)
print(station_lat)
print(station_lng)
['서울 종로구 공평동 1', '서울 강남구 역삼동 830-23', '서울 용산구 원효로1가 12-12', '서울 성동구 행당동 192-8', '서울 광진구 구의동 254-32', '서울 동대문구 청량리동 229', '서울 중랑구 신내동 810', '서울 성북구 삼선동5가 301', '서울 강북구 번동 415-15', '서울 도봉구 창동 17', '서울 노원구 하계동 250', '서울 은평구 불광동 산 24', '서울 서대문구 미근동 165', '서울 마포구 아현동 618-1', '서울 양천구 신정동 321', '서울 강서구 화곡동 980-27', '서울 구로구 구로동 3-25', '서울 금천구 시흥동 1030', '서울 영등포구 당산동3가 2-11', '서울 동작구 노량진동 72-35', '서울 관악구 봉천동 1695-5', '서울 서초구 서초동 1726-1', '서울 강남구 대치동 998', '서울 송파구 가락동 9', '서울 강동구 성내동 541-1']

['37.57185082446809', '37.49388566996322', '37.54117933635974', '37.5617947420747', '37.54292164557882', '37.5850804205685', '37.6182390801576', '37.58989767143614', '37.637406561393085', '37.65339041848567', '37.6423345266253', '37.6285242467996', '37.5649023404956', '37.550824477077796', '37.5165549067037', '37.5513470867979', '37.5070387936593', '37.45725314643252', '37.52585220719', '37.5131469479959', '37.4745875338795', '37.49561086789221', '37.5093899463715', '37.5019757297179', '37.52867274661258']

['126.98417036713045', '127.03221660594751', '126.96777437089538', '127.036472076258', '127.08396170505674', '127.045762797538', '127.10454224897', '127.01625465308534', '127.02733870040592', '127.05270598499145', '127.071404832413', '126.928631038584', '126.966790740735', '126.95400918908302', '126.865542970902', '126.849886071842', '126.890224925815', '126.89674921449215', '126.90094457988', '126.942857105642', '126.951062346192', '127.00528097622329', '127.067070541137', '127.12716129352492', '127.12688982770433']

 

 

 

 

 

 

5. 지도 출력

criminal['lat'] = station_lat
criminal['lng'] = station_lng
map = folium.Map(location=[37.5502, 126.982], zoom_start=11)

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

 

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

for n in criminal.index:
    folium.CircleMarker([criminal['lat'][n], criminal['lng'][n]],
                        radius = criminal['폭력'][n]/100.0, 
                        color='#3186cc', fill_color='#3186cc', fill=True).add_to(map)
    
map
map = folium.Map(location=[37.5502, 126.982], zoom_start=11)

folium.Choropleth(geo_data = geo_str,
               data = criminal['살인'],
               columns = [criminal.index, criminal['살인']],
               fill_color = 'YlGnBu',
               key_on = 'feature.id').add_to(map)

for n in criminal.index:
    folium.CircleMarker([criminal['lat'][n], criminal['lng'][n]],
                        radius = criminal['폭력'][n]/100, 
                        color='#3186cc', fill_color='#3186cc', fill=True).add_to(map)
    
map