TOP
class="layout-aside-left paging-number">
본문 바로가기
데이터분석 만능열쇠 [파이썬]/<파이썬 데이터 분석>

[파이썬] 지도시각화: 한남동, 이태원 맛집 분석 - 4

by 기록자_Recordian 2024. 6. 26.
728x90
반응형
프로젝트 수행 내용 및 목표

 
웹스크래핑으로 이태원과 한남동에 위치한 맛집 리스트를 받아와 DataFrame 으로 만들고,
 
그 중 'Hashtag' 컬럼 내용을 텍스트 파일로 저장하여 불용어 처리 등의 자연어 처리 작업을 거쳐
워드 클라우드를 통해 해당 지역 맛집의 특징을 전달한다.

지도 정보를 받아 folium을 통해 시각화 하는 것을 목표로 한다.
 
맛집 리스트는 '디너의 여왕' 사이트에서 가져오도록 한다.


이전 내용
 

[파이썬] 자연어처리(NLP): 한남동, 이태원 맛집 분석 - 3

프로젝트 수행 내용 및 목표 웹스크래핑으로 이태원과 한남동에 위치한 맛집 리스트를 받아와 DataFrame 으로 만들고, 그 중 'Hashtag' 컬럼 내용을 텍스트 파일로 저장하여 불용어 처리 등의 자연

puppy-foot-it.tistory.com


주소 체계 통일하기 (feat. 서울 특별시 용산구)

 

먼저 기존에 했던 csv 파일을 불러오고, 필요한 모듈을 import 한 뒤 (끄지 않고 계속 진행 중인 경우엔 제외)

# CSV 불러오기
df = pd.read_csv('C:/Users/niceq/Documents/DataScience/Practice/Source_code/Yongsan_Res_list1.csv', sep=',',
          encoding='UTF-8')
df.head()

 

▶ 보면, 하단의 주소들은 '서울 용산구'로 되어 있는 것을 볼 수 있다. 따라서, 해당 행들의 문자열을

'서울 용산구' → '서울특별시 용산구' 로 변경하는 작업을 한다.

# "서울 용산구" 로 된 행을 "서울특별시 용산구" 로 변경 하기
df['Add'] = df['Add'].str.replace('서울 용산구', '서울특별시 용산구')
df

 

▶ 또, 상단의 주소들은 '이태원동~', '한남동~' 등으로 '서울특별시 용산구' 가 생략된 것을 알 수 있다.

따라서, 해당 행들처럼 동만 나온 행에 '서울특별시 용산구' 라는 문자열을 추가한다.

# 동만 있는 행에 "서울 특별시" 추가하기
df['Add'] = df['Add'].apply(lambda x: '서울특별시 용산구 ' + x if '서울특별시 용산구' not in x else x)
df

▶ 주소 체계가 모두 통일되었다.

 


Google Maps를 이용해서 위도와 경도 정보 얻기

 

이제 Google Map를 import 하고 본인의 Googel API Key를 입력한다.

# Google Maps Import
import googlemaps
gmaps_key = "My Google API Key"
gmaps = googlemaps.Client(key=gmaps_key)

 

그리고 Google Maps를 사용하여 주소 정보를 조회해본다.

# 주소 조회하기
gmaps.geocode(df['Add'].iloc[0], language='ko')

 

주소 정보가 잘 조회됐으니, 각 업체별 주소, 위도, 경도 정보를 받아온다.

# 각 업체별 주소, 위도, 경도 받아오기
restuarant_address = []
restuarant_lat= []
restuarant_lng = []

for name, address in zip(df['Name'], df['Add']):
    tmp = gmaps.geocode(address, language='ko')
    
    if tmp:
        restuarant_address.append(tmp[0].get("formatted_address"))
        
        tmp_loc = tmp[0].get("geometry")
        restuarant_lat.append(tmp_loc['location']['lat'])
        restuarant_lng.append(tmp_loc['location']['lng'])
        
        print(name + '-->' + tmp[0].get("formatted_address"))
    else:
        restuarant_address.append(None)
        restuarant_lat.append(None)
        restuarant_lng.append(None)
        print(name + '--> 주소를 찾을 수 없습니다.')

# 데이터프레임에 새 컬럼 추가
df['Geocoded Address'] = restuarant_address
df['Latitude'] = restuarant_lat
df['Longitude'] = restuarant_lng

 

모든 정보를 얻어냈다.


지도 시각화

 

먼저 서울시 구별 데이터에 대한 정보가 들어있는 json 파일을 로딩(json import 선행)

import json
geo_path = '파일 경로/02. skorea_municipalities_geo_simple.json'
geo_str = json.load(open(geo_path, encoding='utf-8'))

 

용산구 맛집이니, 용산구청의 위도와 경도 정보를 입력하여 위치 정보를 확인한다.

# 지도 시각화 모듈 import
import folium

# 용산구청 위도, 경도 중심으로 맛집 위치 표시
map = folium.Map(location=[37.532476, 126.990172], zoom_start=11)

for i in range(len(df)):
    folium.Marker(
        location=[df['Latitude'][i], df['Longitude'][i]],
        popup=df['Name'][i]
    ).add_to(map)

# 지도 보여주기
map

 

◆ 코드 설명

- for i in range(len(df)): df의 인덱스를 사용하여 모든 행에 접근.

 

- Marker 생성: folium.Marker(location=[df['Latitude'][i], df['Longitude'][i]], popup=df['Name'][i]).add_to(map)으로 각 맛집의 위치에 마커를 추가.

popup 파라미터를 사용하여 마커를 클릭할 때 맛집 이름이 표시.

 

-지도 보여주기: map 객체를 마지막에 명시적으로 반환하면 Jupyter 노트북이나 호환되는 인터페이스에서 지도를 표시.


마지막으로 해당 내용을 csv 파일로 저장하고 종료.

# csv 저장
df.to_csv('C:/Users/niceq/Documents/DataScience/Practice/Source_code/Yongsan_Res_list_fin.csv', sep=',',
          encoding='UTF-8')

 


책을 통해 배운 내용들을 응용하여 직접 수행하려다보니, 시간이 오래 걸리기도 했고,

코드 오류가 많이 발생하여 시간이 많이 걸렸다.

그래도 책 + 구글링 + 챗 GPT를 활용하여 코드를 수정하거나, 분석 접근 방법을 수정해가며 데이터 분석을 해보는 재밌는 프로젝트였다.


물론, 아직 부족한 게 많고,

때로는 매우 쉬운 문제로 막힐 때도 많았지만 해당 프로젝트를 통해 전에 배웠던 것을 다시 한 번 기억해낼 수 있어 좋았다.

특히, 챗GPT를 활용하여 코드를 수정해 나가는 방법으로 대부분의 문제를 해결해 나갔지만,

중요한 것은 어떤 분석 방식으로 접근하느냐에 따라 문제가 해결될수도, 해결되지 않을수도 있기 때문에

챗GPT가 절대적인 해결책은 아니다. (어떤 날엔 하루 할당량의 질문을 다 쓰고도 해답을 얻지 못한 날도 있었다.)

 

코드를 짜는 것보다 중요한 것은, 어떤 방식으로, 어떤 시각으로 문제에 접근하고 해결할 것인가 인 듯하다.

728x90
반응형