媒體影響下的選民認知:資訊媒體傳播對民眾選舉判斷之實際影響

作者

萬立庠

一、研究動機與背景

台灣人的公民教育其實做的很已是相當普遍及很早,大概在國中時期便會開始提到所謂的媒體識讀(Media Literacy),對於台灣人來說媒體識讀的概念可以說是相當成熟,至少對我來說便是如此,媒體識讀/素養簡單概括便是「不被媒體牽著走,而是有能力自己判斷與負責任地使用媒體」。 然而,我常常在思考,如今的社會來說,台灣人對於所謂的媒體亂象可以說是相當習慣,假新聞以及政論節目更是繁花朵朵,特定政黨的政治人物只上符合自身政治立場的政論節目,節目本身也只通篇討論特定政治立場的政治人物、話題。 然而,當一件亂象漸漸被人民接受,產生了一種:這很正常啊的判斷時,那這樣的亂象是否意味著成為了必然了?那到了這時,人民本身學到的媒體識讀是否還會發揮作用?還是已經被潛移默化了?媒體是否已然成為了特定立場的宣傳工具?這是我所好奇的。 因此,本報告嘗試結合 2024 年台灣選舉調查資料(TEDS2024),初步分析資訊媒體使用與選民選舉判斷之間的關係。

二、研究目的與資料來源

三、研究變數與分析方向

四、研究假設

五、選擇研究原始資料

(一) 載入資料

程式碼
library(tidyverse) 
library(sjlabelled)
library(sjmisc)
library(sjPlot)


teds <- read_spss("D:/Rproject/TEDS2024_media/data/TEDS2024_indQ_utf8.sav")
teds <- set_na(teds, na = c(93:99, "NA"))

var_info <- data.frame(
  變數名稱 = names(teds), 
  label = as.character(get_label(teds))
)

info_vars <- var_info %>%
  filter(str_detect(label, "獲得|資訊|搜尋|新聞"))

satisfaction_vars <- var_info %>%
  filter(str_detect(label, "滿意|表現|評價|信任"))

