Страницы

Поиск по вопросам

Показаны сообщения с ярлыком статистика. Показать все сообщения
Показаны сообщения с ярлыком статистика. Показать все сообщения

суббота, 21 марта 2020 г.

Трансформация DataFrame

#python #pandas #dataframe #group_by #статистика


Есть 2 pd.DataFrame:

a = pd.DataFrame([[1, 20], [2, 25], [3, 24], [1, 22], [2, 29]], columns=['type', 'size'])
b = pd.DataFrame([[1, 19], [1, 21], [2, 24], [4, 21]], columns=['type', 'size'])


В каждый DataFrame хочу добавить столбцы следующего типа

a['amount_mean_type'] = a['size'] / a.groupby('type')['size'].transform('mean')
a['amount_std_type'] = a['size'] / a.groupby('type')['size'].transform('std')


Вопрос в том, как мне сделать так, чтобы в b['amount_mean_type'] и b['amount_std_type']
я использовал mean и std по группам из a, а по тем категориям, которых нет в a, использовать
mean и std по всему сету (если это корректно). 

Что-то вроде этого: 

b['amount_mean_type'] = b['size'] / a.groupby('type')['size'].transform('mean')
b['amount_std_type'] = b['size'] / a.groupby('type')['size'].transform('std')


Но только с теми условиями, которые описал выше

UPD: пример фреймов на выходе

Для a все просто:

a['amount_mean_type'] = a['size'] / a.groupby('type')['size'].transform('mean')
a['amount_std_type'] = a['size'] / a.groupby('type')['size'].transform('std')

  type size amount_mean_type amount_std_type
0   1   20  0.952381    14.142136
1   2   25  0.925926    8.838835
2   3   24  1.000000    NaN 
3   1   22  1.047619    15.556349
4   2   29  1.074074    10.253048


для b приходится прописать вручную каждую операцию

b.loc[0, 'amount_mean_type'] = b.loc[0, 'size'] / a[a['type'] == 1]['size'].mean()
b.loc[1, 'amount_mean_type'] = b.loc[1, 'size'] / a[a['type'] == 1]['size'].mean()
b.loc[2, 'amount_mean_type'] = b.loc[2, 'size'] / a[a['type'] == 2]['size'].mean()
b.loc[3, 'amount_mean_type'] = b.loc[3, 'size'] / a['size'].mean()

b.loc[0, 'amount_std_type'] = b.loc[0, 'size'] / a[a['type'] == 1]['size'].std()
b.loc[1, 'amount_std_type'] = b.loc[1, 'size'] / a[a['type'] == 1]['size'].std()
b.loc[2, 'amount_std_type'] = b.loc[2, 'size'] / a[a['type'] == 2]['size'].std()
b.loc[3, 'amount_std_type'] = b.loc[3, 'size'] / a['size'].std()

  type size amount_mean_type amount_std_type
0   1   19  0.904762    13.435029
1   1   21  1.000000    14.849242
2   2   24  0.888889    8.485281
3   4   21  0.875000    6.192562 # Считается по всей переменной 'type', так как категории
(4) нет в `a`


Фреймы a и b можно рассматривать как train и test соответственно
    


Ответы

Ответ 1



tmp = a.groupby('type')['size'].agg(["mean", "std"]) res = (b.assign(x=b["type"].map(tmp["mean"]).fillna(a["size"].mean())) .eval("amount_mean_type = size / x") .drop(columns="x")) res = (res.assign(x=b["type"].map(tmp["std"]).fillna(a["size"].std())) .eval("amount_std_type = size / x") .drop(columns="x")) результат: In [28]: res Out[28]: type size amount_mean_type amount_std_type 0 1 19 0.904762 13.435029 1 1 21 1.000000 14.849242 2 2 24 0.888889 8.485281 3 4 21 0.875000 6.192562

суббота, 15 февраля 2020 г.

Java хранение больших статистических данных

#java #база_данных #статистика


Здравствуйте! Необходимо хранить статистику активности очень большого количества
страниц (допустим, около 1000, для начала). Данные будут обновляться раз в 10 секунд
и должны храниться для будущего использования при отрисовке графиков. Где всё это чудо
можно хранить? Подозреваю, что SQL не очень подходит, будет слишком большая нагрузка.
    


Ответы

Ответ 1



