Implementing John Manoogian III's design of Buster Benson's cognitive bias cheat sheet (best viewed on bigger screens).
Last active
October 14, 2021 05:35
-
-
Save tmsss/8cab5a0c39c2435ae1be990226492936 to your computer and use it in GitHub Desktop.
Cognitive Bias Codex, 2016
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
height: 950 | |
border: no |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "biases", | |
"children": [ | |
{ | |
"name": "1. Too Much Information", | |
"children": [ | |
{ | |
"name": "We notice things already primed in memory or repeated often.", | |
"children": [ | |
{"name": "Availability heuristic"}, | |
{"name": "Attentional bias"}, | |
{"name": "Illusory truth effect"}, | |
{"name": "Mere exposure effect"}, | |
{"name": "Context effect"}, | |
{"name": "Cue-dependent forgetting"}, | |
{"name": "Mood-congruent memory bias"}, | |
{"name": "Frequency illusion"}, | |
{"name": "Baader-Meinhof Phenomenon"}, | |
{"name": "Empathy gap"}, | |
{"name": "Omission bias"}, | |
{"name": "Base rate fallacy"} | |
] | |
}, | |
{ | |
"name": "Bizarre/funny/visually-striking/anthropomorphic things stick out more than non-bizarre/unfunny things.", | |
"children": [ | |
{"name": "Bizarreness effect"}, | |
{"name": "Humor effect"}, | |
{"name": "Von Restorff effect"}, | |
{"name": "Picture superiority effect"}, | |
{"name": "Self-relevance effect"}, | |
{"name": "Negativity bias"} | |
] | |
}, | |
{ | |
"name": "We notice when something has changed.", | |
"children": [ | |
{"name": "Anchoring"}, | |
{"name": "Conservatism"}, | |
{"name": "Contrast effect"}, | |
{"name": "Distinction bias"}, | |
{"name": "Focusing effect"}, | |
{"name": "Framing effect"}, | |
{"name": "Money illusion"}, | |
{"name": "Weber–Fechner law"} | |
] | |
}, | |
{ | |
"name": "We are drawn to details that confirm our own existing beliefs", | |
"children": [ | |
{"name": "Confirmation bias"}, | |
{"name": "Congruence bias"}, | |
{"name": "Post-purchase rationalization"}, | |
{"name": "Choice-supportive bias"}, | |
{"name": "Selective perception"}, | |
{"name": "Observer-expectancy effect"}, | |
{"name": "Experimenter's bias"}, | |
{"name": "Observer effect"}, | |
{"name": "Expectation bias"}, | |
{"name": "Ostrich effect"}, | |
{"name": "Subjective validation"}, | |
{"name": "Continued influence effect"}, | |
{"name": "Semmelweis reflex"} | |
] | |
}, | |
{ | |
"name": "We notice flaws in others more easily than flaws in ourselves.", | |
"children": [ | |
{"name": "Bias blind spot"}, | |
{"name": "Naïve cynicism"}, | |
{"name": "Naïve realism"} | |
] | |
} | |
] | |
}, | |
{ | |
"name": "2. Not Enough Meaning", | |
"children": [ | |
{ | |
"name": "We find stories and patterns even in sparse data", | |
"children": [ | |
{"name": "Confabulation"}, | |
{"name": "Clustering illusion"}, | |
{"name": "Insensitivity to sample size"}, | |
{"name": "Neglect of probability"}, | |
{"name": "Anecdotal fallacy"}, | |
{"name": "Illusion of validity"}, | |
{"name": "Masked man fallacy"}, | |
{"name": "Recency illusion"}, | |
{"name": "Gambler's fallacy"}, | |
{"name": "Hot-hand fallacy"}, | |
{"name": "Illusory correlation"}, | |
{"name": "Pareidolia"}, | |
{"name": "Anthropomorphism"} | |
] | |
}, | |
{ | |
"name": "We fill in characteristics from stereotypes, generalities, and prior histories", | |
"children": [ | |
{"name": "Group attribution error"}, | |
{"name": "Ultimate attribution error"}, | |
{"name": "Stereotyping"}, | |
{"name": "Essentialism"}, | |
{"name": "Functional fixedness"}, | |
{"name": "Moral credential effect"}, | |
{"name": "Just-world hypothesis"}, | |
{"name": "Argument from fallacy"}, | |
{"name": "Authority bias"}, | |
{"name": "Automation bias"}, | |
{"name": "Bandwagon effect"}, | |
{"name": "Placebo effect"} | |
] | |
}, | |
{ | |
"name": "We imagine things and people we're familiar with or fond of as better", | |
"children": [ | |
{"name": "Out-group homogeneity bias"}, | |
{"name": "Cross-race effect"}, | |
{"name": "In-group bias"}, | |
{"name": "Halo effect"}, | |
{"name": "Cheerleader effect"}, | |
{"name": "Positivity effect"}, | |
{"name": "Not invented here"}, | |
{"name": "Reactive devaluation"}, | |
{"name": "Well-traveled road effect"} | |
] | |
}, | |
{ | |
"name": "We simplify probabilities and numbers to make them easier to think about", | |
"children": [ | |
{"name": "Mental accounting"}, | |
{"name": "Appeal to probability fallacy"}, | |
{"name": "Normalcy bias"}, | |
{"name": "Murphy's Law"}, | |
{"name": "Zero sum bias"}, | |
{"name": "Survivorship bias"}, | |
{"name": "Subadditivity effect"}, | |
{"name": "Denomination effect"}, | |
{"name": "Magic number 7+-2"} | |
] | |
}, | |
{ | |
"name":"We think we know what other people are thinking", | |
"children": [ | |
{"name": "Illusion of transparency"}, | |
{"name": "Curse of knowledge"}, | |
{"name": "Spotlight effect"}, | |
{"name": "Extrinsic incentive error"}, | |
{"name": "Illusion of external agency"}, | |
{"name": "Illusion of asymmetric insight"} | |
] | |
}, | |
{ | |
"name": "We project our current mindset and assumptions onto the past and future", | |
"children": [ | |
{"name": "Telescoping effect"}, | |
{"name": "Rosy retrospection"}, | |
{"name": "Hindsight bias"}, | |
{"name": "Outcome bias"}, | |
{"name": "Moral luck"}, | |
{"name": "Declinism"}, | |
{"name": "Impact bias"}, | |
{"name": "Pessimism bias"}, | |
{"name": "Planning fallacy"}, | |
{"name": "Time-saving bias"}, | |
{"name": "Pro-innovation bias"}, | |
{"name": "Projection bias"}, | |
{"name": "Restraint bias"}, | |
{"name": "Self-consistency bias"} | |
] | |
} | |
] | |
}, | |
{ | |
"name": "3. Need To Act Fast", | |
"children": [ | |
{ | |
"name": "To act, we must be confident we can make an impact and feel what we do is important", | |
"children": [ | |
{"name": "Overconfidence effect"}, | |
{"name": "Social desirability bias"}, | |
{"name": "Third-person effect"}, | |
{"name": "False consensus effect"}, | |
{"name": "Hard-easy effect"}, | |
{"name": "Lake Wobegone effect"}, | |
{"name": "Dunning-Kruger effect"}, | |
{"name": "Egocentric bias"}, | |
{"name": "Optimism bias"}, | |
{"name": "Forer effect"}, | |
{"name": "Barnum effect"}, | |
{"name": "Self-serving bias"}, | |
{"name": "Actor-observer bias"}, | |
{"name": "Illusion of control"}, | |
{"name": "Illusory superiority"}, | |
{"name": "Fundamental attribution error"}, | |
{"name": "Defensive attribution hypothesis"}, | |
{"name": "Trait ascription bias"}, | |
{"name": "Effort justification"}, | |
{"name": "Risk compensation"}, | |
{"name": "Peltzman effect"} | |
] | |
}, | |
{ | |
"name": "To stay focused, we favor the immediate, relatable thing in front of us", | |
"children": [ | |
{"name": "Hyperbolic discounting"}, | |
{"name": "Appeal to novelty"}, | |
{"name": "Identifiable victim effect"} | |
] | |
}, | |
{ | |
"name": "To get anything done, we tend to complete things we've invested time & energy in.", | |
"children": [ | |
{"name": "Sunk cost fallacy"}, | |
{"name": "Irrational escalation"}, | |
{"name": "Escalation of commitment"}, | |
{"name": "Generation effect"}, | |
{"name": "Loss aversion"}, | |
{"name": "IKEA effect"}, | |
{"name": "Unit bias"}, | |
{"name": "Zero-risk bias"}, | |
{"name": "Disposition effect"}, | |
{"name": "Pseudocertainty effect"}, | |
{"name": "Processing difficulty effect"}, | |
{"name": "Endowment effect"}, | |
{"name": "Backfire effect"} | |
] | |
}, | |
{ | |
"name": "To avoid mistakes, we tend to preserve our autonomy and group status, and avoid irreversible decisions.", | |
"children": [ | |
{"name": "System justification"}, | |
{"name": "Reverse psychology"}, | |
{"name": "Reactance"}, | |
{"name": "Decoy effect"}, | |
{"name": "Social comparison bias"}, | |
{"name": "Status quo bias"} | |
] | |
}, | |
{ | |
"name": "We favor options that appear simple or have more complete information over more complex, ambiguous options.", | |
"children": [ | |
{"name": "Ambiguity bias"}, | |
{"name": "Information bias"}, | |
{"name": "Belief bias"}, | |
{"name": "Rhyme as reason effect"}, | |
{"name": "Bike-shedding effect"}, | |
{"name": "Law of Triviality"}, | |
{"name": "Delmore effect"}, | |
{"name": "Conjunction fallacy"}, | |
{"name": "Occam's razor"}, | |
{"name": "Less-is-better effect"} | |
] | |
} | |
] | |
}, | |
{ | |
"name": "4. What Should We Remember?", | |
"children": [ | |
{ | |
"name": "We edit and reinforce some memories after the fact", | |
"children": [ | |
{"name": "Misattribution of memory"}, | |
{"name": "Source confusion"}, | |
{"name": "Cryptomnesia"}, | |
{"name": "False memory"}, | |
{"name": "Suggestibility"}, | |
{"name": "Spacing effect"} | |
] | |
}, | |
{ | |
"name": "We discard specifics to form generalities", | |
"children": [ | |
{"name": "Implicit associations"}, | |
{"name": "Implicit stereotypes"}, | |
{"name": "Stereotypical bias"}, | |
{"name": "Prejudice"}, | |
{"name": "Negativity bias"}, | |
{"name": "Fading affect bias"} | |
] | |
}, | |
{ | |
"name": "We reduce events and lists to their key elements", | |
"children": [ | |
{"name": "Peak–end rule"}, | |
{"name": "Leveling and sharpening"}, | |
{"name": "Misinformation effect"}, | |
{"name": "Serial recall effect"}, | |
{"name": "List-length effect"}, | |
{"name": "Duration neglect"}, | |
{"name": "Modality effect"}, | |
{"name": "Memory inhibition"}, | |
{"name": "Primacy effect"}, | |
{"name": "Recency effect"}, | |
{"name": "Part-list cueing effect"}, | |
{"name": "Serial position effect"}, | |
{"name": "Suffix effect"} | |
] | |
}, | |
{ | |
"name": "We store memories differently based on how they were experienced", | |
"children": [ | |
{"name": "Levels of processing effect"}, | |
{"name": "Absent-mindedness"}, | |
{"name": "Testing effect"}, | |
{"name": "Next-in-line effect"}, | |
{"name": "Google effect"}, | |
{"name": "Tip of the tongue phenomenon"} | |
] | |
} | |
] | |
} | |
] | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="utf-8" /> | |
<title>Cognitive Bias Cheat Sheet</title> | |
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" /> | |
<style> | |
body { | |
font-family: "Inter"; | |
color: #444; | |
} | |
body a { | |
color: #444; | |
} | |
.main { | |
position: relative; | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
} | |
.bias-title, | |
.biases, | |
.bias-text, | |
.brain-image { | |
position: absolute; | |
} | |
h1 { | |
position: absolute; | |
letter-spacing: 0.5em; | |
font-size: 1.2em; | |
color: #444; | |
text-transform: uppercase; | |
text-align: center; | |
top: 0; | |
left: 0; | |
right: 0; | |
margin-left: auto; | |
margin-right: auto; | |
margin-top: 10px; | |
margin-bottom: 0; | |
padding-bottom: 0; | |
} | |
.bias-title { | |
font-size: 0.9em; | |
font-weight: 700; | |
} | |
.footer { | |
position: absolute; | |
font-weight: 600; | |
font-size: 0.6em; | |
text-transform: uppercase; | |
text-align: center; | |
top: 95%; | |
left: 0; | |
right: 0; | |
margin-left: auto; | |
margin-right: auto; | |
margin-bottom: 15px; | |
padding-bottom: 0; | |
} | |
.main-circle { | |
stroke-width: 1; | |
stroke: #c2cbca; | |
} | |
.node-0 { | |
fill: #5d969f; | |
color: #5d969f; | |
} | |
.link-0 { | |
stroke: #5d969f; | |
} | |
.node-1 { | |
fill: #7da6d2; | |
color: #7da6d2; | |
} | |
.link-1 { | |
stroke: #7da6d2; | |
} | |
.node-2 { | |
fill: #7ab439; | |
color: #7ab439; | |
} | |
.link-2 { | |
stroke: #7ab439; | |
} | |
.node-3 { | |
fill: #8c9292; | |
color: #8c9292; | |
} | |
.link-3 { | |
stroke: #8c9292; | |
} | |
.bias { | |
font-size: 9px; | |
position: absolute; | |
} | |
.bias span { | |
background: white; | |
box-shadow: 5px 0 0px 0px white, -5px 0 0px 0px white; | |
} | |
.link { | |
fill: none; | |
stroke-width: 1px; | |
} | |
</style> | |
</head> | |
<body> | |
<div class="main"> | |
<div class="biases"></div> | |
</div> | |
<!-- load the d3.js libraries --> | |
<script src="http://d3js.org/d3.v4.min.js"></script> | |
<script src="https://d3js.org/d3-hierarchy.v1.min.js"></script> | |
<script> | |
// define helper functions | |
// get the angle between two points | |
var getAngle = function(anchor, point) { | |
var a = Math.atan2(point.y - anchor.y, point.x - anchor.x); | |
if (a < 0) a += 2 * Math.PI; //angle is now in radians | |
a -= Math.PI / 2; //shift by 90deg | |
//restore value in range 0-2pi instead of -pi/2-3pi/2 | |
if (a < 0) a += 2 * Math.PI; | |
if (a < 0) a += 2 * Math.PI; | |
a = Math.abs(Math.PI * 2 - a); //invert rotation | |
a = (a * 180) / Math.PI; //convert to deg | |
return a; | |
}; | |
// rotate a point | |
var radialPoint = function(x, y) { | |
return [(y = +y) * Math.cos((x -= Math.PI / 2)), y * Math.sin(x)]; | |
}; | |
// rotate a point scaling the radius | |
var nodePoint = function(x, y, scale) { | |
return [ | |
y * Math.cos((x -= Math.PI / 2)) * scale, | |
y * Math.sin(x) * scale | |
]; | |
}; | |
// get the distance between two points | |
var getHypot = function(p1, p2) { | |
return Math.hypot(p2.x - p1.x, p2.y - p1.y); | |
}; | |
// define variables | |
var w = window.innerWidth; | |
var h = window.innerHeight; | |
var margin = { top: 25, right: 80, bottom: 20, left: 80 }, | |
width = w - margin.right - margin.left, | |
height = h - margin.top - margin.bottom; | |
var radius = (height / 2) * 0.8; | |
var center = { x: (w / 2) * 0.95, y: h / 2 }; | |
var scale = 2.3; | |
var biasWidth = 210; | |
var biasTitleWidth = 150; | |
var biasTitlesPos = [ | |
{ x: width - width / 4 + biasTitleWidth, y: height / 4 - 10 }, | |
{ | |
x: width - width / 4 + biasTitleWidth + 30, | |
y: height - height / 4 + 15 | |
}, | |
{ x: width / 4 - biasTitleWidth - 30, y: height - height / 4 }, | |
{ x: width / 4 - biasTitleWidth - 50, y: height / 4 - 30 } | |
]; | |
var footerText = `Webdev by <a href="https://github.com/tmsss" target="_blank">Tiago Santos</a> // Algorithmic layout + design by JM3 ‧ <a href="https://medium.com/@jm3" target="_blank">John Manoogian III</a> // concept + meticolous categorization by <a href="https://busterbenson.com/" target="_blank">buster benson</a> // deep research by wikipedians + far + wide`; | |
// initialize layout items | |
// initialize bias tree object | |
var tree = d3 | |
.tree() | |
.size([2 * Math.PI, (radius / scale) * 1.6]) | |
.separation(function(a, b) { | |
return (a.parent == b.parent ? 1 : 2) / a.depth; | |
}); | |
// initialize svg object | |
var svg = d3 | |
.select(".main") | |
.append("svg") | |
.attr("width", width + margin.right + margin.left) | |
.attr("height", height + margin.top + margin.bottom); | |
// insert header | |
var header = d3 | |
.select(".main") | |
.append("h1") | |
.text("Cognitive Bias Codex, 2016"); | |
// place brain image | |
var brainImage = d3 | |
.select(".main") | |
.append("img") | |
.attr( | |
"src", | |
"https://gist.githubusercontent.com/tmsss/8cab5a0c39c2435ae1be990226492936/raw/6df007d35fa5d7eaf5f3a1cd2b6a526677ffd298/brain.png" | |
) | |
.attr("class", "brain-image") | |
.attr("style", function() { | |
var width = 50 * scale * (radius / (radius * 0.8)); | |
var height = 40 * scale * (radius / (radius * 0.8)); | |
var left = center.x - width / 2; | |
var top = center.y - height / 2; | |
return `left: ${left}px; top: ${top}px; width: ${width}px; height: ${height}px`; | |
}); | |
var footer = d3 | |
.select(".main") | |
.append("div") | |
.html(footerText) | |
.attr("class", "footer"); | |
// initialize svg group object | |
var g = svg | |
.append("g") | |
.attr("transform", "translate(" + center.x + "," + center.y + ")"); | |
// load the external data | |
d3.json("data.json", function(error, data) { | |
root = data; | |
update(root); | |
}); | |
function update(source) { | |
// update data array to include id | |
Array.from(root.children).forEach(function(problem, ix) { | |
problem["id"] = ix; | |
problem.children.forEach(function(bias) { | |
bias["id"] = ix; | |
bias.children.forEach(function(value) { | |
value["id"] = ix; | |
}); | |
}); | |
}); | |
// declares a tree layout and assigns the size | |
let nodes = d3.hierarchy(root, d => d.children); | |
nodes = tree(nodes); | |
// define the tree links | |
var link = g | |
.selectAll(".link") | |
.data(nodes.links()) | |
.enter() | |
.append("path") | |
.attr("class", function(d) { | |
return "link link-" + d.target.data.id; | |
}) | |
.attr( | |
"d", | |
d3 | |
.linkRadial() | |
.angle(function(d) { | |
return d.x; | |
}) | |
.radius(function(d) { | |
return d.y; | |
}) | |
); | |
g.append("circle") | |
.attr("r", function() { | |
var nodes2Tier = nodes | |
.descendants() | |
.filter(node => node.depth == 2); | |
var p1 = nodes2Tier[0]; | |
var p2 = nodePoint(p1.x, p1.y, scale); | |
var rad = getHypot({ x: 0, y: 0 }, { x: p2[0], y: p2[1] }); | |
return rad; | |
}) | |
.style("fill", "none") | |
.attr("class", "main-circle"); | |
// create node groups | |
var node = g | |
.selectAll(".node") | |
.data(nodes.descendants()) | |
.enter() | |
.append("g") | |
.attr("class", function(d) { | |
return "node node-" + d.data.id; | |
}) | |
.attr("transform", function(d) { | |
if (d.depth == 3) { | |
return "translate(" + radialPoint(d.x, d.y) + ")"; | |
} | |
}); | |
node | |
.append("circle") | |
.attr("r", function(d) { | |
if (d.depth == 3) { | |
return 2; | |
} else if (d.depth == 2) { | |
return 5; | |
} else { | |
return 0; | |
} | |
}) | |
.attr("cx", function(d) { | |
if (d.depth == 2) { | |
var point = nodePoint(d.x, d.y, scale); | |
return point[0]; | |
} | |
}) | |
.attr("cy", function(d) { | |
if (d.depth == 2) { | |
var point = nodePoint(d.x, d.y, scale); | |
return point[1]; | |
} | |
}) | |
.attr("stroke", "white") | |
.attr("stroke-width", 1); | |
node | |
.append("text") | |
.attr("dy", "0.31em") | |
.attr("x", function(d) { | |
return d.x < Math.PI === !d.children ? 6 : -6; | |
}) | |
.attr("text-anchor", function(d) { | |
return d.x < Math.PI === !d.children ? "start" : "end"; | |
}) | |
.attr("transform", function(d) { | |
return ( | |
"rotate(" + | |
((d.x < Math.PI ? d.x - Math.PI / 2 : d.x + Math.PI / 2) * 180) / | |
Math.PI + | |
")" | |
); | |
}) | |
.text(function(d) { | |
if (d.depth == 3) { | |
return d.data.name; | |
} | |
}) | |
.style("font-size", function() { | |
var size = radius / (radius * scale); | |
return `${size.toFixed(2)}em`; | |
}); | |
d3.select(".biases").attr("style", function() { | |
return "left: " + center.x + "px; top: " + center.y + "px;"; | |
}); | |
// insert bias text | |
var bias = d3 | |
.select(".biases") | |
.selectAll(".bias") | |
.data(function() { | |
var nodesBiases = nodes | |
.descendants() | |
.filter(node => node.depth == 2); | |
return nodesBiases; | |
}) | |
.enter() | |
.append("div") | |
.attr("class", "bias") | |
.attr("style", function(d) { | |
point = nodePoint(d.x, d.y, scale); | |
var stringLen = d.data.name.length; | |
var angle = getAngle({ x: 0, y: 0 }, { x: point[0], y: point[1] }); | |
var align, left, top; | |
if (angle > 180 && angle < 360) { | |
align = "right"; | |
left = point[0] - biasWidth - 15; | |
} else { | |
align = "left"; | |
left = point[0] + 15; | |
} | |
if (stringLen > 50 && stringLen < 80) { | |
top = point[1] - 10; | |
} else if (stringLen > 80) { | |
top = point[1] - 15; | |
} else { | |
top = point[1] - 8; | |
} | |
return `left: ${left}px; top: ${top}px; text-align: ${align}; width: ${biasWidth}px;`; | |
}) | |
.append("span") | |
.text(function(d) { | |
return d.data.name; | |
}); | |
// insert bias titles | |
var biasTitle = d3 | |
.select(".main") | |
.selectAll(".bias-title") | |
.data(function() { | |
var nodeTitles = nodes | |
.descendants() | |
.filter(node => node.depth == 1); | |
return nodeTitles; | |
}) | |
.enter() | |
.append("div") | |
.attr("class", function(d) { | |
return "bias-title node-" + d.data.id; | |
}) | |
.attr("style", function(d, ix) { | |
var stringLen = d.data.name.length; | |
if (stringLen < 20) { | |
biasTitleWidth = 90; | |
} else if (stringLen > 25) { | |
biasTitleWidth = 200; | |
} | |
return `left: ${ | |
biasTitlesPos[ix].x | |
}px; top: ${biasTitlesPos[ix].y}px; width: ${biasTitleWidth}px;`; | |
}) | |
.text(function(d) { | |
return d.data.name; | |
}); | |
} | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment