李振維的報告

社群媒體使用型態與幸福感的關聯

一、引言

在社群媒體高度融入日常生活的情況下,民眾的社群媒體使用行為已不只是單純的娛樂活動,也可能與生活滿意度、人際關係、快樂感與寂寞感等主觀幸福感指標有所關聯。不同平台具有不同的使用情境,例如 Facebook 可能較偏向熟人互動,Instagram、TikTok 與 Threads 則更常與影像內容、即時流行與社群互動有關。因此,若只以「有沒有使用社群媒體」作為單一指標,可能會忽略不同平台與使用時間背後的差異。

本研究以 TCS 2024 網路調查資料為基礎,探討社群媒體使用型態與幸福感之間的關聯。研究首先透過多重對應分析(MCA)觀察不同社群媒體使用類別與幸福感高低在空間中的相對位置;接著以卡方檢定檢驗平台使用與幸福感分組是否存在統計關聯;最後使用序次 logistic 迴歸控制性別、年齡與教育程度,以檢視社群媒體使用型態是否仍與幸福感高低具有獨立關聯。


二、資料與研究設計

本研究的依變項為幸福感,透過生活幸福感、家庭狀況、人際關係、工作、經濟狀況、健康狀況、自我滿意度、快樂感與寂寞感等題項建立合成指標。其中,寂寞感方向與幸福感相反,因此進行反向計分,使分數越高代表幸福感越高。

自變項為社群媒體使用型態,包括每日社群媒體使用時間,以及 Facebook、Instagram、TikTok、Dcard、PTT、小紅書與 Threads 等平台使用情形。控制變項包含性別、年齡與教育程度。

分析流程如下:

  1. 建立幸福感合成指標,並分為幸福感低、中、高三組。
  2. 建立社群媒體使用時間分組。
  3. 建立各社群平台有無使用變項。
  4. 使用 MCA 觀察類別空間分布。
  5. 使用卡方檢定檢驗關聯。
  6. 使用序次 logistic 迴歸進一步控制背景變項。

三、資料處理與變項建立

# =========================================================
# 社群媒體使用型態與幸福感的關聯
# 資料位置:C:/R/pass.xlsx
# 分析流程:MCA → 卡方檢定 → 序次 Logistic 迴歸
# 不使用 factoextra
# =========================================================

# 第一次跑才需要安裝
# install.packages(c("readxl", "dplyr", "FactoMineR", "MASS", "ggplot2", "knitr"))

library(readxl)
library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(FactoMineR)
library(MASS)

Attaching package: 'MASS'
The following object is masked from 'package:dplyr':

    select
library(ggplot2)
library(knitr)
# 讀取資料

df <- read_excel("C:/R/pass.xlsx")
# 確認變項是否存在

required_vars <- c(
  "g01_w2", "g02_w2", "g03_w2", "g04_w2", "g05_w2",
  "g06_w2", "g07_w2", "g08_w2", "g09_w2",
  "d01h_w2", "d01m_w2",
  "a06m01_w2", "a06m02_w2", "a06m07_w2",
  "a06m08_w2", "a06m09_w2", "a06m10_w2", "a06m11_w2",
  "sex", "age", "edu7_w2"
)

missing_vars <- setdiff(required_vars, names(df))

if (length(missing_vars) > 0) {
  stop(paste("以下變項在資料中找不到:", paste(missing_vars, collapse = ", ")))
}
# 缺失值處理
# 只處理 numeric 欄位,避免 id2 文字欄位爆掉

df2 <- df %>%
  mutate(across(
    where(is.numeric),
    ~ replace(.x, .x %in% c(90, 96, 97, 98, 99, 990, 999), NA)
  ))
# 建立幸福感變項
# g09_w2 是寂寞感,方向與幸福感相反,所以反向計分
# 用 rowMeans 算平均幸福感,避免一題 NA 就整個變 NA
# 用 ntile 強制分成 幸福感低/中/高

df2 <- df2 %>%
  mutate(
    g09_r = 11 - g09_w2
  )

df2 <- df2 %>%
  mutate(
    happy_valid_n = rowSums(
      !is.na(dplyr::select(
        .,
        g01_w2, g02_w2, g03_w2, g04_w2, g05_w2,
        g06_w2, g07_w2, g08_w2, g09_r
      ))
    ),
    
    Happiness_score = rowMeans(
      dplyr::select(
        .,
        g01_w2, g02_w2, g03_w2, g04_w2, g05_w2,
        g06_w2, g07_w2, g08_w2, g09_r
      ),
      na.rm = TRUE
    )
  )

