Предыстория анализа
Цель анализа
- Проанализируйте влияние данных, связанных с заказами Mobike, на время поездки и используйте их в качестве справочного материала и основы для оптимизации бизнес-операций (поскольку в исходном наборе данных нет данных о сумме заказа, а также потому, что Mobike использует время поездки в качестве биллинга). Стандартно, время поездки является наиболее важным фактором, влияющим на размер заказа, поэтому этот анализ основан на времени поездки).
- В основном он фокусируется на анализе влияния времени поездки (включая два измерения: рабочие дни/выходные, часы пик/непиковые часы), места поездки и пользовательской ценности на время поездки.
Сводка набора данных
- Исходный набор данных получен из данных об использовании одного миллиона пользователей Mobike Shanghai, предоставленных Udacity в августе 2016 года. Всего имеется 102 361 запись заказа, включая пункт отправления, пункт назначения, время аренды, время возврата, идентификатор пользователя, идентификатор транспортного средства, транзакцию. информация о номере и треке маршрута.
- После очистки и извлечения информации в новый набор данных были добавлены 22 новые переменные.Переменные, используемые в основном для анализа: ttl_min (время поездки (мин)), расстояние (расстояние по прямой между началом и концом поездки (км). )), тип дня (рабочие дни/выходные), тип часа (часы пик/непиковые часы), этап_кольца (внутреннее кольцо/среднее кольцо/внешнее кольцо/внешнее кольцо), скорость (пользователь с высоким значением/пользователь со средним значением/пользователь с низким значением ) эти шесть переменных.
- Во время использования нового набора данных было также удалено небольшое количество аномальных записей скорости, расстояния и продолжительности езды, и окончательное количество записей заказов составило 102 338.
Заключение анализа
Сводка по поведению пользователей
В процессе изучения данных было обнаружено, что четыре переменные: время катания (включая будни/выходные, часы пик/непиковые часы), район катания и ценность для пользователя — все они влияют на время катания. Когда четыре переменных условия определены по очереди, можно обнаружить, что:
- При одинаковых условиях географического положения или пользовательской ценности регулярность времени поездки по отношению к среднему времени поездки очевидна, а среднее время поездки в часы пик и выходные выше, чем в непиковые часы и рабочие дни;
- В целом, чем выше пользовательское значение, тем дольше время езды, чем дальше район езды от центра города и тем дольше время езды, но влияние первого на время езды намного меньше, чем влияние первого. последний.
Помимо сосредоточения внимания на влиянии переменных типа на продолжительность поездки, были сделаны следующие выводы:
- Сравнивая различные географические местоположения и типы пользовательских значений, характеристики распределения точек данных в будние дни и часы пик очень похожи, что указывает на то, что характеристики поведения при использовании транспортных средств в будние дни и часы пик аналогичны;
- Ценные пользователи более распределены внутри внутреннего кольца.
Сводка предложений по оптимизации
С учетом приведенных выше выводов анализа данных о поведении пользователей выдвигаются следующие предложения по оптимизации:
- Ввиду особенностей времени катания (будние дни/выходные, часы пик/непиковые часы), сильно влияющих на время катания, различное время катания можно использовать в качестве разделительного стандарта для запуска пакетов катания и маркетинговых мероприятий целенаправленным образом для увеличения частота заказов и сумма заказа (например, награды за ездовые значки в разное время, бесплатные поездки в течение ограниченного времени, поездки в пиковые периоды и т. д.)
- Принимая во внимание поведенческие характеристики пользователей, находящихся вдали от городских районов, с высоким разовым потреблением (длительное время в пути) и низкой частотой потребления (мало ценных пользователей), соответствующие пакеты для поездок могут быть запущены в соответствии с географическим местоположением для увеличения количества поездок. частота потребления пользователями в таких областях, увеличить их зависимость от использования Mobike
- Учитывая, что характеристики поведения пользователей одинаковы в рабочие дни и в часы пик, можно объединить соображения при разработке планов операционной деятельности.
другие инструкции
-
Поскольку объем информации в исходном наборе данных слишком мал, содержимое, доступное для анализа, ограничено.После расширения информации и объема набора данных содержимое, доступное для анализа, включает, но не ограничивается:
-
В соответствии с данными о кликах пользователя в приложении анализируется коэффициент конверсии критического пути, чтобы определить, сбалансированы ли спрос и предложение велосипедов в определенной области, чтобы оптимизировать объем доставки велосипедов и эффективность диспетчеризации.
-
Периодичность использования велосипеда в ежемесячных и ежеквартальных единицах в качестве ориентира и основы для разработки и оптимизации маркетингового плана.
Влияние предпочтительных действий, таких как велосипедные купоны, велосипедные пакеты, перезарядка и кэшбэк, на велосипедное поведение пользователей в качестве ориентира и основы для уточнения действий пользователей или разработки маркетингового плана. Процесс анализа
Процесс анализа
Основное внимание уделяется влиянию четырех типов переменных на продолжительность поездки. Во-первых, вводится распределение данных о времени и расстоянии поездки. Затем, рисуя диаграмму скрипки, мы наблюдаем, что характеристики данных очень похожи между собой при изменении переменных типа, а затем определяем, что нам нужно только обратить внимание на взаимосвязь между ключевым показателем времени езды и четырьмя типами. переменные. Наконец, влияние других переменных на время поездки отображается с помощью точечной диаграммы под контролем переменных типа различных условий.
# 导入所有需要用到的库,并将图表设置为直接显示
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
%matplotlib inline
# 清除输出中的警告
import warnings
warnings.simplefilter("ignore")
# 导入清洗整理后的数据集
df_e = pd.read_csv('mobike_master.csv')
# 将对应列转换成类别变量
order_dict = {'ring_stage': ['inside inner ring', 'inside middle ring', 'inside outer ring', 'outside outer ring'],
'rate': ['high-value user', 'middle-value user', 'low-value user'],
'daytype': ['weekdays', 'weekends'],
'hourtype': ['rush hours', 'non-rush hours']}
for var in order_dict:
order = pd.api.types.CategoricalDtype(ordered = True, categories = order_dict[var])
df_e[var] = df_e[var].astype(order)
# 数据清理,去除少量在骑行速度、骑行时长和骑行距离上明显异常的数据
df_e['speed'] = df_e['distance'] / (df_e['ttl_min'] / 60)
df_e = df_e[-(((df_e['speed'] < 12) | (df_e['speed'] > 20)) & ((df_e['ttl_min'] > 720) | (df_e['distance'] > 50)))]
Распределение времени в пути
Диапазон данных о времени езды очень велик, минимальное значение составляет 1 минуту, максимальное значение составляет 666 минут, и он показывает длиннохвостое распределение, асимметричное распределение с пиками, появляющимися между 7-10 минутами.
bins = 10 ** np.arange(0, np.log10(df_e.ttl_min.max()) + 0.15, 0.15)
plt.hist(data = df_e, x = 'ttl_min', bins = bins);
plt.xscale('log')
xticks = (1, 2, 5, 10, 20, 50, 100, 200, 500)
plt.xticks(xticks, xticks);
plt.xlabel('Riding Duration (min)');
plt.title('Distribution of Riding Duration');
Распределение велосипедного расстояния
Расстояние поездки в наборе данных оценивается по расстоянию по прямой между начальной и конечной точками поездки.Диапазон данных также очень велик, с минимальным значением 0,146 км и максимальным значением 32,497 км, а также представляет длиннохвостое распределение, которое абсолютно Большинство расстояний езды короткие, и очень немногие расстояния езды длинные Используя логарифмически преобразованный график по оси X, можно обнаружить, что расстояние поездки показывает распределение с наклоном вправо , с пиком между 0,7-1,3 км.
bins = 10 ** np.arange(np.log10(df_e.distance.min()), np.log10(df_e.distance.max()) + 0.08, 0.08)
plt.hist(data = df_e, x = 'distance', bins = bins);
plt.xscale('log')
xticks = (0.1, 0.2, 0.5, 1, 2, 5, 10, 20)
plt.xticks(xticks, xticks);
plt.xlabel('Riding Distance (km)');
plt.title('Distribution of Riding Distance');
Продолжительность поездки и расстояние поездки по отношению к другим переменным
- С точки зрения времени поездки установлено, что медианное время поездки и расстояние поездки выше в выходные дни и в часы пик, чем в будние дни и в непиковые часы (за исключением выходных, расстояние поездки немного меньше, чем в будние дни);
- С точки зрения зоны катания, когда зона катания пользователя находится за пределами внутреннего кольца, среднее время поездки и расстояние поездки становятся выше по мере удаления от центра города, что может быть связано с тем, что чем ближе к пригороду, тем выше пользователь Расстояние между пунктом отправления и пунктом назначения увеличивается;
- С точки зрения ценности для пользователя, среднее время в пути и расстояние в пути уменьшались по мере того, как ценность для пользователя становилась ниже.
Путем сравнения обнаруживается, что характеристики распределения данных двух числовых переменных времени езды и расстояния поездки почти такие же, как характеристики изменения ситуации классификации, и последующий анализ расстояния поездки не может быть выполнен. Причины таковы: с одной стороны, время катания велико, это реальные данные в исходных данных (расстояние катания - это расстояние по прямой, рассчитанное от начальной и конечной точек поездки). , Mobike использует время поездки в качестве основы для оплаты. Поэтому, когда характеристики данных очень похожи, выберите время поездки с более высоким качеством и ценностью данных в качестве индикатора последующего анализа.
# 由于骑行时长和骑行距离的数据均呈现非常长的长尾,所以先对两个数据进行log转化,以便更清晰地观察数据特征
df_e['log_ttl_min'] = np.log10(df_e['ttl_min'])
df_e['log_distance'] = np.log10(df_e['distance'])
cat_vars = ['daytype', 'hourtype', 'ring_stage', 'rate']
fig, ax = plt.subplots(ncols = 4, nrows = 2, figsize = [20,10])
color = sb.color_palette()[0]
for i in range(len(cat_vars)):
var = cat_vars[i]
# 画第一行的图
sb.violinplot(data = df_e, x = var, y = 'log_ttl_min', ax = ax[0, i], color = color);
ttl_min_ticks = [1, 2, 5, 10, 20, 50, 100, 200, 500]
ax[0, i].set_yticks(np.log10(ttl_min_ticks));
ax[0, i].set_yticklabels(ttl_min_ticks);
ax[0, i].set_ylabel('Riding Duration (min)');
if i == 2:
xlabels = ax[0, i].get_xticklabels()
ax[0, i].set_xticklabels(xlabels, rotation = 10);
# 画第二行的图
sb.violinplot(data = df_e, x = var, y = 'log_distance', ax = ax[1, i], color = color);
distance_ticks = [0.1, 0.2, 0.5, 1, 2, 5, 10, 20]
ax[1, i].set_yticks(np.log10(distance_ticks));
ax[1, i].set_yticklabels(distance_ticks);
ax[1, i].set_ylabel('Riding Distance (km)');
if i == 2:
xlabels = ax[1, i].get_xticklabels()
ax[1, i].set_xticklabels(xlabels, rotation = 10);
plt.suptitle('riding duration and distance by other features', fontsize = 'xx-large');
При условии заданного времени катания закон изменения времени катания в зависимости от площади катания и пользовательской ценности
- В целом, за исключением данных во внутреннем кольце, среднее время поездки в других районах увеличивается по мере удаления от центра города.
- Среднее время поездки для ценных пользователей является самым высоким, за исключением выходных и непиковых часов за пределами внешнего кольца.
- В целом, среднее время езды в часы пик и в выходные дни выше, чем в непиковые часы и будние дни.
- Из верхнего и нижнего графиков в первом столбце можно приблизительно увидеть, что изменения среднего времени в пути с изменениями переменной пользовательского значения и переменной зоны катания очень похожи в будние дни и в часы пик, что может быть связано с тем, что пригородные поезда составляют большинство пользователей в будние дни и часы пик, и эти пассажиры имеют схожие характеристики поведения при использовании автомобиля.
# 自定义函数,绘制控制变量条件下的pointplot图
def ppltgrid(row_dict):
for var in row_dict:
firstplot = list(row_dict.keys())[0] # 设置第一个绘图的编号,以便后续获取第一个绘图y轴的操作
a0,b0,c0 = var.split(',')
a,b,c = int(a0), int(b0), int(c0)
plt.subplot(a,b,c)
flagid, flag, hue, x = row_dict[var]['flagid'], row_dict[var]['flag'], row_dict[var]['hue'], row_dict[var]['x']
ax = sb.pointplot(data = df_e[df_e[flagid] == flag], x = x, y = 'log_ttl_min', hue = hue,
palette = 'Blues_r', linestyles = '', dodge = 0.1);
ax.set_title("{}'s riding duration across {} and {}".format(flag, x, hue), fontsize = 'small');
ylocs = np.arange(1, 1.25, 0.025)
ylabels = np.round(np.power(10, ylocs), 2)
ax.set_yticks(ylocs);
ax.set_yticklabels(ylabels);
ax.set_yticklabels([],minor = True); # 不显示默认的主要刻度
if c % b == 1: # 为每行的第一个图设置y轴标签,其他图则不显示,以防遮盖图表内容
ax.set_ylabel('Mean Riding Duration (min)');
else:
ax.set_ylabel('');
if x == 'ring_stage' or x == 'rate': # ring_stage和rate的类别名称过长,将字体变小
xlabels = ax.get_xticklabels()
ax.set_xticklabels(xlabels, fontsize = 'small');
if var == firstplot:
ylim = ax.get_ylim() # 获取第一个绘图的y轴
else:
plt.ylim(ylim); # 使第二个开始的所有绘图保持和第一个绘图一致的y轴范围
plt.figure(figsize = [15, 10])
row_dict = {'2,2,1': {'flagid': 'daytype', 'flag': 'weekdays', 'hue': 'rate', 'x': 'ring_stage'},
'2,2,2': {'flagid': 'daytype', 'flag': 'weekends', 'hue': 'rate', 'x': 'ring_stage'},
'2,2,3': {'flagid': 'hourtype', 'flag': 'rush hours', 'hue': 'rate', 'x': 'ring_stage'},
'2,2,4': {'flagid': 'hourtype', 'flag': 'non-rush hours', 'hue': 'rate', 'x': 'ring_stage'}}
ppltgrid(row_dict)
В условиях заданной зоны катания и пользовательской ценности закон изменения времени катания со временем катания
- Соответственно определите переменную географического положения на велосипеде и переменную пользовательского значения и наблюдайте за влиянием времени на велосипеде на среднее время на велосипеде.Можно обнаружить, что относительные положения точек данных очень похожи, что указывает на то, что время на велосипеде имеет очевидное правило для среднего времени езды на велосипеде.При тех же условиях езды по географическому положению или ценности для пользователя среднее время езды в часы пик и выходные дни выше, чем в непиковые часы и рабочие дни.
- Сравнивая характеристики распределения точек данных в первой строке и во второй строке, можно обнаружить, что точки данных с точки зрения переменных пользовательского значения, поскольку пользовательское значение изменяется от высокого к низкому, продольное изменение намного ниже, чем это с точки зрения положения при езде в первом ряду Диапазон вертикальных колебаний показывает, что пользовательское значение оказывает небольшое влияние на среднее время вождения, гораздо меньше, чем положение при езде.
plt.figure(figsize = [20,10])
row_dict = {'2,4,1': {'flagid':'ring_stage', 'flag': 'inside inner ring', 'hue': 'daytype', 'x': 'hourtype'},
'2,4,2': {'flagid':'ring_stage', 'flag': 'inside middle ring', 'hue': 'daytype', 'x': 'hourtype'},
'2,4,3': {'flagid':'ring_stage', 'flag': 'inside outer ring', 'hue': 'daytype', 'x': 'hourtype'},
'2,4,4': {'flagid':'ring_stage', 'flag': 'outside outer ring', 'hue': 'daytype', 'x': 'hourtype'},
'2,4,5': {'flagid':'rate', 'flag': 'high-value user', 'hue': 'daytype', 'x': 'hourtype'},
'2,4,6': {'flagid':'rate', 'flag': 'middle-value user', 'hue': 'daytype', 'x': 'hourtype'},
'2,4,7': {'flagid':'rate', 'flag': 'low-value user', 'hue': 'daytype', 'x': 'hourtype'}}
ppltgrid(row_dict)
Код отправлен наGithubДля получения дополнительной информации, пожалуйста, следуйте за мнойличный блог
использованная литература
- Запросите географический центр Шанхая - координаты широты и долготы отеля International (AutoNavi Open Platform):Не удается подключиться. Amapa.com/console/ yes oh…
- Примерный объем шанхайского внутреннего кольца, среднего кольца и внешнего кольца:Знайте. Baidu.com/question/36…
- **Стоимость мобильного велосипеда за август 2016 г.:woohoo.33twice.com/article/764…