상세 컨텐츠

본문 제목

[K-DIGITAL] 파이썬 통계자료 분석 및 시각화(2) 데이터 시각화

PYTHON/K-DIGITAL

by ranlan 2021. 6. 16. 00:03

본문

728x90

멋쟁이사자처럼 X K-DIGITAL Training - 06.10

 

 

[이전] 파이썬 통계자료 분석 및 시각화 복습(1) 데이터 전처리

2021.06.15 - [python/K-Digital] - [K-DIGITAL] 파이썬 통계자료 분석 및 시각화 복습(1) 데이터 전처리

 

[K-DIGITAL] 파이썬 통계자료 분석 및 시각화 복습(1) 데이터 전처리

멋쟁이사자처럼 X K-DIGITAL Training - 06.09 필요한 라이브러리 준비 import numpy as np import pandas as pd numpy 벡터, 행렬 등 수치 연산을 수행하는 선형대수 라이브러리 pandas 데이터 처리 및 분석 라이..

juran-devblog.tistory.com


 

필요한 라이브러리

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import folium

# font
from matplotlib import font_manager, rc # rc == run configure(configuration file)

%matplotlib inline 
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name) # run configure

matplotib  데이터를 차트로 시각화

seaborn  matplotlib에 기반하여 제작된 파이썬 데이터 시각화 모듈

folium  지도 라이브러리

 

 

 

데이터 전처리

2021.06.15 - [python/K-Digital] - [K-DIGITAL] 파이썬 통계자료 분석 및 시각화 복습(1) 데이터 전처리

 

gu_df
crime_ratio

 

경찰서 위치 데이터 및 경찰서별 검거율 계산

 

df (구별로 합치기 전)

필요없는 행('계') 삭제

- drop([행 리스트])

- del df['열 이름']

df = df.drop([0])

간략화된 경찰서명 변경

station_name = []

for name in df['관서명']: 
    # 중부서 -> 서울 + 중부 + 경찰서
    station_name.append('서울' + name[:-1] + '경찰서')

df['경찰서'] = station_name # '경찰서' 열 추가

경찰서별 검거율 계산

- 검거율 추가

df['검거율'] = df['소계(검거)'] / df['소계(발생)'] * 100

- 정규화 (1~100 사이 점수로 환산)

def reRange(x, oldMin, oldMax, newMin, newMax):
    return (x - oldMin) * (newMax - newMin) / (oldMax - oldMin) + newMin

df['점수'] = reRange(df['검거율'], min(df['검거율']), max(df['검거율']), 1, 100)

- 점수 기준 내림차순 정렬

  sort_values(by='열 이름', 오름차순 여부(ascending), 덮어쓰기 여부(inplace))

df.sort_values(by = '점수', ascending = False, inplace = True)

df[['관서명', '경찰서', '검거율', '점수']]

 

 

Google Maps Geocoding Api

구글맵스 api 이용하여 경찰서 좌표 데이터(위도, 경도) 받아오기

import googlemaps
gmaps = googlemaps.Client(key={api_key})

예) '서울강남경찰서'

map_ex = gmaps.geocode('서울강남경찰서', language="ko")
map_ex[0].get('geometry')['location']

경찰서 위도, 경도 데이터 추가

lat = [] # 위도
lng = []  # 경도

for name in df['경찰서']:
    tmpMap = gmaps.geocode(name)
    lat.append(tmpMap[0].get('geometry')['location']['lat'])
    lng.append(tmpMap[0].get('geometry')['location']['lng'])
    
df['위도'] = lat
df['경도'] = lng

df[['관서명', '경찰서', '검거율', '점수', '위도', '경도']]

 

 

 

데이터 시각화

heatmap 차트

- '전체발생비율' 열 기준 정렬

plt.figure(figsize = (10,10)) # chart size
sns.heatmap(crime_ratio.sort_values(by='전체발생비율', ascending=False),annot=True, fmt='f', linewidths=.5, cmap='Reds')
plt.title('인구수 대비 전체 범죄 발생비율')
plt.show()

- '살인' 열 기준 정렬

 

 

구 별 데이터 지도 시각화

json 라이브러리와 서울시 지리정보(json) 준비

- json 라이브러리

- json.load(open('파일명', mode, encoding))

import json # json 라이브러리

geo_str = json.load(open('geo_information.json', 'r', encoding = 'utf-8'))

지도 생성

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

map_seoul

 

구 별 살인 범죄 발생수 데이터 지도 위 시각화

map = folium.Map(location=[37.5502, 126.982], zoom_start=11, tiles='Stamen Toner')

map.choropleth(geo_data = geo_str, # 지도 데이터
               data = gu_df['살인'], # 시각화할 데이터
               columns = [gu_df.index, gu_df['살인']], # 인덱스, 데이터
               fill_color = 'PuRd', # 색상
               key_on = 'feature.id')

 

구 별 5대 범죄 전체 발생비율 지도 위 시각화

map = folium.Map(location=[37.5502, 126.982], zoom_start=11, tiles='Stamen Toner')

map.choropleth(geo_data = geo_str, # 지도 데이터             
               data = crime_ratio['전체발생비율'], # 시각화 데이터
               columns = [crime_ratio.index, crime_ratio['전체발생비율']], # 인덱스, 데이터
               fill_color = 'BuGn', # 색상
               key_on = 'feature.id')

 

 

경찰서별 범죄현황 데이터 지도 시각화

경찰서별 검거율 데이터

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

for n in df.index:
    folium.CircleMarker([df['lat'][n], df['lng'][n]], # 위도 경도 좌표
                        radius = df['검거율'][n], # 시각화 데이터
                        color = '#3186cc', fill = True, fill_color = '#3186cc').add_to(map)

 

경찰서별 검거율 점수 데이터 (위의 그래프보다 비교하기 더 쉬움)

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

for n in df.index: 
    folium.CircleMarker([df['lat'][n], df['lng'][n]], 
                         radius = df['점수'][n],
                         color = '#3186cc', fill = True, fill_color = '#3186cc').add_to(map)

 

인구 수 대비 5대 범죄 발생 비율 기준 구별 데이터 & 경찰서별 검거율 데이터 시각화

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

# 인구 수 대비 구별 5대 범죄 발생비율
map.choropleth(geo_data = geo_str,
               data = crime_ratio['전체발생비율'],
               columns = [crime_ratio.index, crime_ratio['전체발생비율']],
               fill_color = 'PuRd', 
               key_on = 'feature.id')

# 경찰서별 검거율 데이터
for n in df.index:
    folium.CircleMarker([df['lat'][n], df['lng'][n]], 
                        radius = df['점수'][n] * 0.7, # 0.5 -> 0.7
                        color = '#3186cc', fill = True, fill_color = '#3186cc').add_to(map)

 

 

 

데이터 출력

엑셀파일로 저장 - to_excel('파일명.xlsx', encoding='utf-8')

csv파일로 저장 - to_csv('파일명.csv', encoding='euc-kr')

* 한글 인코딩 utf-8 / euc-kr / cp949

 

지도 html 문서로 저장 - map.save('파일명.html')

728x90

관련글 더보기

댓글 영역