第9回 線形回帰分析(2)
関西大学総合情報学部
2024-11-21
すぐに実習できるように準備しておきましょう。
Data
フォルダーを作成し、そこにアップロードしましょう。問い:説明変数Xは応答変数Yの変化をもたらすか。
例) 他の条件が同じ場合、高齢者の割合が上がれば自民党の得票率も上がる。
lm()
で回帰分析を行うと、以下のような推定結果が得られる。
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 15.8910 | 11.3983 | 1.3942 | 0.1703 |
Over65 | 0.8810 | 0.3366 | 2.6170 | 0.0121 |
Zaisei | −4.5472 | 4.8211 | −0.9432 | 0.3507 |
# A tibble: 3,000 × 8
Temp_Rikken Ideology Interest Gender Age Education Job Income
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 30 9 1 2 69 4 5 4333994
2 50 7 4 2 47 3 1 979181
3 0 11 2 2 37 2 1 8498127
4 50 11 2 1 51 4 2 7572654
5 30 7 2 1 38 4 1 6436713
6 0 11 1 1 71 2 5 3410276
7 10 9 2 1 47 3 2 8652860
8 0 11 1 1 71 2 5 927703
9 50 9 1 1 75 4 1 4497693
10 55 6 2 2 66 3 4 2419573
# ℹ 2,990 more rows
変数名 | 説明 | 備考 |
---|---|---|
Temp_Rikken | 立憲民主党に対する感情温度 | 高いほど好感 |
Ideology | 回答者のイデオロギー | 高いほど保守 |
Interest | 回答者の政治関心 | 高いほど無関心 |
Gender | 回答者の性別 | 1: 男性 / 2: 女性 |
Age | 回答者の年齢 | |
Education | 回答者の最終学歴 | 1: 中卒以下 / 2: 高校卒 / 3: 高専・短大卒 / 4: 大卒以上 |
Job | 回答者の職業 | 1: 勤め / 2: 自営業 / 3: 学生 / 4: 専業主婦・主夫 / 5: 無職 / 6: その他 |
Income | 回答者の世帯収入 | 円 |
Gender
とJob
)はダミー変数に変換jes_df |>
dummy_cols(c("Gender", "Job")) |>
relocate(Gender_1:Gender_2, .before = Gender) |> # Gender_1と_2列をGenderの前に
relocate(Job_1:Job_6, .before = Job) |> # Job_1から_6列をJobの前に
select(-c(Gender, Job)) |> # GenderとJob列を除外してからdscer()に渡す
descr(stats = c("mean", "sd", "min", "max", "n.valid"),
transpose = TRUE, order = "p")
Descriptive Statistics
Mean Std.Dev Min Max N.Valid
----------------- ------------ ------------ ----------- ------------- ---------
Temp_Rikken 34.25 25.95 0.00 100.00 3000.00
Ideology 6.34 2.10 1.00 11.00 3000.00
Interest 2.26 0.83 1.00 4.00 3000.00
Gender_1 0.50 0.50 0.00 1.00 3000.00
Gender_2 0.50 0.50 0.00 1.00 3000.00
Age 47.34 15.63 18.00 75.00 3000.00
Education 3.11 0.89 1.00 4.00 3000.00
Job_1 0.50 0.50 0.00 1.00 3000.00
Job_2 0.08 0.28 0.00 1.00 3000.00
Job_3 0.05 0.21 0.00 1.00 3000.00
Job_4 0.20 0.40 0.00 1.00 3000.00
Job_5 0.15 0.35 0.00 1.00 3000.00
Job_6 0.02 0.14 0.00 1.00 3000.00
Income 6190334.00 4233639.26 643629.00 25286751.00 3000.00
論文・レポートに掲載する際には、読者に読みやすく加工すること。
Job_1
とかJob_2
は意味がわからない変数 | 平均値 | 標準偏差 | 最小値 | 最大値 | 有効ケース数 |
---|---|---|---|---|---|
立憲民主党に対する感情温度 | 34.25 | 25.95 | 0 | 100 | 3000 |
イデオロギー | 6.34 | 2.10 | 1 | 11 | 3000 |
政治関心 | 2.26 | 0.83 | 1 | 4 | 3000 |
性別:男性 | 0.50 | 0.50 | 0 | 1 | 3000 |
性別:女性 | 0.50 | 0.50 | 0 | 1 | 3000 |
年齢 | 47.34 | 15.63 | 18 | 75 | 3000 |
最終学歴 | 3.11 | 0.89 | 1 | 4 | 3000 |
職業:勤め | 0.50 | 0.50 | 0 | 1 | 3000 |
職業:自営業 | 0.08 | 0.28 | 0 | 1 | 3000 |
職業:学生 | 0.05 | 0.21 | 0 | 1 | 3000 |
職業:専業主婦(夫) | 0.20 | 0.40 | 0 | 1 | 3000 |
職業:無職・引退 | 0.15 | 0.35 | 0 | 1 | 3000 |
職業:その他 | 0.02 | 0.14 | 0 | 1 | 3000 |
世帯収入 | 6190334.00 | 4233639.26 | 643629 | 25286751 | 3000 |
lm()
関数内のformulaにfactor化した名目変数を追加するだけ
jes_df <- jes_df |>
mutate(Gender = factor(Gender, levels = 1:2, labels = c("Male", "Female")),
Job = factor(Job, levels = 1:6, labels = c("Salary", "Self", "Student", "House",
"Retire", "Etc")))
dummy_fit1 <- lm(Temp_Rikken ~ Ideology + Interest + Gender + Age + Education + Job + Income,
data = jes_df)
係数 | 標準誤差 | t統計量 | p値 | |
---|---|---|---|---|
(Intercept) | 34.774 | 3.558 | 9.772 | 0.000 |
Ideology | −2.117 | 0.220 | −9.616 | 0.000 |
Interest | −1.404 | 0.610 | −2.302 | 0.021 |
GenderFemale | 3.395 | 1.071 | 3.170 | 0.002 |
Age | 0.187 | 0.037 | 5.026 | 0.000 |
Education | 1.970 | 0.540 | 3.648 | 0.000 |
JobSelf | −2.187 | 1.737 | −1.259 | 0.208 |
JobStudent | 5.775 | 2.369 | 2.438 | 0.015 |
JobHouse | 2.172 | 1.415 | 1.535 | 0.125 |
JobRetire | −1.160 | 1.519 | −0.764 | 0.445 |
JobEtc | −0.807 | 3.393 | −0.238 | 0.812 |
Income | 0.000 | 0.000 | −1.343 | 0.179 |
Ideology
:保守的であるほど、立民に対する感情温度が低くなる。
Interest
:政治関心がないほど、立民に対する感情温度が低くなる。Age
:年齢が高いほど、立民に対する感情温度が高くなる。Education
:高学歴ほど、立民に対する感情温度が低くなる。Gender
変数:投入されなかったのは女性ダミー(GenderFemale
)であるため、男性ダミー(GenderMale
)がベース・カテゴリー
GenderFemale
:男性に比べ、女性は立民に対する感情温度が約3.4度高い。Job
変数:投入されなかったのは勤めダミー(JobSalary
)であるため、勤めダミー(JobSalary
)がベース・カテゴリー
JobSelf
:勤めの人に比べ、自営業の人は立民に対する感情温度が約2.2度低い。JobStudent
:勤めの人に比べ、学生は立民に対する感情温度が約5.8度高い。[1] "Male" "Female"
[1] "Salary" "Self" "Student" "House" "Retire" "Etc"
fct_relevel()
を使用
ダミー変数の係数のみ変化することに注目(切片も変わるものの、切片はそもそも解釈しない)
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 34.774 | 3.558 | 9.772 | 0.000 |
Ideology | −2.117 | 0.220 | −9.616 | 0.000 |
Interest | −1.404 | 0.610 | −2.302 | 0.021 |
GenderFemale | 3.395 | 1.071 | 3.170 | 0.002 |
Age | 0.187 | 0.037 | 5.026 | 0.000 |
Education | 1.970 | 0.540 | 3.648 | 0.000 |
JobSelf | −2.187 | 1.737 | −1.259 | 0.208 |
JobStudent | 5.775 | 2.369 | 2.438 | 0.015 |
JobHouse | 2.172 | 1.415 | 1.535 | 0.125 |
JobRetire | −1.160 | 1.519 | −0.764 | 0.445 |
JobEtc | −0.807 | 3.393 | −0.238 | 0.812 |
Income | 0.000 | 0.000 | −1.343 | 0.179 |
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 37.362 | 4.936 | 7.570 | 0.000 |
Ideology | −2.117 | 0.220 | −9.616 | 0.000 |
Interest | −1.404 | 0.610 | −2.302 | 0.021 |
GenderMale | −3.395 | 1.071 | −3.170 | 0.002 |
Age | 0.187 | 0.037 | 5.026 | 0.000 |
Education | 1.970 | 0.540 | 3.648 | 0.000 |
JobSalary | 0.807 | 3.393 | 0.238 | 0.812 |
JobSelf | −1.380 | 3.677 | −0.375 | 0.707 |
JobStudent | 6.582 | 4.111 | 1.601 | 0.109 |
JobHouse | 2.979 | 3.483 | 0.855 | 0.392 |
JobRetire | −0.353 | 3.547 | −0.100 | 0.921 |
Income | 0.000 | 0.000 | −1.343 | 0.179 |
ある変数を1次関数を用いて変換すること。
dummy_fit1
の世帯収入(Income
)の傾き係数は約-1.538790e-07
Income
の単位は1円であるため、そのまま解釈可能Income
の単位は1円であるため、係数に100万をかける。
Income
の単位を100万円に変えてしまったらいいんじゃない?Income
を100万単位にするためには、Income
を100万で割るだけで良い# jes_dfのIncomeの値を100万で割り、Income_mという新しい変数として追加し、
# jes_df3という新しいデータフレームを作成。
# 変数名は何でも良いが、ここではmillionの頭文字(m)を使用
jes_df3 <- jes_df |>
mutate(Income_m = Income / 1000000)
# 使用するデータは jes_df3 、Incomeの代わりにIncome_mを投入
fit3 <- lm(Temp_Rikken ~ Ideology + Interest + Gender + Age + Education + Job + Income_m,
data = jes_df3)
他の係数は一切変わらず、線形変換された変数の係数(と標準誤差)のみ変わる。
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 34.774 | 3.558 | 9.772 | 0.000 |
Ideology | −2.117 | 0.220 | −9.616 | 0.000 |
Interest | −1.404 | 0.610 | −2.302 | 0.021 |
GenderFemale | 3.395 | 1.071 | 3.170 | 0.002 |
Age | 0.187 | 0.037 | 5.026 | 0.000 |
Education | 1.970 | 0.540 | 3.648 | 0.000 |
JobSelf | −2.187 | 1.737 | −1.259 | 0.208 |
JobStudent | 5.775 | 2.369 | 2.438 | 0.015 |
JobHouse | 2.172 | 1.415 | 1.535 | 0.125 |
JobRetire | −1.160 | 1.519 | −0.764 | 0.445 |
JobEtc | −0.807 | 3.393 | −0.238 | 0.812 |
Income | 0.000 | 0.000 | −1.343 | 0.179 |
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 34.774 | 3.558 | 9.772 | 0.000 |
Ideology | −2.117 | 0.220 | −9.616 | 0.000 |
Interest | −1.404 | 0.610 | −2.302 | 0.021 |
GenderFemale | 3.395 | 1.071 | 3.170 | 0.002 |
Age | 0.187 | 0.037 | 5.026 | 0.000 |
Education | 1.970 | 0.540 | 3.648 | 0.000 |
JobSelf | −2.187 | 1.737 | −1.259 | 0.208 |
JobStudent | 5.775 | 2.369 | 2.438 | 0.015 |
JobHouse | 2.172 | 1.415 | 1.535 | 0.125 |
JobRetire | −1.160 | 1.519 | −0.764 | 0.445 |
JobEtc | −0.807 | 3.393 | −0.238 | 0.812 |
Income_m | −0.154 | 0.115 | −1.343 | 0.179 |
dummy_fit1
の政治関心の傾き係数は約-1.404
Interest
が1単位上がると、立憲民主党への感情温度が約1.404度下がる。」
Interest
)の値は1
が関心あり、2
がやや関心あり、…、4
が関心なしInterest
が1単位上がる」ということは、「政治関心が1単位下がる」ことを意味する。Interest
が1単位上がると、立憲民主党への感情温度が約1.404度下がる。」の意味は…
Interest
の値を逆転させておけば良いのでは??Interest
は1〜4であるため、5から引く# jes_df3のInterestの値を5から引き、Interest_rという新しい変数として追加し、jes_df3を上書きする。
# 変数名は何でも良いが、ここではreverseの頭文字を使用
jes_df3 <- jes_df3 |>
mutate(Interest_r = 5 - Interest)
# 使用するデータは jes_df3 、Interestの代わりにInterest_rを投入
fit4 <- lm(Temp_Rikken ~ Ideology + Interest_r + Gender + Age + Education + Job + Income_m,
data = jes_df3)
他の係数は一切変わらず、線形変換された変数の係数(と標準誤差)の符号のみ変わる。
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 34.774 | 3.558 | 9.772 | 0.000 |
Ideology | −2.117 | 0.220 | −9.616 | 0.000 |
Interest | −1.404 | 0.610 | −2.302 | 0.021 |
GenderFemale | 3.395 | 1.071 | 3.170 | 0.002 |
Age | 0.187 | 0.037 | 5.026 | 0.000 |
Education | 1.970 | 0.540 | 3.648 | 0.000 |
JobSelf | −2.187 | 1.737 | −1.259 | 0.208 |
JobStudent | 5.775 | 2.369 | 2.438 | 0.015 |
JobHouse | 2.172 | 1.415 | 1.535 | 0.125 |
JobRetire | −1.160 | 1.519 | −0.764 | 0.445 |
JobEtc | −0.807 | 3.393 | −0.238 | 0.812 |
Income_m | −0.154 | 0.115 | −1.343 | 0.179 |
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 27.753 | 3.078 | 9.015 | 0.000 |
Ideology | −2.117 | 0.220 | −9.616 | 0.000 |
Interest_r | 1.404 | 0.610 | 2.302 | 0.021 |
GenderFemale | 3.395 | 1.071 | 3.170 | 0.002 |
Age | 0.187 | 0.037 | 5.026 | 0.000 |
Education | 1.970 | 0.540 | 3.648 | 0.000 |
JobSelf | −2.187 | 1.737 | −1.259 | 0.208 |
JobStudent | 5.775 | 2.369 | 2.438 | 0.015 |
JobHouse | 2.172 | 1.415 | 1.535 | 0.125 |
JobRetire | −1.160 | 1.519 | −0.764 | 0.445 |
JobEtc | −0.807 | 3.393 | −0.238 | 0.812 |
Income_m | −0.154 | 0.115 | −1.343 | 0.179 |
いずれもデータ分析の場面ではよく使われる方法