---
name: behavioral-analysis
description: Political psychology, cognitive biases, group dynamics, leadership analysis, decision-making patterns for Swedish political intelligence
license: Apache-2.0
---
# Behavioral Analysis Skill
## Purpose
This skill provides comprehensive behavioral analysis methodologies for understanding political decision-making, cognitive patterns, and psychological dynamics within the Swedish Parliament. It combines political psychology research with OSINT intelligence to identify behavioral indicators, predict policy positions, and assess leadership effectiveness through evidence-based analysis of voting patterns, speech behavior, and collaboration networks.
## When to Use This Skill
Apply this skill when:
- ✅ Analyzing voting deviation patterns to understand internal party conflicts
- ✅ Identifying cognitive biases in parliamentary decision-making
- ✅ Assessing leadership styles and personality traits of political figures
- ✅ Detecting group polarization and echo chamber effects in committees
- ✅ Evaluating constituency influence on voting behavior
- ✅ Predicting policy positions based on behavioral indicators
- ✅ Conducting psychological profiling for strategic intelligence
- ✅ Analyzing coalition dynamics and negotiation patterns
- ✅ Identifying behavioral risk indicators (absenteeism, isolation, radicalization)
Do NOT use for:
- ❌ Clinical psychological diagnosis (not qualified medical assessment)
- ❌ Personal mental health speculation without public disclosure
- ❌ Behavioral profiling for harassment or discrimination
- ❌ Non-evidence-based personality claims
## Behavioral Analysis Framework
### Political Psychology Dimensions
The CIA platform analyzes five core behavioral dimensions to create comprehensive political profiles:
```mermaid
graph TB
subgraph "Behavioral Intelligence Collection"
A1["🗳️ Voting Behavior
3.5M+ votes analyzed
Deviation tracking"]
A2["👥 Social Networks
Collaboration patterns
Influence metrics"]
A3["📄 Productivity Signals
Document authorship
Committee activity"]
A4["🎤 Communication Style
Speech analysis
Rhetoric patterns"]
A5["⏱️ Temporal Patterns
Attendance trends
Engagement cycles"]
end
subgraph "Psychological Analysis"
A1 --> B1[Decision-Making Analysis]
A2 --> B2[Group Dynamics Assessment]
A3 --> B3[Motivation Evaluation]
A4 --> B4[Leadership Style Profiling]
A5 --> B5[Behavioral Consistency Check]
end
subgraph "Cognitive Bias Detection"
B1 --> C1{Confirmation Bias}
B2 --> C2{Groupthink}
B3 --> C3{Status Quo Bias}
B4 --> C4{Authority Bias}
B5 --> C5{Recency Bias}
end
subgraph "Intelligence Product"
C1 & C2 & C3 & C4 & C5 --> D["🧠 Behavioral Profile"]
D --> E[Predictive Insights]
D --> F[Risk Indicators]
D --> G[Leadership Assessment]
end
style A1 fill:#e1f5ff
style A2 fill:#e1f5ff
style A3 fill:#e1f5ff
style A4 fill:#e1f5ff
style A5 fill:#e1f5ff
style D fill:#ffe6cc
style E fill:#ccffcc
style F fill:#ffcccc
style G fill:#fff9cc
```
## 1. Voting Deviation Analysis
### Cognitive Dissonance Detection
Political psychologists recognize voting deviation as a key indicator of cognitive dissonance - when a politician's personal beliefs conflict with party expectations. The CIA platform tracks this through multi-dimensional analysis.
**Database Views:**
- `view_riksdagen_vote_data_ballot_politician_summary_daily` - Daily voting patterns
- `view_riksdagen_politician_ballot_summary` - Aggregated voting statistics
- `view_politician_behavioral_trends` - Long-term behavioral trends
- `view_riksdagen_politician_decision_pattern` - Decision pattern classification
### Party Line Conformity Analysis
```java
@Component
public class PartyConformityAnalyzer {
/**
* Analyzes voting deviation patterns to identify cognitive dissonance.
*
* High deviation indicates:
* - Internal conflict with party platform
* - Constituency pressure overriding party discipline
* - Personal ideology asserting independence
* - Strategic positioning for leadership
*/
@Transactional(readOnly = true)
public PartyConformityProfile analyzeConformity(String politicianId, String partyId) {
String sql = """
SELECT
p.person_id,
p.first_name || ' ' || p.last_name as name,
p.party as current_party,
vbs.total_votes,
vbs.won_votes,
vbs.lost_votes,
vbs.rebel_votes,
vbs.avg_vote_win_rate,
vbs.vote_effectiveness_score,
ROUND(100.0 * vbs.rebel_votes / NULLIF(vbs.total_votes, 0), 2) as deviation_rate,
-- Behavioral indicators
CASE
WHEN vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) < 0.02 THEN 'CONFORMIST'
WHEN vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) < 0.05 THEN 'MODERATE'
WHEN vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) < 0.10 THEN 'INDEPENDENT'
ELSE 'MAVERICK'
END as conformity_type,
-- Cognitive dissonance indicators
CASE
WHEN vbs.rebel_votes > 50 AND vbs.rebel_votes::float / vbs.total_votes > 0.10
THEN 'HIGH_DISSONANCE'
WHEN vbs.rebel_votes > 20 AND vbs.rebel_votes::float / vbs.total_votes > 0.05
THEN 'MODERATE_DISSONANCE'
ELSE 'LOW_DISSONANCE'
END as dissonance_level
FROM view_riksdagen_politician p
JOIN view_riksdagen_politician_ballot_summary vbs ON p.person_id = vbs.person_id
WHERE p.person_id = :politicianId
AND p.party = :partyId
""";
return jdbcTemplate.queryForObject(sql, PartyConformityProfile.class,
Map.of("politicianId", politicianId, "partyId", partyId));
}
}
```
### Psychological Profile Types
| Conformity Type | Deviation Rate | Behavioral Indicators | Strategic Implications |
|-----------------|----------------|----------------------|----------------------|
| **CONFORMIST** | < 2% | Strong party loyalty, risk-averse, hierarchical mindset | Safe coalition partner, reliable vote |
| **MODERATE** | 2-5% | Balanced independence, calculated risks | Negotiable on key issues |
| **INDEPENDENT** | 5-10% | Constituency-driven, personal ideology | Swing vote potential |
| **MAVERICK** | > 10% | Highly independent, ideological purity | Unpredictable, high-risk alliance |
## 2. Group Dynamics & Polarization
### Echo Chamber Detection
Political committees can develop echo chambers where dissenting views are suppressed. The CIA platform identifies these through collaboration pattern analysis.
```python
import pandas as pd
import networkx as nx
from typing import Dict, List, Tuple
class EchoChamberDetector:
"""
Detects echo chambers in parliamentary committees using network analysis.
Indicators of echo chambers:
- High internal connectivity, low external bridges
- Ideological homogeneity exceeding party baseline
- Resistance to cross-party collaboration
- Information isolation from opposing viewpoints
"""
def analyze_committee_network(self, committee_id: str) -> Dict:
"""
Analyzes committee collaboration networks for echo chamber indicators.
Returns metrics:
- Internal density: Collaboration within ideological cluster
- Bridge centrality: Cross-cluster information flow
- Homophily index: Ideological similarity preference
- Polarization score: Cluster separation intensity
"""
query = """
SELECT
c.org_code,
c.committee_name,
-- Network structure metrics
COUNT(DISTINCT cm.person_id) as member_count,
COUNT(DISTINCT cm.party) as party_diversity,
-- Collaboration patterns (co-authorship, co-sponsorship)
(SELECT COUNT(*)
FROM document_person dp1
JOIN document_person dp2 ON dp1.document_id = dp2.document_id
WHERE dp1.person_id IN (SELECT person_id FROM committee_member WHERE org_code = c.org_code)
AND dp2.person_id IN (SELECT person_id FROM committee_member WHERE org_code = c.org_code)
AND dp1.person_id < dp2.person_id
) as internal_collaboration,
-- Cross-party bridge activity
(SELECT COUNT(*)
FROM document_person dp1
JOIN document_person dp2 ON dp1.document_id = dp2.document_id
JOIN person p1 ON dp1.person_id = p1.person_id
JOIN person p2 ON dp2.person_id = p2.person_id
WHERE dp1.person_id IN (SELECT person_id FROM committee_member WHERE org_code = c.org_code)
AND dp2.person_id IN (SELECT person_id FROM committee_member WHERE org_code = c.org_code)
AND p1.party != p2.party
AND dp1.person_id < dp2.person_id
) as cross_party_bridges,
-- Ideological homogeneity (voting similarity)
AVG(
(SELECT AVG(
CASE WHEN v1.vote = v2.vote THEN 1.0 ELSE 0.0 END
) FROM vote v1, vote v2
WHERE v1.person_id IN (SELECT person_id FROM committee_member WHERE org_code = c.org_code)
AND v2.person_id IN (SELECT person_id FROM committee_member WHERE org_code = c.org_code)
AND v1.ballot_id = v2.ballot_id
AND v1.person_id < v2.person_id
)
) as internal_voting_similarity
FROM committee c
JOIN committee_member cm ON c.org_code = cm.org_code
WHERE c.org_code = %s
GROUP BY c.org_code, c.committee_name
"""
df = pd.read_sql(query, self.connection, params=[committee_id])
# Calculate echo chamber indicators
internal_density = df['internal_collaboration'].iloc[0] / (df['member_count'].iloc[0] ** 2)
bridge_ratio = df['cross_party_bridges'].iloc[0] / max(df['internal_collaboration'].iloc[0], 1)
homophily_index = df['internal_voting_similarity'].iloc[0]
# Echo chamber score (0-100, higher = stronger echo chamber)
echo_chamber_score = (
(internal_density * 30) +
((1 - bridge_ratio) * 30) +
(homophily_index * 40)
)
return {
'committee_id': committee_id,
'echo_chamber_score': round(echo_chamber_score, 2),
'internal_density': round(internal_density, 3),
'bridge_ratio': round(bridge_ratio, 3),
'homophily_index': round(homophily_index, 3),
'classification': self._classify_echo_chamber(echo_chamber_score)
}
def _classify_echo_chamber(self, score: float) -> str:
"""Classify echo chamber severity."""
if score >= 75:
return "SEVERE_ECHO_CHAMBER"
elif score >= 60:
return "MODERATE_ECHO_CHAMBER"
elif score >= 40:
return "MILD_POLARIZATION"
else:
return "HEALTHY_DIVERSITY"
```
### Groupthink Detection Criteria
| Indicator | Measurement | Risk Threshold | Intelligence Assessment |
|-----------|-------------|----------------|------------------------|
| **Internal Density** | Collaboration frequency within group | > 0.75 | High cohesion, low external input |
| **Bridge Ratio** | Cross-party collaboration rate | < 0.20 | Limited opposing viewpoints |
| **Homophily Index** | Voting similarity among members | > 0.85 | Ideological homogeneity |
| **Dissent Suppression** | Minority opinion frequency | < 5% | Conformity pressure |
| **Echo Chamber Score** | Composite metric | > 75 | Critical groupthink risk |
## 3. Leadership Style Profiling
### Five Leadership Dimensions
Political leadership styles significantly impact party effectiveness and coalition stability. The CIA platform classifies leaders across five dimensions based on behavioral evidence.
```java
@Service
public class LeadershipStyleAnalyzer {
/**
* Analyzes leadership effectiveness through behavioral indicators.
*
* Based on transformational leadership theory (Bass & Riggio, 2006)
* and political leadership research (Burns, 1978).
*/
public LeadershipProfile analyzeLeadership(String politicianId) {
String sql = """
WITH leadership_metrics AS (
SELECT
p.person_id,
p.first_name || ' ' || p.last_name as name,
p.party,
-- Dimension 1: Collaborative vs. Authoritarian
vim.collaboration_score,
vim.network_centrality,
-- Dimension 2: Ideological vs. Pragmatic
vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) as ideological_purity,
vbs.vote_effectiveness_score as pragmatic_success,
-- Dimension 3: Proactive vs. Reactive
COUNT(DISTINCT d.document_id) as initiated_documents,
vbs.total_votes as participation_votes,
-- Dimension 4: Consensus-builder vs. Confrontational
vim.cross_party_collaboration_score,
vbs.rebel_votes as confrontational_votes,
-- Dimension 5: Visible vs. Behind-scenes
COUNT(DISTINCT CASE WHEN d.document_type = 'motion' THEN d.document_id END) as public_initiatives,
COUNT(DISTINCT CASE WHEN d.document_type = 'interpellation' THEN d.document_id END) as oversight_activity
FROM view_riksdagen_politician p
LEFT JOIN view_riksdagen_politician_ballot_summary vbs ON p.person_id = vbs.person_id
LEFT JOIN view_riksdagen_politician_influence_metrics vim ON p.person_id = vim.person_id
LEFT JOIN view_riksdagen_politician_document d ON p.person_id = d.person_id
WHERE p.person_id = :politicianId
GROUP BY p.person_id, p.first_name, p.last_name, p.party,
vim.collaboration_score, vim.network_centrality,
vbs.rebel_votes, vbs.total_votes, vbs.vote_effectiveness_score
)
SELECT
*,
-- Leadership style classification
CASE
WHEN collaboration_score > 0.7 AND cross_party_collaboration_score > 0.6
THEN 'TRANSFORMATIONAL'
WHEN ideological_purity > 0.15 AND confrontational_votes > 100
THEN 'IDEOLOGICAL_PURIST'
WHEN pragmatic_success > 0.75 AND cross_party_collaboration_score > 0.5
THEN 'PRAGMATIC_DEALMAKER'
WHEN initiated_documents > 50 AND public_initiatives > 30
THEN 'POLICY_ENTREPRENEUR'
WHEN network_centrality > 0.8 AND collaboration_score < 0.4
THEN 'AUTHORITARIAN_BROKER'
ELSE 'BACKBENCHER'
END as leadership_style
FROM leadership_metrics
""";
return jdbcTemplate.queryForObject(sql, LeadershipProfile.class,
Map.of("politicianId", politicianId));
}
}
```
### Leadership Style Taxonomy
| Style | Behavioral Indicators | Strengths | Weaknesses | Strategic Use |
|-------|----------------------|-----------|------------|---------------|
| **TRANSFORMATIONAL** | High collaboration, cross-party bridges, inspires change | Coalition-building, reform leadership | Can compromise core values | Coalition negotiations |
| **IDEOLOGICAL_PURIST** | High deviation, confrontational, principle-driven | Policy consistency, base mobilization | Limited legislative success | Opposition leadership |
| **PRAGMATIC_DEALMAKER** | Low deviation, high effectiveness, flexible | Legislative productivity, majority-building | Perceived as lacking principles | Government formation |
| **POLICY_ENTREPRENEUR** | High document initiation, innovation-focused | Agenda-setting, thought leadership | Implementation challenges | Committee chairmanship |
| **AUTHORITARIAN_BROKER** | High centrality, low collaboration, control-oriented | Discipline enforcement, clarity | Stifles innovation, loyalty issues | Crisis management |
| **BACKBENCHER** | Low activity across all dimensions | Low-risk, loyal follower | Limited influence | Safe majority vote |
## 4. Cognitive Bias Identification
### Decision-Making Bias Framework
Political decisions are influenced by systematic cognitive biases. The CIA platform identifies these patterns through voting behavior analysis.
```python
from dataclasses import dataclass
from typing import List, Optional
from datetime import datetime, timedelta
@dataclass
class CognitiveBiasIndicators:
"""Indicators of cognitive biases in political decision-making."""
politician_id: str
confirmation_bias_score: float
status_quo_bias_score: float
authority_bias_score: float
recency_bias_score: float
availability_bias_score: float
class CognitiveBiasDetector:
"""
Identifies cognitive biases through voting pattern analysis.
Based on Kahneman & Tversky's cognitive bias research
applied to political decision-making contexts.
"""
def detect_confirmation_bias(self, politician_id: str) -> float:
"""
Detects confirmation bias: Tendency to vote with pre-existing beliefs.
Measured by:
- Consistency with historical positions
- Resistance to policy evolution despite new evidence
- Selective attention to information supporting prior stance
"""
query = """
WITH politician_voting AS (
SELECT
v.person_id,
v.vote,
b.issue_category,
b.vote_date,
LAG(v.vote) OVER (
PARTITION BY v.person_id, b.issue_category
ORDER BY b.vote_date
) as previous_vote,
LAG(b.vote_date) OVER (
PARTITION BY v.person_id, b.issue_category
ORDER BY b.vote_date
) as previous_date
FROM vote v
JOIN ballot b ON v.ballot_id = b.ballot_id
WHERE v.person_id = %s
AND b.vote_date >= NOW() - INTERVAL '4 years'
)
SELECT
person_id,
-- Consistency score: How often votes align with historical position
AVG(CASE WHEN vote = previous_vote THEN 1.0 ELSE 0.0 END) as consistency_rate,
-- Rigidity score: Resistance to policy evolution over time
COUNT(CASE WHEN vote != previous_vote
AND previous_date < vote_date - INTERVAL '1 year'
THEN 1 END)::float / COUNT(*) as evolution_resistance,
COUNT(*) as total_comparable_votes
FROM politician_voting
WHERE previous_vote IS NOT NULL
GROUP BY person_id
"""
result = pd.read_sql(query, self.connection, params=[politician_id])
if result.empty or result['total_comparable_votes'].iloc[0] < 10:
return 0.0
# Confirmation bias score: High consistency + high resistance = stronger bias
consistency_rate = result['consistency_rate'].iloc[0]
evolution_resistance = result['evolution_resistance'].iloc[0]
bias_score = (consistency_rate * 0.6) + (evolution_resistance * 0.4)
return round(bias_score * 100, 2)
def detect_status_quo_bias(self, politician_id: str) -> float:
"""
Detects status quo bias: Preference for maintaining current state.
Measured by:
- Voting against reform proposals
- Supporting incumbent policies
- Resisting change initiatives
"""
query = """
SELECT
v.person_id,
COUNT(CASE WHEN b.is_reform_proposal = TRUE AND v.vote = 'Nej' THEN 1 END)::float /
NULLIF(COUNT(CASE WHEN b.is_reform_proposal = TRUE THEN 1 END), 0) as reform_opposition_rate,
COUNT(CASE WHEN b.is_status_quo_motion = TRUE AND v.vote = 'Ja' THEN 1 END)::float /
NULLIF(COUNT(CASE WHEN b.is_status_quo_motion = TRUE THEN 1 END), 0) as status_quo_support_rate,
COUNT(*) as total_policy_votes
FROM vote v
JOIN ballot b ON v.ballot_id = b.ballot_id
WHERE v.person_id = %s
AND (b.is_reform_proposal = TRUE OR b.is_status_quo_motion = TRUE)
AND b.vote_date >= NOW() - INTERVAL '2 years'
GROUP BY v.person_id
"""
result = pd.read_sql(query, self.connection, params=[politician_id])
if result.empty or result['total_policy_votes'].iloc[0] < 5:
return 0.0
reform_opposition = result['reform_opposition_rate'].iloc[0] or 0.0
status_quo_support = result['status_quo_support_rate'].iloc[0] or 0.0
bias_score = (reform_opposition * 0.5) + (status_quo_support * 0.5)
return round(bias_score * 100, 2)
def detect_authority_bias(self, politician_id: str) -> float:
"""
Detects authority bias: Over-reliance on party leadership guidance.
Measured by:
- Voting alignment with party leadership
- Lack of independent positions
- Deference to authority figures
"""
query = """
WITH party_leader_votes AS (
SELECT
v.ballot_id,
v.vote as leader_vote
FROM vote v
JOIN person p ON v.person_id = p.person_id
WHERE p.is_party_leader = TRUE
AND p.party = (SELECT party FROM person WHERE person_id = %s)
)
SELECT
v.person_id,
COUNT(CASE WHEN v.vote = plv.leader_vote THEN 1 END)::float /
NULLIF(COUNT(*), 0) as leadership_alignment_rate,
COUNT(*) as total_votes_with_leader
FROM vote v
JOIN party_leader_votes plv ON v.ballot_id = plv.ballot_id
WHERE v.person_id = %s
GROUP BY v.person_id
"""
result = pd.read_sql(query, self.connection, params=[politician_id, politician_id])
if result.empty or result['total_votes_with_leader'].iloc[0] < 20:
return 0.0
alignment_rate = result['leadership_alignment_rate'].iloc[0]
# Authority bias score: Very high alignment suggests deference
if alignment_rate > 0.95:
return 100.0
elif alignment_rate > 0.90:
return 75.0
elif alignment_rate > 0.85:
return 50.0
else:
return round((alignment_rate - 0.70) * 200, 2) # Scale 70-85% to 0-30
def detect_recency_bias(self, politician_id: str) -> float:
"""
Detects recency bias: Disproportionate weight on recent information.
Measured by:
- Vote position changes after recent media coverage
- Inconsistency with long-term stance based on recent events
- Rapid policy shifts following public attention
"""
query = """
WITH recent_votes AS (
SELECT
v.person_id,
v.vote,
b.issue_category,
b.vote_date,
CASE WHEN b.vote_date >= NOW() - INTERVAL '90 days' THEN 'recent'
WHEN b.vote_date >= NOW() - INTERVAL '1 year' THEN 'medium_term'
ELSE 'historical' END as time_period
FROM vote v
JOIN ballot b ON v.ballot_id = b.ballot_id
WHERE v.person_id = %s
AND b.vote_date >= NOW() - INTERVAL '3 years'
),
consistency_analysis AS (
SELECT
person_id,
issue_category,
AVG(CASE WHEN time_period = 'recent' AND vote = 'Ja' THEN 1.0 ELSE 0.0 END) as recent_support,
AVG(CASE WHEN time_period = 'historical' AND vote = 'Ja' THEN 1.0 ELSE 0.0 END) as historical_support
FROM recent_votes
GROUP BY person_id, issue_category
HAVING COUNT(CASE WHEN time_period = 'recent' THEN 1 END) >= 3
AND COUNT(CASE WHEN time_period = 'historical' THEN 1 END) >= 5
)
SELECT
person_id,
AVG(ABS(recent_support - historical_support)) as avg_shift_magnitude,
COUNT(*) as analyzed_categories
FROM consistency_analysis
WHERE ABS(recent_support - historical_support) > 0.20 -- Significant shift threshold
GROUP BY person_id
"""
result = pd.read_sql(query, self.connection, params=[politician_id])
if result.empty or result['analyzed_categories'].iloc[0] < 3:
return 0.0
shift_magnitude = result['avg_shift_magnitude'].iloc[0]
# Recency bias score: Larger shifts = stronger bias
bias_score = min(shift_magnitude * 150, 100) # Cap at 100
return round(bias_score, 2)
```
### Cognitive Bias Risk Matrix
| Bias Type | Detection Method | Risk Threshold | Behavioral Impact | Intelligence Use |
|-----------|------------------|----------------|-------------------|------------------|
| **Confirmation Bias** | Historical vote consistency | > 85% | Ignores contradictory evidence | Predict resistance to new information |
| **Status Quo Bias** | Reform opposition rate | > 70% | Blocks necessary change | Identify reform obstacles |
| **Authority Bias** | Leadership alignment | > 90% | Lacks independent judgment | Predict via party leadership |
| **Recency Bias** | Vote shift magnitude after events | > 30% shift | Overreacts to recent news | Exploit timing of proposals |
| **Availability Bias** | Media-salient issue focus | > 60% media-driven | Ignores non-salient issues | Assess media manipulation vulnerability |
## 5. Constituency Influence Analysis
### Electoral Pressure Indicators
Politicians balance party loyalty with constituency demands. The CIA platform measures this tension through deviation analysis correlated with electoral data.
```sql
-- Constituency Influence Scoring
WITH constituency_characteristics AS (
SELECT
er.election_region_id,
er.region_name,
er.population,
er.urban_rural_classification,
er.median_income,
er.education_level,
-- Electoral competitiveness (closer races = more pressure)
er.winning_margin_percentage,
CASE
WHEN er.winning_margin_percentage < 5 THEN 'MARGINAL_SEAT'
WHEN er.winning_margin_percentage < 10 THEN 'COMPETITIVE_SEAT'
ELSE 'SAFE_SEAT'
END as seat_classification,
-- Ideological distance from party median
er.constituency_ideology_score,
p.party_ideology_score,
ABS(er.constituency_ideology_score - p.party_ideology_score) as ideological_distance
FROM election_region er
JOIN party p ON er.winning_party = p.party_id
),
politician_constituency_behavior AS (
SELECT
pol.person_id,
pol.first_name || ' ' || pol.last_name as name,
pol.party,
pol.constituency_id,
cc.seat_classification,
cc.ideological_distance,
-- Voting behavior
vbs.rebel_votes,
vbs.total_votes,
vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) as deviation_rate,
-- Document activity reflecting constituency concerns
COUNT(DISTINCT pd.document_id) as constituency_documents,
-- Constituency influence score
CASE
WHEN cc.seat_classification = 'MARGINAL_SEAT'
AND cc.ideological_distance > 15
AND vbs.rebel_votes::float / vbs.total_votes > 0.05
THEN 'HIGH_CONSTITUENCY_INFLUENCE'
WHEN cc.seat_classification = 'COMPETITIVE_SEAT'
AND vbs.rebel_votes::float / vbs.total_votes > 0.03
THEN 'MODERATE_CONSTITUENCY_INFLUENCE'
WHEN cc.seat_classification = 'SAFE_SEAT'
AND vbs.rebel_votes::float / vbs.total_votes < 0.02
THEN 'PARTY_DISCIPLINE_DOMINANT'
ELSE 'BALANCED_INFLUENCE'
END as influence_classification
FROM view_riksdagen_politician pol
JOIN constituency_characteristics cc ON pol.constituency_id = cc.election_region_id
JOIN view_riksdagen_politician_ballot_summary vbs ON pol.person_id = vbs.person_id
LEFT JOIN view_riksdagen_politician_document pd ON pol.person_id = pd.person_id
GROUP BY pol.person_id, pol.first_name, pol.last_name, pol.party, pol.constituency_id,
cc.seat_classification, cc.ideological_distance,
vbs.rebel_votes, vbs.total_votes, pd.document_id
)
SELECT
person_id,
name,
party,
seat_classification,
deviation_rate,
influence_classification,
-- Strategic intelligence assessment
CASE
WHEN influence_classification = 'HIGH_CONSTITUENCY_INFLUENCE'
THEN 'Target for constituency-based persuasion campaigns'
WHEN influence_classification = 'PARTY_DISCIPLINE_DOMINANT'
THEN 'Requires party leadership negotiation'
ELSE 'Balanced approach needed'
END as strategic_approach
FROM politician_constituency_behavior
ORDER BY deviation_rate DESC, ideological_distance DESC;
```
## 6. Behavioral Risk Indicators
### Comprehensive Risk Profiling
The CIA platform integrates behavioral indicators with Drools risk rules to create comprehensive risk profiles. These profiles predict potential accountability failures.
**Risk Rules Integration:**
- **PoliticianLazy.drl** - Absenteeism indicating disengagement
- **PoliticianIneffectiveVoting.drl** - Chronic minority voting
- **PartyRebelVoting.drl** - Excessive deviation indicating instability
- **CommitteeInactive.drl** - Committee withdrawal patterns
```java
@Component
public class BehavioralRiskAssessment {
/**
* Comprehensive behavioral risk assessment integrating multiple indicators.
*
* Risk dimensions:
* 1. Engagement risk (absenteeism, withdrawal)
* 2. Effectiveness risk (minority voting, low productivity)
* 3. Stability risk (high deviation, erratic patterns)
* 4. Collaboration risk (isolation, network periphery)
* 5. Cognitive risk (bias indicators, decision-making quality)
*/
public ComprehensiveRiskProfile assessBehavioralRisks(String politicianId) {
String sql = """
SELECT
p.person_id,
p.first_name || ' ' || p.last_name as name,
p.party,
-- Engagement Risk Indicators
vbs_daily.avg_absent_percentage as daily_absence_rate,
vbs_monthly.avg_absent_percentage as monthly_absence_rate,
vbs_annual.avg_absent_percentage as annual_absence_rate,
-- Effectiveness Risk Indicators
vbs.vote_effectiveness_score,
vbs.avg_vote_win_rate,
vbs.lost_votes::float / NULLIF(vbs.total_votes, 0) as loss_rate,
-- Stability Risk Indicators
vbs.rebel_votes,
vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) as deviation_rate,
STDDEV(CASE WHEN v.vote != p.party_vote THEN 1 ELSE 0 END) as deviation_volatility,
-- Collaboration Risk Indicators
vim.collaboration_score,
vim.network_centrality,
vim.cross_party_collaboration_score,
-- Productivity Indicators
COUNT(DISTINCT pd.document_id) as total_documents,
-- Overall Risk Score (0-100, higher = higher risk)
(
COALESCE(vbs_annual.avg_absent_percentage, 0) * 0.25 +
COALESCE((1 - vbs.vote_effectiveness_score) * 100, 0) * 0.25 +
COALESCE(vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) * 100, 0) * 0.20 +
COALESCE((1 - vim.collaboration_score) * 100, 0) * 0.15 +
COALESCE((1 - vim.network_centrality) * 100, 0) * 0.15
) as composite_risk_score,
-- Risk Classification
CASE
WHEN (
COALESCE(vbs_annual.avg_absent_percentage, 0) * 0.25 +
COALESCE((1 - vbs.vote_effectiveness_score) * 100, 0) * 0.25 +
COALESCE(vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) * 100, 0) * 0.20 +
COALESCE((1 - vim.collaboration_score) * 100, 0) * 0.15 +
COALESCE((1 - vim.network_centrality) * 100, 0) * 0.15
) >= 70 THEN 'CRITICAL_RISK'
WHEN (
COALESCE(vbs_annual.avg_absent_percentage, 0) * 0.25 +
COALESCE((1 - vbs.vote_effectiveness_score) * 100, 0) * 0.25 +
COALESCE(vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) * 100, 0) * 0.20 +
COALESCE((1 - vim.collaboration_score) * 100, 0) * 0.15 +
COALESCE((1 - vim.network_centrality) * 100, 0) * 0.15
) >= 50 THEN 'HIGH_RISK'
WHEN (
COALESCE(vbs_annual.avg_absent_percentage, 0) * 0.25 +
COALESCE((1 - vbs.vote_effectiveness_score) * 100, 0) * 0.25 +
COALESCE(vbs.rebel_votes::float / NULLIF(vbs.total_votes, 0) * 100, 0) * 0.20 +
COALESCE((1 - vim.collaboration_score) * 100, 0) * 0.15 +
COALESCE((1 - vim.network_centrality) * 100, 0) * 0.15
) >= 30 THEN 'MODERATE_RISK'
ELSE 'LOW_RISK'
END as risk_classification
FROM view_riksdagen_politician p
LEFT JOIN view_riksdagen_politician_ballot_summary vbs ON p.person_id = vbs.person_id
LEFT JOIN view_riksdagen_vote_data_ballot_politician_summary_daily vbs_daily ON p.person_id = vbs_daily.person_id
LEFT JOIN view_riksdagen_vote_data_ballot_politician_summary_monthly vbs_monthly ON p.person_id = vbs_monthly.person_id
LEFT JOIN view_riksdagen_vote_data_ballot_politician_summary_annual vbs_annual ON p.person_id = vbs_annual.person_id
LEFT JOIN view_riksdagen_politician_influence_metrics vim ON p.person_id = vim.person_id
LEFT JOIN view_riksdagen_politician_document pd ON p.person_id = pd.person_id
LEFT JOIN vote v ON p.person_id = v.person_id
WHERE p.person_id = :politicianId
GROUP BY p.person_id, p.first_name, p.last_name, p.party,
vbs_daily.avg_absent_percentage, vbs_monthly.avg_absent_percentage,
vbs_annual.avg_absent_percentage, vbs.vote_effectiveness_score,
vbs.avg_vote_win_rate, vbs.lost_votes, vbs.total_votes,
vbs.rebel_votes, vim.collaboration_score, vim.network_centrality,
vim.cross_party_collaboration_score
""";
return jdbcTemplate.queryForObject(sql, ComprehensiveRiskProfile.class,
Map.of("politicianId", politicianId));
}
}
```
## ISMS Compliance Mapping
### ISO 27001:2022 Controls
| Control | Behavioral Analysis Application |
|---------|-------------------------------|
| **A.5.1 - Policies for information security** | Apply behavioral analysis to detect policy violations and non-compliance patterns |
| **A.5.15 - Access control** | Behavioral profiling for insider threat detection and access privilege monitoring |
| **A.8.16 - Monitoring activities** | Continuous behavioral monitoring for anomaly detection |
| **A.8.23 - Web filtering** | Analyze access patterns to identify unauthorized information seeking |
### NIST Cybersecurity Framework 2.0
| Function | Behavioral Analysis Integration |
|----------|-------------------------------|
| **IDENTIFY (ID.AM)** | Behavioral profiling of personnel with access to sensitive political intelligence |
| **DETECT (DE.CM)** | Continuous monitoring for anomalous behavior patterns |
| **RESPOND (RS.AN)** | Behavioral analysis to assess incident response effectiveness |
### CIS Controls v8
| Control | Application |
|---------|-------------|
| **CIS Control 6 - Access Control Management** | Apply behavioral risk assessment to access privilege decisions |
| **CIS Control 8 - Audit Log Management** | Behavioral analysis of audit log patterns |
## Hack23 ISMS Policy References
This skill implements requirements from:
- **[Secure Development Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Secure_Development_Policy.md)** - Intelligence analysis quality standards
- **[Information Security Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Information_Security_Policy.md)** - Data ethics in behavioral analysis
- **[Access Control Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Access_Control_Policy.md)** - Behavioral risk-based access decisions
- **[Privacy Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Privacy_Policy.md)** - GDPR-compliant behavioral profiling
- **[Threat Modeling](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Threat_Modeling.md)** - Insider threat behavioral indicators
## References
### Political Psychology Literature
1. **Kahneman, D., & Tversky, A. (1979)**. "Prospect Theory: An Analysis of Decision under Risk." *Econometrica*, 47(2), 263-291.
2. **Bass, B. M., & Riggio, R. E. (2006)**. *Transformational Leadership* (2nd ed.). Psychology Press.
3. **Burns, J. M. (1978)**. *Leadership*. Harper & Row.
4. **Janis, I. L. (1982)**. *Groupthink: Psychological Studies of Policy Decisions and Fiascoes*. Houghton Mifflin.
5. **Tetlock, P. E. (2005)**. *Expert Political Judgment: How Good Is It? How Can We Know?* Princeton University Press.
### Database Intelligence Sources
- **[DATABASE_VIEW_INTELLIGENCE_CATALOG.md](../../DATABASE_VIEW_INTELLIGENCE_CATALOG.md)** - Complete view documentation
- **[RISK_RULES_INTOP_OSINT.md](../../RISK_RULES_INTOP_OSINT.md)** - Risk rule specifications
- **[DATA_ANALYSIS_INTOP_OSINT.md](../../DATA_ANALYSIS_INTOP_OSINT.md)** - Analysis frameworks
- **[INTELLIGENCE_DATA_FLOW.md](../../INTELLIGENCE_DATA_FLOW.md)** - Data flow mapping
### Swedish Political Context
- **Swedish Parliament (Riksdagen)** - Official documentation of parliamentary procedures
- **V-Dem Institute** - Democracy measurement and behavioral indicators
- **Swedish Election Authority** - Electoral competitiveness data