Rで何かをしたり、読書をするブログ

政府統計の総合窓口のデータや、OECDやUCIやのデータを使って、Rの練習をしています。ときどき、読書記録も載せています。

景気ウォッチャー調査 季節調整値 全国の分野・業種別DIの推移 のデータ分析5 - ランダムフォレストモデルで予測

www.crosshyou.info

の続きです。

今回は、randomForest パッケージを使って、ランダムフォレストモデルで予測してみます。

パッケージを読み込みます。

モデルを学習します。

テスト用データの予測をします。

RMSEと相関係数を計算します。

他のモデルのRMSE, 相関係数と比較しましょう。

RMSE, 相関係数ともにランダムフォレストモデルで予測したものが一番悪い成績ですね。

実際の値と予測値のグラフを描いてみます。

黒は実際の値で、赤がOLSによる予測、緑がランダムフォレストによる予測です。

OLSのほうが実績値に近いことがわかります。

今回は以上です。

はじめから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

#

# 第3の予測手法: Random Forest
#
# パッケージの読み込み
library(randomForest)
#
# モデル学習
set.seed(7)
model3 <- randomForest(
  total_future ~ current1 + current2 + current3 +
    level1 + level2 + level3,
  data = df_train,
  ntree = 500
)
#
# 予測
pred3 <- predict(model3, df_test)
#
# RMSE、相関係数の計算
rmse3 <-
  sqrt(mean*1
#
corr3 <-
  cor(pred3, df_test$total_future)
#
# いままでの比較
c(lm = rmse1, tree = rmse2, rf = rmse3)
c(lm = corr1, tree = corr2, rf = corr3)
#
# 実際の値と予測値のグラフ
tibble(
  date = df_test$date,
  actual = df_test$total_future,
  OLS = pred1,
  RF = pred3
) |> 
  ggplot(aes(x = date)) +
  geom_line(aes(y = actual)) +
  geom_line(aes(y = OLS), color = "red") +
  geom_line(aes(y = RF), color = "green") +
  labs(title = "Black: Actual, Red: OLS, Green: Random Forest") +
  theme_minimal()
#

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、
It is sunset time, there are 2 white clouds, a small river runs through wild land, a close up of red spider lily, HIGANBANA.

storytelling
cinematic
vibrant colors
rich details
beautiful lighting
atmospheric
visually striking
masterpiece
professional artwork です。)

 

*1:pred3 - df_test$total_future)^2

景気ウォッチャー調査 季節調整値 全国の分野・業種別DIの推移 のデータ分析4 - 決定木モデルで予測する。

www.crosshyou.info

の続きです。今回は、決定木モデルで予測してみます。rpart パッケージを使いました。

rpart.plot パッケージは、決定木を描く時に使います。

早速、モデルを学習します。

rpart.plot() 関数でグラフを描きます。

驚くことに、current1しか使っていないです。

テスト用データの予測をします。

RMSE, 相関係数を計算します。OLSよりも良い結果になるでしょうか?

RMSEは値が小さいほうがよくて、相関係数は値が大きいほうがいいです。

結果を見ると、決定木モデルはOLSよりも悪いですね。

実際の値と予測値のグラフを描きます。

黒が実際の値、赤がOLSの予測値、緑が決定木の予測値です。

current1だけでも結構それらしいグラフになってますね。

今回は以上です。

はじめから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

# 第2の予測手法: 決定木モデル
#
# rpartパッケージの読み込み
library(rpart)
library(rpart.plot)
#
# モデルの学習
model2 <- rpart(total_future ~ ., data = df_train,
                method = "anova")
#
# モデルを描く
rpart.plot(model2)
#
# テスト用データの予測
pred2 <- predict(model2, newdata = df_test)
#
# RMSE, 相関係数の計算
rmse2 <-
  sqrt(mean*1
#
corr2 <-
  cor(pred2, df_test$total_future)
#
# OLSとの比較
c(OLS = rmse1, Tree = rmse2)
c(OLS = corr1, Tree = corr2)
#
# 実績値と予測値のグラフ
tibble(
  date = df_test$date,
  actual = df_test$total_future,
  OLS = pred1,
  Tree = pred2
) |> 
  ggplot(aes(x = date)) +
  geom_line(aes(y = actual)) +
  geom_line(aes(y = OLS), color = "red") +
  geom_line(aes(y = Tree), color = "green") +
  labs(title = "Black: Actual, Red: OLS, Green: Tree") +
  theme_minimal()
#

 

 

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、Background is blue sky and a few small white clouds, forefront is pink Cosmos flowers.

storytelling
cinematic
vibrant colors
rich details
beautiful lighting
atmospheric
visually striking
masterpiece
professional artwork です。)

 

