Недавно, когда я изучал алгоритм кластеризации K-Mean. Моя подруга, которая делает много роликов в Instagram, пришла ко мне, чтобы предложить свои несколько мест в Ченнаи, где она может исследовать разные кухни и создавать контент для своих роликов. Как естественный замкнутый человек, я не имел об этом большого представления. Но мне вдруг пришла в голову идея использовать данные о ресторанах в Ченнаи и использовать алгоритм K-Mean, чтобы предложить ей несколько мест.

Я не получил правильный набор данных для моей проблемы. Поэтому я соскреб один, используя несколько интернет-источников. Я собрал данные из Википедии с помощью Beautifulsoup и использовал API Foursquare. Смотрите мой github для очистки кода.

Набор данных не содержит нулевых значений. Так что это уменьшает много работы для нас. Давайте проведем небольшой анализ, чтобы получить больше информации.

На этом графике показано, что у нас много индийских ресторанов. Когда я углубляюсь в индийские рестораны, в основном это отели, которые обслуживают как южную, так и северную Индию. Также он содержит несколько исключений, но это не повлияет на наш анализ.

Поскольку веганская культура становится все более популярной, в Ченнаи открывается множество отелей для любителей веганской еды.

Для обслуживания оживленного города Ченнаи существует множество ресторанов быстрого питания.

Теперь давайте начнем подготовку набора данных для построения модели.

Столбец Restaurents_category — самый важный столбец для нашей модели. Так как это категориальный столбец объекта. Давайте сначала конвертируем в порядковый номер, а затем закодируем его.

points = np.array(chennai['Restaurents_Category']).reshape(-1,1)
encoder = OrdinalEncoder()
result = encoder.fit_transform(points).astype('int64')
chennai['Category'] = result

dummy = pd.get_dummies(chennai['Category'])
data = pd.concat([chennai['Area'], dummy],1)
data.head()

Всего существует 55 категорий, к которым относятся рестораны.

Теперь сгруппируйте данные по районам и сохраните 10 самых популярных категорий ресторанов для каждого района.

# Grouping Data
group = data.groupby('Area').mean().reset_index()

def return_most_common_category(row, num_top_venues):
    row_categories = row.iloc[1:]
    row_categories_sorted = row_categories.sort_values(ascending=False)
    
    return row_categories_sorted.index.values[0:num_top_venues]

# Kepping the top 10 restaurant category for each area.
num_top_category = 10

indicators = ['st', 'nd', 'rd']

#Creating new columns
columns = ['Area']
for ind in np.arange(num_top_category):
    try:
        columns.append('{}{} Most Common Category'.format(ind+1, indicators[ind]))
    except:
        columns.append('{}th Most Common Category'.format(ind+1))

#Creating new dataframe
data_sorted = pd.DataFrame(columns=columns)
data_sorted['Area'] = group['Area']

#Retirving data 
for ind in np.arange(group.shape[0]):
    data_sorted.iloc[ind, 1:] = return_most_common_category(group.iloc[ind, :], num_top_category)

data_sorted.head()

Наконец, давайте обучим алгоритм. Для K-Mean одним из недостатков является заранее указанное количество кластеров. В большинстве случаев мы определяем количество кластеров на основе потребностей бизнеса. Но здесь я не уверен в количестве кластеров, которые мне нужны. Поэтому я буду использовать метод локтя, чтобы определить количество кластеров.

На графике давайте возьмем значение K равным 4 и обучим модель.

kclusters = 4
chennai_grouped_clustering = group.drop('Area', 1)
kmeans = KMeans(n_clusters=kclusters, random_state=0).fit(chennai_grouped_clustering)

Красный: Кластер 0 | Фиолетовый: Кластер 1 | Синий: Кластер 2 | Зеленый: Кластер 3

Кластер 0 Распределение ресторанов

Области, относящиеся к кластеру 0, в основном содержат рестораны быстрого питания. Чтобы попробовать вкусный фаст-фуд, мы можем посетить эти места с хорошим контентом.

Кластер 1 Распределение ресторанов

В районах, входящих в кластер 1, сосредоточено множество ресторанов. Среди них у нас есть в основном индийские рестораны. Это кластер, в котором мы можем исследовать широкий спектр категорий ресторанов.

Кластер 2 Распределение ресторанов

Хлебобулочные и кондитерские изделия можно изучить в кластере 2.

Кластер 3 Распределение ресторанов

Этот кластер похож на кластер 1, но у нас меньше ресторанов. Может быть, мы можем просто пропустить этот кластер для нашего поиска контента в Instagram.

Также в Ченнаи культура торговых центров становится все более популярной среди людей. Поскольку торговый центр — это единственное место, где можно попробовать различные продукты питания, эти данные не включены в наш набор данных. Так что моему другу я включу основные торговые центры в Ченнаи для посещения с хорошим содержанием барабанов.

Итак, это мои предложения моей подруге, чтобы получить хороший контент для ее барабанов. Зачем ждать дальше, если у нас есть подходящие места для посещения!… Собираюсь приготовить несколько вкусных роликов с моим другом….😉👯

Полный код смотрите на моем github.

Ссылка:

https://medium.com/@shaswatd673/restaurant-location-recommender-using-k-means-6b3a54f27e64