Открытие торгового центра в Хайдарабаде, Индия

Кто сказал, что счастье нельзя купить за деньги, тот не знал, куда пойти за покупками.

Введение

Для многих покупателей посещение торговых центров - отличный способ расслабиться и развлечься в выходные и праздничные дни. Девелоперы также используют эту тенденцию, чтобы построить больше торговых центров, чтобы удовлетворить спрос. В результате в городе Хайдарабад много торговых центров, и многие другие строятся. Открытие торговых центров позволяет застройщикам получать стабильный доход от аренды. Как и любое деловое решение, открытие нового торгового центра требует серьезного рассмотрения и намного сложнее, чем кажется. В частности, расположение торгового центра - одно из важнейших решений, от которого зависит, будет ли торговый центр успешным или неудачным.

Бизнес-проблема

Цель этого проекта - проанализировать и выбрать лучшие места в городе Хайдарабад, Индия, для открытия нового торгового центра. Этот проект в основном ориентирован на геопространственный анализ города Хайдарабад, чтобы понять, где лучше всего открыть новый торговый центр. Используя методологию науки о данных и методы машинного обучения, такие как кластеризация, этот проект направлен на предоставление решений для ответа на бизнес-вопрос: если в городе Хайдарабад застройщик хочет открыть новый торговый центр, где вы бы порекомендовали его открыть? ?

Данные

Для решения проблемы нам потребуются следующие данные:
• Список микрорайонов Хайдарабада. Это определяет объем этого проекта, который ограничен городом Хайдарабад, столицей штата Телангана, который находится на юге Индии.
• Координаты широты и долготы этих районов. Это необходимо для построения карты, а также для получения данных о месте проведения.
• Данные о месте проведения, особенно данные, относящиеся к торговым центрам. Мы будем использовать эти данные для кластеризации окрестностей.

Источники данных и методы извлечения данных

Эта страница Википедии представляет собой список районов в Хайдарабаде, состоящий из 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

Надеюсь, статья была для вас полезной. Я хотел бы услышать отзывы, чтобы импровизировать и вернуться с более качественным контентом.

Большое спасибо за чтение!