*1:pred2 - df_test$total_future)^2

読書記録 - 「教養としての栄養学 食習慣と健康の常識を疑う」 村上 健太郎 著 (中公新書)

2026年10月25日に発行された本です。

栄養学というと、私は、ビタミンCは~~~とか、炭水化物は~~~という栄養素についての本かと思いました。でもこの本はそうではなくて、どんな食事をしている人がやせているかとか糖尿病になりやすいか、などの食事と健康状態の関連を調べる栄養疫学という分野の本でした。

テレビや広告で、○○を食べると高血圧が改善する、とか血糖値が下がるとか宣伝しています。この本ではそういう一つの食材と健康状態の関連、因果関係を調べるのはとても難しいことが書かれています。

例えば、「チョコレートを食べると太る(痩せる)」ということを調べようとしても人はチョコレートだけを食べて生活しているわけではないので、他にどんなものを食べているか、喫煙や毎日の睡眠や運動などの影響を考慮しなければならないなど、とても難しいということです。なので、しばしば、ある研究では、チョコレートを食べると太るという結果が得られ、他の研究ではチョコレートを良く食べている人は(そうでない人よりも)痩せている、というような逆の結果が得られることがあるということです。

この本での書かれている栄養疫学だけでなく、その他の科学的な研究なども、どのような方法で調べたか、どんなことを対象に調べたかなどを注意するということが大切なことだとわかりました。

 とりあえず、脂肪や糖質の摂りすぎはよくない、野菜やナッツ類はなるべく食べるということは健康にいいということは確実なようです。

 

景気ウォッチャー調査 季節調整値 全国の分野・業種別DIの推移 のデータ分析3 - OLSで先行き判断(方向性)を予測する。

www.crosshyou.info

の続きです。今回の景気ウォッチャー調査の分析テーマは、先行き判断(方向性)を予測するモデルを作る、にしたいと思います。

予測する被説明変数は、total_futureで、説明変数は、total_current: 現状判断(方向性)とtotal_level: 現状判断(水準)でやろうと思います。

つまり、現状の景気の方向性と、水準から景気の先行きの方向性を予測するということです。

まずは、そのためのデータフレームを作ります。

次に、過去のtotal_current, total_levelから今のtotal_futureを作ります。

まず、データの並び順を一番古い日付が上に来るようにします。arrange()関数を使います。

そうしたら、lag()関数で、total_current, total_levelをずらします。

total_currentとtotal_futureは予測には使えないので削除します。

NAの行をna.omit()関数で削除します。

モデルを推定する前に、OLSでどのくらいのp値が出るか確認しておきましょう。全然ダメなら線形モデル以外のモデル、決定木などを考えなくてはいけないですからね。

p-value: < 2.2e-16 となっていますので、線形モデルでいけそうです。

まず、データフレームをトレーニング用データとテスト用のデータに分割します。

2023年1月以降をテスト用データ、それより前をトレーニング用データにしました。

それでは、lm()関数でOLSでモデルを学習します。

1ヶ月前と2ヶ月前のcurrentと1ヶ月前のlevelが有意な変数です。

このモデルを使って、テスト用データの推定をしましょう。

今回は、RMSEと相関係数で予測手法の評価をしたいと思います。

RMSEは2.27で相関係数は0.76です。

次回以降の予測手法で2.27よりも小さいRMSEと、0.76よりも大きい相関係数を目指しましょう。

最後に実際の値と予測値のグラフを描いてみます。

なんか予測値は実績値の後追いのような感じですね。次回以降の予測では、このグラフの形状ももっと一致するような予測ができたらいいですね。

今回は以上です。

次回は、

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

#
# 予測モデルの為のデータフレームを作る
df1 <- df_wide |> 
  select(total_future, total_current, total_level, date)
df1
#
# 日付を昇順にする
df1 <- df1 |> 
  arrange(date)
