Introduction and the database

The primary objective of this research is to examine the determinants of subjective economic well-being across European populations using data from the European Social Survey (ESS) Round 11. By employing association rule mining, (the Apriori algorithm), this study aims to discover the relationships between demographic backgrounds, psychological health, and social capital that define one’s perception of their financial situation.

To ensure the statistical validity, the dataset underwent necessary preprocessing. The central variable, representing the respondents’ feelings about their current income, was filtered to include only valid responses and transformed into a scale ranging from “Comfortable” to “Very difficult.” Furthermore, the educational data was recoded into a simplified categorical framework.

#filtering for hincfel
data_clean <- data %>%
  filter(hincfel >= 1 & hincfel <= 4) %>%
  mutate(hincfel = factor(hincfel, 
                          levels = c(1, 2, 3, 4),
                          labels = c("Comfortable", "Coping", "Difficult", "Very_difficult")))

data_clean <- data_clean %>%
  mutate(edu_cat = case_when(
    edulvlb == 0 ~ "Less than primary",
    edulvlb >= 113 & edulvlb <= 223 ~ "Primary",
    edulvlb >= 229 & edulvlb <= 423 ~ "Secondary",
    edulvlb >= 510 & edulvlb <= 800 ~ "Higher",
    TRUE ~ NA_character_
  )) %>%
  mutate(edu_cat = factor(edu_cat, levels = c("Less than primary", "Primary", "Secondary", "Higher")))

Subsets

The analytical framework was structured by selecting a broad range of socio-economic and psychological factors, which were categorized into three thematic subsets: Demography & Occupation, Health & Well-being, and Social Capital & Trust. By isolating these categories, we can manage the high dimensionality of the European Social Survey data and ensure that the resulting association rules are both theoretically grounded and easier to interpret. The complete list of variables used in this study is in the table below.

List of Variables by Thematic Subset
Thematic Subset Variable Name Variable Description
Demography & Occupation
Demography & Occupation hincfel Feeling about household’s income nowadays (Target Variable)
Demography & Occupation gndr Gender of the respondent
Demography & Occupation agegroup Age group (categorized)
Demography & Occupation edu_cat Highest level of education (recoded)
Demography & Occupation domicil Type of residential area
Demography & Occupation mainact Main activity status
Demography & Occupation uemp3m Ever unemployed and seeking work for 3 months or more
Health & Well-being
Health & Well-being health Subjective general health
Health & Well-being happy Subjective happiness level
Health & Well-being slprl Sleep restless
Health & Well-being aesfdrk Feeling of safety walking alone in local area after dark
Health & Well-being fltdpr How often felt depressed in the past week
Health & Well-being flteeff How often felt that everything was an effort
Health & Well-being fltlnl How often felt lonely
Health & Well-being enjlf How often enjoyed life
Health & Well-being pray How often pray
Social Capital & Trust
Health & Well-being hincfel_dup Feeling about income (Target Variable)
Social Capital & Trust ppltrst Trust in other people
Social Capital & Trust pplfair Most people try to be fair
Social Capital & Trust pplhlp Most people try to be helpful
Social Capital & Trust sclmeet Frequency of social meetings
Social Capital & Trust stfeco Satisfaction with the national economy
Social Capital & Trust stfgov Satisfaction with the national government
Social Capital & Trust stfdem Satisfaction with democracy in the country
Social Capital & Trust trstprl Trust in the national parliament
Social Capital & Trust trstplt Trust in politicians
Social Capital & Trust trstprt Trust in political parties
Social Capital & Trust trstlgl Trust in the legal system
Social Capital & Trust trstplc Trust in the police
Social Capital & Trust trstep Trust in the European Parliament
Social Capital & Trust trstun Trust in the United Nations
#demography and occupation variables
subset_demographic <- data_clean %>%
  filter(
    domicil >= 1 & domicil <= 5,
    mainact >= 1 & mainact <= 9, 
    uemp3m >= 1 & uemp3m <= 2,
    agegroup >= 1 & agegroup <= 7,
    gndr >= 1 & gndr <= 2
  ) %>%
  dplyr::select(hincfel, gndr, agegroup, edu_cat, domicil, mainact, uemp3m) %>%
  mutate(across(everything(), as.factor)) %>%
  na.omit()

