एक सूची का मानक विचलन


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 of *_Rank[0], माध्य और std *_Rank[1], इत्यादि लेना चाहता हूँ
(यानी: mean and std of the 1st digit from all (A..Z) _rank सूचियाँ;
2 डी अंक का माध्य और std ; सभी (A..Z) _rank सूचियाँ;
तीसरा अंक का माध्य और std ...; आदि)।


13
हैलो, वायरल। स्टैक ओवरफ्लो एक प्रश्न- और- उत्तर साइट के रूप में सबसे अच्छा काम करता है । आप एक प्रश्न पूछते हैं, और बाकी सभी उत्तर प्रदान करते हैं। आपकी पोस्ट में केवल कथन हैं, कोई प्रश्न नहीं है। क्या आपके पास एक विशिष्ट प्रोग्रामिंग प्रश्न है? इसे दूसरे तरीके से रखने के लिए, आपने अब तक क्या कोशिश की है, और आप कहाँ फंस गए हैं?
राब

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] के लिए भी।
Phys_for_all

जवाबों:


150

अजगर 3.4 के बाद से / PEP450 वहाँ है एक statistics moduleमानक पुस्तकालय है, जो एक है में विधिstdev आपके जैसे iterables के मानक विचलन की गणना के लिए:

>>> 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 16

104

मैं डाल A_Rankएक 2 डी में एट अल 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 और STDEV.S (A1: A5) का उपयोग करके Excel में रखा गया, परिणाम 25,109 नहीं 22,45 है।
जिम

22
@JimClermonts इसका शुद्धता से कोई लेना देना नहीं है। Ddof ​​= 0 (डिफ़ॉल्ट, इंटरप्रिटेट डेटा जनसंख्या के रूप में) या ddof = 1 (इसे नमूने के रूप में व्याख्या करें, अर्थात सत्य विचरण का अनुमान) इस बात पर निर्भर करता है कि आप क्या कर रहे हैं।
रनड्रोसन

17
@ RunDOSrun के बिंदु को और स्पष्ट करने के लिए, Excel फ़ंक्शन STDEV.P()और Numpy फ़ंक्शन जनसंख्या sd, या बिना मापित किए गए नमूना sd की std(ddof=0)गणना करते हैं , जबकि Excel फ़ंक्शन और Numpy फ़ंक्शन नमूना (सुधारा गया) नमूना sd की गणना करते हैं , जो sqrt (N /-1) के बराबर होता है ) गुना जनसंख्या एसडी, जहां एन अंकों की संख्या है। और देखें: en.m.wikipedia.org/wiki/…STDEV.S()std(ddof=1)
बाइनरीफंट

52

यहाँ कुछ शुद्ध-पायथन कोड का उपयोग आप माध्य और मानक विचलन की गणना के लिए कर सकते हैं।

नीचे दिया गया सभी कोड statisticsPython 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
@ रंजीथ: यदि आप नमूना विचरण (या नमूना एसडी) की गणना करना चाहते हैं तो आप उपयोग कर सकते हैं n-1। उपरोक्त कोड जनसंख्या एसडी के लिए है (इसलिए nस्वतंत्रता की डिग्री हैं )।
एलेक्स रिले

हैलो एलेक्स, आप नमूना मानक विचलन की गणना के लिए समारोह पोस्ट कर सकते हैं? मैं Python2.6 के साथ सीमित हूं, इसलिए मुझे इस फ़ंक्शन पर रिले करना होगा।
वेणु एस S

@VenuS: नमस्कार, मैंने stddevफ़ंक्शन को संपादित किया है ताकि यह नमूना और जनसंख्या मानक विचलन दोनों की गणना कर सके।
एलेक्स रिले

22

पायथन 2.7.1 में, आप इसके लिए मानक विचलन की गणना कर सकते हैं numpy.std():

  • जनसंख्या std : बस numpy.std()अपनी डेटा सूची के अलावा कोई अतिरिक्त तर्क के साथ उपयोग करें।
  • नमूना एसटीडी : आपको निम्न उदाहरण में ddof (अर्थात स्वतंत्रता की डेल्टा डिग्री) 1 में उत्तीर्ण करने की आवश्यकता है :

numpy.std (<अपनी सूची>, ddof = 1 )

गणना में प्रयुक्त भाजक N - ddof है , जहाँ N तत्वों की संख्या को दर्शाता है। डिफ़ॉल्ट रूप से ddof शून्य है।

यह जनसंख्या std के बजाय नमूना std की गणना करता है।



8

अजगर का उपयोग, यहाँ कुछ तरीके हैं:

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))
पायथनिक

3

अन्य उत्तर कवर करते हैं कि पर्याप्त रूप से अजगर में एसटीडी कैसे करें, लेकिन कोई भी यह नहीं बताता है कि आपके द्वारा वर्णित विचित्र ट्रैवर्स कैसे करें।

मुझे लगता है कि 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]])

कोड को छोटा करने के लिए और इसे किसी भी nth अंक के लिए सामान्यीकृत करने के लिए, मैं आपके लिए निम्न फ़ंक्शन का उपयोग करता हूं:

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]] 

अब आप बस इस तरह से AZ से सभी nth स्थानों के stdd और मतलब प्राप्त कर सकते हैं:

#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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.