Skip to content

Статистика ItHappened

Vitaly Margelov edited this page Jul 8, 2018 · 20 revisions

Общее описание

Для более наглядного для простого пользователя отображения статистики мы вводим понятие факта статистики. Факт - это какая-то интересная, занимательная для пользователя информация, основанная на данных пользовательских отслеживаний. Обязательные атрибуты факта статистики:

  • Тип
  • Текстовое описание
  • Приоритет
  • Функция применимости

Необязательные атрибуты:

  • Целевое отслеживание
  • Иллюстрация
  • Специфичные для типа атрибуты

Факт каждого типа отражает особенность пользовательских данных.

Его текстовое описание показывается пользователю.

Найденные факты выдаются пользователю ранжированные по приоритету.

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

Факт может быть общим или специфичным для конкретного отслеживания.

Иллюстрация - это визуальное отображение конкретного факта статистики, может быть графиком, круговой диаграммой или любой другой иллюстрацией.

У каждого типа фактов есть какие-то кастомные атрибуты, по которым строится иллюстрация, заполняется текстовое описание и т.п.

Применение

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

Список существующих на данный момент фактов

Общие факты

Самое частое событие

Атрибуты: TrackingName, EventsPeriod

Текстовое описание: "Чаще всего у вас происходит событие {TrackingName} - раз в {EventsPeriod} дней"

Приоритет: 10 \ EventsPeriod

Иллюстрация: стобчатая диаграмма

Функция применимости: применимо, если количество отслеживаний больше 1, если есть хотя бы два отслеживания, в которых больше трёх событий. Для всех таких отслеживаний считается EventsPeriod, как количество дней с первого события, делённое на количество событий, и выбирается TrackingName с наименьшим EventsPeriod'ом.

Зафиксировано уже N событий

Атрибуты: EventsCount

Текстовое описание: "У вас произошло уже {EventsCount} событий!"

Приоритет: log(EventsCount)

Иллюстрация: нет

Функция применимости: применимо, если количество отслеживаний больше 0, суммарное количество событий больше 5. EventsCount - количество событий во всех отслеживаниях.

Корреляция

Атрибуты: FirstTrackingName, FirstTrackingAttribute, SecondTrackingName, SecondTrackingAttribute, Relation

Текстовое описание: Чем больше {FirstTrackingAttribute} в событиях {FirstTrackingName}, тем {Relation} {SecondTrackingAttribute} в событиях {SecondTrackingName}

Приоритет: 40 * {CorrelationCoefficient}

Иллюстрация: Нет

Функция применимости: Применимо, если количество отслеживаемых событий больше 40. TrackingAttribute - это частота события, либо рейтинг, либо значение шкалы. Relation - положительная или отрицательная корреляция. CorrelationCoefficient - абсолютное значение коэффициента корреляции.