df1
#
# total_current, total_levelの1月前、2月前、3月前のデータを作る
df1 <- df1 |> 
  mutate(current1 = lag(total_future, 1),
         current2 = lag(total_future, 2),
         current3 = lag(total_future, 3),
         level1 = lag(total_level, 1),
         level2 = lag(total_level, 2),
         level3 = lag(total_level, 3))
df1
#
# total_current, total_levelは予測には使えないので削除する
df1 <- df1 |> 
  select(total_future, current1, current2, current3, level1, level2,
         level3, date)
df1
#
# NAを削除する
df1 <- na.omit(df1)
df1
#
# OLSでどのくらいのp値になるか
lm(total_future ~ ., data = df1) |> summary()
#
# 2023年1月以降をテスト用データ、2022年12月以前をトレーニング用データにする。
df_train <- df1 |> 
  filter(date <= ymd("2022-12-31"))
summary(df_train)
#
df_test <- df1 |> 
  filter(date >= ymd("2023-01-01"))
summary(df_test)
#
# 第一の予測: 線形モデルをOLSで
model1 <- lm(total_future ~ ., data = df_train)
#
# model1のサマリー
summary(model1)
#
# model1で予測
pred1 <- predict(model1, newdata = df_test)
#
# RMSEと相関係数を算出
rmse1 <- sqrt(mean*1
rmse1
corr1 <- cor(pred1, df_test$total_future)
corr1
#
# 実際の値と予測の値のグラフ
df_test |> mutate(predict = pred1) |> 
  ggplot(aes(x = date)) +
  geom_line(aes(y = total_future)) +
  geom_line(aes(y = predict), color = "red") +
  labs(title = "Black: Actual, Red: Estimate") +
  theme_minimal()
#

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは以下になります。Landscape of higher wild land, there are some red and yellow flowers, blue sky, there are no artificial objectives, a close up of white MIZUBASHOU flowers.
storytelling
cinematic
vibrant colors
rich details
beautiful lighting
atmospheric
visually striking
masterpiece
professional artwork です。)

*1:pred1 - df_test$total_future)^2

景気ウォッチャー調査 季節調整値 全国の分野・業種別DIの推移 のデータの分析2 - 合計のデータの視覚化

www.crosshyou.info

の続きです。前回はCSVファイルのデータをRに読み込ませました。

そのデータフレームを少し整形して分析しやすくします。

まず、typeを少し手直しします。

typeは、このように、景気の現状判断(方向性), 景気の先行き判断(方向性), 景気の現状判断(水準)の3つのタイプです。日本語だと、少しこれからの分析に手間取るので、英語に変えます。

summary()関数で確認します。

サマリーの出力結果が見やすくなりました。codeとtypeは実質同じ情報なので、codeを削除します。

pivot_wider()関数で、横型のデータフレームを作成しておきます。

今回は、total(合計)のデータについて、調べてみましょう。

まずは、時系列のグラフにしてみます。

2008年頃の落ち込みは、リーマンショックですね。2020年頃の落ち込みはコロナ禍ですね。

ヒストグラムを描いてみます。

どれも同じような分布形状です。左側のほうが裾野が広いです。

type別の基本統計量をみてみます。

future(景気の先行き判断(方向性))が一番平均値が高く、CV(変動係数)が小さいです。基本的に楽天的なんですかね?

current, future, level, この3つのデータの相関係数マトリックスをみてみましょう。

相関係数は、0.8から0.9くらいですので、3つのデータは相関はとても高いことがわかります。

今回は以上です。

次回は、

www.crosshyou.info

です。

はじめから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

#
# typeのレベル
levels(df$type)
#
# typeのレベルを書き換え
levels(df$type) <- c("current", "future", "level")
#
# サマリー
summary(df)
#
# codeを削除
df <- df |> select(-code)
#
# サマリー
summary(df)
#
# dfをwide型に
df_wide <- df |> 
  pivot_wider(
    names_from = type,
    values_from = total:employment
  )
df_wide
#
# totalの時系列グラフ
df |> 
  ggplot(aes(x = date, y = total, group = type)) +
  geom_line(aes(color = type)) +
  theme_minimal()
#
# totalのヒストグラム
df |> 
  ggplot(aes(x = total, group = type)) +
  geom_histogram(aes(fill = type), color = "black") +
  facet_wrap(~ type, nrow = 3) +
  theme_minimal()
#
# totalの基本統計量(type別)
df |> 
  group_by(type) |> 
  summarize(
    minimum = min(total),
    average = mean(total),
    median = median(total),
    maximum = max(total),
    stdev = sd(total),
    cv = sd(total) / mean(total),
    n = n()
  )