#health, well-being
subset_health_wellbeing <- data_clean %>%
  filter(
    health >= 1 & health <= 5,
    happy  >= 0 & happy <= 10,   
    slprl  >= 1 & slprl <= 4,
    aesfdrk >= 1 & aesfdrk <= 4,
    fltdpr >= 1 & fltdpr <= 4,
    flteeff >= 1 & flteeff <= 4,
    fltlnl >= 1 & fltlnl <= 4,
    enjlf  >= 1 & enjlf <= 4,
    pray   >= 1 & pray <= 7
  ) %>%
  dplyr::select(
    hincfel, health, happy, slprl, aesfdrk, 
    fltdpr, flteeff, fltlnl, enjlf, pray
  ) %>%
  mutate(across(everything(), as.factor)) %>%
  na.omit()


#social capital and trust variables
subset_trust_society <- data_clean %>%
  filter(
    across(c(ppltrst, pplfair, pplhlp, stfeco, stfgov, stfdem, 
             trstprl, trstplt, trstprt, trstlgl, trstplc, trstep, trstun), 
           ~ . >= 0 & . <= 10),
    sclmeet >= 1 & sclmeet <= 7
  ) %>%
  dplyr::select(hincfel, ppltrst, pplfair, pplhlp, sclmeet, stfeco, stfgov, stfdem, 
                trstprl, trstplt, trstprt, trstlgl, trstplc, trstep, trstun) %>%
  mutate(across(everything(), as.factor)) %>%
  na.omit()

Apriori

Exploratory analysis

First, a visual representation of distribution of subjective opinions about respondents’ household income showed that the most frequent responses are Comfortable and Coping.

#hincfel distribution
ggplot(data_clean, aes(x = hincfel)) +
  geom_bar(fill = "steelblue", alpha = 0.8) +
  geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5, size = 4) +
  theme_minimal() +
  labs(
    title = "How do Europeans feel about their income?",
    x = "", 
    y = "Number of respondents"
  ) +
  theme(plot.title = element_text(face = "bold"))

Frequency of items

Demographic
#item frequency plot
itemFrequencyPlot(as(subset_demographic, "transactions"), 
                  topN = 20, 
                  col = "skyblue", 
                  main = "Top 20 Most Frequent Items (Demographic Subset)",
                  type = "absolute")

Health and wellbeing
itemFrequencyPlot(as(subset_health_wellbeing, "transactions"), 
                  topN = 20, 
                  col = "skyblue", 
                  main = "Top 20 Most Frequent Items (Health Subset)",
                  type = "absolute")

Trust
itemFrequencyPlot(as(subset_trust_society, "transactions"), 
                  topN = 20, 
                  col = "skyblue", 
                  main = "Top 20 Most Frequent Items (Trust Subset)",
                  type = "absolute")

Implementation of Apriori

The data from each subset was converted into transactional objects. To uncover the relationships between these features and the subjective perception of income, the Apriori algorithm was applied to each subset with a minimum support threshold of 0.005 and a confidence level of 0.5. The algorithm was specifically constrained to treat the categories of the hincfel variable as the consequent (RHS). Redundant rules were removed

#transactional datasets
trans_demog <- as(subset_demographic, "transactions")
trans_health <- as(subset_health_wellbeing, "transactions")
trans_trust <- as(subset_trust_society, "transactions")