Примечание: Корреляция между фактами возникновения событий - корреляция Мэтьюса, корреляция между значениями шкалы - корреляция Спирмена, а корреляция между рейтингом - корреляция тау Кендалла (b модификация, ссылка на википедию: Wikipedia: https://en.wikipedia.org/wiki/Kendall_rank_correlation_coefficient, пример: https://stats.stackexchange.com/questions/261206/kendall-s-tau-b-version-calculation-steps-with-tied-ranks).

Самый насыщенный событиями день

Атрибуты: DayWithLargestEventsCount, EventsCount

Текстовое описание: Самый насыщенный событиями день был {DayWithLargestEventCount}. Тогда произошло {EventsCount} событи(е,й,я)

Приоритет: 1.5*EventsCount

Иллюстрация: Ссылка на историю событий с применённым на DayWithLargestEventsCount днём.

Функция применимости: Применимо, если был день, в который было больше одного события. DayWithLargestEventsCount - день, в который произошло максимальное количество событий. EventsCount - количество событий в этот день. Если дней с максимальным количеством событий несколько, выбирается самый поздний такой день.

Самая насыщенная событиями неделя

Атрибуты: WeekWithLargestEventCountFirstDay, WeekWithLargestEventCountLastDay, EventsCount

Текстовое описание: Самая насыщенная событиями неделя была с {WeekWithLargestEventCountFirstDay} до {WeekWithLargestEventCountLastDay}. За её время произошло {EventsCount} событи(е,й,я).

Приоритет: 0.75 * EventsCount

Иллюстрация: Ссылка на историю событий с применённым на WeekWithLargestEventCountFirstDay-WeekWithLargestEventCountLastDay фильтром.

Функция применимости: применимо, если была неделя, в которую произошло больше одного события. Неделей считается временной промежуток с понедельник по воскресенье включительно. WeekWithLargestEventCountFirstDay - дата понедельника на неделе с максимальным числом событий, WeekWithLargestEventCountLastDay - дата воскресенья на этой неделе. EventsCount - количество событий на этой неделе. Если недель с максимальным количеством событий несколько, берётся последняя.

Факты специфичные для отслеживаний

Количество событий

Атрибуты: EventsCount

Текстовое описание: "Событие "{TrackingName}" произошло {EventsCount} раз"

Приоритет: log(EventsCount)

Иллюстрация: отсутствует

Функция применимости: применимо, если количество событий в целевом отслеживании больше 0

Среднее значение оценки

Атрибуты: AverageRating

Текстовое описание: "Средний рейтинг для события "{TrackingName}" равен {AverageRating}"

Приоритет: sqrt(AverageRating)

Иллюстрация: отсутствует

Функция применимости: применимо, если в отслеживании есть кастомизация рейтинга и количество событий с рейтингом в целевом отслеживании больше 1. AverageRating считается как сумма всех рейтингов в событиях, делённая на количество этих событий.

Среднее значение шкалы

Атрибуты: AverageValue, MeasurementUnit

Текстовое описание: "Средний значение "{MeasurementUnit}" для события "{TrackingName}" равно {AverageValue}"

Приоритет: 3

Иллюстрация: отсутствует

Функция применимости: применимо, если в отслеживании есть кастомизация шкалы и количество событий со шкалой в целевом отслеживании больше 1. AverageValue считается как сумма всех значений шкалы в событиях, делённая на количество этих событий. MeasurementUnit - единица измерения для шкалы в этом отслеживании

Суммарное значение шкалы

Атрибуты: SumValue, MeasurementUnit

Текстовое описание: "Сумма значений "{MeasurementUnit}" для события "{TrackingName}" равна {SumValue}"

Приоритет: 2

Иллюстрация: отсутствует

Функция применимости: применимо, если в отслеживании есть кастомизация шкалы и количество событий со шкалой в целевом отслеживании больше 1. SumValue считается как сумма всех значений шкалы в событиях, MeasurementUnit - единица измерения для шкалы в этом отслеживании

Давно не происходило

Атрибуты: DaysSinceLastEvent

Текстовое описание: "Событие "{TrackingName}" не происходило уже {DaysSinceLastEvent} дней"

Приоритет: log(DaysSinceLastEvent)

Иллюстрация: отсутствует

Функция применимости: применимо, если количество событий в отслеживании больше двух, с последнего события прошло больше недели и {DaysSinceLastEvent} в 3 раза больше среднего количества дней между событиями в отслеживании.

Участилось

Атрибуты: IncreasePeriod, Times

Текстовое описание: "Событие "{TrackingName}" происходит чаще за последний(ие) {IncreasePeriod} - {Times} раз"

Приоритет: Times \ IncreasePeriod.TotalDays

Иллюстрация: график

Функция применимости: Применимо, если количество событий больше 2. TrackingName - наименование отслеживания, IncreasePeriod - период отслеживания, Times - количество фактов возникновения события.

Стало реже

Атрибуты: DecreasePeriod, Times

Текстовое описание: "Событие "{TrackingName}" происходит реже за последний(ие) {DecreasePeriod} - {Times} раз"

Приоритет: DecreasePeriod.TotalDays \ Times

Иллюстрация: график

Функция применимости: Применимо, если количество событий больше 2. TrackingName - наименование отслеживания, IncreasePeriod - период отслеживания, Times - количество фактов возникновения события.

Происходит в определённые дни недели

Атрибуты: DaysOfTheWeek, Percentage

Текстовое описание: "В {Percentage}% случаев событие "{TrackingName}" происходит в {DayOfTheWeek}"

Приоритет: Percentage * 0.14

Иллюстрация: круговая диаграмма

Функция применимости: применимо, если событий в отслеживании больше семи и если хотя бы в один из дней недели происходит по меньшей мере 25% всех событий. DaysOfTheWeek - массив таких дней недели, Percentage - общая доля событий, которые происходят в эти дни недели.

Происходит в определённое время суток

Атрибуты: TimeOfTheDay, Percentage

Текстовое описание: "В {Percentage}% случаев событие "{TrackingName}" происходит {TimeOfTheDay}"

Приоритет: Percentage * 0.14

Иллюстрация: круговая диаграмма

Функция применимости: применимо, если событий в отслеживании больше семи и если на одно из времён суток доля событий превышает 70%. TimeOfTheDay - это время суток (ночь, утро, день, вечер), Percentage - доля событий, которые происходят в это время суток.

Рейтинг стал падать

Атрибуты: DecreasePeriod, AverageRating, OldAverageRating

Текстовое описание: "За последний {DecreasePeriod} оценка события {TrackingName} с {OldAverageRating} упала до {AverageRating}"

Приоритет: (OldAverageRating - AverageRating) * 10 \ IncreasePeriod.TotalDays

Иллюстрация: график

Функция применимости: Применимо, если число событий в отслеживании больше 4. DecreasePeriod - период изменения тренда рейтинга, AverageRating - новое среднее значение рейтинга, OldAverageRating - среднее значение рейтинга до этого периода.

Рейтинг стал расти

Атрибуты: IncreasePeriod, AverageRating, OldAverageRating

Текстовое описание: "За последний {IncreasePeriod} оценка события {TrackingName} с {OldAverageRating} поднялась до {AverageRating}"

Приоритет: (AverageRating - OldAverageRating) * 10 \ IncreasePeriod.TotalDays

Иллюстрация: график

Функция применимости: Применимо, если число событий в отслеживании больше 4. IncreasePeriod - период изменения тренда рейтинга, AverageRating - новое среднее значение рейтинга, OldAverageRating - среднее значение рейтинга до этого периода.

Шкала стала расти

Атрибуты: IncreasePeriod, AverageValue, OldAverageValue, MeasurementUnit

Текстовое описание: "За последний {IncreasePeriod} величина "{MeasurementUnit}" события {TrackingName} с {OldAverageValue} поднялась до {AverageValue}"

Приоритет: (AverageValue - OldAverageValue) * 10 \ IncreasePeriod.TotalDays

Иллюстрация: график

Функция применимости: Применимо, если количество событий больше 1. IncreasePeriod - период отслеживания, MeasurmentUnit - наименование отслеживаемого атрибута события, AverangeValue - новое среднее значение шкалы. OldAverangeValue - новое среднее значение шкалы.

Шкала начала падать

Атрибуты: DecreasePeriod, AverageValue, OldAverageValue, MeasurementUnit

Текстовое описание: "За последний {DecreasePeriod} величина "{MeasurementUnit}" события {TrackingName} с {OldAverageValue} упала до {AverageValue}"

Приоритет: (OldAverageValue - AverageValue) * 10 \ IncreasePeriod.TotalDays

Иллюстрация: график

Функция применимости: Применимо, если количество событий больше 1. IncreasePeriod - период отслеживания, MeasurmentUnit - наименование отслеживаемого атрибута события, AverangeValue - новое среднее значение шкалы. OldAverangeValue - новое среднее значение шкалы.

Худшее событие

Атрибуты: WorstRating, WorstEventDate, WorstEventComment

Текстовое описание: "Событие {TrackingName} с самым низким рейтингом {WorstRating} произошло {WrostEventDate} с комментарием {WrostEventComment}"

Приоритет: 10-WorstRating

Иллюстрация: ссылка на событие

Функция применимости: применимо, только если количество событий с рейтингом в отслеживании больше 10, самое раннее событие было раньше, чем 3 месяца назад, а событие с минимальным рейтингом было больше недели назад. WorstRating - рейтинг этого события, WorstEventDate - время этого события, WorstEventComment - комментарий к этому событию, если он был.

Лучшее событие

Атрибуты: BestRating, BestEventDate, BestEventComment

Текстовое описание: "Событие {TrackingName} с самым высоким рейтингом {BestRating} произошло {BestEventDate} с комментарием {BestEventComment}"

Приоритет: BestRating

Иллюстрация: ссылка на событие

Функция применимости: применимо, только если количество событий с рейтингом в отслеживании больше 10, самое раннее событие было раньше, чем 3 месяца назад, а событие с максимальным рейтингом было больше недели назад. BestRating - рейтинг этого события, BestEventDate - время этого события, BestEventComment - комментарий к этому событию, если он был.

Самый долгий перерыв

Атрибуты: DurationInDays, LastEventBeforeBreakDate, FirstEventAfterBreakDate

Текстовое описание: "Самый большой перерыв в {TrackingName} произошёл с {LastEventBeforeBreakDate} до {FirstEventAfterBreakDate}, он занял {DurationInDays} дней"

Приоритет: sqrt(DurationInDays)

Иллюстрация: нет

Функция применимости: применимо, только если количество событий в отслеживании больше 10, FirstEventAfterBreakDate был более, чем неделю назад и DurationInDays в 3 или более раз больше, чем среднее время между событиями. DurationInDays - продолжительность самого длинного перерыва в днях, LastEventBeforeBreakDate - дата, когда произошло последнее перед этим перерывом событие, FirstEventAfterBreakDate - дата, когда произошло первое событие после перерыва.