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

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

都道府県別の商業動態統計調査のデータの分析6 - tidymodelsによるクロスバリデーションでのパラメータのチューニング・グリッドの生成

www.crosshyou.info

の続きです。前回までで8つのモデルのワークフローを作成しました。今回はパラメータのチューニングをします。

まず、クロスバリデーションのデータを生成します。

grid_regular()関数でチューニング・グリッドを生成していきます。

線形モデルはチューニングは不要なので、ペナルティ付き線形モデル(glmnet)以降のモデルのチューニング・グリッドを作成していきます。

まず、ペナルティ付き線形モデル(glmnet)ですが、penaltyは正則化の強さを表すパラメータで、値が大きいほどモデルの係数が小さくなりシンプルになります。10^-4 から10^0, までの範囲にしています。mixtureはL1(LASSO)とL2(Ridge)の比率です。今回は0.2(Ridgeより)から0.8(LASSOより)にしてみました。

決定木モデルのパラメータについては、cost_complexityは枝を剪定する強さで、値が大きいと剪定をいっぱいして木が単純になります。tree_depthは木の階層数です。値が大きいと階層がいっぱいの複雑な木になります。min_nは枝分かれするための最小サイズで値が小さいほど細かく分割します。

ランダムフォレストモデル以下のチューニング・グリッドを作成していきます。

ランダムフォレストモデルのmtryは各ノードの分かれ目で、何個の説明変数を使うかです。値が小さいと多様性が増えて過学習しにくくなりますが、精度は落ちます。min_nは決定木モデルと同じです。値が大きいと単純な木になり過学習はしにくくなります。

サポートベクター回帰(SVR)モデルのcostは誤分類に対するペナルティの強さを表します。値が大きいと誤分類を許さなくて過学習しやすくなります。rbf_sigmaはRBFカーネルの広がりを表します。値が大きいと境界が細かく曲がり過学習しやすくなります。

k-NN回帰モデル(kknn)のneighborsは予測するときに参照する近いデータの点の数です。値が小さいと過学習しやすくなり、値が大きいと滑らかになります。

ニューラルネットワークモデル(nnet)のhidden_unitsは隠れ層のユニット数です。値が大きいとモデルが複雑になります。penaltyは正則化の重みです。値が大きいと強い正則化になります。epochsは学習エポック数です。データを何回繰り返して学習するかです。値が小さいと学習不足、大きいと過学習になりやすいです。

勾配ブースティング回帰モデル(xgboost)のmtryはランダムフォレストモデルのmtryと同じで使う特徴量の数です。大きいと過学習しやすいです。min_nは分割する際の最小サンプル数です。小さいと木が細かく分割されて複雑になります。tree_depthは木の深さです。深いと複雑な関係をとらえることができますが、過学習になりやすいです。lean_rateは学習率で小さいと学習がゆっくり進みます。loss_reductionはノードを分割するために必要は最小損失減少量です。小さいと分割がたくさんになり複雑な木になります。sample_sizeは各木を作るときに使うサンプルの割合です。大きいと多くのデータを使うので精度は上がりやすいですが、過学習になりやすいです。

これでチューニング・グリッドの作成は終わりました。

今回は以上です。

次回は

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

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