df2 <- df2 %>%
  mutate(
    Happiness_score = ifelse(happy_valid_n >= 6, Happiness_score, NA)
  )

df2 <- df2 %>%
  mutate(
    Happiness_tile = dplyr::ntile(Happiness_score, 3),
    
    Happiness_group = case_when(
      is.na(Happiness_score) ~ NA_character_,
      Happiness_tile == 1 ~ "幸福感低",
      Happiness_tile == 2 ~ "幸福感中",
      Happiness_tile == 3 ~ "幸福感高"
    )
  )
# 建立社群媒體使用時間

df2 <- df2 %>%
  mutate(
    SM_minutes = d01h_w2 * 60 + d01m_w2
  )

df2 <- df2 %>%
  mutate(
    SM_time_tile = dplyr::ntile(SM_minutes, 3),
    
    SM_time_group = case_when(
      is.na(SM_minutes) ~ NA_character_,
      SM_time_tile == 1 ~ "低使用時間",
      SM_time_tile == 2 ~ "中使用時間",
      SM_time_tile == 3 ~ "高使用時間"
    )
  )
# 建立各社群平台使用變項
# 假設 1 = 有使用,其他有效值 = 無使用

make_use <- function(x, platform_name) {
  case_when(
    is.na(x) ~ NA_character_,
    x == 1 ~ paste0(platform_name, "_有使用"),
    TRUE ~ paste0(platform_name, "_無使用")
  )
}

df2 <- df2 %>%
  mutate(
    FB_use = make_use(a06m01_w2, "FB"),
    IG_use = make_use(a06m02_w2, "IG"),
    TikTok_use = make_use(a06m07_w2, "TikTok"),
    Dcard_use = make_use(a06m08_w2, "Dcard"),
    PTT_use = make_use(a06m09_w2, "PTT"),
    XHS_use = make_use(a06m10_w2, "小紅書"),
    Threads_use = make_use(a06m11_w2, "Threads")
  )
# 建立背景變項

df2 <- df2 %>%
  mutate(
    Gender = factor(sex, levels = c(1, 2), labels = c("男", "女")),
    
    # 注意:age 是年齡組代碼,不是實際年齡
    Age_group = case_when(
      age %in% c(1, 2) ~ "18-29歲",
      age %in% c(3, 4) ~ "30-49歲",
      age >= 5 ~ "50歲以上",
      TRUE ~ NA_character_
    ),
    
    Edu_group = case_when(
      edu7_w2 %in% c(1, 2, 3) ~ "高中職以下",
      edu7_w2 %in% c(4, 5) ~ "專科或大學",
      edu7_w2 >= 6 ~ "研究所以上",
      TRUE ~ NA_character_
    )
  )

table(df2$Gender, useNA = "ifany")

 男  女 
751 931 
table(df2$Age_group, useNA = "ifany")

 18-29歲  30-49歲 50歲以上 
     281      889      512 
table(df2$Edu_group, useNA = "ifany")

研究所以上 高中職以下 專科或大學 
      1219         30        433 

四、描述性統計

# 建立分析資料

mca_data <- df2 %>%
  dplyr::select(
    Happiness_group,
    SM_time_group,
    FB_use,
    IG_use,
    TikTok_use,
    Dcard_use,
    PTT_use,
    XHS_use,
    Threads_use,
    Gender,
    Age_group,
    Edu_group
  ) %>%
  filter(
    !is.na(Happiness_group),
    !is.na(SM_time_group),
    !is.na(Gender),
    !is.na(Age_group),
    !is.na(Edu_group)
  ) %>%
  mutate(across(everything(), as.factor))
happy_table <- mca_data %>%
  dplyr::count(Happiness_group, name = "人數")

knitr::kable(
  happy_table,
  caption = "幸福感分組分布"
)
幸福感分組分布
Happiness_group 人數
幸福感中 444
幸福感低 449
幸福感高 438
time_table <- mca_data %>%
  dplyr::count(SM_time_group, name = "人數")

