시작하기전
1) searborn
import numpy as np
import pandas as pd
#thousands
crime_raw_data = pd.read_csv("../data/02. crime_in_Seoul.csv", thousands=",", encoding="euc-kr")
crime_raw_data.head()
crime_raw_data.info()
crime_raw_data["죄종"].unique()
crime_raw_data = crime_raw_data[crime_raw_data["죄종"].notnull()]
crime_station = crime_raw_data.pivot_table(
crime_raw_data,
index="구분",
columns=["죄종", "발생검거"],
aggfunc=[np.sum]) #sum이라는 column 나오려면 []필요
#MultiIndex
crime_station.columns
'''
MultiIndex([('sum', '건수', '강간', '검거'),
('sum', '건수', '강간', '발생'),
('sum', '건수', '강도', '검거'),
('sum', '건수', '강도', '발생'),
('sum', '건수', '살인', '검거'),
('sum', '건수', '살인', '발생'),
('sum', '건수', '절도', '검거'),
('sum', '건수', '절도', '발생'),
('sum', '건수', '폭력', '검거'),
('sum', '건수', '폭력', '발생')],
names=[None, None, '죄종', '발생검거'])
'''
#다중 컬럼에서 특정 컬럼 제거
crime_station.columns = crime_station.columns.droplevel([0, 1])
crime_station.head()
import googlemaps
gmaps_key="API key"
gmaps=googlemaps.Client(key=gmaps_key)
gmaps.geocode("서울영등포경찰서", language="ko") #단순 테스트 코드
tmp = gmaps.geocode("서울영등포경찰서", language="ko")
#len(tmp)=1 → index=0, dict이라서 이렇게 접근(lat 위도, lng 경도)
print(tmp[0].get("geometry")["location"]["lat"])
print(tmp[0].get("geometry")["location"]["lng"])
#주소 값을 띄어쓰기로 나누고 '구'에 해당하는 index
tmp[0].get("formatted_address").split()[2]
#NaN을 넣어 저장할 준비
crime_station["구별"] = np.nan
crime_station["lat"] = np.nan
crime_station["lng"] = np.nan
#idx -> 현재 '구분'
#iterrow(), NaN
for idx, rows in crime_station.iterrows():
station_name = "서울" + str(idx) + "경찰서"
tmp = gmaps.geocode(station_name, language="ko")
tmmp_gu = tmp[0].get("formatted_address").split()[2]
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, "구별"] = tmmp_gu
# 컬럼 합치기
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)))
]
'''
tmp = ['강간검거', '강간발생', '강도검거','강도발생', '살인검거', '살인발생', '절도검거', '절도발생', '폭력검거', '폭력발생', '구별', 'lat', 'lng']
'''
crime_station.columns = tmp
crime_station.head()
# 데이터 저장
crime_station.to_csv("../data/02. crime_station_raw.csv", sep=",", encoding="utf-8")
#index_col '구분'을 인덱스 칼럼으로 적용
crime_anal_station = pd.read_csv("../data/02. crime_station_raw.csv", index_col=0, encoding="utf-8")
#pivot_table, column 삭제
crime_anal_gu = pd.pivot_table(crime_anal_station, index="구별", aggfunc=np.sum)
del crime_anal_gu["lat"]
crime_anal_gu.drop("lng", axis=1, inplace=True)
#검거율 생성
target = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율"]
num = ["강간검거", "강도검거", "살인검거", "절도검거", "폭력검거"]
den = ["강간발생", "강도발생", "살인발생", "절도발생", "폭력발생"]
crime_anal_gu[target] = crime_anal_gu[num].div(crime_anal_gu[den].values) * 100
#필요 없는 컬럼 제거
del crime_anal_gu["강간검거"]
del crime_anal_gu["강도검거"]
del crime_anal_gu["살인검거"]
crime_anal_gu.drop(["절도검거", "폭력검거"], axis=1, inplace=True)
# 100보다 큰 숫다 찾아서 바꾸기
crime_anal_gu[crime_anal_gu[target] > 100] = 100
#컬럼 이름 변경
crime_anal_gu.rename(columns={"강간발생":"강간", "강도발생":"강도", "살인발생":"살인", "절도발생":"절도", "폭력발생":"폭력"}, inplace=True)
crime_anal_gu.head()
# 정규화 범죄발생수
col = ["강간", "강도", "살인", "절도", "폭력"]
crime_anal_norm = crime_anal_gu[col] / crime_anal_gu[col].max()
# 검거율 추가
col2 = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율"]
crime_anal_norm[col2] = crime_anal_gu[col2]
# CCTV
result_CCTV = pd.read_csv("../data/01. CCTV_reulst.csv", index_col="구별", encoding="utf-8")
crime_anal_norm[["인구수", "CCTV"]] = result_CCTV[["인구수", "소계"]]
#'범죄' 칼럼
col = ["강간", "강도", "살인", "절도", "폭력"]
crime_anal_norm["범죄"]=np.mean(crime_anal_norm[col], axis=1)
# '검거' 컬럼
col = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율"]
crime_anal_norm["검거"] = np.mean(crime_anal_norm[col], axis=1)
crime_anal_norm
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import rc
plt.rcParams["axes.unicode_minus"]=False
get_ipython().run_line_magic("matplotlib", "inline")
rc("font", family="Arial Unicode MS")
# kind : {'scatter', 'kde', 'hist', 'reg'}
sns.pairplot(data=crime_anal_norm, vars=["살인", "강도", "폭력"], kind="reg", height=4)
def drawGraph():
sns.pairplot(
data=crime_anal_norm,
x_vars=["인구수", "CCTV"],
y_vars=["살인", "강도"],
kind="reg",
height=4
)
plt.show()
drawGraph()
def drawGraph():
sns.pairplot(
data=crime_anal_norm,
x_vars=["인구수", "CCTV"],
y_vars=["살인검거율", "폭력검거율"],
kind="reg",
height=4
)
plt.show()
drawGraph()
def drawGraph():
sns.pairplot(
data=crime_anal_norm,
x_vars=["인구수", "CCTV"],
y_vars=["절도검거율", "강도검거율"],
kind="reg",
height=4
)
plt.show()
drawGraph()
#"검거"평균 기준으로 정렬
def drawGraph():
#데이터 프레임 생성
target_col=["살인검거율", "강도검거율", "절도검거율", "폭력검거율", "강간검거율", "검거"]
crime_anal_norm_sort= crime_anal_norm.sort_values(by="검거", ascending=False)#내림차순
#그래프 설정
plt.figure(figsize=(10, 10))
sns.heatmap(
data=crime_anal_norm_sort[target_col],
annot=True,
fmt='f', #실수
linewidths=0.5, #간격설정
cmap="RdPu"
)
plt.title("범죄 검거 비율(정규화된 검거의 합으로 정렬)")
plt.show()
drawGraph()
#"범죄"평균 기준으로 정렬
def drawGraph():
#데이터 프레임 생성
target_col=["살인", "강도", "절도", "폭력", "강간", "범죄"]
crime_anal_norm_sort= crime_anal_norm.sort_values(by="범죄", ascending=False)#내림차순
#그래프 설정
plt.figure(figsize=(10, 10))
sns.heatmap(
data=crime_anal_norm_sort[target_col],
annot=True,
fmt='f', #실수
linewidths=0.5, #간격설정
cmap="RdPu"
)
plt.title("범죄 비율(정규화된 발생 건수로 정렬)")
plt.show()
drawGraph()
#데이터 저장
crime_anal_norm.to_csv("../data/02. crime_in_Seoul_final.csv", sep=",", encoding="utf-8")
Reference
1) 제로베이스 데이터스쿨 강의자료
2) 정규화 이유
3) Pandas DataFrame 반복
#하나의 컬럼을 다른 컬럼으로 나누기
crime_anal_gu["강도검거"]/crime_anal_gu["강도발생"]
#다수의 컬럼을 다른 칼럼으로 나누기
crime_anal_gu[["강도검거", "살인검거"]].div(crime_anal_gu["강도발생"], axis=0).head()
#다수의 컬럼을 다수의 컬럼으로 나누기
num = ["강간검거", "강도검거", "살인검거", "절도검거", "폭력검거"]
den = ["강간발생", "강도발생", "살인발생", "절도발생", "폭력발생"]
crime_anal_gu[num].div(crime_anal_gu[den].values).head()