データの読み込み

「tgw.RDS」というファイルを読み込み、任意の名のオブジェクトして保存する。 head()とtail()でデータの最初と最後を確認する。

data01 <- readRDS("data/tgw.RDS")
head(data01)
tail(data01)

単純集計の例

単項選択の場合

複数の選択肢の中から1つを回答させる質問形式。table()関数で1つの項目(変数)について集計。

table(data01$Q25)

  0   1   2   3   4   5   6 
  1 120  31   4  28  31  15 

結果を配列として保存し、各選択肢の内容をラベルとして用いる場合は以下の通り。マトリックスではないので、colnames()ではなく、names()を使う。

tbl01 <- table(data01$Q25)
names(tbl01) <- list("無回答","住み続けたい","当分は住んでいたい",
     "市内で転居したい","市外に転出したい","どちらとも言えない","わからない")

for (i in 1:7){cat(names(tbl01)[i],"---",tbl01[i],"\n")}
無回答 --- 1 
住み続けたい --- 120 
当分は住んでいたい --- 31 
市内で転居したい --- 4 
市外に転出したい --- 28 
どちらとも言えない --- 31 
わからない --- 15 

以下のようにすることもできる。knitrパッケージのkable()関数を使う。

knitr::kable(tbl01)
Var1 Freq
無回答 1
住み続けたい 120
当分は住んでいたい 31
市内で転居したい 4
市外に転出したい 28
どちらとも言えない 31
わからない 15

以下、説明省略。

table(data01$F1)

  1   2 
 94 136 
tbl02 <- table(data01$F1)
names(tbl02) <- list("M","F")
for (i in 1:2){cat(names(tbl02)[i],"---",tbl02[i],"\n")}
M --- 94 
F --- 136 
knitr::kable(tbl02)
Var1 Freq
M 94
F 136

複数回答を許す場合

各項目(変数)に個別に0または1をデータでは入力。0は選択なし、1は選択あり。

ひとまとまりの列(変数)の開始列と終了列を確認して以下のようにする。

変数名を書き換えてしまうので、作業用にdata01を作成。

data01_ <- data01
a <- 3 # 開始列
b <- 10 # 終了列

colnames(data01_)[a:b] <-  c("自転車","バイク","自家用車","バス","JR","平成筑豊鉄道","タクシー","その他") 

c <- b-a +1 # 項目数
Q1 <- numeric(c)
Q1 <- colSums(data01_[,a:b])
knitr::kable(Q1)
x
自転車 22
バイク 10
自家用車 186
バス 41
JR 18
平成筑豊鉄道 17
タクシー 22
その他 1

クロス集計の例

「table(A, B)」で、「A by B」のクロス集計。

集計結果をマトリックスに保存する。ここでは、tbl03とした。

table(data01$Q25,data01$F1)
##    
##      1  2
##   0  0  1
##   1 53 67
##   2 16 15
##   3  1  3
##   4 10 18
##   5  9 22
##   6  5 10
tbl03 <- table(data01$Q25,data01$F1)

rownames(tbl03) <-  list("無回答","住み続けたい","当分は住んでいたい",
     "市内てで転居したい","市外に転出したい","どちらとも言えない","わからない")

colnames(tbl03) <- list("男","女")
knitr::kable(tbl03)
無回答 0 1
住み続けたい 53 67
当分は住んでいたい 16 15
市内てで転居したい 1 3
市外に転出したい 10 18
どちらとも言えない 9 22
わからない 5 10

以下は、一方の変数が複数回答を許す場合。

a <- 3 # 開始列
b <- 10 # 終了列
c <- b-a +1 # 項目数
d <- 2 # 第2変数の選択肢数
e <- c*d 
f <- 85 # 第2変数の列番号
m1 <- matrix(1:e,nrow=c)

rownames(m1) <- c("自転車","バイク","自家用車","バス","JR","平成筑豊鉄道","タクシー","その他")
colnames(m1) <- c("男","女")

for(i in 1:c){(m1[i,] <- table(data01[,i+ a -1],data01[,f])[2,1:d])} # 2行目の数値を取り出す
knitr::kable(m1)
自転車 11 11
バイク 5 5
自家用車 83 103
バス 14 27
JR 9 9
平成筑豊鉄道 7 10
タクシー 8 14
その他 0 1

棒グラフ

人数の棒グラフを作成。複数回答を許す質問群に対する回答を一括して表示したもの。

