Chapter 11 社会学のデータ分析でよくある処理

本章では、日本の社会学業界を念頭においたときのデータ分析でよくある処理についてランダムにまとめる。

本章のコードを実行するためには以下のパッケージをあらかじめ読み込んでおく必要がある。

library(tidyverse)

11.1 SSM職業小分類を大分類にまとめる

いくつかの調査では、調査対象者に仕事の内容を自由記述で尋ね、その回答をもとに、職業名を割り当てているものがある。このときに使われる職業分類が1995年SSM職業小分類と呼ばれるものである。1995年SSM職業小分類は約200の小分類からなり、それぞれの職業に番号が振られている。この番号を振った調査を以下に列挙する。

調査名 調査年 現職職業小分類 初職職業小分類 前職職業小分類 15歳時父親職業小分類 15歳時母親職業小分類
社会階層と社会移動調査(SSM) 1995 有(職歴変数を使えば可能、今回は省略) 有(「主な仕事」) 有(「主な仕事」)
2005 有(職歴変数を使えば可能、今回は省略)
2015 有(職歴変数を使えば可能、今回は省略)
日本版総合的社会調査(JGSS) 2000 有(無職で就業経験ある者のみ)
2001 有(無職で就業経験ある者のみ)
2002 有(無職で就業経験ある者のみ)
2003
2005
2006
2008
2010
2012 有(無職で就業経験ある者のみ)
2015 有(無職で就業経験ある者のみ)
東大社研パネル調査(JLPS) 2007-

ふつうはこうした200個近い分類をそのまま分析に使うということはなく、少数のカテゴリにまとめて使う。カテゴリへのまとめ方はいくつも種類があるが、ここでは代表的なものとして「SSM職業大分類」と「国勢調査職業分類」の2つを準備する。

なおこの2つへの割当てについては麦山が作成したが、妥当かどうかは各自確認すること。700番台、800番台にも有効なコードを振っている。また888や8888(非該当)、999や9999(無回答)はNAとなるようにしている。

11.1.1 JGSSの場合

たとえばこのようなデータフレーム(jgssとする)があったとする。

jgss %>% head()
## # A tibble: 4 × 4
##   xxjob xxlstjb xxfstjb ppjbxx15
##   <dbl>   <dbl>   <dbl>    <dbl>
## 1   509     888     573      531
## 2   606     888     571      999
## 3   554     888     558      681
## 4   999     556     559      588

次のようなコードを実行することで、現職、初職、前職、父職のそれぞれに対して2種類の職業大分類を付与することができる。前職に関する質問項目が含まれていない場合には、前職に関わる部分のコードを削除する必要がある。

また、読み込んだデータ形式によっては変数名が大文字のことがある(xxjobではなくXXJOBというように)。このような場合は手持ちのデータの変数名を小文字に変換するか、以下のコードのxxjobなどを大文字に直すかどちらかを行う必要がある。

ssm_code <- read_csv("https://raw.githubusercontent.com/mugiyama/seminar_sociology_r/master/data/ssm_occupation_code.csv") 
## Rows: 206 Columns: 3
## ── Column specification ────────────────────────
## Delimiter: ","
## dbl (3): ssm1995, ssmocc, censusocc
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
ssm_code_current <- ssm_code %>% 
  rename(xxjob = 1, ssmocc_current = 2, censusocc_current = 3)
ssm_code_first <- ssm_code %>% 
  rename(xxfstjb = 1, ssmocc_first = 2, censusocc_first = 3)
ssm_code_last <- ssm_code %>% 
  rename(xxlstjb = 1, ssmocc_last = 2, censusocc_last = 3) # 前職が含まれていないJGSSデータの場合は削除
ssm_code_father <- ssm_code %>% 
  rename(ppjbxx15 = 1, ssmocc_father = 2, censusocc_father = 3)

label_ssm <- c("専門","管理","事務","販売","熟練","半熟練","非熟練","農業")
label_census <- c("専門・技術","管理","事務","販売","サービス","保安","農林漁業","運輸・通信","製造・制作","定置機関運転・建設機械運転・電気作業","採掘・建設・労務")

