Is there a built-in or standard library method in Python to calculate the arithmetic mean (one type of average) of a list of numbers?
Henry Ecker♦
34k18 gold badges37 silver badges55 bronze badges
asked Oct 10, 2011 at 17:19
3
I am not aware of anything in the standard library. However, you could use something like:
def mean(numbers):
return float(sum(numbers)) / max(len(numbers), 1)
>>> mean([1,2,3,4])
2.5
>>> mean([])
0.0
In numpy, there’s numpy.mean()
.
compie
10.1k15 gold badges54 silver badges77 bronze badges
answered Oct 10, 2011 at 17:22
NPENPE
483k108 gold badges944 silver badges1009 bronze badges
7
NumPy has a numpy.mean
which is an arithmetic mean. Usage is as simple as this:
>>> import numpy
>>> a = [1, 2, 4]
>>> numpy.mean(a)
2.3333333333333335
answered Dec 13, 2012 at 22:12
BengtBengt
13.9k6 gold badges47 silver badges66 bronze badges
9
Use statistics.mean
:
import statistics
print(statistics.mean([1,2,4])) # 2.3333333333333335
It’s available since Python 3.4. For 3.1-3.3 users, an old version of the module is available on PyPI under the name stats
. Just change statistics
to stats
.
answered Dec 28, 2013 at 22:38
kirbyfan64soskirbyfan64sos
10.3k6 gold badges54 silver badges75 bronze badges
4
You don’t even need numpy or scipy…
>>> a = [1, 2, 3, 4, 5, 6]
>>> print(sum(a) / len(a))
3
Bengt
13.9k6 gold badges47 silver badges66 bronze badges
answered Aug 17, 2013 at 18:29
MumonMumon
6315 silver badges2 bronze badges
6
Use scipy:
import scipy;
a=[1,2,4];
print(scipy.mean(a));
answered Nov 19, 2012 at 19:11
1
Instead of casting to float you can do following
def mean(nums):
return sum(nums, 0.0) / len(nums)
or using lambda
mean = lambda nums: sum(nums, 0.0) / len(nums)
UPDATES: 2019-12-15
Python 3.8 added function fmean to statistics module. Which is faster and always returns float.
Convert data to floats and compute the arithmetic mean.
This runs faster than the mean() function and it always returns a
float. The data may be a sequence or iterable. If the input dataset is
empty, raises a StatisticsError.fmean([3.5, 4.0, 5.25])
4.25
New in version 3.8.
answered Apr 28, 2017 at 10:56
Vlad BezdenVlad Bezden
82.2k24 gold badges246 silver badges179 bronze badges
from statistics import mean
avarage=mean(your_list)
for example
from statistics import mean
my_list=[5,2,3,2]
avarage=mean(my_list)
print(avarage)
and result is
3.0
answered Oct 2, 2018 at 16:56
If you’re using python >= 3.8, you can use the fmean
function introduced in the statistics
module which is part of the standard library:
>>> from statistics import fmean
>>> fmean([0, 1, 2, 3])
1.5
It’s faster than the statistics.mean
function, but it converts its data points to float
beforehand, so it can be less accurate in some specific cases.
You can see its implementation here
answered Dec 30, 2020 at 22:20
Mathieu RolletMathieu Rollet
1,9272 gold badges17 silver badges27 bronze badges
def avg(l):
"""uses floating-point division."""
return sum(l) / float(len(l))
Examples:
l1 = [3,5,14,2,5,36,4,3]
l2 = [0,0,0]
print(avg(l1)) # 9.0
print(avg(l2)) # 0.0
answered Sep 10, 2017 at 20:29
def list_mean(nums):
sumof = 0
num_of = len(nums)
mean = 0
for i in nums:
sumof += i
mean = sumof / num_of
return float(mean)
answered Aug 18, 2016 at 15:09
0
The proper answer to your question is to use statistics.mean
. But for fun, here is a version of mean that does not use the len()
function, so it (like statistics.mean
) can be used on generators, which do not support len()
:
from functools import reduce
from operator import truediv
def ave(seq):
return truediv(*reduce(lambda a, b: (a[0] + b[1], b[0]),
enumerate(seq, start=1),
(0, 0)))
answered Aug 28, 2018 at 1:30
PaulMcGPaulMcG
62k16 gold badges93 silver badges130 bronze badges
I always supposed avg
is omitted from the builtins/stdlib because it is as simple as
sum(L)/len(L) # L is some list
and any caveats would be addressed in caller code for local usage already.
Notable caveats:
-
non-float result: in python2, 9/4 is 2. to resolve, use
float(sum(L))/len(L)
orfrom __future__ import division
-
division by zero: the list may be empty. to resolve:
if not L: raise WhateverYouWantError("foo") avg = float(sum(L))/len(L)
answered Nov 2, 2015 at 11:03
n611x007n611x007
8,9307 gold badges59 silver badges101 bronze badges
Others already posted very good answers, but some people might still be looking for a classic way to find Mean(avg), so here I post this (code tested in Python 3.6):
def meanmanual(listt):
mean = 0
lsum = 0
lenoflist = len(listt)
for i in listt:
lsum += i
mean = lsum / lenoflist
return float(mean)
a = [1, 2, 3, 4, 5, 6]
meanmanual(a)
Answer: 3.5
answered Sep 11, 2017 at 1:53
- Используйте математическую формулу для вычисления среднего арифметического в Python
- Используйте функцию
numpy.mean()
для вычисления среднего арифметического в Python - Используйте функцию
statistics.mean()
для вычисления среднего арифметического в Python - Используйте функцию
scipy.mean()
для вычисления среднего арифметического в Python
Термин среднее арифметическое — это среднее арифметическое чисел. Математическая формула для определения среднего арифметического заключается в делении суммы чисел на количество. В Python это определяется следующими способами.
- Используйте математическую формулу.
- Используйте функцию mean () из стандартных библиотек Python, таких как
NumPy
,statistics
,scipy
.
Используйте математическую формулу для вычисления среднего арифметического в Python
Следуйте этой программе, чтобы использовать математическую формулу.
listnumbers=[1,2,4];
print("The mean is =",sum(listnumbers) / len(listnumbers));
Выход:
The mean is = 2.3333333333333335
Используйте функцию numpy.mean()
для вычисления среднего арифметического в Python
Стандартная библиотека NumPy
содержит функцию mean()
, используемую для определения среднего арифметического в Python. Для этого сначала импортируйте библиотеку NumPy
. См. Пример ниже.
import numpy
listnumbers = [1, 2, 4]
print ("The mean is =",numpy.mean(listnumbers))
Выход:
The mean is = 2.3333333333333335
Используйте функцию statistics.mean()
для вычисления среднего арифметического в Python
Библиотека statistics
содержит функцию mean()
, используемую для определения среднего арифметического. Для этого сначала импортируйте библиотеку statistics
. Следуйте приведенному ниже примеру.
import statistics
listnumbers = [1, 2, 4]
print("The mean is =",statistics.mean(listnumbers))
Выход:
The mean is = 2.3333333333333335
Используйте функцию scipy.mean()
для вычисления среднего арифметического в Python
Библиотека scipy
содержит функцию mean()
, используемую для определения среднего значения. Для этого сначала импортируйте scipy
библиотеку. Вот пример.
import scipy;
listnumbers=[1,2,4];
print("The mean is =",scipy.mean(listnumbers));
Выход:
The mean is = 2.3333333333333335
Для обработки любых данных в Python приходится выполнять множество математических вычислений. В этой статье рассмотрим различные способы вычисления среднего значения заданных чисел.
Как рассчитать среднее значение заданных чисел
Среднее значение заданных чисел – это сумма всех чисел, делёная на общее количество чисел.
Например, если нам даны числа 1, 2, 4, 5, 6, 7, 8, 10, и 12, то сумма всех заданных чисел равна 55, а их общее количество равно 9. Таким образом, среднее значение всех чисел будет равно 55/9, т.е. 6,111 .
Вычисляем среднее значение, используя цикл for
Если нам дан список чисел, мы можем вычислить среднее значение с помощью цикла for. Сначала объявим переменную sumofNums и переменную count и дадим им значение 0. Затем пройдемся по каждому элементу списка. Будем добавлять каждый элемент в переменную sumofNums. В это время будем увеличивать переменную count на 1. После обхода всего списка у нас будет сумма всех элементов списка в переменной sumofNums и общее количество элементов в переменной count. Теперь можно разделить сумму чисел на количество, чтобы получить среднее значение элементов списка:
numbers = [1, 2, 34, 56, 7, 23, 23, 12, 1, 2, 3, 34, 56]
sumOfNums = 0
count = 0
for number in numbers:
sumOfNums += number
count += 1
average = sumOfNums / count
print("The list of numbers is:", numbers)
print("The average of all the numbers is:", average)
Вывод:
The list of numbers is: [1, 2, 34, 56, 7, 23, 23, 12, 1, 2, 3, 34, 56]
The average of all the numbers is: 19.53846153846154
Рассчитываем среднее значение с помощью встроенных функций
Вместо цикла for можно использовать встроенные функции.
Можно вычислить сумму всех элементов списка с помощью метода sum(), а затем мы можем вычислить общее количество элементов в списке с помощью метода len(). Таким образом, у нас будет сумма чисел и общее количество чисел, с помощью которых мы сможем рассчитать среднее значение:
numbers = [1, 2, 34, 56, 7, 23, 23, 12, 1, 2, 3, 34, 56]
sumOfNums = sum(numbers)
count = len(numbers)
average = sumOfNums / count
print("The list of numbers is:", numbers)
print("The average of all the numbers is:", average)
Вывод:
The list of numbers is: [1, 2, 34, 56, 7, 23, 23, 12, 1, 2, 3, 34, 56]
The average of all the numbers is: 19.53846153846154
Также можно использовать метод mean() модуля статистики для прямого вычисления среднего значения элементов списка. Мы передадим данный список чисел в качестве входных данных методу mean(), и он вернёт среднее значение чисел:
import statistics
numbers = [1, 2, 34, 56, 7, 23, 23, 12, 1, 2, 3, 34, 56]
average = statistics.mean(numbers)
print("The list of numbers is:", numbers)
print("The average of all the numbers is:", average)
Вывод:
The list of numbers is: [1, 2, 34, 56, 7, 23, 23, 12, 1, 2, 3, 34, 56]
The average of all the numbers is: 19.53846153846154
Заключение
В этой статье мы обсудили различные способы вычисления среднего значения заданных чисел в Python.
Просмотры: 6 436
На чтение 3 мин Просмотров 2.3к. Опубликовано
Python предоставляет удобные средства для работы со списками, включая вычисление среднего арифметического элементов списка. Среднее арифметическое — это сумма элементов списка, разделенная на количество элементов в списке. В этой статье мы рассмотрим различные способы нахождения среднего арифметического элементов списка в Python.
Содержание
- Использование цикла for для вычисления среднего арифметического
- Использование функции sum() и len() для вычисления среднего арифметического
- Использование функции mean() из библиотеки statistics для вычисления среднего арифметического
Использование цикла for для вычисления среднего арифметического
Для вычисления среднего арифметического элементов списка в Python можно использовать цикл for. Сначала необходимо создать список, который будет содержать элементы, среднее арифметическое которых нужно вычислить. Далее можно использовать цикл for для итерации по элементам списка и вычисления их суммы. Затем необходимо разделить полученную сумму на количество элементов списка, чтобы получить среднее арифметическое.
Пример кода:
numbers = [1, 2, 3, 4, 5]
sum = 0
for num in numbers:
sum += num
avg = sum / len(numbers)
print("Среднее арифметическое:", avg)
В этом примере мы создали список numbers
, содержащий числа от 1 до 5, затем использовали цикл for для вычисления их суммы и разделили ее на количество элементов списка, чтобы получить среднее арифметическое. Результат выполнения программы будет следующим:
Среднее арифметическое: 3.0
Использование функции sum() и len() для вычисления среднего арифметического
Еще одним простым способом вычисления среднего арифметического элементов списка в Python является использование функций sum()
и len()
. Функция sum()
возвращает сумму всех элементов списка, а функция len()
возвращает количество элементов в списке. Делением суммы на количество элементов можно получить среднее арифметическое.
Вот как это можно реализовать в коде:
my_list = [1, 2, 3, 4, 5]
average = sum(my_list) / len(my_list)
print("Среднее арифметическое списка:", average)
В этом примере мы сначала создаем список my_list
с пятью элементами. Затем мы вычисляем среднее арифметическое элементов списка с помощью функций sum()
и len()
и сохраняем результат в переменной average
. Наконец, мы выводим среднее арифметическое на экран с помощью функции print()
. Этот способ вычисления среднего арифметического является очень простым и эффективным.
Использование функции mean() из библиотеки statistics для вычисления среднего арифметического
Для вычисления среднего арифметического элементов списка можно использовать функцию mean()
из стандартной библиотеки statistics
. Эта функция возвращает среднее арифметическое переданного ей списка чисел.
Пример использования функции mean()
:
import statistics
my_list = [1, 2, 3, 4, 5]
average = statistics.mean(my_list)
print("Среднее арифметическое:", average)
В данном примере мы создаем список my_list
и передаем его функции mean()
. Функция вычисляет среднее арифметическое элементов списка и сохраняет результат в переменной average
. Затем мы выводим полученное значение на экран.
Функция mean()
также поддерживает списки, содержащие элементы разных типов, например, целые числа и числа с плавающей запятой. Если список пуст, то функция вызовет исключение StatisticsError
. Если список содержит элементы, которые не являются числами, то будет вызвано исключение TypeError
.
Python
Импорт библиотек
import pandas as pd
импортирует библиотеку для работы с таблицами и данными в виде датафреймов
import numpy as np
импортирует библиотеку для работы с числами
import seaborn as sns
импортирует библиотеку для создания графиков и визуализации данных
import matplotlib.pyplot as plt
импортирует библиотеку для создания графиков и визуализации данных
import plotly.express as px
импортирует библиотеку для создания интерактивных графиков
import datetime
импортирует модуль для работы с датами и временем
import matplotlib.dates as mdates
импортирует модуль для работы с датами и временем в библиотеке matplotlib
import random
импортирует модуль для генерации случайных чисел
import re
импортирует модуль для работы с регулярными выражениями
import vk_ip
импортирует модуль для работы с IP-адресами ВКонтакте
import os
импортирует модуль для работы с операционной системой
import json as json
импортирует модуль для работы с JSON-данными
import requests
импортирует модуль для работы с HTTP-запросами
import gspread
импортирует библиотеку для работы с Google Sheets
import zipfile
импортирует модуль, который предоставляет функции для работы с архивами ZIP в Python
from io import BytesIO
импортирует модуль для работы с бинарными данными в памяти
import pandahouse as ph
импортирует библиотеку для работы с ClickHouse
from scipy import stats
импортирует модуль для статистических вычислений
from scipy.stats import zscore
импортирует функцию для вычисления z-оценки
import pingouin as pg
предоставляет различные функции для статистического анализа данных, включая ANOVA, корреляцию, регрессию и др.
from scipy.special import comb
функция comb из библиотеки scipy.special, которая используется для вычисления комбинаторных коэффициентов
import statistics
библиотека, которая содержит набор функций для выполнения статистических расчетов
from statsmodels.formula.api import ols
интерфейс для моделирования линейной регрессии с помощью формул
from statsmodels.stats.anova import anova_lm
используется для проведения анализа дисперсии (ANOVA) в статистическом анализе данных
import statsmodels.formula.api as smf
работа с формулами и моделями
import statsmodels.api as sm
предоставляет классы и функции для моделирования и статистического анализа данных
from sklearn.cluster import AgglomerativeClustering
используется для кластеризации данных с помощью иерархической кластеризации
import bootstrapped.bootstrap as bs
import bootstrapped.stats_functions as bs_stats
позволяют оценить распределение статистических показателей, таких как среднее значение, медиана, стандартное отклонение и т.д.
from statsmodels.stats.contingency_tables import StratifiedTable
используется для анализа таблиц сопряженности
from scipy.stats import chi2_contingency
используется для расчета критерия хи-квадрат для таблиц сопряженности
from df2gspread import df2gspread as d2g
функция используется для экспорта данных из pandas DataFrame в Google Sheets
from oauth2client.service_account import ServiceAccountCredentials
используется для аутентификации в Google API с помощью учетных данных службы
from my_module import my_function
содержит функцию или библиотеку функций, специфичных для проекта, над которым работает конкретный автор
Файловая система, импорт/экспорт данных
Файловая система
[x[0] for x in os.walk('my_directory')]
выводит список всех папок внутри папки ‘my_directory’ (включая подпапки)
Импорт данных
df = pd.read_csv('C:\temp\example.csv')
df2 = pd.read_csv('C:\temp\example2.csv', parse_dates=['date'], sep=';', dayfirst=True)
импорт с локального диска и сохранение файла в датафрейм, во втором примере указан парсинг дат, указан разделитель и формат времени dd/mm/yyyy
connection_default = {'host': 'link',
'database':'default',
'user':'******',
'password':'******'
}
q =
'''
SELECT *
FROM
{db}.table
WHERE
id != 'none'
'''
df = ph.read_clickhouse(query=q, connection=connection_default)
SQL запрос в Python через CLICKHOUSE в пандас (нужно подставить link, заменить звездочки учетными данными, верно указать базу данных и написать корректный запрос)
df = pd.read_csv('C:\temp\data.csv.zip', compression='zip')
with zipfile.ZipFile('C:\temp\data2.csv.zip') as myzip:
with myzip.open('data2.csv') as myfile:
df2 = pd.read_csv(myfile, encoding='ISO-8859-1')
импорт в датасет csv файла, а во втором случае импорт конкретного csv файла в архиве
df = np.genfromtxt('C:\temp\data.txt', dtype=None)
pd.DataFrame(df)
загружает данные из txt файла в виде массива numpy и создает датасет с этими данными
df = pd.read_excel('C:\temp\data.xls')
загружает данные из excel файла и создает датасет с этими данными (загружается первый лист по умолчанию)
df = pd.read_excel('C:\temp\data.xls', sheet_name = 'Лист3')
загружает данные из excel файла c указанного листа
df = pd.read_csv('link', sep=";")
загружает файл csv по ссылке
def download(link, df):
base_url = 'link'
final_url = base_url + urlencode(dict(public_key=link))
response = requests.get(final_url)
download_url_file = response.json()['href']
file_df = pd.read_csv(download_url_file)
pattern = r'[;,|t]'
pattern_test = re.search(pattern, file_df.columns[0])
if pattern_test is not None:
sep = pattern_test[0]
file_df = pd.read_csv(download_url_file, delimiter=None, sep=sep, parse_dates=True)
globals()[df] = file_df
функция для загрузки файлов с ЯндексДиска (заполнить link)
Экспорт данных
filename = 'C:\temp\data.csv'<br>
df.to_csv(filename)`
сохраняет датасет в csv файл
Работа со строками
S1 + S2
сложение строк
S * 3
повторение строки три раза
S[i]
обращение по индексу символа в строке
S[i:j:step]
позволяет выбрать срез последовательности элементов начиная с индекса i и заканчивая индексом j-1 с заданным шагом step
len(S)
выводит длину строки
S.find(str, [start],[end])
возвращает индекс первого символа первого вхождения str в S или -1, если подстрока не найдена.
start является необязательным и указывает индекс, с которого нужно начать поиск подстроки. Если start не указан, поиск начинается с начала строки
end также является необязательным и указывает индекс, до которого нужно искать подстроку. Если end не указан, поиск производится до конца строки
S.rfind(str, [start],[end])
то же что и предыдущее, но возвращает номер последнего вхождения или -1
S.index(str, [start],[end])
аналогично S.find, отличие в том, что если подстрока не найдена, S.index() генерирует исключение ValueError
S.rindex(str, [start],[end])
то же что и предыдущее, но возвращает номер последнего вхождения или ValueError
S.replace(шаблон, замена)
замена символов в строке по шаблону
S.split(символ)
разбиение строки по разделителю, указанному в скобках
S.isdigit()
cостоит ли строка из цифр — возвращает true или false
S.isalpha()
cостоит ли строка из букв — возвращает true или false
S.isalnum()
cостоит ли строка из цифр или букв — возвращает true или false
S.islower()
cостоит ли строка из символов в нижнем регистре — возвращает true или false
S.isupper()
cостоит ли строка из символов в верхнем регистре — возвращает true или false
S.isspace()
cостоит ли строка из неотображаемых символов: пробел, перевод страницы новая строка и т.д. — возвращает true или false
S.istitle()
начинаются ли слова в строке с заглавной буквы — возвращает true или false
S.upper()
преобразовывает строку к верхнему регистру
S.lower()
преобразовывает строку к нижнему регистру
S.startswith(шаблон)
начинается ли строка с шаблона — возвращает true или false
S.endswith(шаблон)
заканчивается ли строка шаблоном — возвращает true или false
S.join(список)
объединяет элементы списка в одну строку S, используя строку S в качестве разделителя между элементами списка
ord(символ)
возвращает код символа в таблице символов ASCII
chr(число)
возвращает символ, соответствующий переданному числу в кодировке Unicode
S.capitalize()
переводит первый символ строки в верхний регистр, а все остальные в нижний
S.center(width, [fill])
выравнивает строку S по центру, путем добавления символов fill (если указано) слева и справа от строки до достижения заданной ширины (width)
S.count(str, [start],[end])
возвращает количество непересекающихся вхождений подстроки в диапазоне [start, end]
S.expandtabs([tabsize])
возвращает копию строки, в которой все символы табуляции заменяются одним или несколькими пробелами. Если TabSize не указан, табуляция полагается равным 8 пробелам
S.lstrip([chars])
удаление пробельных символов в начале строки
S.rstrip([chars])
удаление пробельных символов в конце строки
S.strip([chars])
удаление пробельных символов в начале и в конце строки
S.partition(шаблон)
возвращает кортеж из трех элементов: 1й будет содержать часть строки S, которая находится перед первым вхождением шаблона; 2й элемент будет содержать сам шаблон; 3й элемент будет содержать часть строки S, которая находится после первого вхождения шаблона
S.rpartition(sep)
то же самое, что и предыдущая команда, но выполняется в обратном направлении
S.swapcase()
переводит символы нижнего регистра в верхний, а верхнего – в нижний
S.title()
первую букву каждого слова переводит в верхний регистр, а все остальные в нижний
S.zfill(width)
используется для добавления ведущих нулей в строку S до заданной ширины width
S.ljust(width, fillchar=" ")
то же самое, что и предыдущая команда, но заполняет символом fillchar
S.rjust(width, fillchar=" ")
то же самое, что и предыдущая команда, но заполняет символом fillchar и выполняется в обратном направлении
Работа со списками
append()
добавляет в конец списка один новый элемент
extend()
расширяет список другим списком
insert(index, value)
позволяет вставлять значение в список в заданной позиции
index()
возвращает индекс первого элемента, значение которого равняется переданному в метод значению
remove()
удаляет первый элемент, значение которого равняется переданному в метод значению
pop(index)
удаляет элемент по указанному индексу и возвращает его
reverse()
меняет на противоположный порядок следования значений в списке
len(list)
выводит количество элементов списка
sum(list)
выводит сумму элементов в списке
count()
возвращает количество элементов в списке, значения которых равны переданному в метод значению
clear()
удаляет все элементы из списка
copy()
создает поверхностную копию списка
sort()
сортирует список, для обратного порядка указать reverse
Списочные выражения
Дано:
word = 'test'
numbers = [1, 5, 10, 25, 50]
words = ['house', 'worm', 'sex']
str_numbers
= ‘12345’<br>
mix = [1, ‘house’, 3.45]`
тогда:
Выражение | Суть | Результат |
---|---|---|
[0 for i in range(10)] | создает список, содержащий определенное количество заданных элементов | [0, 0, 0, 0, 0] |
[int(i) for i in str_numbers] | преобразует список строк из чисел в список целых чисел | [1, 2, 3, 4, 5] |
[i ** 3 for i in range(1, 5)] | list comprehension, которое в данном случае генерит список кубов чисел in range | [1, 8, 27, 64] |
[i for i in numbers if i != 10] | удаляет элементы из списка по условию | [1, 5, 25, 50] |
[i * 2 for i in numbers] | создаст список, в котором каждый элемент «numbers» будет умножен на 2 | [2, 10, 20, 50, 100] |
len([item for item in numbers if item > 5]) | вычисляет количество элементов списка numbers, которые больше 5 | 3 |
[w * 2 for w in word] | создаст список с удвоенными значениями элементов word | [‘tt’, ‘ee’, ‘ss’, ‘tt’] |
[l[0] for l in words] | создаст список, содержащий первый элемент от каждого элемента списка words | [‘h’, ‘w’, ‘s’] |
all(numbers[i] <= numbers[i+1] for i in range(len(numbers)-1)) | проверяет условие, что каждый последующий элемент списка «numbers» не меньше предыдущего элемента | True |
[i for i in numbers if i < 15] | вернет список с элементами списка «numbers», которые меньше 15 | [1, 5, 10] |
[l[0] for l in words if len(l) == 3] | вернет список из первых элементов каждого элемента списка words, длина которого равна 3 | [‘s’] |
Прочие методы
Дано:
word = 'test'
numbers = [1, 5, 10, 25, 50]
words = ['house', 'worm', 'sex']
str_numbers
= ‘12345’<br>
mix = [1, ‘house’, 3.45]`
for num, word in zip(numbers, words):
print(f"{num} {word}")
1 house
5 worm
10 sex
использована функция zip() для создания итератора, который позволяет проходить по двум спискам одновременно
result = 1
for i in range(0,len(numbers)):
result = result * numbers[i]
print(result)
62500
перемножает все числа в списке «numbers» по очереди и сохраняет результат в переменной «result»
print(list(map(type, mix)))
[<class 'int'>, <class 'str'>, <class 'float'>]
выведет список, содержащий тип каждого элемента списка
if len(set(numbers)) == 1:
print('YES')
else:
print('NO')
NO
код проверяет, все ли элементы списка numbers равны между собой
n = int(input())
counter = []
while n != 0:
last_digit = n % 10
n = n // 10
counter.append(last_digit)
counter.reverse()
print(counter)
выводит список цифр введенного пользователем числа в порядке от первой цифры до последней, и для числа 456 результатом будет [4, 5, 6]
Работа с датафреймами (Pandas / NumPy)
df = pd.DataFrame()
cоздает пустой датафрейм
df = df.reset_index()
возвращает датафрейм с новым индексом, начинающимся с 0, и старым индексом, сохраненным в виде нового столбца
df.isna().sum()
возвращает количество пропущенных значений в каждом столбце
df.columns = [x.lower() for x in df.columns]
приводит все названия столбцов к нижнему регистру
df = df.rename(columns={'x': 'name', 'y': 'new_name'})
переименовывает столбец в датасете
df = df.rename(columns={df.columns[0]:"new_column_name"})
переименовывает столбец в датасете по индексу
df.columns = df.columns.str.replace('[.]', '_').str.replace('[ ]', '').lower()
переименовывает столбец в датасете, удаляя «лишние» символы и переводит к нижнему регистру
df = df.drop(['column_1','column_2'], axis=1)
df = df.loc[:,('column_1', 'column_4', 'column_7')]
df = df.drop(columns=df.columns[0])
удаление столбцов в датасете:
первый — удаляет указанные столбцы;
второй — удаляет все столбцы, кроме указанных;
третий — удаляет столбцы по индексу
df['numbers'] = df['numbers'].astype(int)
df = df.apply(lambda x: pd.to_numeric(x, errors='coerce')).dropna()
первый код переводит текстовые значения в целые числа,
второй код позволяет также удалить все строки с некорректными или отсутствующими значениями — оставить только строки с числовыми значениями
len(df.loc[df.assign_type != df.reserved_type])
позволяет вывести количество строк не соответствующих строкам другого столбца
df.groupby('year').month.agg(pd.Series.mode)
группирует строки по году и для каждой группы найдет моду (самое часто встречающееся значение), в данном случае, месяца
df = df.astype({"a": int, "b": complex})
меняет типы данных в столбцах
df['column'].tolist()
переводит cтолбец колонки в список
df = df['column'] + '\' + df['column_2']
делает из содержимого двух колонок третью
df = df.assign(new_column = df.column_1 * df.column_2)
cоздает столбец на основании математической операции между двумя столбцами
orders.isna().sum()
выводит информацию по пропущенным значениям в датасете
df.groupby('column_1').agg({'success': 'sum'})
группирует датафрейм по количество успешных операций для столбца column_1
df = df.unstack('column_1')
преобразует иерархически индексированный датасет, добавляя колонки из уровня, соответствующего указанной колонке, на новый уровень колонок
df2 = pd.wide_to_long(df, ['column_1', 'column_2'], i=['type', 'name'], j='year', sep='_')
создает новый датасет, в котором идентификаторы (в данном случае, type, name) хранятся в отдельных столбцах, а значения из исходных столбцов с годами (year) и значениями (column_1, column_2) хранятся в отдельных строках
df2 = df.explode('Column_1')
создает новый датасет, в котором каждый элемент списка в столбце ‘Column_1’ разбивается на отдельную строку, а значения в остальных столбцах дублируются соответственно
df.groupby('column_1').agg({'column_2': 'sum'})
группирует строки в датасете df по уникальным значениям в столбце «column_1» и для каждой группы вычисляет сумму значений в столбце «column_2». Результатом будет новый датасет с одним индексом «column_1» и одним столбцом «column_2», содержащим сумму значений «column_2» для каждого уникального значения «column_1»
df.sort_values('column_2', ascending=False)
сортирует датасет df по столбцу column_2 в порядке убывания (от наибольшего значения к наименьшему)
df['name'].value_counts()
используется для подсчета количества уникальных значений в столбце «name» датасета df и создания объекта типа Series с количеством вхождений каждого уникального значения
df.query("name == 'John' and surname == 'Doe'")
выбирает в датасете df все строки, где значение столбца «name» равно «John» и значение столбца «surname» равно «Doe»
Описательная статистика датасетов
df.info()
позволяет получить общую информацию о датасете, такую как количество строк, количество столбцов, их имена и типы данных, количество ненулевых значений в каждом столбце и использованную память
df.dtypes
позволяет получить информацию о типах данных столбцов
df.groupby(['name', 'age']).agg({'income': 'describe'})
вычисляет основные статистические показатели для каждой группы значений столбца income, включая количество наблюдений (count), среднее значение (mean), стандартное отклонение (std), минимальное и максимальное значения (min и max) и квартили (25%, 50%, 75%)
df.describe(include='object')
df.describe(include='datetime')
первый используется для получения статистической информации о колонках в объекте Pandas DataFrame, содержащих данные типа «object», второй для для колонок даты и времени
Математические методы в Python
Для исполнения кодов раздела необходимо импортировать библиотеки/модули:
math;
Логарифмы
Натуральный логарифм
ln_x = math.log(x)
Десятичный логарифм
ln_10_x = math.log10(x)
Экспонента
exp_x = math.exp(x)
Логарифмирование значений столбца датасета:
df = np.log(df.view)
Среднее
df_mean = df.mean()
Скользящее среднее
df_rolling_mean = df.rolling(window=2).mean()
Экспоненциальное скользящее среднее:
df_ewm_rolling_mean = df.ewm(span=2).mean()
Исчисление процентов
Процентное отношение значений ячеек столбца к общему значению
df["percent"] = (df["users"] / df["users"].sum()) * 100
Статистические методы в Python
Содержание:
- Меры центральной тенденции
- Меры изменчивости
- Меры статистической связи между переменными
- Z-преобразование
- Проверка распределения на нормальность
- Проверка гомогенности дисперсий
- Определение доверительных интервалов
- Статистические тесты (критерии)
Для исполнения кодов раздела необходимо импортировать библиотеки/модули:
statistics, numpy;
stats from scipy;
normaltest, shapiro, normaltest, levene, bartlett, norm, ttest_ind, chi2, chi2_contingency from scipy.stats;
math;
pingouin;
Меры центральной тенденции
Мода
data = [1, 2, 2, 3, 4, 4, 4]
print("Мода: ", statistics.mode(data))
Мода: 4
Мода — это значение в наборе данных, которое встречается наиболее часто
Среднее
data = [1, 2, 2, 3, 4, 4, 4]
print("Среднее: ", statistics.mean(data))
Среднее: 2.857142857142857
Среднее значение, также известное как среднее арифметическое, вычисляется путем сложения всех значений в наборе данных и деления полученной суммы на количество значений в наборе
$$bar{x} = frac{1}{n}sum_{i=1}^{n} x_i$$
где $bar{x}$ обозначает среднее значение, $n$ — количество элементов в выборке, а $x_1, x_2, …, x_n$ — значения элементов выборки. Формула использует знак суммы $sum$, который означает суммирование всех значений $x$ в выборке.
Медиана
data = [1, 2, 2, 3, 4, 4, 4]
print("Медиана: ", statistics.median(data))
Медиана: 3
Значение, которое разделяет упорядоченный набор данных на две равные половины
Формула для расчета с четным числом элементов выборки:
$$median=frac{x_{frac{n}{2}} + x_{frac{n}{2}+1}}{2}$$
где где $n$ — количество элементов в выборке, $x_{frac{n}{2}}$ — значение элемента с индексом $frac{n}{2}$ и $x_{frac{n}{2}+1}$ — значение элемента с индексом $frac{n}{2}+1$
Формула для расчета с нечетным числом элементов выборки:
$$median = x_{frac{n+1}{2}}$$
где $x$ — массив элементов, а $n$ — число элементов в массиве
Межквартильный размах
data = np.array([12, 15, 16, 18, 19, 20, 22, 25, 28, 31, 35])
Q1 = np.percentile(data, 25, interpolation='midpoint')
Q3 = np.percentile(data, 75, interpolation='midpoint')
IQR = Q3 - Q1
print("Межквартильный размах:", IQR)
Межквартильный размах: 9.5
Межквартильный размах — определяется как разница между верхним и нижним квартилями в наборе данных.
Квартили — это значения, которые разделяют упорядоченный набор данных на четыре равные части. Верхний квартиль (Q3) — это значение, которое делит верхние 25% данных от нижних 75%, а нижний квартиль (Q1) — это значение, которое делит нижние 25% данных от верхних 75%.
Таким образом, межквартильный размах (IQR) — это разница между Q3 и Q1. Он представляет собой интерквартильный диапазон, который содержит 50% данных и позволяет оценить разброс значений в наборе данных, игнорируя выбросы
Меры изменчивости
Дисперсия
data = [1, 5, 2, 7, 1, 9, 3, 8, 5, 9]
print("Дисперсия: ", statistics.variance(data))
Дисперсия: 10
Дисперсия — это среднее арифметическое квадратов отклонений каждого элемента выборки от ее среднего значения. Она измеряет, насколько значения в выборке отклоняются от ее среднего значения и показывает, как распределены значения вокруг среднего значения. Дисперсия выражается в квадратных единицах измерения выборки
$$s^2 = frac{1}{n-1}sum_{i=1}^{n}(x_i — bar{x})^2$$
где $s^2$ — выборочная дисперсия, $n$ — размер выборки, $x_i$ — i-й элемент выборки, $bar{x}$ — выборочное среднее.
Стандартное отклонение
data = [1, 5, 2, 7, 1, 9, 3, 8, 5, 9]
print("Стандартное отклонение: ", statistics.stdev(data))
Стандартное отклонение: 3.1622776601683795
Стандартное отклонение — это квадратный корень из дисперсии выборки. Оно измеряет степень разброса данных относительно их среднего значения и представляет собой стандартную меру распределения выборки. Стандартное отклонение может быть выражено в тех же единицах измерения, что и сама выборка.
Таким образом, стандартное отклонение и дисперсия оба показывают, насколько значения в выборке отклоняются от ее среднего значения, но стандартное отклонение также показывает, как распределены значения вокруг среднего значения.
$$sigma = sqrt{frac{1}{N} sum_{i=1}^{N} (x_i — bar{x})^2}$$
где $N$ — количество значений, $x_i$ — i-е значение, а $bar{x}$ — среднее значение
Среднеквадратическое отклонение
data = [1, 5, 2, 7, 1, 9, 3, 8, 5, 9]
mean_value = statistics.mean(data)
print("Среднеквадратическое отклонение: ", statistics.stdev(data, xbar=mean_value))
Среднеквадратическое отклонение: 3.1622776601683795
Среднеквадратическое отклонение — это корень из среднего арифметического квадратов отклонений каждого элемента выборки от ее среднего значения. Оно также измеряет степень разброса данных относительно их среднего значения и представляет собой стандартную меру распределения выборки. Среднеквадратическое отклонение может быть выражено в тех же единицах измерения, что и сама выборка.
$$sigma = sqrt{frac{1}{N}sum_{i=1}^{N}(x_i — mu)^2}$$
где $N$ — количество элементов в выборке, $x_i$ — i-й элемент выборки, а $mu$ — среднее значение выборки
Стандартная ошибка среднего
variance = 4
n = 100
SEM = math.sqrt(variance/n)
print("SEM:", SEM)
SEM: 0.2
Стандартная ошибка среднего — мера разброса среднего значения в выборке относительно среднего значения в генеральной совокупности, это среднеквадратическое отклонение распределения выборочных средних
$$SE = frac{s}{sqrt{n}}$$
где $s$ — стандартное отклонение выборки, $n$ — размер выборки
Меры статистической связи между переменными
Коэффициент корреляции
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 7, 9, 11, 13])
corr_coef = np.corrcoef(x, y)[0, 1]
print("Коэффициент корреляции между x и y:", corr_coef)
Коэффициент корреляции между x и y: 0.9999999999999999
Это мера статистической связи между двумя переменными, которая показывает, насколько сильно связаны эти переменные между собой. Положительный коэффициент корреляции указывает на прямую связь между переменными. Отрицательный коэффициент корреляции указывает на обратную связь между переменными. Коэффициент корреляции, равный (или близкий) нулю, означает отсутствие связи между переменными
$$r = frac{nsum_{i=1}^{n}x_iy_i — sum_{i=1}^{n}x_isum_{i=1}^{n}y_i}{sqrt{left[nsum_{i=1}^{n}x_i^2 — left(sum_{i=1}^{n}x_iright)^2right]left[nsum_{i=1}^{n}y_i^2 — left(sum_{i=1}^{n}y_iright)^2right]}}$$
где $n$ — размер выборки, $x_i$ и $y_i$ — соответствующие значения в выборках X и Y
Коэффициент детерминации
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 7, 9, 11, 13])
# оценка параметров линейной регрессии
slope, intercept = np.polyfit(x, y, 1)
# расчет коэффициента детерминации
y_predicted = slope * x + intercept
r_squared = 1 - (np.sum((y - y_predicted) ** 2) / ((len(y) - 1) * np.var(y, ddof=1)))
print("Коэффициент детерминации:", r_squared)
Коэффициент детерминации: 1.0
(R-квадрат) — это мера, которая показывает, какую долю изменчивости одной переменной можно объяснить вариацией другой переменной. Значение R-квадрат находится в диапазоне от 0 до 1, где 0 означает, что модель не объясняет никакой изменчивости, а 1 означает, что модель объясняет всю изменчивость
$$R^2 = 1 — frac{SS_{res}}{SS_{tot}}$$
где $SS_{res}$ — остаточная сумма квадратов, а $SS_{tot}$ — общая сумма квадратов
Z-преобразование (стандартизация)
z-оценка
zscore(df.column)
мера того, насколько значение точки данных отклоняется от среднего значения в единицах стандартного отклонения,
это позволяет сравнивать данные, измеренные в разных единицах или имеющие разные масштабы
$$z = frac{X — mu}{sigma}$$
где $z$ — z-оценка, $X$ — одно необработанное значение данных, $mu$ — среднее значение набора данных, $sigma$ — стандартное отклонение набора данных
Для генеральной совокупности
data = np.array([12, 15, 16, 18, 19, 20, 22, 25, 28, 31, 35])
mean = np.mean(data)
std = np.std(data)
z_data = stats.zscore(data)
print('Z-преобразованные данные:', z_data)
Z-преобразованные данные: [-1.45683394 -1.01577412 -0.86875418 -0.57471431 -0.42769437 -0.28067443 0.01336545 0.45442527 0.89548508 1.3365449 1.92462466]
Z-преобразование — это процесс стандартизации набора данных путем вычитания среднего значения и деления на стандартное отклонение. Если результат z-преобразования равен 0, то это означает, что значение переменной равно ее среднему значению. Если результат равен 1, то это означает, что значение переменной отклоняется от ее среднего значения на одно стандартное отклонение
$$Z = frac{x — mu}{sigma}$$
где — $x$ — наблюдаемое значение, $mu$ — среднее значение распределения, $sigma$ — стандартное отклонение распределения
Для выборки из генеральной совокупности
all_data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
sample = np.random.choice(all_data, size=5, replace=False)
sample_mean = np.mean(sample)
sample_std = np.std(sample, ddof=1)
z_sample = (sample - sample_mean) / sample_std
print('Z-преобразованная выборка:', z_sample)
Z-преобразованная выборка: [-1.19571306 -0.15596257 1.14372554 0.88378792 -0.67583782]
для применения z-преобразования к выборке необходимо вычислить выборочное среднее значение и выборочное стандартное отклонение
$$Z = frac{bar{x} — mu}{frac{sigma}{sqrt{n}}}$$
где $bar{x}$ — выборочное среднее, $mu$ — среднее значение генеральной совокупности, $sigma$ — стандартное отклонение генеральной совокупности, а $n$ — размер выборки
Для отдельного наблюдения из выборки
sample = np.array([4, 5, 6, 7, 8, 9, 10])
sample_mean = np.mean(sample)
sample_std = np.std(sample, ddof=1)
z_sample = (sample[4] - sample_mean) / sample_std
print('Отдельно взятое наблюдение выборки:', sample[4])
print('Z-значение для отдельно взятого наблюдения:', z_sample)
Отдельно взятое наблюдение выборки: 8
Z-значение для отдельно взятого наблюдения: 0.4629100498862757
$$z = frac{x — mu}{sigma}$$
где $x$ — значение в выборке, $mu$ — среднее значение выборки, $sigma$ — стандартное отклонение выборки
Проверка распределения на нормальность
ни один из этих тестов не гарантирует, что данные точно имеют нормальное распределение. Они только дают представление о том, насколько близки данные к нормальному распределению
Тест Шапиро-Уилка
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
stat, p = shapiro(data)
print('Statistics=%.3f, p=%.3f' % (stat, p))
alpha = 0.05
if p > alpha:
print('Распределение похоже на нормальное (не отвергаем H0)')
else:
print('Распределение не похоже на нормальное (отвергаем H0)')
Statistics=0.970, p=0.892
Распределение похоже на нормальное (не отвергаем H0)
Тест Шапиро-Уилка является более чувствительным к отклонениям от нормальности, особенно в случаях, когда данные имеют ярко выраженные выбросы. Он также более точен при малых выборках. Однако, он может оказаться менее мощным в случае, когда выборка слишком большая
Тест хи-квадрат
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
stat, p = normaltest(data)
print('Statistics=%.3f, p=%.3f' % (stat, p))
alpha = 0.05
if p > alpha:
print('Распределение похоже на нормальное (не отвергаем H0)')
else:
print('Распределение не похоже на нормальное (отвергаем H0)')
Statistics=2.027, p=0.363
Распределение похоже на нормальное (не отвергаем H0)
Тест хи-квадрат может быть более устойчивым в случае, когда данные более-менее нормальные, но не слишком точны. Также, он может быть полезен, когда нам интересно не только проверить, нормальные ли данные, но и определить, насколько сильно они отклоняются от нормальности
qq-plot
pg.qqplot(df, dist='norm')
график используется для сравнения распределения выборки данных df с теоретическим нормальным распределением
Проверка гомогенности дисперсий
Тесты Левена и Бартлетта применяются для проверки равенства дисперсий в нескольких выборках
Тест Левена
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
statistic, pvalue = levene(*data)
if pvalue > 0.05:
print(f"p-value = {pvalue}. Гомогенность дисперсий присутствует")
else:
print(f"p-value = {pvalue}. Гомогенность дисперсий отсутствует")
p-value = 1.0. Гомогенность дисперсий присутствует
Тест основан на сравнении среднеквадратических отклонений (MSE) в группах. Он менее чувствителен к выбросам, чем тест Бартлетта, так как MSE рассчитывается на основе медианы, а не на основе среднего значения. Он предполагает нормальность распределения в каждой группе. Если распределение не является нормальным, то тест Левена может давать неправильные результаты
$$W=frac{(N-k) sum_{i=1}^{k}left(n_{i}left(Z_{i}-overline{Z}right)^{2}right)}{(k-1) sum_{i=1}^{N}left(Y_{i}-overline{Y}right)^{2}}$$
где $W$ — статистика теста Левена, $N$ — общее число наблюдений, $k$ — количество групп, $n_i$ — размер $i$-й группы, $Z_i$ — среднее значение $i$-й группы, $overline{Z}$ — общее среднее значение всех групп, $Y_i$ — каждое наблюдение в $i$-й группе, $overline{Y}$ — общее среднее значение всех наблюдений
или можно сделать тоже самое иным способом:
pg.homoscedasticity(df, dv='events', group='group')
‘df’ — аргумент, датасет, в котором должны содержаться данные для анализа на гомоскедастичность;
«dv=’events'» — переменная (колонка), c зависимой переменной (в данном случае ‘events’);
«group=’group'» — переменная (колонка), c независимой переменной и разделяет данные на группы (в данном случае ‘group’)
Тест Бартлетта
group1 = [1, 2, 3, 4, 5]
group2 = [2, 4, 6, 8, 10]
stat, p = bartlett(group1, group2)
if p < 0.05:
result = 'Отвергаем гипотезу о гомогенности дисперсий'
else:
result = 'Не отвергаем гипотезу о гомогенности дисперсий'
print(f'Тест Бартлетта: статистика = {stat:.3f}, p-значение = {p:.3f}. {result}')
Тест Бартлетта: статистика = 1.587, p-значение = 0.208. Не отвергаем гипотезу о гомогенности дисперсий
Тест основан на сравнении дисперсий в группах. Он более чувствителен к выбросам, чем тест Левена, так как рассчитывает статистику на основе среднего значения, а не на основе медианы. Он предполагает нормальность распределения в каждой группе. Если распределение не является нормальным, то тест Бартлетта может давать неправильные результаты
$$B = frac{(N-1)sum_{i=1}^k n_i ln(s_i^2) — N ln(s_p^2)}{1 + frac{1}{3(k-1)}left(sum_{i=1}^k frac{1}{n_i} — frac{1}{N}right)}$$
где $N$ — общее количество наблюдений, $k$ — количество групп, $n_i$ — количество наблюдений в $i$-й группе, $s_i^2$ — выборочная дисперсия $i$-й группы, $s_p^2$ — средняя выборочная дисперсия всех групп
или можно сделать тоже самое иным способом:
pg.homoscedasticity(df, dv='weight', group='group', method='bartlett')
‘df’ — аргумент, датасет, в котором должны содержаться данные для анализа на гомоскедастичность;
«dv=’weight'» — зависимая переменная, которую нужно проверить на гомоскедастичность;
«group=’group'» — независимая переменная, определяющая группы, между которыми сравниваются дисперсии;
«method=’bartlett'» — метод, который будет использоваться для проверки гомоскедастичности
Определение доверительных интервалов
n = 30 # размер выборки
x_bar = 7.5 # выборочное среднее
alpha = 0.05 # уровень доверия
# известное стандартное отклонение генеральной совокупности
sigma = 2.5
# находим значение квантиля распределения
z = norm.ppf(1 - alpha/2)
# вычисляем границы доверительного интервала
lower = x_bar - z * sigma / math.sqrt(n)
upper = x_bar + z * sigma / math.sqrt(n)
print(f'Доверительный интервал: [{lower:.3f}, {upper:.3f}]')
Доверительный интервал: [6.605, 8.395]
Доверительный интервал — это диапазон значений, в котором находится неизвестный параметр генеральной совокупности с известным уровнем доверия
$$bar{x} pm z_{alpha/2} cdot frac{sigma}{sqrt{n}}$$
где $bar{x}$ — выборочное среднее, $z_{alpha/2}$ — критическое значение стандартного нормального распределения, соответствующее уровню доверия $alpha$, $sigma$ — известное стандартное отклонение, $n$ — размер выборки
Основываясь на знании t — распределения
# устанавливаем уровень доверия
confidence_level = 0.95
# задаем количество степеней свободы
degrees_of_freedom = 19
# вычисляем критическое значение t-статистики
t_critical = stats.t.ppf((1 + confidence_level) / 2, degrees_of_freedom)
# задаем значения стандартного отклонения, размера выборки и стандартной ошибки среднего
sd = 11.3
n = 20
standard_error = sd / np.sqrt(n)
# задаем выборочное среднее и предельную ошибку
sample_mean = 89.9
margin_of_error = t_critical * standard_error
# рассчитываем доверительный интервал
confidence_interval = (sample_mean - margin_of_error, sample_mean + margin_of_error)
print("Доверительный интервал для t - распределения: ", confidence_interval)
Доверительный интервал для t - распределения: (84.61143720745503, 95.18856279254499)
$$CI = bar{x} pm t_{frac{alpha}{2},n-1}frac{s}{sqrt{n}}$$
где $bar{x}$ — среднее значение выборки, $t_{frac{alpha}{2},n-1}$ — критическое значение t-распределения с $frac{alpha}{2}$ уровнем значимости и $n-1$ степенями свободы (где $alpha$ — уровень значимости), $s$ — стандартное отклонение выборки, $n$ — размер выборки
Статистические тесты (критерии)
Двухвыборочный t-критерий Стьюдента
group1 = [3, 5, 7, 9, 11]
group2 = [2, 4, 6, 8, 10]
# вычисляем средние значения
mean1 = sum(group1) / len(group1)
mean2 = sum(group2) / len(group2)
# вычисляем стандартные отклонения
std1 = stats.tstd(group1)
std2 = stats.tstd(group2)
# вычисляем t-статистику
t = (mean1 - mean2) / ((std1 ** 2 / len(group1)) + (std2 ** 2 / len(group2))) ** 0.5
# определяем степени свободы
df = len(group1) + len(group2) - 2
# определяем p-уровень значимости
p = stats.t.sf(abs(t), df) * 2
# задаем уровень значимости
alpha = 0.05
if p < alpha:
print(f"Различия статистически значимы: p={p}")
else:
print(f"Различия не являются статистически значимыми:p={p}")
Различия не являются статистически значимыми:p=0.6305360755569764
тест, используемый для проверки значимости различий между двумя выборками. В основе t-критерия лежит понятие t-статистики, которая представляет собой отношение разности между средними значениями двух выборок к их стандартной ошибке. Важным условием применения t-критерия является то, что данные должны быть распределены нормально или близко к нормальному распределению. Если это условие не выполняется, то использование t-критерия может привести к неверным результатам
$$t = frac{overline{X_1} — overline{X_2}}{s_p sqrt{frac{1}{n_1} + frac{1}{n_2}}}$$
где $overline{X_1}$ и $overline{X_2}$ — выборочные средние первой и второй выборок, $s_p$ — выборочное стандартное отклонение, рассчитанное по объединенным выборкам, $n_1$ и $n_2$ — размерности первой и второй выборок соответственно
Распределение Хи-квадрат (Chi-squared) Пирсона для одной номинативной переменной
# Наблюдаемые частоты observed = np.array([10, 10, 10, 5, 10, 15]) # Ожидаемые частоты (равномерное распределение) expected_uniform = np.array([10, 10, 10, 10, 10, 10]) # Вычисляем статистику Хи-квадрат chi2_stat = np.sum((observed - expected_uniform)**2 / expected_uniform) dof = len(observed) - 1 # Вычисляем P-значение p_value = 1 - chi2.cdf(chi2_stat, dof) # Задаем пороговый уровень значимости alpha = 0.05 print("Статистика Хи-квадрат:", chi2_stat) print("P-значение:", p_value) print("Степени свободы:", dof) print("nГипотезы:") print("H0: эмпирическое распределение частот не отличается от равномерного") print("H1: эмпирическое распределение частот отличается от равномерного") print("nРезультат:") if p_value < alpha: print(f"Отвергаем H0 на уровне значимости {alpha}. Эмпирическое распределение частот отличается от равномерного.") else: print(f"Не можем отвергнуть H0 на уровне значимости {alpha}. Эмпирическое распределение частот не отличается от равномерного.")
Вывод:
Статистика Хи-квадрат: 5.0 P-значение: 0.415880186995508 Степени свободы: 5 Гипотезы: H0: эмпирическое распределение частот не отличается от равномерного H1: эмпирическое распределение частот отличается от равномерного Результат: Не можем отвергнуть H0 на уровне значимости 0.05. Эмпирическое распределение частот не отличается от равномерного.
Это статистический тест, который позволяет оценить, есть ли значимая связь между двумя категориальными переменными на основе наблюдаемых частот в таблице сопряженности
Критерий Хи-квадрат Пирсона сравнивает наблюдаемые частоты с частотами, которые ожидались бы при условии независимости переменных (то есть, при отсутствии связи между ними). Статистика Хи-квадрат Пирсона (χ²) является мерой расхождения между наблюдаемыми и ожидаемыми частотами и имеет распределение Хи-квадрат с определенным числом степеней свободы
$$chi^2 = sum_{i=1}^{r} sum_{j=1}^{c} frac{(O_{ij} — E_{ij})^2}{E_{ij}}$$
где $sum_{i=1}^{r}$ и $sum_{j=1}^{c}$ — сумма по всем строкам, а $O_{ij}$ — наблюдаемые частоты в ячейках таблицы, $E_{ij}$ — ожидаемые частоты в ячейках, $r$ — количество строк таблицы сопряженности, $c$ — количество столбцов таблицы сопряженности
Распределение Хи-квадрат (Chi-squared) Пирсона для связи между двумя номинативными переменными
Примечание по использованию критерия! При анализе четырехпольных таблиц ожидаемые значения в каждой из ячеек должны быть не менее 10. В том случае, если хотя бы в одной ячейке ожидаемое явление принимает значение от 5 до 9, критерий хи-квадрат должен рассчитываться с поправкой Йейтса. Если хотя бы в одной ячейке ожидаемое явление меньше 5, то для анализа должен использоваться точный критерий Фишера. В случае анализа многопольных таблиц ожидаемое число наблюдений не должно принимать значения менее 5 более чем в 20% ячеек.
# Создаем таблицу сопряженности (contingency table) для двух номинативных переменных contingency_table = np.array([ [10, 6], [5, 15] ]) # Вычисляем статистику Хи-квадрат, p-значение и степени свободы chi2_stat, p_value, dof, expected_freq = chi2_contingency(contingency_table) # Задаем пороговый уровень значимости alpha = 0.05 print("Статистика Хи-квадрат:", chi2_stat) print("P-значение:", p_value) print("Степени свободы:", dof) print("nГипотезы:") print("H0: нет связи между двумя номинативными переменными") print("H1: есть связь между двумя номинативными переменными") print("nРезультат:") if p_value < alpha: print(f"Отвергаем H0 на уровне значимости {alpha}. Есть связь между двумя номинативными переменными.") else: print(f"Не можем отвергнуть H0 на уровне значимости {alpha}. Нет связи между двумя номинативными переменными.")
Вывод:
Статистика Хи-квадрат: 3.715714285714286 P-значение: 0.053902557169387154 Степени свободы: 1 Гипотезы: H0: нет связи между двумя номинативными переменными H1: есть связь между двумя номинативными переменными Результат: Не можем отвергнуть H0 на уровне значимости 0.05. Нет связи между двумя номинативными переменными.
Критерий использует таблицу сопряженности для определения, есть ли статистически значимая связь между двумя категориальными переменными. В этом случае, вы сравниваете наблюдаемые частоты с частотами, ожидаемыми при условии независимости переменных. Формула расчета та же, что и для одной номинативной переменной