#
# 4. クロスバリデーションの設定
set.seed(888)
folds <- vfold_cv(train_data, v = 10) 
#
# 5. チューニング・グリッドの設定
# 5-1. 線形モデル(lm)
# 線形モデルは不要
#
# 5-2. ペナルティ付き線形モデル(glmnet)
glmnet_grid <- grid_regular(
  penalty(range = c(-4, 0)),
  mixture(range = c(0.2, 0.8)),
  levels = c(30, 7)
)
#
# 5-3. 決定木モデル(rpart)
rpart_grid <- grid_regular(
  cost_complexity(range = c(-4, -1)),
  tree_depth(range = c(1L, 8L)),
  min_n(range = c(2L, 20L)),
  levels = c(5, 8, 5)
)
#
# 5-4. ランダムフォレストモデル(ranger)
ranger_grid <- grid_regular(
 mtry(range = c(1L, 8L)),
 min_n(range = c(2L, 20L)),
 levels = c(8, 5)
)
#
# 5-5. サポートベクター回帰(SVR)モデル(kernlab)
kernlab_grid <- grid_regular(
  cost(range = c(-5, 5)),
  rbf_sigma(range = c(-5, 1)),
  levels = c(11, 7)
)
#
# 5-6. k-NN回帰モデル(kknn)
kknn_grid <- grid_regular(
  neighbors(range = c(1L, 40L)),
  levels = 15
)
#
# 5-7. ニューラルネットワークモデル(nnet)
nnet_grid <- grid_regular(
  hidden_units(range = c(2L, 15L)),
  penalty(range = c(-4, 0)),
  epochs(range = c(50L, 300L)),
  levels = c(10, 5, 5)
)
#
# 5-8. 勾配ブースティング回帰モデル(xgboost)
xgboost_grid <- grid_regular(
  mtry(range = c(1L, 8L)),
  min_n(range = c(2L, 20L)),
  tree_depth(range = c(2L, 8L)),
  learn_rate(range = c(-2, -1)),
  loss_reduction(range = c(-1, 1)),
  sample_size(range = c(0, 1)),
  levels = c(2, 2, 2, 2, 2, 2)
)
#

 

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、Natural scene landscape, winter season, close up of red tulip flowers, photo です。)

 

読書記録 - 「刑法入門」 山口 厚 著 (岩波新書)

2008年6月に発行された本です。はしがきには「本書を最後まで読まれれば、そのときには、犯罪に対する新たな視野が開かれることと思います。」と書いてありました。私の理解が浅いためか、くっきりとした視野は開かれない感じですが、確かに犯罪について、いままでは考えていなかった視点というか考え方があるんだな、と思いましたし、テレビの2時間ドラマの中の殺人などの犯罪についても刑法を知っているとまた違う見方、感じ方があるかもな、と思いました。

法律の用語は普段の生活では使わない用語、また普段の生活とは違った意味合いで使われたりしているので、難しいと感じました。それと、法律はなんか、コンピュータのプログラムというか、フローチャートっぽいなと思いました。この場合はこうなるとか、同じ場合でも前提によっては違う結論になるなどです。

この本を読むなら、文章を読むだけでなく、自分でノートにフローチャートのような図を描いて整理していけばもっと理解しやすくなるだろうなと思いました。

 

都道府県別の商業動態統計調査のデータの分析5 - tidymodelsによるレシピとワークフローの作成

www.crosshyou.info

の続きです。前回は8つのモデルを作成しました。今回はレシピとワークフローを作成しましょう。さくさく行きます。

まずは、線形モデルからです。

今回のデータは特に異常な外れ値や分布の偏りはないので、前処理は必要ないでしょう。

次は、ペナルティ付き線形モデル(Elastic-Net)です。

ペナルティ付き線形モデルでは、標準化は必要です。

次は、決定木モデルです。

ツリーモデルでは標準化は必要ありません。ランダムフォレストモデルも同じです。

サポートベクター回帰(SVR)モデルは標準化は必要です。

k-NN回帰モデルも距離ベースのモデルなので、標準化は必要です。

ニューラルネットワークモデルも標準化は必要です。

勾配ブースティング回帰モデルも標準化は必要です。

これで8つのレシピができました。モデルによっては標準化が不要なものと必要なものがありますよね。Copilot先生にまとめてもらいました。

たまたまですが、標準化不要なモデルが4つ、必要なモデルが4つと半々にわかれましたね。

モデル、レシピを結合してワークフローを作成します。これは特にモデルによって変更する部分はないです。workflow()とadd_model()とadd_recipe()です。

今回は以上です。

次回は、

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

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

#
# 2. レシピ作成
# 2-1. 線形モデル(lm)
lm_rec <- recipe(target ~ ., data = train_data) # 前処理は不要
#
# 2-2. ペナルティ付き線形モデル(glmnet)
glmnet_rec <- recipe(target ~ ., data = train_data) |> 
  step_normalize(all_predictors()) # 前処理は標準化のみ