#rules demog
rules_demog <- apriori(subset_demographic, 
                       parameter = list(supp = 0.005, conf = 0.5, minlen = 2),
                       appearance = list(rhs = c("hincfel=Comfortable", "hincfel=Coping", 
                                                 "hincfel=Difficult", "hincfel=Very_difficult"),
                                         default = "lhs"))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5   0.005      2
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 29 
## 
## set item appearances ...[4 item(s)] done [0.00s].
## set transactions ...[33 item(s), 5979 transaction(s)] done [0.00s].
## sorting and recoding items ... [32 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 5 6 7 done [0.00s].
## writing ... [432 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
#health rules
rules_health <- apriori(subset_health_wellbeing, 
                        parameter = list(supp = 0.005, conf = 0.5, minlen = 2),
                        appearance = list(rhs = c("hincfel=Comfortable", "hincfel=Coping", 
                                                  "hincfel=Difficult", "hincfel=Very_difficult"),
                                          default = "lhs"))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5   0.005      2
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 236 
## 
## set item appearances ...[4 item(s)] done [0.00s].
## set transactions ...[51 item(s), 47213 transaction(s)] done [0.02s].
## sorting and recoding items ... [50 item(s)] done [0.00s].
## creating transaction tree ... done [0.01s].
## checking subsets of size 1 2 3 4 5 6 7 8 9 done [0.11s].
## writing ... [3512 rule(s)] done [0.00s].
## creating S4 object  ... done [0.01s].
#trust rules
rules_trust <- apriori(subset_trust_society, 
                       parameter = list(supp = 0.005, conf = 0.5, minlen = 2),
                       appearance = list(rhs = c("hincfel=Comfortable", "hincfel=Coping", 
                                                 "hincfel=Difficult", "hincfel=Very_difficult"),
                                         default = "lhs"))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5   0.005      2
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 209 
## 
## set item appearances ...[4 item(s)] done [0.00s].
## set transactions ...[154 item(s), 41816 transaction(s)] done [0.02s].
## sorting and recoding items ... [154 item(s)] done [0.00s].
## creating transaction tree ... done [0.01s].
## checking subsets of size 1 2 3 4 5 6 7 8 9 10
##  done [0.20s].
## writing ... [1005 rule(s)] done [0.00s].
## creating S4 object  ... done [0.01s].
rules_demog <- rules_demog[!is.redundant(rules_demog)]
rules_health <- rules_health[!is.redundant(rules_health)]
rules_trust <- rules_trust[!is.redundant(rules_trust)]

Rules

The generated association rules are presented separately for each of the three thematic categories.

Demographic

The best rules by lift in this category are the one with “Difficult” as their RHS. The best one is {gndr=2,edu_cat=Secondary,mainact=3,uemp3m=2}, which means women with secondary education who are currently unemployed have 66.7% probability (0.667 confidence) of feeling “Difficult” about their household income.

inspectDT(rules_demog)

Health and wellbeing

Individuals who report very good health, an extremely high happiness and safety level, who never feel depressed nor lonely and never pray are more twice as likely than an average respondent to feel comfortable with their household income. An interesting observation is that the high heppiness and never praying occurs often in the rules.

inspectDT(rules_health)

Trust

The first rule by lift identifies individuals who perceive others as generally fair (pplfair=8), maintain a high frequency of social meetings (sclmeet=6), and possess a moderate trust in political parties (trstprt=6). This profile has a 67% probability (Confidence = 0.670) of reporting a “Comfortable” financial status, with a Lift of 2.046, indicating they are twice as likely to feel financially secure than the average respondent.

inspectDT(rules_trust)

All

rules_all_categories <- c(rules_demog, rules_health, rules_trust)
rules_all_categories <- rules_all_categories[!is.redundant(rules_all_categories)]
inspectDT(rules_all_categories)   

Top 10 rules for difficult and comfortable

Even with very low minimum confidence and support parameters, the rules for a “Very Difficult” situation don’t occur.

# Top 10 for very difficult
rules_poverty_final <- subset(rules_all_categories, rhs %in% "hincfel=Difficult")
top10_poverty <- head(sort(rules_poverty_final, by = "lift"), 10)

# Top 10 for comfortable
rules_success_final <- subset(rules_all_categories, rhs %in% "hincfel=Comfortable")
top10_success <- head(sort(rules_success_final, by = "lift"), 10)

