본문 바로가기
프로젝트

[분석프로젝트] 주변에 빵집이 몇 개가 있을까?

by kime2 2024. 8. 10.
  • 목적 : 어떤 지역을 특정 상품에 특화된 지역으로 만들기 위해서는 특정 상품에 대한 상권이 이루어 져야 한다
  • 기준 : 서로 걸어갈 수 있는 거리, 500m
  • 방법 : 대표 빵집의 주소(위도,경도)를 활용하여 해당 지역으로부터 500m 안에 있는 빵집을 확인한다
  • 데이터 : 행정안전부_제과점영업의 2024년 업데이트 기준 영업중인 업소(성심당 제외)

 

1. 주소 전처리

1) 위도와 경로도 변환하기 위해 도로명 주소에 건물이름, 층수제거

total_df['도로명전체주소'] = total_df['도로명전체주소'].str.split('(').str[0]
total_df['도로명전체주소'] = total_df['도로명전체주소'].str.split(',').str[0]

 

2) 대표빵집의 시/군/구 지역만 추출

address_list = ['군산시','광주광역시 동구','천안시 서북구','천안시 동남구','부산광역시 중구','대구광역시 중구','서울특별시 중구','전주시','대전광역시 중구']
test = '|'.join(address_list)
final_df = total_df[total_df['도로명전체주소'].str.contains(test)==True]
  • 찾고자 하는 문자열을 포함하는 행을 찾기 위해서 contains함수를 사용하는데리스트를 통해 여러문자열을 포함하는 행을 찾고싶다면 목적에 따라 구분자를 | 또는 & 사용
  • '구분자'.join(리스트) : 리스트의 내용을 구분자로 분리가능

문자열 참고 : https://hyang2data.tistory.com/31

조인 참고 : https://velog.io/@roope97/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-join-%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%ACjoin

 

3) 위경도 번환

이유 

  • Geopy 라이브러리는 지리적 데이터를 다루는데 주소를 위경도로 변환하는 지오코딩과 거리 계산, 좌표 변환 등의 다양한 지리적 작업 가능
  • 모든 빵집의 위도와 경도로 변환하면 geopy.distance모듈을 통해 두 지점간 거리 계산 가능
  • 거리계산 방법 : great_circle 함수 ( 두 위경도 좌표 (lat1, lon1)와 (lat2, lon2) 간의 거리의 최단거리 계산 )

방법1. Nominatim모듈 사용

import time
from geopy.geocoders import Nominatim

# 도로명 주소를 위경도로 변환
def get_lat_long(address):
    geolocator = Nominatim(user_agent="dkssud") # 아무이름이나, 생략시 접근이 거두됨
    time.sleep(1)  # 1초 지연
    location = geolocator.geocode(address)
    if location:
        return (location.latitude, location.longitude)
    else:
        return (None, None)
        
# 각 주소에 대해 위경도 얻기
df['Coordinates'] = df['Address'].apply(get_lat_long)
df[['Latitude', 'Longitude']] = pd.DataFrame(df['Coordinates'].tolist(), index=df.index)

# 결과 확인 
print(df)

*굉장히 오래걸림...약1000개 40분 소요

 

방법2. 구글확장프로그램 Geocode

참고 : https://program8.tistory.com/27

더 빠르다..

 

2. 500m거리내 빵집업소 찾기

from geopy.distance import great_circle
# 500m 이내인지 확인하는 함수
# coord1 : 기준좌표
# coord2 : 비교대상

def is_within_500m(coord1, coord2):
    if None in coord1 or None in coord2:  # 위경도 중 하나라도 None이면 False 반환
        return False
    distance = great_circle(coord1, coord2).meters # 기준meter단위
    return distance <= 500 # 거리가 500m 이하인 경우 True, 그렇지 않으면 False 반환

 

great_circle 함수 : 두 위경도 좌표 (lat1, lon1)와 (lat2, lon2) 간의 거리의 최단거리 계산 

 

# 기준점 : 군산, 이성당
reference_point = (35.9831181, 126.717139)
# 기준점과 각 주소 간의 거리 확인
군산주소['Within 500m'] = 군산주소['Coordinates'].apply(
    lambda coord: "Yes" if is_within_500m (reference_point, coord) else "No")
    # coord(위경도의 튜플 컬럼)이 is_within_500m 적용시 True면 'Yes' 아니면 'No' 출력
print('군산 이성당 주변 500m 빵집 : ', 군산주소[군산주소['Within 500m']=='Yes']['관리번호'].nunique())

 

결과

 

3. 각 대표빵집의 주변 빵집 확인하기

- 군산 : 6(기준빵집 제외)

- 광주: 5

- 전주 : 7

- 부산

- 대구 : 9

- 서울 : 7

 

결과