💡Pandas에 잘 맞춰진 반복문용 명령 iterrows()
- pandas 데이터 프레임은 대부분 2차원, 이럴 때 for문 사용하면 n번째라는 지정을 반복해서 가독률이 떨어짐
- Pandas 데이터프레임으로 반복문 만들때 iterrow()옵션 사용하면 편하다.
- 받을 때, 인덱스와 내용으로 나누어 받는 것만 주의
6. Google Maps를 시용한 데이터 정리
import googlemaps
gmaps_key = "AIzaSyCB3zeKUulnVUj_yDjKqaqoqVsF0MGvx_o"
gmaps = googlemaps.Client(key=gmaps_key)
gmaps.geocode("서울영등포경찰서", language="ko")
[{'address_components': [{'long_name': '608',
'short_name': '608',
'types': ['premise']},
{'long_name': '국회대로',
'short_name': '국회대로',
'types': ['political', 'sublocality', 'sublocality_level_4']},
{'long_name': '영등포구',
'short_name': '영등포구',
'types': ['political', 'sublocality', 'sublocality_level_1']},
{'long_name': '서울특별시',
'short_name': '서울특별시',
'types': ['administrative_area_level_1', 'political']},
{'long_name': '대한민국',
'short_name': 'KR',
'types': ['country', 'political']},
{'long_name': '150-043',
'short_name': '150-043',
'types': ['postal_code']}],
'formatted_address': '대한민국 서울특별시 영등포구 국회대로 608',
'geometry': {'location': {'lat': 37.5260441, 'lng': 126.9008091},
'location_type': 'ROOFTOP',
'viewport': {'northeast': {'lat': 37.5273930802915,
'lng': 126.9021580802915},
'southwest': {'lat': 37.5246951197085, 'lng': 126.8994601197085}}},
'partial_match': True,
'place_id': 'ChIJ1TimJLaffDURptXOs0Tj6sY',
'plus_code': {'compound_code': 'GWG2+C8 대한민국 서울특별시',
'global_code': '8Q98GWG2+C8'},
'types': ['establishment', 'point_of_interest', 'police']}]
tmp = gmaps.geocode("서울영등포경찰서", language="ko")
len(tmp)
1
tmp[0]
{'address_components': [{'long_name': '608',
'short_name': '608',
'types': ['premise']},
{'long_name': '국회대로',
'short_name': '국회대로',
'types': ['political', 'sublocality', 'sublocality_level_4']},
{'long_name': '영등포구',
'short_name': '영등포구',
'types': ['political', 'sublocality', 'sublocality_level_1']},
{'long_name': '서울특별시',
'short_name': '서울특별시',
'types': ['administrative_area_level_1', 'political']},
{'long_name': '대한민국', 'short_name': 'KR', 'types': ['country', 'political']},
{'long_name': '150-043', 'short_name': '150-043', 'types': ['postal_code']}],
'formatted_address': '대한민국 서울특별시 영등포구 국회대로 608',
'geometry': {'location': {'lat': 37.5260441, 'lng': 126.9008091},
'location_type': 'ROOFTOP',
'viewport': {'northeast': {'lat': 37.5273930802915,
'lng': 126.9021580802915},
'southwest': {'lat': 37.5246951197085, 'lng': 126.8994601197085}}},
'partial_match': True,
'place_id': 'ChIJ1TimJLaffDURptXOs0Tj6sY',
'plus_code': {'compound_code': 'GWG2+C8 대한민국 서울특별시',
'global_code': '8Q98GWG2+C8'},
'types': ['establishment', 'point_of_interest', 'police']}
print(tmp[0].get("geometry")["location"]["lat"])
print(tmp[0].get("geometry")["location"]["lng"])
37.5260441
126.9008091
tmp[0].get("formatted_address")
'대한민국 서울특별시 영등포구 국회대로 608'
tmp[0].get("formatted_address").split()
['대한민국', '서울특별시', '영등포구', '국회대로', '608']
tmp[0].get("formatted_address").split()[2]
'영등포구'
crime_station.head()
죄종 |
강간 |
강도 |
살인 |
절도 |
폭력 |
발생검거 |
검거 |
발생 |
검거 |
발생 |
검거 |
발생 |
검거 |
발생 |
검거 |
발생 |
구분 |
|
|
|
|
|
|
|
|
|
|
강남 |
269.0 |
339.0 |
26.0 |
24.0 |
3.0 |
3.0 |
1129.0 |
2438.0 |
2096.0 |
2336.0 |
강동 |
152.0 |
160.0 |
13.0 |
14.0 |
5.0 |
4.0 |
902.0 |
1754.0 |
2201.0 |
2530.0 |
강북 |
159.0 |
217.0 |
4.0 |
5.0 |
6.0 |
7.0 |
672.0 |
1222.0 |
2482.0 |
2778.0 |
강서 |
239.0 |
275.0 |
10.0 |
10.0 |
10.0 |
9.0 |
1070.0 |
1952.0 |
2768.0 |
3204.0 |
관악 |
264.0 |
322.0 |
10.0 |
12.0 |
7.0 |
6.0 |
937.0 |
2103.0 |
2707.0 |
3235.0 |
crime_station["구별"] = np.nan
crime_station["lat"] = np.nan
crime_station["lng"] = np.nan
crime_station.head()
죄종 |
강간 |
강도 |
살인 |
절도 |
폭력 |
구별 |
lat |
lng |
발생검거 |
검거 |
발생 |
검거 |
발생 |
검거 |
발생 |
검거 |
발생 |
검거 |
발생 |
|
|
|
구분 |
|
|
|
|
|
|
|
|
|
|
|
|
|
강남 |
269.0 |
339.0 |
26.0 |
24.0 |
3.0 |
3.0 |
1129.0 |
2438.0 |
2096.0 |
2336.0 |
NaN |
NaN |
NaN |
강동 |
152.0 |
160.0 |
13.0 |
14.0 |
5.0 |
4.0 |
902.0 |
1754.0 |
2201.0 |
2530.0 |
NaN |
NaN |
NaN |
강북 |
159.0 |
217.0 |
4.0 |
5.0 |
6.0 |
7.0 |
672.0 |
1222.0 |
2482.0 |
2778.0 |
NaN |
NaN |
NaN |
강서 |
239.0 |
275.0 |
10.0 |
10.0 |
10.0 |
9.0 |
1070.0 |
1952.0 |
2768.0 |
3204.0 |
NaN |
NaN |
NaN |
관악 |
264.0 |
322.0 |
10.0 |
12.0 |
7.0 |
6.0 |
937.0 |
2103.0 |
2707.0 |
3235.0 |
NaN |
NaN |
NaN |
- 경찰서 이름에서 소속된 구 이름 얻기
- 구이름과 위도, 경도 정보를 저장할 준비
- 반복문 이용해서 위 표의 NaN을 모두 채워준다.
- iterrows()
for idx, rows in crime_station.iterrows():
print(idx)
강남
강동
강북
강서
관악
광진
구로
금천
남대문
노원
도봉
동대문
동작
마포
방배
서대문
서부
서초
성동
성북
송파
수서
양천
영등포
용산
은평
종로
종암
중랑
중부
혜화
for idx, rows in crime_station.iterrows():
station_name = "서울" + str(idx) + "경찰서"
print(station_name)
서울강남경찰서
서울강동경찰서
서울강북경찰서
서울강서경찰서
서울관악경찰서
서울광진경찰서
서울구로경찰서
서울금천경찰서
서울남대문경찰서
서울노원경찰서
서울도봉경찰서
서울동대문경찰서
서울동작경찰서
서울마포경찰서
서울방배경찰서
서울서대문경찰서
서울서부경찰서
서울서초경찰서
서울성동경찰서
서울성북경찰서
서울송파경찰서
서울수서경찰서
서울양천경찰서
서울영등포경찰서
서울용산경찰서
서울은평경찰서
서울종로경찰서
서울종암경찰서
서울중랑경찰서
서울중부경찰서
서울혜화경찰서
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
crime_station.loc[idx, "구별"] = tmp_gu.split()[2]
print(count)
count += 1
0
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
crime_station.head()
죄종 |
강간 |
강도 |
살인 |
절도 |
폭력 |
구별 |
lat |
lng |
발생검거 |
검거 |
발생 |
검거 |
발생 |
검거 |
발생 |
검거 |
발생 |
검거 |
발생 |
|
|
|
구분 |
|
|
|
|
|
|
|
|
|
|
|
|
|
강남 |
269.0 |
339.0 |
26.0 |
24.0 |
3.0 |
3.0 |
1129.0 |
2438.0 |
2096.0 |
2336.0 |
강남구 |
37.509435 |
127.066958 |
강동 |
152.0 |
160.0 |
13.0 |
14.0 |
5.0 |
4.0 |
902.0 |
1754.0 |
2201.0 |
2530.0 |
강동구 |
37.528511 |
127.126822 |
강북 |
159.0 |
217.0 |
4.0 |
5.0 |
6.0 |
7.0 |
672.0 |
1222.0 |
2482.0 |
2778.0 |
강북구 |
37.637304 |
127.027340 |
강서 |
239.0 |
275.0 |
10.0 |
10.0 |
10.0 |
9.0 |
1070.0 |
1952.0 |
2768.0 |
3204.0 |
양천구 |
37.539783 |
126.829997 |
관악 |
264.0 |
322.0 |
10.0 |
12.0 |
7.0 |
6.0 |
937.0 |
2103.0 |
2707.0 |
3235.0 |
관악구 |
37.474395 |
126.951349 |
crime_station.columns.get_level_values(0)
Index(['강간', '강간', '강도', '강도', '살인', '살인', '절도', '절도', '폭력', '폭력', '구별', 'lat',
'lng'],
dtype='object', name='죄종')
crime_station.columns.get_level_values(1)
Index(['검거', '발생', '검거', '발생', '검거', '발생', '검거', '발생', '검거', '발생', '', '', ''], dtype='object', name='발생검거')
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()
|
강간검거 |
강간발생 |
강도검거 |
강도발생 |
살인검거 |
살인발생 |
절도검거 |
절도발생 |
폭력검거 |
폭력발생 |
구별 |
lat |
lng |
구분 |
|
|
|
|
|
|
|
|
|
|
|
|
|
강남 |
269.0 |
339.0 |
26.0 |
24.0 |
3.0 |
3.0 |
1129.0 |
2438.0 |
2096.0 |
2336.0 |
강남구 |
37.509435 |
127.066958 |
강동 |
152.0 |
160.0 |
13.0 |
14.0 |
5.0 |
4.0 |
902.0 |
1754.0 |
2201.0 |
2530.0 |
강동구 |
37.528511 |
127.126822 |
강북 |
159.0 |
217.0 |
4.0 |
5.0 |
6.0 |
7.0 |
672.0 |
1222.0 |
2482.0 |
2778.0 |
강북구 |
37.637304 |
127.027340 |
강서 |
239.0 |
275.0 |
10.0 |
10.0 |
10.0 |
9.0 |
1070.0 |
1952.0 |
2768.0 |
3204.0 |
양천구 |
37.539783 |
126.829997 |
관악 |
264.0 |
322.0 |
10.0 |
12.0 |
7.0 |
6.0 |
937.0 |
2103.0 |
2707.0 |
3235.0 |
관악구 |
37.474395 |
126.951349 |
crime_station.to_csv("../data/02. Crime_in_Seoul_raw.csv", sep=",", encoding = "utf-8")
pd.read_csv("../data/02. Crime_in_Seoul_raw.csv")
|
구분 |
강간검거 |
강간발생 |
강도검거 |
강도발생 |
살인검거 |
살인발생 |
절도검거 |
절도발생 |
폭력검거 |
폭력발생 |
구별 |
lat |
lng |
0 |
강남 |
269.0 |
339.0 |
26.0 |
24.0 |
3.0 |
3.0 |
1129.0 |
2438.0 |
2096.0 |
2336.0 |
강남구 |
37.509435 |
127.066958 |
1 |
강동 |
152.0 |
160.0 |
13.0 |
14.0 |
5.0 |
4.0 |
902.0 |
1754.0 |
2201.0 |
2530.0 |
강동구 |
37.528511 |
127.126822 |
2 |
강북 |
159.0 |
217.0 |
4.0 |
5.0 |
6.0 |
7.0 |
672.0 |
1222.0 |
2482.0 |
2778.0 |
강북구 |
37.637304 |
127.027340 |
3 |
강서 |
239.0 |
275.0 |
10.0 |
10.0 |
10.0 |
9.0 |
1070.0 |
1952.0 |
2768.0 |
3204.0 |
양천구 |
37.539783 |
126.829997 |
4 |
관악 |
264.0 |
322.0 |
10.0 |
12.0 |
7.0 |
6.0 |
937.0 |
2103.0 |
2707.0 |
3235.0 |
관악구 |
37.474395 |
126.951349 |
5 |
광진 |
234.0 |
279.0 |
6.0 |
11.0 |
4.0 |
4.0 |
1057.0 |
2636.0 |
2011.0 |
2392.0 |
광진구 |
37.542873 |
127.083821 |
6 |
구로 |
181.0 |
273.0 |
13.0 |
10.0 |
9.0 |
9.0 |
861.0 |
1910.0 |
2680.0 |
3164.0 |
구로구 |
37.494931 |
126.886731 |
7 |
금천 |
143.0 |
175.0 |
7.0 |
7.0 |
6.0 |
6.0 |
654.0 |
1264.0 |
1946.0 |
2193.0 |
금천구 |
37.456872 |
126.897043 |
8 |
남대문 |
52.0 |
57.0 |
4.0 |
5.0 |
1.0 |
1.0 |
429.0 |
946.0 |
832.0 |
890.0 |
중구 |
37.554758 |
126.973498 |
9 |
노원 |
142.0 |
159.0 |
9.0 |
6.0 |
6.0 |
5.0 |
740.0 |
1857.0 |
2124.0 |
2516.0 |
노원구 |
37.642139 |
127.071047 |
10 |
도봉 |
121.0 |
123.0 |
5.0 |
5.0 |
3.0 |
3.0 |
492.0 |
866.0 |
1309.0 |
1441.0 |
도봉구 |
37.653359 |
127.052682 |
11 |
동대문 |
158.0 |
190.0 |
12.0 |
10.0 |
5.0 |
5.0 |
1071.0 |
1940.0 |
2377.0 |
2642.0 |
동대문구 |
37.585061 |
127.045768 |
12 |
동작 |
149.0 |
325.0 |
7.0 |
7.0 |
6.0 |
8.0 |
554.0 |
1226.0 |
1444.0 |
1661.0 |
동작구 |
37.513087 |
126.942850 |
13 |
마포 |
320.0 |
399.0 |
7.0 |
4.0 |
4.0 |
4.0 |
940.0 |
2527.0 |
2500.0 |
2939.0 |
마포구 |
37.550814 |
126.954028 |
14 |
방배 |
51.0 |
78.0 |
5.0 |
4.0 |
1.0 |
1.0 |
293.0 |
472.0 |
446.0 |
500.0 |
서초구 |
37.494596 |
126.983128 |
15 |
서대문 |
147.0 |
175.0 |
4.0 |
5.0 |
7.0 |
6.0 |
752.0 |
1503.0 |
1644.0 |
1976.0 |
서대문구 |
37.564744 |
126.966770 |
16 |
서부 |
49.0 |
54.0 |
2.0 |
4.0 |
4.0 |
4.0 |
389.0 |
781.0 |
980.0 |
1128.0 |
은평구 |
37.602140 |
126.921307 |
17 |
서초 |
220.0 |
350.0 |
5.0 |
9.0 |
4.0 |
4.0 |
814.0 |
1733.0 |
1583.0 |
1838.0 |
서초구 |
37.495605 |
127.005250 |
18 |
성동 |
78.0 |
104.0 |
5.0 |
3.0 |
5.0 |
4.0 |
896.0 |
1296.0 |
1408.0 |
1619.0 |
성동구 |
37.561730 |
127.036422 |
19 |
성북 |
75.0 |
103.0 |
3.0 |
3.0 |
2.0 |
2.0 |
381.0 |
790.0 |
1004.0 |
1176.0 |
성북구 |
37.589778 |
127.016589 |
20 |
송파 |
184.0 |
234.0 |
12.0 |
15.0 |
8.0 |
9.0 |
1048.0 |
2543.0 |
2808.0 |
3289.0 |
송파구 |
37.501694 |
127.127248 |
21 |
수서 |
144.0 |
177.0 |
16.0 |
15.0 |
2.0 |
2.0 |
789.0 |
1149.0 |
1431.0 |
1666.0 |
강남구 |
37.493490 |
127.077212 |
22 |
양천 |
108.0 |
131.0 |
7.0 |
7.0 |
5.0 |
5.0 |
755.0 |
1719.0 |
1918.0 |
2250.0 |
양천구 |
37.516771 |
126.865700 |
23 |
영등포 |
225.0 |
356.0 |
14.0 |
19.0 |
13.0 |
13.0 |
940.0 |
2341.0 |
3007.0 |
3593.0 |
영등포구 |
37.526044 |
126.900809 |
24 |
용산 |
214.0 |
251.0 |
10.0 |
9.0 |
4.0 |
4.0 |
599.0 |
1489.0 |
2008.0 |
2384.0 |
용산구 |
37.538710 |
126.965918 |
25 |
은평 |
93.0 |
102.0 |
5.0 |
5.0 |
2.0 |
2.0 |
501.0 |
885.0 |
1328.0 |
1536.0 |
은평구 |
37.628020 |
126.928790 |
26 |
종로 |
113.0 |
137.0 |
3.0 |
6.0 |
0.0 |
4.0 |
389.0 |
952.0 |
1135.0 |
1291.0 |
종로구 |
37.571824 |
126.984153 |
27 |
종암 |
42.0 |
51.0 |
5.0 |
5.0 |
1.0 |
2.0 |
344.0 |
680.0 |
815.0 |
932.0 |
성북구 |
37.601999 |
127.032228 |
28 |
중랑 |
150.0 |
164.0 |
14.0 |
14.0 |
7.0 |
8.0 |
1052.0 |
1691.0 |
2712.0 |
3164.0 |
중랑구 |
37.605643 |
127.076487 |
29 |
중부 |
96.0 |
141.0 |
3.0 |
3.0 |
2.0 |
2.0 |
485.0 |
1204.0 |
1164.0 |
1335.0 |
중구 |
37.563617 |
126.989652 |
30 |
혜화 |
64.0 |
101.0 |
6.0 |
6.0 |
2.0 |
2.0 |
379.0 |
988.0 |
842.0 |
972.0 |
종로구 |
37.571968 |
126.998957 |
7. 구별 데이터로 정리
crime_anal_station = pd.read_csv("../data/02. crime_in_Seoul_raw.csv", index_col=0, encoding="utf-8")
crime_anal_station.head()
|
강간검거 |
강간발생 |
강도검거 |
강도발생 |
살인검거 |
살인발생 |
절도검거 |
절도발생 |
폭력검거 |
폭력발생 |
구별 |
lat |
lng |
구분 |
|
|
|
|
|
|
|
|
|
|
|
|
|
강남 |
269.0 |
339.0 |
26.0 |
24.0 |
3.0 |
3.0 |
1129.0 |
2438.0 |
2096.0 |
2336.0 |
강남구 |
37.509435 |
127.066958 |
강동 |
152.0 |
160.0 |
13.0 |
14.0 |
5.0 |
4.0 |
902.0 |
1754.0 |
2201.0 |
2530.0 |
강동구 |
37.528511 |
127.126822 |
강북 |
159.0 |
217.0 |
4.0 |
5.0 |
6.0 |
7.0 |
672.0 |
1222.0 |
2482.0 |
2778.0 |
강북구 |
37.637304 |
127.027340 |
강서 |
239.0 |
275.0 |
10.0 |
10.0 |
10.0 |
9.0 |
1070.0 |
1952.0 |
2768.0 |
3204.0 |
양천구 |
37.539783 |
126.829997 |
관악 |
264.0 |
322.0 |
10.0 |
12.0 |
7.0 |
6.0 |
937.0 |
2103.0 |
2707.0 |
3235.0 |
관악구 |
37.474395 |
126.951349 |
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)
crime_anal_gu.head()
|
강간검거 |
강간발생 |
강도검거 |
강도발생 |
살인검거 |
살인발생 |
절도검거 |
절도발생 |
폭력검거 |
폭력발생 |
구별 |
|
|
|
|
|
|
|
|
|
|
강남구 |
413.0 |
516.0 |
42.0 |
39.0 |
5.0 |
5.0 |
1918.0 |
3587.0 |
3527.0 |
4002.0 |
강동구 |
152.0 |
160.0 |
13.0 |
14.0 |
5.0 |
4.0 |
902.0 |
1754.0 |
2201.0 |
2530.0 |
강북구 |
159.0 |
217.0 |
4.0 |
5.0 |
6.0 |
7.0 |
672.0 |
1222.0 |
2482.0 |
2778.0 |
관악구 |
264.0 |
322.0 |
10.0 |
12.0 |
7.0 |
6.0 |
937.0 |
2103.0 |
2707.0 |
3235.0 |
광진구 |
234.0 |
279.0 |
6.0 |
11.0 |
4.0 |
4.0 |
1057.0 |
2636.0 |
2011.0 |
2392.0 |
crime_anal_gu["강도검거"] / crime_anal_gu["강도발생"]
구별
강남구 1.076923
강동구 0.928571
강북구 0.800000
관악구 0.833333
광진구 0.545455
구로구 1.300000
금천구 1.000000
노원구 1.500000
도봉구 1.000000
동대문구 1.200000
동작구 1.000000
마포구 1.750000
서대문구 0.800000
서초구 0.769231
성동구 1.666667
성북구 1.000000
송파구 0.800000
양천구 1.000000
영등포구 0.736842
용산구 1.111111
은평구 0.777778
종로구 0.750000
중구 0.875000
중랑구 1.000000
dtype: float64
crime_anal_gu[["강도검거", "살인검거"]].div(crime_anal_gu["강도발생"], axis=0).head(3)
|
강도검거 |
살인검거 |
구별 |
|
|
강남구 |
1.076923 |
0.128205 |
강동구 |
0.928571 |
0.357143 |
강북구 |
0.800000 |
1.200000 |
num = ["강간검거", "강도검거", "살인검거", "절도검거", "폭력검거"]
den = ["강간발생", "강도발생", "살인발생", "절도발생", "폭력발생"]
crime_anal_gu[num].div(crime_anal_gu[den].values).head()
|
강간검거 |
강도검거 |
살인검거 |
절도검거 |
폭력검거 |
구별 |
|
|
|
|
|
강남구 |
0.800388 |
1.076923 |
1.000000 |
0.534709 |
0.881309 |
강동구 |
0.950000 |
0.928571 |
1.250000 |
0.514253 |
0.869960 |
강북구 |
0.732719 |
0.800000 |
0.857143 |
0.549918 |
0.893449 |
관악구 |
0.819876 |
0.833333 |
1.166667 |
0.445554 |
0.836785 |
광진구 |
0.838710 |
0.545455 |
1.000000 |
0.400986 |
0.840719 |
target = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율"]
num = ["강간검거", "강도검거", "살인검거", "절도검거", "폭력검거"]
den = ["강간발생", "강도발생", "살인발생", "절도발생", "폭력발생"]
crime_anal_gu[target] = crime_anal_gu[num].div(crime_anal_gu[den].values) * 100
crime_anal_gu.head()
|
강간검거 |
강간발생 |
강도검거 |
강도발생 |
살인검거 |
살인발생 |
절도검거 |
절도발생 |
폭력검거 |
폭력발생 |
강간검거율 |
강도검거율 |
살인검거율 |
절도검거율 |
폭력검거율 |
구별 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
강남구 |
413.0 |
516.0 |
42.0 |
39.0 |
5.0 |
5.0 |
1918.0 |
3587.0 |
3527.0 |
4002.0 |
80.038760 |
107.692308 |
100.000000 |
53.470867 |
88.130935 |
강동구 |
152.0 |
160.0 |
13.0 |
14.0 |
5.0 |
4.0 |
902.0 |
1754.0 |
2201.0 |
2530.0 |
95.000000 |
92.857143 |
125.000000 |
51.425314 |
86.996047 |
강북구 |
159.0 |
217.0 |
4.0 |
5.0 |
6.0 |
7.0 |
672.0 |
1222.0 |
2482.0 |
2778.0 |
73.271889 |
80.000000 |
85.714286 |
54.991817 |
89.344852 |
관악구 |
264.0 |
322.0 |
10.0 |
12.0 |
7.0 |
6.0 |
937.0 |
2103.0 |
2707.0 |
3235.0 |
81.987578 |
83.333333 |
116.666667 |
44.555397 |
83.678516 |
광진구 |
234.0 |
279.0 |
6.0 |
11.0 |
4.0 |
4.0 |
1057.0 |
2636.0 |
2011.0 |
2392.0 |
83.870968 |
54.545455 |
100.000000 |
40.098634 |
84.071906 |
del crime_anal_gu["강간검거"]
del crime_anal_gu["강도검거"]
crime_anal_gu.drop(["살인검거", "절도검거", "폭력검거"], axis=1, inplace=True)
crime_anal_gu.head()
|
강간발생 |
강도발생 |
살인발생 |
절도발생 |
폭력발생 |
강간검거율 |
강도검거율 |
살인검거율 |
절도검거율 |
폭력검거율 |
구별 |
|
|
|
|
|
|
|
|
|
|
강남구 |
516.0 |
39.0 |
5.0 |
3587.0 |
4002.0 |
80.038760 |
107.692308 |
100.000000 |
53.470867 |
88.130935 |
강동구 |
160.0 |
14.0 |
4.0 |
1754.0 |
2530.0 |
95.000000 |
92.857143 |
125.000000 |
51.425314 |
86.996047 |
강북구 |
217.0 |
5.0 |
7.0 |
1222.0 |
2778.0 |
73.271889 |
80.000000 |
85.714286 |
54.991817 |
89.344852 |
관악구 |
322.0 |
12.0 |
6.0 |
2103.0 |
3235.0 |
81.987578 |
83.333333 |
116.666667 |
44.555397 |
83.678516 |
광진구 |
279.0 |
11.0 |
4.0 |
2636.0 |
2392.0 |
83.870968 |
54.545455 |
100.000000 |
40.098634 |
84.071906 |
crime_anal_gu[crime_anal_gu[target] > 100] = 100
crime_anal_gu.head()
|
강간발생 |
강도발생 |
살인발생 |
절도발생 |
폭력발생 |
강간검거율 |
강도검거율 |
살인검거율 |
절도검거율 |
폭력검거율 |
구별 |
|
|
|
|
|
|
|
|
|
|
강남구 |
516.0 |
39.0 |
5.0 |
3587.0 |
4002.0 |
80.038760 |
100.000000 |
100.000000 |
53.470867 |
88.130935 |
강동구 |
160.0 |
14.0 |
4.0 |
1754.0 |
2530.0 |
95.000000 |
92.857143 |
100.000000 |
51.425314 |
86.996047 |
강북구 |
217.0 |
5.0 |
7.0 |
1222.0 |
2778.0 |
73.271889 |
80.000000 |
85.714286 |
54.991817 |
89.344852 |
관악구 |
322.0 |
12.0 |
6.0 |
2103.0 |
3235.0 |
81.987578 |
83.333333 |
100.000000 |
44.555397 |
83.678516 |
광진구 |
279.0 |
11.0 |
4.0 |
2636.0 |
2392.0 |
83.870968 |
54.545455 |
100.000000 |
40.098634 |
84.071906 |
crime_anal_gu.rename(columns={"강간발생": "강간","강도발생": "강도", "살인발생" : "살인", "절도발생": "절도", "폭력발생": "폭력"},
inplace=True)
crime_anal_gu.head()
|
강간 |
강도 |
살인 |
절도 |
폭력 |
강간검거율 |
강도검거율 |
살인검거율 |
절도검거율 |
폭력검거율 |
구별 |
|
|
|
|
|
|
|
|
|
|
강남구 |
516.0 |
39.0 |
5.0 |
3587.0 |
4002.0 |
80.038760 |
100.000000 |
100.000000 |
53.470867 |
88.130935 |
강동구 |
160.0 |
14.0 |
4.0 |
1754.0 |
2530.0 |
95.000000 |
92.857143 |
100.000000 |
51.425314 |
86.996047 |
강북구 |
217.0 |
5.0 |
7.0 |
1222.0 |
2778.0 |
73.271889 |
80.000000 |
85.714286 |
54.991817 |
89.344852 |
관악구 |
322.0 |
12.0 |
6.0 |
2103.0 |
3235.0 |
81.987578 |
83.333333 |
100.000000 |
44.555397 |
83.678516 |
광진구 |
279.0 |
11.0 |
4.0 |
2636.0 |
2392.0 |
83.870968 |
54.545455 |
100.000000 |
40.098634 |
84.071906 |
8. 범죄 데이터 정렬을 위한 데이터 정리
crime_anal_gu.head()
|
강간 |
강도 |
살인 |
절도 |
폭력 |
강간검거율 |
강도검거율 |
살인검거율 |
절도검거율 |
폭력검거율 |
구별 |
|
|
|
|
|
|
|
|
|
|
강남구 |
516.0 |
39.0 |
5.0 |
3587.0 |
4002.0 |
80.038760 |
100.000000 |
100.000000 |
53.470867 |
88.130935 |
강동구 |
160.0 |
14.0 |
4.0 |
1754.0 |
2530.0 |
95.000000 |
92.857143 |
100.000000 |
51.425314 |
86.996047 |
강북구 |
217.0 |
5.0 |
7.0 |
1222.0 |
2778.0 |
73.271889 |
80.000000 |
85.714286 |
54.991817 |
89.344852 |
관악구 |
322.0 |
12.0 |
6.0 |
2103.0 |
3235.0 |
81.987578 |
83.333333 |
100.000000 |
44.555397 |
83.678516 |
광진구 |
279.0 |
11.0 |
4.0 |
2636.0 |
2392.0 |
83.870968 |
54.545455 |
100.000000 |
40.098634 |
84.071906 |
crime_anal_gu["강도"] / crime_anal_gu["강도"].max()
구별
강남구 1.000000
강동구 0.358974
강북구 0.128205
관악구 0.307692
광진구 0.282051
구로구 0.256410
금천구 0.179487
노원구 0.153846
도봉구 0.128205
동대문구 0.256410
동작구 0.179487
마포구 0.102564
서대문구 0.128205
서초구 0.333333
성동구 0.076923
성북구 0.205128
송파구 0.384615
양천구 0.435897
영등포구 0.487179
용산구 0.230769
은평구 0.230769
종로구 0.307692
중구 0.205128
중랑구 0.358974
Name: 강도, dtype: float64
col = ["살인", "강도", "강간", "절도", "폭력"]
crime_anal_norm = crime_anal_gu[col] / crime_anal_gu[col].max()
crime_anal_norm.head()
|
살인 |
강도 |
강간 |
절도 |
폭력 |
구별 |
|
|
|
|
|
강남구 |
0.357143 |
1.000000 |
1.000000 |
0.977118 |
0.733773 |
강동구 |
0.285714 |
0.358974 |
0.310078 |
0.477799 |
0.463880 |
강북구 |
0.500000 |
0.128205 |
0.420543 |
0.332879 |
0.509351 |
관악구 |
0.428571 |
0.307692 |
0.624031 |
0.572868 |
0.593143 |
광진구 |
0.285714 |
0.282051 |
0.540698 |
0.718060 |
0.438577 |
col2 = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율"]
crime_anal_norm[col2] = crime_anal_gu[col2]
crime_anal_norm.head()
|
살인 |
강도 |
강간 |
절도 |
폭력 |
강간검거율 |
강도검거율 |
살인검거율 |
절도검거율 |
폭력검거율 |
구별 |
|
|
|
|
|
|
|
|
|
|
강남구 |
0.357143 |
1.000000 |
1.000000 |
0.977118 |
0.733773 |
80.038760 |
100.000000 |
100.000000 |
53.470867 |
88.130935 |
강동구 |
0.285714 |
0.358974 |
0.310078 |
0.477799 |
0.463880 |
95.000000 |
92.857143 |
100.000000 |
51.425314 |
86.996047 |
강북구 |
0.500000 |
0.128205 |
0.420543 |
0.332879 |
0.509351 |
73.271889 |
80.000000 |
85.714286 |
54.991817 |
89.344852 |
관악구 |
0.428571 |
0.307692 |
0.624031 |
0.572868 |
0.593143 |
81.987578 |
83.333333 |
100.000000 |
44.555397 |
83.678516 |
광진구 |
0.285714 |
0.282051 |
0.540698 |
0.718060 |
0.438577 |
83.870968 |
54.545455 |
100.000000 |
40.098634 |
84.071906 |
result_CCTV = pd.read_csv("../data/01. CCTV_result.csv", index_col="구별", encoding="utf-8")
result_CCTV.head(1)
|
소계 |
최근 증가율 |
인구수 |
한국인 |
외국인 |
고령자 |
외국인 비율 |
고령자 비율 |
CCTV비율 |
오차 |
구별 |
|
|
|
|
|
|
|
|
|
|
강남구 |
3238 |
150.619195 |
561052 |
556164 |
4888 |
65060 |
0.87122 |
11.596073 |
0.57713 |
1549.200326 |
crime_anal_norm[["인구수", "CCTV"]] = result_CCTV[["인구수", "소계"]]
crime_anal_norm.head()
|
살인 |
강도 |
강간 |
절도 |
폭력 |
강간검거율 |
강도검거율 |
살인검거율 |
절도검거율 |
폭력검거율 |
인구수 |
CCTV |
구별 |
|
|
|
|
|
|
|
|
|
|
|
|
강남구 |
0.357143 |
1.000000 |
1.000000 |
0.977118 |
0.733773 |
80.038760 |
100.000000 |
100.000000 |
53.470867 |
88.130935 |
561052 |
3238 |
강동구 |
0.285714 |
0.358974 |
0.310078 |
0.477799 |
0.463880 |
95.000000 |
92.857143 |
100.000000 |
51.425314 |
86.996047 |
440359 |
1010 |
강북구 |
0.500000 |
0.128205 |
0.420543 |
0.332879 |
0.509351 |
73.271889 |
80.000000 |
85.714286 |
54.991817 |
89.344852 |
328002 |
831 |
관악구 |
0.428571 |
0.307692 |
0.624031 |
0.572868 |
0.593143 |
81.987578 |
83.333333 |
100.000000 |
44.555397 |
83.678516 |
520929 |
2109 |
광진구 |
0.285714 |
0.282051 |
0.540698 |
0.718060 |
0.438577 |
83.870968 |
54.545455 |
100.000000 |
40.098634 |
84.071906 |
372298 |
878 |
col = ["강간", "강도", "살인", "절도", "폭력"]
crime_anal_norm["범죄"] = np.mean(crime_anal_norm[col], axis=1)
crime_anal_norm.head()
|
살인 |
강도 |
강간 |
절도 |
폭력 |
강간검거율 |
강도검거율 |
살인검거율 |
절도검거율 |
폭력검거율 |
인구수 |
CCTV |
범죄 |
구별 |
|
|
|
|
|
|
|
|
|
|
|
|
|
강남구 |
0.357143 |
1.000000 |
1.000000 |
0.977118 |
0.733773 |
80.038760 |
100.000000 |
100.000000 |
53.470867 |
88.130935 |
561052 |
3238 |
0.813607 |
강동구 |
0.285714 |
0.358974 |
0.310078 |
0.477799 |
0.463880 |
95.000000 |
92.857143 |
100.000000 |
51.425314 |
86.996047 |
440359 |
1010 |
0.379289 |
강북구 |
0.500000 |
0.128205 |
0.420543 |
0.332879 |
0.509351 |
73.271889 |
80.000000 |
85.714286 |
54.991817 |
89.344852 |
328002 |
831 |
0.378196 |
관악구 |
0.428571 |
0.307692 |
0.624031 |
0.572868 |
0.593143 |
81.987578 |
83.333333 |
100.000000 |
44.555397 |
83.678516 |
520929 |
2109 |
0.505261 |
광진구 |
0.285714 |
0.282051 |
0.540698 |
0.718060 |
0.438577 |
83.870968 |
54.545455 |
100.000000 |
40.098634 |
84.071906 |
372298 |
878 |
0.453020 |
np.mean() 작동확인
np.array([0.357143, 1.000000, 1.000000, 0.977118, 0.733773])
np.mean(np.array([0.357143, 1.000000, 1.000000, 0.977118, 0.733773]))
0.8136068
np.mean(np.array(
[[0.357143, 1.000000, 1.000000, 0.977118, 0.733773],
[0.285714, 0.358974, 0.310078, 0.477799, 0.463880]]
), axis=1)
array([0.8136068, 0.379289 ])
col = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율"]
crime_anal_norm["검거"] = np.mean(crime_anal_norm[col], axis =1)
crime_anal_norm.head()
|
살인 |
강도 |
강간 |
절도 |
폭력 |
강간검거율 |
강도검거율 |
살인검거율 |
절도검거율 |
폭력검거율 |
인구수 |
CCTV |
범죄 |
검거 |
구별 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
강남구 |
0.357143 |
1.000000 |
1.000000 |
0.977118 |
0.733773 |
80.038760 |
100.000000 |
100.000000 |
53.470867 |
88.130935 |
561052 |
3238 |
0.813607 |
84.328112 |
강동구 |
0.285714 |
0.358974 |
0.310078 |
0.477799 |
0.463880 |
95.000000 |
92.857143 |
100.000000 |
51.425314 |
86.996047 |
440359 |
1010 |
0.379289 |
85.255701 |
강북구 |
0.500000 |
0.128205 |
0.420543 |
0.332879 |
0.509351 |
73.271889 |
80.000000 |
85.714286 |
54.991817 |
89.344852 |
328002 |
831 |
0.378196 |
76.664569 |
관악구 |
0.428571 |
0.307692 |
0.624031 |
0.572868 |
0.593143 |
81.987578 |
83.333333 |
100.000000 |
44.555397 |
83.678516 |
520929 |
2109 |
0.505261 |
78.710965 |
광진구 |
0.285714 |
0.282051 |
0.540698 |
0.718060 |
0.438577 |
83.870968 |
54.545455 |
100.000000 |
40.098634 |
84.071906 |
372298 |
878 |
0.453020 |
72.517393 |
crime_anal_norm
|
살인 |
강도 |
강간 |
절도 |
폭력 |
강간검거율 |
강도검거율 |
살인검거율 |
절도검거율 |
폭력검거율 |
인구수 |
CCTV |
범죄 |
검거 |
구별 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
강남구 |
0.357143 |
1.000000 |
1.000000 |
0.977118 |
0.733773 |
80.038760 |
100.000000 |
100.000000 |
53.470867 |
88.130935 |
561052 |
3238 |
0.813607 |
84.328112 |
강동구 |
0.285714 |
0.358974 |
0.310078 |
0.477799 |
0.463880 |
95.000000 |
92.857143 |
100.000000 |
51.425314 |
86.996047 |
440359 |
1010 |
0.379289 |
85.255701 |
강북구 |
0.500000 |
0.128205 |
0.420543 |
0.332879 |
0.509351 |
73.271889 |
80.000000 |
85.714286 |
54.991817 |
89.344852 |
328002 |
831 |
0.378196 |
76.664569 |
관악구 |
0.428571 |
0.307692 |
0.624031 |
0.572868 |
0.593143 |
81.987578 |
83.333333 |
100.000000 |
44.555397 |
83.678516 |
520929 |
2109 |
0.505261 |
78.710965 |
광진구 |
0.285714 |
0.282051 |
0.540698 |
0.718060 |
0.438577 |
83.870968 |
54.545455 |
100.000000 |
40.098634 |
84.071906 |
372298 |
878 |
0.453020 |
72.517393 |
구로구 |
0.642857 |
0.256410 |
0.529070 |
0.520294 |
0.580125 |
66.300366 |
100.000000 |
100.000000 |
45.078534 |
84.702908 |
441559 |
1884 |
0.505751 |
79.216362 |
금천구 |
0.428571 |
0.179487 |
0.339147 |
0.344320 |
0.402090 |
81.714286 |
100.000000 |
100.000000 |
51.740506 |
88.736890 |
253491 |
1348 |
0.338723 |
84.438336 |
노원구 |
0.357143 |
0.153846 |
0.308140 |
0.505857 |
0.461313 |
89.308176 |
100.000000 |
100.000000 |
39.849219 |
84.419714 |
558075 |
1566 |
0.357260 |
82.715422 |
도봉구 |
0.214286 |
0.128205 |
0.238372 |
0.235903 |
0.264210 |
98.373984 |
100.000000 |
100.000000 |
56.812933 |
90.839695 |
346234 |
825 |
0.216195 |
89.205322 |
동대문구 |
0.357143 |
0.256410 |
0.368217 |
0.528466 |
0.484415 |
83.157895 |
100.000000 |
100.000000 |
55.206186 |
89.969720 |
366011 |
1870 |
0.398930 |
85.666760 |
동작구 |
0.571429 |
0.179487 |
0.629845 |
0.333969 |
0.304547 |
45.846154 |
100.000000 |
75.000000 |
45.187602 |
86.935581 |
408493 |
1302 |
0.403855 |
70.593867 |
마포구 |
0.285714 |
0.102564 |
0.773256 |
0.688368 |
0.538871 |
80.200501 |
100.000000 |
100.000000 |
37.198259 |
85.062947 |
385783 |
980 |
0.477755 |
80.492341 |
서대문구 |
0.428571 |
0.128205 |
0.339147 |
0.409425 |
0.362303 |
84.000000 |
80.000000 |
100.000000 |
50.033267 |
83.198381 |
325028 |
1254 |
0.333530 |
79.446329 |
서초구 |
0.357143 |
0.333333 |
0.829457 |
0.600654 |
0.428676 |
63.317757 |
76.923077 |
100.000000 |
50.204082 |
86.783576 |
445401 |
2297 |
0.509853 |
75.445698 |
성동구 |
0.285714 |
0.076923 |
0.201550 |
0.353037 |
0.296846 |
75.000000 |
100.000000 |
100.000000 |
69.135802 |
86.967264 |
312711 |
1327 |
0.242814 |
86.220613 |
성북구 |
0.285714 |
0.205128 |
0.298450 |
0.400436 |
0.386505 |
75.974026 |
100.000000 |
75.000000 |
49.319728 |
86.290323 |
455407 |
1651 |
0.315247 |
77.316815 |
송파구 |
0.642857 |
0.384615 |
0.453488 |
0.692727 |
0.603044 |
78.632479 |
80.000000 |
88.888889 |
41.211168 |
85.375494 |
671173 |
1081 |
0.555346 |
74.821606 |
양천구 |
1.000000 |
0.435897 |
0.786822 |
1.000000 |
1.000000 |
85.467980 |
100.000000 |
100.000000 |
49.713974 |
85.918592 |
475018 |
2482 |
0.844544 |
84.220109 |
영등포구 |
0.928571 |
0.487179 |
0.689922 |
0.637701 |
0.658783 |
63.202247 |
73.684211 |
100.000000 |
40.153780 |
83.690509 |
402024 |
1277 |
0.680431 |
72.146149 |
용산구 |
0.285714 |
0.230769 |
0.486434 |
0.405612 |
0.437110 |
85.258964 |
100.000000 |
100.000000 |
40.228341 |
84.228188 |
244444 |
2096 |
0.369128 |
81.943099 |
은평구 |
0.428571 |
0.230769 |
0.302326 |
0.453827 |
0.488449 |
91.025641 |
77.777778 |
100.000000 |
53.421369 |
86.636637 |
491202 |
2108 |
0.380788 |
81.772285 |
종로구 |
0.428571 |
0.307692 |
0.461240 |
0.528466 |
0.414925 |
74.369748 |
75.000000 |
33.333333 |
39.587629 |
87.361909 |
164257 |
1619 |
0.428179 |
61.930524 |
중구 |
0.214286 |
0.205128 |
0.383721 |
0.585671 |
0.407957 |
74.747475 |
87.500000 |
100.000000 |
42.511628 |
89.707865 |
134593 |
1023 |
0.359353 |
78.893394 |
중랑구 |
0.571429 |
0.358974 |
0.317829 |
0.460637 |
0.580125 |
91.463415 |
100.000000 |
87.500000 |
62.211709 |
85.714286 |
412780 |
916 |
0.457799 |
85.377882 |