inspect(top10_poverty)
##      lhs                     rhs                     support confidence    coverage     lift count
## [1]  {gndr=2,                                                                                     
##       edu_cat=Secondary,                                                                          
##       mainact=3,                                                                                  
##       uemp3m=2}           => {hincfel=Difficult} 0.005686570  0.6666667 0.008529854 4.096608    34
## [2]  {gndr=2,                                                                                     
##       edu_cat=Secondary,                                                                          
##       mainact=4,                                                                                  
##       uemp3m=2}           => {hincfel=Difficult} 0.005184814  0.5961538 0.008697107 3.663313    31
## [3]  {gndr=2,                                                                                     
##       mainact=3,                                                                                  
##       uemp3m=2}           => {hincfel=Difficult} 0.006522830  0.5909091 0.011038635 3.631085    39
## [4]  {edu_cat=Secondary,                                                                          
##       mainact=4,                                                                                  
##       uemp3m=2}           => {hincfel=Difficult} 0.009031611  0.5869565 0.015387188 3.606797    54
## [5]  {gndr=2,                                                                                     
##       mainact=4,                                                                                  
##       uemp3m=2}           => {hincfel=Difficult} 0.006188326  0.5606061 0.011038635 3.444875    37
## [6]  {edu_cat=Secondary,                                                                          
##       mainact=3,                                                                                  
##       uemp3m=2}           => {hincfel=Difficult} 0.007359090  0.5500000 0.013380164 3.379702    44
## [7]  {mainact=4,                                                                                  
##       uemp3m=2}           => {hincfel=Difficult} 0.011205887  0.5403226 0.020739254 3.320235    67
## [8]  {gndr=2,                                                                                     
##       edu_cat=Secondary,                                                                          
##       mainact=3}          => {hincfel=Difficult} 0.007024586  0.5384615 0.013045660 3.308799    42
## [9]  {domicil=3,                                                                                  
##       mainact=3}          => {hincfel=Difficult} 0.007359090  0.5301205 0.013881920 3.257544    44
## [10] {mainact=3,                                                                                  
##       uemp3m=2}           => {hincfel=Difficult} 0.009031611  0.5242718 0.017226961 3.221605    54
inspect(top10_success)
##      lhs             rhs                       support confidence    coverage     lift count
## [1]  {health=1,                                                                             
##       happy=9,                                                                              
##       aesfdrk=1,                                                                            
##       fltdpr=1,                                                                             
##       flteeff=1,                                                                            
##       fltlnl=1,                                                                             
##       pray=7}     => {hincfel=Comfortable} 0.006608349  0.7518072 0.008789952 2.343683   312
## [2]  {health=1,                                                                             
##       happy=9,                                                                              
##       aesfdrk=1,                                                                            
##       flteeff=1,                                                                            
##       fltlnl=1,                                                                             
##       pray=7}     => {hincfel=Comfortable} 0.007053142  0.7516930 0.009383009 2.343327   333
## [3]  {health=1,                                                                             
##       happy=9,                                                                              
##       aesfdrk=1,                                                                            
##       fltdpr=1,                                                                             
##       flteeff=1,                                                                            
##       pray=7}     => {hincfel=Comfortable} 0.007010781  0.7488688 0.009361828 2.334522   331
## [4]  {health=1,                                                                             
##       happy=9,                                                                              
##       aesfdrk=1,                                                                            
##       flteeff=1,                                                                            
##       pray=7}     => {hincfel=Comfortable} 0.007540296  0.7478992 0.010081969 2.331500   356
## [5]  {happy=9,                                                                              
##       aesfdrk=1,                                                                            
##       fltdpr=1,                                                                             
##       flteeff=1,                                                                            
##       enjlf=4,                                                                              
##       pray=7}     => {hincfel=Comfortable} 0.007159045  0.7300216 0.009806621 2.275768   338
## [6]  {health=1,                                                                             
##       happy=9,                                                                              
##       slprl=1,                                                                              
##       aesfdrk=1,                                                                            
##       fltdpr=1,                                                                             
##       fltlnl=1,                                                                             
##       pray=7}     => {hincfel=Comfortable} 0.005040984  0.7278287 0.006926059 2.268932   238
## [7]  {health=1,                                                                             
##       happy=9,                                                                              
##       slprl=1,                                                                              
##       aesfdrk=1,                                                                            
##       fltdpr=1,                                                                             
##       pray=7}     => {hincfel=Comfortable} 0.005358694  0.7270115 0.007370851 2.266385   253
## [8]  {health=1,                                                                             
##       happy=9,                                                                              
##       slprl=1,                                                                              
##       aesfdrk=1,                                                                            
##       fltlnl=1,                                                                             
##       pray=7}     => {hincfel=Comfortable} 0.005443416  0.7219101 0.007540296 2.250481   257
## [9]  {health=1,                                                                             
##       happy=9,                                                                              
##       aesfdrk=1,                                                                            
##       fltdpr=1,                                                                             
##       fltlnl=1,                                                                             
##       pray=7}     => {hincfel=Comfortable} 0.008006269  0.7213740 0.011098638 2.248810   378
## [10] {happy=9,                                                                              
##       aesfdrk=1,                                                                            
##       flteeff=1,                                                                            
##       enjlf=4,                                                                              
##       pray=7}     => {hincfel=Comfortable} 0.007434393  0.7207392 0.010314956 2.246831   351