Для начала небольшой расчет: Снимок статистики каждые 10 секунд - это 6*60*24 = 8640 срезов в сутки. Для 1000 сайтов при объеме сохраняемых данных даже в 100 байт получаем 8640*1000*100/1024/1024 = 824 Мб/сутки или 24 Гб/мес. Для записи размером в килобайт за один раз это будет соответственно четверть терабайта в месяц. Чтобы понять как эти даннные хранить, для начала нужно по такой же схеме рассчитать предполагаемый объем данных, определиться с требуемой глубиной хранения и требованиями по сохранности и доступности данных, предполагаемой интенсивностью запросов, понять насколько быстро допустимо получать отчет (графики). Можно сэкономить на старых данных увеличивая шаг агрегации для них: например, данные старше месяца объединять в получасовые интервалы, а данные старше полугода и вовсе объединять в сутки. Если речь идет о серьезном проекте, посмотрите в сторону специализированных решений для хранения временных рядов (Time Series DBMS) типа InfluxDB или событий типа яндексовского ClickHouse. Они как правило имеют функциональность для построения сложных запросов по временным рядам (сдвиги/наложения/произвольная агрегация по интервалам/дифференцирование/интегрирование и т.п.), настройки политик хранения данных разной глубины по времени, шардирование и реплицирование, кеширование "горячих" данных, но имеют и свои ограничения.

четверг, 13 февраля 2020 г.

Множественный классификатор на несбалансированных данных

#r #статистика #машинное_обучение


Нужно построить множественный классификатор (5 классов) на сильно несбалансированной
выборке.

> table(d$class)
    0   0.3   0.5   0.7     1 
12385   736   733    25  1869 


Если просто запустить RandomForest, то ничего получается.
Значит, надо как-то её балансировать. А вот этого я делать-то и не умею.
Все найденные пакеты по балансировке предполагают лишь бинарную классификацию.
Смотрел пакеты:


unbalanced
ROSE


Читал эту статью.

Думал, может в самом RandomForest есть возможность задать cost или сэмплинг — тоже
не нашлось. Как можно решить эту проблему?
    


Ответы

Ответ 1



В пакете "caret" существуют две функции: upSample() и downSample(), которые решают эту проблему. Балансировать классы необходимо независимо от применяемых методов классификации. Обновление Если отвечать широко,то нужно указать, что балансировка классов один из многих важных этапов, которые нужно выполнить прежде чем начать обучать модель. Просто перечислю: выбор и оценка входных переменных, разделение на тренировочную и тестовую выборку(желательно стратифицированную), балансировка классов(только тренировочного набора), препроцессинг (нормализация,стандартизация и т.л.), перемешивание тренировочного набора и др. От качества проведения этих работ на 80% зависит качество получаемого результата моделирования. Если отвечать так широко потребуется статья хорошего объема. Необходимость балансировки классов подтверждается многочисленными экспериментами (не только моими) с многими моделями. Просто сравните результаты классификации одинаковых наборов с и без балансировки Вы убедитесь в этом сами..

Ответ 2



Вот такая функция решает эту проблему my.strata <- function(v) { tmp <- as.vector(table(v)); num_clases <- length(tmp); min_size <- tmp[order(tmp,decreasing=FALSE)[1]]; rep(min_size,num_clases); } randomForest(.... sampsize=my.strata( ) ... )

среда, 29 января 2020 г.

Как понять нагрузку на сервер?

#linux #сервер #centos #веб_сервер #статистика


может кто-то объяснить как понять вот эти цифры?

то что они показывают нагрузку на 1 минуту, 5 минут и 15 минут - знаю

а что означает например 0.67?

у нас 2 процессора по 12 ядер каждый

до какого значения должно быть максимум нагрузка чтобы чтобы сервер работал нормально?
    


Ответы

Ответ 1



