Google शीट में भारित औसत की गणना कैसे करें?


36

मेरे पास एक Google शीट है जहां उत्पादों को पंक्तियों और विशेषताओं के रूप में सूचीबद्ध किया जाता है। प्रत्येक उत्पाद की विशेषता को 1-10 के पैमाने पर रेट किया गया है। मेरा अंतिम कॉलम इन मानों (यानी =Average(B2:D2)) का औसत है । यह ठीक काम करता है अगर प्रत्येक विशेषता का वजन समान हो।

+--------+-------+-------+-------+---------+
|        | Attr1 | Attr2 | Attr3 | Overall |
+--------+-------+-------+-------+---------+
| Prod 1 | 10    | 8     | 9     | 9       |
| Prod 2 | 2     | 10    | 7     | 6.33    |
| Prod 3 | 4     | 6     | 6     | 5.33    |
+--------+-------+-------+-------+---------+

समस्या यह है कि मैं चाहता हूं कि प्रत्येक विशेषता का एक अलग वजन हो। उदाहरण के लिए, Attr1 महत्वपूर्ण नहीं हो सकता है और इसकी कीमत केवल 50% होनी चाहिए, जबकि Attr3 बहुत महत्वपूर्ण है और इसकी कीमत 300% होनी चाहिए।

+--------+-------------+-------+--------------+---------+
|        | Attr1 (50%) | Attr2 | Attr3 (300%) | Overall |
+--------+-------------+-------+--------------+---------+
| Prod 1 | 10          | 8     | 9            | 8.89    |
| Prod 2 | 2           | 10    | 7            | 7.11    |
| Prod 3 | 4           | 6     | 6            | 5.78    |
+--------+-------------+-------+--------------+---------+

पहली पंक्ति के लिए मान होगा:

(10*0.5 + 8*1 + 9*3) / (0.5+1+3) = 8.89

जिनका उपयोग करके गणना की जा सकती है:

(
  B2*(IFERROR(REGEXEXTRACT(B1, "\d+"), 100)/100) 
  + C2*(IFERROR(REGEXEXTRACT(C1, "\d+"), 100)/100)
  + D2*(IFERROR(REGEXEXTRACT(D1, "\d+"), 100)/100) 
) / (
  IFERROR(REGEXEXTRACT(B1, "\d+"), 100)/100
  + IFERROR(REGEXEXTRACT(C1, "\d+"), 100)/100
  + IFERROR(REGEXEXTRACT(D1, "\d+"), 100)/100
)

जो, जैसा कि आप देख सकते हैं, अधिक विशेषताओं को जोड़ना बहुत मुश्किल हो सकता है। आदर्श रूप से, मैं एक ऐसे समाधान की तलाश कर रहा हूं जिसमें गणना के साथ मदद करने के लिए अस्थायी सेल बनाने की आवश्यकता न हो।

क्या कोई फ़ंक्शन या एक आम सम्मेलन है जो मुझे इन भारित औसत की गणना करने में मदद कर सकता है?

जवाबों:


8

भारित औसत की गणना करने के लिए कोई फ़ंक्शन नहीं बनाया गया है इसलिए आपको एक कस्टम फ़ंक्शन लिखना होगा यदि आप बहुत अधिक अस्थायी कोशिकाओं का उपयोग करने से बचना चाहते हैं। तो यहां बताया गया है कि आप अपने लक्ष्य को कैसे प्राप्त कर सकते हैं।

टूल्स > स्क्रिप्ट्स पर जाएं > स्क्रिप्ट एडिटर ... , कॉपी / पेस्ट करें और इसे सेव करें:

function weightedAverage(v, w) {
  var sum_v = 0;
  var sum_w = 0;

  if (v[0].length != w[0].length) {
    return "#ERROR: Incorrect number of values and weights";  
  }

  for (var c = 0; c < v[0].length; ++c) {
    sum_v += v[0][c] * w[0][c]; 
    sum_w += w[0][c]; 
  }

  return sum_v/sum_w;
}​

