গুগল পত্রকগুলিতে ওজনিত গড় কীভাবে গণনা করবেন?


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আমাদের জীবনকে আরও সহজ এবং পরিষ্কার করার জন্য আমি তাদের দ্বিতীয় সারির ( ) থেকে পড়ছি । $সূত্রটির ফলাফলের পরিবর্তন করা হয় না। আপনি যখন অন্য একটি ঘরে সূত্রটি অনুলিপি করছেন তখন কেবল এটি ঘটছে। Following এর পরে থাকা সেল রেফারেন্সের অংশটি পরিবর্তন হবে না ( আরও তথ্যের জন্য লিঙ্ক )। ঘরে একবার সূত্রটি লিখুন E3এবং এটিকে কার্যত দেখতে দেখতে বাকী সারিতে অনুলিপি করুন।


কী করতে $লক্ষণ মানে?
সেনসফুল

@ সেনসফুল আমি আমার উত্তরটি আপডেট করেছি এবং আপনি সাধারণভাবে গুগল করতে পারবেন dollar sign in excelকারণ আপনি এর জন্য আরও ডকুমেন্টেশন পাবেন।
লিপিস

1
আপনার ফাংশনটি কাজ করে না। তবে এটি আমার পক্ষে কাজ করে: gist.github.com/totty90/b58f47dbc430a53d2e5b
Totty.js


58

যদি আপনার ওজন B থেকে L পর্যন্ত সারির 2 সারি হয় এবং আপনি যে ডেটা গড় করতে চান তা 3 এবং এর উচ্চতর সারিতে থাকে, বলুন, তবে আপনি নিম্নোক্ত হিসাবে নিম্নোক্ত ব্যবহার করতে পারেন:

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

7
+1 এই উত্তরটি সহজ, কার্যকরী এবং স্বীকৃত উত্তরটির চেয়ে অনেক ভাল।
Afr

7

গুগল শুনেছেন বলে মনে হয়েছিল। অন্তত আমার গুগল পত্রকের উদাহরণে, ফাংশনটি AVERAGE.WEIGHTEDবিদ্যমান। সহায়তা প্রতি:

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

দয়া করে সহায়তার জন্য লিঙ্ক। খুঁজে পাইনি.
প্যারাগব্যাক্সি


2

লিপিসের কোডটি আমার পক্ষে কাজ করে না, তাই এখানে একটি আপডেট রয়েছে। এই কোড:

  • গুগল স্প্রেডশিটগুলির বর্তমান সংস্করণটির সাথে অ্যারে উপাদানগুলিকে সঠিকভাবে সম্বোধন করে কাজ করে

  • মানগুলি সংখ্যা কিনা তা পরীক্ষা করে

  • শূন্য মানগুলি বিবেচনা করার জন্য একটি স্যুইচ রয়েছে

কোড:

/**
  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

গুগল স্প্রেডশিটের বর্তমান সংস্করণে কাজ করতে লিপিসের কোডটি সংশোধন করা হচ্ছে:

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; আমি নতুন গুগল শিটগুলিতে আপনাকে কোড পরীক্ষা করেছি এবং এটি কার্যকর হয়নি, #NUM!ফলস্বরূপ এটি দিয়েছে । লিপিস তৈরি কোডটি এখনও কাজ করে। আপনি কেবল ফিরে আসা 2 ডি-অ্যারে উপেক্ষা করছেন।
জ্যাকব জান টুইনস্ট্রা

0

ARRAYFORMULA () গুগল স্প্রেডশিটগুলিতে (এবং আরও অনেক কিছু) ওজনযুক্ত গড় গণনা করতে পারে ।

বি 2-তে আলাদাভাবে ওজন সংরক্ষণ করা: ডি 2 সূত্রটি পড়া সহজ করে। E3 এর জন্য ওজনিত গড় গণনা করা হচ্ছে তারপরে SUMPRODUCT () এর মতো দেখতে পাওয়া যাবে (E4 এবং E5 এর জন্য অনুলিপি / পেস্ট করুন):

=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  |
+--------+-------------+-------+-------------+---------+

$ B $ 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))

এনবি যে পুনর্নির্মাণের সংখ্যা ছাড়াই বিশিষ্ট নাম প্রয়োজন; সুতরাং, 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 এটা সম্ভব একটি ব্যাপ্তি নির্বাচন করতে, বরং পৃথক কোষ চেয়ে করব।

উদাহরণ

আমি আপনার জন্য একটি উদাহরণ ফাইল তৈরি করেছি: গুগল স্প্রেডশিটগুলিতে ওজনযুক্ত গড় গণনা কিভাবে করব?


0

গ্রহণযোগ্য উত্তরটি গুগল অ্যাপস স্ক্রিপ্টটি ব্যবহার করছে তাই আমি কিছুটা স্নিপেটও তৈরি করেছি।

কোড

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;
}

স্ক্রিনশট

এখানে চিত্র বর্ণনা লিখুন

বিঃদ্রঃ

যেমন উপস্থাপন স্ক্রিপ্ট একই যুক্তি অনুসরণ করবে এই পোস্টে । প্রধান সুবিধাটি হ'ল এটি একবারে সামগ্রিক মানগুলি গণনা করবে।

উদাহরণ

আমি আপনার জন্য একটি উদাহরণ ফাইল তৈরি করেছি: গুগল স্প্রেডশিটগুলিতে ওজনযুক্ত গড় গণনা কিভাবে করব?


0

জন্য সহজ ভরযুক্ত গড়, আপনি শুধু সেল মান একাধিক বার যোগ করতে পারেন। আপনি যদি A1 75% এবং B1 25% হতে চান তবে আপনি এটিকে রাখতে পারেন =AVERAGE (A1,A1,A1,B1)। সুতরাং বিশেষত আপনার জন্য, এটি হবে =AVERAGE (B2,C2,C2,D1,D2,D2,D2,D2,D2,D2), যা সি 2 (50%) এর অর্ধেক হিসাবে বি 2 এবং 3x সি 2 (300%) হিসাবে ডি 2 এর ওজন হবে।

আরও জটিল জিনিসগুলি আমার বেতন গ্রেডের উপরে। :)


0

প্রকৃতপক্ষে উভয় সংস্করণ গড়.ওয়েটড এবং সংশ্লেষ একই ফলাফল দেয়:

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

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

সুতরাং আমি বরং এটি প্রথমটি ব্যবহার করি কারণ এটি হ্যান্ডেল করার উপায়টি আরও সহজ however তবে আমি কীভাবে এই সূত্রটিতে অন্যান্য ওজন যুক্ত করতে জানি না।

এটি টুলটিপ, তবে কীভাবে কেবলমাত্র ওজন যুক্ত করতে হয় এবং অতিরিক্ত মানগুলি কীভাবে জানে না

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

এটি কিছুটা অস্পষ্ট। আপনি কি নতুন প্রশ্ন জিজ্ঞাসা করার চেষ্টা করছেন বা এটি একটি উত্তর?
jonsca

-2

শুধুমাত্র প্রদত্ত ফাংশনগুলি ব্যবহার করার জন্য বেশ সহজ উপায় রয়েছে।

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

যেখানে E বিষয়বস্তুগুলি পয়েন্টের সংখ্যা এবং জি সেই পয়েন্টগুলির গুরুত্ব।


2
এই উত্তরটি ইতিমধ্যে দেওয়া হয়েছিল: webapps.stackexchange.com/a/29919/29140
জ্যাকব জান

@ জ্যাকবজানটুইনস্ট্র্রা আপনি যে উল্লেখ করছেন তার চেয়ে নীচে রেট দেওয়া হলে এই উত্তরটি কেন প্রথমে প্রদর্শিত হবে? ওয়েব
অ্যাপস স্ট্যাকেক্সচেঞ্জ বিদ্বেষপূর্ণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.