EDA - 범죄 3 : 데이터 취업 스쿨 스터디 노트 11/30

slocat·2023년 11월 30일
0

start-data

목록 보기
28/75

6. 구별 데이터로 변경하기

6-1. 피벗 테이블 적용

crime_anal_gu = crime_anal_station.pivot_table(index="구별", aggfunc=np.sum)

# 필요 없는 정보 삭제(위도, 경도) - 2가지 방법으로
del crime_anal_gu["lat"]
crime_anal_gu.drop("lng", axis=1, inplace=True)

6-2. 다수의 컬럼을 다른 컬럼으로 나누기

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.div.html

# 하나의 컬럼을 다른 컬럼으로 나누기
crime_anal_gu["강도검거"] / crime_anal_gu["강도발생"]

# 다수의 컬럼을 다른 컬럼으로 나누기
crime_anal_gu[["강도검거", "살인검거"]].div(crime_anal_gu["강도발생"], axis=0).head(3)

# 다수의 컬럼의 다수의 컬럼으로 각각 나누기
num = ["강간검거", "강도검거", "살인검거", "절도검거", "폭력검거"]
den = ["강간발생", "강도발생", "살인발생", "절도발생", "폭력발생"]
crime_anal_gu[num].div(crime_anal_gu[den].values)

# ❗
# crime_anal_gu[num].div(crime_anal_gu[den]) ❌
# crime_anal_gu[num].div(crime_anal_gu[den].values) ⭕

6-3. 100을 초과하는 검거율을 100으로 변경

이전에 발생한 범죄까지 검거했다면 계산상으로 검거율이 100이 넘을 수 있다. 발생 연도와 검거 연도를 구분하여 분석하면 좋겠지만, 지금 단계에서는 수치를 100으로 만들기도 했다.(heatmap을 그릴 때 100이 넘어가면 문제가 될 수 있음)

# 100보다 큰 숫자 찾기
crime_anal_gu[crime_anal_gu[target] > 100]

# 100으로 변경
crime_anal_gu[crime_anal_gu[target] > 100] = 100

6-4. 컬럼 이름 변경

crime_anal_gu.rename(columns={"강간발생": "강간",
                              "강도발생": "강도",
                              "살인발생": "살인",
                              "절도발생": "절도",
                              "폭력발생": "폭력"}, inplace=True)

7. 구별 데이터에서 발생 건수 정규화 데이터 생성

검거율은 잘 정리되었으나, 범죄의 경중에 따라 발생 건수 차이가 크다.
이 상태로 시각화하면 눈에 잘 띄지 않고, 시각화 단계에서 스케일을 조정할 필요가 생긴다. 이를 예방하기 위해 maximum 값으로 나눠준다.
(최댓값 = 1, 최솟값 = 0)

# crime_anal_norm 등장
cols = ["강간", "강도", "살인", "절도", "폭력"]
crime_anal_norm = crime_anal_gu[cols] / crime_anal_gu[cols].max()

crime_anal_norm에 검거율을 추가하고,

cols = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율"]
crime_anal_norm[cols2] = crime_anal_gu[cols]

앞서 CCTV 프로젝트에서 정리한 데이터셋에서 인구수, CCTV수도 가져온다.

crime_anal_norm[["인구수", "CCTV"]] = result_CCTV[["인구수", "소계"]]

7-1. 범죄, 검거 컬럼의 대표값 설정

정규화된 범죄 발생 건수 전체의 평균을 구해서 범죄 컬럼의 대표값으로 사용한다.

# np.mean : 행렬의 평균을 구함
cols = ["강간", "강도", "살인", "절도", "폭력"]
crime_anal_norm["범죄"] = np.mean(crime_anal_norm[cols], axis=1)

검거율의 평균을 구해서 검거 컬럼의 대표값으로 사용한다.

cols = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율"]
crime_anal_norm["검거"] = np.mean(crime_anal_norm[cols], axis=1)

❗ 데이터 정리 마무리 - 오류 검거

결과물을 확인하다가 오류를 발견했다.
head() 아래에 감춰진...

geocode()에 '서울노원경찰서'를 넣으면 formatted_address의 인덱스=2 값이 '노원경찰서'로 되어 있다.😅

'노원경찰서'로 검색하면 '노원구'로 나오길래 앞에서 적용한 for문을 조금 수정해서 해결했다.

❗❗❗ 관악구와 금천구의 범죄, 검거 값이 다르다?!

강의 결과물과 비교해보니 애초에 행의 개수가 다르다.
나의 데이터에는 금천구가 있고, 강의 내용에는 금천구가 없다.

강의 자료 데이터에는 금천경찰서가 관악구 소속이네!
음...?🙉

🔥범죄 2 퀴즈 오답노트

pandas에서 to_csv 명령을 통해 csv 파일로 데이터를 저장하는 내용에서 틀린 것은?
1. 경로명과 파일명을 지정하지 않으면 기본값으로 저장된다. (정답)
2. 컬럼간 구분을 지정하는 옵션을 sep이다.
3. 엔코딩(encoding) 옵션 중 한글을 대응하는 방법으로는 euc-kr이 있다. (내가 고른 답)

0개의 댓글