#
# 2-3. 決定木モデル(rpart)
rpart_rec <- recipe(target ~ ., data = train_data) # 前処理は不要
#
# 2-4. ランダムフォレストモデル(ranger)
ranger_rec <- recipe(target ~ ., data = train_data) # 前処理は不要
#
# 2-5. サポートベクター(SVR)回帰モデル(kernlab)
kernlab_rec <- recipe(target ~ ., data = train_data) |> 
  step_normalize(all_predictors()) # 前処理は標準化のみ
#
# 2-6. k-NN回帰モデル(kknn)
kknn_rec <- recipe(target ~ ., data = train_data) |> 
  step_normalize(all_predictors()) # 前処理は標準化のみ
#
# 2-7. ニューラルネットワークモデル(nnet)
nnet_rec <- recipe(target ~ ., data = train_data) |> 
  step_normalize(all_predictors) # 前処理は標準化のみ
#
# 2-8. 勾配ブースティング回帰モデル(xgboost)
xgboost_rec <- recipe(target ~ ., data = train_data) # 前処理は不要
#
# 3. ワークフローを作成
# 3-1. 線形モデル(lm)
lm_wf <- workflow() |> 
  add_model(lm_mod) |> 
  add_recipe(lm_rec)
#
# 3-2. ペナルティ付き線形モデル(glmnet)
glmnet_wf <- workflow() |> 
  add_model(glmnet_mod) |> 
  add_recipe(glmnet_rec)
#
# 3-3. 決定木モデル(rpart)
rpart_wf <- workflow() |> 
  add_model(rpart_mod) |>
  add_recipe(rpart_rec)
#
# 3-4. ランダムフォレストモデル(ranger)
ranger_wf <- workflow() |> 
  add_model(ranger_mod) |> 
  add_recipe(ranger_rec)
#
# 3-5. サポートベクター回帰(SVR)モデル(kernlab)
kernlab_wf <- workflow() |> 
  add_model(kernlab_mod) |> 
  add_recipe(kernlab_rec)
#
# 3-6. k-NN回帰モデル(kknn)
kknn_wf <- workflow() |> 
  add_model(kknn_mod) |> 
  add_recipe(kknn_rec)
#
# 3-7. ニューラルネットワークモデル(nnet)
nnet_wf <- workflow() |> 
  add_model(nnet_mod) |> 
  add_recipe(nnet_rec)
#
# 3-8. 勾配ブースティング回帰モデル(xgboost)
xgboost_wf <- workflow() |> 
  add_model(xgboost_mod) |> 
  add_recipe(xgboost_rec)
#

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは Natural landscape of green grass fields, close up of yellow Hamamelis japonica flowers of trees, Photograph です。)

 

都道府県別の商業動態統計調査のデータの分析4 - tidymodelsによるモデル作成

www.crosshyou.info

の続きです。前回は、百貨店・スーパーの販売額の前年比の平均値が年度によって違うことがわかりました。今回からはtidymodelsで機械学習をしてみようと思います。予測する変数は、百貨店・スーパーの販売額の前年比です。これをその他のお店の前年比を使って予測してみます。

最初にデータフレームをpivot_wider()関数を使ってワイド型に変換します。

summary()関数で正しくワイド型に変換されたか確認します。

正しくワイド型に変換されていますね。このデータフレームをそのまま使用してもいいのですが、機械学習っぽくデータフレームを加工します。

予測に使わない都道府県名と年度の列を削除して、変数名をそれっぽい名前にしました。

v1は元はなんだったかなどがすぐにわかるように、Lookup Tableを作成しておきます。

こうしておけば、

こんなようにしてv1はコンビニエンスストアの販売額の前年比、v3は大型家電量販店の販売額の前年比だとすぐにわかります。

変数同士の相関マトリックスをみてみます。

0.5より大きいペア、-0.5より小さいペアは無いですね。

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

