데이터 : 서울시 관서별 5대 범죄현황의 2016년도 데이터
crime_raw_data = pd.read_csv(
"./data/02. crime_in_Seoul.csv", thousands=",", encoding="euc-kr")
crime_raw_data.head(3)
crime_raw_data.info()
crime_raw_data['죄종'].unique()
# output: array(['살인', '강도', '강간', '절도', '폭력', nan], dtype=object)
crime_raw_data[crime_raw_data['죄종'].isnull()]
crime_raw_data = crime_raw_data[crie_raw_data['죄종'].notnull()]
crime_raw_data.info()
자신이 원하는 기준으로 다시 정렬해줌(index, columns, values, aggfunc)
pd.pivot_table(data, index=['index'], values=['values'], aggfuc= func])
values에 함수 적용가능, 디폴트는 평균이니 다른적용하려면 aggfunc 옵션에 적용
아래는 pivot_table만들기를 위해 사용할 DataFrame이다.
# 예시
pd.pivot_table(df, index=['Manager','Rep'], values=['Price'], columns=['Product'],aggfunc=[np.sum], fill_value=0, margins=True)
crime_station.columns = crime_station.columns.droplevel([0, 1])
crime_station.columns
crime_station = crime_raw_data.pivot_table(index=['구분'],columns=['죄종','발생검거'], aggfunc=[np.sum])
crime_station.head()
그러나 pivot_table 사용시 컬럼이나 인덱스가 멀티로 잡힘
crime_station.columns = crime_station.columns.droplevel([0, 1])
을 통해 sum과 건수를 없애준다.
Multi Index에 대한 접근 : crime_station['sum', '건수', '강도', '검거']이런식
import googlemaps
gmaps_key = 'AIzaSyBJRYXiM1aWW1HsVll88zLRZVYQLSaY4Wg'
gmaps = googlemaps.Client(key=gmaps_key)
crime_station['구별'] = np.nan
crime_station['lat'] = np.nan
crime_station['lng'] = np.nan
for idx, ros in crime_station.iterrows():
station_name = '서울'+str(idx)+'경찰서'
tmp = gmaps.geocode(station_name, lagauage='ko')
tmp[0].get('formatted_address')
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]
crime_station.columns.get_level_values(index)로 확인가능
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_anal_gu = pd.pivot_table(crime_anal_station, index='구별', aggfunc=np.sum)
del crime_anal_gu['lat']
del crime_anal_gu['lng']
target = ['강간검거율', '강도검거율', '살인검거율', '절도검거율', '폭력검거율']
num = ['강간검거', '강도검거', '살인검거', '절도검거', '폭력검거']
den = ['강간발생', '강도발생', '살인발생', '절도발생', '폭력발생']
crime_anal_gu[target] = crime_anal_gu[num].div(crime_anal_gu[den].values) * 100
# denominator,numerator로 분모 분자 뜻함 각각
del crime_anal_gu['강간검거']
del crime_anal_gu['강도검거']
del crime_anal_gu['살인검거']
del crime_anal_gu['절도검거']
del crime_anal_gu['폭력검거']
검거율이 100이 넘는 데이터 -> 작년에 검거했을 수도 있음...
heatmap그래프 그리기 위해 100이 넘는건 강제로 100으로 변환
crime_anal_gu[crime_anal_gu[target] > 100] = 100
crime_anal_gu.rename(
columns={"강간발생":"강간", "강도발생":"강도","살인발생":"살인","절도발생":"절도","폭력발생":"폭력"},
inplace=True)
col = ['살인', '강도', '강간', '절도', '폭력']
crime_anal_norm = crime_anal_gu[col] / crime_anal_gu[col].max()
crime_anal_norm.head()
col2=['강간검거율', '강도검거율', '살인검거율', '절도검거율', '폭력검거율']
crime_anal_norm[col2] = crime_anal_gu[col2]
crime_anal_norm.head
result_CCTV = pd.read_csv("./data/01. CCTV_result.csv",encoding='utf-8',index_col='구별')
crime_anal_norm[["인구수","CCTV"]] = result_CCTV[["인구수","소계"]]
crime_anal_norm.head()
col = ['강간', '강도', '살인', '절도', '폭력']
crime_anal_norm['범죄'] = np.mean(crime_anal_norm[col], axis=1)
crime_anal_norm.head()