-
Notifications
You must be signed in to change notification settings - Fork 2
Статистика ItHappened
Для более наглядного для простого пользователя отображения статистики мы вводим понятие факта статистики. Факт - это какая-то интересная, занимательная для пользователя информация, основанная на данных пользовательских отслеживаний. Обязательные атрибуты факта статистики:
- Тип
- Текстовое описание
- Приоритет
- Функция применимости
Необязательные атрибуты:
- Целевое отслеживание
- Иллюстрация
- Специфичные для типа атрибуты
Факт каждого типа отражает особенность пользовательских данных.
Его текстовое описание показывается пользователю.
Найденные факты выдаются пользователю ранжированные по приоритету.
Функция применимости для каждого типа фактов принимает на вход массив всех событий в отслеживании и выдаёт факт, если он применим, со всеми его атрибутами.
Факт может быть общим или специфичным для конкретного отслеживания.
Иллюстрация - это визуальное отображение конкретного факта статистики, может быть графиком, круговой диаграммой или любой другой иллюстрацией.
У каждого типа фактов есть какие-то кастомные атрибуты, по которым строится иллюстрация, заполняется текстовое описание и т.п.
Для каждого отслеживания прогоняется функция применимости каждого типа фактов. Для каждого отслеживания собираются те факты, которые применимы к данному отслеживанию, и ранжируются по приоритету от большего к меньшему. После чего выдаются на экране статистики для каждого из отслеживаний. Количество фактов ограничивается десятью для одного отслеживания. Факты статистики нужно считать в фоновом режиме во время работы приложения. Факты перерасчитываются для отслеживания либо при добавлении, редактировании или удалении события в отслеживании, либо при ручном запросе пользователя.
Атрибуты: TrackingName, EventsPeriod
Текстовое описание: "Чаще всего у вас происходит событие {TrackingName} - раз в {EventsPeriod} дней"
Приоритет: 10 \ EventsPeriod
Иллюстрация: стобчатая диаграмма
Функция применимости: применимо, если количество отслеживаний больше 1, если есть хотя бы два отслеживания, в которых больше трёх событий. Для всех таких отслеживаний считается EventsPeriod, как количество дней с первого события, делённое на количество событий, и выбирается TrackingName с наименьшим EventsPeriod'ом.
Атрибуты: 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 - дата, когда произошло первое событие после перерыва.