par(family="HiraKakuProN-W3",plt=c(0.2,1,0.3,0.8))
barplot(Q1,col=topo.colors(8),horiz = F,las=2,ylim = c(0,200)) 

複数回答の処理について

1つも選択していない人の数を調べて、パーセントを計算するときに外す。

a <- 3  # 開始列番号
b <- 10 # 終了列番号
knitr::kable(head(data01_[,a:b])) # 取り出したデータの確認
自転車 バイク 自家用車 バス JR 平成筑豊鉄道 タクシー その他
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 1 0 0 1 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
s <- table(rowSums(data01_[,a:b])) # 各回答者の選択数
cat("選択数の分布","(最初が無選択者数)",s,"\n") # 選択(者)数の分布
## 選択数の分布 (最初が無選択者数) 2 174 32 13 6 2 1
t <- sum(s) - s[1] # 無選択者数を選択者総数から引く
cat("回答者数=",as.integer(t))
## 回答者数= 228

棒グラフ

par(family="HiraKakuProN-W3",plt=c(0.2,1,0.3,0.8))
barplot(Q1/t*100,col=topo.colors(8),horiz = F,las=2,ylim = c(0,100),ylab = "単位:パーセント") 

性別でファイルを分割

ファイルを分割して単純集計をおこなえば、クロス集計と同じ結果が出てくる。

colnames(data01) # 項目(変数)名の確認
##  [1] "NO"    "Q011"  "Q012"  "Q013"  "Q014"  "Q015"  "Q016"  "Q017"  "Q018" 
## [10] "Q019"  "Q021"  "Q022"  "Q031"  "Q032"  "Q0401" "Q0402" "Q0403" "Q0404"
## [19] "Q0405" "Q0406" "Q0407" "Q0408" "Q0409" "Q0410" "Q0411" "Q0412" "Q0413"
## [28] "Q0414" "Q0415" "Q0416" "Q0417" "Q0418" "Q0419" "Q0420" "Q0421" "Q0422"
## [37] "Q0423" "Q061"  "Q062"  "Q063"  "Q064"  "Q065"  "Q066"  "Q067"  "Q068" 
## [46] "Q069"  "Q0701" "Q0702" "Q0703" "Q0704" "Q0705" "Q0706" "Q0707" "Q0708"
## [55] "Q0709" "Q0710" "Q0801" "Q0802" "Q0803" "Q0804" "Q0805" "Q0806" "Q0807"
## [64] "Q0808" "Q0809" "Q0810" "Q09"   "Q10"   "Q11"   "Q12"   "Q13"   "Q14"  
## [73] "Q15"   "Q16"   "Q17"   "Q18"   "Q19"   "Q20"   "Q21"   "Q22"   "Q23"  
## [82] "Q24"   "Q24S"  "Q25"   "F1"    "F2"    "F3"    "F4"    "F5"    "F6"
data01$F1 # 性別の項目のデータを確認。1が男、2が女。
##   [1] 2 1 1 1 2 2 1 2 2 2 2 1 2 1 2 2 1 2 1 2 2 1 2 1 2 1 2 2 2 2 2 1 2 1 1 2 1
##  [38] 1 2 1 1 2 2 2 1 2 1 2 2 1 2 1 2 1 1 2 2 2 1 1 2 1 1 2 2 1 1 2 2 1 2 1 2 2
##  [75] 2 1 1 1 2 1 2 2 2 1 2 2 2 1 1 2 1 2 1 1 1 2 2 2 1 2 2 1 1 1 2 1 2 2 2 2 1
## [112] 2 2 2 2 1 2 1 2 2 2 2 1 2 1 2 2 1 2 2 2 2 1 1 1 2 1 1 2 2 2 2 1 2 1 2 2 2
## [149] 1 1 2 2 2 1 2 2 2 1 2 2 2 2 2 1 2 2 2 1 2 1 1 2 1 1 2 1 2 1 2 1 1 1 2 1 1
## [186] 2 1 1 1 1 1 2 2 2 2 2 2 2 2 2 1 1 1 2 2 2 1 2 2 2 2 1 2 2 2 2 1 2 1 2 2 2
## [223] 1 2 2 1 2 1 1 2
table(data01$F1) # 性別の単純集計。
## 
##   1   2 
##  94 136
data01m <- data01[data01[,85] == 1,] # 男のデータのみを取りだし、data01mとする。
nrow(data01m)
## [1] 94
data01f <- data01[data01[,85] == 2,] # 女のデータのみを取りだし、data01fとする。
nrow(data01f)
## [1] 136