Visualization

Scatterplots

The noticeable horizontal gap between the clusters of rules in the scatter plot is a phenomenon probably caused by a discrete nature of the consequent.

plot(rules_demog, method = "scatterplot", measure = c("support", "lift"), shading = "confidence")
plot(rules_health, method = "scatterplot", measure = c("support", "lift"), shading = "confidence")
plot(rules_trust, method = "scatterplot", measure = c("support", "lift"), shading = "confidence")

Interactive Graphs

The interactive network graphs allow for a dynamic exploration of the discovered patterns, where the size and color intensity of the nodes provide an immediate visual representation of the support and lift for each specific association

plot(rules_demog, 
     method = "graph", 
     engine = "htmlwidget",
     title = "Top 10 Health Rules for 'Very Difficult' Income Feeling")
## Available control parameters (with default values):
## itemCol   =  #CBD2FC
## nodeCol   =  c("#EE0000", "#EE0303", "#EE0606", "#EE0909", "#EE0C0C", "#EE0F0F", "#EE1212", "#EE1515", "#EE1818", "#EE1B1B", "#EE1E1E", "#EE2222", "#EE2525", "#EE2828", "#EE2B2B", "#EE2E2E", "#EE3131", "#EE3434", "#EE3737", "#EE3A3A", "#EE3D3D", "#EE4040", "#EE4444", "#EE4747", "#EE4A4A", "#EE4D4D", "#EE5050", "#EE5353", "#EE5656", "#EE5959", "#EE5C5C", "#EE5F5F", "#EE6262", "#EE6666", "#EE6969", "#EE6C6C", "#EE6F6F", "#EE7272", "#EE7575", "#EE7878", "#EE7B7B", "#EE7E7E", "#EE8181", "#EE8484", "#EE8888", "#EE8B8B",  "#EE8E8E", "#EE9191", "#EE9494", "#EE9797", "#EE9999", "#EE9B9B", "#EE9D9D", "#EE9F9F", "#EEA0A0", "#EEA2A2", "#EEA4A4", "#EEA5A5", "#EEA7A7", "#EEA9A9", "#EEABAB", "#EEACAC", "#EEAEAE", "#EEB0B0", "#EEB1B1", "#EEB3B3", "#EEB5B5", "#EEB7B7", "#EEB8B8", "#EEBABA", "#EEBCBC", "#EEBDBD", "#EEBFBF", "#EEC1C1", "#EEC3C3", "#EEC4C4", "#EEC6C6", "#EEC8C8", "#EEC9C9", "#EECBCB", "#EECDCD", "#EECFCF", "#EED0D0", "#EED2D2", "#EED4D4", "#EED5D5", "#EED7D7", "#EED9D9", "#EEDBDB", "#EEDCDC", "#EEDEDE", "#EEE0E0",  "#EEE1E1", "#EEE3E3", "#EEE5E5", "#EEE7E7", "#EEE8E8", "#EEEAEA", "#EEECEC", "#EEEEEE")
## precision     =  3
## igraphLayout  =  layout_nicely
## interactive   =  TRUE
## engine    =  visNetwork
## max   =  100
## selection_menu    =  TRUE
## degree_highlight  =  1
## verbose   =  FALSE
plot(rules_health, 
     method = "graph", 
     engine = "htmlwidget",
     title = "Top 10 Health Rules for 'Very Difficult' Income Feeling")