Показатель Load Average показывает, сколько в среднем процессов в системе стояло в очереди на выполнение и выполнялось в каждом из трёх указанных промежутков времени. Здесь «стоит в очереди на выполнение» означает, что процесс не находится в состоянии "sleep" и не ожидает завершения операции ввода-вывода, но и не является выполняющимся в данный квант процеесорного времени. То есть ему не мешает стать выполняющимся ничего, кроме того факта, что процессор в данный момент занят выполнением другого процесса. Например, если на иначе ничем не занятой одноядерной системе запустить три процесса, занимающихся активными вычислениями чего-либо (то есть не задействующих ввод-вывод), то показатель LA будет находиться в районе чуть выше 3.00. Что́ есть «сервер работает нормально» обычно точно не известно, поэтому, как уже отметили в комментарии, надо проводить нагрузочное тестирование. Иногда и при достаточно низких показателях LA, но при сильной нагрузке на диск производительность сервера начинает проваливаться заметно раньше теоретического «LA / кол-во ядер > 1», но я обычно рассматриваю именно это значение (то есть когда LA больше, чем количество ядер/HT-потоков) как предельное, при достижении которого процессор сервера явно нуждается в апгрейде (или ПО — в оптимизации). Или, по-другому выражаясь, неизвестно, будете ли вы отмечать тормоза при LA < 24, но то, что при LA > 24 вы их точно будете отмечать — это к бабке не ходи.

Ответ 2



htop + F2 (Load +) Средние значения нагрузки в Linux — это «средние значения нагрузки системы», показывающие потребность в исполняемых потоках (задачах) в виде усреднённого количества исполняемых и ожидающих потоков. Это мера нагрузки, которая может превышать обрабатываемую системой в данный момент а что означает например 0.67? (нагрузку ,была на 15 мин назад ) Load Average — среднее значение загруженности системы за период времени (в дальнейшем LA). Три значения показывают усреднённую нагрузку за последние 1, 5 и 15 минут. LA является одним из самых спорных показателей. Можно найти множество противоречивых статей, какое значение считать нормальным. Обычно принимается, что значение 0 это простой ядра, а значение 1 это полная нагрузка ядра. Оценить показатель средней нагрузки можно только зная количество ядер в системе. Узнать сколько ядер доступно можно командой: dmidecode -t processor | grep "Core Enabled:" Core Enabled: 6 Core Enabled: 6 Видим, что на данной системе находится 12 физических ядер (6+6). Соответственно, нормальный показатель LA должен быть менее 12. Смотри atop

пятница, 24 января 2020 г.

БД и постройка статистика простого интернет магазина

#sql #база_данных #статистика


Добрый день коллеги! Требуется ваше мнение относительно логики построения статистки
Интернет магазина с использованием диаграммы Google charts. Google Charts была выбрана
за свою простоту и бесплатность. 

Заранее приношу извинения в SQL и бэкэнде не силен. С постройкой логики тоже большого
опыта не имею. 

Что имеем: 


базу данных Mysql;
5 таблиц куда записываются клики (1 – старый клиент, 2 – новый клиент, 3 – товар,
4 – комментарии, 5 – отзывы);


Что необходимо:

Задача №1. построить 5 графиков итоги кликов записанной в каждой таблицы; 

Задача №2. построить на основе значений 5 таблиц - 1 график кликов по всему магазину. 

Видение автора на вопрос: 

Решение задачи №1 – так как диаграмма GC принимает готовые значения полей таблиц,
сначала суммирую значение каждой строки таблицы и записываю их результат в отдельно
созданную таблицу назовем её total-1 – тем самым решаем проблему с выводом диаграмм
5 таблиц. 

Решение задачи №2 – далее суммирую итоги 5 таблиц и записываю во вторую созданную
таблицу total-2 таким образом строиться график по всему магазину.

В результате две новые таблицы. Будет ли это оптимально и правильно построенная схема
сбора данных и вывода их?
    


Ответы

Ответ 1



Не уверен, что понял вопрос правильно, но нужно ли в вашем проекте хранить расчёт построения графика в какой-то таблице? Если такой необходимости нет, то чем же юнион не угодил? SELECT <нужные поля из таблицы раз> FROM <таблица раз> WHERE <условия на таблицу раз> UNION ALL SELECT <нужные поля из таблицы два> FROM <таблица два> WHERE <условия на таблицу два> UNION ALL SELECT ... Ограничение, конечно, в том, что набор полей в подзапросах должен быть одинаковый, но если это планировалось в одной таблице хранить, то он и так одинаковый. Аналогично и для второй задачи. Другое дело, если таблицы огромные и неповоротливые, а доступ к этим данным нужен часто и быстро - тогда да, иногда, но имеет смысл выделить их в отдельную таблицу. Если же данные нужно один раз посчитать и один раз в день, например, обновить график, то почему бы и не просто запрос.

пятница, 27 декабря 2019 г.

Что спрашивают у искусственного интеллекта? [закрыт]