knitr::kable(
  time_table,
  caption = "社群媒體使用時間分組分布"
)
社群媒體使用時間分組分布
SM_time_group 人數
中使用時間 444
低使用時間 444
高使用時間 443
platform_table <- data.frame(
  平台 = c("Facebook", "Instagram", "TikTok", "Dcard", "PTT", "小紅書", "Threads"),
  有使用 = c(
    sum(mca_data$FB_use == "FB_有使用"),
    sum(mca_data$IG_use == "IG_有使用"),
    sum(mca_data$TikTok_use == "TikTok_有使用"),
    sum(mca_data$Dcard_use == "Dcard_有使用"),
    sum(mca_data$PTT_use == "PTT_有使用"),
    sum(mca_data$XHS_use == "小紅書_有使用"),
    sum(mca_data$Threads_use == "Threads_有使用")
  ),
  無使用 = c(
    sum(mca_data$FB_use == "FB_無使用"),
    sum(mca_data$IG_use == "IG_無使用"),
    sum(mca_data$TikTok_use == "TikTok_無使用"),
    sum(mca_data$Dcard_use == "Dcard_無使用"),
    sum(mca_data$PTT_use == "PTT_無使用"),
    sum(mca_data$XHS_use == "小紅書_無使用"),
    sum(mca_data$Threads_use == "Threads_無使用")
  )
)

knitr::kable(
  platform_table,
  caption = "各社群平台使用分布"
)
各社群平台使用分布
平台 有使用 無使用
Facebook 1240 91
Instagram 840 491
TikTok 273 1058
Dcard 337 994
PTT 246 1085
小紅書 168 1163
Threads 516 815

五、MCA 多重對應分析

# MCA 前檢查
# MCA 不能放只有一個類別的變項,所以先自動刪掉

level_check <- sapply(mca_data, function(x) length(unique(x)))

level_table <- data.frame(
  變項 = names(level_check),
  類別數 = as.numeric(level_check)
)

knitr::kable(
  level_table,
  caption = "各變項類別數檢查"
)
各變項類別數檢查
變項 類別數
Happiness_group 3
SM_time_group 3
FB_use 2
IG_use 2
TikTok_use 2
Dcard_use 2
PTT_use 2
XHS_use 2
Threads_use 2
Gender 2
Age_group 3
Edu_group 3
mca_data2 <- mca_data[, level_check >= 2]

if (!("Happiness_group" %in% names(mca_data2))) {
  stop("Happiness_group 只剩一個類別,不能做 MCA。請檢查幸福感分組。")
}

sup_vars <- c("Gender", "Age_group", "Edu_group")
sup_index <- which(names(mca_data2) %in% sup_vars)
# 執行 MCA

if (length(sup_index) > 0) {
  mca_res <- MCA(
    mca_data2,
    quali.sup = sup_index,
    graph = FALSE
  )
} else {
  mca_res <- MCA(
    mca_data2,
    graph = FALSE
  )
}

圖一:各維度解釋變異量

eig <- as.data.frame(mca_res$eig)
eig$Dimension <- 1:nrow(eig)

colnames(eig) <- c("Eigenvalue", "Percent", "Cumulative", "Dimension")

knitr::kable(
  eig,
  digits = 3,
  caption = "MCA 各維度解釋變異量"
)
MCA 各維度解釋變異量
Eigenvalue Percent Cumulative Dimension
dim 1 0.223 18.272 18.272 1
dim 2 0.143 11.684 29.957 2
dim 3 0.125 10.235 40.192 3
dim 4 0.112 9.130 49.322 4
dim 5 0.109 8.939 58.261 5
dim 6 0.104 8.546 66.808 6
dim 7 0.102 8.341 75.149 7
dim 8 0.093 7.587 82.736 8
dim 9 0.086 7.029 89.766 9
dim 10 0.069 5.658 95.423 10
dim 11 0.056 4.577 100.000 11
p1 <- ggplot(eig[1:min(10, nrow(eig)), ], aes(x = Dimension, y = Percent)) +
  geom_col() +
  geom_text(aes(label = round(Percent, 1)), vjust = -0.3, size = 3) +
  labs(
    title = "圖一:MCA 各維度解釋變異量",
    x = "Dimension",
    y = "Percentage of variance"
  ) +
  theme_minimal()

print(p1)