tidymodels_prefer()関数でtidymodelsの関数を優先するようにしました。

データフレームをトレーニング用とテスト用にわけます。

initial_split()関数でデータフレームを分割し、training()関数でトレーニング用、testing()関数でテスト用にわけました。そのあと、t.test()関数でトレーニング用のtargetの平均値とテスト用の平均値に差がないことを確認しています。

モデルを設定していきます。はじめは線形モデルです。

線形モデルは、linear_reg()でエンジンはlmです。線形モデルはチューニングは不要です。

次はElastic-Netモデル(ペナルティ付き線形モデル)を作りました。

Elastic-Netモデル(ペナルティ付き線形モデル)はlinear_reg()でエンジンはglmnetです。チューニングは、penaltyとmixtureです。

次は決定木モデルを作りましょう。

決定木モデルは、decision_tree()でエンジンはrpartです。set_mode()でregressionと回帰モデルに設定します。

ランダムフォレストモデルも作りました。

ランダムフォレストモデルは、rand_forest()でエンジンはrangerです。これもset_mode()でregressionとしています。set_mode()で回帰を設定します。

サポートベクター回帰(SVR)モデルも作りました。

サポートベクター回帰(SVR)モデルは、svm_rbf()にkernlabエンジンです。

k-NN回帰モデルも試そうと思います。

k-NN回帰モデルは、nearest_neighbor()にkknnエンジンを搭載します。set_mode()で回帰を設定するのは他のモデルと同じです。基本的に、linear_reg()、logistic_reg()以外はset_mode()でregressionかclassificationを指定しますね。

7番目のモデルはニューラルネットワークモデルにしました。

ニューラルネットワークモデルは、mlp()にnnetエンジンです。
最後のモデルは勾配ブースティングモデルにしましょう。

勾配ブースティングは、boost_tree()にエンジンはxgboostです。

この8つのモデルでtargetを予測するモデルを作っていきます。

今回は以上です。

次回は、

www.crosshyou.info

です。

 

はじめから読むには

www.crosshyou.info

です。

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

#
# dfをワイド型に変換する
df_wide <- df |> 
  pivot_wider(
    names_from = c(type, shop),
    values_from = yoy
)
#
# df_wideのサマリー
summary(df_wide)
#
# 機械学習用にデータフレームを別に作る
df2 <- df_wide |> 
  select(-pref, -year)