jgss <- jgss %>% 
  left_join(ssm_code_current, by = "xxjob") %>% 
  left_join(ssm_code_first, by = "xxfstjb") %>% 
  left_join(ssm_code_last, by = "xxlstjb") %>%  # 前職が含まれていないJGSSデータの場合は削除
  left_join(ssm_code_father, by = "ppjbxx15") %>%
  mutate(ssmocc_current_name = factor(ssmocc_current,
                                      levels = 1:8,
                                      labels = label_ssm)) %>% 
  mutate(ssmocc_first_name = factor(ssmocc_first,
                                    levels = 1:8,
                                    labels = label_ssm)) %>% 
  mutate(ssmocc_last_name = factor(ssmocc_last,
                                    levels = 1:8,
                                    labels = label_ssm)) %>%  # 前職が含まれていないJGSSデータの場合は削除
  mutate(ssmocc_father_name = factor(ssmocc_father,
                                     levels = 1:8,
                                     labels = label_ssm)) %>% 
  mutate(censusocc_current_name = factor(censusocc_current,
                                         levels = 1:11,
                                         labels = label_census)) %>% 
  mutate(censusocc_first_name = factor(censusocc_first,
                                       levels = 1:11,
                                       labels = label_census)) %>% 
  mutate(censusocc_last_name = factor(censusocc_last,
                                       levels = 1:11,
                                       labels = label_census)) %>%  # 前職が含まれていないJGSSデータの場合は削除
  mutate(censusocc_father_name = factor(censusocc_father,
                                        levels = 1:11,
                                        labels = label_census))

もともとの変数と作成した変数の一覧を確認しておく。

jgss %>% glimpse()
## Rows: 4
## Columns: 20
## $ xxjob                  <dbl> 509, 606, 554, 999
## $ xxlstjb                <dbl> 888, 888, 888, 556
## $ xxfstjb                <dbl> 573, 571, 558, 559
## $ ppjbxx15               <dbl> 531, 999, 681, 588
## $ ssmocc_current         <dbl> 1, 6, 3, NA
## $ censusocc_current      <dbl> 1, 8, 3, NA
## $ ssmocc_first           <dbl> 4, 4, 3, 3
## $ censusocc_first        <dbl> 4, 4, 3, 3
## $ ssmocc_last            <dbl> NA, NA, NA, 3
## $ censusocc_last         <dbl> NA, NA, NA, 3
## $ ssmocc_father          <dbl> 1, NA, 5, 4
## $ censusocc_father       <dbl> 1, NA, 14, 5
## $ ssmocc_current_name    <fct> 専門, 半熟練, 事務, NA
## $ ssmocc_first_name      <fct> 販売, 販売, 事務, 事務
## $ ssmocc_last_name       <fct> NA, NA, NA, 事務
## $ ssmocc_father_name     <fct> 専門, NA, 熟練, 販売
## $ censusocc_current_name <fct> 専門・技術, 運輸・通信, 事務, NA
## $ censusocc_first_name   <fct> 販売, 販売, 事務, 事務
## $ censusocc_last_name    <fct> NA, NA, NA, 事務
## $ censusocc_father_name  <fct> 専門・技術, NA, NA, サービス

11.1.2 SSMの場合

たとえばこのようなデータフレーム(ssmとする)があったとする。

ssm %>% head()
## # A tibble: 4 × 4
##    q02d  q07f q23_1d q23_3d
##   <dbl> <dbl>  <dbl>  <dbl>
## 1   608   539    601    531
## 2   597   687    655    999
## 3   588   631    554    681
## 4   999   665    545    588

次のようなコードを実行することで、現職、初職、前職、父職のそれぞれに対して2種類の職業大分類を付与することができる。前職に関する質問項目が含まれていない場合には、前職に関わる部分のコードを削除する必要がある。

ssm_code <- read_csv("https://github.com/mugiyama/seminar_sociology_r/raw/master/data/ssm_occupation_code.csv") 
## Rows: 206 Columns: 3
## ── Column specification ────────────────────────
## Delimiter: ","
## dbl (3): ssm1995, ssmocc, censusocc
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
ssm_code_current <- ssm_code %>% 
  rename(q02d = 1, ssmocc_current = 2, censusocc_current = 3)
ssm_code_first <- ssm_code %>% 
  rename(q07f = 1, ssmocc_first = 2, censusocc_first = 3)
ssm_code_father <- ssm_code %>% 
  rename(q23_1d = 1, ssmocc_father = 2, censusocc_father = 3)
ssm_code_mother <- ssm_code %>% 
  rename(q23_3d = 1, ssmocc_mother = 2, censusocc_mother = 3) 

label_ssm <- c("専門","管理","事務","販売","熟練","半熟練","非熟練","農業")
label_census <- c("専門・技術","管理","事務","販売","サービス","保安","農林漁業","運輸・通信","製造・制作","定置機関運転・建設機械運転・電気作業","採掘・建設・労務")

