如何计算多人数值投票的共识同意率?求计算公式及JS库
离散投票共识度计算方案
适配需求的两种计算逻辑
根据给出的示例和需求,分两种投票场景选择计算方式即可:
若投票选项是无关联的独立分类(比如选不同活动方案、不同候选人,选项之间没有程度高低、意见相近的关系),直接用最高得票占比法,逻辑最直观:
- 先累加所有选项的得票数,得到总有效票数
- 取所有选项中的最高得票数
- 共识度百分比 = 最高得票数 / 总有效票数 * 100
对应示例计算结果:votesB全票投给同一选项,结果为100%;votesA最高得票4票、总票数7票,结果约为57.1%。如果希望超过半数的结果体现更高共识,可以自定义权重规则,比如最高得票率超过50%的部分乘以1.2-2的系数加成即可。
若投票选项是有序数值(比如提到的1、2、3、5这类程度评级,数值越接近代表意见偏差越小),只看最高得票率会低估共识度,推荐用距离加权计算法,更符合主观感知:
- 先把选项键映射为对应的数值,比如
one对应1、two对应2 - 计算所有投票的加权平均分值
- 计算选项区间的最大可能距离(即最大选项值减最小选项值)
- 计算所有投票和平均分值的实际平均距离
- 共识度百分比 = (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
相关产品推荐
相关产品推荐