#статистика #искусственный_интеллект


        
             
                
                    
                        
                            Закрыт. Данный вопрос необходимо конкретизировать. Ответы
на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он был сосредоточен только на одной проблеме, отредактировав его.
                        
                        Закрыт 4 месяца назад.
                                                                                
           
                
        
Подскажите, может кто видел такую статистику: какие фразы и слова говорят люди, когда
беседуют с роботом или программой искусственного интеллекта.
Пишу программку, где человеку предстоит пообщаться с роботом, нужно подготовить ответы
на пару тысяч самых популярных фраз. Подскажите, где поискать такую статистику.. Гугл
заводит в тупик.    


Ответы

Ответ 1



Попpобуйте сделать так: заходите в гугл/яндекс, и введите запрос "почему в/как/почему/где/зачем/каким образом/какой". Далее смотриье подсказки - это будут самые популярные вопросы пользователей. Также попробуйте посмотреть здесь, иногда тоже попадается что-то интересное. И ещё: представьте, что у вас появилась машина, которая ответит на все ваши вопросы. Какие бы вы задали, такие и добавьте вашему боту. UPD Загляните сюда. UPD 2 Поговорил с андроид-версией бота в стиле Зелёного Слоника. Ничего не менял.

четверг, 26 декабря 2019 г.

Проверка гипотезы о равновероятности распределения ГПСЧ: смысл эксперементального значения Хи-квадрат

#python_3x #статистика #генерация_случайных_данных #статический_анализ


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

def xi_check(num_array):
    intervals = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    for i in range(len(num_array)):
        intervals[num_array[i]//10] += 1
    xi_2_theor = [0, 3.33, 5.9, 8.34, 11.4, 16.9, 100] # квантили Хи-квадрат
    xi_2_inter = [1, 0.95, 0.75, 0.50, 0.25, 0.05, 0]  # уровень значимости
    xi_2_exp = 0
    for i in range(len(intervals)):
        xi_2_exp = xi_2_exp + ((float(intervals[i]) / float(len(num_array))
        - 0.1) ** 2) / 0.1
    for i in range(6):
        if xi_2_theor[i] <= xi_2_exp <= xi_2_theor[i+1]:
            return f"{xi_2_inter[i]} - {xi_2_inter[i+1]}", xi_2_exp
        else:
            return "Error", xi_2_exp


Если на выходе я получаю эксперементальное значение Хи-квадрат в промежутке между
11.4 и 16.9, то что это означает для меня? Можно ли полагаться на то, что ГПСЧ пораждает
равновероятные значения последовательности?

Иными словами, я не могу понять, как можно трактовать уровень значимости. Как из
него получить вероятность достоверности?
1 - (уровень значимости)?
    


Ответы

Ответ 1



Проверка, которую вы задумали провести, в общем случае называется «проверка выборки на соответствии теоретическому закону распределения». Может выполняться множеством разных методов - Колмогорова-Смирнова, Крамера-фон Мизеса, Джинни ….. и в том числе с помощью использования ХИ-квадрат критерия согласия Пирсона. Суть ее в том, что вы высчитываете некую статистику и сравниваете с тем значением, которое она (статистика) бы имела, если бы ваша выборка соответствовала бы теоретическому закону. В случае использование ХИ-квадрат критерия в качестве такой статистики используется ХИкв.практ= СУММА по количеству квантилей ((Ni-Ei)**2)/Ei) (обратите внимание, это несколько отлично от формулы, которую вы используете в программе). Затем происходит сравнение ХИкв.практ со значением, взятым из таблицыХИкв.крит. при выбранном значении уровня значимости и заданном значением степени свободы. Если полученное значение , меньше значения ХИкв.крит (альфа, df), то считается, что со степенью значимости («уверенности») альфа ваша выборка не отличается от теоретического (в данном случае - равномерного) распределения. Замечание 1. Иметь таблицу распределений сегодня уже не является обязательным – практически все инструменты – от Python до EXCEL – содержат функции, которые эти значения определяют самостоятельно. По той же причине и нет необходимости огород городить с самостоятельным Монте-Карло-моделированием. Замечание 2. Для анализа соответствие именно равномерному закону распределения есть и специальные критерии, например – Шермана, Неймана-Бартона и др. Вот как-то так.

среда, 11 декабря 2019 г.

База данных для статистических данных

#база_данных #nosql #highload #статистика #big_data