## Available control parameters (with default values):
## itemCol   =  #CBD2FC
## nodeCol   =  c("#EE0000", "#EE0303", "#EE0606", "#EE0909", "#EE0C0C", "#EE0F0F", "#EE1212", "#EE1515", "#EE1818", "#EE1B1B", "#EE1E1E", "#EE2222", "#EE2525", "#EE2828", "#EE2B2B", "#EE2E2E", "#EE3131", "#EE3434", "#EE3737", "#EE3A3A", "#EE3D3D", "#EE4040", "#EE4444", "#EE4747", "#EE4A4A", "#EE4D4D", "#EE5050", "#EE5353", "#EE5656", "#EE5959", "#EE5C5C", "#EE5F5F", "#EE6262", "#EE6666", "#EE6969", "#EE6C6C", "#EE6F6F", "#EE7272", "#EE7575", "#EE7878", "#EE7B7B", "#EE7E7E", "#EE8181", "#EE8484", "#EE8888", "#EE8B8B",  "#EE8E8E", "#EE9191", "#EE9494", "#EE9797", "#EE9999", "#EE9B9B", "#EE9D9D", "#EE9F9F", "#EEA0A0", "#EEA2A2", "#EEA4A4", "#EEA5A5", "#EEA7A7", "#EEA9A9", "#EEABAB", "#EEACAC", "#EEAEAE", "#EEB0B0", "#EEB1B1", "#EEB3B3", "#EEB5B5", "#EEB7B7", "#EEB8B8", "#EEBABA", "#EEBCBC", "#EEBDBD", "#EEBFBF", "#EEC1C1", "#EEC3C3", "#EEC4C4", "#EEC6C6", "#EEC8C8", "#EEC9C9", "#EECBCB", "#EECDCD", "#EECFCF", "#EED0D0", "#EED2D2", "#EED4D4", "#EED5D5", "#EED7D7", "#EED9D9", "#EEDBDB", "#EEDCDC", "#EEDEDE", "#EEE0E0",  "#EEE1E1", "#EEE3E3", "#EEE5E5", "#EEE7E7", "#EEE8E8", "#EEEAEA", "#EEECEC", "#EEEEEE")
## precision     =  3
## igraphLayout  =  layout_nicely
## interactive   =  TRUE
## engine    =  visNetwork
## max   =  100
## selection_menu    =  TRUE
## degree_highlight  =  1
## verbose   =  FALSE
plot(rules_trust, 
     method = "graph", 
     engine = "htmlwidget",
     title = "Top 10 Health Rules for 'Very Difficult' Income Feeling")
