Google Sayfalarında ağırlıklı ortalamalar nasıl hesaplanır?


36

Ürünlerin satır olarak sıralandığı ve özelliklerin sütun olarak listelendiği bir Google Sayfalarım var. Her ürünün özelliği 1-10 arasında derecelendirilmiştir. Son sütunum bu değerlerin ortalamasıdır (yani =Average(B2:D2)). Her özellik aynı ağırlığa sahipse bu iyi çalışır.

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

Sorun şu ki, her bir özelliğin farklı bir ağırlığa sahip olmasını istiyorum. Örneğin, Attr1 önemli olmayabilir ve sadece% 50 değerinde olmalı, Attr3 ise çok önemli ve% 300 değerinde olmalı.

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

İlk satırın değeri şöyle olur:

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

hangi kullanılarak hesaplanabilir:

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

Gördüğünüz gibi, daha fazla özellik eklendikçe yönetimi çok zorlaşabilir. İdeal olarak, hesaplamalara yardımcı olmak için geçici hücreler oluşturmayı gerektirmeyen bir çözüm arıyorum.

Bu ağırlıklı ortalamaları hesaplamama yardımcı olacak yerleşik bir işlev veya ortak bir kongre var mı?

Yanıtlar:


8

Ağırlıklı ortalamayı hesaplamak için yerleşik bir işlev yoktur, bu nedenle çok fazla geçici hücre kullanmaktan kaçınmak istiyorsanız özel bir işlev yazmanız gerekir. İşte burada amacınıza nasıl ulaşabileceğinizi.

Gidin Araçlar > Komut > Senaryo editörü ... , Kopyala / körük kodu ve bunun tasarruf yapıştırın:

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

Gibi kullanın:

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

B3:D3Değerlerin ve $B$2:$D$2ağırlıkların nerede . Hataya dayanıklı değildir (tek kontrol, her iki dizinin de aynı uzunlukta olduğundan emin olmaktır), ancak işi halledecektir.

Yukarıdaki örnekte, özniteliğin başlığından ağırlıkları çıkarmaya çalışmıyorum, ancak B2:D2hayatımızı daha kolay ve anlaşılır hale getirmek için ikinci satırdan ( ) okuyorum . Bu $formülün sonucunu değiştirmiyor. Bu sadece formülü başka bir hücreye kopyalarken olanları etkiliyor. Hücre başvurusunun $ 'dan sonraki kısmı değişmeyecek ( daha fazla ayrıntı için link ). Formülü bir kez hücreye yazın E3ve eylemi görmek için satırların geri kalanına kopyalayın.


$İşaretler ne anlama geliyor?
10'10 Şehrinde

@Senseful Cevabımı güncelledim ve dollar sign in excelbunun için daha fazla belge bulacağınız için genel olarak Google’ı kullanabilirsiniz .
Lipis

1
İşleviniz çalışmıyor. Ama bu benim için çalışıyor: gist.github.com/totty90/b58f47dbc430a53d2e5b
Totty.js

1
Bu sayfada yerleşik işlevini alan ve kullanan başka bir daha yüksek puanlı yanıt var.sumproduct
Brad Parks

58

Ağırlıklarınız B satırından 2'ye kadar B satırındaysa ve ortalamak istediğiniz veriler satır 3 ve daha yüksekse, demek oluyor ki, sumproduct'ı şu şekilde kullanabilirsiniz:

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

7
+1 bu cevabı basit, çalışır ve kabul edilenden çok daha iyi.
Waqar Lim 30:13


2

Lipis'in kodu benim için çalışmıyordu, işte bir güncelleme. Bu kod:

  • Dizi öğelerini doğru bir şekilde adresleyen Google Spreadsheets’ın geçerli sürümüyle çalışır

  • değerlerin sayı olup olmadığını kontrol eder

  • sıfır değerleri göz önünde bulundurma

Kod:

