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.