Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Archives
Today
Total
관리 메뉴

RUBY

[CRIME] 8. Google Maps을 이용한 데이터 정리 본문

데이터 분석/EDA_웹크롤링_파이썬프로그래밍

[CRIME] 8. Google Maps을 이용한 데이터 정리

ruby-jieun 2023. 2. 3. 02:57

 

 

 

 

서울시 범죄 현황 데이터 분석 프로젝트
8. Google Maps을 이용한 데이터 정리


 

 

 

 

1. Google Maps API를 설치하자

conda install -c conda-forge googlemaps

은근히 시간이 걸리니 천천히 기다려주자.

 

 

2. 구글맵을 import 하자!

import googlemaps
gmaps_key = "방금 발급받은 Geocoding api key값 입력"
gmaps = googlemaps.Client(key=gmaps_key)

 

 

3. 구글맵 API 단순 테스트 해보기

gmaps.geocode("서울영등포경찰서", language="ko")

아 주 잘 출력된다~

 

 

4.

 - 구글 맵 API에서 데이터 얻기

 - 전체 결과 크기가 1인 list형이라서 tmp[0]로 접근

 - 큰 리스트 안에 dict형이다.

 - dict형에서 데이터를 얻는 get명령을 사용한다.

tmp = gmaps.geocode("서울영등포경찰서", language="ko")
print(tmp[0].get("geometry")["location"]["lat"])
print(tmp[0].get("geometry")["location"]["lng"])
print(tmp[0].get("formatted_address"))

 

 

5. 

 - 전체 주소에서 필요한 구 이름만 가져와보자

tmp = tmp[0].get("formatted_address")
tmp.split()
tmp.split()[2]

 

 

 

6.

  • 구별, lat, lng 컬럼

 

 

7.

 - 경찰서 이름에서 소속된 구 이름 얻기

 - 구이름과 위도 경도 정보를 저장할 준비

 - 반복문을 이용해서 위 표의 NaN을 모두 채워줍니다.

 - iterrows()

 

 

8. 

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 = count + 1

아... 또 에러다..

0
1
2
3
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Cell In[70], line 14
     12 crime_station.loc[idx, "lat"] = lat 
     13 crime_station.loc[idx, "lng"] = lng
---> 14 crime_station.loc[idx, "구별"] = tmp_gu.split()[2]
     16 print(count)
     17 count = count + 1

IndexError: list index out of range

IndexError: list index out of range는 list 범위 밖에 있는 인덱스를 가져오려고 해서 에러가 난 것이다.

수정해준다.

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()[1]
    
    print(count)
    count = count + 1

 

 

 

9.

잘 고쳐졌나 보자.

crime_station.head()

 Gooooood!!!

 

 

 

10. 코드를 한 번 뜯어보자.

 

 1) crime_station에서 index(idx)와 나머지(rows)를 받아서 반복문을 수행한다.

 

 2) station_name : 구글 검색을 용이하게 하기 위해 검색어를 가급적 상세하게 잡아준다.

     앞서 수행한 formatted_address에서 구 이름을 잡는 과정은 그대로 진행한다.

  3) loc 옵션을 사용한다.

    행(idx)과 열('lat', 'lng', '구별')을 지정해서 구글 검색에서 얻은 정보를 기록한다.

 

 

 

 

11.

 - 여기서 두 줄의 컬럼을 하나씩 합치는 걸로 하자

 - 예를 들어 강도검거, 강도발생

crime_station.columns.get_level_values(0)[2] + crime_station.columns.get_level_values(1)[2]
len(crime_station.columns.get_level_values(0))
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
tmp, len(tmp), len(crime_station.columns.get_level_values(0))
crime_station.columns = tmp
crime_station.head()

컬럼이 예쁘게 정리되었다.

 

 

 

 

12. 저장한다..

crime_station.to_csv("../data/02. crime_in_Seuol_raw.csv", sep=",", encoding="utf-8")

 

Comments