Python 라이브러리로 데이터 분석
Python 라이브러리로 데이터 분석하기
Python 라이브러리로 데이터 분석하기 📊
📋 과제 목표
- Python의 데이터 분석 라이브러리 활용.
- 주어진 데이터 파일(.xlsx, .csv)을 불러오고 처리.
- 데이터 프레임 연산 및 통계 처리 연습.
⚙️ 과제 구성 및 주요 기능
데이터 파일
관서별 5대범죄 발생 및 검거.xlsx
: 주요 범죄 발생 및 검거 데이터를 포함.pop_kor.csv
: 인구 데이터를 포함.
주요 기능
- 데이터 파일 읽기:
관서별 5대범죄 발생 및 검거.xlsx
와pop_kor.csv
를 Pandas를 사용해 불러오기.
- 구 이름 매핑:
- 경찰서 이름(
관서명
)을 서울시 구 이름(구별
)로 매핑.
- 경찰서 이름(
- DataFrame 병합 및 정리:
pivot_table
로 구별 데이터를 집계.구 없음
행 삭제.
- 검거율 계산:
- 강간, 강도, 살인, 절도, 폭력의 검거율을 계산하여 새로운 컬럼 추가.
- 컬럼 제거:
- 필요 없는 컬럼 삭제 (
del
사용).
- 필요 없는 컬럼 삭제 (
- 컬럼 이름 변경:
rename
으로 컬럼 이름을 직관적으로 수정.
💻 실행 예제
기본 데이터 출력
1
2
3
4
관서명 살인 발생 살인 검거 강도 발생 강도 검거 강간 발생 강간 검거 절도 발생 절도 검거 폭력 발생 폭력 검거
0 서울 10 10 20 19 30 28 40 35 50 48
1 부산 8 8 15 14 25 23 35 30 45 43
...
최종 데이터 출력 예시
1
2
3
4
강간 강도 살인 절도 폭력 강간검거율 강도검거율 살인검거율 절도검거율 폭력검거율 검거율
구별
강남구 449 21 13 3850 4284 77.728285 85.714286 76.923077 42.857143 86.484594 66.519670
강동구 156 6 4 2366 2712 78.846154 100.000000 75.000000 33.347422 82.890855 60.469108
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 파이썬 라이브러리 중 pandas 사용 as로 별칭 붙여주기
import pandas as pd
# pandas 이용하여 파일 불러오기. 데이터 보기 편하게 head() 함수 이용
df1 = pd.read_csv('pop_kor.csv')
df2 = pd.read_excel('관서별 5대범죄 발생 및 검거.xlsx')
df1.head()
df2.head()
# 관서명을 구 이름으로 매핑하기 위해 매핑할 데이터 입력 후 map()사용하여 매핑. 결측지는 '구 없음'으로 표출
map_data = {
'서대문서': '서대문구', '수서서': '강남구', '강서서': '강서구', '서초서': '서초구',
'서부서': '은평구', '중부서': '중구', '종로서': '종로구', '남대문서': '중구',
'혜화서': '종로구', '용산서': '용산구', '성북서': '성북구', '동대문서': '동대문구',
'마포서': '마포구', '영등포서': '영등포구', '성동서': '성동구', '동작서': '동작구',
'광진서': '광진구', '강북서': '강북구', '금천서': '금천구', '중랑서': '중랑구',
'강남서': '강남구', '관악서': '관악구', '강동서': '강동구', '종암서': '성북구',
'구로서': '구로구', '양천서': '양천구', '송파서': '송파구', '노원서': '노원구',
'방배서': '서초구', '은평서': '은평구', '도봉서': '도봉구'
}
df2['구별'] = df2['관서명'].map(map_data).fillna('구 없음')
# index 사용하여 구별 데이터로 변경하고 같은 구인 경우 aggfunc='sum' 이용하여 더해주기
# 기존 데이터 '관서명'으로 인덱스 되어있던거 아니라서 필요없는 컬럼인 관서명은 drop()이용하여 열 삭제(axis=1)
# pivot = df2.drop(columns=['관서명']).pivot_table(index='구별', aggfunc='sum')
pivot = df2.drop('관서명', axis=1).pivot_table(index='구별', aggfunc='sum')
pivot
# drop() 이용 하여 '구 없음'에 해당하는 행 삭제하기
# 인덱스 삭제할 때, 삭제하려는 항목이 존재하지 않아도 오류를 발생시키지 않도록 errors='ignore' 사용하기
pivot = pivot.drop(index='구 없음', errors='ignore')
# 각 범죄 별로 검거율 계산하고, 각 검거율 데이터 컬럼 추가하기
# for문 사용해서 crime 변수에 공통 단어 넣어주기
for crime in ['강간', '강도', '살인', '절도', '폭력']:
# f-string을 이용해 컬럼명 생성
# 각 범죄 유형에 대해 검거율(= 검거 건수 / 발생 건수 * 100)을 계산해서 컬럼 생성
pivot[f'{crime}검거율'] = (pivot[f'{crime}(검거)'] / pivot[f'{crime}(발생)']) * 100
# 소계에 대한 검거율 컬럼 추가
pivot['검거율'] = (pivot['소계(검거)'] / pivot['소계(발생)']) * 100
# del pivot['강간(검거)'] : del의 경우 단일 열만 지정가능하여 필요없는 컬럼 drop() 이용해서 삭제
del_column = ['강간(검거)', '강도(검거)', '살인(검거)', '절도(검거)', '폭력(검거)', '소계(발생)', '소계(검거)']
# inplace=True 사용하여 원본 테이블에 적용
pivot.drop(del_column, axis=1, inplace=True)
# pivot.drop(columns=del_column, inplace=True)
# rename()이용해서 컬럼명 변경
rename_column = {
'강간(발생)': '강간', '강도(발생)': '강도', '살인(발생)': '살인',
'절도(발생)': '절도', '폭력(발생)': '폭력'
}
# pivot.rename(columns=rename_column, inplace=True)
pivot.rename(rename_column, axis=1, inplace=True)
# 인구 데이터 불러오고 출력하기 head()이용해서 위에서부터 5개까지만
# index_col='구별' 인덱스 셋팅해서 불러오기
pop_data = pd.read_csv('pop_kor.csv', index_col='구별')
pop_data.head()
# join() 사용해서 피벗 테이블과 merge
merge_table = pivot.join(pop_data, how='inner')
# 검거율 기준으로 오름차순 정렬하기
sort_table = merge_table.sort_values(by='검거율')
sort_table
This post is licensed under CC BY 4.0 by the author.