colnames(df2) <- 
  c("target", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9")
summary(df2)
#
# 変数名のLookup Table
v_names <- names(df2)
names(v_names) <- colnames(df_wide[ , -c(1, 2)])
v_names
#
# v1は
v_names[v_names == "v1"]
#
# v3は
v_names[v_names == "v3"]
#
# df2の相関マトリックス
cor(df2)
#
# tidymodelsの読み込み
library(tidymodels)
#
# tidymodels優先
tidymodels_prefer()
#
# データをトレーニング用、テスト用にわける
set.seed(666)
splits <- initial_split(df2, prop = 0.8)
train_data <- training(splits)
test_data <- testing(splits)
t.test(test_data$target, train_data$target)
#
# 1. モデルの作成
# 1-1. 線形モデル(lm)
lm_mod <- linear_reg() |> # 普通の線形モデルはチューニングは不要
  set_engine("lm")
#
# 1-2. ペナルティ付き線形モデル(glmnet)
glmnet_mod <- linear_reg(
  penalty = tune(), # λ - 正則化の強さ
  mixture = tune()  # α - (Ridge ~ LASSOの割合)
) |> 
  set_engine("glmnet")
#
# 1-3. 決定木モデル(rpart)
rpart_mod <- decision_tree(
  cost_complexity = tune(), # いわゆるcp
  tree_depth = tune(), # 木の深さ
  min_n = tune() # 最小ノードサイズ
) |> 
  set_engine("rpart") |> 
  set_mode("regression")
#
# 1-4. ランダムフォレストモデル(ranger)
ranger_mod <- rand_forest(
  mtry = tune(), # 使用する特徴量の数
  trees = 1000,  # 木の本数
  min_n = tune() # 
) |> 
  set_engine("ranger") |> 
  set_mode("regression")
#
# 1-5. サポートベクター回帰(SVR)モデル(kernlab)
kernlab_mod <- svm_rbf(
  cost = tune(), # 誤差をどれだけ許すか
  rbf_sigma = tune() # RBFカーネルの広がり
) |> 
  set_engine("kernlab") |> 
  set_mode("regression")
#
# 1-6. k-NN回帰モデル(kknn)
kknn_mod <- nearest_neighbor(
  neighbors = tune(), # k(近傍数)
  weight_func = "rectangular", # 重み付けの方法
  dist_power = 2 # 距離の種類(2 = ユークリッド距離)
) |> 
  set_engine("kknn") |> 
  set_mode("regression")
#
# 1-7. ニューラルネットワークモデル(nnet)
nnet_mod <- mlp(
  hidden_units = tune(), # 中間層のユニット数
  penalty = tune(), # L2 正則化
  epochs = tune() # 学習回数
) |> 
  set_engine("nnet") |> 
  set_mode("regression")
#
# 1-8. 勾配ブースティング回帰モデル(xgboost)
xgboost_mod <- boost_tree(
  trees = 1000,          # 木の数
  tree_depth = tune(),   # 深さ
  learn_rate = tune(),   # 学習率
  loss_reduction = tune(), # gamma
  sample_size = tune(),  # subsample
  mtry = tune(),         # 列サンプリング
  min_n = tune()         # min_child_weight
) |>
  set_engine("xgboost") |>
  set_mode("regression")
#

 

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは Spring season landscape, close up of yellow Narcissus flowers, blue sky, no clouds, green grass, Photo です。)

 

都道府県別の商業動態統計調査のデータの分析3 - Tidy ANOVA (Analysis of Variance: 分散分析) with infer

www.crosshyou.info

の続きです。前回は百貨店・スーパーの販売額の前年比をグラフにしました。

2021年度よりも、2022年度、2023年度のほうが前年比の平均値は高いようにグラフでは見えました。今回は、統計学的な観点からも確認しましょう。

2021年度、2022年度、2023年度と3つのグループがあってその3つの平均値に統計学的な違いがあるかを調べるのは、ANOVA(分散分析)ですね。シミュレーションベースの方法と理論ベースの方法の2つのアプローチをやってみます。

シミュレーションベースの方法は、inferパッケージを使います。

infer.tidymodels.org

https://infer.tidymodels.org/articles/anova.html

こちらのサイトを参考にします。

まず、F値を算出します。

次は、year: 年度とyoy: 前年比が関係ないと仮定して1000回シミュレーションでF値を計算します。一言でいうと、Null Distributionを生成します。

生成したNull Distributionの分布をヒストグラムにしてみてみます。

赤い垂線が実際のF値の垂線で、ヒストグラムが、年度と前年比が関係ないという仮定の下でシミュレーションしたF値です。こうしてみると、年度と前年比が関係ないという仮定の下では、実際に起きているF値はあり得ないということがわかります。つまり、年度と前年比が関係あるということですね。p値を計算してみます。

p値はゼロでした。以上、シミュレーションベースのANOVA(分散分析)でした。

続いて、理論ベースのANOVA(分散分析)をしてみます。aov()関数で簡単にできます。

F値は19.41とinferパッケージで計算した値と同じです。p値は3.74e-08とほとんどゼロですね。

今回は以上です。

次回は

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

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

#
# inferパッケージの読み込み
library(infer)
#
# F値の算出
observed_F_value <- df_super_depart |> 
  specify(yoy ~ year) |> 
  hypothesize(null = "independence") |> 
  calculate(stat = "F")
observed_F_value
#
# Null Distributionの生成
set.seed(1991)
null_dist <- df_super_depart |> 
  specify(yoy ~ year) |> 
  hypothesize(null = "independence") |> 
  generate(reps = 1000, type = "permute") |> 
  calculate(stat = "F")
