Стандартне відхилення списку


103

Я хочу знайти середнє та стандартне відхилення 1-го, 2-го, ... цифр декількох (Z) списків. Наприклад, у мене є

A_rank=[0.8,0.4,1.2,3.7,2.6,5.8]
B_rank=[0.1,2.8,3.7,2.6,5,3.4]
C_Rank=[1.2,3.4,0.5,0.1,2.5,6.1]
# etc (up to Z_rank )...

Тепер я хочу взяти середнє і std *_Rank[0], середнє і std *_Rank[1], і т. Д.
(Тобто: середнє і std 1-ї цифри з усіх списків (A..Z) _rank;
середнє і std 2-ої цифри від всі списки (A..Z) _rank;
середнє значення та std 3-ї цифри ...; тощо).


13
Привіт, вірусний. Переповнення стека працює краще за все, як питання , -і- відповідь сайту. Ви ставите запитання, а всі інші надають відповіді. Ваш пост містить лише заяви, ніяких питань. У вас є конкретне питання програмування? Якщо говорити по-іншому, що ви намагалися досі, і де ви застрягли?
Robᵩ

2
Чому ці списки не є в словнику чи щось таке?
Уелід Хан

Вибачте, якщо я не передавав питання належним чином. Я хочу взяти серед A_rank [0] (0.8), B_rank [0] (0.1), C_rank [0] (1.2), ... Z_rank [0]. те ж саме для A_rank [1] (0.4), B_rank [1] (2.8), C_rank [1] (3.4), ... Z_rank [1].
physics_for_all

Відповіді:


150

Оскільки в Python 3.4 / PEP450 є statistics moduleстандартна бібліотека, яка має методstdev обчислення стандартного відхилення ітерабелів, як ваш:

>>> A_rank = [0.8, 0.4, 1.2, 3.7, 2.6, 5.8]
>>> import statistics
>>> statistics.stdev(A_rank)
2.0634114147853952

38
Варто зазначити, що pstddevйого, мабуть, слід використовувати замість того, якщо ваш список представляє всю сукупність (тобто список не є вибіркою сукупності). stddevобчислюється за допомогою дисперсії вибірки і буде завищеною середньою сукупністю.
Алекс Райлі

4
Функції насправді викликаються stdev і pstdev, не використовуючи stdдля standardяк можна було б очікувати. Я не зміг редагувати публікацію, оскільки для редагування потрібно змінити принаймні 6 символів ...
mknaf

104

Я б помістив A_Ranket al у 2D масив NumPy , а потім використати numpy.mean()та numpy.std()обчислити засоби та стандартні відхилення:

In [17]: import numpy

In [18]: arr = numpy.array([A_rank, B_rank, C_rank])

In [20]: numpy.mean(arr, axis=0)
Out[20]: 
array([ 0.7       ,  2.2       ,  1.8       ,  2.13333333,  3.36666667,
        5.1       ])

In [21]: numpy.std(arr, axis=0)
Out[21]: 
array([ 0.45460606,  1.29614814,  1.37355985,  1.50628314,  1.15566239,
        1.2083046 ])

2
результат numpy.std невірний. З огляду на ці значення: 20,31,50,69,80 і помістити в Excel за допомогою STDEV.S (A1: A5), результат 25,109 НЕ 22,45.
Джим Клермонтс

22
@JimClermonts Це не має нічого спільного з коректністю. Незалежно від того, чи будете ви робити ddof = 0 (за замовчуванням інтерпретувати дані як сукупність) або ddof = 1 (інтерпретувати це як вибірки, тобто оцінювати справжню дисперсію).
runDOSrun

17
Щоб додатково уточнити точку @ runDOSrun, функція Excel STDEV.P()та функція Numpy std(ddof=0)обчислюють сукупність sd або некорекційну вибірку sd, тоді як функція Excel STDEV.S()та функція Numpy std(ddof=1)обчислюють (виправлений) зразок sd, що дорівнює sqrt (N / (N-1) ) разів сукупність sd, де N - кількість балів. Дивіться більше: en.m.wikipedia.org/wiki/…
binaryfunt

52

Ось чистий код Python, який ви можете використовувати для обчислення середнього та стандартного відхилень.

Весь код нижче базується на statisticsмодулі в Python 3.4+.

def mean(data):
    """Return the sample arithmetic mean of data."""
    n = len(data)
    if n < 1:
        raise ValueError('mean requires at least one data point')
    return sum(data)/n # in Python 2 use sum(data)/float(n)

def _ss(data):
    """Return sum of square deviations of sequence data."""
    c = mean(data)
    ss = sum((x-c)**2 for x in data)
    return ss

