이지트립 - 맛집데이터 통합서비스

IngCoding·2022년 6월 12일
1

파이썬 #3 프로젝트

목록 보기
17/20
post-thumbnail
  1. 부산의 식당 공공데이터를 불러온 뒤, 사이트별 평점데이터와 합쳤다.
    (망고플레이트, 카카오, 구글, 네이버, 트립어드바이저)
  2. Forium을 통해 시각화하였다. 마커를 클릭하면 식당의 사이트별 평점을 한눈에 볼 수 있다.
import pandas as pd

# '공공데이터포털'에 있는 부산 상권 정보
busan = pd.read_csv('소상공인시장진흥공단_상가(상권)정보_부산_202112.csv')

# 열 이름 변경
busan.rename(columns={'상호명':'title'}, inplace=True)

# 상위 10개
print(busan.shape)
busan.head()
(141878, 39)
상가업소번호 title 지점명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 표준산업분류코드 ... 건물관리번호 건물명 도로명주소 구우편번호 신우편번호 동정보 층정보 호정보 경도 위도
0 23206623 미광장 NaN O 숙박 O02 모텔/여관/여인숙 O02A01 모텔/여관/여인숙 I55112 ... 2611012600100250001004473 NaN 부산광역시 중구 보수대로44번길 5 600074 48974.0 NaN NaN NaN 129.023668 35.100979
1 20418637 BHC치킨 동래점 Q 음식 Q05 닭/오리요리 Q05A08 후라이드/양념치킨 I56193 ... 2626010500101850000016529 NaN 부산광역시 동래구 동래로147번길 18 607020 47802.0 NaN NaN NaN 129.087156 35.205267
2 24659633 스텔라 NaN D 소매 D05 의복의류 D05A01 일반의류 G47416 ... 2650010500101480004001694 비치아파트 부산광역시 수영구 광안해변로 100 613751 48305.0 NaN NaN NaN 129.115397 35.143770
3 17174094 도란도란 NaN Q 음식 Q01 한식 Q01A01 한식/백반/한정식 I56111 ... 2623011100101740004050547 NaN 부산광역시 부산진구 가야대로482번길 29-3 614813 47327.0 NaN NaN NaN 129.024938 35.151645
4 21683903 럭키사진관 NaN F 생활서비스 F06 사진 F06A01 사진관 M73301 ... 2638010200103250030010858 NaN 부산광역시 사하구 낙동대로 395 604830 49411.0 NaN 1 NaN 128.974794 35.102905

5 rows × 39 columns

# 망고플레이트 기준으로 다른 사이트에 리뷰가 있는 가게 리스트
mango = pd.read_csv('중복가게.csv').drop('Unnamed: 0', axis=1) # csv 파일 읽어 오기
print(mango.shape)
mango.head()
(379, 4)
userId title rating type
0 mango 비비비당 4.485213 카페 디저트 차 우전 녹차 특 말차 복분자 냉 오미자차
1 kakao 비비비당 3.661010 카페 디저트 차 우전 녹차 특 말차 복분자 냉 오미자차
2 naver 비비비당 4.465512 카페 디저트 차 우전 녹차 특 말차 복분자 냉 오미자차
3 mango 신발원 4.452742 딤섬 만두
4 kakao 신발원 3.850168 딤섬 만두
# 상호명을 기준으로 '부산 상권 정보', '가게 리스트' 병합
ratings_stores = pd.merge(busan, mango, on='title')
print(ratings_stores.shape) # 행 갯수가 늘어난 이유는 상호명을 기준으로 하여 같은 가게인데 경도 위도가 다른 중복된 가게 목록이 있기 때문
ratings_stores.head()
(384, 42)
상가업소번호 title 지점명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 표준산업분류코드 ... 구우편번호 신우편번호 동정보 층정보 호정보 경도 위도 userId rating type
0 28490295 모모스커피 NaN Q 음식 Q12 커피점/카페 Q12A01 커피전문점/카페/다방 I56220 ... 609320 46311.0 NaN 1 NaN 129.086376 35.219218 mango 4.020862 카페 디저트
1 28490295 모모스커피 NaN Q 음식 Q12 커피점/카페 Q12A01 커피전문점/카페/다방 I56220 ... 609320 46311.0 NaN 1 NaN 129.086376 35.219218 kakao 4.099568 카페 디저트
2 28504927 백설대학 NaN Q 음식 Q04 분식 Q04A01 라면김밥분식 I56194 ... 606080 49102.0 NaN NaN NaN 129.070072 35.079008 mango 4.040333 한식
3 28504927 백설대학 NaN Q 음식 Q04 분식 Q04A01 라면김밥분식 I56194 ... 606080 49102.0 NaN NaN NaN 129.070072 35.079008 kakao 3.179077 한식
4 28504927 백설대학 NaN Q 음식 Q04 분식 Q04A01 라면김밥분식 I56194 ... 606080 49102.0 NaN NaN NaN 129.070072 35.079008 naver 4.448316 한식

