Основные показатели розничной торговли могут иметь множество различимых значений. Первый шаг в их анализе заключается в получении "типичного значения" для каждого из показателей или другими словами оценки того, вокруг какого значения расположено большинство данных, т.е. в нахождении их центральной тенденции. В этой статье будут рассмотрены следующие показатели и их расчет с помощью Python : среднее арифметическое, геометрическое и гармоническое, среднее взвешенное, среднее усеченное, медиана, медиана нижняя, медиана верхняя и медиана взвешенная.
Загружаем необходимые библиотеки
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import weightedstats as ws
%matplotlib inline
df.head()
| shop | rev | visit | ch | sale | conv | price | lch | |
|---|---|---|---|---|---|---|---|---|
| 0 | sh1 | 2981706 | 9628 | 645 | 1806 | 0.067 | 1651 | 2.8 |
| 1 | sh2 | 2582372 | 6766 | 284 | 937 | 0.042 | 2756 | 3.3 |
| 2 | sh3 | 1751464 | 8622 | 440 | 1144 | 0.051 | 1531 | 2.6 |
| 3 | sh4 | 4817280 | 9136 | 640 | 1920 | 0.070 | 2509 | 3.0 |
| 4 | sh5 | 6045546 | 10186 | 1039 | 2598 | 0.102 | 2327 | 2.5 |
- shop - индекс магазина
- rev - выручка
- visit - количество посетителей
- ch - количество чеков
- sale - количество покупок
- lch - длина чека = количество покупок / количество чеков
- price - средняя цена покупки = выручка / количество покупок
Среднее (mean)
Самой базовой оценкой центрального положения является среднее значение, или среднее арифметическое. Среднее — это сумма всех значений, деленная на число значений.
Анализируем длину чека. Рассчитаем среднее значения длины чека по 100 магазинам двумя методами : с помощью формулы и с помощью метода pandas data frame mean()
print(f'Среднее lch по формуле = {df.lch.sum()/df.shape[0]:.2f}')
#Используем метод pandas data frame mean()
print(f'Среднее lch по методу = {df.lch.mean():.2f}')
Среднее lch по формуле = 2.95
Среднее lch по методу = 2.95Среднее усеченное (trimmed mean)
Усеченное среднее lch = 2.94Однако при расчете усеченного среднего иногда хотелось бы иметь несимметричноеусечение. Например в случае длины чека хотелось бы например откинуть 25% худшихи только 5% лучших значений. Для этого напишем специальную функцию сиспользованием метода quantile
def qtrim_mean(x,trim_left,trim_right):
x_l=x.quantile(trim_left)
x_r=x.quantile(trim_right)
return x[x.between(x_l, x_r)].mean()
print(f'Asymmetric mean lch = {qtrim_mean(df.lch,0.25,0.95):.2f}')
Asymmetric mean lch = 3.08
магазина по длине чека за прошедший месяц и мы хотим на следующий месяц выдать
Среднее взвешенное (weighted mean)Еще один вид среднего значения— это средневзвешенное значение, котороевычисляется путем умножения каждого значения данных xi на свой вес wi и деления их суммы на сумму весов.Существуют два главных побудительных мотива для использования средневзвешенного значения.
♦ При расчет среднего значения по нескольким показателям степень доверия к нимможет отличаться.Например, при по итогам работы сети магазинов в прошедшего месяца сравниваем
плановую долю каждого магазина в выручке с фактической и на основании этих данных
хотим назначить долю магазина в следующем месяце как взвешенную среднюю междупланом и фактом, больший вес мы отдаем факту, но при этом плановую долютоже учитываем, только с меньшим весом.
♦ Осредняемые данные не одинаковы по своей "массе", поэтому например, рассчитавсреднюю длину чека по колонке lch и умножив но суммарное количество чеков мы неполучим фактическое количество покупок. Для этого надо рассчитать взвешенноесреднее и в качестве весов использовать количество чеков.Взвешенное среднее значение доступно с помощью пакета NumPyПроверим на наших данных#Средневзвешенная длина чека, вес - количество чековlch_wm=np.average(df['lch'], weights=df['ch']) print(f'средневзвешенная lch = {lch_wm :.2f}')#Количество покупок = средневзвешенная длина чека * количество чеков print(f'количество покупок формула = {lch_wm*df.ch.sum():.0f}')#Количество покупок = метод sum() print(f'количество покупок метод = {df.sale.sum():.0f}')средневзвешенная lch = 2.94 количество покупок формула = 202946 количество покупок метод = 202946Если же мы рассчитаем количество покупок по среднему арифметическому, то получим неверный результат#Средняя длина чека lch_m=df.lch.mean()print(f'среднее арифметическое lch = {lch_m :.2f}')#Количество покупок = средняя длина чека * количество чеков print(f'количество покупок формула = {lch_m*df.ch.sum():.0f}')среднее арифметическое lch = 2.95
количество покупок формула = 203194Рассмотрим еще два вида среднихСреднее геометрическое (geometric mean)
Корень n-й степени из произведения n-показателей Несколько примеров, где работает среднее геометрическое:Среднее геометрическое используется для расчет средних темпов измененияпоказателя. Например продажи магазина по годам распределяются следующимобразом.s=np.array([100,110, 90, 105])Тогда темпы роста по годам будут следующие : первый год к базовому 110/100, второйгод к первому 90/110 и третий год к второму 105/90.t=s[1:]/s[:3] print("темпы роста {0:0.0%} {1:0.0%} {2:0.0%}".format(t[0],t[1],t[2]))темпы роста 110% 82% 117%Среднегодовой темп роста как среднее арифметическоеt_m=t.mean() print("средний темп роста {0:0.0%}".format(t_m))средний темп роста 103%
Среднегодовой темп роста как среднее геометрическоеt_g=stats.gmean(t) print("средний геометрический темп роста {0:0.0%}".format(t_g))средний геометрический темп роста 102%Продажи последнего года, как мы помним, 105 единиц, однако если в качествесреднегодового темпа роста принять среднее арифметическое, то получимprint("продажи среднее арифметическое {0:0.0f}".format(100*t_m*t_m*t_m))продажи среднее арифметическое 109
Продажи последнего года, если в качестве среднегодового темпа роста принятьсреднее геометрическое рассчитаются верноprint("продажи среднее геометрическое {0:0.0f}".format(100*t_g*t_g*t_g))продажи среднее геометрическое 105Среднее геометрическое чувствительно к низким значениям и это может быть оченьценным качеством. Например мы оцениваем два образца футболок по трем критериям : принт, цвет и ткань по пяти бальной системе и две модели получили следующие оценкиОценки образцов по трем характеристикам :mod1=np.array([5,5,2]) mod2=np.array([4,4,4])Итоговые оценки как среднее арифметическоеrating_1_m=mod1.mean() rating_2_m=mod2.mean()Итоговые оценки как среднее геометрическоеrating_1_gm=stats.gmean(mod1) rating_2_gm=stats.gmean(mod2)print(f'Итоговые оценки как среднее арифметическое :образец 1 = {rating_1_m:.2f} образец 2 = {rating_2_m:.2f}')print(f'Итоговые оценки как среднее геометрическое :образец 1 = {rating_1_gm:.2f} образец 2 = {rating_2_gm:.2f}')Итоговая оценки как среднее арифметическое : образец 1 = 4.00 образец 2 = 4.00 Итоговая оценки как среднее геометрическое : образец 1 = 3.68 образец 2 = 4.00Как видим, среднее арифметическое выдало равные оценки, в то время как среднеегеометрическое отдало предпочтение второму образцу и учло тот факт, что ткань упервого образца, несмотря на хороший принт и цвет очень плохая и вряд ли надо отдать ему предпочтение.Среднее гармоническая (harmonic mean)
Среднее гармоническая применяется в тех случаях, когда требуется рассчитатьсреднюю из относительных величин, например скорость или в торговле это может быть средняя дневная выручка с квадратного метра. Допустим мы хотим работать в пятиторговых центрах и известна предварительна оценка среднемесячной выручки сквадратного метра. При этом мы хотим, чтобы дневная выручка каждого магазина была 2 000 000 руб. Надо рассчитать общую площадь магазинов в этих торговых центрах.Среднемесячная выручка с квадратного метраrs=np.array([20000,25000,30000,35000,40000])Средняя арифметическая дневная выручка с квадратного метраrs_m=rs.mean()Средняя гармоническая дневная выручка с квадратного метраrs_gm=statistics.harmonic_mean(rs)Плановая общая дневная выручка2 000 000*5=10 000 000Требуемая площадь для плановой выручкеЧерез среднее арифметическоеs_m=10000000/rs_mЧерез среднее геометрическоеs_gm=10000000/rs_gmprint(f'Cреднее арифметическое : {rs_m:.2f}')print(f'Cреднее гармоническое : {rs_gm:.2f}')print(f'Площадь через среднее арифметическое : {s_m:.2f}')print(f'Площадь через среднее гармоническое : {s_gm:.2f}')print(f'Площадь прямым счетом :{2000000/20000+2000000/25000+2000000/30000+2000000/35000+2000000/40000:.2f}')Cреднее арифметическое : 30000.00 Cреднее гармоническое : 28263.80 Площадь через среднее арифметическое : 333.33 Площадь через среднее гармоническое : 353.81 Площадь прямым счетом : 353.81Как видно, правильный результат получен через среднее гармоническое.По величине средние располагаются следующим образом :гармоническое <= геометрическое <= арифметическоеРавенство возможно, если все значения равны. Проверим на наших данныхпо цене продажиprint(f'Cреднее арифметическое : {df.price.mean():.0f}') print(f'Cреднее геометрическое : {stats.gmean(df.price):.0f}') print(f'Cреднее гармоническое : {statistics.harmonic_mean(df.price):.0f}')Cреднее арифметическое : 2259 Cреднее геометрическое : 2220 Cреднее гармоническое : 2181Медиана (median)
Медиана - такое значение, что половина сортированных данных находится выше и ниже данного значения. Если имеется четное число данных, то срединным значениемявляется то, которое не находится в наборе данных фактически, а является среднимарифметическим двух значений, которые делят сортированные данные на верхнюю инижнюю половины. Таким образом медианой может быть величина, которой нет внаборе данных. Если это вас не устраивает и если вам необходимо вычислитьмедианное количество сотрудников в магазинах и вы не хотите иметь дело с нецелымчислом, то в python в библиотеки statistics есть несколько функций для расчетамедианы : median - обычная медиана,median_low - возвращает нижнюю медианучисловых данных, median_high - возвращает верхнюю медиану числовых данных.print(f'Медиана = {statistics.median([2, 3, 6, 9]):.1f} ') print(f'Медиана нижняя = {statistics.median_low([2, 3, 6, 9]):.1f} ') print(f'Медиана верхняя = {statistics.median_high([2, 3, 6, 9]):.1f} ')Медиана = 4.5 Медиана нижняя = 3.0 Медиана верхняя = 6.0Медиана взвешенная (weighted median)
По тем же самым причинам, по которым используется среднее взвешенное, можно
вычислить и медиану взвешенную. Как и с медианой, мы сначала выполняемсортировку данных, несмотря на то что с каждым значением данных связан вес. Вотличие от срединного числа медиана взвешенная — это такое значение, в котором сумма весов равна для нижней и верхней половин сортированного списка. Как и медиана, взвешенная медиана робастна к выбросам.Для взвешенной медианы мы можем использовать специализированный пакет weightedstats:print(f'Медиана = {np.median(df.price):.0f}') print(f'Медиана взвешенная = {ws.weighted_median(df.price, weights=df.sale):.0f}')Медиана = 2280 Медиана взвешенная = 2249В заключении выведем рассмотренные величины на гистограмме средней ценыпродажиprice_m=df.price.mean() price_gm=stats.gmean(df.price) price_grm=statistics.harmonic_mean(df.price) price_wm=np.average(df.price, weights=df.sale) price_md=df.price.median() price_wmd=ws.weighted_median(df.price,weights=df.sale) print(f'Cреднее арифметическое : {price_m:.0f}') print(f'Cреднее арифметическое взвешенное = {price_wm :.0f}') print(f'Cреднее геометрическое : {price_gm:.0f}') print(f'Cреднее гармоническое : {price_grm:.0f}') print(f'Медиана = {price_md:.0f}') print(f'Медиана взвешенная = {price_wmd:.0f}')Cреднее арифметическое : 2259 Cреднее арифметическое взвешенное = 2256 Cреднее геометрическое : 2220 Cреднее гармоническое : 2181 Медиана = 2280 Медиана взвешенная = 2249

Комментариев нет:
Отправить комментарий