## Available control parameters (with default values):
## itemCol   =  #CBD2FC
## nodeCol   =  c("#EE0000", "#EE0303", "#EE0606", "#EE0909", "#EE0C0C", "#EE0F0F", "#EE1212", "#EE1515", "#EE1818", "#EE1B1B", "#EE1E1E", "#EE2222", "#EE2525", "#EE2828", "#EE2B2B", "#EE2E2E", "#EE3131", "#EE3434", "#EE3737", "#EE3A3A", "#EE3D3D", "#EE4040", "#EE4444", "#EE4747", "#EE4A4A", "#EE4D4D", "#EE5050", "#EE5353", "#EE5656", "#EE5959", "#EE5C5C", "#EE5F5F", "#EE6262", "#EE6666", "#EE6969", "#EE6C6C", "#EE6F6F", "#EE7272", "#EE7575", "#EE7878", "#EE7B7B", "#EE7E7E", "#EE8181", "#EE8484", "#EE8888", "#EE8B8B",  "#EE8E8E", "#EE9191", "#EE9494", "#EE9797", "#EE9999", "#EE9B9B", "#EE9D9D", "#EE9F9F", "#EEA0A0", "#EEA2A2", "#EEA4A4", "#EEA5A5", "#EEA7A7", "#EEA9A9", "#EEABAB", "#EEACAC", "#EEAEAE", "#EEB0B0", "#EEB1B1", "#EEB3B3", "#EEB5B5", "#EEB7B7", "#EEB8B8", "#EEBABA", "#EEBCBC", "#EEBDBD", "#EEBFBF", "#EEC1C1", "#EEC3C3", "#EEC4C4", "#EEC6C6", "#EEC8C8", "#EEC9C9", "#EECBCB", "#EECDCD", "#EECFCF", "#EED0D0", "#EED2D2", "#EED4D4", "#EED5D5", "#EED7D7", "#EED9D9", "#EEDBDB", "#EEDCDC", "#EEDEDE", "#EEE0E0",  "#EEE1E1", "#EEE3E3", "#EEE5E5", "#EEE7E7", "#EEE8E8", "#EEEAEA", "#EEECEC", "#EEEEEE")
## precision     =  3
## igraphLayout  =  layout_nicely
## interactive   =  TRUE
## engine    =  visNetwork
## max   =  100
## selection_menu    =  TRUE
## degree_highlight  =  1
## verbose   =  FALSE

Grouped plots

Grouped plots operate by clustering those with similar antecedent (LHS) structures into cohesive groups.

plot(rules_demog, method = "grouped", control = list(gp_labels = FALSE))
## Available control parameters (with default values):
## k     =  20
## aggr.fun  =  function (x, ...)  UseMethod("mean")
## rhs_max   =  10
## lhs_label_items   =  2
## col   =  c("#EE0000FF", "#EEEEEEFF")
## groups    =  NULL
## engine    =  ggplot2
## verbose   =  FALSE

plot(rules_health, method = "grouped", control = list(gp_labels = FALSE))
## Available control parameters (with default values):
## k     =  20
## aggr.fun  =  function (x, ...)  UseMethod("mean")
## rhs_max   =  10
## lhs_label_items   =  2
## col   =  c("#EE0000FF", "#EEEEEEFF")
## groups    =  NULL
## engine    =  ggplot2
## verbose   =  FALSE

plot(rules_trust, method = "grouped", control = list(gp_labels = FALSE))
## Available control parameters (with default values):
## k     =  20
## aggr.fun  =  function (x, ...)  UseMethod("mean")
## rhs_max   =  10
## lhs_label_items   =  2
## col   =  c("#EE0000FF", "#EEEEEEFF")
## groups    =  NULL
## engine    =  ggplot2
## verbose   =  FALSE

Paracoord plots

Presented below are the parallel coordinates plots, which provide visual pathways leading form various antecedents to the final financial outcome. Each line represents a rule, darker ones indicate a higher lift. The ‘position’ axes represent the sequential elements of the rule’s antecedent (LHS). Health and Trust variables are associated with rules for feeling Comfortable, whereas the Demographic factors define a Difficult situation.

top20_demog <- head(sort(rules_demog, by = "lift"), 20)
plot(top20_demog, method = "paracoord", 
     main = "Top 20 Demographic Rules for Household Income Feeling",
     control = list(reorder = TRUE))

top20_health <- head(sort(rules_health, by = "lift"), 20)
plot(top20_health, method = "paracoord", 
     main = "Top 20 Health & Wellbeing Rules",
     control = list(reorder = TRUE))

top20_trust <- head(sort(rules_trust, by = "lift"), 20)
plot(top20_trust, method = "paracoord", 
     main = "Top 20 Trust & Social Capital Rules",
     control = list(reorder = TRUE))

Conclusions

The analysis reveals that subjective economic well-being in Europe is a multidimensional phenomenon driven by more than just income. Financial comfort is strongly linked to high social trust, institutional confidence, and optimal mental health. In contrast, financial difficulty is most clearly defined by demographic and occupational vulnerabilities, specifically unemployment among women.