圖二:MCA 主動變數類別空間圖

var_coord <- as.data.frame(mca_res$var$coord)
var_coord$Category <- rownames(var_coord)

var_plot <- var_coord %>%
  dplyr::select(Category, `Dim 1`, `Dim 2`)

knitr::kable(
  var_plot,
  digits = 3,
  caption = "MCA 主動變數類別座標"
)
MCA 主動變數類別座標
Category Dim 1 Dim 2
幸福感中 幸福感中 -0.111 -0.208
幸福感低 幸福感低 0.323 0.276
幸福感高 幸福感高 -0.219 -0.072
中使用時間 中使用時間 -0.033 -0.300
低使用時間 低使用時間 -0.425 -0.347
高使用時間 高使用時間 0.459 0.648
FB_有使用 FB_有使用 0.013 -0.109
FB_無使用 FB_無使用 -0.178 1.487
IG_有使用 IG_有使用 0.509 -0.106
IG_無使用 IG_無使用 -0.870 0.181
TikTok_有使用 TikTok_有使用 0.156 1.295
TikTok_無使用 TikTok_無使用 -0.040 -0.334
Dcard_有使用 Dcard_有使用 1.136 -0.319
Dcard_無使用 Dcard_無使用 -0.385 0.108
PTT_有使用 PTT_有使用 1.004 -0.612
PTT_無使用 PTT_無使用 -0.228 0.139
小紅書_有使用 小紅書_有使用 1.060 1.406
小紅書_無使用 小紅書_無使用 -0.153 -0.203
Threads_有使用 Threads_有使用 0.927 -0.150
Threads_無使用 Threads_無使用 -0.587 0.095
p2 <- ggplot(var_plot, aes(x = `Dim 1`, y = `Dim 2`, label = Category)) +
  geom_point(size = 2) +
  geom_text(vjust = -0.6, size = 3) +
  geom_hline(yintercept = 0, linetype = "dashed") +
  geom_vline(xintercept = 0, linetype = "dashed") +
  labs(
    title = "圖二:MCA 主動變數類別空間圖",
    x = "Dimension 1",
    y = "Dimension 2"
  ) +
  theme_minimal()

print(p2)

圖三:MCA 補充變數類別空間圖

if (!is.null(mca_res$quali.sup$coord)) {
  
  sup_coord <- as.data.frame(mca_res$quali.sup$coord)
  sup_coord$Category <- rownames(sup_coord)
  
  sup_plot <- sup_coord %>%
    dplyr::select(Category, `Dim 1`, `Dim 2`)
  
  knitr::kable(
    sup_plot,
    digits = 3,
    caption = "MCA 補充變數類別座標"
  )
  
  p3 <- ggplot(sup_plot, aes(x = `Dim 1`, y = `Dim 2`, label = Category)) +
    geom_point(size = 2) +
    geom_text(vjust = -0.6, size = 3) +
    geom_hline(yintercept = 0, linetype = "dashed") +
    geom_vline(xintercept = 0, linetype = "dashed") +
    labs(
      title = "圖三:MCA 補充變數類別空間圖",
      x = "Dimension 1",
      y = "Dimension 2"
    ) +
    theme_minimal()
  
  print(p3)
}

圖四:MCA 類別空間圖

var_plot$Type <- "主動變數"

if (exists("sup_plot")) {
  
  sup_plot$Type <- "補充變數"
  
  all_plot <- bind_rows(var_plot, sup_plot)
  
  p4 <- ggplot(all_plot, aes(x = `Dim 1`, y = `Dim 2`, label = Category, shape = Type)) +
    geom_point(size = 2) +
    geom_text(vjust = -0.6, size = 3) +
    geom_hline(yintercept = 0, linetype = "dashed") +
    geom_vline(xintercept = 0, linetype = "dashed") +
    labs(
      title = "圖四:MCA 類別空間圖",
      x = "Dimension 1",
      y = "Dimension 2"
    ) +
    theme_minimal()
  
  print(p4)
}

MCA 結果初步詮釋

MCA 的重點在於觀察類別之間的相對距離。若「幸福感高」與某些平台使用類別或使用時間類別距離較近,表示這些類別在樣本中較常共同出現;若「幸福感低」與某些類別靠近,也表示該類社群媒體使用型態可能與較低幸福感分布在相近位置。需要注意的是,MCA 呈現的是類別之間的結構性關聯,不能直接解釋為因果關係。