/**
  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 E-Tabloların şu anki sürümü için çalışmak üzere Lipis'in kodunu düzeltme:

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; Kodunuzu yeni Google Sayfalarında test ettim ve çalışmadı, #NUM!sonuç olarak verdi . Lipis kodu hala çalışıyor. Sadece iade edilen 2d dizisini görmezden geliyorsun.
Jacob Jan Tuinstra

0

ARRAYFORMULA (), Google Spreadsheets’de (ve daha pek çoğunda) ağırlıklı bir ortalama hesaplayabilir .

Ağırlıkları B2: D2 'de ayrı ayrı depolamak, formülü okumayı basitleştirir. E3 için ağırlıklı ortalamanın hesaplanması daha sonra yukarıdaki SUMPRODUCT () işlevine benzer (E4 ve E5 için kopyala / yapıştır):

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

Ağırlıkları $ B $ 1'den almak için RegExExtract () yöntemini kullanmak: $ D $ 1, ARRAYFORMULA () işlevinde yapılan basit bir değişikliktir. Basit aralığı daha karmaşık ifadeyle " iferror(regexextract($B$1:$D$1,"\d+"),100)/100" değiştirin ve E3 formülü (E4 ve E5 için kopyala / yapıştır) olur:

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

Not: Bu regexp, numarasız nitelik isimleri gerektirir; bu nedenle, Attr1, Attr2 & Attr3 yerine AttrA, AttrB ve AttrC tuşlarını kullanın.


0

Sorunuzu dikkatlice okudum,

İdeal olarak, hesaplamalara yardımcı olmak için geçici hücreler oluşturmayı gerektirmeyen bir çözüm arıyorum.

Hiçbir geçici hücre kullanmayan bir çözüm buldum.

formül

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

Ekran görüntüsü

görüntü tanımını buraya girin

Açıklaması

REGEXEXTRACTİlk düz ayraç başlığında değeri elde edecek ve VALUEbir dizi halinde dönüştürür. IFERROREn ayarlayacağını 100hiçbir şey bulunursa ve ARRAYFORMULAmümkün oldukça bireysel hücrelerden daha, bir aralık seçmek için yapacaktır.

Örnek

Sizin için bir örnek dosya oluşturdum: Google E-Tablolarda ağırlıklı ortalamalar nasıl hesaplanır?


0

Kabul edilen cevap Google Apps Komut Dosyası kullandığından, küçük bir pasaj oluşturdum.

kod

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

Ekran görüntüsü

görüntü tanımını buraya girin

Not

Komut dosyası bu yazıdakiyle aynı mantığı izleyecektir . Asıl avantajı, toplam değerleri bir kerede hesaplamasıdır.

Örnek

Sizin için bir örnek dosya oluşturdum: Google E-Tablolarda ağırlıklı ortalamalar nasıl hesaplanır?


0

İçin basit ağırlıklı ortalamalar, sadece hücre değerini birden çok kez ekleyebilirsiniz. Mesela A1’in% 75 ve B1’in% 25 olmasını istiyorsanız, bunu ekleyebilirsiniz =AVERAGE (A1,A1,A1,B1). Bu nedenle, özellikle sizin için =AVERAGE (B2,C2,C2,D1,D2,D2,D2,D2,D2,D2), B2'yi C2'nin yarısı (% 50) ve D2'yi 3x C2 (% 300) ağırlığında olacaktır.

Daha karmaşık şeyler maaşımın üstünde. :)


0

Aslında her iki versiyon da Average.weighted ve sumproduct aynı sonucu verir:

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

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

Bu yüzden birincisini kullanmayı tercih ediyorum, çünkü kullanımı daha kolay, ancak bu formüle nasıl başka ağırlık ekleyeceğimi bilmiyorum.

Bu araç ipucudur, ancak ek değerler değil sadece ağırlık ekleyeceğinizi bilmiyorum

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

Bu biraz belirsiz. Yeni bir soru sormaya mı çalışıyorsun yoksa bu bir cevap mı?
jonsca

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.