Открытие торгового центра в Хайдарабаде, Индия
Кто сказал, что счастье нельзя купить за деньги, тот не знал, куда пойти за покупками.
Введение
Для многих покупателей посещение торговых центров - отличный способ расслабиться и развлечься в выходные и праздничные дни. Девелоперы также используют эту тенденцию, чтобы построить больше торговых центров, чтобы удовлетворить спрос. В результате в городе Хайдарабад много торговых центров, и многие другие строятся. Открытие торговых центров позволяет застройщикам получать стабильный доход от аренды. Как и любое деловое решение, открытие нового торгового центра требует серьезного рассмотрения и намного сложнее, чем кажется. В частности, расположение торгового центра - одно из важнейших решений, от которого зависит, будет ли торговый центр успешным или неудачным.
Бизнес-проблема
Цель этого проекта - проанализировать и выбрать лучшие места в городе Хайдарабад, Индия, для открытия нового торгового центра. Этот проект в основном ориентирован на геопространственный анализ города Хайдарабад, чтобы понять, где лучше всего открыть новый торговый центр. Используя методологию науки о данных и методы машинного обучения, такие как кластеризация, этот проект направлен на предоставление решений для ответа на бизнес-вопрос: если в городе Хайдарабад застройщик хочет открыть новый торговый центр, где вы бы порекомендовали его открыть? ?
Данные
Для решения проблемы нам потребуются следующие данные:
• Список микрорайонов Хайдарабада. Это определяет объем этого проекта, который ограничен городом Хайдарабад, столицей штата Телангана, который находится на юге Индии.
• Координаты широты и долготы этих районов. Это необходимо для построения карты, а также для получения данных о месте проведения.
• Данные о месте проведения, особенно данные, относящиеся к торговым центрам. Мы будем использовать эти данные для кластеризации окрестностей.
Источники данных и методы извлечения данных
Эта страница Википедии представляет собой список районов в Хайдарабаде, состоящий из 200 районов. Я использовал методы веб-парсинга для извлечения данных со страницы Википедии с помощью запросов Python и пакетов beautifulsoup. Затем мы можем получить координаты широты и долготы окрестностей с помощью пакета Python Geocoder. После этого я использовал Foursquare API, чтобы получить данные о местах проведения для этих районов.
Foursquare API предоставит множество категорий данных о местах проведения, и мы особенно заинтересованы в категории торговых центров, чтобы помочь нам решить бизнес-проблему. Это проект, в котором будут использоваться многие навыки науки о данных, от веб-скрейпинга (Википедия), работы с API (Foursquare), очистки данных, обработки данных до машинного обучения (кластеризация K-средних) и визуализации карт (Folium).
Методология
Foursquare API позволяет разработчикам приложений взаимодействовать с платформой Foursquare. Сам API представляет собой набор адресов RESTful, на которые вы можете отправлять запросы, поэтому на ваш сервер действительно нечего загружать.
Поиск кафе в Хайдарабаде
Кафе, возвращенные Foursquare
Слева вы видите все кафе с их названием, категорией и адресом каждого заведения в Хайдарабаде. Справа вы видите карту площадок слева.
Изучение кафе
Если вы щелкнете по первому из них, то есть «Чашка кофе», вы будете перенаправлены на эту страницу, где увидите всю информацию о чашке кофе из набора данных Foursquare. Сюда входит его название, полный адрес, часы работы, советы и изображения, которые пользователи размещали о кафе. Таким же образом вы можете исследовать торговые центры в городе Хайдарабад.
Чтобы изучить Foursquare, нажмите здесь.
Веб-скрапинг
Выполните парсинг с помощью запросов Python и пакетов beautifulsoup для извлечения списка данных о районе.
# Send the GET request data = requests.get("https://en.wikipedia.org/wiki/Category:Neighbourhoods_in_Hyderabad,_India").text # Parse data from the html into a beautifulsoup object soup = BeautifulSoup(data, 'html.parser') # Create a list to store neighbourhood data neighborhoodList = [] # Append the data into the list for row in soup.find_all("div", class_="mw-category")[0].findAll("li"): neighborhoodList.append(row.text) # Create a new DataFrame from the list kl_df = pd.DataFrame({"Neighborhood": neighborhoodList}) kl_df.head()
Это фрейм данных, созданный после очистки данных. Нам нужно получить географические координаты в виде широты и долготы, чтобы иметь возможность использовать Foursquare API. Для этого мы будем использовать пакет Geocoder, который позволит нам преобразовать адрес в географические координаты в форме широты и долготы.
# Defining a function to get coordinates def get_latlng(neighborhood): # initialize your variable to None lat_lng_coords = None # loop until you get the coordinates while(lat_lng_coords is None): g = geocoder.arcgis('{}, Hyderabad, India'.format(neighborhood)) lat_lng_coords = g.latlng return lat_lng_coords # Call the function to get the coordinates, store in a new list using list comprehension coords = [ get_latlng(neighborhood) for neighborhood in kl_df["Neighborhood"].tolist()]
Мы получили координаты широты и долготы для всех мест, поэтому нам нужно объединить координаты в исходный фрейм данных.
# Create temporary dataframe to populate the coordinates into Latitude and Longitude df_coords = pd.DataFrame(coords, columns=['Latitude', 'Longitude']) # Merge the coordinates into the original dataframe kl_df['Latitude'] = df_coords['Latitude'] kl_df['Longitude'] = df_coords['Longitude'] print(kl_df.shape) kl_df (200,3)
Это объединенный фрейм данных, который содержит все окрестности вместе с географическими координатами.
# Getting the coordinates of Hyderabad address = 'Hyderabad, India' geolocator = Nominatim(user_agent="my-application") location = geolocator.geocode(address) latitude = location.latitude longitude = location.longitude print('The geograpical coordinate of Hyderabad, India {}, {}.'.format(latitude, longitude))
После сбора данных мы должны поместить данные в фрейм данных pandas, а затем визуализировать окрестности на карте с помощью пакета Folium.
map_kl = folium.Map(location=[latitude, longitude], zoom_start=11) # Adding markers to map for lat, lng, neighborhood in zip(kl_df['Latitude'], kl_df['Longitude'], kl_df['Neighborhood']): label = '{}'.format(neighborhood) label = folium.Popup(label, parse_html=True) folium.CircleMarker([lat, lng],radius=5,popup=label,color='blue',fill=True,fill_color='#3186cc',fill_opacity=0.7).add_to(map_kl) map_kl
Используйте foursquare API, чтобы исследовать окрестности
CLIENT_ID = '' # your Foursquare ID CLIENT_SECRET = '' # your Foursquare Secret VERSION = '20180604' radius = 2000 LIMIT = 100 venues = [] for lat, long, neighborhood in zip(kl_df['Latitude'], kl_df['Longitude'], kl_df['Neighborhood']): # Create the API request URL url = "https://api.foursquare.com/v2/venues/explore?client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}".format(CLIENT_ID,CLIENT_SECRET,VERSION,lat,long,radius,LIMIT) # Make the GET request results = requests.get(url).json()["response"]['groups'][0]['items'] # Return only relevant information for each nearby venue for venue in results: venues.append((neighborhood,lat,long,venue['venue']['name'], venue['venue']['location']['lat'],venue['venue']['location'] ['lng'],venue['venue']['categories'][0]['name']))
После извлечения всех мест нам нужно преобразовать список мест в новый DataFrame.
Чтобы узнать больше о документации Foursquare, нажмите здесь.
venues_df = pd.DataFrame(venues) # Defining the column names venues_df.columns = ['Neighborhood', 'Latitude', 'Longitude', 'VenueName', 'VenueLatitude', 'VenueLongitude', 'VenueCategory'] print(venues_df.shape) venues_df.head()
# Lets check how many venues were returned for each neighbourhood venues_df.groupby(["Neighborhood"]).count() # Lets check out how many unique categories can be curated from all the returned values print('There are {} unique categories.'.format(len(venues_df['VenueCategory'].unique()))) There are 174 unique categories # Displaying the first 50 Venue Category names venues_df['VenueCategory'].unique()[:50]
Анализ каждого района
Здесь мы применяем одну горячую кодировку ко всем площадкам. Итак, теперь количество столбцов становится 175
# One hot encoding kl_onehot = pd.get_dummies(venues_df[['VenueCategory']], prefix="", prefix_sep="") # Adding neighborhood column back to dataframe kl_onehot['Neighborhoods'] = venues_df['Neighborhood'] # Moving neighbourhood column to the first column fixed_columns = [kl_onehot.columns[-1]] + list(kl_onehot.columns[:-1]) kl_onehot = kl_onehot[fixed_columns] print(kl_onehot.shape) (6684, 175)
Затем давайте сгруппируем ряды соседей, взяв сумму частот встречаемости каждой категории.
kl_grouped=kl_onehot.groupby(["Neighborhoods"]).sum().reset_index() print(kl_grouped.shape) kl_grouped (198, 175)
len((kl_grouped[kl_grouped["Shopping Mall"] > 0]))
В Хайдарабаде 66 торговых центров, что очень много. Итак, теперь мы должны выбрать подходящее место, где количество торговых центров меньше, чтобы наши шансы открыть торговый центр в этом месте были хорошими.
# Creating a dataframe for Shopping Mall data only kl_mall = kl_grouped[["Neighborhoods","Shopping Mall"]]
Объединение районов в кластеры
Теперь нам нужно сгруппировать все окрестности в разные кластеры. Результаты позволят нам определить, в каких районах больше всего торговых центров, а в каких - меньше. Основываясь на появлении торговых центров в разных кварталах, это поможет нам ответить на вопрос, какие районы наиболее подходят для открытия новых торговых центров.
# Setting the number of clusters kclusters = 3 kl_clustering = kl_mall.drop(["Neighborhoods"], 1) # Run k-means clustering algorithm kmeans = KMeans(n_clusters=kclusters,random_state=0).fit(kl_clustering) # Checking cluster labels generated for each row in the dataframe kmeans.labels_[0:10] array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0], dtype=int32)
Мы устанавливаем количество кластеров равным 3 и запускаем алгоритм. После применения алгоритма кластеризации K-средних все окрестности разделяются и образуют разные кластеры.
# Creating a new dataframe that includes the cluster as well as the top 10 venues for each neighborhood. kl_merged = kl_mall.copy() # Add the clustering labels kl_merged["Cluster Labels"] = kmeans.labels_ kl_merged.rename(columns={"Neighborhoods": "Neighborhood"}, inplace=True) kl_merged.head(10)
Здесь столбец торгового центра представляет количество торговых центров в этой конкретной области, а метки кластера представляют собой номер кластера (либо 0, либо 1, либо 2).
# Adding latitude and longitude values to the existing dataframe kl_merged['Latitude'] = kl_df['Latitude'] kl_merged['Longitude'] = kl_df['Longitude'] # Sorting the results by Cluster Labels kl_merged.sort_values(["Cluster Labels"], inplace=True) kl_merged
Теперь здесь отчетливо видны все места, которые принадлежат 1-му кластеру (кластер номер 0). Точно так же мы видим все номера кластеров в отсортированном порядке, то есть 0,1,2.
Визуализация полученных кластеров
# Creating the map map_clusters = folium.Map(location=[latitude, longitude], zoom_start=11) # Setting color scheme for the clusters x = np.arange(kclusters) ys = [i+x+(i*x)**2 for i in range(kclusters)] colors_array = cm.rainbow(np.linspace(0, 1, len(ys))) rainbow = [colors.rgb2hex(i) for i in colors_array] # Add markers to the map markers_colors = [] for lat, lon, poi, cluster in zip(kl_merged['Latitude'], kl_merged['Longitude'], kl_merged['Neighborhood'], kl_merged['Cluster Labels']): label = folium.Popup(str(poi) + ' - Cluster ' + str(cluster), parse_html=True) folium.CircleMarker([lat,lon],radius=5,popup=label,color=rainbow[cluster-1],fill=True,fill_color=rainbow[cluster-1],fill_opacity=0.7).add_to(map_clusters) map_clusters
Изучение кластеров
len(kl_merged.loc[kl_merged['Cluster Labels'] == 0]) len(kl_merged.loc[kl_merged['Cluster Labels'] == 1]) len(kl_merged.loc[kl_merged['Cluster Labels'] == 2])
Результаты
В кластере 0 132 места, которое является наивысшим среди трех кластеров, а в кластер 0 входят все места, в которых нет торгового центра. Кластер 1 содержит 51 место, и все они содержат ровно 1 торговый центр, а кластер 2 содержит 15 мест, где все места содержат 2 или более торговых центра.
Результаты кластеризации K-средних показывают, что мы можем разделить районы на 3 кластера в зависимости от частоты встречаемости «торгового центра»:
• Кластер 0: районы с очень меньшим количеством торговых центров
• Кластер 1: районы с умеренной концентрацией торговых центров
• Кластер 2: районы с высокой концентрацией торговых центров
Мы визуализируем результаты кластеризации на карте с кластером 0 красного цвета, кластер 1 - фиолетового цвета, а группа 2 - мятно-зеленого цвета.
Выводы
Большое количество торговых центров сосредоточено в центральной части города Хайдарабад. В кластере 0 очень мало торговых центров. Это представляет собой прекрасную возможность и области с большим потенциалом для открытия новых торговых центров, поскольку конкуренция со стороны существующих торговых центров очень мала или отсутствует. Между тем, торговые центры в кластере 2, вероятно, страдают от острой конкуренции из-за избыточного предложения и высокой концентрации торговых центров. Таким образом, этот проект рекомендует застройщикам использовать полученные данные для открытия новых торговых центров в районах кластера 0 с минимальной конкуренцией или без нее. Девелоперы недвижимости с уникальными торговыми предложениями, чтобы выделиться среди конкурентов, также могут открывать новые торговые центры в районах кластера 1 с умеренной конкуренцией. Наконец, застройщикам рекомендуется избегать районов в кластере 2, в которых уже имеется высокая концентрация торговых центров и которые страдают от жесткой конкуренции.
Таким образом, мы можем применить тот же подход для больших наборов данных и легко различать места проведения по категориям. Предположим, что если в городе 400 ресторанов, то мы можем легко разделить их на разные кластеры. Мы можем применить этот метод не только для торговых центров, но и для ресторанов, кафе и многого другого. В этом проекте мы учитываем только один фактор, то есть частоту появления торговых центров, есть и другие факторы, такие как население и доход жителей, которые могут повлиять на решение о местонахождении нового торгового центра.
Но для создания торгового центра нам необходимо учитывать другие факторы, такие как стоимость аренды, окружение вокруг торгового центра, тип людей в этом районе - если это роскошный район, многие люди предпочитают выходить на улицу, их образ жизни будет таким же. отличается от других и поэтому много тратит. Если мы выбираем место, где меньше конкуренция, то нам нужно учитывать и людей, живущих в этой местности. Если люди в этом районе много тратят и любят гулять, то это будет успех. Если люди, живущие рядом с торговым центром, не предпочитают выходить на улицу, то лучше подумать о другом месте с меньшей конкуренцией и хорошей толпой.
Вы всегда можете обратиться к моему репозиторию GitHub для всего проекта.
«Раньше мы строили цивилизации. Теперь строим торговые центры ». -Билли Брайсон
Свяжитесь со мной в LinkedIn
Надеюсь, статья была для вас полезной. Я хотел бы услышать отзывы, чтобы импровизировать и вернуться с более качественным контентом.
Большое спасибо за чтение!