knitr::kable(satisfaction_vars, caption = "政治滿意度與表現相關變項清單")
政治滿意度與表現相關變項清單
變數名稱 label
C1 請問您對蔡英文擔任總統期間的整體表現,您覺得是非常滿意、還算滿意、不太滿意、還是非常不滿意?
C2 請問您對蔡英文總統在處理新冠肺炎疫情的表現滿不滿意?是非常滿意、還算滿意、不太滿意、還是非常不滿意?
D11a 接著想請教您對於下列幾個機構或人員的信任程度,請問您對於立法機關是完全信任、有點信任、不太信任,還是一點也不信任?
G2 有人說: 「執政黨做久了,就可以換別的政黨」;也有人說: 「執政黨表現好,就可以繼續做」。請問在這張卡片上,您的位置在哪裡?
G4 整體來說,請問您對台灣民主政治實行的情況,是非常滿意、還算滿意、不太滿意、還是非常不滿意?
I2b 請問您對於自己投給這組候選人的決定,是感到非常滿意、還算滿意、不太滿意、還是非常不滿意?
I2e 請問您對於自己投下廢票的決定,是感到非常滿意、還算滿意、不太滿意、還是非常不滿意?
I2f 請問您對於自己沒領總統票的決定,是感到非常滿意、還算滿意、不太滿意、還是非常不滿意?
I3b 請問您對於自己投票對象的決定,是感到非常滿意、還算滿意、不太滿意、還是非常不滿意?
I3c 請問您對於自己投下廢票的決定,是感到非常滿意、還算滿意、不太滿意、還是非常不滿意?
I3d 請問您對於自己沒領區域立委選票的決定,是感到非常滿意、還算滿意、不太滿意、還是非常不滿意?
I4b 請問您對於自己投給這個政黨的決定,是感到非常滿意、還算滿意、不太滿意、還是非常不滿意?
I4c 請問您對於自己投下廢票的決定,是感到非常滿意、還算滿意、不太滿意、還是非常不滿意?
I4d 請問您對於自己沒領政黨票的決定,是感到非常滿意、還算滿意、不太滿意、還是非常不滿意?
I5 請問您對於不去投票的決定,是感到非常滿意、還算滿意、不太滿意、還是非常不滿意?
J9 請問您對於蔡英文政府2020年以來處理兩岸關係的表現,是滿意還是不滿意?
J10 請問您對於蔡英文政府2020年以來處理能源議題的表現,是滿意還是不滿意?
J11 請問您對於蔡英文政府處理缺蛋問題的表現,是滿意還是不滿意?
K1 接著,我們想請您用0到10來表示您對於2020年選出的立法委員過去四年表現的看法,0表示您認為他(她)表現非常不好,10表示您認為他(她)表現非常好。請問您選區這一屆(2020年選出或2022、2023年補?
K2 如果以0表示非常不好,10表示非常好,請問您對立法院過去四年的整體表現,0到10您要給多少?
K3 請問您對過去四年民進黨在立法院的表現,0到10您會給多少?
K4 請問您對過去四年國民黨在立法院的表現,0到10您會給多少?
K5 請問您對過去四年台灣民眾黨在立法院的表現,0到10您會給多少?
K6 請問您對過去四年時代力量在立法院的表現,0到10您會給多少?
X7 整體而言,您覺得戶抽協助者對您的信任程度為何?
Y4m04 在訪問開始前,受訪者是否有下列情形? (04) 表示不信任調查訪問
程式碼
knitr::kable(info_vars, caption = "與政治資訊獲取相關之候選題目")
與政治資訊獲取相關之候選題目
變數名稱 label
A1 請問您對電視、廣播、報紙或網路上的政治新聞是非常注意、偶爾注意、不太注意,還是完全不注意?
A2 請問您最常看哪一臺電視新聞?
A3a 我們先從傳統的新聞媒體開始,如電視、廣播和報紙,這裡包括使用傳統方式或上網來收看或收聽。在這次選舉期間,請問您一個星期大約會看幾天無線電視新聞(台視、中視、華視、民視、公視
A3b 請問您一個星期大約看幾天有線電視新聞?
A3c 那廣播上的新聞呢?
A3d 那報紙上的新聞呢?(包括看紙本或上網看)
A3e 那其他的新聞網站呢?(像是雅虎奇摩、google新聞、風傳媒、今日新聞/NOWnews等等)
A3f 在這次選舉期間,請問您一個星期大約有幾天使用臉書、推特或LINE來關注政黨和候選人的新聞?
A3f1 那在一天之內,請問您多常使用臉書、推特或LINE來關注政黨和候選人的新聞?是一天僅一次、一天好幾次,還是一天十次以上?
D11f 那您對傳統新聞媒體,例如: 報紙、電視或廣播呢?
X5m03 戶抽協助者有沒有表示過拒絕戶中抽樣的意思?如果有,是在哪個階段?(03) 戶抽結束後,向戶抽者詢問受訪者的聯絡資訊時
X6 整體而言,您覺得戶抽協助者提供資訊的可信度為何?
程式碼
demo_vars <- var_info %>%
  filter(str_detect(label, "性別|年齡|出生年|教育|學歷|收入|家庭經濟|生活狀況"))

knitr::kable(demo_vars, caption = "人口背景變數清單")
人口背景變數清單
變數名稱 label
Q1a 請問您是民國幾年幾月出生的?(出生年)
Q4a 請問您的教育程度是什麼?
Q16 請問您家庭每個月總收入大約是多少: (包括薪資以外的其他收入,如房租、股利等等)
Q23 最後,請問您的性別是?(請受訪者自填)
Q25 受訪者的性別?
Z2 訪員性別:
X2o02 有沒有其他人陪同您進行戶中抽樣? (02) 有,請說明陪同者的身分及性別:
XZ2 訪員性別:
SEX 性別
AGE 年齡
EDU 教育程度

(二) 選擇題目進行分析

1、A3aA3bA3c、A3d:民眾對於政治資訊的獲取來源占比

程式碼
library(sjPlot)
library(dplyr)
library(sjmisc)
library(sjlabelled)

media_usage <- teds %>% 
  select(A3a, A3b, A3c, A3d) %>% 
  mutate(across(everything(), ~rec(., 
    rec = "6,7=1 [經常]; 3,4,5=2 [有時]; 1,2=3 [很少]; 0=4 [從不]; else=NA", 
    as.num = FALSE))) %>% 
  drop_labels()

usage_labels <- c("經常 (6-7天)", "有時 (3-5天)", "很少 (1-2天)", "從不 (0天)")

plot_stackfrq(media_usage, 
              title = "民眾獲取政治資訊之主要來源占比",
              legend.labels = usage_labels,
              axis.labels = c("無線電視 (A3a)", "有線電視 (A3b)", "廣播新聞 (A3c)", "報紙新聞 (A3d)"),
              geom.colors = "PuBu", 
              show.total = FALSE,
              show.prc = TRUE) 

民眾四大傳統媒介之政治資訊獲取頻率占比

根據這個結果我們可以得知,且網路新聞與有線電視是當前最主要的資訊來源,高頻率使用(3天以上)的占比合計通常超過 60%,遠高於報紙與廣播。

2、A2:民眾最常收看之電視台分布

程式碼
library(sjPlot)
library(dplyr)
library(sjmisc)
library(sjlabelled)


teds_a2 <- teds %>%
  select(A2) %>%
  set_na(na = c(95:99)) %>%
  to_factor() 


plot_frq(teds_a2$A2, 
         title = "最常收看之電視台新聞 (A2)", 
         type = "bar",
         sort.frq = "desc", 
         geom.colors = "SteelBlue") +
  theme_sjplot() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

民眾最常收看之新聞電視台分布 (前五名)

3、C1、D2、D4對於政治的滿意度

程式碼
library(sjPlot)
library(sjmisc)

teds_plot <- teds %>%
  select(C1) %>%
  set_na(na = c(95:99)) %>%
  drop_labels()

plot_frq(teds_plot$C1, 
         title = "蔡英文總統表現滿意度", 
         geom.colors = "SteelBlue")

民眾對蔡英文總統表現滿意度分布
程式碼
library(sjPlot)
library(dplyr)
library(sjlabelled)

teds_d4 <- teds %>%
  select(D4) %>%
  set_na(na = c(95, 96, 97, 98, 99)) %>% 
  drop_labels()

# 2. 繪製次數分配圖
plot_frq(teds_d4$D4, 
         title = "民眾對政府信任度 (D4)", 
         axis.labels = c("非常相信", "相信", "不相信", "非常不相信"),
         geom.colors = "DarkOrange") +
  theme_sjplot()

民眾對政府信任度分布情況
程式碼
library(sjPlot)
library(dplyr)
library(sjlabelled)

teds_d2 <- teds %>%
  select(D2) %>%
  set_na(na = c(95:99)) %>%
  drop_labels()

# 2. 繪製次數分配圖
plot_frq(teds_d2$D2, 
         title = "對政府做法是否有影響力 (D2)", 
         axis.labels = c("非常同意", "同意", "不同意", "非常不同意"),
         geom.colors = "RosyBrown") +
  theme_sjplot()

民眾政治效能感分布 (D2)

六、相關性檢定

(一)

  • (\(H_0\)):網路資訊獲取頻率(A3c)不會影響選民對總統表現滿意度(C1)或政府信任度(D4)的評價。

  • (\(H_1\)):網路資訊獲取頻率(A3c)會影響選民對總統表現滿意度(C1)或政府信任度(D4)的評價。

程式碼
library(sjPlot)
library(sjmisc)
library(dplyr)


test_data <- teds %>%
  mutate(
    net_usage = rec(A3c, rec = "0:3=0[低頻率]; 4:7=1[高頻率]; else=NA"),
    pres_sat = rec(C1, rec = "1,2=1[滿意]; 3,4=0[不滿意]; else=NA")
  ) %>%
  filter(!is.na(net_usage) & !is.na(pres_sat))

sjPlot::tab_xtab(var.row = test_data$net_usage, 
                 var.col = test_data$pres_sat, 
                 title = "網路新聞頻率 vs 總統滿意度 (H1 檢定)",
                 show.row.prc = TRUE) 
網路新聞頻率 vs 總統滿意度 (H1 檢定)
那廣播上的新聞呢? 請問您對蔡英文擔任總統期間的整體表現,您覺得是非常滿意、還算滿意、不太滿意、還是非常不滿意? Total
不滿意 滿意
低頻率 441
43.8 %
565
56.2 %
1006
100 %
高頻率 55
45.5 %
66
54.5 %
121
100 %
Total 496
44 %
631
56 %
1127
100 %
χ2=0.058 · df=1 · &phi=0.010 · p=0.809
程式碼
# 1. 資料清理
test_data_d4 <- teds %>%
  mutate(
    net_usage = rec(A3c, rec = "0:3=0[低頻率]; 4:7=1[高頻率]; else=NA"),
    gov_trust = rec(D4, rec = "1,2=1[信任]; 3,4=0[不信任]; else=NA")
  ) %>%
  filter(!is.na(net_usage) & !is.na(gov_trust))

# 2. 產出交叉表與卡方檢定
sjPlot::tab_xtab(var.row = test_data_d4$net_usage, 
                 var.col = test_data_d4$gov_trust, 
                 title = "網路新聞頻率 vs 政府信任度 (H1 檢定)",
                 show.row.prc = TRUE)
網路新聞頻率 vs 政府信任度 (H1 檢定)
那廣播上的新聞呢? 有人說:
「政府所做的事大多數是正確的。」
Total
不信任 信任
低頻率 738
73.8 %
262
26.2 %
1000
100 %
高頻率 87
71.9 %
34
28.1 %
121
100 %
Total 825
73.6 %
296
26.4 %
1121
100 %
χ2=0.115 · df=1 · &phi=0.013 · p=0.735

(二)

  • (\(H_0\))):選民最常收看的電視台(A2),與其對總統表現滿意度(C1)、候選人未來希望感(J16)、政府政府信任感(D2)(D4)沒有顯著關聯

  • (\(H_1\)):選民收看不同的電視台(A2),會顯著影響其對總統表現滿意度(C1)、候選人未來希望感(J16)、政府政府信任感(D2)(D4)評價,呈現明顯的媒體框架(Media Framing)效應

程式碼
library(sjPlot)
library(sjmisc)
library(dplyr)

# 1. 重新編碼:將數字代碼轉為真實電視台名稱
test_data_final <- teds %>%
  mutate(
    # A2 原始代碼:1=民視, 4=中天, 6=TVBS, 11=三立, 12=東森, 15=公視
    # 我們將其群組化為兩個主要比較組,但標籤改為電視台名稱
    tv_group = rec(A2, rec = "1,11='民視/三立'; 4,6,12='中天/TVBS/東森'; else='其他/公視'"),
    
    pres_sat = rec(C1, rec = "1,2='滿意'; 3,4='不滿意'; else=NA"),
    gov_trust = rec(D4, rec = "1,2='信任'; 3,4='不信任'; else=NA"),
    efficacy = rec(D2, rec = "1,2='低效能感'; 3,4='高效能感'; else=NA")
  )

# 2. 產出卡方表 (現在標籤會顯示電視台名字)
tab_xtab(var.row = test_data_final$tv_group, 
         var.col = test_data_final$pres_sat, 
         title = "表 A:不同電視台受眾與總統滿意度之關聯", 
         show.summary = TRUE)
表 A:不同電視台受眾與總統滿意度之關聯
請問您最常看哪一臺電視新聞? 請問您對蔡英文擔任總統期間的整體表現,您覺得是非常滿意、還算滿意、不太滿意、還是非常不滿意? Total
'不滿意' '滿意'
'中天/TVBS/東森' 41 234 275
'民視/三立' 19 33 52
'其他/公視' 426 349 775
Total 486 616 1102
χ2=133.391 · df=2 · Cramer's V=0.348 · p=0.000
程式碼
tab_xtab(var.row = test_data_final$tv_group, 
         var.col = test_data_final$gov_trust, 
         title = "表 B:不同電視台受眾與政府信任度之關聯", 
         show.summary = TRUE)
表 B:不同電視台受眾與政府信任度之關聯
請問您最常看哪一臺電視新聞? 有人說:
「政府所做的事大多數是正確的。」
Total
'不信任' '信任'
'中天/TVBS/東森' 147 118 265
'民視/三立' 41 12 53
'其他/公視' 620 157 777
Total 808 287 1095
χ2=60.810 · df=2 · Cramer's V=0.236 · p=0.000
程式碼
library(dplyr)
library(ggplot2)
library(labelled)

## 1) 轉成 factor(用題目標籤當類別名稱)
teds <- teds %>%
  mutate(
    A2_f = to_factor(A2),
    C1_f = to_factor(C1),
    D4_f = to_factor(D4)
  )

## 2) 只保留你表格那三組(依你截圖的分群)
teds <- teds %>%
  mutate(
    A2_grp = case_when(
      A2_f %in% c("中天", "TVBS", "東森") ~ "中天/TVBS/東森",
      A2_f %in% c("民視", "三立")         ~ "民視/三立",
      TRUE                               ~ "其他/公視"
    )
  )

## 3) 把 C1、D4 合併成二元(你表格是「不滿意/滿意」「不信任/信任」)
teds <- teds %>%
  mutate(
    C1_bin = case_when(
      C1_f %in% c("非常不滿意", "還算不滿意") ~ "不滿意",
      C1_f %in% c("還算滿意", "非常滿意")     ~ "滿意",
      TRUE                                    ~ NA_character_
    ),
    D4_bin = case_when(
      D4_f %in% c("非常不同意", "不同意") ~ "不信任",
      D4_f %in% c("同意", "非常同意")     ~ "信任",
      TRUE                                ~ NA_character_
    )
  )

## 4) 圖一:A2 × C1(100% 堆疊長條)
p_C1 <- teds %>%
  filter(!is.na(A2_grp), !is.na(C1_bin)) %>%
  ggplot(aes(x = A2_grp, fill = C1_bin)) +
  geom_bar(position = "fill") +
  labs(
    title = "最常收看電視新聞台(A2)× 政府整體施政滿意度(C1)",
    x = "A2(分組)",
    y = "比例",
    fill = "C1"
  )

p_C1

程式碼
## 5) 圖二:A2 × D4(100% 堆疊長條)
p_D4 <- teds %>%
  filter(!is.na(A2_grp), !is.na(D4_bin)) %>%
  ggplot(aes(x = A2_grp, fill = D4_bin)) +
  geom_bar(position = "fill") +
  labs(
    title = "最常收看電視新聞台(A2)× 政府信任度(D4)",
    x = "A2(分組)",
    y = "比例",
    fill = "D4"
  )

p_D4

程式碼
## 6)(可選)存成圖片檔,直接貼 PPT
ggsave("A2_C1_plot.png", p_C1, width = 9, height = 4.8, dpi = 300)
ggsave("A2_D4_plot.png", p_D4, width = 9, height = 4.8, dpi = 300)

針對 \(H_1\) 的驗證結果: 透過卡方檢定驗證收視偏好 (A2) 與之其他變數之關聯。結果顯示(\(\chi^2 = 26.944, df = 2, p < .001\)),兩者之間存在高度顯著相關。\(Cramer's V\)\(0.157\),顯示媒體立場與選民認知具備中等強度的關聯性。此結果證實了媒體框架效應:選民接收資訊的管道(電視台立場)確實顯著左右了其對政治現實的評價與未來預期,成功支持研究假設 \(H_1\)!

七、多元對應分析

(一)數據準備與清理

程式碼
library(dplyr)
library(sjmisc)
library(sjlabelled)

mca_cleaned <- teds %>%
  transmute(
    # 1. 電視台立場 (自變項)
    電視台 = rec(A2, rec = "1,11='傾向執政媒體'; 4,12='傾向反對媒體'; else='中立/其他'"),
    
    # 2. 網路資訊頻率 (自變項)
    網路頻率 = rec(A3c, rec = "0:3='低網路頻率'; 4:7='高網路頻率'; else=NA"),
    
    # 3. 總統滿意度 (依變項)
    總統滿意 = rec(C1, rec = "1,2='滿意'; 3,4='不滿意'; else=NA"),
    
    # 4. 政府信任度 (依變項)
    政府信任 = rec(D4, rec = "1,2='信任'; 3,4='不信任'; else=NA"),
    
    # 5. 政治效能感 (依變項)
    效能感 = rec(D2, rec = "1,2='低效能'; 3,4='高效能'; else=NA"),
    
    希望感 = rec(J16, rec = "1,2='有希望'; 3,4='沒希望'; else=NA")
  ) %>%
  mutate(across(everything(), as.factor)) %>%
  na.omit()

summary(mca_cleaned)
            電視台            網路頻率       總統滿意       政府信任  
 '中立/其他'   :719   '低網路頻率':767   '不滿意':376   '不信任':620  
 '傾向反對媒體':105   '高網路頻率': 99   '滿意'  :490   '信任'  :246  
 '傾向執政媒體': 42                                                   
      效能感         希望感   
 '低效能':383   '有希望':653  
 '高效能':483   '沒希望':213  
                              

(二)變數標籤修正

程式碼
library(dplyr)
library(sjmisc)
library(sjlabelled)
library(rlang)

j16_candidates <- names(teds)[grep("J16", names(teds), ignore.case = TRUE)]
real_j16 <- j16_candidates[1]

mca_cleaned <- teds %>%
  mutate(
    電視媒體 = rec(A2, rec = "1,11='傾向執政媒體'; 4,12='傾向反對媒體'; else='中立/其他電視'"),
    
    網路頻率 = rec(A3c, rec = "0:3='低網路頻率'; 4:7='高網路頻率'; else=NA"),
    
    總統滿意 = rec(C1, rec = "1,2='滿意'; 3,4='不滿意'; else=NA"),
    
    政府信任 = rec(D4, rec = "1,2='信任'; 3,4='不信任'; else=NA"),
    
    政治效能 = rec(D2, rec = "1,2='低效能(無力感)'; 3,4='高效能(影響力)'; else=NA")
  ) %>%
  mutate(未來希望 = rec(.[[real_j16]], rec = "1,2='有希望'; 3,4='沒希望'; else=NA")) %>%
  select(電視媒體, 網路頻率, 總統滿意, 政府信任, 政治效能, 未來希望) %>%
  mutate(across(everything(), as.factor)) %>%
  na.omit()

summary(mca_cleaned)
            電視媒體           網路頻率       總統滿意       政府信任  
 '中立/其他電視':719   '低網路頻率':767   '不滿意':376   '不信任':620  
 '傾向反對媒體' :105   '高網路頻率': 99   '滿意'  :490   '信任'  :246  
 '傾向執政媒體' : 42                                                   
             政治效能       未來希望  
 '低效能(無力感)':383   '有希望':653  
 '高效能(影響力)':483   '沒希望':213  
                                      

(三)MCA結果輸出與視覺化

程式碼
library(FactoMineR)
library(factoextra)

res.mca <- MCA(mca_cleaned, graph = FALSE)

fviz_mca_var(res.mca, 
             col.var = "contrib", # 顏色代表對地圖的貢獻度 (越紅影響力越大)
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
             repel = TRUE, 
             ggtheme = theme_minimal()) +
  labs(title = "2024 選民政治態度與媒體收視空間圖",
       subtitle = "由 A2, A3c, C1, D2, D4, J16 構成之政治光譜")

八、迴歸模型與分析

(一) 假設一:對於高頻率接收政治相關資訊的選民,相比低頻率接收的選民來說,較高機率對於政府產生政府不信任感。

程式碼
library(sjPlot)
library(dplyr)

reg_data_trust <- teds %>%
  mutate(
    Information_Freq = ifelse(as.numeric(A3c) >= 4, 1, 0),
    Distrust = ifelse(as.numeric(D4) >= 3, 1, 0)
  ) %>%
  filter(!is.na(Information_Freq), !is.na(Distrust))

if (nrow(reg_data_trust) > 10) {
  model_trust_core <- glm(Distrust ~ Information_Freq, 
                          data = reg_data_trust, family = binomial(link = "logit"))
  
  tab_model(model_trust_core, 
            title = "假設驗證:政治資訊獲取頻率對政府不信任感之影響",
            pred.labels = c("截距", "高頻率資訊獲取 (A3c >= 4天)"),
            dv.labels = "政府不信任感 (D4)")
} else {
  print("錯誤:有效樣本數不足,無法執行迴歸分析。")
}
假設驗證:政治資訊獲取頻率對政府不信任感之影響
  政府不信任感 (D4)
Predictors Odds Ratios CI p
截距 2.86 2.48 – 3.30 <0.001
高頻率資訊獲取 (A3c >= 4天) 0.84 0.58 – 1.23 0.364
Observations 1121
R2 Tjur 0.001

(二) 假設二:特定媒體透過負面框架的理論建構,顯著影響選民對執政當局與國家信任度之評價。

程式碼
library(sjPlot)
library(dplyr)

reg_data_media <- teds %>%
  mutate(
    Specific_Media = ifelse(as.numeric(A2) %in% c(4, 6), 1, 0),
    Dissatisfaction = ifelse(as.numeric(C1) >= 3, 1, 0)
  ) %>%
  filter(!is.na(Specific_Media), !is.na(Dissatisfaction))

if (nrow(reg_data_media) > 0 && length(unique(reg_data_media$Dissatisfaction)) > 1) {
  
  model_media_impact <- glm(Dissatisfaction ~ Specific_Media, 
                            data = reg_data_media, 
                            family = binomial(link = "logit"))
  # 產出結果表
  tab_model(model_media_impact, 
            title = "假設二驗證:收看特定媒體對選民評價判斷之影響",
            pred.labels = c("截距", "收看特定媒體 (TVBS/中天)"),
            dv.labels = "對總統表現不滿意 (C1)")
            
} else {
  cat("### 注意:此模型的樣本數不足或變數缺乏變異,無法顯示。")
}
假設二驗證:收看特定媒體對選民評價判斷之影響
  對總統表現不滿意 (C1)
Predictors Odds Ratios CI p
截距 1.13 0.99 – 1.29 0.073
收看特定媒體 (TVBS/中天) 0.13 0.09 – 0.19 <0.001
Observations 1139
R2 Tjur 0.117
程式碼
library(sjPlot)
library(dplyr)

target_birth <- names(teds)[grep("birth|出生|age", names(teds), ignore.case = TRUE)][1]
target_gender <- names(teds)[grep("S1|性別|sex", names(teds), ignore.case = TRUE)][1]

final_data_core <- teds %>%
  mutate(
    TV_Stand = ifelse(as.numeric(A2) %in% c(4, 6), 1, 0),
    總統不滿 = ifelse(as.numeric(C1) >= 3, 1, 0),
    政府不信任 = ifelse(as.numeric(D4) >= 3, 1, 0),
    政治無力感 = ifelse(as.numeric(D2) <= 2, 1, 0),
    未來沒希望 = ifelse(as.numeric(J16) >= 3, 1, 0),
    Age = 2024 - as.numeric(.[[target_birth]]),
    Gender = as.factor(.[[target_gender]])
  ) %>%
  filter(!is.na(TV_Stand), !is.na(Age))

has_gender_variation <- length(unique(na.omit(final_data_core$Gender))) > 1

formula_base <- if(has_gender_variation) "~ TV_Stand + Age + Gender" else "~ TV_Stand + Age"

try({
  m1 <- glm(as.formula(paste0("總統不滿", formula_base)), data = final_data_core, family = binomial)
  m2 <- glm(as.formula(paste0("政府不信任", formula_base)), data = final_data_core, family = binomial)
  m3 <- glm(as.formula(paste0("政治無力感", formula_base)), data = final_data_core, family = binomial)
  m4 <- glm(as.formula(paste0("未來沒希望", formula_base)), data = final_data_core, family = binomial)

  tab_model(m1, m2, m3, m4, 
            dv.labels = c("總統不滿", "政府不信任", "政治無力感", "未來沒希望"),
            pred.labels = c("截距", "收看特定媒體 (TVBS/中天)", "年齡", "性別"),
            title = "表 5:特定媒體收視習慣 (A2) 對多項政治評價之影響")
})
表 5:特定媒體收視習慣 (A2) 對多項政治評價之影響
  總統不滿 政府不信任 政治無力感 未來沒希望
Predictors Odds Ratios CI p Odds Ratios CI p Odds Ratios CI p Odds Ratios CI p
截距 1.18 0.00 – 41108.97 0.976 0.00 0.00 – 447.72 0.357 0.03 0.00 – 723.65 0.497 0.01 0.00 – 300.83 0.346
收看特定媒體 (TVBS/中天) 0.13 0.09 – 0.19 <0.001 0.31 0.23 – 0.41 <0.001 0.37 0.27 – 0.49 <0.001 0.22 0.14 – 0.32 <0.001
年齡 1.00 0.99 – 1.01 0.999 1.00 1.00 – 1.01 0.263 1.00 1.00 – 1.01 0.487 1.00 1.00 – 1.01 0.399
性別 0.90 0.70 – 1.15 0.398 1.49 1.13 – 1.97 0.005 0.93 0.73 – 1.18 0.565 1.13 0.87 – 1.47 0.358
Observations 1139 1131 1124 1090
R2 Tjur 0.117 0.066 0.040 0.056
程式碼
library(sjPlot)
library(ggplot2)

safe_glm <- function(formula, data) {
  tryCatch({
    if(length(unique(data[[as.character(formula[[2]])]])) < 2) return(NULL)
    glm(formula, data = data, family = binomial(link = "logit"))
  }, error = function(e) NULL)
}

# 2. 重新執行模型 (使用安全模式)
m1_s <- safe_glm(Dissatisfied ~ TV_Stand + Age + Gender, data = final_data)
m2_s <- safe_glm(Distrust ~ TV_Stand + Age + Gender, data = final_data)
m3_s <- safe_glm(Powerless ~ TV_Stand + Age + Gender, data = final_data)
m4_s <- safe_glm(Hopeless ~ TV_Stand + Age + Gender, data = final_data)

# 3. 建立一個有效模型的清單
valid_models <- list()
if(!is.null(m1_s)) valid_models$m1 <- m1_s
if(!is.null(m2_s)) valid_models$m2 <- m2_s
if(!is.null(m3_s)) valid_models$m3 <- m3_s
if(!is.null(m4_s)) valid_models$m4 <- m4_s

# 4. 繪圖輸出
if (length(valid_models) > 0) {
  plot_models(valid_models, 
              m.labels = c("總統不滿", "政府不信任", "政治無力感", "未來沒希望")[1:length(valid_models)],
              show.values = TRUE, 
              show.p = TRUE, 
              p.shape = TRUE) +
    geom_hline(yintercept = 1, linetype = "dashed", color = "red") +
    theme_sjplot() +
    labs(title = "媒體立場 (A2) 對各類政治態度之影響強度比較",
         subtitle = "註:部分模型若因樣本分佈極端則不予顯示")
} else {
  cat("由於特定媒體樣本數過少(n=42)且分佈極端,無法產生係數比較圖。")
}
由於特定媒體樣本數過少(n=42)且分佈極端,無法產生係數比較圖。
程式碼
library(sjPlot)
library(ggplot2)

plot_models(m1, m2, m3, m4, 
            m.labels = c("總統不滿", "政府不信任", "政治無力感", "未來沒希望"),
            show.values = TRUE, 
            show.p = TRUE, 
            p.shape = TRUE) +
  geom_hline(yintercept = 1, linetype = "dashed", color = "red") +
  theme_sjplot() +
  labs(title = "媒體立場 (A2) 對各類政治態度之影響強度比較")

程式碼
library(FactoMineR)
library(factoextra)

# 1. 建立對應中文名稱的資料集
mca_plot_data <- teds %>%
  mutate(
    媒體 = case_when(
      as.numeric(A2) == 1 ~ "民視", 
      as.numeric(A2) == 4 ~ "中天", 
      as.numeric(A2) == 6 ~ "TVBS",
      as.numeric(A2) == 11 ~ "三立", 
      as.numeric(A2) == 12 ~ "東森", 
      as.numeric(A2) == 15 ~ "公視",
      TRUE ~ "其他/不看"
    ),
    滿意度 = case_when(
      as.numeric(C1) <= 2 ~ "滿意",
      as.numeric(C1) >= 3 ~ "不滿",
      TRUE ~ NA_character_
    ),
    信任政府 = case_when(
      as.numeric(D4) <= 2 ~ "信任",
      as.numeric(D4) >= 3 ~ "不信任",
      TRUE ~ NA_character_
    )
  ) %>%
  select(媒體, 滿意度, 信任政府) %>%
  # 移除含有 NA 的列
  na.omit()

# 2. 安全檢查:確保資料量足夠且變數有變異度
# MCA 至少需要幾百筆資料才會有意義
if (nrow(mca_plot_data) > 20 && length(unique(mca_plot_data$媒體)) > 1) {
  
  # 執行 MCA (加上 try 防止陣列維度錯誤導致中斷)
  res.mca <- try(MCA(mca_plot_data, graph = FALSE), silent = TRUE)
  
  if (!inherits(res.mca, "try-error")) {
    # 3. 繪圖
    fviz_mca_biplot(res.mca, 
                   repel = TRUE, 
                   col.var = "red",       
                   col.ind = "gray",      
                   label = "var",         
                   map ="qualitative") +
      theme_minimal() +
      labs(title = "媒體受眾與政治態度空間聚類圖",
           subtitle = "距離越近代表關聯性越高")
  } else {
    cat("### MCA 運算錯誤:可能是特定類別樣本過於集中。")
  }
} else {
  cat("### 資料量不足,無法執行 MCA 空間分析。")
}