sns.pairplot(data=crime_anal_norm, vars=['살인','강도','폭력'],kind='reg', height=3)
# reg : regression,

def drawGraph():
    sns.pairplot(
        data=crime_anal_norm,
        x_vars=['인구수','CCTV'], 
        y_vars=['살인','강도'],
        kind="reg",
        height=4
    )
    plt.show()
def drawGraph():
    sns.pairplot(
        data=crime_anal_norm,
        x_vars=['인구수','CCTV'], 
        y_vars=['살인검거율','폭력검거율'],
        kind="reg",
        height=4
    )
    plt.show()
def drawGraph():
    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=0.5, #간격설정
                cmap="RdPu"
    )
    plt.title("범죄 검거 비율 (정규화된 검거의 합으로 정렬)")
    plt.show()

기본적으로 그냥 위도, 경도를 알려주면 동작한다. (구글지도에서 우클릭시 위도,경도 나옴)
기본 지도 그리기 : folium.Map(location = [위도, 경도], zoom_size = 크기, tiles="option")
# 지도를 html로 저장가능하다.
지도.svae("./경로/뭐뭐.html")
tiles option : 지도의 스타일 옵션 선택
tiles option
- "OpenStreetMap" - "Mapbox Bright" (Limited levels of zoom for free tiles) - "Mapbox Control Room" (Limited levels of zoom for free tiles) - "Stamen" (Terrain, Toner, and Watercolor) - "Cloudmade" (Must pass API key) - "Mapbox" (Must pass API key) - "CartoDB" (positron and dark_matter)
import folium
import pandas as pd
import json
m = folium.Map(location = [37.54, 127.05],
               zoom_start = 15,
               tiles="OpenStreeMap",) 
#0~18 까지를 권장, 0이 가장 큼
folium.Marker(location=(37.547123, 127.047219169),
              popup = "Subway",
             tooltip = "성수역",
             icon =folium.Icon(color="black", 
                               icon_color = "green",
                               icon = 'bookmark',angle = 50, prefix='fa') ).add_to(m)
m
m = folium.Map(
    location=[37.544564958079896, 127.05582307754338], # 성수역 
    zoom_start=14,
    tiles="OpenStreetMap"
) # 0 ~ 18 
# tooltip 
folium.Marker(
    location=[37.544564958079896, 127.05582307754338],
    popup="<b>Subway</b>",
    tooltip="<i>성수역</i>"
).add_to(m)
# html  
folium.Marker(
    location=[37.54558642069953, 127.05729705810472],
    popup="<a href='https://zero-base.co.kr/' target=_'blink'>제로베이스</a>",
    tooltip="<i>Zerobase</i>"
).add_to(m)
# Icon custom 
folium.Marker(
    location=[37.54035903907497, 127.06913328776446], # 건대입구역
    popup="건대입구역",
    tooltip="Icon custom",
    icon=folium.Icon(
        color="purple",
        icon_color="white",
        icon="glyphicon glyphicon-cloud",
        angle=50,
        prefix="glyphicon") # glyphicon
).add_to(m)
m

m = folium.Map(location = [37.54, 127.05],
               zoom_start = 15,
               tiles="OpenStreetMap")
m.add_child(folium.ClickForMarker())
LatLngPopup() : 지도를 마우스로 클릭했을 때 위도, 경도 반환
m = folium.Map(location = [37.54, 127.05],
               zoom_start = 15,
               tiles="OpenStreetMap")
m.add_child(folium.LatLngPopup())
Circle() :
fill : 안에 색 채우기 여부, color picker로 색깔 고를 수 있음
m = folium.Map(location = [37.54, 127.05],
               zoom_start = 15,
               tiles="OpenStreetMap")
folium.Circle(location=[37.5417,127.0444],
             radius=100,
             fill=True,
             color="#eb9e34",
              fill_color="red",
              popup="circle",
              tooltip="circle"
             ).add_to(m)
m
CircleMarker() : radius가 조금 다르고 나머진 Circle이랑 똑같음
Choropleth() :
import json 
state_data = pd.read_csv("./data/02. US_Unemployment_Oct2012.csv")
m = folium.Map([43, -102], zoom_start=3)
folium.Choropleth(
    geo_data="./data/02. us-states.json", # 경계선 좌표값이 담긴 데이터
    data=state_data, # Series or DataFrame 
    columns=["State", "Unemployment"], # DataFrame columns 
    key_on="feature.id", #json 파일 까봐야함!
    fill_color="BuPu",
    fill_opacity=0.5, # 0~1 
    line_opacity=0.2, # 0~1
    legend_name="Unemployment rate (%)"    
).add_to(m)
m

import json
import folium
import pandas as pd 
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

# 인구 대비 범죄 발생 건수 시각화
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

# 경찰서별 정보를 가지고 범죄발생과 함께 정리
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)  # numpy 에서 axis=1은 행(가로), pandas에서는 열(세로)
crime_anal_station.head()
# 경찰서 위치를 지도에 표시
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 = 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

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

crime_loc_raw = pd.read_csv("./data/02. crime_in_Seoul_location.csv", thousands=",", encoding="euc-kr")
crime_loc = crime_loc_raw.pivot_table(crime_loc_raw, index=["장소"], columns=["범죄명"], aggfunc=[np.sum])
crime_loc.columns = crime_loc.columns.droplevel([0, 1])
crime_loc.head()
# 정규화
col = ["살인", "강도", "강간", "절도", "폭력"]
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.tail(2)

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()
