목표: 강남 3구의 범죄 현황
crime_raw_data = pd.read_csv(
'../파일 이름', thousands=',', encoding='euc-kr'
)
crime_raw_data.head(3)
crime_raw_data.info()
crime_raw_data['죄종'].unique()
crime_raw_data = crime_raw_data[crime_raw_data['죄종'].notnull()]
crime_raw_data.info()
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
# 마이너스 부호 때문에 한글이 깨질 수 있기 때문에 설정
plt.rcParams["axes.unicode_minus"] = False
rc('font', family='Malgun Gothic')
%matplotlib inline
import seaborn as sns
import googlemaps
import folium
import json
pivot_table
: index, columns, values, aggfunc 등의 옵션으로 데이터 정리, 재정렬index
: 원하는 기준 선택columns
: 원하는 열 선택values
: 원하는 출력 선택aggfunc
: 중복값을 처리할 방법 선택으로 다중 선택도 가능, 기본값 평균-np.mean
np.sum, np.mean, len
등fill_value
: NaN 데이터 처리margins
: 합계 지정(aggfunc에 따라 각 행을 계산)
1
df = pd.read_excel('../data/파일 이름')
df.head()
2
pd.pivot_table(df, index=['Name'])
3
pd.pivot_table(df,index=['Name','Rep','Manager'])
4
pd.pivot_table(df,index=['Manager','Rep'], values=['Price'])
5
pd.pivot_table(df,index=['Manager','Rep'], values=['Price'], aggfunc=np.sum)
aggfunc
옵션으로 values에 함수 적용가능6
pd.pivot_table(df,index=['Manager','Rep'], valeus=['Price'], aggfunc=[np.mean,len])
7
pd.pivot_table(df, index=['Manager','Rep'], values=['Price'], columns=['Products'], aggfunc=[np.sum])
8
pd.pivot_table(
df,
index=['Manager','Rep'],
values=['Price'],
columns=['Products'],
aggfunc=[np.sum],
fill_value=0
)
9
pd.pivot_table(
df,
index=['Manager','Rep','Product'],
values=['Price','Quantity'],
aggfunc=[np.sum,np.mean],
fill_value=0,
margins=True
)
구별 혹은 경찰서별 데이터가 필요한데 이를 위한 명령어
crime_station = pd.pivot_table(
crime_raw_data,
index=['구분'],
columns=['죄종','발생검거'],
aggfunc=[np.sum]
)
crime_station.head()
crime_station.columns
crime_station.columns = crime_station.columns.droplevel([0,1])
crime_station.columns
droplevel
: 다중 컬럼에서 특정 컬럼 제거crime_station.head()
crime_station.index
conda install -c conda-forge googlemaps
import googlemaps
gmaps_key = 'API Key'
gmaps = googlemaps.Client(key=gmaps_key)
gmaps.geocode('서울영등포경찰서', langeuage='ko')
iterrows()
iterrows()
라는 옵션을 사용하면 편하다import googlemaps
gmaps_key = 'API Key'
gmaps = googlemaps.Client(key=gmaps_key)
gmaps.geocode('서울영등포경찰서', langeuage='ko')
tmp = gmaps.geocode('서울영등포경찰서', langeuage='ko')
print(tmp[0].get('geometry')['location']['lat'])
print(tmp[0].get('geometry')['location']['lng'])
print(tmp[0].get('formatted_address'))
tmp[0]
으로 접근get
으로 접근(dict형에서 데이터를 얻는 get명령을 사용)tmp = tmp[0].get('formatted_address')
tmp.split()
crime_station['구별'] = np.nan
crime_station['lat'] = np.nan
crime_station['lng'] = np.nan
crime_station.head()
for idx, rows in crime_station.iterrows():
station_name = '서울' + str(idx) + '경찰서'
tmp = gmaps.geocode(station_name, language='ko')
tmp_gu = tmp[0].get('formatted_address')
lat = tmp[0].get('geometry')['location']['lat'])
lng = tmp[0].get('geometry')['location']['lng'])
crime_station.loc[idx, 'lat'] = lat
crime_station.loc[idx, 'lng'] = lng
crime_station.loc[idx, '구별'] = tmp_gu.split()[2]
loc
옵션을 사용crime_station.head()
# 레벨0, 레벨1의 컬럼명을 합쳐 컬럼명 변경
tmp = [
crime_station.columns.get_level_values(0)[n]
+ crime_station.columns.get_level_values(1)[n]
for n in range(len(crime_station.columns.get_level_values(0)))
]
crime_station.columns = tmp
crime_station.columns
get_level_values(N)
: 각 레벨의 컬럼명 추출crime_station.to_csv('../data/파일 이름',sep=',', encoding='utf-8')
crime_anal_station = pd.read_csv(
'../data/파일 이름', index_col=0, encoding='utf-8'
)
crime_anal_station.head()
crime_anal_gu = pd.pivot_table(crime_anal_station, index='구별', aggfunc=np.sum)
# 위도와 경도를 필요없으므로 삭제
del crime_anal_gu["lat"]
del crime_anal_gu["lng"]
# crime_anal_gu.drop("lng", axis=1, inplace=True)
crime_anal_gu.head()
target = ['강간검거율','강도검거율','살인검거율','절도검거율','폭력검거율']
num = ['강간검거','강도검거','살인검거','절도검거','폭력검거']
den = ['강간발생','강도발생','살인발생','절도발생','폭력발생']
crime_anal_gu[target] = crime_anal_gu[num].div(crime_anal_gu[den].values) * 100
crime_anal_gu.head()
del crime_anal_gu['강간검거']
del crime_anal_gu['강도검거']
del crime_anal_gu['살인검거']
del crime_anal_gu['절도검거']
del crime_anal_gu['폭력검거']
crime_anal_gu.head()
crime_anal_gu[crime_anal_gu[target] > 100] = 100
crime_anal_gu.head()
crime_anal_gu.rename(
columns={
'강간발생':'강간',
'강도발생':'강도',
'살인발생':'살인',
'절도발생':'절도',
'폭력발생':'폭력'
}, inplace=True
)
crime_anal_gu.head()