요약
ModuleLoad
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
rc('font', family='Arial Unicode MS')
ds_url = "/Users/min/Documents/ds_study/제로-베이스---데이터-사이언스-스쿨---강의자료---part-01---05--230120-/Part 04. EDA & Part 05. SQL/Part 04. EDA웹 크롤링파이썬 프로그래밍 - 강의자료/210923 - 02. Analysis Seoul Crime/data/"
Crime in Seoul
crime_raw_data = pd.read_csv(ds_url + '02. crime_in_Seoul.csv', thousands = ',', encoding='euc-kr')
crime_raw_data.head()
crime_raw_data['죄종'].unique()
Output : array(['살인', '강도', '강간', '절도', '폭력', nan], dtype=object)
crime_raw_data[crime_raw_data['죄종'].isnull()].head()
crime_raw_data = crime_raw_data[crime_raw_data['죄종'].notnull()] # NaN값 제거
crime_raw_data.info()
제거 전 | 제거 후 |
---|---|
crime_station = crime_raw_data.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]) # columns Level은 위에서부터 0 ~
crime_station.columns
crime_station.index
ModuleLoad & GoogleKey
import googlemaps
gmaps_key = 'AIzaSyAyS0HZsy46gyFUhDlIwYQbHdXXCWHNpc8'
gmaps = googlemaps.Client(key = gmaps_key)
gmaps.geocode()
통해 들어오는 정보 확인gmaps.geocode('서울영등포경찰서', language='ko') # Test
gmaps.geocode()
를 통해 좌표(lat, lng)와 주소(address) 호출 여부 확인tmp = gmaps.geocode('서울영등포경찰서', language='ko')
print(tmp[0].get('geometry')['location']['lat'])
print(tmp[0].get('geometry')['location']['lng'])
print(tmp[0].get('formatted_address'))
Output :
37.5260441 126.9008091 대한민국 서울특별시 영등포구 국회대로 608
tmp = tmp[0].get('formatted_address')
tmp.split()[2]
Output : '영등포구’
구별
, lat
, lng
column 추가crime_station['구별'] = np.nan
crime_station['lat'] = np.nan
crime_station['lng'] = np.nan
crime_station.head()
iterrow()
함수 사용for idx, rows in crime_station.iterrows():
station_name = '서울' + str(idx) + '경찰서'
tmp = gmaps.geocode(station_name, language = 'ko')
# tmp[0].get('formatted_address')
tmp_gu = tmp[0].get('formatted_address')
print(tmp_gu)
구 이름
과 위도(lat)
, 경도(lon)
정보를 저장count = 0
for idx, rows in crime_station.iterrows():
station_name = '서울' + str(idx) + '경찰서'
tmp = gmaps.geocode(station_name, language = '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
try:
crime_station.loc[idx, '구별'] = tmp_gu.split()[2]
except:
crime_station.loc[idx, '구별'] = str(idx) + '구'
print(count)
count += 1
0 level
, 1 level
column을 통해 데이터프레임(DataFrame) Column명 재설정tmp = [crime_station.columns.get_level_values(0)[n] + crime_station.columns.get_level_values(1)[n] for n in range(0, len(crime_station.columns.get_level_values(0)))]
crime_station.columns = tmp
crime_station.head()
Save Data
# 데이터 저장
my_url = '/Users/min/Documents/ds_study/'
crime_station.to_csv(my_url + '02.crime_in_Seoul_raw.csv', sep=',', encoding='utf-8')
pivot_table
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.head()
# 다수의 컬럼을 다수의 컬럼으로 나누기
target = ['강간검거율', '강도검거율', '살인검거율', '절도검거율', '폭력검거율']
num = ['강간검거', '강도검거', '살인검거', '절도검거', '폭력검거']
den = ['강간발생', '강도발생', '살인발생', '절도발생', '폭력발생']
crime_anal_gu[target] = round(crime_anal_gu[num].div(crime_anal_gu[den].values) * 100, 2) # 백분율
crime_anal_gu.head()
발생 건수
와 검거율
에 대해 볼 것이기 때문에, 검거 건수
는 불필요. 따라서 column 제거# 필요 없는 컬럼 제거
del crime_anal_gu['강간검거']
del crime_anal_gu['강도검거']
crime_anal_gu.drop(['살인검거', '절도검거', '폭력검거'], axis = 1, inplace = True)
crime_anal_gu[crime_anal_gu[target] > 100] = 100 # 100보다 큰 숫자 찾아서 바꾸기
crime_anal_gu.head()
crime_anal_gu.rename(columns={'강간발생' : '강간', '강도발생': '강도', '살인발생':'살인', '절도발생':'절도', '폭력발생':'폭력'}, inplace = True)
crime_anal_gu.head() # 컬럼명 변경
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()
CCTV 및 인구 데이터를 불러와 붙여넣기
DataLoad
my_url = '/Users/min/Documents/ds_study/'
result_CCTV = pd.read_csv(my_url + 'CCTV_result.csv', encoding = 'utf-8', index_col = '구별')
result_CCTV.head()
데이터 붙여넣기
crime_anal_norm[['인구수', 'CCTV']] = result_CCTV[['인구수', '소계']]
crime_anal_norm.head()
col_crime = ['살인', '강도', '강간', '절도', '폭력']
col_crime_rate = ['강간검거율', '강도검거율', '살인검거율', '절도검거율', '폭력검거율']
crime_anal_norm['범죄'] = np.mean(crime_anal_norm[col_crime], axis = 1) # axis = 1 : 2차원 배열에서 행을 기준으로 연산 // axis = 0 : 열 기준
crime_anal_norm['검거'] = np.mean(crime_anal_norm[col_crime_rate], axis = 1)
crime_anal_norm.head()
Save data
crime_anal_norm.to_csv(my_url + '02.crime_anal_norm.csv', sep = ',', encoding = 'utf-8')