Есть набор быстро пополняющихся данных из большого количества источников, которые
тоже пополняются. Структура предельно простая:


id источника
значение
дата/время


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


Какая база данных лучше всего вписывается в эту задачу и почему?
Подойдут ли облачные NOSQL хранилища (Google, Amazon, Azure), или дешевле поднять
свой сервер с БД из ответа №1?

    


Ответы

Ответ 1



ИМХО. NoSQL - не подойдут от слова "вааще". Они заточены по совсем другой, более "вариабельный" тип данных. При вашей простой структуре вам нужна именно реляционная база данных, так как данные из большого количества источников - то что то серверное: MSSQL, MySQL, Oracl - скорее всего любая из них справится.

Ответ 2



Если у вас данных ОЧЕНЬ много (сотни гигабайт-терабайты/день), то посмотрите на Hadoop, там можно хранить много и считать быстро. Если же данных меньше - то стоит использовать PostgreSQL, Oracle, MS SQL. NoSQL - это не о том, он скорее о слабо структурированных данных, так что в вашем случае это просто не нужно.

вторник, 16 июля 2019 г.

Как равномерно раскидать N чисел по K контейнерам?

Что-то не соображу, как оптимально решается такая задача: Есть "случайный" набор N чисел от 0 до M. Распределение примерно экспоненциальное: мелких больше. Их надо раскидать среди K контейнеров так, чтобы минимизировать разброс сумм чисел в контейнерах Думал, надо найти среднее, к которому стремиться; отсортировать набор и брать с краёв. Но не понятно, на чём останавливаться, когда набираю сумму в очередной контейнер. Вот, недобрал до "золотой середины" 5%, это хорошо, или ещё постараться? Явно неоптимально так наугад брать. Upd. наверное, задача не самая простая. Похоже на одномерную «задачу об упаковке» + комбинаторику.


Ответ

Что сразу приходит в голову (но он вроде не такой хороший). Начать распределять с больших чисел и раскидывать в наименьшую ячейку. Более мелкие значения будут обтесывать неравенство. Обновление Не понимаю, зачем жестко брать самое большое + самое маленькое? Сортируем по убыванию, к примеру получили [5 4 3 3 2 2 1 1 1]. И надо разбить на 3 контейнера: 5 = 4 = 3 // взяли 3 самых больших: 5,4,3 5 = 4 = 6 // число 3 5 = 6 = 6 // число 2 7 = 6 = 6 // число 2 7 = 7 = 7 // два числа 1, 1 8 = 7 = 7 // последнее число 1 Данный метод считаю наиболее простым, но, к сожалению, есть случаи, когда разброс будет неидеальным.

пятница, 26 апреля 2019 г.

Java хранение больших статистических данных

Здравствуйте! Необходимо хранить статистику активности очень большого количества страниц (допустим, около 1000, для начала). Данные будут обновляться раз в 10 секунд и должны храниться для будущего использования при отрисовке графиков. Где всё это чудо можно хранить? Подозреваю, что SQL не очень подходит, будет слишком большая нагрузка.


Ответ

Для начала небольшой расчет:
Снимок статистики каждые 10 секунд - это 6*60*24 = 8640 срезов в сутки. Для 1000 сайтов при объеме сохраняемых данных даже в 100 байт получаем 8640*1000*100/1024/1024 = 824 Мб/сутки или 24 Гб/мес. Для записи размером в килобайт за один раз это будет соответственно четверть терабайта в месяц.
Чтобы понять как эти даннные хранить, для начала нужно по такой же схеме рассчитать предполагаемый объем данных, определиться с требуемой глубиной хранения и требованиями по сохранности и доступности данных, предполагаемой интенсивностью запросов, понять насколько быстро допустимо получать отчет (графики).
Можно сэкономить на старых данных увеличивая шаг агрегации для них: например, данные старше месяца объединять в получасовые интервалы, а данные старше полугода и вовсе объединять в сутки.
Если речь идет о серьезном проекте, посмотрите в сторону специализированных решений для хранения временных рядов (Time Series DBMS) типа InfluxDB или событий типа яндексовского ClickHouse. Они как правило имеют функциональность для построения сложных запросов по временным рядам (сдвиги/наложения/произвольная агрегация по интервалам/дифференцирование/интегрирование и т.п.), настройки политик хранения данных разной глубины по времени, шардирование и реплицирование, кеширование "горячих" данных, но имеют и свои ограничения.