As data scientists and R developers, we’re trained to think systematically, explore data thoroughly, and validate our assumptions. But here’s a reality check: your dashboard users don’t think like you do.
Consider this scenario: - You see: A well-organized dashboard with 15 filters, 8 visualizations, and comprehensive data coverage - Your users see: An overwhelming interface where they can’t find what they need quickly
This isn’t because your users are less intelligent; it’s because they’re human, and humans have predictable cognitive patterns that affect how they process information.
Think of human attention like computer memory: limited and easily overloaded.
# Explore cognitive load concepts
cognitive_concepts <- bid_concepts("cognitive")
cognitive_concepts |>
select(concept, description, implementation_tips) |>
head(3)
For dashboards, this means:
Practical example:
# Instead of showing all 12 KPIs at once:
# kpi_grid <- layout_columns(
# value_box("Revenue", "$1.2M", icon = "currency-dollar"),
# value_box("Customers", "15,432", icon = "people"),
# # ... 10 more value boxes
# )
# Show key metrics first, details on demand:
kpi_summary <- layout_columns(
col_widths = c(8, 4),
card(
card_header("Key Performance Summary"),
value_box("Primary Goal", "$1.2M Revenue", icon = "target"),
p("vs. $980K target (+22%)")
),
card(
card_header("Details"),
actionButton(
"show_details",
"View All Metrics",
class = "btn-outline-primary"
)
)
)
Humans over-rely on the first piece of information they see. In data dashboards, this means the first number shown becomes a reference point for everything else.
Dashboard implication:
If you show “Sales: $50K” first, users will judge all subsequent numbers relative to $50K, even if it’s not the most important metric.
Solution pattern:
# Provide context and reference points
sales_card <- card(
card_header("Monthly Sales Performance"),
layout_columns(
value_box(
title = "This Month",
value = "$87K",
showcase = bs_icon("graph-up"),
theme = "success"
),
div(
p("Previous month: $65K", style = "color: #666; margin: 0;"),
p("Target: $80K", style = "color: #666; margin: 0;"),
p(strong("vs. Target: +9%"), style = "color: #28a745;")
)
)
)
The same data can be interpreted completely differently based on how it’s presented.
Example: Customer satisfaction of 73%
# Negative frame (emphasizes problems)
satisfaction_negative <- value_box(
"Customer Issues",
"27% Unsatisfied",
icon = "exclamation-triangle",
theme = "danger"
)
# Positive frame (emphasizes success)
satisfaction_positive <- value_box(
"Customer Satisfaction",
"73% Satisfied",
icon = "heart-fill",
theme = "success"
)
# Balanced frame (shows progress)
satisfaction_balanced <- card(
card_header("Customer Satisfaction Progress"),
value_box("Current Level", "73%"),
p("Improvement needed: 17 percentage points to reach 90% target")
)
Research shows that too many choices lead to decision paralysis and user dissatisfaction.
The data scientist instinct:
“Let’s give them 20 different chart types and 15 filters so they can explore any question!”
The user reality:
Better approach:
# Instead of 15 filters visible at once
ui_complex <- div(
selectInput("region", "Region", choices = regions),
selectInput("product", "Product", choices = products),
selectInput("channel", "Channel", choices = channels),
# ... 12 more filters
)
# Use progressive disclosure
ui_simple <- div(
# Show only the most common filters first
selectInput("time_period", "Time Period", choices = time_options),
selectInput("metric", "Primary Metric", choices = key_metrics),
# Advanced filters behind a toggle
accordion(
accordion_panel(
"Advanced Filters",
icon = bs_icon("sliders"),
selectInput("region", "Region", choices = regions),
selectInput("product", "Product", choices = products)
# Additional filters here
)
)
)
You already know how to test hypotheses with data. Apply the same rigor to UX decisions:
# Your typical A/B test
results <- t.test(
treatment_group$conversion_rate,
control_group$conversion_rate
)
# UX equivalent: Test interface variations
dashboard_test <- list(
control = "Current 5-chart overview page",
treatment = "Redesigned with progressive disclosure"
)
# Measure: task completion time, user satisfaction, error rates
# Analyze: same statistical rigor you'd apply to any experiment
Just as you validate data quality, validate that your interface matches user expectations:
# Document user mental models like you document data assumptions
user_assumptions <- bid_interpret(
central_question = "How do sales managers think about performance?",
data_story = list(
hook = "Sales managers need quick performance insights",
context = "They have 15 minutes between meetings",
tension = "Current reports take too long to interpret",
resolution = "Provide immediate visual context with drill-down capability"
)
)
# Validate these assumptions like you'd validate data quality
summary(user_assumptions)
The BID framework gives you a systematic way to apply behavioral science, similar to how you approach data analysis:
bid_concepts()
to explore one behavioral principle at a
time# Explore available concepts by category
all_concepts <- bid_concepts()
table(all_concepts$category)
# Start with these fundamental concepts for data dashboards
starter_concepts <- c(
"Cognitive Load Theory",
"Anchoring Effect",
"Processing Fluency",
"Progressive Disclosure"
)
for (concept in starter_concepts) {
cat("\n### ", concept, "\n")
info <- bid_concept(concept)
cat(info$description[1], "\n")
cat("Implementation:", info$implementation_tips[1], "\n")
}
Understanding user cognition makes you a more complete data professional:
Remember: The best analysis in the world is worthless if users can’t understand and act on it. Behavioral science helps bridge that gap.
bid_concepts()
to explore all available behavioral
science conceptsgetting-started
vignette for hands-on BID
framework practicetelemetry-integration
vignette to measure
the impact of your UX improvementsThe goal isn’t to become a UX expert; it’s to apply your analytical thinking to user experience and create more effective data products.