지도 시각화
- 카카오 맵 api와 '위치명 ' 데이터를 이용하여 위도 경도를 추출한다.
- foilum 을 이용하여 지도에 마커를 그려준다.
#위치정보 가져오기
위치_빈도수 = df['위치'].value_counts( )
위치_빈도수
Busan 釜山, South Korea 92
Busan, South Korea 82
부산 광안리해수욕장 - 廣安里海水浴場 GwangalliBeach, Busan, South Korea 52
Haeundae, Busan 22
흰여울문화마을 17
..
부산주당 1
0731커피로스터스 1
수영구 광안동 1
한창정보타운 1
카페밀유 1
Name: 위치, Length: 578, dtype: int64
#등록된 위치정보별 빈도수 데이터
위치_빈도수 = pd.DataFrame(위치_빈도수)
위치_빈도수.head()
위치 | |
---|---|
Busan 釜山, South Korea | 92 |
Busan, South Korea | 82 |
부산 광안리해수욕장 - 廣安里海水浴場 GwangalliBeach, Busan, South Korea | 52 |
Haeundae, Busan | 22 |
흰여울문화마을 | 17 |
카카오맵 api를 이용하여 위도,경도 가져오기.
카카오맵 api를 이용하여 키워드를 입력하면 위도 경도를 반환해주는 함수를 작성해보자.
import requests
import sys
url = 'https://dapi.kakao.com/v2/local/search/keyword.json?query=부산광역시청'
apikey = 'apikey'
kakao= requests.get( url, params = {'query':query}, headers={'Authorization' : 'KakaoAK ' + apikey } ).json()
kakao
{'documents': [{'address_name': '부산 연제구 연산동 1000',
'category_group_code': 'PO3',
'category_group_name': '공공기관',
'category_name': '사회,공공기관 > 지방행정기관 > 시청 > 광역시청',
'distance': '',
'id': '27284326',
'phone': '051-120',
'place_name': '부산광역시청',
'place_url': 'http://place.map.kakao.com/27284326',
'road_address_name': '부산 연제구 중앙대로 1001',
'x': '129.07506783124393',
'y': '35.17973748292069'},
{'address_name': '부산 연제구 연산동 1000',
'category_group_code': 'BK9',
'category_group_name': '은행',
'category_name': '금융,보험 > 금융서비스 > 은행 > BNK부산은행',
'distance': '',
'id': '7898226',
'phone': '051-852-0066',
'place_name': '부산은행 부산시청지점',
'place_url': 'http://place.map.kakao.com/7898226',
'road_address_name': '부산 연제구 중앙대로 1001',
'x': '129.074594167442',
'y': '35.1801024581601'},
{'address_name': '부산 연제구 연산동 1000',
'category_group_code': 'PK6',
'category_group_name': '주차장',
'category_name': '교통,수송 > 교통시설 > 주차장',
'distance': '',
'id': '409735239',
'phone': '',
'place_name': '부산시청 주차장',
'place_url': 'http://place.map.kakao.com/409735239',
'road_address_name': '부산 연제구 중앙대로 1001',
'x': '129.074304725066',
'y': '35.1804606708419'},
{'address_name': '부산 부산진구 양정동 250-1',
'category_group_code': 'PS3',
'category_group_name': '어린이집,유치원',
'category_name': '교육,학문 > 유아교육 > 어린이집',
'distance': '',
'id': '23872678',
'phone': '051-866-2918',
'place_name': '부산광역시청 어린이집',
'place_url': 'http://place.map.kakao.com/23872678',
'road_address_name': '부산 부산진구 거제천로40번길 31',
'x': '129.072710296969',
'y': '35.179222753544'},
{'address_name': '부산 연제구 연산동 1000',
'category_group_code': '',
'category_group_name': '',
'category_name': '사회,공공기관 > 행정기관 > 과학기술정보통신부 > 우체국',
'distance': '',
'id': '9039237',
'phone': '051-862-5062',
'place_name': '부산시청우체국',
'place_url': 'http://place.map.kakao.com/9039237',
'road_address_name': '부산 연제구 중앙대로 1001',
'x': '129.075086850882',
'y': '35.1797948309462'},
{'address_name': '부산 연제구 연산동 1590-1',
'category_group_code': '',
'category_group_name': '',
'category_name': '부동산 > 주거시설 > 아파트',
'distance': '',
'id': '1002976572',
'phone': '',
'place_name': '부산시청행복주택아파트(예정)',
'place_url': 'http://place.map.kakao.com/1002976572',
'road_address_name': '',
'x': '129.078762706273',
'y': '35.1791919810612'},
{'address_name': '부산 연제구 연산동 1000',
'category_group_code': 'BK9',
'category_group_name': '은행',
'category_name': '금융,보험 > 금융서비스 > 은행 > KB국민은행',
'distance': '',
'id': '18738273',
'phone': '',
'place_name': 'KB국민은행 부산시청지점',
'place_url': 'http://place.map.kakao.com/18738273',
'road_address_name': '부산 연제구 중앙대로 1001',
'x': '129.075508794887',
'y': '35.1799858527438'},
{'address_name': '부산 부산진구 양정동 157-1',
'category_group_code': 'BK9',
'category_group_name': '은행',
'category_name': '금융,보험 > 금융서비스 > 은행 > NH농협은행',
'distance': '',
'id': '18683444',
'phone': '051-868-8710',
'place_name': 'NH농협은행 부산시청지점',
'place_url': 'http://place.map.kakao.com/18683444',
'road_address_name': '부산 부산진구 진연로 15',
'x': '129.07347771433152',
'y': '35.17884194127481'},
{'address_name': '부산 연제구 연산동 1422-8',
'category_group_code': 'BK9',
'category_group_name': '은행',
'category_name': '금융,보험 > 금융서비스 > 은행 > 기업은행',
'distance': '',
'id': '8208642',
'phone': '051-867-8817',
'place_name': 'IBK기업은행 부산시청역지점',
'place_url': 'http://place.map.kakao.com/8208642',
'road_address_name': '부산 연제구 중앙대로 1000',
'x': '129.075394388676',
'y': '35.1777313182307'},
{'address_name': '부산 연제구 연산동 1000',
'category_group_code': '',
'category_group_name': '',
'category_name': '교육,학문 > 학습시설 > 도서관',
'distance': '',
'id': '1488771062',
'phone': '',
'place_name': '부산시청열린도서관(2020년하반기예정)',
'place_url': 'http://place.map.kakao.com/1488771062',
'road_address_name': '부산 연제구 중앙대로 1001',
'x': '129.07493243862248',
'y': '35.17993805777149'},
{'address_name': '부산 연제구 연산동 1449-1',
'category_group_code': '',
'category_group_name': '',
'category_name': '가정,생활 > 드럭스토어 > 올리브영',
'distance': '',
'id': '959482251',
'phone': '051-851-4178',
'place_name': '올리브영 부산시청역점',
'place_url': 'http://place.map.kakao.com/959482251',
'road_address_name': '부산 연제구 연제로 30',
'x': '129.07696123674373',
'y': '35.17926525252748'},
{'address_name': '부산 연제구 연산동 1000',
'category_group_code': '',
'category_group_name': '',
'category_name': '여행 > 공원 > 도시근린공원',
'distance': '',
'id': '13665316',
'phone': '',
'place_name': '부산광역시청 시민광장',
'place_url': 'http://place.map.kakao.com/13665316',
'road_address_name': '부산 연제구 중앙대로 1001',
'x': '129.075963158602',
'y': '35.1795527170568'},
{'address_name': '부산 연제구 연산동 1000',
'category_group_code': '',
'category_group_name': '',
'category_name': '사회,공공기관 > 행정기관부속시설',
'distance': '',
'id': '475037324',
'phone': '',
'place_name': '부산광역시청 대강당',
'place_url': 'http://place.map.kakao.com/475037324',
'road_address_name': '부산 연제구 중앙대로 1001',
'x': '129.075050185776',
'y': '35.1797341807228'},
{'address_name': '부산 연제구 연산동 1000',
'category_group_code': '',
'category_group_name': '',
'category_name': '여행 > 공원 > 도시근린공원',
'distance': '',
'id': '13665317',
'phone': '',
'place_name': '부산광역시청 등대광장',
'place_url': 'http://place.map.kakao.com/13665317',
'road_address_name': '부산 연제구 중앙대로 1001',
'x': '129.073963272098',
'y': '35.1811910502742'},
{'address_name': '부산 연제구 연산동 1364-1',
'category_group_code': '',
'category_group_name': '',
'category_name': '가정,생활 > 문구,사무용품 > 드림디포',
'distance': '',
'id': '16868795',
'phone': '051-862-0945',
'place_name': '드림디포 부산시청점',
'place_url': 'http://place.map.kakao.com/16868795',
'road_address_name': '부산 연제구 중앙대로 1035',
'x': '129.077303670691',
'y': '35.1809895970098'}],
'meta': {'is_end': False,
'pageable_count': 45,
'same_name': {'keyword': '부산광역시청', 'region': [], 'selected_region': ''},
'total_count': 142}}
kakao 데이터에서 위도,경도, 장소이름에 대한 정보가 documents 에 저장돼 있음을 알 수 있다.
장소이름 = kakao['documents'][0]['place_name']
경도= kakao['documents'][0]['x']
위도= kakao['documents'][0]['y']
print(위도,경도,장소이름)
35.17973748292069 129.07506783124393 부산광역시청
이제 위도,경도, 장소이름을 따로 가져와서 저장하는 함수 get_kakao()를 작성해 보자.
def get_kakao(query):
url = 'https://dapi.kakao.com/v2/local/search/keyword.json?query={}'.format(query)
apikey = '0407a2349ecda6d17bcefa82be4efd99'
kakao= requests.get( url, params = {'query':query}, headers={'Authorization' : 'KakaoAK ' + apikey } ).json()
장소이름 = kakao['documents'][0]['place_name']
경도= kakao['documents'][0]['x']
위도= kakao['documents'][0]['y']
kakao = [위도,경도,장소이름]
return kakao
get_kakao('부산광역시청')
['35.17973748292069', '129.07506783124393', '부산광역시청']
get_kakao() 함수와 사전에 크롤링한 인스타그램 위치 데이터를 바탕으로 위도경도를 추출 한다.
그리고 api를 이용할 때는 짧은 시간에 너무 많은 정보를 요구 하면 차단 당할 수 있기에 time.sleep() 함수를 이용하여 사용 시간을 조절 한다.
인스타그램_위치 = df['위치']
위치_get_kakao=[]
for 위치 in 인스타그램_위치:
try:
위치_get_kakao.append(get_kakao(위치))
time.sleep(0.5)
except:
pass
위치_get_kakao 리스트를 데이터프레임으로 변환후 컬럼명을 수정.
위치_get_kakao=pd.DataFrame(위치_get_kakao)
위치_get_kakao.columns=['위도','경도','위치']
위치_get_kakao
위도 | 경도 | 위치 | |
---|---|---|---|
0 | 35.3629930520716 | 129.18251602124 | 동부산컨트리클럽 |
1 | 35.1604590898844 | 129.162266187153 | 스케줄 해운대 |
2 | 37.590448495174364 | 127.02876401832988 | 앤에이앤 |
3 | 37.590448495174364 | 127.02876401832988 | 앤에이앤 |
4 | 37.590448495174364 | 127.02876401832988 | 앤에이앤 |
... | ... | ... | ... |
2004 | 35.1585232170784 | 129.159854668484 | 해운대해수욕장 |
2005 | 35.1636479638612 | 129.158897240251 | 해운대역 부산2호선 |
2006 | 35.1531932736837 | 129.118976093583 | 광안리해수욕장 |
2007 | 37.590448495174364 | 127.02876401832988 | 앤에이앤 |
2008 | 37.590448495174364 | 127.02876401832988 | 앤에이앤 |
2009 rows × 3 columns
folium 으로 시각화하여 마무리 해준다.
import folium
from folium.plugins import MarkerCluster
위도_경도= []
이름= []
for i in range(len(위치_get_kakao)):
data = 위치_get_kakao.iloc[i] # 행 하나씩
위도_경도.append((float(data['위도']),float(data['경도']))) # 위도 , 경도 순으로..
위치명.append(data['위치'])
busan =[35.1797957, 129.0727983]
busan = folium.Map(location = busan, zoom_start = 11)
marker_cluster = MarkerCluster(
locations=위도_경도, popups=위치명,
name='Busan',
overlay=True,
control=True,
)
marker_cluster.add_to(busan)
folium.LayerControl().add_to(busan)
busan.save('busan.html')
출력물을 살펴보자.
축소를 하였을 때는 근처 마커 끼리 모아서 몇개의 마커가 모여있는지 나타낸다.
확대를 해서 마커에 마우스 커서를 올리면 마커의 지역명이 나타난다.
이상으로 토이프로젝트 - 인스타그램 을 마무리 한다.
'데이터 분석 > 토이프로젝트' 카테고리의 다른 글
transformer를 활용한 한-영 번역 모델(pytorch) (2) | 2022.01.21 |
---|---|
토이프로젝트 - 워드 클라우드 (2) | 2020.08.27 |
토이프로젝트 - 인스타그램 크롤링 (2) | 2020.08.27 |
토이프로젝트 - 인스타그램 (0) | 2020.08.27 |