Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Ⅱ. データ分析編 2017

90 views

Published on

Rの初心者向け一日講座テキストの第二分冊(全四冊)

Published in: Education
  • Be the first to comment

  • Be the first to like this

Ⅱ. データ分析編 2017

  1. 1. 統計解析ソフト R による 「ミクロデータ分析の基礎」 平成 29 年度(2017 年) 一般用ミクロデータ詳細品目版による Ⅱ. データ分析編 作成: 和田かず美・河野真理子 協力: 床裕佳子・坂下佳一郎・田中隆・飯島信也
  2. 2. 目次 1.分析するデータセット .............................................................................1 2.前処理.................................................................................................1 2.1 外部ファイルの読み込み....................................................................1 2.2 内容確認[基本統計量] .....................................................................2 2.3 カテゴリデータの符号チェック.............................................................3 2.4 数量データの外れ値チェック[箱ひげ図]...............................................4 2.5 項目間の整合性チェック .....................................................................7 3.より使いやすい変数の作成........................................................................8 4.概要分析 ..............................................................................................8 4.1 住宅の所有 ......................................................................................9 4.2 就業・非就業の別............................................................................10 4.3 年間収入.......................................................................................11 5.データの集計と簡単な可視化...................................................................13 5.1 クロス表作成 ..............................................................................13 5.2 累積棒グラフと帯グラフの作成........................................................14 5.3 プロット図の保存と加工 ................................................................16 6.詳細分析 ............................................................................................17 6.1 主食(穀類)について.....................................................................17 ① 主食分類符号の作成.........................................................................17 ② 主食別エンゲル係数の算出 ................................................................18 ③ 可視化: より複雑な棒グラフ..............................................................19 6.2 肉と魚.......................................................................................20 ① 食料と魚介類と肉類の消費額 .............................................................20 [参考] 一般用ミクロデータ・詳細品目版について.............................................25 ~データ分析編について~ ここでは、一般用ミクロデータを用いて、より実践的なデータの分析を行うために、 データの取り扱い方法や、基本的な可視化の方法を学ぶ。
  3. 3. II-1 1.分析するデータセット 独立行政法人統計センターが作成、平成 29 年 6 月 23 日に公開した、一般用ミクロデー タの詳細品目版を使用する。このデータセットのレコード数は約 4 万 6 千、収録変数は 430 あり、その内訳は、世帯属性の7変数と復元ウェイト、収支項目として年間収入、消費支 出及び十大費目に加えて 410 の詳細品目についての変数がある。 なおこのデータセットは、全国消費実態調査の世帯のミクロデータを模して合成された もので、このテキストの末尾に、参考として入手先や符号表、詳細品目の変数名一覧など を提示している。 2.前処理 2.1 外部ファイルの読み込み 使用するデータは、図 2.1 のようなカンマ区切りの csv ファイルで、先頭 8 行目までが コメント、9 行目が項目名、10 行目以降がデータという構成になっている。このため、デ ータセットを読み込む際には skip オプションで 8 行目までを読み飛ばし、その次の 9 行目 をヘッダ(項目名の文字列をそれぞれ R 上の変数名とみなす)に使用することを header オプションで指定し、CSV データはカンマ区切りなので sep オプションにカンマを指定す る。 また、データ型を明示的に指定しない場合は、R がデータから自動的に型を判別する。こ のデータセットの場合、全変数が数字データで欠損も数字以外の文字列も含まれないため、 指定がなければ全て数値(Numeric)型となるが、冒頭の 7 変数はカテゴリデータなので、 これらを因子属性にするために、colClasses オプションで、冒頭の 7 変数を因子型、その 後ろの 423 変数を数値型という形で明示的に指定する。 外部から読み込んだデータセットは、R の作業領域内ではデータフレームになる。下の例 では、dat というデータフレームの中に、Y_Income や E001 などといった変数が含まれて おり、参照するためには、dat$E001(データフレーム名$変数名)という形で指定するが、 データフレームを attach することによりデータフレーム名を省略でき、単に E001 や Y_Income という形で直接 dat に含まれる変数を呼び出すことができる。 一旦 attach したデータを元に戻すには、関数 detach を使用する。 rm(list=ls(all=T RUE)) # 作業領域の掃除 # 一般用ミクロ CSV ファイルを読み込む #【注意】R でパスを指定する際は「¥」を「/」にすること
  4. 4. II-2 setwd("D:/K01/imicro") dat <- read.table("ippan_2009zensho_z_datasetE410S.csv",#読み込みファイル指定 header=TRUE, #ヘッダー使用 sep=",", #区切り(カンマ)文字 skip=8, #8 行目まで読み飛ばし colClasses=c(rep("factor",7), #7 項目を因子型変数に rep("numeric",423))) #423 項目を数値型変数にする attach(dat) # データフレームを attach 図 2.1 データファイルのイメージ 2.2 内容確認[基本統計量] ファイルが適切に読み込めているかどうか、まずは次のような手順で内容確認を行う。 ① 外部ファイルを読み込んだ際には、データの先頭、それから特に末尾を見て、余分 な空白データなどがないかどうか確認する ② データのサイズと変数の数をみる ③ ここでは主要 20 項目の変数について抽出し確認を行うために、必要な変数を収録し たデータフレーム dt1 を作成する ④ 変数名とデータ構造を確認する ⑤ 基本統計量を確認する。基本統計量とは、合計、平均、中央値、最頻値、分散、四 分位数などで、データ全体の分布の特徴を要約して表す値のことを指す
  5. 5. II-3 ls() #ファイルに含まれる全変数の表示 #--------------------------------------------------------------------------- #まずデータ全体を眺める #--------------------------------------------------------------------------- head(dat) # ① データの冒頭を表示 tail(dat) # ① データの末尾を表示 dim(dat) # ② データサイズと変数の数の確認 # [1] 45811 430 #--------------------------------------------------------------------------- # ここから、20 変数のデータクリーニング #--------------------------------------------------------------------------- dt1 <- dat[,1:20] # ③ 20 変数のみを dt1 にセット dim(dt1) # [1] 45811 20 str(dt1) # ④ データの構造の確認 summary(dt1) # ⑤ 基本統計量の確認 # カテゴリデータで因子が多いものは summary では省略される 2.3 カテゴリデータの符号チェック 上記 2.2 で使用した関数 summary の場合、因子の多いカテゴリデータは表示が省略さ れるため、関数 unique を使って想定外のカテゴリが存在しないかどうかを確認する。 # カテゴリデータの各変数がとる値を確認 apply(dt1[,1:7], 2, unique) #$X3City [1] "1" "0" #$T_SeJinin [1] "2" "3" #$T_SyuJinin [1] "1" "2" #$T_JuSyoyu [1] "1" "2" #$T_Syuhi [1] "1" "2" #$T_Age_5s [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "0" #$T_Age_65 [1] "1" "2" # カテゴリデータ(第 1~7)の値域と数を確認 apply(dt1[,1:7], 2, table) #$X3City # 0 1 #27461 18350 # #$T_SeJinin # 2 3 #17733 28078
  6. 6. II-4 # #$T_SyuJinin # 1 2 #23368 22443 # #$T_JuSyoyu # 1 2 #37704 8107 # #$T_Syuhi # 1 2 #34345 11466 # #$T_Age_5s # 0 1 2 3 4 5 6 7 8 9 #11466 1068 2602 4008 4209 4168 4523 5156 4285 4326 # #$T_Age_65 # 1 2 #32458 13353 2.4 数量データの外れ値チェック[箱ひげ図] 数量データについて、他の値から大きく外れている値(外れ値)は、何らかの誤りを含 んでいる可能性があり、ありえないような極端な値をそのままにして集計を行えば、結果 として得られる数値が信頼できなくなる可能性がある。ここでは、数量変数である収支項 目(年間収入、消費支出と十大費目)について、このような値が存在しないかチェックする。 数量データの外れ値をチェックする代表的な方法の一つとして、箱ひげ図がある。まず、 データを小さい順に並べる。データの中央値を含めた上側と下側について、それぞれその 中での中央値を求め、上側の中央値を上ヒンジ値、下側の中央値を下ヒンジ値、上ヒンジ 値から下ヒンジ値を引いたものをヒンジ幅と呼ぶ。箱ひげ図は、下ヒンジ値からヒンジ幅 の 1.5 倍を引いた値を下限、上ヒンジ値にヒンジ幅の 1.5 倍を加えた値を上限とした領域 を図示して、外れ値の可能性のあるデータの有無を表示する。 上ヒンジ値と第 1 四分位値、下ヒンジ値と第 3 四分位値、そして四分位範囲とヒンジ幅 は、少数データでレコード数が偶数の場合にわずかな差異があり、ヒンジ幅よりも四分位 範囲の方がデータサイズの奇数偶数による差異が小さいが、データサイズが大きい場合は 両者にはほとんど差異はなく、R の箱ひげ図では、ヒンジ幅を用いている。 ヒンジ幅の 1.5 倍というのは単なる目安で、データの分布状況によってはより広い幅あ るいは狭い幅が望ましいかもしれない。またこの方法はある程度までは左右非対称な分布 のデータにあわせた正常値の範囲を設定することはできるが、企業の売上高や世帯収入な ど、左右の非対称性が大きいデータには、予め対数変換などの変数変換を施すこともある。
  7. 7. II-5 作業の流れは、まず関数 boxplot を用いて、数量データの第 9~20 変数の箱ひげ図を 描画する。そこで、金額データの分布の歪みが大きいことを確認し、対数変換したデー タについても同様に箱ひげ図を作成する。 このデータセットでは、極端な外れ値は存在しないが、もし存在する場合はデータを 修正する必要が生じるため、特定の変数で大きな値をとるデータを上から任意の個数取 り出し、レコード全体を表示する方法を紹介している。 # 可視化 : 箱ひげ図による、数量データの外れ値の確認 boxplot(dt1[,9:20]) boxplot(dt1[,9:20], las=3) # las=3 で軸ラベルを縦に # マージン調整して、軸ラベルが切れないよう調整 oldpar <- par(no.readonly = TRUE) # 現在のパラメータ保存 par(mar=c(8,3,3,2)) # グラフィック画面の余白の設定 # default は par(mar=c(5,4,4,2)) # 下・左・上・右 boxplot(dt1[,9:20], las=3, main="箱ひげ図(実軸)") #las=3 で軸ラベルを縦に #par(oldpar) # もとのパラメータに復帰 #----------------箱ひげ図 2.2 が表示される #oldpar <- par(no.readonly = TRUE) # パラメータ保存 # par(mar=c(8,3,3,2)) # すべて金額データで、分布の歪みがあるので、対数変換する boxplot(log10(dt1[,9:20]), las=3, main="箱ひげ図(対数軸)", col="turquoise") par(oldpar) # もとのパラメータに復帰 # Housing と Education に 0 値があるため, boxplot で警告メッセージが出る #----------------箱ひげ図 2.3 が表示される # ここでは、極端におかしい数値がないことが確認できれば OK # 以下は、もしある場合のデータの特定方法 # 消費支出の極端に小さい、あるいは大きなデータ番号を調べる a1 <- order(L_Expenditure)[1] # 消費支出が最も小さいデータ番号 a2 <- order(L_Expenditure, decreasing=TRUE)[1:2] #最も大きいデータ番号二つ # 該当データのレコード全体の表示 dt1[a1,] dt1[a2,]
  8. 8. II-6 図 2.2 箱ひげ図(1): 変数変換なし 図 2.3 箱ひげ図(2): 常用対数による変換後 Y_Income L_Expenditure Food Housing LFW Furniture Clothes Health Transport Education Recreation OL_Expenditure 010000002500000 箱ひげ図(実軸) Y_Income L_Expenditure Food Housing LFW Furniture Clothes Health Transport Education Recreation OL_Expenditure 0123456 箱ひげ図(対数軸)
  9. 9. II-7 2.5 項目間の整合性チェック 数値変数の項目間の整合性チェックの例として、合計欄と内訳の合計を確認し、カテゴ リデータの例として、就業・非就業の別と年齢階級 1 及び 2 の間の理論的な整合性につい て確認する。 #整合性チェック(内訳の計が合計とあっているか) #保健医療=医薬品+健康保持用摂取品+保健医療用品・器具+保健医療サービス sum(E231-(E232+E233+E234+E240)) #->[-40] 足し上げが小計と合致しない #世帯単位で確認をする(各世帯別に内訳の合計を計算してみる) subtotal <- E231-(E232+E233+E234+E240) summary(subtotal) #要約 # -2~2 の誤差が含まれる # Min. 1st Qu. Median Mean 3rd Qu. Max. #-2.0000000 0.0000000 0.0000000 -0.0008732 0.0000000 2.0000000 table(subtotal) #集計 # -2 -1 0 1 2 # 121 9062 27476 9040 112 # 就業・非就業の別×年齢階級2×年齢階級1を確認する table(T_Syuhi,T_Age_5s,T_Age_65) #--->65 歳未満のデータで「9:(就業者)65 歳以上」は 0 であることを確認 #, , T_Age_65 = 1 65 歳未満 # T_Age_5s #T_Syuhi 0 1 2 3 4 5 6 7 8 9 # 1 0 1068 2602 4008 4209 4168 4523 5156 4285 0 # 2 2439 0 0 0 0 0 0 0 0 0 #--->65 歳未満で「T_Age_5s」が 1~8 はすべて 0 であることを確認 #, , T_Age_65 = 2 65 歳以上 # T_Age_5s #T_Syuhi 0 1 2 3 4 5 6 7 8 9 # 1 0 0 0 0 0 0 0 0 0 4326 # 2 9027 0 0 0 0 0 0 0 0 0 #就業・非就業の別×年齢階級 1 を確認する table(T_Syuhi,T_Age_65) # T_Age_65 #T_Syuhi 1 2 # 1 30019 4326 # 2 2439 9027
  10. 10. II-8 3.より使いやすい変数の作成 データの集計や分析を行う際に、既存の変数を使ってより都合のよい変数を作ることが ある。例えば、年齢 5 歳階級での分析が必要なときに、個人の年齢データあるいは生年月 日データしかない場合、まず年齢 5 歳階級を表すカテゴリデータを作成する。 ここでは、別々の変数として存在している就業者の 5 歳階級と非就業者の 65 歳未満・以 上をまとめて、一つのカテゴリ変数を作成する。 dat$T_Age <- 0 # データフレーム dat に T_Age という変数を作成 # 就業者データには T_Age_5s の符号をそのまま付与 dat$T_Age[which(T_Syuhi==1)]<-as.character(T_Age_5s[which(T_Syuhi==1)]) # 非就業で 65 歳未満の人には「91」を付与 dat$T_Age[which(T_Syuhi==2 & dat$T_Age_65==1)] <- "91" # 非就業で 65 歳以上の人には「92」を付与 dat$T_Age[which(T_Syuhi==2 & dat$T_Age_65==2)] <- "92" dat$T_Age <- as.factor(dat$T_Age) #型変換 detach(dat) # 新変数 T_Age もデータフレーム名 dat が省略できるように、 attach(dat) #一旦 dat を detach し、改めて attach する table(T_Age) #T_Age の集計 head(T_Age) 関数 which は、指定した条件を満たすデータ番号を取り出す機能を持つ。 4.概要分析 一般用ミクロデータのうち、世帯属性7項目、集計用乗率、収支項目 12 項目の変数及び 「3. 使いやすい変数の作成」で作った年齢階級 T_Age を使用し、分析対象として、住宅の 所有、就業・不就業の別、及び年間収入に着目し、これらがどのような変数と関係があるのかを、 決定木を用いて把握する。 決定木とは、データマイニングなどで広く使われている分析手法で、様々な種類が存在 するが、ここでは最も基本的な CART(Classification and regression trees)を使用する。 決定木は分類後のデータ間の差異を最も大きくするような分類方法の発見を助け、それを 分かりやすく可視化することができる道具で、ここでは rpart パッケージの関数 rpart によ り決定木を作成し、partykit パッケージの関数 as.party により可視化する例を紹介してい る。partykit パッケージは、survival パッケージ及び Formula パッケージに依存するので、
  11. 11. II-9 zip ファイルによるインストールの場合はこれらも併せてインストールする必要がある。 決定木は、目的変数がカテゴリの場合に分類木、数量の場合に回帰木と呼び、4.1 の住宅 の所有と 4.2 の就業・不就業の別が分類木、4.3 の年間収入が回帰木での分析例にあたる。 4.1 住宅の所有 ここでは、住宅の所有・非所有を目的変数に、その他の項目を説明変数とする。 # 21 変数での探索的なデータ分析 dt2 <- cbind(dat[,1:20], dat[,431]) # dt2 に必要な変数を集める dim(dt2) # [1] 45811 21 # 住宅の所有・非所有(目的変数) require(rpart) # rpart 関数 最初はインストールが必要 require(partykit) # 決定木の可視化に必要 最初はインストールが必要 # 説明変数から T_age の作成に使用した年齢階級 1,2 と集計用乗率を除く rm1 <- 6:8 # 第 6 変数年齢階級 2, 7 変数年齢階級 1, 第 8 変数乗率 (ct1 <- rpart(dt2$T_JuSyoyu~., dat=dt2[,-rm1], method="class")) # ()で付値の式全体を囲むと、付値された内容も表示される # n= 45811 # node), split, n, loss, yval, (yprob) # * denotes terminal node *がついているのが終端部 # 1) root 45811 8107 1 (0.82303377 0.17696623) # 2) Housing< 16500 34102 603 1 (0.98231775 0.01768225) * # 3) Housing>=16500 11709 4205 2 (0.35912546 0.64087454) # 6) dat[, 431]=7,8,9,91,92 5226 1878 1 (0.64064294 0.35935706) # 12) L_Expenditure>=266947.5 2576 558 1 (0.78338509 0.21661491) * # 13) L_Expenditure< 266947.5 2650 1320 1 (0.50188679 0.49811321) # 26) LFW>=15102.5 1237 468 1 (0.62166532 0.37833468) * # 27) LFW< 15102.5 1413 561 2 (0.39702760 0.60297240) * # 7) dat[, 431]=1,2,3,4,5,6 6483 857 2 (0.13219189 0.86780811) * # この結果を関数 as.party()を使ってプロットすると、図 4.1 が表示される plot(as.party(ct1) , main="目的変数:住宅の所有関係") この結果を簡単に解説すると、図 4.1 の一番上にある Housing(住居についての支出)の 多寡が最も住居所有と関連しており、16500 円未満の世帯のほとんどが住宅を所有してい ることを示している。住居費が 16500 円以上の世帯については、就業者の 54 歳未満は住
  12. 12. II-10 宅を所有していない場合が多い。就業者の 55 歳以上と、非就業者については、消費支出が 多ければ住宅所有、消費支出が少ないグループについては、さらに光熱水道費が多ければ 住宅所有、そうでなければ非所有、という結果になっている。 決定木の分析は、少数のデータが変わっただけで大きく形が変わってしまうことも多く、 注意が必要であるが、より詳細な分析のために、目的とする変数にどのような変数が関係 しているのかを知るのに役に立つ。 図 4.1 決定木(住宅の所有) 4.2 就業・非就業の別 ここでは、就業・非就業を目的変数として、どのような変数が関係しているのかをみる。 年齢階級しか現れないので、決定木の分岐を促進するようオプションを設定したが、結 果は変わらなかった。 # 就業・非就業(目的変数) ct2 <- rpart(dt2$T_Syuhi~., dat=dt2[,-rm1], method="class") # method を”class”とすると分類木 plot(as.party(ct2), main="目的変数:就業・非就業") 年齢階級 T_Age 1(就業者)30 歳未満 2(就業者)30~34 歳 3(就業者)35~39 歳 4(就業者)40~44 歳 5(就業者)45~49 歳 6(就業者)50~54 歳 7(就業者)55~59 歳 8(就業者)60~64 歳 9(就業者)65 歳以上 91 (非就業者)65 歳未満 92 (非就業者)65 歳以上 年齢階級 T_Age
  13. 13. II-11 # 枝分かれを促進させるためには、cp の値を小さくする。デフォルト値は 0.01 ct21 <- rpart(dt2$T_Syuhi~., dat=dt2[,-rm1], method="c lass", control = rpart.control(cp = 0.0001)) plot(as.party(ct21), main="目的変数:就業・非就業") 図 4.2 決定木(就業・非就業の別) 4.3 年間収入 最後に、年間収入について分析をする。 # 年間収入(目的変数) ct3 <- rpart(dt2$Y_Income~., dat=dt2[,-rm1], method="anova") # method を”anova”とすれば回帰木 plot(as.party(ct3), main="目的変数:年間収入") 年齢階級 T_Age
  14. 14. II-12 図 4.3 決定木(年間収入) 年間収入と最も密接に関係しているのは、消費支出という結果になり、その次に年齢階 級 T_Age が来ている。ただし、T_Age の 1~9 は就業者で、それ以外の 91 及び 92 は不 就業者なので、実際には年齢階級よりも就業・不就業の別と解釈できる。 年齢階級 T_Age
  15. 15. II-13 5.データの集計と簡単な可視化 一般的にミクロデータから統計表を作成することを集計という。 項目間の整合性チェックにおいて、table 関数による集計方法を紹介したが、この他に集 計作業に役立つ方法として、apply 関数がある。apply を用いると、行列の列(もしくは行) の和を要素とするベクトルを作成することができる。 apply に似た機能を持つとして、他に mapply,lapply,sapply,tapply が用意されてい る。これらは、一つの関数を複数のオブジェクトに適用して得られた結果をベクトルや行 列、リストとして一括で返す。これらの関数を使えば、繰り返し文を使うことなく、簡潔 な記述で高速な計算を行うことができる。クロス集計には、特に tapply が有用である。 ここでは、十大費目別消費支出と世帯主の年齢階級についてクロス表を作成し、棒グラ フ及び帯グラフにより可視化してみる。 5.1 クロス表作成 #十大費目と年齢階級のクロス表を作成する hyo1 <- matrix(NA, nc=10, nr=10) #10 行×10 列 #符号表を読み込む items <- read.csv("ippan_items.csv", header=TRUE) nrow(items) #変数の数を確認する(一般用ミクロデータの列数と同じ) head(items); tail(items) # 内容確認 (items$Japanese[11:20]) rownames(hyo1) <- items$Japanese[11:20] # 日本語の項目名をセット colnames(hyo1) <- c("就業者以外", "30 歳未満", "30~34 歳", "35~39 歳", "40~44 歳", "45~49 歳", "50~54 歳", "55~59 歳", "60~64 歳", "65 歳以上") # 金額の平均を表にする hyo1[1,] <- tapply(Food,T_Age_5s, mean) # 食料 hyo1[2,] <- tapply(Housing,T_Age_5s, mean) # 住居 hyo1[3,] <- tapply(LFW,T_Age_5s, mean) # 光熱・水道 hyo1[4,] <- tapply(Furniture,T_Age_5s, mean) # 家具・家事用品 hyo1[5,] <- tapply(Clothes,T_Age_5s, mean) # 被服及び履物 hyo1[6,] <- tapply(Health,T_Age_5s, mean) # 保健医療 hyo1[7,] <- tapply(Transport,T_Age_5s, mean) # 交通・通信 hyo1[8,] <- tapply(Education,T_Age_5s, mean) # 教育 hyo1[9,] <- tapply(Recreation,T_Age_5s, mean) # 教養娯楽 hyo1[10,] <- tapply(OL_Expenditure,T_Age_5s, mean) # その他の消費支出
  16. 16. II-14 hyo1 # 表示 # 上の方法では、列数に比例してコードが長くなる # 同じ処理を繰り返し文により書き直す hyo1b <- hyo1 # 現在の hyo1 の内容を、hyo1b に保存 for (i in 11:20) { hyo1[i-10,] <- tapply(dat[,i], T_Age_5s, mean) } (hyo1 - hyo1b) # 差分により結果が同じであることを確認 round(hyo1, digits=2) # 表示(小数点以下第 3 位四捨五入) ☆参照 #これを外部にテキストファイルとして書き出すこともできる setwd("D:/K01/V02") # 保存先を指定 #四捨五入した hyo1 をカンマ区切りで、空の列名を NA として出力 write.table(round(hyo1), file="hyo1.csv", sep="," , col.names=NA) 5.2 累積棒グラフと帯グラフの作成 次に、このクロス表から、累積棒グラフと、構成比による帯グラフを作成する。 #棒グラフ作成(累積、横棒・縦棒の例) barplot(hyo1) # デフォルトは縦棒の累積 barplot(hyo1, horiz=TRUE) # horiz=T で横棒に barplot(hyo1, horiz=TRUE, las=2) # 軸ラベルが入るよう、軸と垂直にする # 表側が切れるので、マージンを変更する。数字は左から下・左・上・右。 par(mar=c(6,5,3,2)) # デフォルトは c(5,4,4,2) barplot(hyo1, horiz=T RUE, las=2, col=gray.colors(10), main="年齢階級別消費支出", legend=t(rownames(hyo1))) # 棒グラフ: 図 5.1 # legend オプションで凡例追加 barplot(hyo1, horiz=TRUE, col=rainbow(10, alpha=0.6), las=2, main="年齢階級別消費支出",) #カラー表示。alpha では0から 1 の範囲で透過度を指定 #構成比を計算して帯グラフに sm1 <- apply(hyo1, 2, sum) # 年齢階級別の十大費目の合計額 hyo2 <- t(t(hyo1)/ sm1) # 年齢階級別の構成比を計算 apply(hyo2, 2, sum) # 年齢別に合計して 1 になるかどうかを確認 barplot(hyo2*100, horiz=TRUE, col= gray.colors(10), las=1, main="年齢階級別消費支出の構成比", xlab="パーセント") #帯グラフ:図 5.2 ☆ 漢字を含むデータを表示させると桁ずれが起きる。それを防ぐために、R コンソールの メニューバーから「編集」=>「GUI プリファレンス」を選択し、「Font」を「MS Gothic」 に設定する。
  17. 17. II-15 図 5.1 年齢階級毎の十大費目別消費支出 図 5.2 年齢階級毎の十大費目別消費支出の構成比 集計結果を可視化することで、集計表だけではわかりにくい、年齢階級別の消費支出の 内訳の差異が理解しやすくなる。 就業者以外 30歳未満 30~34歳 35~39歳 40~44歳 45~49歳 50~54歳 55~59歳 60~64歳 65歳以上 食料 住居 光熱・水道 家具・家事用品 被服及び履物 保健医療 交通・通信 教育 教養娯楽 その他の消費支出 年齢階級別消費支出0 50000 100000 150000 200000 250000 300000 350000 就業者以外 30歳未満 30~34歳 35~39歳 40~44歳 45~49歳 50~54歳 55~59歳 60~64歳 65歳以上 年齢階級別消費支出の構成比 パーセント 0 20 40 60 80 100
  18. 18. II-16 5.3 プロット図の保存と加工 (1) 手作業の場合 ① グラフィックウインドウをクリックしてアクティブ化 ② メニューバーから「ファイル」を選択する。 => 「別名で保存」 => お好みのファイル形式を選択 => ファイル名と置き場所を指定(ここでは png と emf を作成する) ③ 余白を削り、文字を追加するなどの加工には、ペイントが便利 (2) コードによるプロット図のファイル保存 上で作成した、図 5.1 及び 5.2 を、A4 縦のサイズで png 方式で保存する。 # A4 横サイズの png 形式で保存(200 dpi) png(filename="年齢 階級別消費支出.png", width=1654, height=2339, pointsize = 32) par(mfrow=c(2,1), mar=c(6,5,3,2)) # 2 行 1 列にウィンドウを分割 barplot(hyo1, horiz=TRUE, col=rainbow(11, alpha=0.6), las=2, main="年齢階級別消費支出", xlim=c(0, 500000), legend=t(rownames(hyo1))) barplot(hyo2*100, horiz=TRUE, col= rainbow(11, alpha=0.6), main="年齢階級別消費支出の構成比", las=1, xlab="パーセント") dev.off() # png 関数で開いたファイルに書き込みを終えて閉じる ここでは png ファイルを作成しているが、この他関数 bmp、pdf や jpeg、そして emf 形式のファイルを作成する関数 win.metafile が用意されている。 保存するサイズが、width と height の数値が逆なら A4 横、短辺だけ倍の数値にすると A3 サイズになる。 ・グラフィックウィンドウは大量に開くとメモリを消費する ・単純なコピーペーストも可能だが、日本語は化ける ・jpeg は加工で劣化するので、png 形式が良い ・emf 形式ファイルは、プロット図を要素に分解して加工することができる
  19. 19. II-17 6.詳細分析 6.1 主食(穀類)について ここでは、特定の一般用ミクロデータに収録されている収支項目のうち、米、パン、麺 類、その他の穀類という内訳を持つ穀類に着目する。穀類の消費額に占める金額の割合が 最も多いものをその世帯の主食と考え、それぞれ主食が米、パン、麺類である世帯の違い について分析を行う。 ① 主食分類符号の作成 穀類(E002)とその内訳(E003~E006)の内容を確認し、穀類の中で最も消費金額の 多いものを主食とみなして、分析用に主食分類符号を作成する。 # 主食に関するデータを確認。該当変数は、E002 から E006 で、データフレーム内では 22 から 26 番目にあることは、コンスタントデータで確認できる # 想定されない数字以外の文字が入っているか確認 => 全てなし is.character(E002); is.character(E003); is.character(E004); is.character(E005); is.character(E006); # 総合計と内訳の和の差異は誤差の範囲 sum(E002) - sum(E003) - sum(E004) - sum(E005) - sum(E006) # -> -190 length(which(is.na(dat[,22:26])==TRUE)) # NA の確認 #......................................................... # 主食符号の作成 ## 主食インデックス(g1-g4)の作成 g1 <- which(E003 >= E004 & E003 >= E005 & E003 >= E006) g2 <- which(E004 > E003 & E004 >= E005 & E004 >= E006) g3 <- which(E005 > E003 & E005 > E004 & E005 >= E006) g4 <- which(E006 > E003 & E006 > E004 & E006 > E005) # g1~g4 の中身は、それぞれ主食が米、パン、麺、その他であるデータのインデックス番 号 length(g1); length(g2); length(g3); length(g4); length(g1)+length(g2)+length(g3)+length(g4) ## 主食符号(f.MD)セット f.MD <- rep(NA, dim(dat)[1]) f.MD[g1] <- 1
  20. 20. II-18 f.MD[g2] <- 2 f.MD[g3] <- 3 f.MD[g4] <- 4 length(which(is.na(f.MD)==TRUE)) # 主食符号 NA の有無を確認 table(f.MD, useNA="always") # 主食符号別世帯数 # 主食符号別の金額比率を計算してみる t1 <- matrix(NA, nr=5, nc=4) # 5 行 4 列 colnames(t1) <- items$Japanese[23:26] #漢字の項目名を付与 rownames(t1) <- c("世帯数", " 世帯比率%", "合計金額(千円)", "平均金額(円)", " 金額比率%") t1[1,] <- table(f.MD) # 世帯数 t1[2,] <- t1[1,] / sum(t1[1,]) * 100 # 世帯比率 t1[3,] <- apply(dat[,23:26], 2, sum) /1000 # 合計金額[千円] t1[4,] <- apply(dat[,23:26], 2, mean) # 世帯平均金額[円] t1[5,] <- t1[3,] / sum(t1[3,]) * 100 # 比率計算 round(t1) <結果> 米 パン めん類 他の穀類 世帯数 36400 8615 795 1 世帯比率% 79 19 2 0 合計金額(千円) 154998 99435 58927 15147 平均金額(円) 3383 2171 1286 331 金額比率% 47 30 18 5 ② 主食別エンゲル係数の算出 エンゲル係数とは、食料費の支出総額に対する割合はエンゲル係数(Engel‘s coefficient) と呼ばれ、世帯の所得水準が高くなるに従って減少するというエンゲルの法則はよく知ら れている[竹内 et al. (1989) 統計学辞典, 東洋経済新報社]。 # 主食分類符号別エンゲル係数の基本統計量算出 エンゲル係数: 食料(Food)÷ 消費支出(L_Expenditure)×100[%]
  21. 21. II-19 # 支出総額(L_Expenditure) に占める食料費(Food)の割合 eg1 <- Food / L_Expenditure * 100 summary(eg1) # 基本統計量 # これを主食別に算出して縦ベクトルを横に結合する out1<-cbind(summary(Food[g1]/L_Expenditure[g1]), summary(Food[g2] / L_Expenditure[g2]), summary(Food[g3] / L_Expenditure[g3]), summary(Food[g4] / L_Expenditure[g4]), summary(Food / L_Expenditure)) * 100 colnames(out1) <- c("米", "パン", "麺", "その他", "合計") round(out1, digits=3) # 小数点第 3 位で四捨五入 record <- c(t1[1,],sum(t1[1,])) #主食別のレコード数及び合計 out1 <- rbind(out1, record) #縦に結合 主食別エンゲル係数の基本統計量とレコード数 米 パン めん類 他の穀類 合計 最小値(Min.) 2.173 2.114 4.642 18.01 2.114 第一四分位(1st Qu.) 19.03 18.16 17.64 18.01 18.82 中央値(Median) 24.99 23.93 23.02 18.01 24.73 平均値(Mean) 25.76 24.53 24.05 18.01 25.5 第三四分位(3rd Qu.) 31.73 30.13 29.7 18.01 31.42 最大値(Max.) 67.04 63.77 58.11 18.01 67.04 レコード数 36400 8615 795 1 45811  主食別のレコード数にだいぶ差があるので、最小値や最大値は単純に比較できない  注目ポイントは中央値や平均値 ③ 可視化: より複雑な棒グラフ 主食分類符号別のエンゲル係数の中央値と平均値について、棒グラフを作成する。 # 複雑の棒プロット(主食分類符号別エンゲル係数の中央値と平均値 barplot(out1[3:4,], beside=TRUE) # 中央値と平均に着目 # y 軸改善, 凡例・目盛り追加 barplot(out1[3:4,], beside=TRUE, legend=c("中央値", "平均値"), ylim=c(0,30), main="主食の違いによる中央値・平均値の差異") # 中央値と平均に着目 abline(h=0:30, col="gray", lty=3) #----------------図 6.1 が表示される
  22. 22. II-20 図 6.1 主食に違いによる中央値・平均値の差異棒グラフ描画 主食の違いにより、エンゲル係数の平均や中央値に差異がみられ、米が主食の場合が最 もエンゲル係数が高いことがわかる。 6.2 肉と魚 一般用ミクロデータの食料の内訳の中に魚介類(E007)と肉類(E012)が含まれている。 それぞれの消費額と、世帯主の年齢との関係性について、分析を行う。 ① 食料と魚介類と肉類の消費額 まず、それぞれの消費額の分布をヒストグラムで確認する。 #食料・魚介類・肉類 summary(cbind(Food,E007,E012)) # 単位は 3 つとも円 # Food E007 E012 # Min. : 9737 Min. : 566 Min. : 733 # 1st Qu.: 48105 1st Qu.: 4290 1st Qu.: 3772 # Median : 63498 Median : 5981 Median : 5238 # Mean : 68740 Mean : 6680 Mean : 5838 # 3rd Qu.: 83502 3rd Qu.: 8262 3rd Qu.: 7231
  23. 23. II-21 # Max. :394347 Max. :69420 Max. :39011 #金額の分布 par(mfrow=c(1,2)) #1 行 2 列に画面分割 hist(E007, main="魚", breaks="Scott") hist(E012, main="肉", breaks="Scott") # 両者のヒストグラムの縦軸のスケールをそろえる y_max <- max(hist(E007, breaks="Scott")$counts, hist(E012, breaks="Scott")$counts) # ヒストグラムのビンの最大値 require(MASS) #truehist を使用するため MASS パッケージ par(mfrow=c(1,2)) #1 行 2 列 truehist(E007, main="魚", prob=FALSE, ylim=c(0, y_max)) #図 6.2 の「魚」 truehist(E012, main="肉", prob=FALSE, ylim=c(0, y_max)) #図 6.2 の「肉」 図 6.2 魚と肉の金額のヒストグラム描画 さらに、魚介類と肉類の消費額を年齢階級別にみていく。 #魚と肉の消費、年齢階級別 fishmeat.age <- matrix(NA,nr=2,nc =11) # 作成する表のイメージ colnames(fishmeat.age) <- c("30 歳未満", "30~34 歳", "35~39歳", "40~44 歳", "45 ~49 歳", "50~54 歳", "55~59 歳", "60~64 歳", "65 歳以上", "(非就業)65 歳未満","(非就業)65 歳以上") rownames(fishmeat.age) <- c("魚", "肉") fishmeat.age[1,] <- tapply(E007,T_Age,mean) fishmeat.age[2,] <- tapply(E012,T_Age,mean)
  24. 24. II-22 fishmeat.age #表示 t(round(fishmeat.age)) # t()で縦横を転置することができる par(mar=c(5,8,3,2)) # 魚と肉の消費額、年齢階級別の折れ線グラフ par(mar=c(8,3,3,2)) plot(0, 0, type="n", xlim=c(1,ncol(fishmeat.age)), ylim=c(0,max(fishmeat.age)), xaxt="n", xlab="", ylab="平均消費額") # x 軸メモリを xaxt で消す axis(1, at=1:11, labels=colnames(fishmeat.age), las=3) # x 軸の各ラベル名 lines(fishmeat.age[1,], lwd=3,lty=1, col="red") # 魚の折れ線グラフ lines(fishmeat.age[2,], lwd=3, lty=2, col="blue") # 肉の折れ線グラフ # 凡例 legend("topleft", legend=rownames(fishmeat.age), lty=c(1,2), lwd=3, col=c("red","blue")) #----------------図 6.3 が表示される # 構成比の棒グラフ par(mar=c(5,8,3,2)) barplot((prop.table(fishmeat.age,2)*100),legend=rownames(fishmeat.age), las=2, horiz=TRUE, xlab="%", main="魚・肉の比率") 図 6.3 年齢階級別魚と肉の消費額の折れ線グラフ このグラフを見る限り、就業世帯については、だいたい世帯主の年齢が 40 歳代後半で、 肉よりも魚の消費額が多くなる傾向があることがわかる。 02000400060008000 平均消費額 30歳未満 30~34歳 35~39歳 40~44歳 45~49歳 50~54歳 55~59歳 60~64歳 65歳以上 (非就業)65歳未満 (非就業)65歳以上 魚 肉
  25. 25. II-23 このような肉と魚の消費額の変化が、他の調査項目と関連があるかどうかを、散布図行 列により調べてみる。年間収入、消費支出、食料、魚介類、肉類の散布図行列を作成し、 世帯属性等で色分けをする。 # 散布図行列 fooddat <- cbind(Y_Income, L_Expenditure, Food, E007, E012) pairs(fooddat) pairs(log10(fooddat)) #色分け pairs(fooddat, col=rainbow(2)[T_SeJinin]) #世帯人員 #就労非就労別に 2 色の色分けに透過度(alpha)を加え、大きさ(cex)を小さく pairs(fooddat, col=rainbow(2, alpha=0.2)[T_Syuhi], pch=21, cex=0.5) pairs(fooddat, col=rainbow(10)[as.numeric(T_Age_5s)+1])#年齢階級(就労)0- pairs(fooddat, col=rainbow(2)[T_JuSyoyu], cex=0.1, pch=20) #住居所有 # 常用対数化 pairs(log10(fooddat), col=rainbow(2)[T_SeJinin]) #世帯人員 #就労非就労別に 2 色の色分けに透過度(alpha)を加え、大きさ(cex)を小さく pairs(log10(fooddat), col=gray.colors(2, alpha=0.2)[T_Syuhi], pch=21, cex=0.5) #----------------図 6.4 が表示される pairs(log10(fooddat), col=rainbow(10)[as.numeric(T_Age_5s)+1]) #年齢階級(就労) pairs(log10(fooddat), col=rainbow(2)[T_JuSyoyu], cex=0.1, pch=20) #住居所有 研修テキストは白黒印刷なので、図 6.4 では色分けが判別しにくい。このため、カラー での散布図プロットのコードも提示した。
  26. 26. II-24 図 6.4 年間収入、消費支出、食料、魚介類、肉類の対数の散布図行列(就労非就労別)
  27. 27. II-25 [参考] 一般用ミクロデータ・詳細品目版について この分析編で使用されている、独立行政法人統計センターが公開している一般用ミクロ データの詳細品目版は、平成 21 年全国消費実態調査の集計表に基づき、乱数により作成し た擬似的なミクロデータで、実際の調査データではないため実証分析などには利用できな いことに、留意を必要とする。 このデータは、公的統計のミクロデータの利用促進を目的に、統計演習などの教育用に 広く一般に提供されており、独立行政法人統計センター「一般用ミクロデータの利用」の サイト[ http://www.nstac.go.jp/services/ippan-microdata.html ]から誰でも自由にダ ウンロードすることができる。サイトのイメージは、次ページのとおり。 このデータの符号表と、詳細品目の変数名一覧をこのテキストの末尾に添付する。
  28. 28. II-26 一般用ミクロデータの提供サイトイメージ

×