六、卡方獨立性檢定

cramers_v <- function(x, y) {
  tab <- table(x, y)
  
  if (nrow(tab) < 2 | ncol(tab) < 2) {
    return(NA)
  }
  
  chi <- suppressWarnings(chisq.test(tab))
  n <- sum(tab)
  r <- nrow(tab)
  k <- ncol(tab)
  
  v <- sqrt(as.numeric(chi$statistic) / (n * min(r - 1, k - 1)))
  return(v)
}

chi_one <- function(var_name) {
  
  tab <- table(mca_data$Happiness_group, mca_data[[var_name]])
  
  if (nrow(tab) < 2 | ncol(tab) < 2) {
    return(data.frame(
      Variable = var_name,
      Chi_square = NA,
      df = NA,
      p_value = NA,
      Cramers_V = NA
    ))
  }
  
  test <- suppressWarnings(chisq.test(tab))
  
  data.frame(
    Variable = var_name,
    Chi_square = as.numeric(test$statistic),
    df = as.numeric(test$parameter),
    p_value = as.numeric(test$p.value),
    Cramers_V = cramers_v(mca_data$Happiness_group, mca_data[[var_name]])
  )
}

chi_vars <- c(
  "SM_time_group",
  "FB_use",
  "IG_use",
  "TikTok_use",
  "Dcard_use",
  "PTT_use",
  "XHS_use",
  "Threads_use"
)

chi_result <- do.call(rbind, lapply(chi_vars, chi_one))

chi_result <- chi_result %>%
  mutate(
    p_label = case_when(
      is.na(p_value) ~ NA_character_,
      p_value < .001 ~ "< .001",
      TRUE ~ sprintf("%.3f", p_value)
    ),
    sig = case_when(
      is.na(p_value) ~ "",
      p_value < .001 ~ "***",
      p_value < .01 ~ "**",
      p_value < .05 ~ "*",
      TRUE ~ ""
    )
  )

knitr::kable(
  chi_result,
  digits = 3,
  caption = "社群媒體使用型態與幸福感分組之卡方檢定"
)
社群媒體使用型態與幸福感分組之卡方檢定
Variable Chi_square df p_value Cramers_V p_label sig
SM_time_group 22.882 4 0.000 0.093 < .001 ***
FB_use 1.517 2 0.468 0.034 0.468
IG_use 2.498 2 0.287 0.043 0.287
TikTok_use 1.645 2 0.439 0.035 0.439
Dcard_use 16.945 2 0.000 0.113 < .001 ***
PTT_use 9.421 2 0.009 0.084 0.009 **
XHS_use 1.864 2 0.394 0.037 0.394
Threads_use 4.568 2 0.102 0.059 0.102

卡方檢定結果詮釋

卡方檢定用來判斷社群媒體使用型態與幸福感分組之間是否具有統計上的關聯。若 p 值小於 .05,表示該社群媒體使用變項與幸福感分組之間並非完全獨立。Cramér’s V 則用來判斷關聯強度,數值越高代表關聯越強。不過,即使結果達顯著,也仍需注意效果量大小,避免只因樣本數較大而過度解釋統計顯著。


七、序次 Logistic 迴歸

model_data <- mca_data %>%
  mutate(
    Happiness_group = ordered(
      Happiness_group,
      levels = c("幸福感低", "幸福感中", "幸福感高")
    )
  )

candidate_vars <- c(
  "SM_time_group",
  "FB_use",
  "IG_use",
  "TikTok_use",
  "Dcard_use",
  "PTT_use",
  "XHS_use",
  "Threads_use",
  "Gender",
  "Age_group",
  "Edu_group"
)

model_level_check <- sapply(model_data[candidate_vars], function(x) length(unique(x)))

model_vars <- names(model_level_check[model_level_check >= 2])

if ("SM_time_group" %in% model_vars) {
  model_data$SM_time_group <- relevel(model_data$SM_time_group, ref = "低使用時間")
}

if ("FB_use" %in% model_vars) {
  model_data$FB_use <- relevel(model_data$FB_use, ref = "FB_無使用")
}

if ("IG_use" %in% model_vars) {
  model_data$IG_use <- relevel(model_data$IG_use, ref = "IG_無使用")
}