#
# Null Distributionのグラフ
null_dist |> 
  visualize() + 
  shade_p_value(observed_F_value,
                direction = "greater") +
  theme_minimal()
#
# p値の計算
null_dist |> 
  get_p_value(obs_stat = observed_F_value,
              direction = "greater")
#
# 理論ベースのANOVA(分散分析)
aov(yoy ~ year,
    data = df_super_depart) |> 
  summary()
#
# 3.74e-08とは?
format(3.74e-08,scientific = FALSE)
#

 

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは Landscape of seaside beach and high cliffs, close up of white and pink mottled camellia flowers, photo です。)

 

 

都道府県別の商業動態統計調査のデータの分析2 - Rでヒストグラムや箱ひげ図、散布図を描く。

www.crosshyou.info

の続きです。前回はCSVファイルのデータをRに読み込ませました。今回はデータをグラフにしてみます。私が特に興味を持っているのは百貨店・スーパーの販売額の前年比です。まずは、ヒストグラムにしてデータの分布を見てみます。

前年比がプラスのデータのほうが多いようですね。

次は2021年度、2022年度、2023年度の年度別の箱ひげ図をみてみます。

2021年度と比較すると、2022年度、20223年度は前年比が増えていることがわかりますね。

2021年度の前年比と2023年度の前年比の散布図を描いてみます。

geom_abline()関数で切片が0、傾きが1の赤い線を引いてあります。この赤い線よりも下にある都道府県は、2021年度のほうが2023年度よりも前年比が高かったところです。福井県と島根県がそうですね。2021年度では東京都が一番前年比が高く、2023年度では大阪府が一番前年比が高いことがわかります。グラフの右上に位置している都道府県は2021年度、2023年度の前年比が高いところですね。大阪府、福岡県、京都府、東京都、沖縄県などは百貨店・スーパーの販売額が好調に伸びていたことがわかります。

今回の分析では、年度が違うと前年比の伸びが違うことがわかりました。

今回は以上です。

次回は

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

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

#
# 百貨店・スーパーの前年比のヒストグラム
df |> 
  filter(shop == "super_and_depart") |> 
  ggplot(aes(x = yoy)) +
  geom_histogram(binwidth = 1.0, color = "white", boundary = 0) +
  geom_vline(xintercept = 0, color = "red") +
  theme_minimal()
#
# 年度別の箱ひげ図
df |> 
  filter(shop == "super_and_depart") |> 
  ggplot(aes(x = year, y = yoy, group = year)) +
  geom_boxplot(aes(fill = year)) +
  theme_minimal()
#
# 2021年度と2023年度の散布図
df |> 
  filter(shop == "super_and_depart" &
           year %in% c("2021年度", "2023年度")) |> 
  pivot_wider(names_from = year,
              values_from = yoy) |> 
  ggplot(aes(x = `2021年度`, y = `2023年度`)) +
  geom_point() +
  geom_text(aes(label = pref), vjust = 1.2) +
  geom_abline(color = "red") +
  theme_minimal()
#

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、Splendid moment landscape of wild green grass fields, flowering yellow beautiful Dandelion flowers, Photo です。)

都道府県別の商業動態統計調査のデータの分析1 - データをRに読み込む。5つのデータフレームをbind_rows()関数で統合した。

今回からしばらくは、都道府県別の商業動態統計調査のデータを分析してみたいと思います。

上の図の四角で囲ったデータを使いました。

例えば、百貨店・スーパーならば、下の図のように、販売金額ではなくて増減率のデータだけにしました。

Excelにダウンロードすると、こんな感じです。

このようなCSVファイルのデータをRで分析してみます。まずは、tidyverseパッケージの読み込みをします。

read_csv()関数でCSVファイルのデータを読み込みます。

このように、百貨店・スーパー、コンビニエンスストア、大型家電販売店、ドラッグストア、ホームセンターと5つのCSVファイルを読み込みました。

それぞれのデータフレームのサマリーをsummary()関数でみてみます。