5 rows × 42 columns

# 필요한 열 추출
ratings_stores = ratings_stores[['title','위도','경도','상권업종소분류명','userId','rating']]

# 사이트 이름과 상호명을 기준으로 중복 행 제거
ratings_stores = ratings_stores.drop_duplicates(['userId','title']).reset_index(drop=True)

# 가중평점 소수점 둘째자리까지
ratings_stores.rating = ratings_stores.rating.round(2)

print(ratings_stores.shape)
ratings_stores.head()
(228, 6)
title 위도 경도 상권업종소분류명 userId rating
0 모모스커피 35.219218 129.086376 커피전문점/카페/다방 mango 4.02
1 모모스커피 35.219218 129.086376 커피전문점/카페/다방 kakao 4.10
2 백설대학 35.079008 129.070072 라면김밥분식 mango 4.04
3 백설대학 35.079008 129.070072 라면김밥분식 kakao 3.18
4 백설대학 35.079008 129.070072 라면김밥분식 naver 4.45
# 사이트 이름과 가중평점을 연결하고 값을 문자열로 변환하여 열 추가
ratings_stores['user_rating'] = ratings_stores[['userId','rating']].apply(lambda row: ' : '.join(row.values.astype(str)), axis=1)
print(ratings_stores.shape)
ratings_stores.head()
(228, 7)
title 위도 경도 상권업종소분류명 userId rating user_rating
0 모모스커피 35.219218 129.086376 커피전문점/카페/다방 mango 4.02 mango : 4.02
1 모모스커피 35.219218 129.086376 커피전문점/카페/다방 kakao 4.10 kakao : 4.1
2 백설대학 35.079008 129.070072 라면김밥분식 mango 4.04 mango : 4.04
3 백설대학 35.079008 129.070072 라면김밥분식 kakao 3.18 kakao : 3.18
4 백설대학 35.079008 129.070072 라면김밥분식 naver 4.45 naver : 4.45
# 한 가게에 있는 사이트 가중평점을 하나로 연결
ratings_stores = ratings_stores.groupby(['title','위도','경도','상권업종소분류명',])['user_rating'].apply('  /  '.join).reset_index()
print(ratings_stores.shape)
ratings_stores.head()
(89, 5)
title 위도 경도 상권업종소분류명 user_rating
0 1984나폴리 35.304089 129.112414 커피전문점/카페/다방 mango : 4.03 / kakao : 3.56
1 거대곰탕 35.153023 129.059626 설렁탕집 mango : 4.07 / kakao : 3.98 / naver : 4.47
2 겐짱카레 35.100763 129.029007 음식점-일식 mango : 3.91 / kakao : 4.38
3 고래사 35.162510 129.159503 식료품점 mango : 4.01 / kakao : 3.7
4 고옥 35.310151 129.260781 한식/백반/한정식 mango : 4.33 / kakao : 3.67 / google : 4.1...
import folium 

# 기준점 설정
m = folium.Map(location = [35.16067972581369, 129.12464303902127], # [위도, 경도]
               zoom_start = 11,
               width=1000,
               height=700)

for lat, long, store, category, point in zip(ratings_stores['위도'],
                                             ratings_stores['경도'],
                                             ratings_stores['title'], # 상호명
                                             ratings_stores['상권업종소분류명'], # 음식 카테고리
                                             ratings_stores['user_rating']): # 사이트별 가중평점
    # HTML 코드 작성
    iframe = folium.IFrame("<h2><b>" + store + "</h2></b>"+ "<b>음식 종류</b>" + "<br>" + category + "<br>" + "<br>" + "<b>사이트별 평점</b>" + "<br>" + point)
    
    # 팝업 내용과 크기 설정
    popup = folium.Popup(iframe,
                         min_width=300,
                         max_width=300)
    
    folium.Marker(location = [lat, long],
                  tooltip=store, # 커서를 갖다 대면 뜨는 내용
                  popup=popup, # 클릭하면 나오는 팝업
                  icon=folium.Icon('red', icon='star') # 표시되는 아이콘 모양 설정
                 ).add_to(m)
m

  • 마커를 클릭하면 식당의 음식종류와 사이트별 평점을 한눈에 볼 수 있다.
profile
Data & PM

0개의 댓글