if ("TikTok_use" %in% model_vars) {
  model_data$TikTok_use <- relevel(model_data$TikTok_use, ref = "TikTok_無使用")
}

if ("Dcard_use" %in% model_vars) {
  model_data$Dcard_use <- relevel(model_data$Dcard_use, ref = "Dcard_無使用")
}

if ("PTT_use" %in% model_vars) {
  model_data$PTT_use <- relevel(model_data$PTT_use, ref = "PTT_無使用")
}

if ("XHS_use" %in% model_vars) {
  model_data$XHS_use <- relevel(model_data$XHS_use, ref = "小紅書_無使用")
}

if ("Threads_use" %in% model_vars) {
  model_data$Threads_use <- relevel(model_data$Threads_use, ref = "Threads_無使用")
}

if ("Gender" %in% model_vars) {
  model_data$Gender <- relevel(model_data$Gender, ref = "男")
}

if ("Age_group" %in% model_vars) {
  model_data$Age_group <- relevel(model_data$Age_group, ref = "50歲以上")
}

if ("Edu_group" %in% model_vars) {
  model_data$Edu_group <- relevel(model_data$Edu_group, ref = "高中職以下")
}

formula_text <- paste(
  "Happiness_group ~",
  paste(model_vars, collapse = " + ")
)

model_formula <- as.formula(formula_text)

model <- polr(
  model_formula,
  data = model_data,
  Hess = TRUE
)

ctable <- coef(summary(model))

p_value <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2

reg_result <- data.frame(
  Variable = rownames(ctable),
  Estimate = ctable[, "Value"],
  Std_Error = ctable[, "Std. Error"],
  t_value = ctable[, "t value"],
  p_value = p_value,
  OR = exp(ctable[, "Value"])
)

reg_result <- reg_result %>%
  mutate(
    p_label = case_when(
      p_value < .001 ~ "< .001",
      TRUE ~ sprintf("%.3f", p_value)
    ),
    sig = case_when(
      p_value < .001 ~ "***",
      p_value < .01 ~ "**",
      p_value < .05 ~ "*",
      TRUE ~ ""
    )
  )

knitr::kable(
  reg_result,
  digits = 3,
  caption = "序次 Logistic 迴歸結果"
)
序次 Logistic 迴歸結果
Variable Estimate Std_Error t_value p_value OR p_label sig
SM_time_group中使用時間 SM_time_group中使用時間 0.173 0.125 1.381 0.167 1.188 0.167
SM_time_group高使用時間 SM_time_group高使用時間 -0.278 0.130 -2.134 0.033 0.757 0.033 *
FB_useFB_有使用 FB_useFB_有使用 0.204 0.206 0.991 0.322 1.227 0.322
IG_useIG_有使用 IG_useIG_有使用 0.064 0.126 0.512 0.609 1.067 0.609
TikTok_useTikTok_有使用 TikTok_useTikTok_有使用 -0.098 0.131 -0.751 0.453 0.906 0.453
Dcard_useDcard_有使用 Dcard_useDcard_有使用 -0.301 0.138 -2.177 0.029 0.740 0.029 *
PTT_usePTT_有使用 PTT_usePTT_有使用 -0.210 0.145 -1.449 0.147 0.810 0.147
XHS_use小紅書_有使用 XHS_use小紅書_有使用 0.037 0.165 0.227 0.820 1.038 0.820
Threads_useThreads_有使用 Threads_useThreads_有使用 -0.061 0.126 -0.483 0.629 0.941 0.629
Gender女 Gender女 0.097 0.106 0.914 0.361 1.102 0.361
Age_group18-29歲 Age_group18-29歲 -0.710 0.187 -3.793 0.000 0.492 < .001 ***
Age_group30-49歲 Age_group30-49歲 -0.615 0.129 -4.757 0.000 0.541 < .001 ***
Edu_group研究所以上 Edu_group研究所以上 0.459 0.550 0.835 0.404 1.583 0.404
Edu_group專科或大學 Edu_group專科或大學 -0.086 0.553 -0.156 0.876 0.918 0.876
幸福感低|幸福感中 幸福感低|幸福感中 -0.733 0.586 -1.251 0.211 0.480 0.211
幸福感中|幸福感高 幸福感中|幸福感高 0.718 0.586 1.225 0.221 2.050 0.221

