💭

毎月勤労統計調査の月次原表をRでデータベース化する

2023/11/09に公開

※本稿は加筆修正があり得ます。

はじめに

厚生労働省「毎月勤労統計調査」は一定規模以上の事業所を対象に、雇用、労働時間及び雇用の変動といった情報の把握を目的に毎月実施される統計調査である。この調査は毎月速報と確報という形で2回公表されるが、このうちの確報については、実数原表というエクセルが存在し、産業、企業規模、雇用形態、そして性別ごとの詳細な情報が取得可能である。
毎勤における長期時系列データの利用は、e-statの毎月勤労統計調査のページにおける実数・指数累積データでも利用可能だが、ここの実数データでは性別の情報は存在しない。
このため、先述のの毎勤確報における実数原表を用いることは、特に性別の賃金動向を把握したい際に有用である。他方で、毎勤原表は月ごとに異なるエクセルファイルで提供されており、時系列での分析を円滑に行うには事前の処理が必要になる。
そこで本稿では、毎勤確報における実数原表のエクセルを統合するためのコードを紹介する。
なお、毎勤は標本調査であるため、母集団の推計を行うためのベンチマークが経済センサスに基づき定められているところ、ベンチマークの変更が定期的に行われる。また、サンプルの一部が毎年入れ替わる関係で、新サンプルと旧サンプルで値に断層が生じる。こうした要因による断層を修正できるように、毎勤においては「hon-mks-kyuXXXX」という旧サンプルからなるファイルや、ベンチマーク変更時の修正用系列が存在している。これらを合わせて読みこみ統合することで、断層調整にも対応できるようにする。

作業の流れ

  1. 作業ディレクトリを以下のようにする。

    .
    ├── code
    │   └── code.R
    ├── data
    └── treated_data
    
  2. 実数原表からエクセルファイルをdataディレクトリにDLする。

    • e-stat上で「閲覧形式で表示」→「一括ダウンロード」とすると楽にDLできる。この時、統計の公表見直しの影響で、2020年5月~は「EXCEL閲覧用」、それ以前は「EXCEL」となっているため2回DLが必要。
  3. 以下のコードを実行する。(各内容は後述予定。)


ls_data <- list.files(here("data"),
                      pattern = ".xls",
                      full.names = TRUE)



sample_cols <- c("規模","sex", "就業形態", "前月末労働者数", 
                 "増加労働者数", "減少労働者数", "本月末労働者数", 
                 "パートタイム労働者数","出勤日数","総実労働時間", 
                 "所定内労働時間", "所定外労働時間", 
                 "現金給与総額", "きまって支給する給与", "所定内給与", 
                 "所定外給与", "特別給与")

numeric_cols <- c("前月末労働者数", 
                  "増加労働者数", "減少労働者数", "本月末労働者数", 
                  "パートタイム労働者数","出勤日数","総実労働時間", 
                  "所定内労働時間", "所定外労働時間", 
                  "現金給与総額", "きまって支給する給与", "所定内給与", 
                  "所定外給与", "特別給与")


df <- NULL

for (i in ls_data){

  old_sample <- xlsx::read.xlsx(file = i,
                                sheetIndex = 1,
                                encoding = "UTF-8",
                                colIndex = 1:17
                                ) 
  
  colnames(old_sample) <- sample_cols
  
  ind <- old_sample %>%
    filter(きまって支給する給与== "( 確 報 )") %>%
    .$規模 %>%
    dput()

  ind_japanese <- old_sample %>%
    filter(きまって支給する給与== "( 確 報 )") %>%
    .$前月末労働者数 %>%
    dput()

  len_ind = length(ind)
  
  rep_ind = rep(ind, times = rep(30,len_ind))
  rep_ind_japanese = rep(ind_japanese, times = rep(30,len_ind))
  
  
  name <-  str_split(i,pattern = "/")[[1]][6] 
  name <-  str_split(name,pattern = "\\.")[[1]][1]
  
  old_sample <- 
    old_sample %>% 
    mutate(sex = replace_na(sex,"T")) %>% 
    fill(.,規模, .direction = "down") %>% 
    
    filter(規模%in%c("T","0","4","5","7","9")) %>%
    drop_na(就業形態) %>% 
    
    
    mutate_all(~str_remove_all(.,pattern = "\\*|\\-|\\,")) %>% 
    mutate_at(.vars = numeric_cols,
              .funs = as.numeric) %>%
    mutate(filename = name) %>%  
    mutate(year = str_sub(name,-6,-3) %>% as.numeric(),
           month = str_sub(name,-2) %>% as.numeric(),
           
           is_benchmark_old = if_else(
             str_detect(name,pattern="mks-kyu-kyu"),1,0),
           is_benchmark_new = if_else(
             str_detect(name,pattern="mks-sin-kyu"),1,0),
           is_sample_old = if_else(
             is_benchmark_old==0&str_detect(name,pattern="mks-kyu"),1,0)
    ) %>% 
    
    mutate(ind = rep_ind) %>% 
    mutate(ind_ja = rep_ind_japanese) %>% 
    
    select(year,month,ind,ind_ja,everything()) %>% 
    
    return()
  
  df <- rbind(df,old_sample)
  
}


##断層調整系列の作成


cols <- c("前月末労働者数", "増加労働者数", "減少労働者数", 
          "本月末労働者数", "パートタイム労働者数", "出勤日数", "総実労働時間", "所定内労働時間", "所定外労働時間", 
          "現金給与総額", "きまって支給する給与", "所定内給与", "所定外給与", "特別給与")

df_base <- df %>% 
  filter(year==2022&month==1) %>%
  filter(is_benchmark_new==1) %>% 
  select(ind:就業形態)

gap_list <- list()


data <- list(df %>% 
               filter(year==2022&month==1) %>%
               filter(is_benchmark_old==0&is_benchmark_new==0) %>% 
               select(all_of(cols))%>% 
               as.matrix(),
             df %>% 
               filter(year==2022&month==1) %>%
               filter(is_benchmark_new==1) %>% 
               select(all_of(cols)) %>% 
               as.matrix(),
             df %>% 
               filter(year==2022&month==1) %>%
               filter(is_benchmark_old==1) %>% 
               select(all_of(cols))%>% 
               as.matrix()
             
)

df %>% 
  
  arrange(year,month) %>% 
  filter(is_benchmark_new==0&is_benchmark_old==0&is_sample_old==0) %>% 
  select(!starts_with("is_")) %>% 
  select(!filename) %>% 
  #csv
  write.csv(here("treated_data","maikin_df_panel.csv"),fileEncoding = "cp932")


Discussion