百貨店・スーパーのデータフレームは、販売額のyoy(前年比)だけですが、その他のデータフレームは、販売額のyoyの他に、店舗数のyoyもあることがわかります。データの年度は2021年度、2022年度、2023年度の3年間ですね。

とりあえず、この5つのデータフレームを一つにまとめてみます。bind_rows()関数を使います。

どのデータフレームからのデータかわかるように、shopという名前の変数を作りました。

yoyにNAがありますので、これは、0に置換してしまいます。それと、typeのデータで、「販売額」と「販売額等」と似たものがあるので、これを「販売額」に統一します。

typeの「販売額等」のファクターレベルをなくしてしまいます。

原始的に、as.character()関数で一度、文字列型に戻してから再度、as.factor()関数でファクター型にしました。とりあえずこれで、分析のための下準備はできましたね。

今回は以上です。

次回は、

www.crosshyou.info

です。

 

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

#
# tidyverseパッケージの読み込み
library(tidyverse)
#
# データの読み込み
# 百貨店・スーパーのデータ
df_super_depart <- read_csv("super_and_depart.csv",
                            skip = 3) |> 
  mutate(across(where(is.character), as.factor))
glimpse(head(df_super_depart))
#
# コンビニエンスストアのデータ
df_convenience <- read_csv("convenience_store.csv",
                           skip = 3) |> 
  mutate(across(where(is.character), as.factor))
glimpse(head(df_convenience))
#
# 大型家電販売店のデータ
df_kaden <- read_csv("kaden.csv",
                     skip = 3) |> 
  mutate(across(where(is.character), as.factor))
glimpse(head(df_kaden))
#
# ドラッグストアのデータ
df_drugstore <- read_csv("drugstore.csv",
                         skip = 3) |> 
  mutate(across(where(is.character), as.factor))
glimpse(head(df_drugstore))
#
# ホームセンターのデータ
df_homecenter <- read_csv("homecenter.csv",
                          skip = 3) |> 
  mutate(across(where(is.character), as.factor))
glimpse(head(df_homecenter))
#
# 百貨店・スーパーのデータフレーム
summary(df_super_depart)
#
# コンビニエンスストアのデータフレーム
summary(df_convenience)
#
# 大型家電販売店のデータフレーム
summary(df_kaden)
#
# ドラッグストアのデータフレーム
summary(df_drugstore)
#
# ホームセンターのデータフレーム
summary(df_homecenter)
#
# すべてのデータを統合
df <- df_super_depart |> 
  mutate(type = "販売額等",
         shop = "super_and_depart") |> 
  bind_rows(df_convenience |> 
              mutate(shop = "convinience")) |> 
  bind_rows(df_kaden |> 
              mutate(shop = "kaden")) |> 
  bind_rows(df_drugstore |> 
              mutate(shop = "drugstore")) |> 
  bind_rows(df_homecenter |> 
              mutate(shop = "homecenter")) |> 
  mutate(type = as.factor(type),
         shop = as.factor(shop))
summary(df)
#
# yoyのNAを0にする
df[is.na(df$yoy), "yoy"] <- 0
#
# typeの販売額等を販売額にする
df[df$type == "販売額等", "type"] <- "販売額"
#
# 再度dfのサマリー
summary(df)
#
# typeのlevelを再設定
df <- df |> 
  mutate(type = as.character(type)) |> 
  mutate(type = as.factor(type))
#
# 再度dfのサマリー
summary(df)
#

今回のCSVファイルは以下のGitHubにあります。
https://github.com/sato-nobu/CSV_files/blob/main/super_and_depart.csv

https://github.com/sato-nobu/CSV_files/blob/main/convenience_store.csv

https://github.com/sato-nobu/CSV_files/blob/main/kaden.csv

https://github.com/sato-nobu/CSV_files/blob/main/drugstore.csv

https://github.com/sato-nobu/CSV_files/blob/main/homecenter.csv

 

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、Landscape of natural Japanese local forests, close up of NADESHIKO flowers, photo です。)