Как найти распределение вероятностей для непрерывной количественной переменной в python?
У меня есть список значений непрерывной количественной переменной(от 10 млрд до 80), всего 70 значений. Я хочу получить распределение вероятностей для каждого значения.
P.S Я знаю про distplot у seaborn и параметр density у hist pyplot, но когда я их вызываю для того, чтобы построить график, у меня почему-то по оси y встречаются значения равные 6 или 8, в общем, вероятностью тут и не пахнет.
Ответы (2 шт):
Вас не должно смущать, что плотность вероятности больше единицы.
К этой функции предьявляются два требования:
значение функции неотрицательно,
интеграл от функции по всей оси
xдолжет быть равен 1.
Пример: мы знаем, что некоторая случайная величина равномерно распределена на интервале [-0.1, +0.1]. Внимание, вопрос: чему равна плотность вероятности? Ответ: на интервале [-0.1, +0.1] плотность вероятности равна 5, на остальной части x равна нулю.
Поэтому в вашем случае проинтегрируйте полученную плотность. Готов спорить, что интеграл получится около единицы.
Если я правильно понимаю, что хочет ТС, то это построение графика как на рисунке по 70 данным, которые у него имеются.
Наиболее часто используемый метод процедуры восстановления плотности называется оценкой плотности ядра (Kernel Density Estimation, KDE). Наиболее широко используемым ядром является ядро Гаусса (традиционная колокообразная кривая), но используются и другие ядра.
Библиотека Pandas, дает возможность создавать и накладывать графики плотности с помощью plot.kde (), которая доступна как для объектов Series, так и для DataFrame.
Упомянутая уже displot() из Seaborn одновременно позволяет отобразить гистограмму и KDE для одномерного распределения.
Но обе эти функции в первую очередь предназначена для целей визуализации.
В различных библиотеках доступны множество других, более эффективных реализаций KDE, в том числе в SciPy (scipy.stats.gaussian_kde и scipy.signal.parzen), в Statsmodels (statsmodels.api.nonparametric) - KDEUnivariate() и KDEMultivariate(), в Scikit-learn sklearn.neighbors.KernelDensity().
А про то, что плотность вероятности это не сама вероятность достаточно доходчиво объясняется, например, вот тут: https://medium.com/nuances-of-programming/плотность-вероятности-не-есть-сама-вероятность-98b1fc8e0ac5
Если же у ТС другая задача - например, "натянуть" один из стандартных законов распределения (гауссовый, экспоненциальный, логнормальный, Вейбула, Гамма и пр.) на его данные - то это совсем другая задача и решается другими методами и инструментами. Хотелось бы все-таки от ТС услышать, что ему в действительности нужно.