ssm <- ssm %>% 
  left_join(ssm_code_current, by = "q02d") %>% 
  left_join(ssm_code_first, by = "q07f") %>% 
  left_join(ssm_code_father, by = "q23_1d") %>%
  left_join(ssm_code_mother, by = "q23_3d") %>% 
  mutate(ssmocc_current_name = factor(ssmocc_current,
                                      levels = 1:8,
                                      labels = label_ssm)) %>% 
  mutate(ssmocc_first_name = factor(ssmocc_first,
                                    levels = 1:8,
                                    labels = label_ssm)) %>% 
  mutate(ssmocc_father_name = factor(ssmocc_father,
                                     levels = 1:8,
                                     labels = label_ssm)) %>% 
  mutate(ssmocc_mother_name = factor(ssmocc_mother,
                                    levels = 1:8,
                                    labels = label_ssm)) %>%
  mutate(censusocc_current_name = factor(censusocc_current,
                                         levels = 1:11,
                                         labels = label_census)) %>% 
  mutate(censusocc_first_name = factor(censusocc_first,
                                       levels = 1:11,
                                       labels = label_census)) %>% 
  mutate(censusocc_father_name = factor(censusocc_father,
                                        levels = 1:11,
                                        labels = label_census)) %>% 
  mutate(censusocc_mother_name = factor(censusocc_mother,
                                       levels = 1:11,
                                       labels = label_census))

もともとの変数と作成した変数の一覧を確認しておく。

ssm %>% glimpse()
## Rows: 4
## Columns: 20
## $ q02d                   <dbl> 608, 597, 588, 999
## $ q07f                   <dbl> 539, 687, 631, 665
## $ q23_1d                 <dbl> 601, 655, 554, 545
## $ q23_3d                 <dbl> 531, 999, 681, 588
## $ ssmocc_current         <dbl> 2, 3, 4, NA
## $ censusocc_current      <dbl> 8, 6, 5, NA
## $ ssmocc_first           <dbl> 1, 7, 5, 5
## $ censusocc_first        <dbl> 1, 15, 11, 12
## $ ssmocc_father          <dbl> 8, 5, 3, 2
## $ censusocc_father       <dbl> 7, 12, 3, 2
## $ ssmocc_mother          <dbl> 1, NA, 5, 4
## $ censusocc_mother       <dbl> 1, NA, 14, 5
## $ ssmocc_current_name    <fct> 管理, 事務, 販売, NA
## $ ssmocc_first_name      <fct> 専門, 非熟練, 熟練, 熟練
## $ ssmocc_father_name     <fct> 農業, 熟練, 事務, 管理
## $ ssmocc_mother_name     <fct> 専門, NA, 熟練, 販売
## $ censusocc_current_name <fct> 運輸・通信, 保安, サービス, NA
## $ censusocc_first_name   <fct> 専門・技術, NA, 採掘・建設・労務, NA
## $ censusocc_father_name  <fct> 農林漁業, NA, 事務, 管理
## $ censusocc_mother_name  <fct> 専門・技術, NA, NA, サービス

11.2 旧制学歴と新制学歴の対応

広い年齢層を対象にした調査であったり、親の最終学歴を尋ねているような調査では、最終学歴の選択肢に戦前に卒業した人(旧制学歴保有者)が含まれていることがあり、質問項目の選択肢にも旧制学歴が含まれていることがある。こうした旧制学歴を戦後の新制学歴に合わせたい場合には、諸説あるが、たとえばもっとも教育年数の近い学歴に割り当てるという方法がある。

このような割り当てによる統合学歴の対応表を以下の3パターンにまとめた。

旧制学歴 新制学歴 統合学歴(5分類) 統合学歴(4分類) 統合学歴(3分類)
旧制尋常小学校 新制中学校 中学 中学 初等教育
旧制高等小学校 新制中学校 中学 中学 初等教育
旧制中学校・高等女学校 新制高校 高校 高校 中等教育
旧制実業学校 新制高校 高校 高校 中等教育
- 専修学校高等課程* 高校 高校 中等教育
- 専門学校(専修学校専門課程)* 専門学校 高校 高等教育**
旧制師範学校 新制短大・高専 短大高専 短大高専 高等教育
旧制高校・専門学校・高等師範学校 新制短大・高専 短大高専 短大高専 高等教育
旧制大学 新制大学 大学大学院 大学大学院 高等教育
旧制大学 新制大学院 大学大学院 大学大学院 高等教育

