8/ 線形回帰分析(2)
関西大学総合情報学部
すぐに実習できるように準備しておきましょう。
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
jes_df
N: 3000
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 |
いずれもデータ分析の場面ではよく使われる方法