def stddev(data, ddof=0):
    """Calculates the population standard deviation
    by default; specify ddof=1 to compute the sample
    standard deviation."""
    n = len(data)
    if n < 2:
        raise ValueError('variance requires at least two data points')
    ss = _ss(data)
    pvar = ss/(n-ddof)
    return pvar**0.5

Примітка: для підвищення точності при підсумовуванні плаваючих statisticsмодулів використовується спеціальна функція_sum а не вбудована, sumяку я використовував замість нього.

Тепер ми маємо для прикладу:

>>> mean([1, 2, 3])
2.0
>>> stddev([1, 2, 3]) # population standard deviation
0.816496580927726
>>> stddev([1, 2, 3], ddof=1) # sample standard deviation
0.1

1
Чи не повинно бути pvar=ss/(n-1)?
Ранджіт Рамачандра

2
@Ranjith: якщо ви хочете розрахувати дисперсію вибірки (або зразок SD), ви можете використовувати n-1. Код, наведений вище, призначений для населення SD (тому є nрівні свободи).
Алекс Райлі

Здрастуйте, Алекс, чи можете ви опублікувати функцію для обчислення стандартного відхилення вибірки? Я обмежений Python2.6, тому мені потрібно передати цю функцію.
Venu S

@VenuS: Привіт, я змінив stddevфункцію, щоб вона могла обчислити як вибіркові, так і стандартні відхилення сукупності.
Алекс Райлі

22

У Python 2.7.1 ви можете обчислити стандартне відхилення, використовуючи numpy.std()для:

  • Населення std : Просто використовуйте numpy.std()без додаткових аргументів, крім вашого списку даних.
  • Зразок std : Вам потрібно передати ddof (тобто Delta градусів свободи), встановлених у 1, як у наступному прикладі:

numpy.std (<ваш список>, ddof = 1 )

Дільник , який використовується для обчислень, є N - ddof , де N являє собою кількість елементів. За замовчуванням ddof дорівнює нулю.

Він обчислює вибірковий std, а не населення std.



8

Використовуючи python, ось декілька методів:

import statistics as st

n = int(input())
data = list(map(int, input().split()))

Підхід1 - за допомогою функції

stdev = st.pstdev(data)

Підхід2: обчисліть дисперсію і візьміть з неї квадратний корінь

variance = st.pvariance(data)
devia = math.sqrt(variance)

Підхід3: використання базової математики

mean = sum(data)/n
variance = sum([((x - mean) ** 2) for x in X]) / n
stddev = variance ** 0.5

print("{0:0.1f}".format(stddev))

Примітка:

  • variance обчислює дисперсію сукупності вибірки
  • pvariance обчислює дисперсію всього населення
  • подібні відмінності між stdevіpstdev

5

чистий код пітона:

from math import sqrt

def stddev(lst):
    mean = float(sum(lst)) / len(lst)
    return sqrt(float(reduce(lambda x, y: x + y, map(lambda x: (x - mean) ** 2, lst))) / len(lst))

10
У цьому 1-лайнері немає нічого "чистого". Гидота. Ось ще пітонічна версія:sqrt(sum((x - mean)**2 for x in lst) / len(lst))
DBrowne

3

Інші відповіді стосуються того, як зробити std dev в python достатньо, але ніхто не пояснює, як провести описаний вами химерний обхід.

Я припускаю, що AZ - це все населення. Якщо ви не бачите відповіді Оме про те, як зробити висновок із зразка.

Отже, щоб отримати стандартне відхилення / середню величину першої цифри кожного списку, вам знадобиться щось подібне:

#standard deviation
numpy.std([A_rank[0], B_rank[0], C_rank[0], ..., Z_rank[0]])

#mean
numpy.mean([A_rank[0], B_rank[0], C_rank[0], ..., Z_rank[0]])

Щоб скоротити код і узагальнити це до будь-якої n-ї цифри, використовуйте наступну функцію, яку я створив для вас:

def getAllNthRanks(n):
    return [A_rank[n], B_rank[n], C_rank[n], D_rank[n], E_rank[n], F_rank[n], G_rank[n], H_rank[n], I_rank[n], J_rank[n], K_rank[n], L_rank[n], M_rank[n], N_rank[n], O_rank[n], P_rank[n], Q_rank[n], R_rank[n], S_rank[n], T_rank[n], U_rank[n], V_rank[n], W_rank[n], X_rank[n], Y_rank[n], Z_rank[n]] 

Тепер ви можете просто отримати stdd і середнє значення для всіх n-х місць, таких як:

#standard deviation
numpy.std(getAllNthRanks(n))

#mean
numpy.mean(getAllNthRanks(n))

Для будь-кого, хто зацікавився, я створив функцію, використовуючи цей безладний str([chr(x)+'_rank[n]' for x in range(65,65+26)]).replace("'", "")
однолінійний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.