crosshyou

主にクロス表(分割表)分析をしようかなと思いはじめましたが、あまりクロス表の分析はできず。R言語の練習ブログになっています。

東証一部の規模別・業種別PERとPBRデータの分析4 - R言語のlm関数で回帰分析

 

www.crosshyou.info

 の続きです。

今回は、TotalexFn, 金融を除いた全体のデータを見てみましょう。

まずは、データフレームの始めの10行を表示して、TotalexFnのLevelを確認しましょう。head関数を使います。

f:id:cross_hyou:20190327210425j:plain

TotalexFnのLevelは3ですね。絞り込みます。

f:id:cross_hyou:20190327210820j:plain

Level(3列目)とType(4列目)は必要ないので、削除します。

f:id:cross_hyou:20190327211130j:plain

データはすべて数値型ですね。

今回は、lm関数を使って、回帰分析の練習をしてみます。

 

Statistics: An Introduction Using R (English Edition)

Statistics: An Introduction Using R (English Edition)

 

 この本を参考にしてみます。

PERと一番相関の強い変数で線形単回帰分析をしてみます。cor関数で相関を調べましょう。

f:id:cross_hyou:20190327211602j:plain

Incomeが一番(負の)相関が強いですね。IncomeでPERを回帰しましょう。

まずは、グラフを作成します。

f:id:cross_hyou:20190327211858j:plain

f:id:cross_hyou:20190327211916j:plain

右肩下がりのグラフですね。

lm関数で線形単回帰モデルを作成します。

f:id:cross_hyou:20190327212643j:plain

PER = 3.40e+01 - 5.43e-05 * Income という回帰式です。

3.40e+01は34です。5.43e-05は0.0000543です。

なので、PER = 34 - 0.0000543 * Income です。

さきほどのグラフにこのモデルの直線を重ねてみます。abline関数です。

f:id:cross_hyou:20190327213338j:plain

f:id:cross_hyou:20190327213353j:plain

このグラフにさらに、観測値(青い点)と予測値(緑の直線)の差分のラインを引いてみましょう。まず、predict関数を使って予測値のベクトルを用意します。

f:id:cross_hyou:20190327213953j:plain

次にfor関数を使います。

f:id:cross_hyou:20190327214907j:plain

f:id:cross_hyou:20190327214923j:plain

summary関数でmodel1の基本データを表示します。

f:id:cross_hyou:20190327215813j:plain

こんどはIncomeを対数変換した値で線形回帰してみましょう。

まずは、Incomeを対数変換したベクトルを用意します。

f:id:cross_hyou:20190327220118j:plain

このlogIncomeを使ってlm関数でモデルを作成します。

f:id:cross_hyou:20190327220359j:plain

R-squaredが0.8644とmodel1の0.8111よりも良くなっています。
散布図と回帰直線を重ねてみます。

f:id:cross_hyou:20190327220829j:plain

f:id:cross_hyou:20190327220841j:plain

もうひとつ、PERも対数変換したモデルも試してみましょう。

f:id:cross_hyou:20190327221114j:plain

こうしてPERを対数変換したベクトルを用意しました。

f:id:cross_hyou:20190327221313j:plain

R-squaredが0.8488なので、model2よりは悪いですね。散布図と回帰直線を重ねます。

f:id:cross_hyou:20190327221610j:plain

f:id:cross_hyou:20190327221624j:plain

最後にPERとIncomeの散布図にmodel1, model2, model3の回帰線を重ねてみましょう。

散布図はplot関数、model1の回帰直線はabline関数、model2とmodel3の回帰線はcureve関数で描きます。

f:id:cross_hyou:20190327224719j:plain

 

f:id:cross_hyou:20190327224735j:plain



今回は以上です。

次回は

 

www.crosshyou.info

 

です。

 

今回のR言語のコードです。


# データフレームの始めの10行を表示
head(df, 10)

# TotalexFnだけのデータフレームを作成
df3 <- df[df$Type == "TotalexFn", ]
str(df3)
summary(df3)

# LevelとTypeを削除
df3 <- df3[ , -c(3, 4)]
str(df3)
summary(df3)

# PERとの相関関係
cor(df3, df3$PER)

# PERとIncomeのグラフ
plot(df3$Income, df3$PER, pch = 21, bg = "blue")

# lm関数で線形単回帰モデル
model1 <- lm(PER ~ Income, data = df3)
model1

# PERとIncomeのグラフと回帰直線
plot(df3$Income , df3$PER, pch = 21, bg = "blue")
abline(model1, col = "green")

# 予測値のベクトルを用意
fitted <- predict(model1)

# PERとIncomeのグラフと回帰直線と残差
plot(df3$Income, df3$PER, pch = 21, bg = "blue")
abline(model1, col = "green")
for (i in 1:length(fitted))
lines(c(df3$Income[i], df3$Income[i]), c(df3$PER[i], fitted[i]), col = "red")

# summary関数
summary(model1)

# Incomeを対数変換したベクトル
logIncome <- log(df3$Income)

# Incomeを対数変換したモデル
model2 <- lm(df3$PER ~ logIncome)
summary(model2)

# 散布図と回帰直線
plot(logIncome, df3$PER, pch = 21, bg = "blue")
abline(model2, col = "red")

# PERを対数変換したベクトル
logPER <- log(df3$PER)

# PER, Incomeともに対数変換したモデル
model3 <- lm(logPER ~ logIncome)
summary(model3)

# 散布図と回帰直線
plot(logIncome, logPER, pch = 21, bg = "blue")
abline(model3, col = "orange")

# 散布図とmodel1, model2, model3
xhani <- range(df3$Income) # X軸の範囲
yhani <- range(df3$PER) # Y軸の範囲
plot(df3$Income, df3$PER, pch = 21, bg = "blue", xlab = "", ylab = "", main = "",
xlim = xhani, ylim = yhani) # 散布図
abline(model1, col = "red", lwd = 3) # model1の回帰直線
par(new = TRUE)
curve(165.1504 -11.6929 * log(x), from = xhani[1], to = xhani[2],
col = "green", lwd = 3, xlab = "", ylab = "", main = "",
xlim = xhani, ylim = yhani) # model2の回帰曲線
par(new = TRUE)
curve(exp(9.45722 -0.5219 * log(x)), from = xhani[1], to = xhani[2],
col = "yellow", lwd = 3, xlab = "Income", ylab = "PER",
main = "Red:Model1, Green:Model2, Yellow:Model3", xlim = xhani, ylim = yhani)
  # model3の回帰曲線