You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算多人数值投票的共识同意率?求计算公式及JS库

离散投票共识度计算方案

适配需求的两种计算逻辑

根据给出的示例和需求,分两种投票场景选择计算方式即可:

  • 若投票选项是无关联的独立分类(比如选不同活动方案、不同候选人,选项之间没有程度高低、意见相近的关系),直接用最高得票占比法,逻辑最直观:

    1. 先累加所有选项的得票数,得到总有效票数
    2. 取所有选项中的最高得票数
    3. 共识度百分比 = 最高得票数 / 总有效票数 * 100
      对应示例计算结果:votesB全票投给同一选项,结果为100%;votesA最高得票4票、总票数7票,结果约为57.1%。如果希望超过半数的结果体现更高共识,可以自定义权重规则,比如最高得票率超过50%的部分乘以1.2-2的系数加成即可。
  • 若投票选项是有序数值(比如提到的1、2、3、5这类程度评级,数值越接近代表意见偏差越小),只看最高得票率会低估共识度,推荐用距离加权计算法,更符合主观感知:

    1. 先把选项键映射为对应的数值,比如one对应1、two对应2
    2. 计算所有投票的加权平均分值
    3. 计算选项区间的最大可能距离(即最大选项值减最小选项值)
    4. 计算所有投票和平均分值的实际平均距离
    5. 共识度百分比 = (1 - 实际平均距离 / 最大可能距离) * 100
      对应示例计算结果:votesB所有投票无偏差,结果为100%;votesA的投票集中在1-3区间、多数票投给1,结果约为83.8%,符合“较高共识水平”的预期。

开箱即用的JavaScript实现

直接复制下面的函数就能用,支持两种场景切换:

function calculateConsensus(votes, optionValueMap = null) {
  const totalVotes = Object.values(votes).reduce((sum, count) => sum + count, 0);
  if (totalVotes === 0) return 0;

  // 无关联分类场景:最高得票率计算
  if (!optionValueMap) {
    const maxVote = Math.max(...Object.values(votes));
    return Number(((maxVote / totalVotes) * 100).toFixed(1));
  }

  // 有序数值场景:距离加权计算
  let weightedSum = 0;
  const optionValues = [];
  for (const [option, count] of Object.entries(votes)) {
    const val = optionValueMap[option];
    weightedSum += val * count;
    optionValues.push(val);
  }
  const avg = weightedSum / totalVotes;
  const maxVal = Math.max(...optionValues);
  const minVal = Math.min(...optionValues);
  const maxDistance = maxVal - minVal;
  if (maxDistance === 0) return 100;

  let totalDistance = 0;
  for (const [option, count] of Object.entries(votes)) {
    const val = optionValueMap[option];
    totalDistance += Math.abs(val - avg) * count;
  }
  const avgDistance = totalDistance / totalVotes;
  return Number(((1 - avgDistance / maxDistance) * 100).toFixed(1));
}

// 示例调用
const votesA = { one: 4, two: 2, three: 1, five: 0}
const votesB = { one: 7, two: 0, three: 0, five: 0}
const optionValueMap = { one: 1, two: 2, three: 3, five: 5 }

console.log(calculateConsensus(votesB)) // 输出100
console.log(calculateConsensus(votesA)) // 输出57.1(分类场景结果)
console.log(calculateConsensus(votesA, optionValueMap)) // 输出83.8(有序数值场景结果)

相关工具推荐

如果只是实现当前的共识度计算,上面的函数足够用,没有额外依赖。如果后续需要扩展更多统计计算能力(比如计算投票方差、置信区间等),可以使用simple-statistics库,API简单轻量,覆盖了大部分前端常用的统计计算能力,不需要深入掌握统计学原理也能快速调用。


内容的提问来源于stack exchange,提问作者solar apricot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:39:40