*専修学校高等課程は中学卒業者を対象として職業教育を実施する機関。これに対して専修学校専門課程は高校卒業者を対象として職業教育を実施する機関で、ふつう「専門学校」というときにはこちらを指すことが多い。調査票の選択肢に「専門学校」が設けられていた場合も、対象者(たぶん調査設計者も)はおそらくこちらを想定していると思われる。

**国際標準教育分類(ISCED2011)では専門学校はレベル5(Short-cycle tertiary education)に分類され高等教育相当となっている。しかし、伝統的に(?)高等教育に含まないこともある。これに関しては込み入った議論がある。例えば多喜弘文,2018,「学歴としての専門学校に関する基礎的検討」中澤渉編『2015年SSM研究報告書5 教育II』2015年SSM調査研究会,57–80.などを参照のこと。

11.3 年収カテゴリを連続変数にする

11.3.1 年収を連続変数にする

たとえば2015年SSM調査では個人、配偶者、ならびに世帯年収を以下のような選択肢を用いて聴取している。

番号 内容
1 なし
2 25万円未満
3 25〜50万円未満
11 300〜350万円未満
12 350〜400万円未満
30 2050万円以上
ssm %>% head() # データは架空のものです
## # A tibble: 6 × 1
##     q48
##   <dbl>
## 1     3
## 2     5
## 3    12
## 4     9
## 5    10
## 6     4

このデータに対して以下のコードを実行することで、時間あたり賃金の変数wageを計算することができる。

ssm <- ssm %>% 
  mutate(income = case_when(
    q48 ==  1 ~ 0,
    q48 ==  2 ~ 12.5,
    q48 ==  3 ~ 37.5,
    q48 ==  4 ~ 62.5,
    q48 ==  5 ~ 87.5,
    q48 ==  6 ~ 112.5,
    q48 ==  7 ~ 137.5,
    q48 ==  8 ~ 175,
    q48 ==  9 ~ 225,
    q48 == 10 ~ 275,
    q48 == 11 ~ 325,
    q48 == 12 ~ 375,
    q48 == 13 ~ 425,
    q48 == 14 ~ 500,
    q48 == 15 ~ 600,
    q48 == 16 ~ 700,
    q48 == 17 ~ 800,
    q48 == 18 ~ 900,
    q48 == 19 ~ 1000,
    q48 == 20 ~ 1100,
    q48 == 21 ~ 1200,
    q48 == 22 ~ 1300,
    q48 == 23 ~ 1400,
    q48 == 24 ~ 1500,
    q48 == 25 ~ 1600,
    q48 == 26 ~ 1700,
    q48 == 27 ~ 1800,
    q48 == 28 ~ 1900,
    q48 == 29 ~ 2000,
    q48 == 30 ~ 2050 * 1.4))
ssm %>% head()
## # A tibble: 6 × 2
##     q48 income
##   <dbl>  <dbl>
## 1     3   37.5
## 2     5   87.5
## 3    12  375  
## 4     9  225  
## 5    10  275  
## 6     4   62.5

2015年SSM調査では年収についての質問項目の選択肢に「2050万円以上」というカテゴリがあり、このカテゴリを選んだ回答者の年収が実際にどれくらいの値であるのかはわからない。2051万円かもしれないし、1億円かもしれない。このような場合にどのような値を振るべきなのかについては諸説あり、よくわからない。下限(この場合は2050万円)の値に1.4をかけているものもあれば、1.2をかけているものもある。あるいは、そもそもわからないのだから欠損にすべきという考え方もある。ここでは一つの方法として1.4をかけている、すなわち、2050万円以上と回答した人の年収はだいたい2870万円くらいだと考えているわけなのだが、これが正しい方法であるかどうかはわからない。

11.3.2 時間あたり賃金を作成する

上述の方法で年収を連続変数にしたとしよう。労働から得られる報酬を測定する場合、個人年収というのは必ずしも適切な指標ではないかもしれない。というのも、人によって労働時間の長さは違うので、同じ年収であったとしても、労働時間が短い人のほうがよりその報酬は高いと考えられるからである。

そこで、年収を1時間あたりの年収(時間給)に直し、それを分析に用いることがある。いま、2005年SSM調査のデータを持っているとする(数値は架空例)。

