একটি তালিকার মানক বিচ্যুতি


103

আমি 1 ম, 2 য়, কয়েকটি (জেড) তালিকার অঙ্কের গড় এবং মান বিচ্যুতি সন্ধান করতে চাই। উদাহরণস্বরূপ, আমি আছে

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 )...

এখন আমি গড় এবং এর এসটিডি নিতে চান *_Rank[0], গড় এবং এসটিডি *_Rank[1], ইত্যাদি
(অর্থাৎ, গড় এবং সব থেকে (a..z 1st ডাক এসটিডি) _rank তালিকা;
গড় এবং থেকে 2nd ডাক এসটিডি সমস্ত (A..Z) _rank তালিকাগুলি;
তৃতীয় অঙ্কের গড় এবং STD ...; ইত্যাদি)।


13
হ্যালো, ভাইরাল প্রশ্ন - উত্তর- সাইট হিসাবে স্ট্যাক ওভারফ্লো সবচেয়ে ভাল কাজ করে । আপনি একটি প্রশ্ন জিজ্ঞাসা করুন, এবং অন্য প্রত্যেকে উত্তর সরবরাহ করে। আপনার পোস্টে কেবল বিবৃতি রয়েছে, কোনও প্রশ্ন নেই। আপনার একটি নির্দিষ্ট প্রোগ্রামিং প্রশ্ন আছে? এটি অন্যভাবে বলতে গেলে, আপনি এতক্ষণ কী চেষ্টা করেছেন এবং আপনি কোথায় আটকে আছেন?
রোব

2
এই তালিকা কেন কোনও অভিধানে বা কিছুতে নেই?
ওয়ালিদ খান

দুঃখিত যদি আমি প্রশ্নটি সঠিকভাবে না জানাই। আমি A_rank গড় বলতে চাই [0] (0.8), বি_রঙ্ক [0] (0.1), সি_রঙ্ক [0] (1.2), ... জেড_রঙ্ক [0] A_rank [1] (0.4), বি_রঙ্ক [1] (2.8), সি_রঙ্ক [1] (3.4), ... জেডআরঙ্ক [1] এর জন্য একই।
পদার্থবিজ্ঞানের_পরে_ সমস্ত

উত্তর:


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যেমন এক আশা করবে। আমি সম্পাদনাগুলি কমপক্ষে
ify টি

104

আমি A_Rankএট আলকে 2 ডি নুমপি অ্যারে রাখব এবং তারপরে উপায়গুলি এবং মানক বিচ্যুতিগুলি ব্যবহার করতে 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 এবং এসটিডিইভি.এস (এ 1: এ 5) ব্যবহার করে এক্সলে রেখেছেন ফলাফলটি 25,109 নয় 22,45।
জিম ক্লারমন্টস

22
@ জিম ক্লারমন্টস এর সঠিকতার সাথে কোন যোগসূত্র নেই। Ddof ​​= 0 (ডিফল্ট, জনসংখ্যা হিসাবে ডেটা ব্যাখ্যা করুন) বা ddof = 1 (নমুনাগুলি হিসাবে এটি ব্যাখ্যা করুন, অর্থাত সত্য প্রকৃতির অনুমান) আপনি যা করছেন তার উপর নির্ভর করে।
দোসরুন

17
আরও নির্মল @ runDOSrun এর পয়েন্ট, এক্সেল ফাংশন STDEV.P()এবং Numpy ফাংশন std(ddof=0)ক্যালকুলেট জনসংখ্যা SD, অথবা অসংশোধিত নমুনা SD, যখন এক্সেল ফাংশন STDEV.S()এবং Numpy ফাংশন std(ddof=1)ক্যালকুলেট (সংশোধন) নমুনা SD, যা সমান SQRT (এন / (এন -1) ) জনসংখ্যার এসডির চেয়ে বহুগুণ, যেখানে এন পয়েন্টের সংখ্যা। আরও দেখুন: en.m.wikedia.org/wiki/…
বাইনারিফ্যান্ট

52

গড় এবং মানক বিচ্যুতি গণনা করতে আপনি এখানে কিছু খাঁটি-পাইথন কোড ব্যবহার করতে পারেন।

নীচের সমস্ত কোড statisticsপাইথন 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স্বাধীনতার ডিগ্রি রয়েছে)।
অ্যালেক্স রিলে

হ্যালো অ্যালেক্স, আপনি কি নমুনা স্ট্যান্ডার্ড বিচ্যুতি গণনার জন্য ফাংশন পোস্ট করতে পারেন? আমি পাইথন 2.6 এর সাথে সীমাবদ্ধ, তাই আমাকে এই ফাংশনটিতে রিলে করতে হবে।
ভেনু এস

@ ভেনু: হ্যালো, আমি stddevফাংশনটি সম্পাদনা করেছি যাতে এটি নমুনা এবং জনসংখ্যার মানক বিচ্যুতি উভয়ই গণনা করতে পারে।
অ্যালেক্স রিলি

22

পাইথন ২.7.১ এ আপনি এর numpy.std()জন্য ব্যবহার করে স্ট্যান্ডার্ড বিচ্যুতি গণনা করতে পারেন :

  • জনসংখ্যা স্ট্যান্ড : numpy.std()আপনার ডেটা তালিকাগুলি ছাড়া অতিরিক্ত কোনও যুক্তি ছাড়াই ব্যবহার করুন ।
  • নমুনা স্ট্যান্ড : নিম্নলিখিত উদাহরণ হিসাবে আপনার ডিডিএফ (অর্থাত্ ডেল্টা ডিগ্রি অফ ফ্রিডম) পাস করতে হবে :

numpy.std (<আপনার তালিকা>, ddof = 1 )

গণনায় ব্যবহৃত বিভাজকটি হ'ল এন - ডিডোফ , যেখানে এন উপাদানগুলির সংখ্যা উপস্থাপন করে। ডিফল্ট হিসাবে ddof শূন্য হয়।

এটি জনসংখ্যার চেয়ে স্ট্যান্ডার্ড নমুনার গণনা করে।



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

অন্যান্য উত্তরগুলিতে কীভাবে অজগরটিতে স্ট্যান্ড ডেভ করতে হবে তা কভার করে, তবে আপনার বর্ণিত উদ্ভট ট্র্যাভারসাল কীভাবে করবেন তা কেউ ব্যাখ্যা করে না।

আমি ধরে নিচ্ছি যে জেড পুরো জনসংখ্যা। কোনও নমুনা থেকে কীভাবে অনুমান করা যায় সে সম্পর্কে ওমের উত্তর না দেখলে ।

সুতরাং প্রতিটি তালিকার প্রথম অঙ্কের স্ট্যান্ডার্ড বিচ্যুতি / গড় পেতে আপনার এই জাতীয় কিছু দরকার হবে:

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

কোডটি সংক্ষিপ্ত করতে এবং এটিকে যে কোনও নবম সংখ্যাতে সাধারণীকরণ করতে আপনার জন্য উত্পন্ন নিম্নলিখিত ফাংশনটি ব্যবহার করুন:

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

এখন আপনি এজেড থেকে সহজেই সমস্ত নবম স্থানের স্টডিডি এবং গড়টি পেতে পারেন:

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

#mean
numpy.mean(getAllNthRanks(n))

যে কোনও আগ্রহী ব্যক্তির জন্য, আমি এই অগোছালো ওয়ান-লাইনার ব্যবহার করে ফাংশনটি তৈরি করেছি:str([chr(x)+'_rank[n]' for x in range(65,65+26)]).replace("'", "")
স্যামি বেঞ্চিরিফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.