프로젝트 2 - 서울시 범죄현황 데이터 (2)

Jungmin·2022년 10월 17일
1

데이터 분석

목록 보기
6/24

💡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
  • 구별, lat, lng 컬럼 추가
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 데이터 채워졌는지 확인
죄종 강간 강도 살인 절도 폭력 구별 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")
#index_col"구분"을 인덱스 컬럼으로 설정 
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)  #index값 "구별"기준으로 설정

#불필요한 좌표값 데이터 삭제 두가지 방법
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
# 100보다 큰 검거율 숫자 찾아서 100으로 바꾸기
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
# 정규화: 최고값은 1, 최소값은 0
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
# 구별 CCTV 자료에서 인구수와 CCTV수 추가
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)  #numpy는 axis=1 : 행, axis=0 :열
array([0.8136068, 0.379289 ])
# 검거율 평균을 구해서 검거 컬럼 대표값으로 사용

col = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율"]
crime_anal_norm["검거"] = np.mean(crime_anal_norm[col], axis =1)  
#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
profile
데이터분석 스터디노트🧐✍️

0개의 댓글