J'ai un Google Sheets où les produits sont répertoriés en tant que lignes et les attributs en tant que colonnes. L'attribut de chaque produit est évalué sur une échelle de 1 à 10. Ma dernière colonne est une moyenne de ces valeurs (c'est-à-dire =Average(B2:D2)
). Cela fonctionne très bien si chaque attribut a le même poids.
+--------+-------+-------+-------+---------+
| | Attr1 | Attr2 | Attr3 | Overall |
+--------+-------+-------+-------+---------+
| Prod 1 | 10 | 8 | 9 | 9 |
| Prod 2 | 2 | 10 | 7 | 6.33 |
| Prod 3 | 4 | 6 | 6 | 5.33 |
+--------+-------+-------+-------+---------+
Le problème est que je veux que chaque attribut ait un poids différent. Par exemple, Attr1 pourrait ne pas être important et ne devrait valoir que 50%, tandis que Attr3 est très important et devrait représenter 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 |
+--------+-------------+-------+--------------+---------+
La valeur pour la première ligne serait:
(10*0.5 + 8*1 + 9*3) / (0.5+1+3) = 8.89
qui pourrait être calculé en utilisant:
(
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
)
qui, comme vous pouvez le constater, peut devenir très difficile à gérer à mesure que de nouveaux attributs sont ajoutés. Idéalement, je recherche une solution ne nécessitant pas la création de cellules temporaires pour faciliter les calculs.
Existe-t-il une fonction intégrée ou une convention commune qui puisse m'aider à calculer ces moyennes pondérées?
la source
$
signifient les signes?dollar sign in excel
c'est la même chose, car vous trouverez plus de documentation à ce sujet.sumproduct
Si vos pondérations sont dans la ligne 2 de B à L et que les données que vous souhaitez moyenner sont dans les lignes 3 et supérieures, par exemple, vous pouvez utiliser sumproduct comme suit:
la source
Google semblait avoir écouté. Au moins dans mon exemple de Google Sheets, la fonction
AVERAGE.WEIGHTED
existe. Par l'aide:la source
Le code de Lipis ne fonctionnait pas pour moi, alors voici une mise à jour. Ce code:
fonctionne avec la version actuelle de Google Spreadsheets en adressant correctement les éléments du tableau
vérifie si les valeurs sont des nombres
a un commutateur pour considérer les valeurs zéro ou non
Code:
la source
Correction du code de Lipis pour qu'il fonctionne avec la version actuelle de Google Spreadsheets:
la source
#NUM!
. Le code que Lipis a créé fonctionne toujours. Vous ignorez uniquement le tableau 2D qui est renvoyé.ARRAYFORMULA () peut calculer une moyenne pondérée dans Google Spreadsheets (et plus).
Stocker les poids séparément dans B2: D2 simplifie la lecture de la formule. Le calcul de la moyenne pondérée pour E3 ressemble alors à SUMPRODUCT () ci-dessus (copier / coller pour E4 et E5):
=ARRAYFORMULA(sum(B3:D3 * $B$2:$D$2)/sum($B$2:$D$2))
Utiliser RegExExtract () pour obtenir les poids à partir de $ B $ 1: $ D $ 1 est un simple changement dans ARRAYFORMULA (). Remplacez la plage simple par l'expression plus complexe "
iferror(regexextract($B$1:$D$1,"\d+"),100)/100
" et la formule pour E3 devient (copier / coller pour 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))
NB: Cette expression rationnelle nécessite des noms d'attributs sans numéros; utilisez donc AttrA, AttrB & AttrC au lieu de Attr1, Attr2 & Attr3.
la source
Ayant lu votre question attentivement,
Je suis venu avec cette solution, qui utilise pas de cellules temporaires.
Formule
Capture d'écran
A expliqué
Le
REGEXEXTRACT
va extraire la valeur dans l'en-tête après le premier crochet droit etVALUE
le convertira en un nombre. LaIFERROR
volonté définira la valeur à100
si rien n'est trouvé etARRAYFORMULA
permettra de sélectionner une plage plutôt que des cellules individuelles.Exemple
J'ai créé pour vous un exemple de fichier: Comment calculer des moyennes pondérées dans Google Spreadsheets?
la source
Comme la réponse acceptée est d'utiliser Google Apps Script, j'ai également créé un petit extrait de code.
Code
Capture d'écran
Remarque
Le script suivra la même logique que celle présentée dans ce post. Le principal avantage est qu'il calcule les valeurs globales en une fois.
Exemple
J'ai créé pour vous un exemple de fichier: Comment calculer des moyennes pondérées dans Google Spreadsheets?
la source
Pour les moyennes pondérées simples , vous pouvez simplement ajouter la valeur de cellule plusieurs fois. Comme si vous voulez que A1 soit à 75% et que B1 soit à 25%, vous pouvez le mettre en jeu
=AVERAGE (A1,A1,A1,B1)
. Donc, en particulier pour le vôtre, ce serait=AVERAGE (B2,C2,C2,D1,D2,D2,D2,D2,D2,D2)
B2 qui représenterait la moitié de C2 (50%) et D2 3 x C2 (300%).Des choses plus compliquées sont au-dessus de ma note de salaire. :)
la source
En fait, les deux versions Moyenne.Poids et Somme produisent le même résultat:
Donc, j'utilise plutôt le premier, car il est beaucoup plus simple à gérer, mais je ne sais pas comment ajouter d'autres poids à cette formule.
Ceci est l'info-bulle, mais vous ne savez pas comment ajouter uniquement des poids et non des valeurs supplémentaires
la source
Il y a moyen assez simple d'utiliser seulement des fonctions données.
où E contenu est le nombre de points et G l'importance de ces points.
la source