इसका उपयोग करें जैसे:

=weightedAverage(B3:D3,$B$2:$D$2) 

B3:D3आपके मूल्य और $B$2:$D$2आपके वजन कहां हैं । यह त्रुटि प्रमाण नहीं है (केवल चेक यह सुनिश्चित करने के लिए है कि दोनों सरणियों की लंबाई समान है) लेकिन यह चाल करेगा।

उपरोक्त उदाहरण में मैं विशेषता के शीर्षक से भार निकालने की कोशिश नहीं कर रहा हूं, लेकिन मैं उन्हें B2:D2अपने जीवन को आसान और स्पष्ट बनाने के लिए दूसरी पंक्ति ( ) से पढ़ रहा हूं । $सूत्र का परिणाम नहीं बदल रहा है। जब आप किसी अन्य कक्ष में सूत्र की प्रतिलिपि बना रहे हैं तो यह केवल वही प्रभावित कर रहा है जो हो रहा है। $ के बाद सेल संदर्भ का हिस्सा नहीं बदलेगा ( अधिक विवरण के लिए लिंक )। सेल में एक बार सूत्र लिखें E3और इसे कार्रवाई में देखने के लिए इसे बाकी पंक्तियों पर कॉपी करें।


$संकेतों का क्या मतलब है?
सांयकाल

@Senseful मैंने अपना उत्तर अपडेट कर दिया है, और आप सामान्य रूप से Google dollar sign in excelके लिए भी वही कर सकते हैं क्योंकि आपको इसके लिए और अधिक दस्तावेज मिलेंगे।
लिप्स डेस

1
आपका काम नहीं करता है। लेकिन यह मेरे लिए काम करता है: gist.github.com/totty90/b58f47dbc430a53d2e5b
Totty.js

1
इस पेज पर एक और उच्चतर उत्तर दिया गया है जो काम करता है और निर्मित फ़ंक्शन का उपयोग करता हैsumproduct
ब्रैड पार्क्स

58

यदि आपका वज़न B से L तक की पंक्ति 2 में है, और जो डेटा आप औसत बनाना चाहते हैं, वह पंक्तियों 3 और उच्चतर में है, तो आप निम्नानुसार sumproduct का उपयोग कर सकते हैं:

=sumproduct(B$2:L$2, C3:L3)/sum(B$2:L$2)

7
+1 यह उत्तर सरल है, काम कर रहा है और स्वीकृत की तुलना में बहुत बेहतर है।
अफ्र

7

लगता है गूगल ने सुन लिया। कम से कम Google शीट्स के मेरे उदाहरण में, फ़ंक्शन AVERAGE.WEIGHTEDमौजूद है। प्रति सहायता:

=AVERAGE.WEIGHTED(values,
                  weights,
                  [additional_values, ...],
                  [additional_weights, ...])

कृपया मदद करने के लिए लिंक। नहीं ढूंड सका।
परगबाक्सी


2

लिपिस कोड मेरे लिए काम नहीं कर रहा था, इसलिए यहां एक अपडेट है। यह कोड:

  • Google स्प्रैडशीट के वर्तमान संस्करण के साथ काम करता है जो सरणी तत्वों को सही ढंग से संबोधित करता है

  • जाँचता है कि मान नंबर हैं या नहीं

  • शून्य मानों पर विचार करने के लिए स्विच है या नहीं

कोड:

/**
  v - Values range
  w - Weights range
  z - count zero values?
*/

function weightedAverage(v, w, z) {
  var sum_v = 0;
  var sum_w = 0;

  if (v.length != w.length) {
    return "#ERROR: Incorrect number of values and weights";  
  }

  for (var c = 0; c < v.length; ++c) {
    if (!z && Number(v[c][0])!=0) {
      sum_v += Number(v[c][0]) * Number(w[c][0]); 
      sum_w += Number(w[c][0]); 
    }
  }

  return sum_v/sum_w;
}

0

Google स्प्रेडशीट के वर्तमान संस्करण के लिए लिपिस कोड को ठीक करने के लिए:

function weightedAverage(v, w) {
  var sum_v = 0;
  var sum_w = 0;

  if (v.length != w.length) {
    return "#ERROR: Incorrect number of values and weights";  
  }

  for (var c = 0; c < v.length; ++c) {
    sum_v += v[c] * w[c]; 
    sum_w += w[c] * 1; 
  }

  return sum_v/sum_w;
}​

-1; मैंने आपको नए Google पत्रक में कोड का परीक्षण किया और यह काम नहीं किया, इसने #NUM!परिणाम के रूप में दिया । कोड लिपिस अभी भी काम करता है। आप केवल 2d-array की अनदेखी कर रहे हैं जो वापस आ रहा है।
याकूब जान तुस्टेन

0

ARRAYFORMULA () Google स्प्रेडशीट (और अधिक) में एक भारित औसत की गणना कर सकता है ।

B2 में भार को अलग से रखना: D2 सूत्र को पढ़ना सरल करता है। E3 के लिए भारित औसत की गणना तब SUMPRODUCT () के समान दिखती है (E4 & 5/5 के लिए कॉपी / पेस्ट):

=ARRAYFORMULA(sum(B3:D3 * $B$2:$D$2)/sum($B$2:$D$2))

+--------+-------------+-------+-------------+---------+
|        | AttrA (50%) | AttrB | AttrC (300%)| Overall |
| Weight:|        50%  |  100% |        300% |         |
+--------+-------------+-------+-------------+---------+
| Prod 1 |       10    |  8    |       9     | 8.8889  |
| Prod 2 |        2    | 10    |       7     | 7.1111  |
| Prod 3 |        4    |  6    |       6     | 5.7778  |
+--------+-------------+-------+-------------+---------+

$ $ $ 1: $ D $ 1 से वेटेज प्राप्त करने के लिए RegExExtract () का उपयोग करना ARRAYFORMULA () में एक सरल परिवर्तन है। सरल श्रेणी को और अधिक जटिल अभिव्यक्ति के साथ बदलें " iferror(regexextract($B$1:$D$1,"\d+"),100)/100" और E3 के लिए सूत्र बन जाता है (E4 और E5 के लिए कॉपी / पेस्ट):

=ARRAYFORMULA(sum(B3:D3 * iferror(regexextract($B$1:$D$1,"\d+"),100)/100)/sum(iferror(regexextract($B$1:$D$1,"\d+"),100)/100))

नायब कि regexp को संख्या के बिना विशेषता नामों की आवश्यकता होती है; इसलिए, Attr1, Attr2 & Attr3 के बजाय AttrA, AttrB & AttrC का उपयोग करें।


0

अपने प्रश्न को ध्यान से पढ़े,

आदर्श रूप से, मैं एक ऐसे समाधान की तलाश कर रहा हूं जिसमें गणना के साथ मदद करने के लिए अस्थायी सेल बनाने की आवश्यकता न हो।

मैं इस समाधान के साथ आया था, कि कोई अस्थायी कोशिकाओं का उपयोग नहीं करता है।

सूत्र

weights = ARRAYFORMULA(IFERROR(VALUE(REGEXEXTRACT($B$1:$D$1,"\((\d+)")),100))

=SUMPRODUCT(B3:D3, weights) / SUM(weights)

copy / paste
=SUMPRODUCT(B2:D2, ARRAYFORMULA(IFERROR(VALUE(REGEXEXTRACT($B$1:$D$1,"\((\d+)")),100)))/SUM(ARRAYFORMULA(IFERROR(VALUE(REGEXEXTRACT($B$1:$D$1,"\((\d+)")),100)))

स्क्रीनशॉट

यहाँ छवि विवरण दर्ज करें

व्याख्या की

REGEXEXTRACTपहले सीधे ब्रैकेट के बाद शीर्षक में मान प्राप्त होगा और VALUEयह एक संख्या में परिवर्तित कर देंगे। IFERRORपर मूल्य निर्धारित करेंगे 100, तो कुछ भी नहीं पाया जाता है और ARRAYFORMULAयह संभव श्रेणी का चयन करने के लिए है, न कि अलग-अलग कोशिकाओं की तुलना में कर देगा।

