В открытых источниках содержится огромное количество полезной информации. Правильный ее сбор, хранение и анализ помогут найти оптимальные возможности для бизнеса.
Группа молодых предпринимателей рассматривала вариант открытия своей фотостудии в Москве. Им необходимо было узнать:
- какое общее состояние рынка фотостудий: растет, стабильный или падает?
- какова сезонность рынка?
- сколько они смогут заработать?
- где лучше открывать залы?
- какую сумму вкладывать в проект?
- на сколько сильная конкуренция на рынке?
Ответить на эти и многие другие вопросы им помогли простой парсер, база данных и приведенная в это статье аналитика.
В первой статье мы рассмотрели парсинг сайта-агрегатора фотостудий ugoloc.ru и выгрузили общую информацию о фотостудиях, залах и данные по бронированию залов.
Во второй статье мы рассмотрели запись полученных данных в БД и чтение данных из БД, а также настроили работу парсинга в зависимости от информации в БД.
В данной статье мы проведем простой анализ собранных данных.
Готовый проект с примерами таблиц из базы данных, промежуточных таблиц, графиков, доп.комментариями вы можете найти на моей странице в github.
Какие направления для анализа мы будем использовать
- определим динамику открытия фотостудий;
- вычислим прибыльность фотостудий в зависимости от месяца открытия;
- определим сезонность бизнеса;
- вычислим средний доход на зал, а также оптимальное количество залов у фотостудии;
- исследуем зависимость доходности от расположения фотостудии;
- выясним количество залов у студий-конкурентов;
- рассчитаем влияние прочих параметров на доход, таких как высота потолков, площадь залов, цены бронирования;
- рассмотрим другие возможные направления анализа.
Выгрузка данных из БД
Для выгрузки выполняем следующие действия:
directory = './/'
conn = sqlite3.connect(directory + 'photostudios_moscow1.sqlite')
cur = conn.cursor()
studios = db_to_studios(conn)
studios
halls = db_to_halls(conn)
halls
booking = db_to_booking(conn)
booking
studios = studios[[x.year > 0 for x in studios['established_date']]]
halls = halls[halls['is_hall'] == 1]
Динамика открытия фотостудий по годам
Построим частотную гистограмму открытия фотостудий по разным годам. Для этого вычисляем количество периодов (лет) и строим гистограмму.
num_bins = np.max(studios['established_date']).year - np.min(studios['established_date']).year + 1
plt.hist([x.year for x in studios['established_date']], num_bins)
plt.show()
На гистограмме видим явный рост новых фотостудий из года в год. Эта закономерность говорит нам не о фактическом росте рынка в 2 раза ежегодно, а, скорее, о росте самого агрегатора.
Данный факт говорит нам о необходимости разделения студий на 2 категории: зарегистрировавшиеся на агрегаторе при открытии фотостудии («новые») и спустя продолжительное время («старые»). Это и будет нашей следующей задачей.
Выявление новых фотостудий
Какую фотостудию можно считать новой? Ту, которая только-только раскручивается и набирает клиентов. По визуальному анализу календарей бронирования от момента открытия видно, что стабильный поток клиентов студия набирает за несколько месяцев.
Получается, чтобы отличить новую фотостудию от старой (которая не сразу присоединилась к агрегатору), нужно сравнить доход за первые полмесяца с момента «открытия» с аналогичным периодом годом позже. У новых студий за год доход должен существенно вырасти, у старой — остаться, примерно, на том же уровне.
# merge all tables
data = (booking
.merge(halls, left_on = 'hall_id', right_on = 'hall_id', how = 'inner')
.merge(studios, left_on ='studio_id', right_on = 'studio_id', how = 'inner')
)
data = data[data['is_working_hour'] == 1]
data['date'] = pd.to_datetime(data['date'])
data
first_month = (data[data['date'] <= [x + datetime.timedelta(days = 15) for x in data['established_date']]]
.loc[:, ['studio_id', 'price', 'duration']]
)
first_month['income'] = first_month['price'] * first_month['duration']
first_month = first_month.groupby('studio_id').agg(np.sum)
first_month
month_after_year = (data[(data['date'] >= [x + datetime.timedelta(days = 365) for x in data['established_date']])
& (data['date'] <= [x + datetime.timedelta(days = 365 + 15) for x in data['established_date']])
]
.loc[:, ['studio_id', 'price', 'duration']]
)
month_after_year['income'] = month_after_year['price'] * month_after_year['duration']
month_after_year = month_after_year.groupby('studio_id').agg(np.sum)
month_after_year
month_diff = (month_after_year.merge(first_month, left_on = 'studio_id', right_on = 'studio_id', how = 'inner')
.merge(halls.groupby('studio_id').count()
, left_on = 'studio_id', right_on = 'studio_id', how = 'inner')
)[['income_x', 'income_y', 'is_hall']]
month_diff['income_diff'] = (month_diff['income_x'] / month_diff['income_y']) ** (1 / month_diff['is_hall'])
month_diff.sort_values('income_diff')
Получили коэффициент роста дохода спустя год. Показатель у разных студий распределен от 0,75 до 2,1 без резких скачков. Это говорит о том, что студия могла подключиться к агрегатору сразу после открытия, спустя неделю, месяц, год и т.д.
Для определения новых фотостудий возьмем условное значение коэффициента роста дохода в значении медианы: 1,18. Т.е. если доход фотостудии за год вырос более, чем на 18%, то будем считать эту фотостудию новой. Таких студий получилось 22.
В какой месяц лучше открывать фотостудию?
Мы вычислили фотостудии, которые зарегистрировались на агрегаторе через короткое время после открытия. Поэтому фактический день открытия и день открытия по нашим данным у этих студий будем считать одинаковыми.
Для расчета мы возьмем новые фотостудии, посчитаем доход как сумму цен бронирования всех забронированных часов, сгруппируем по залам (с учетом месяца его открытия), посчитаем среднее значение годового дохода по месяцам открытия.
new = studios['is_new'].reset_index().merge(data, left_on = 'studio_id', right_on = 'studio_id', how = 'inner')
new = new[new['is_new'] == 1]
new = new[new['date'] <= [x + datetime.timedelta(days = 365) for x in new['established_date']]]
new['est_year'] = [x.year for x in new['established_date']]
new['est_month'] = [x.month for x in new['established_date']]
new['income'] = new['price'] * new['is_booked']
mean_income = (new
.groupby(['hall_id', 'est_year', 'est_month']).agg('sum')['income'].reset_index()
.groupby('est_month').agg('mean')['income']
plt.bar(range(1, 12), mean_income)
plt.show()
)
На гистограмме видим четкую зависимость:
- лучшие месяцы для открытия фотостудии — начало года (январь-апрель)
- также хорошими месяцами для открытия являются сентябрь-октябрь;
- худшими месяцами являются май-июнь.
Интересно будет сравнить эти данные с сезонностью рынка.
Определение сезонности бизнеса
Сезонность — изменение количества заказов в зависимости от периода. Проанализируем годовую сезонность.
Для расчета возьмем студии, открытые до 2018 года и посмотрим их брони за 2018-2020 года. Доход студии определяем как сумму цен за забронированные часы. Далее считаем суммарный доход всех студий по каждому месяцу выбранного периода.
season = data[(data['open_date'] < '2018-01-01') & (data['date'] > '2018-01-01')]
season['income'] = season['price'] * season['duration']
season['year'] = [x.year for x in season['date']]
season['month'] = [x.month for x in season['date']]
incomes = season.groupby(['year', 'month']).agg(np.sum)['income']
incomes = incomes[incomes.index]
incomes = incomes[: -3]
plt.figure(figsize = (20, 10))
plt.plot([str(x[0]) + '-' + str(x[1]) for x in incomes.index], incomes)
plt.xticks(rotation=60)
plt.grid()
plt.show()
На графике видим четко выраженную сезонность: наибольшее количество заказов с октября по апрель и резкое падение с мая по сентябрь. Сезонность укладывается в логику бизнеса. В летний период люди фотографируются на улице, в парках. В зимний период такой возможности нет, и устраивать фотосессии приходится в помещении. С этим и связана сезонность: летом клиентов мало, зимой много. Пик заказов приходится на декабрь. Вероятно, это связано с Новым годом и ощущением праздника, которое хочется запечатлеть на фотографии.
Наилучшие месяцы для открытия связаны сезонностью. Открывать студию лучше в сезон или за месяц до его начала. В период с мая по август студию открывать не стоит, т.к. попадем в несезон.
Расчет доходности зала
Важным показателем для открываемого бизнеса является доход с одного зала.
Для расчета группируем доходы по залам по каждому месяцу, исключаем 2020 год как аномальный в виду карантина и смотрим выборку доходов функцией .describe().
hall_income = season.groupby(['studio_id','hall_id', 'year', 'month']).agg(sum)['income'].reset_index()
hall_income = hall_income[hall_income['year'] < 2020]
hall_income['income'].describe()
count 648.000000
mean 184299.691358
std 114304.925311
min 0.000000
25% 95575.000000
50% 170350.000000
75% 256575.000000
max 617400.000000
Name: income, dtype: float64
Получили доход на 1 зал в рублях.
Из данных по персентилям видно, что доход половины залов укладывается в интервал от 95 000 руб. до 256 000 руб. с медианным значением в 170 000 руб.
Из данных по средней и стандартному отклонению видим, что согласно правилу 1 сигмы две трети залов приносят от 70 000 руб. до 300 000 руб. с серединов в 184 000 руб.
Получается, средний зал может рассчитывать на доход в 170 000 — 180 000 руб. ± 80 000 руб.
Такой большой разброс объясняется влиянию прочих факторов, которые в дальнейшем постараемся определить.
Сколько залов открыть в фотостудии?
Для расчета вычислим среднюю месячную доходность на каждый зал, вычислим среднюю доходность зала на фотостудию, посчитаем количество залов в фотостудии и сгруппируем данные по количеству залов, рассчитав среднюю доходность на 1 зал.
(hall_income
.groupby(['studio_id', 'hall_id']).agg('mean').reset_index()
.groupby('studio_id').agg(['count', 'mean'])['income']
.groupby('count').agg('mean')
)
mean
count
1 134847.916667
2 146531.944444
3 300231.944444
4 222202.604167
Получили среднемесячную доходность 1 зала в зависимости от количества залов в фотостудии. Заметим закономерность: чем больше залов, тем больше доходность. Максимальная доходность у студий с 3 залами.
Это явление связано с тем, что воспользовавшись одним залом фотостудии, клиент может увидеть другой зал и сразу его забронировать. Таким образом, один зал фотостудии «продвигает» другие.
Зависимость дохода от расположения зала
Местоположение зала может сильно влиять на доходность: в центре залы будут доступнее для клиентов, а значит, доход будет выше. Проверим гипотезу.
Для расчета посчитаем среднемесячную доход зала, сгруппируем по признаку «метро» и отсортируем в порядке возрастания.
data['income'] = data['price'] * data['duration']
data['year'] = [x.year for x in data['date']]
data['month'] = [x.month for x in data['date']]
(data
.groupby(['hall_id', 'metro', 'year', 'month']).agg('sum')['income'].reset_index()
.groupby(['hall_id', 'metro']).agg('mean')['income'].reset_index()
.groupby('metro').agg('mean')['income'].sort_values()
)[-59:]
Получили следующие данные:
metro
электрозаводская 5016.666667
метро Алексеевская 10485.264378
Дубровка 11925.000000
Марксистская/Нижегородская 18116.666667
Новогиреево, Щелковская 19000.000000
Войковская 21963.333333
Текстильщики 30667.051729
Нижегородская 31031.250000
Нагатинская 37787.500000
Павелецкая/Добрынинская 39357.142857
Партизанская 44354.375000
Полежаевская 45888.888889
Волгоградский проспект 46566.666667
Чкаловская 48541.666667
м. Марксистская, МЦК Нижегородская 49086.503623
Красносельская 55340.659341
Речной вокзал, Митино, Комсомольская 55944.444444
м. Марксистская/ мцк. Нижегородская 59771.111111
Академика Янгеля 66780.000000
Молодежная 66847.058824
Серпуховская 67692.545788
м.Шаболовская 70090.341880
м.Алексеевская 70337.676411
Молодежная, Парк Победы 72974.494949
Кутузовская 79987.083333
Преображенская Площадь 88800.000000
Нагатинская 95550.000000
Электрозаводская 98326.086957
Алексеевская 99216.279070
99925.000000
ВДНХ и Ботанический Сад 102835.622784
м. ВДНХ, м. Ростокино, ст. Яуза\Северянин 104956.521739
Преображенская площадь 111050.684459
Киевская 111090.000000
Калужская 111909.090909
Андроновка 116426.892180
Автозаводская Тульская 117450.000000
Бауманская 118382.236364
Озерная 122626.500000
Савёловская, Марьина роща 123258.518519
Петровско-Разумовская 124557.894737
Чкаловская, Курская 126300.000000
Дмитровская 129222.916667
Павелецкая 135281.642512
Бауманская, Площадь Ильича 138945.454545
Кевская 152246.883469
Серпуховская, Павелецкая 168484.500000
м.Электрозаводская 169079.381010
м. Дмитровская 172618.798439
Электрозаводская 173777.659900
Кожуховская 178254.545455
ВДНХ 181041.818182
Трубная 187283.444198
Ботанический сад 189140.857975
Курская или Площадь Ильича 250975.000000
Крылатское, Киевская, Белорусская 252685.714286
Бауманская, Электрозаводская 264164.473684
Новые-Черемушки 277162.791991
Марьина Роща 556621.746032
Name: income, dtype: float64
Обращаю внимание, что данные по метро оставил как есть. Для более точной картины их нужно привести к общему формату, например, «Бауманская, Электрозаводская», «м.Электрозаводская» и «электрозаводская» записать одним названием.
Из данных видим, что в районах с дорогой недвижимостью, таких как Марьина Роща, Новые Черемушки, Крылатское, доходность на зал выше.
Сколько залов у студий-конкурентов
Сколько залов у работающих на рынке студий? Для ответа на этот вопрос присоединим к таблице студий таблицу с залами, сгруппируем по студиям, посчитав количество залов, и построим частотную гистограмму.
hall_num = studios.merge(halls, left_on='studio_id', right_on='studio_id').groupby('studio_id').agg('count')['is_hall']
plt.hist(hall_num, range(np.min(hall_num), np.max(hall_num)+1))
plt.show()
hall_num.describe()
count 105.000000
mean 2.685714
std 2.292606
min 1.000000
25% 1.000000
50% 2.000000
75% 3.000000
max 13.000000
Из полученных данных видим, что у большинства фотостудий (более 75%) не больше 3 залов. На всем рынке, как правило, у студий не более 5 залов.
Влияние других параметров на доход фотостудии
Высота потолка
Для фотографий нужно много света, и большие окна в помещении с высокими потолками дают много естественного света. К тому же чем выше потолки, тем более рассеянный, равномерный свет доходит до пола. Поэтому высота потолка может влиять на доходность фотостудии. Проверим эту гипотезу.
Посчитаем средний месячный доход каждого зала с сохранением данных по высоте потолка, потом рассчитаем средний доход в зависимости от высоты потолка и постоим график.
halls_sq_ceil = (data
.groupby(['hall_id', 'ceiling', 'square', 'year', 'month']).agg('sum')['income'].reset_index()
.groupby(['hall_id', 'ceiling', 'square']).agg('mean')['income'].reset_index()
)
plt.bar(halls_sq_ceil.groupby('ceiling').agg('mean')['income'].index[:-2],
halls_sq_ceil.groupby('ceiling').agg('mean')['income'][: len(halls_sq_ceil) - 2]
)
plt.show()
В полученных данных видим, что до 6 метров есть прямая зависимость доходности фотостудии от высоты потолка. Оптимальная высота — 5-6 метров.
Площадь залов
Гипотеза: чем больше площадь зала, тем больший доход зал приносит.
Проверяем гипотезу. Используем предыдущие расчеты, рассчитаем среднюю доходность в зависимости от площади, построим график.
square = halls_sq_ceil.groupby('square').agg('mean')['income']
plt.bar(square.index[:-3],
square.iloc[: len(square) - 3]
)
plt.show()
На графики видна четкая закономерность: чем больше площадь, тем больше зал приносит.
Цена бронирования
Гипотеза: есть оптимальная цена зала, которую клиенты платить практически за любой зал. Более высокую цену клиенты готовы платить исключительно за высокое качество.
Для проверки гипотезы вначале рассмотрим текущий уровень цен. Для этого сгруппируем общую таблицу бронирования по залам, цене, году, месяцу и просуммируем доход. Затем сгруппируем по залам и цене бронирования, вычислив средний доход. Далее сгруппируем по цене, рассчитав средний доход. Получили средний месячный доход на студию в зависимости от установленной цены бронирования
price = (data
.groupby(['hall_id', 'price', 'year', 'month']).agg('sum')['income'].reset_index()
.groupby(['hall_id', 'price']).agg('mean')['income'].reset_index()
.groupby('price').agg('mean')['income']
)
plt.figure(figsize = (20, 10))
plt.hist(price.iloc[: len(price) - 5].index)
plt.show()
Из частотной гистограммы видим, что большинство студий установило цену за аренду от 500 до 2000 руб. Ниже 500 руб. — редкость. Максимальная цена аренды зала — 3500 руб.
price = price[price > 10000]
plt.figure(figsize = (20, 10))
plt.scatter(price.index, price)
plt.show()
На графике видно, что до 2000 руб. есть четкая прямая зависимость: чем выше установлена цена бронирования, тем больше зарабатывает студия. При цене выше 2000 руб. доход с зала может быть как низким, так и высоким. По всей видимости, более 2000 руб. клиенты готовы платить только за высокое качество оказанных услуг: либо за удобное расположение, либо за оснащенность, либо за большую площадь, либо за качественный интерьер и т.д.
Другие направления аналитики рынка
Анализ оснащенность
На сайте ugoloc.ru есть информация об оснащенности фотостудий: наличие цветных фонов, марка вспышек и т.д. Оснащенность фотостудий тоже может влиять на доходность, поэтому для полноты анализа следует учесть и этот фактор.
Не все студии могут указывать наличие дополнительного оборудования. Поэтому оценка влияния данного фактора может оказаться неточной.
Анализ влияния нескольких параметров на доход
Параметры влияют на доход не изолированно друг от друга. Например, площадь и цена бронирования связаны и вместе влияют на общую доходность студии. Поэтому их влияние разумнее рассматривать вместе. Влияние нескольких параметров стоит рассматривать исходя из специфики запросов клиента.
Расширение собираемых данных
Фотостудии на сайте ugoloc.ru составляют меньше трети рынка по количеству. По доходу и сегменту рынка долю студий с данного сайта-агрегатора оценить не представляется возможным. Для более точной картины стоит собирать данные с AppEvent, Google-Календарей, возможно, и с самописных приложений по бронированию.
Учет расходы
Вы могли заметить, что для полноты картины часто не хватало расходов. Например, чем больше площадь зала, тем больше доход с него. Вывод, конечно, хороший, но с ростом площади растет стоимость аренды зала. Поэтому на график, безусловно, полезно будет нанести рост расхода за аренду. В оптимальном соотношении дохода и расхода по конкретному параметру и скрыта прибыльность проекта.
От площади также зависит и стоимость ремонта: чем больше площадь, тем дороже ремонт.
С ростом количество залов снижаются расходы на персонал в расчете на 1 зал, т.к. 1 администратор может обслуживать как 1 зал, так и 3.
Анализ удаленности от метро
При оценке влияния расположения студии на доход зала важным неучтенным фактором является удаленность от метро. Проставлять его придется вручную или, кто хорошо знаком с API Гугла, можно попробовать автоматизировать это действие.
Удаленность от конкурентов
Чаще всего студии располагаются близко друг к другу. На одном лишь Электрозаводе их около 40. Есть гипотеза, что близость к другим фотостудиям повышает доходность. Для клиентов может быть знакомо именно место (здание/бизнес-центр) и они могут ему доверять, что положительно скажется на всех фотостудиях локации.
Загруженность фотостудий
Отдельно можно исследовать загруженность фотостудий:
- какой процент времени работы зала составляют брони;
- как брони связаны с днем недели (спойлер: в выходные бронируют чаще);
- есть ли незабронированные дни (в которые администратор может не выходить на работу);
- в какие часы чаще всего бронируют (особенно интересно посмотреть по будням)
- и т.д.
Состояние фотостудий в несезон
Студии чаще закрываются летом, когда нет заказов. При этом, у некоторых фотостудий количество заказов несильно падает. Какие преимущества есть популярных в несезон студий? Это отдельное направление для рассмотрения.
Анализ доходности конкурентов
Обладая информацией о стоимости аренды помещений под фотостудию и средних зарплатах персонала, можно оценить финансовое состояние конкурентов. Может оказаться, что некоторые студии находятся на грани закрытия. Соответственно, можно выявить их ошибки и постараться их избежать.
Аналогично можно исследовать опыт наиболее прибыльных фотостудий и использовать их преимущества в своей студии.
Этапы анализа
Приведенная аналитика является первым этапом, дающий примерную картину рынка. Для дальнейшего анализа клиенту необходимо определиться какую студию ему бы хотелось открыть, какой ценовой сегмент, какое возможное расположение, какая стоимость аренды, какое оборудование и т.д.
Идеальный вариант: определить несколько вариантов предложений по аренде. Тогда будут определены и площадь, и высота потолков, и примерное количество залов, и расходы, и ближайшие конкуренты.
В этом случае аналитику можно проводить более предметно и точно.
Итог
В серии статей мы рассмотрели как из открытых источников собрать данные, сохранить их в базу данных и проанализировать. Результатом работы стало общее понимание рынка услуг фотостудий.
Приведенные расчеты можно применить:
- в создании бизнес-плана в доходной части. И это будут статистически подтвержденные данные;
- в оценки целесообразности и прибыльности проекта, сравнивая доход и расход при разных вариантах открытия;
- действующим фотостудиям. Многие фотостудии простаивают без заказов или работают в убыток. Значит, они что-то делают не так. Приведенная аналитика может помочь студиям в выявлении причин своего состояния.
Мне понравилось выполнять этот проект.
Решил поделиться опытом, который вам может быть полезен.
На сколько полезна была информация в этих трех статьях?
Поделитесь своим мнением.
Готовый проект вы можете найти на моей странице в github.
Genofox
Классная статья, спасибо!