05.08.2020       Выпуск 346 (03.08.2020 - 09.08.2020)       Статьи

Как проанализировать рынок фотостудий с помощью Python (3/3). Аналитика

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

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

Читать>>




Экспериментальная функция:

Ниже вы видите текст статьи по ссылке. По нему можно быстро понять ссылка достойна прочтения или нет

Просим обратить внимание, что текст по ссылке и здесь может не совпадать.

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

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

Группа молодых предпринимателей рассматривала вариант открытия своей фотостудии в Москве. Им необходимо было узнать:

  • какое общее состояние рынка фотостудий: растет, стабильный или падает?
  • какова сезонность рынка?
  • сколько они смогут заработать?
  • где лучше открывать залы?
  • какую сумму вкладывать в проект?
  • на сколько сильная конкуренция на рынке?

Ответить на эти и многие другие вопросы им помогли

простой парсер

,

база данных

и приведенная в это статье аналитика.

В

первой статье

мы рассмотрели парсинг сайта-агрегатора фотостудий

ugoloc.ru

и выгрузили общую информацию о фотостудиях, залах и данные по бронированию залов.

Во

второй статье

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

В данной статье мы проведем простой анализ собранных данных.

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

github

.

Какие направления для анализа мы будем использовать

  • определим динамику открытия фотостудий;
  • вычислим прибыльность фотостудий в зависимости от месяца открытия;
  • определим сезонность бизнеса;
  • вычислим средний доход на зал, а также оптимальное количество залов у фотостудии;
  • исследуем зависимость доходности от расположения фотостудии;
  • выясним количество залов у студий-конкурентов;
  • рассчитаем влияние прочих параметров на доход, таких как высота потолков, площадь залов, цены бронирования;
  • рассмотрим другие возможные направления анализа.

Выгрузка данных из БД

Для выгрузки выполняем следующие действия:

устанавливаем соединение с базой
directory = './/'
conn = sqlite3.connect(directory + 'photostudios_moscow1.sqlite')
cur = conn.cursor() 
оставляем студии с датами открытия и исключаем гримерки из списка залов
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().

Расчет доходности 1 зала
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

.






Разместим вашу рекламу

Пиши: mail@pythondigest.ru

Нашли опечатку?

Выделите фрагмент и отправьте нажатием Ctrl+Enter.

Система Orphus