#
# totalの相関係数マトリックス
df_wide |> 
  select(total_current, total_future, total_level) |> 
  cor()
#

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、Land scape of long wide river side fields. Close up of a white tulip flower.

storytelling
cinematic
vibrant colors
rich details
beautiful lighting
atmospheric
visually striking
masterpiece
professional artwork です。)

 

景気ウォッチャー調査 季節調整値 全国の分野・業種別DIの推移 のデータの分析1 - CSVファイルのデータをRに読み込む

今回からしばらくは、景気ウォッチャー調査 季節調整値 全国の分野/業種別DIの推移のデータを分析してみようと思います。景気ウォッチャー調査はこのブログでは何回も取り上げられているものですが、私自身が内容を忘れているので気にせずにいきます。

景気ウォッチャー調査 | データベース | 統計データを探す | 政府統計の総合窓口

e-Stat 政府統計の総合窓口からデータを取得します。上の図の、「月次(12件)」をクリックします。

景気ウォッチャー調査にはいろいろなデータベースがあります。今回は、一番上にある、季節調整値 全国の分野・業種別DIの推移 を使います。

こんな感じのデータですね。時系列データで、いくつかのDIがあります。ダウンロードをクリックして、CSVファイルをダウンロードしました。

空欄の列を削除して、11行目に変数名を加えました。このCSVファイルをRに読み込みます。

まず、tidyverseパッケージの読み込みをしておきます。

read_csv()関数でCSVファイルを読み込みます。11行目からデータが始まっているので、skip = 10 を加えます。

glimpse()関数でデータを確認します。

文字化けもせず無事に読み込みできたようです。

891行、13列のデータフレームです。

code, type が文字列型になっています。これは、

景気の現状判断 (方向性)

景気の先行き判断 (方向性)

景気の現状判断 (水準)

の3種類ですので、ファクター型に変換します。

codeは数値型なので、まず、as.character()関数で文字列型に変換してから、fct()関数でファクター型にしています。

summary()関数でデータフレームのサマリーを確認します。

NAはないですね。また数値データは、正の数値です。

各変数が何を意味するか書いておきます。

code:            景気の方向性及び水準 コード
type:             景気の方向性及び水準
date:             時間軸(月次)
total:             合計
house:           家計動向関連
h_retail:         家計動向関連_小売関連
h_food:          家計動向関連_飲食関連
h_service:       家計動向関連_サービス関連
h_residential: 家計動向関連_住宅関連
firm:               企業動向関連
f_manu:          企業動向関連_製造業
f_nonmanu:    企業動向関連_非製造業
employment:  雇用関連

です。

今回は以上です。

次回は、

www.crosshyou.info

です。

 

今回のコードは以下になります。

#
# tidyverseパッケージの読み込み
library(tidyverse)
#
# CSVファイルの読み込み
df_raw <- read_csv("keiki_watcher2.csv", skip = 10)
#
# データの確認
glimpse(df_raw)
#
# ファクター型に変換
df <- df_raw |> 
  mutate(
    code = fct(as.character(code)),
    type = fct(type)
  )
#
# サマリーの確認
summary(df)
#

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、

Natural landscape photograph, green grass field, blue sky and white clouds, close up of red rose flower,

storytelling
cinematic
vibrant colors
rich details
beautiful lighting
atmospheric
visually striking
masterpiece
professional artwork
です。)

 

読書記録 - 「ちくま日本文学004 尾崎翠」 尾崎 翠 (筑摩書房)

とても不思議な感じのする本でした。

「第七官界彷徨」や「地下室アントンの一夜」、「こおろぎ嬢」など何か不思議な世界の話が多い本でした。

自分の文章能力の無さから、上手く読後感を説明できないです。短編、中編集ですが、どのお話も読んでいて不思議な気持ちになりました。

例えば、「地下室アントンの一夜」はおたまじゃくしのことを書こうとしている詩人とか、動物学者とかのノートが書かれているのですが、彼らの書いていることが支離滅裂な感じでした。でも、それは不快な支離滅裂ではなくて、なんか面白い支離滅裂でした。

「ちくま日本文学」という全集に採用されていなければ、自分から買って読もうとは絶対に思わない作者でしたので、こうして読むことができて良かったです。