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

@Senseful 내 답변을 업데이트했으며 dollar sign in excel더 많은 문서를 찾을 수 있기 때문에 일반적으로 Google과 동일합니다.
Lipis

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이 답변은 간단하고 효과가 있으며 승인 된 답변보다 훨씬 좋습니다.
와카 르 임


2

Lipis의 코드가 나를 위해 작동하지 않았으므로 여기에 업데이트가 있습니다. 이 코드는 :

  • 배열 요소를 올바르게 지정하여 현재 버전의 Google 스프레드 시트와 작동

  • 값이 숫자인지 확인

  • 0 값을 고려하거나하지 않는 스위치가 있습니다

암호:

/**
  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 스프레드 시트에서 작동하도록 Lipis의 코드 수정 :

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!결과가 나타 났습니다 . Lipis가 만든 코드는 여전히 작동합니다. 반환되는 2D 배열 만 무시하고 있습니다.
Jacob Jan Tuinstra

0

ARRAYFORMULA ()는 Google 스프레드 시트 등에서 가중 평균을 계산할 수 있습니다 .

B2 : D2에 가중치를 별도로 저장하면 공식을 쉽게 읽을 수 있습니다. 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  |
+--------+-------------+-------+-------------+---------+

RegExExtract ()를 사용하여 $ B $ 1 : $ D $ 1에서 가중치를 얻는 것은 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가능하지 않고 개별 셀보다 범위를 선택하게됩니다.

예제 파일을 만들었습니다. Google 스프레드 시트에서 가중 평균을 계산하는 방법?


0

허용되는 답변은 Google Apps Script를 사용하고 있기 때문에 약간의 스 니펫도 만들었습니다.

암호

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)B2의 무게는 C2의 절반 (50 %)이고 D2는 3x C2 (300 %)입니다.

더 복잡한 것들이 제 급료보다 높습니다. :)


0

실제로 두 버전의 Average.weighted와 sumproduct는 동일한 결과를 제공합니다.

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
Jacob Jan Tuinstra

@JacobJanTuinstra이 답변이 추천하는 답변보다 등급이 낮은 경우 왜이 답변이 먼저 표시됩니까? webapps stackexchange는 신비한 방식으로 작동합니다.
e18r
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.