Исследование факторов успеха в индустрии HoReCa на основе данных 250 заведений
Этот проект посвящён анализу факторов успеха в индустрии гостеприимства и общественного питания на основе данных двухсот пятидесяти заведений столицы. Исследование выполнено с применением современных методов data science, включая статистический анализ, машинное обучение и генеративный искусственный интеллект. В рамках работы мы изучили ключевые метрики ресторанного бизнеса, проверили распространённые гипотезы о связи цены и качества, а также выявили скрытые закономерности, которые могут быть полезны для рестораторов, маркетологов и инвесторов.
В современном высококонкурентном мире ресторанного бизнеса принятие решений на основе данных становится критически важным конкурентным преимуществом. Я задалась несколькими фундаментальными вопросами, которые волнуют каждого предпринимателя в этой сфере. Первый и наиболее важный вопрос звучит так:
действительно ли высокая цена напрямую влияет на рейтинг ресторана, или это распространённое заблуждение?
Существует устойчивый миф о том, что дорогие заведения обязательно лучше по качеству, но насколько это соответствует реальности?Второй вопрос касается структуры рынка:
какие типы кухни наиболее популярны среди московских ресторанов, где самая высокая конкуренция, а где есть незанятые ниши?
Третий вопрос географический:
существуют ли значимые различия между административными округами Москвы в плане цен, качества обслуживания и предпочтений аудитории?
И наконец, четвёртый вопрос методологический:
как можно сегментировать рынок для более эффективного позиционирования новых проектов?
Целевая аудитория этого исследования включает несколько групп профессионалов. Во-первых, это действующие рестораторы и предприниматели, планирующие выход на рынок общественного питания. Для них наши выводы могут стать основой для стратегического планирования и позиционирования. Во-вторых, это маркетологи и бренд-менеджеры, работающие в сфере HoReCa, которым необходимо понимание реальных драйверов успеха. В-третьих, инвесторы в индустрию общепита, которые принимают решения о финансировании проектов на основе объективных данных. И наконец, исследователи потребительского поведения и студенты, изучающие практическое применение data science в реальном бизнесе.
Объём нашей выборки составляет двести пятьдесят ресторанов, расположенных в десяти административных округах Москвы. Это достаточно репрезентативная выборка, позволяющая делать статистически обоснованные выводы о рынке в целом. В выборку попали заведения пятнадцати различных типов кухонь, от традиционной русской и европейской до экзотической японской и узбекской. Мы также выделили четыре ценовые категории: бюджетный сегмент с чеком до одной тысячи рублей, средний сегмент от тысячи до тысячи восьмисот рублей, средний плюс от тысячи восьмисот до трёх тысяч рублей и премиум-сегмент свыше трёх тысяч рублей на человека.
ПРОЦЕСС РАБОТЫ — Схема обработки данных
цветовая палитра для графиков
Что показывает простыми словами:
Круговая диаграмма (pie chart) показывает, какой процент ресторанов относится к каждой ценовой категории:
- Средний (красный) — 44.8%
- Средний+ (оранжевый) — 31.2%
- Бюджетный (зелёный) — 13.2%
- Премиум (тёмно-синий) — 10.8%
Ключевые выводы:
✅ Основа рынка — средний сегмент:
- "Средний" + "Средний+" = 76% всех ресторанов
- Это золотая середина: чек 1200-3000 руб.
✅ Бюджетный сегмент недопредставлен:
- Только 13.2% — мало вариантов для студентов и экономных клиентов
✅ Премиум-сегмент — ниша:
- 10.8% — узкая аудитория с высокими доходами
✅ Структура типична для крупных городов:
- Массовый рынок = средний сегмент
- Экстремумы (очень дешёвые и очень дорогие) — меньшинство
Ключевые выводы:
✅ Лидеры:
- ЕВР (Европейская) — 30 ресторанов (~12%)
- ФУЗ (Fusion) — 26 ресторанов (~10.4%)
- УЗБ (Узбекская) — 25 ресторанов (~10%)
В топ-10 попали:
- Азиатские кухни: Паназиатская, Китайская, Японская (ЯПО) - Европейские: Итальянская, Французская, Средиземноморская - Национальные: Грузинская, Русская- ЧТО ПОКАЗЫВАЕТ ПРОСТЫМИ СЛОВАМИ?
Этот график показывает, как распределяются рейтинги ресторанов в зависимости от их ценовой категории. Форма "скрипки" (violin) показывает, где концентрируется большинство ресторанов по рейтингу:
Широкая часть = много ресторанов с таким рейтингом Узкая часть = мало ресторанов с таким рейтингом Синяя линия = медиана (середина распределения) Красная линия = среднее значение Ключевое наблюдение: Все ценовые категории имеют примерно одинаковые средние рейтинги (около 4.0 баллов), но различаются по разбросу.
КЛЮЧЕВЫЕ ВЫВОДЫ:
✅ Миф развенчан: дорого ≠ качественно
- Бюджетные рестораны имеют средний рейтинг ~3.9
- Премиум-рестораны тоже ~4.2
- Разница минимальна — всего 0.3 балла
✅ Средний сегмент самый разнородный
- Категория "Средний" имеет самый широкий разброс (от 2.5 до 5.0)
- Это означает огромную конкуренцию и большие различия в качестве
✅ Премиум-сегмент стабильнее
- "Скрипка" премиум-категории более узкая и компактная
- Меньше выбросов = более предсказуемое качество
✅ Средний+ показывает лучшую концентрацию
- Большая часть ресторанов имеет рейтинг 4.0-5.0
- Это "золотая середина" по соотношению цена/качество
Этот график показывает, как различаются цены в ресторанах в разных административных округах Москвы:
Высота "скрипки" = разброс цен Ширина = концентрация ресторанов с определённой ценой Синяя линия = медианная цена (типичная) Красная точка = средняя цена Чёрные точки = выбросы (аномально дорогие рестораны)
КЛЮЧЕВЫЕ ВЫВОДЫ:
✅ ЦАО (Центр) — самый дорогой
- Медиана ~2500₽, среднее ~2900₽
- Огромный разброс: от 1500₽ до 5000₽
- Много премиум-заведений (выбросы до 5000₽)
✅ ВАО и ЮВАО — самые дешёвые
- Медиана ~1200₽
- Компактное распределение = мало премиум-заведений
✅ ЗАО и СВАО — средний ценовой сегмент
- Медиана ~1700₽
- Стабильные цены без экстремальных выбросов
✅ САО показывает бимодальность
- Два пика: бюджетные (~1500₽) и дорогие (~2000₽)
- Практически нет среднего сегмента
✅ ЮЗАО — загадка
- Низкая медиана (~1400₽), но есть выбросы до 2000₽
- Возможно, смесь спальных районов и элитных ЖК
ХОД ИССЛЕДОВАНИЯ: ФАКТОРЫ УСПЕХА В HoReCa ПОШАГОВАЯ МЕТОДОЛОГИЯ АНАЛИЗА
СБОР И ПОДГОТОВКА ДАННЫХ
Импорт необходимых библиотек
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import StandardScaler
Загрузка датасета
df = pd.read_csv('horeca_data.csv')
Первичный осмотр данных
print(f"Размер выборки: {len(df)} ресторанов") print(f"Количество признаков: {df.shape[1]}") df.info() df.describe()
ОЧИСТКА И ОБРАБОТКА ДАННЫХ
Обработка пропущенных значений
df['reviews_count'].fillna(df['reviews_count'].median(), inplace=True) df['instagram_followers'].fillna(0, inplace=True)
Удаление выбросов (метод IQR)
Q1 = df['avg_check'].quantile(0.25) Q3 = df['avg_check'].quantile(0.75) IQR = Q3 - Q1 df = df[(df['avg_check'] >= Q1 - 1.5IQR) & (df['avg_check'] <= Q3 + 1.5IQR)]
Создание категориальных признаков
df['price_category'] = pd.cut(df['avg_check'], bins=[0, 1000, 1800, 3000, 10000], labels=['Бюджетный', 'Средний', 'Средний+', 'Премиум'])
Стандартизация числовых признаков
scaler = StandardScaler() df[['avg_check_scaled', 'rating_scaled']] = scaler.fit_transform( df[['avg_check', 'rating']] )
ТЕСТИРОВАНИЕ ГИПОТЕЗ
from scipy.stats import mannwhitneyu, kruskal
ГИПОТЕЗА 1: Влияет ли цена на рейтинг?
budget = df[df['price_category'] == 'Бюджетный']['rating'] premium = df[df['price_category'] == 'Премиум']['rating'] stat, p = mannwhitneyu(budget, premium)
print("=== ГИПОТЕЗА 1: ДОРОГИЕ РЕСТОРАНЫ = ВЫШЕ РЕЙТИНГ? ===") print(f"Средний рейтинг бюджетных: {budget.mean():.2f}") print(f"Средний рейтинг премиум: {premium.mean():.2f}") print(f"p-value = {p:.4f}") if p < 0.05: print("✓ Различие ЗНАЧИМО") else: print("✗ Различие НЕЗНАЧИМО → МИФ РАЗВЕНЧАН!")
ГИПОТЕЗА 2: Влияние округа на цену
stat, p = kruskal(*[df[df['district'] == d]['avg_check'] for d in df['district'].unique()]) print(f"\n=== ГИПОТЕЗА 2: ГЕОГРАФИЯ ВЛИЯЕТ НА ЦЕНУ? ===") print(f"Kruskal-Wallis H-test: p-value = {p:.4f}") if p < 0.05: print("✓ Округ ЗНАЧИМО влияет на цену") else: print("✗ Округ НЕ влияет на цену")
ГИПОТЕЗА 3: Популярность vs Рейтинг
high_reviews = df[df['reviews_count'] > df['reviews_count'].median()]['rating'] low_reviews = df[df['reviews_count'] <= df['reviews_count'].median()]['rating'] stat, p = mannwhitneyu(high_reviews, low_reviews)
print(f"\n=== ГИПОТЕЗА 3: ПОПУЛЯРНЫЕ = КАЧЕСТВЕННЕЕ? ===") print(f"Рейтинг популярных (много отзывов): {high_reviews.mean():.2f}") print(f"Рейтинг непопулярных (мало отзывов): {low_reviews.mean():.2f}") print(f"p-value = {p:.4f}") if p < 0.05 and high_reviews.mean() > low_reviews.mean(): print("✓ Популярные рестораны лучше") elif p < 0.05 and high_reviews.mean() < low_reviews.mean(): print("⚠️ Популярные рестораны ХУЖЕ (парадокс!)") else: print("✗ Нет значимой разницы")