迴歸結果詮釋方式

序次 logistic 迴歸用來檢驗在控制性別、年齡與教育程度後,社群媒體使用型態是否仍與幸福感高低有關。OR 值大於 1,代表該類別相較於參考組,更傾向落在較高幸福感組;OR 值小於 1,則代表較傾向落在較低幸福感組。若 p 值小於 .05,表示該變項在統計上達顯著。


八、實證結果與討論

8.1 MCA 分布結果

從 MCA 空間圖可以觀察社群媒體使用型態與幸福感分組之間的相對位置。若「幸福感高」與某些平台使用類別或中低使用時間靠近,可能表示這些使用型態與較高幸福感在樣本中較常共同出現;相反地,若「幸福感低」與高使用時間或特定平台使用類別靠近,則可能表示該使用型態與較低幸福感有一定的結構性關聯。

不過,MCA 的重點在於探索類別之間的分布樣態,而非檢定因果關係。因此,本研究進一步使用卡方檢定與序次 logistic 迴歸來檢驗這些空間分布是否具有統計上的支持。

8.2 卡方檢定結果

卡方檢定結果顯示,部分社群媒體使用變項與幸福感分組之間可能存在顯著關聯。然而,是否能進一步解釋為實質上的差異,仍需要搭配 Cramér’s V 判斷關聯強度。若某些平台 p 值達顯著,但 Cramér’s V 偏低,代表雖然兩者在統計上有關,但實際關聯程度可能有限。

8.3 序次 Logistic 迴歸結果

在控制性別、年齡與教育程度後,序次 logistic 迴歸可以進一步檢視社群媒體使用型態與幸福感之間是否仍具有獨立關聯。若某些平台使用變項或使用時間分組在迴歸中仍達顯著,表示其與幸福感之間的關聯並不完全來自人口背景差異。相反地,若在卡方檢定中顯著、但在迴歸中不顯著,則可能表示原本的關聯受到年齡、教育程度或性別等因素影響。

整體而言,本研究不宜直接宣稱社群媒體使用會造成幸福感提升或下降,而應較保守地說明:不同社群媒體使用型態與幸福感之間存在一定程度的關聯,但此關聯可能受到人口背景與使用情境影響。


九、結論與研究限制

本研究以 TCS 2024 網路調查資料分析社群媒體使用型態與幸福感之間的關聯。透過 MCA,本研究可以觀察不同平台使用、使用時間與幸福感高低之間的空間分布;透過卡方檢定與序次 logistic 迴歸,則能進一步檢驗這些關聯是否具有統計上的支持。

本研究的貢獻在於不只討論「是否使用社群媒體」,而是進一步區分不同平台與使用時間,觀察其與幸福感分組之間的差異。然而,本研究仍有幾項限制。首先,資料為橫斷面調查,因此無法直接推論社群媒體使用對幸福感的因果影響。其次,平台使用變項多為有無使用,無法完整呈現使用內容、互動品質或使用動機。第三,幸福感雖以多題建立合成指標,但不同面向如家庭、人際、經濟、健康與寂寞感本身可能具有不同意義,未來研究可進一步分開分析各幸福感題項。

整體而言,社群媒體使用與幸福感之間的關係不應被簡化為「用越多越幸福」或「用越多越不幸福」,而應放在平台類型、使用時間與個人背景共同構成的脈絡中理解。


十、輸出結果

write.csv(
  chi_result,
  "C:/R/卡方檢定結果_社群媒體與幸福感.csv",
  row.names = FALSE,
  fileEncoding = "UTF-8"
)

write.csv(
  reg_result,
  "C:/R/序次logistic迴歸結果_社群媒體與幸福感.csv",
  row.names = FALSE,
  fileEncoding = "UTF-8"
)

write.csv(
  eig,
  "C:/R/MCA解釋變異量.csv",
  row.names = FALSE,
  fileEncoding = "UTF-8"
)

write.csv(
  var_plot,
  "C:/R/MCA主動變數座標.csv",
  row.names = FALSE,
  fileEncoding = "UTF-8"
)

if (exists("sup_plot")) {
  write.csv(
    sup_plot,
    "C:/R/MCA補充變數座標.csv",
    row.names = FALSE,
    fileEncoding = "UTF-8"
  )
}