変数 説明
q2_f_1 1日の労働時間
q2_f_2 週あたり労働時間。わからない場合には99、無回答の場合には999という値が入っている。
q2_f_3 月あたり労働時間(週の労働時間を回答している場合は回答しない)。わからない場合には99、無回答の場合には999という値が入っている。
ssm %>% head()
## # A tibble: 6 × 2
##     q48 income
##   <dbl>  <dbl>
## 1     3   37.5
## 2     5   87.5
## 3    12  375  
## 4     9  225  
## 5    10  275  
## 6     4   62.5

時間あたり賃金は、年収 / (1日の労働時間 × 月の労働日数 × 12ヶ月)で計算できる。ここでは、月の労働日数を回答していないが週の労働日数を回答している場合は、週の労働日数×4(週)を、月の労働日数とみなすことにしよう。

ssm <- ssm %>% 
  mutate(workhour = if_else(q2_f_1 < 99, q2_f_1, NA_real_)) %>% 
  mutate(workmonth = case_when(
    q2_f_3 < 99 ~ q2_f_3,
    (q2_f_3 == 99 | q2_f_3 == 999) & q2_f_2 < 99 ~ q2_f_2 * 4 
    )) %>% 
  mutate(wage = (income * 10000) / (workhour * workmonth * 12))

11.4 都道府県変数の加工

たとえば居住都道府県や15歳時居住都道府県などの情報を使って、居住都道府県によって進学機会が異なるといったことを分析したいとする。データには次のように都道府県を示す変数prefが含まれているとする。

df %>% head()
## # A tibble: 6 × 1
##    pref
##   <int>
## 1     1
## 2     2
## 3     3
## 4     4
## 5     5
## 6     6

11.4.1 都道府県にラベルをつける

上記の番号にラベルをつけるとそれぞれがどの都道府県を指すのか分かるのでより便利だろう。以下のように、ラベルをつけた変数pref_labを作成する。

df <- df %>% 
  mutate(pref_lab = factor(pref, 
                           levels = 1:47, 
                           labels = c("北海道","青森","岩手","宮城","秋田","山形","福島","茨城","栃木","群馬","埼玉","千葉","東京","神奈川","新潟","富山","石川","福井","山梨","長野","岐阜","静岡","愛知","三重","滋賀","京都","大阪","兵庫","奈良","和歌山","鳥取","島根","岡山","広島","山口","徳島","香川","愛媛","高知","福岡","佐賀","長崎","熊本","大分","宮崎","鹿児島","沖縄")))

確認してみると、各値にラベルをつけた変数を作成できたことがわかる。

df %>% head()
## # A tibble: 6 × 2
##    pref pref_lab
##   <int> <fct>   
## 1     1 北海道  
## 2     2 青森    
## 3     3 岩手    
## 4     4 宮城    
## 5     5 秋田    
## 6     6 山形

11.4.2 都道府県レベルの指標を外挿する

たとえば、都道府県ごとの大学卒業者割合を用いて、大卒割合が高い都道府県ほど、大学進学率が高いという仮説を検証したいとする。このような場合には、都道府県番号ごとに大学進学率を記載したExcelファイルを別に作成して、そのファイルを読み込み、left_join()を使ってもとのデータにくっつけるとよい。たとえば、以下のような形式のExcelファイルを作るとする26

df_indicator %>% head()
## # A tibble: 6 × 2
##    pref univrate
##   <int>    <dbl>
## 1     1     11.3
## 2     2      9.1
## 3     3      9.7
## 4     4     14.3
## 5     5      9  
## 6     6     10.5

このデータにたとえば「df_indicator.xlsx」と名前をつけて保存し、dataフォルダに入れる。このデータを読み込む。

library(readxl)  # Excelファイルを読み込むために使うパッケージ
df_indicator <- read_excel("data/df_indicator.xlsx")

読み込んだデータをもとのデータにくっつける。

df <- df %>% 
  left_join(df_indicator, by = "pref")

くっつけたデータは次のようになり、たしかに作成した変数をうまく結合することができているとわかる。

df %>% head()
## # A tibble: 6 × 3
##    pref pref_lab univrate
##   <int> <fct>       <dbl>
## 1     1 北海道       11.3
## 2     2 青森          9.1
## 3     3 岩手          9.7
## 4     4 宮城         14.3
## 5     5 秋田          9  
## 6     6 山形         10.5

  1. なおここでの都道府県ごとの大学卒業者割合は2010年国勢調査より取得した。卒業者に占める大学・大学院卒割合を意味する。↩︎