data01を分割してdata01m、data01fとした。

性別:男

data01_ <- data01m # 右側を置き換えた。
a <- 3 # 開始列
b <- 10 # 終了列

colnames(data01_)[a:b] <-  c("自転車","バイク","自家用車","バス","JR","平成筑豊鉄道","タクシー","その他") 

c <- b-a +1 # 項目数
Q1 <- numeric(c)
Q1 <- colSums(data01_[,a:b])
knitr::kable(Q1)
x
自転車 11
バイク 5
自家用車 83
バス 14
JR 9
平成筑豊鉄道 7
タクシー 8
その他 0
Q1m <- Q1 # 後で使うために別名で保存。
a <- 3  # 開始列番号
b <- 10 # 終了列番号
knitr::kable(head(data01_[,a:b])) # 取り出したデータの確認
自転車 バイク 自家用車 バス JR 平成筑豊鉄道 タクシー その他
2 0 0 1 0 0 0 0 0
3 0 0 1 1 0 0 1 0
4 0 0 1 0 0 0 0 0
7 0 0 1 0 0 0 0 0
12 0 0 1 0 0 0 0 0
14 0 0 1 0 0 0 0 0
s <- table(rowSums(data01_[,a:b])) # 各回答者の選択数
s 
## 
##  1  2  3  4  6 
## 66 17  9  1  1
t <- sum(s)

# 以下は実行しない。無選択者なし。
# cat("選択数の分布","(最初が無選択者数)",s,"\n") 
# t <- sum(s) - s[1] # 無選択者数を選択者総数から引く
cat("回答者数=",as.integer(t))
## 回答者数= 94
tm <- t # 後で使うために別名で保存。
par(family="HiraKakuProN-W3",plt=c(0.2,1,0.3,0.8))
barplot(Q1/t*100,col=topo.colors(8),horiz = F,las=2,ylim = c(0,100),ylab = "単位:パーセント") 

性別:女

data01_ <- data01f # 右側を置き換えた。
a <- 3 # 開始列
b <- 10 # 終了列

colnames(data01_)[a:b] <-  c("自転車","バイク","自家用車","バス","JR","平成筑豊鉄道","タクシー","その他") 

c <- b-a +1 # 項目数
Q1 <- numeric(c)
Q1 <- colSums(data01_[,a:b])
knitr::kable(Q1)
x
自転車 11
バイク 5
自家用車 103
バス 27
JR 9
平成筑豊鉄道 10
タクシー 14
その他 1
Q1f <- Q1 # 後で使うために別名で保存。
a <- 3  # 開始列番号
b <- 10 # 終了列番号
knitr::kable(head(data01_[,a:b])) # 取り出したデータの確認
自転車 バイク 自家用車 バス JR 平成筑豊鉄道 タクシー その他
1 0 0 1 0 0 0 0 0
5 0 0 1 0 0 0 0 0
6 0 0 1 0 0 0 0 0
8 1 0 0 1 1 1 1 0
9 0 0 1 0 0 0 0 0
10 0 0 1 0 0 0 0 0
s <- table(rowSums(data01_[,a:b])) # 各回答者の選択数
cat("選択数の分布","(最初が無選択者数)",s,"\n") # 選択(者)数の分布
## 選択数の分布 (最初が無選択者数) 2 108 15 4 5 2
t <- sum(s) - s[1] # 無選択者数を選択者総数から引く
cat("回答者数=",as.integer(t))
## 回答者数= 134
tf <- t # 後で使うために別名で保存。
par(family="HiraKakuProN-W3",plt=c(0.2,1,0.3,0.8))
barplot(Q1/t*100,col=topo.colors(8),horiz = F,las=2,ylim = c(0,100),ylab = "単位:パーセント") 

グラフの並置

用意しておいたQ1m、tm、Q1f、tfを使ってグラフを作成する。

par(family="HiraKakuProN-W3",mfrow=c(1,2),plt=c(0.3,1,0.3,0.8))
barplot(Q1m/tm*100,col=topo.colors(8),horiz = F,las=2,ylim = c(0,100),ylab = "単位:パーセント",main = "男") 
barplot(Q1f/tf*100,col=topo.colors(8),horiz = F,las=2,ylim = c(0,100),ylab = "単位:パーセント",main = "女")