코딩하는 타코야끼

[스터디 노트] Week5_5일차 [unit22 ~ 32] - EDA(범죄) 본문

zero-base 데이터 취업 스쿨/스터디 노트

[스터디 노트] Week5_5일차 [unit22 ~ 32] - EDA(범죄)

가스오부시 2023. 8. 16. 01:43
728x90
반응형

1. 범죄현황 데이터 시각화

crime_anal_norm.head()


📍 시각화

sns.pairplot(crime_anal_norm, vars = ["강도", "살인", "폭력"], kind = "reg",height = 3)
plt.show()


📍 범죄 검거 비율

def draw_graph():
    target_col = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율", "검거"]
    crime_anal_norm_sort = crime_anal_norm.sort_values("검거", ascending = True)
    
    plt.figure(figsize = (10, 10))
    sns.heatmap(crime_anal_norm_sort[target_col],
               annot = True,
               fmt = "f",
               linewidth = 0.5,
               cmap = "RdPu")
    
    plt.title("범죄 검거 비율 (정규화된 검거의 합으로 정렬)")
    plt.show()
    
draw_graph()


📍 범죄 비율

def draw_graph():
    target_col = ["강간", "강도", "살인", "절도", "폭력", "범죄"]
    crime_anal_norm_sort = crime_anal_norm.sort_values("범죄", 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()
    
draw_graph()


📍 Folium

  • Folium은 Python의 라이브러리로, 지도를 생성하고 지도 위에 데이터를 시각화하는데 사용됩니다.
  • 이 라이브러리는 Leaflet.js 라이브러리를 기반으로 하며, Python과 연동하여 사용할 수 있도록 설계되었습니다.
  • Folium은 인터랙티브한 시각화를 만들 수 있어서 웹 페이지에 임베드하거나, Jupyter Notebook에서 직접 보여줄 수 있습니다.
  • 이 외에도 Folium은 Choropleth 지도(지역별 통계 데이터를 색상으로 표현한 지도)를 생성하는 등의 고급 기능을 제공합니다.
import folium
m = folium.Map(location = [45.5236, -122.6750])
m

📎 지도를 html로 저장 가능

m.save("../ds_study/unit2/data/index.html")

📎 스타일을 tiles 옵션으로 지정

folium.Map(location = [45.5236, -122.6750], tiles = "Stamen Toner", zoom_start = 13)


📍 마커 추가 ( folium.Marker( ) )

my_map = folium.Map(location = [45.372, -121.6972], tiles = "Stamen Terrain", zoom_start = 12)

folium.Marker([45.3288, -121.6625], popup = "<i>Mt. Hood Meadows</i>").add_to(my_map)
folium.Marker([45.3311, -121.7113], popup = "<b>Timberline Lodge</b>").add_to(my_map)

my_map


📍 다양한 아이콘 지원

# 다양한 아이콘 지원
m = folium.Map(location = [45.372, -121.6972], start_size = 12, tiles = "Stamen Terrain")
folium.Marker(location = [45.3288, -121.6625],
             popup = "Mt. Hood Meadows",
             icon = folium.Icon(icon = "cloud")).add_to(m)
folium.Marker(location = [45.3311, -121.7113],
             popup = "Timberline Lodge",
             icon = folium.Icon(color = "green")).add_to(m)
folium.Marker(location = [45.3300, -121.6823],
             popup = "한글 테스트",
             icon = folium.Icon(color = "red", icon = "info-sign")).add_to(m)

m


📍Circle 마커

  • folium.Circle( ), folium.CircleMarker( )
m = folium.Map(location=[45.5236, -122.6750], tiles="Stamen Toner", zoom_start=13)
folium.Circle(
    radius=100,
    location=[45.5244, -122.6699],
    popup="The Waterfront",
    color="crimson",
    fill=False).add_to(m)
folium.CircleMarker(
    location=[45.5215, -122.6261],
    radius=50,
    popup="Laurelhurst Park",
    color="#3186cc",
    fill=True,
    fill_color="#3186cc").add_to(m)
m


📍클릭 시 위도 경도 정보 반환

# map.add_child(folium.LatLngPopup()): 클릭 시 위도 경도 정보를 반환
m = folium.Map(location=[46.1991, -122.1889], tiles="Stamen Terrain", zoom_start=13)
m.add_child(folium.LatLngPopup())
m


📍 folium.Choropleth( )

  • m.choropleth()은 Folium 라이브러리에서 제공하는 함수로서, 코로플레스(choropleth) 맵을 만드는데 사용됩니다.
  • 코로플레스 맵은 지리적 영역에 대한 정보를 색상으로 표현한 지도입니다.
  • 이를 통해 특정 지역의 통계치, 인구 밀도 등의 정보를 직관적으로 시각화할 수 있습니다.
    • geo_data: 지리적 영역의 경계를 나타내는 데이터입니다. GeoJSON, TopoJSON, WKT 등 다양한 형식을 지원합니다.
    • data: 코로플레스 맵에 표현할 실제 데이터입니다. Pandas DataFrame 형태의 데이터를 사용할 수 있습니다.
    • columns: DataFrame에서 사용할 열의 이름입니다. 첫 번째 열은 지리적 영역을, 두 번째 열은 해당 영역의 값(value)을 나타냅니다.
    • key_on: geo_data에서 지리적 영역의 이름을 가져오는 데 사용되는 키입니다.
    • fill_color: 지도의 색상 팔레트입니다. 기본값은 'blue'입니다.
    • fill_opacity와 line_opacity: 각각 영역의 채움 색상과 선 색상의 투명도를 설정합니다.
    • legend_name: 범례의 이름입니다.
import json

state_data = pd.read_csv("../ds_study/unit2/data/02. US_Unemployment_Oct2012.csv")
m = folium.Map(location=[48, -102], zoom_start=3)
folium.Choropleth( # m.choropleth는 이전버전임
    geo_data = "../ds_study/unit2/data/02. us-states.json",
    data = state_data,
    columns = ["State", "Unemployment"],
    key_on = "feature.id",
    fill_color = "YlGn",
    fill_opacity = 0.7,
    line_opacity = 0.2,
    legend_name = "Unemployment Rate(%)").add_to(m)
m


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


📍 검거에 적절한 값을 곱해서 원의 넓이로 사용

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)

folium.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).add_to(my_map)

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


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

crime_loc_raw = pd.read_csv(
    "../ds_study/unit2/data/02. crime_in_Seoul_location.csv", 
    thousands=",", encoding="euc-kr")
crime_loc_raw.head()

 crime_loc_raw["장소"].unique()
>>> 
array(['아파트, 연립 다세대', '단독주택', '노상', '상점', '숙박업소, 목욕탕', '유흥 접객업소', '사무실',
       '역, 대합실', '교통수단', '유원지 ', '학교', '금융기관', '기타'], dtype=object)
crime_loc = crime_loc_raw.pivot_table(
    crime_loc_raw, index = "장소", 
    columns = "범죄명", aggfunc = np.sum)
crime_loc.head()

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

col = ["살인", "강도", "강간", "절도", "폭력"]
crime_loc_norm = crime_loc / crime_loc.max()
crime_loc_norm["종합"] = np.mean(crime_loc_norm, axis = 1)
crime_loc_norm.head()

crime_loc_norm_sort = crime_loc_norm.sort_values("종합", ascending = False)

def draw_graph():
    plt.figure(figsize = (8, 8))
    sns.heatmap(crime_loc_norm_sort, annot = True, fmt = "f", linewidths= 0.5, cmap = "RdPu")
    plt.title("범죄와 발생 장소")
    plt.show()

draw_graph()

반응형