उदाहरण

मैंने आपके लिए एक उदाहरण फ़ाइल बनाई है: Google स्प्रेडशीट में भारित औसत की गणना कैसे करें?


0

चूंकि स्वीकृत उत्तर Google Apps स्क्रिप्ट का उपयोग कर रहा है, इसलिए मैंने थोड़ा स्निपेट भी बनाया।

कोड

function weightedAverage(v, w) {
  var weights = [], sumWeights = 0;
  for(var k = 0, kLen = w[0].length; k < kLen; k++) {
    var m = w[0][k].match(/\((\d+)/), value;
    if(!m) {
      value = 100;
    } else {
      value = Number(m[1]);
    }
    weights.push(value);
    sumWeights += value;
  }

  var output = [];
  for(var i = 0, iLen = v.length; i < iLen; i++) {
    var sumProduct = 0;
    for(var j = 0, jLen = v[0].length; j < jLen; j++) {
      sumProduct += v[i][j] * weights[j]; 
    }
    output.push(sumProduct / sumWeights);
  } 
  return output;
}

स्क्रीनशॉट

यहाँ छवि विवरण दर्ज करें

ध्यान दें

स्क्रिप्ट इस तर्क का पालन करेगी जैसा कि इस पोस्ट में प्रस्तुत किया गया है । मुख्य लाभ यह है कि यह एक ही बार में समग्र मूल्यों की गणना करेगा।

उदाहरण

मैंने आपके लिए एक उदाहरण फ़ाइल बनाई है: Google स्प्रेडशीट में भारित औसत की गणना कैसे करें?


0

के लिए सरल भारित औसत, तो आप सिर्फ सेल मूल्य कई बार जोड़ सकते हैं। जैसे अगर आप A1 को 75% और B1 को 25% होना चाहते हैं, तो आप इसमें डाल सकते हैं =AVERAGE (A1,A1,A1,B1)। तो आपके लिए विशेष रूप से, यह होगा =AVERAGE (B2,C2,C2,D1,D2,D2,D2,D2,D2,D2), जो बी 2 को सी 2 (50%) और डी 2 को 3x सी 2 (300%) के रूप में तौलेगा।

अधिक जटिल सामान मेरे वेतन ग्रेड से ऊपर है। :)


0

वास्तव में दोनों संस्करण औसत। वेटेड और सेम्पोरोड एक ही परिणाम देते हैं:

AVERAGE.WEIGHTED("Values","Weight")

SUMPRODUCT("Numbers","Weight")/sum("Weight")

इसलिए मैं पहले वाले का उपयोग करता हूं क्योंकि इसे संभालने के लिए अधिक सरल तरीका है, हालांकि मुझे नहीं पता कि इस सूत्र में अन्य भार कैसे जोड़ सकते हैं।

यह टूलटिप है, लेकिन पता नहीं है कि केवल वज़न कैसे जोड़ा जाए और अतिरिक्त मान नहीं

AVERAGE.WEIGHTED(values, weights, [additional_values, ...], [additional_weights, ...])

यह थोड़ा अस्पष्ट है। क्या आप एक नया प्रश्न पूछना चाह रहे हैं या यह एक उत्तर है?
jonsca

-2

केवल दिए गए कार्यों का उपयोग करने का काफी सरल तरीका है।

=(sumproduct(E5:E9;G5:G9)/sum(E5:E9))   

जहां E सामग्री अंकों की संख्या है और G उन बिंदुओं का महत्व है।


2
वह जवाब पहले से ही दिया गया था: webapps.stackexchange.com/a/29919/29140
याकूब जान तुइस्टन

@JacobJanTuinstra यह उत्तर पहले क्यों दिखाई देता है यदि इसे जिस तरह से आप संदर्भित कर रहे हैं उससे कम मूल्यांकन किया गया है? webapps stackexchange
कामचलाऊ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.