問題

本調査の Q4, Q5 のデータを用い、漫画、ロックバンド、服に関して、男性向けのものが好きな女性と、女性向けのものが好きな男性では、どちらが回答者の平均的な違和感が大きいか調べなさい。

解答例

データの読み込み

このデータの場合、ロングに変換する前に、用いるデータだけを残したデータフレーム(以下では d01)を作っておくとわかりやすい。

d0 <- read.csv("C:/Users/taroh/Dropbox/24G_Course/2024社会学実習性規範調査.csv", fileEncoding = "utf8", na.strings = "")
names.d0 <- names(d0)  # 後で何かの役に立つかもしれないので名前を付けておく

dim(d0)
## [1] 206 116
# names(d0)

d0$id <- 1 : nrow(d0)


## Q4 Q5 を分析する.  使わない変数は削除。回答者の性別や年齢、誕生月も要らないが、一応残す

d01 <- d0[, c(2 : 28,   # フェイスシートと a票の Q4, Q5
              40 : 63,  # b票の Q4, Q5
              75 : 98,  # c票の Q4, Q5
              117)]     # id
dim(d01)
## [1] 206  76
# names(d01) # うまくいっているか確認

## ロングに変換
library(reshape2)
d01.long <- melt(
  d01,
  measure.vars = 4 : 75
)
dim(d01.long)  # d0の行数 X 72(Q4のヴィネットの総数)だけ行数があるはず. 列は 6列(回答者に関する質問が 3, id, vignette, discomfort )
## [1] 14832     6
d01.long <- d01.long [order(d01.long$id), ]
# head(d01.long)
names.d01.long <- names(d01.long)  # これも何かの役に立つかもなので保存
# 書きやすい変数名に変更
names(d01.long) <- c("sex", "age", "birthmonth",
                      "id", "vignette", "discomfort")
library(knitr)
# 名前を付け間違えていないか確認
kable(
  cbind(names(d01.long), names.d01.long)
)
names.d01.long
sex Q1.あなたの性別は.
age Q2.あなたの年齢は.
birthmonth Q3.あなたは何月生まれですか.あてはまるものを一つ選んでください.
id id
vignette variable
discomfort value
# Q4, Q5 の回答の分布を確認
table(d01.long$ discomfort)
## 
## あまり違和感を感じない         あまり感じない   とても違和感を感じる 
##                    176                    790                     57 
##           とても感じる       違和感を感じない     少し違和感を感じる 
##                    377                   2687                    131 
##             少し感じる 
##                    719
# 数値に変換
d01.long$ discomfort.n [d01.long$discomfort == "とても感じる" | 
                          d01.long$discomfort == "とても違和感を感じる"] <- 3
d01.long$ discomfort.n [d01.long$discomfort == "少し感じる" | 
                          d01.long$discomfort == "少し違和感を感じる"] <- 2
d01.long$ discomfort.n [d01.long$discomfort == "あまり感じない" | 
                          d01.long$discomfort == "あまり違和感を感じない" ] <- 1
d01.long$ discomfort.n [d01.long$discomfort == "違和感を感じない"] <- 0
xtabs(~discomfort + discomfort.n, d01.long)
##                         discomfort.n
## discomfort                  0    1    2    3
##   あまり違和感を感じない    0  176    0    0
##   あまり感じない            0  790    0    0
##   とても違和感を感じる      0    0    0   57
##   とても感じる              0    0    0  377
##   違和感を感じない       2687    0    0    0
##   少し違和感を感じる        0    0  131    0
##   少し感じる                0    0  719    0
summary(d01.long$ discomfort.n)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   0.000   0.000   0.000   0.804   2.000   3.000    9895

ロングデータの変数を作る

この課題の実行だけを考えれば、もう少し簡単なやり方もあろうが、一般的には、以下のようにヴィネットの各次元の水準を示す変数を作ったほうが、汎用性が高く後々便利である。Q4, Q5 の場合、ヴィネット中の行為者の性別(男/女)と年齢(10, 25, 45, 70歳)、それと何が好きか(異性向けアニメ、カフェめぐり、等々)、の三つの要因を表す変数を作る必要がある。

文字列の置換

このデータでは、vignette の値の文字列が「Q4a.次のような男性について.あなたはどの程度違和感を感じますか…a8.お菓子作りが好きな45歳の男性.」のように、長すぎる。そこで、すべての値に共通の「.次のような男性について.あなたはどの程度違和感を感じますか..」を「違和感」と置換することにする。このような場合、 sub() という関数が便利である。

sub(“正規表現”, “置換する文字列”, “検索対象となる文字列ベクトル”)

以下が利用例。

x <- c("marx", "weber", "durkheim", "manheim", "mead")
sub("e", "E", x)
## [1] "marx"     "wEber"    "durkhEim" "manhEim"  "mEad"

“正規表現” は複雑な検索条件を指定するための記法であるが、ここでは解説しない。ググれ。正規表現では、半角ピリオドは \. としなければヒットしないので、“\.次のような男性について\.あなたはどの程度違和感を感じますか\.\.” のように指定しなければならない。

# vignette の値の文字列が長すぎるので、同じ文言の繰り返しは削除
# sub("正規表現", "置換する文字列", "")
d01.long$vignette <- sub("\\.次のような男性について\\.あなたはどの程度違和感を感じますか\\.\\.", "違和感", d01.long$vignette)
d01.long$vignette <- sub("\\.次のような女性について\\.あなたはどの程度違和感を感じますか\\.\\.", "違和感", d01.long$vignette)

sort(unique(d01.long$ vignette))
##  [1] "Q4a違和感.a1.女児向けのアニメが好きな70歳の男性."  
##  [2] "Q4a違和感.a10.カフェ巡りが好きな70歳の男性."       
##  [3] "Q4a違和感.a11.ヨガをするのが好きな25歳の男性."     
##  [4] "Q4a違和感.a12.バレエを踊るのが好きな10歳の男性."   
##  [5] "Q4a違和感.a2.女児向けのアニメが好きな25歳の男性."  
##  [6] "Q4a違和感.a3.少女漫画が好きな10歳の男性."          
##  [7] "Q4a違和感.a4.女性用の服を着るのが好きな25歳の男性."
##  [8] "Q4a違和感.a5.男性アイドルが好きな10歳の男性."      
##  [9] "Q4a違和感.a6.男性アイドルが好きな25歳の男性."      
## [10] "Q4a違和感.a7.男性ロックバンドが好きな25歳の男性."  
## [11] "Q4a違和感.a8.お菓子作りが好きな45歳の男性."        
## [12] "Q4a違和感.a9.カフェ巡りが好きな25歳の男性."        
## [13] "Q4b違和感.b1.女児向けのアニメが好きな10歳の男性."  
## [14] "Q4b違和感.b10.ヨガをするのが好きな70歳の男性."     
## [15] "Q4b違和感.b11.ヨガをするのが好きな10歳の男性."     
## [16] "Q4b違和感.b12.バレエを踊るのが好きな70歳の男性."   
## [17] "Q4b違和感.b2.少女漫画が好きな45歳の男性."          
## [18] "Q4b違和感.b3.少女漫画が好きな25歳の男性."          
## [19] "Q4b違和感.b4.女性用の服を着るのが好きな10歳の男性."
## [20] "Q4b違和感.b5.男性アイドルが好きな70歳の男性."      
## [21] "Q4b違和感.b6.男性ロックバンドが好きな70歳の男性."  
## [22] "Q4b違和感.b7.男性ロックバンドが好きな10歳の男性."  
## [23] "Q4b違和感.b8.お菓子作りが好きな25歳の男性."        
## [24] "Q4b違和感.b9.カフェ巡りが好きな45歳の男性."        
## [25] "Q4c違和感.c1.女児向けのアニメが好きな45歳の男性."  
## [26] "Q4c違和感.c10.ヨガをするのが好きな45歳の男性."     
## [27] "Q4c違和感.c11.バレエを踊るのが好きな25歳の男性."   
## [28] "Q4c違和感.c12.バレエを踊るのが好きな45歳の男性."   
## [29] "Q4c違和感.c2.少女漫画が好きな70歳の男性."          
## [30] "Q4c違和感.c3.女性用の服を着るのが好きな70歳の男性."
## [31] "Q4c違和感.c4.女性用の服を着るのが好きな45歳の男性."
## [32] "Q4c違和感.c5.男性アイドルが好きな45歳の男性."      
## [33] "Q4c違和感.c6.男性ロックバンドが好きな45歳の男性."  
## [34] "Q4c違和感.c7.お菓子作りが好きな70歳の男性."        
## [35] "Q4c違和感.c8.お菓子作りが好きな10歳の男性."        
## [36] "Q4c違和感.c9.カフェ巡りが好きな10歳の男性."        
## [37] "Q5a違和感.d1.男児向けのアニメが好きな25歳の女性."  
## [38] "Q5a違和感.d10.野球をするのが好きな45歳の女性."     
## [39] "Q5a違和感.d11.野球をするのが好きな25歳の女性."     
## [40] "Q5a違和感.d12.ラグビーをするのが好きな25歳の女性." 
## [41] "Q5a違和感.d2.少年漫画が好きな70歳の女性."          
## [42] "Q5a違和感.d3.少年漫画が好きな25歳の女性."          
## [43] "Q5a違和感.d4.男性用の服を着るのが好きな45歳の女性."
## [44] "Q5a違和感.d5.女性アイドルが好きな25歳の女性."      
## [45] "Q5a違和感.d6.女性ロックバンドが好きな45歳の女性."  
## [46] "Q5a違和感.d7.女性ロックバンドが好きな10歳の女性."  
## [47] "Q5a違和感.d8.麻雀が好きな10歳の女性."              
## [48] "Q5a違和感.d9.バイクが好きな25歳の女性."            
## [49] "Q5b違和感.e1.男児向けのアニメが好きな10歳の女性."  
## [50] "Q5b違和感.e10.野球をするのが好きな70歳の女性."     
## [51] "Q5b違和感.e11.ラグビーをするのが好きな10歳の女性." 
## [52] "Q5b違和感.e12.ラグビーをするのが好きな70歳の女性." 
## [53] "Q5b違和感.e2.少年漫画が好きな45歳の女性."          
## [54] "Q5b違和感.e3.男性用の服を着るのが好きな25歳の女性."
## [55] "Q5b違和感.e4.男性用の服を着るのが好きな70歳の女性."
## [56] "Q5b違和感.e5.女性アイドルが好きな10歳の女性."      
## [57] "Q5b違和感.e6.女性ロックバンドが好きな25歳の女性."  
## [58] "Q5b違和感.e7.麻雀が好きな70歳の女性."              
## [59] "Q5b違和感.e8.麻雀が好きな25歳の女性."              
## [60] "Q5b違和感.e9.バイクが好きな10歳の女性."            
## [61] "Q5c違和感.f1.男児向けのアニメが好きな70歳の女性."  
## [62] "Q5c違和感.f10.バイクが好きな45歳の女性."           
## [63] "Q5c違和感.f11.野球をするのが好きな10歳の女性."     
## [64] "Q5c違和感.f12.ラグビーをするのが好きな45歳の女性." 
## [65] "Q5c違和感.f2.男児向けのアニメが好きな45歳の女性."  
## [66] "Q5c違和感.f3.少年漫画が好きな10歳の女性."          
## [67] "Q5c違和感.f4.男性用の服を着るのが好きな10歳の女性."
## [68] "Q5c違和感.f5.女性アイドルが好きな45歳の女性."      
## [69] "Q5c違和感.f6.女性アイドルが好きな70歳の女性."      
## [70] "Q5c違和感.f7.女性ロックバンドが好きな70歳の女性."  
## [71] "Q5c違和感.f8.麻雀が好きな45歳の女性."              
## [72] "Q5c違和感.f9.バイクが好きな70歳の女性."
# 性別
otoko  <- grepl("歳の男性", d01.long$ vignette)
d01.long$ sex.v <- factor(otoko, labels = c("女", "男"))
xtabs(~otoko + sex.v, d01.long)
##        sex.v
## otoko     女   男
##   FALSE 7416    0
##   TRUE     0 7416
# 年齢(今回の課題では必要ないので省略可)
age10 <- grepl("10歳の", d01.long$ vignette)
age25 <- grepl("25歳の", d01.long$ vignette)
age45 <- grepl("45歳の", d01.long$ vignette)
age70 <- grepl("70歳の", d01.long$ vignette)


d01.long$ age.v [age10] <- 10
d01.long$ age.v [age25] <- 25
d01.long$ age.v [age45] <- 45
d01.long$ age.v [age70] <- 70

xtabs(~age.v + age45, d01.long)
##      age45
## age.v FALSE TRUE
##    10  3708    0
##    25  3708    0
##    45     0 3708
##    70  3708    0
# それぞれの趣味に関するヴィネットかを示すダミー変数(今回の課題のためには、漫画、ロック、服の分だけ作ればよい)
anime <- grepl("アニメ", d01.long$ vignette)  # 女児向けも男児向けも同じカテゴリに分類される点に注意
cafe <- grepl("カフェ巡り", d01.long$ vignette)
yoga <- grepl("ヨガ", d01.long$ vignette)
ballet <- grepl("バレエ", d01.long$ vignette)
manga <- grepl("漫画", d01.long$ vignette)  # 同上
cloth <- grepl("服", d01.long$ vignette)  # 同上
idol <- grepl("アイドル", d01.long$ vignette)  # 同上
sweets <- grepl("お菓子", d01.long$ vignette)
baseball <- grepl("野球", d01.long$ vignette)
rugby <- grepl("ラグビー", d01.long$ vignette)
bike <- grepl("バイク", d01.long$ vignette)
mah.jongg <- grepl("麻雀", d01.long$ vignette)
rock <- grepl("ロックバンド", d01.long$ vignette)  # 同上

# 趣味を示す因子の作成:これも今回の課題には必要ないので省略可
d01.long $taste [anime] <- "アニメ"
d01.long $taste [cafe] <- "カフェ巡り"
d01.long $taste [yoga] <- "ヨガ"
d01.long $taste [ballet] <- "バレエ"
d01.long $taste [manga] <- "漫画"
d01.long $taste [cloth] <- "服"
d01.long $taste [idol] <- "アイドル"
d01.long $taste [sweets] <- "お菓子作り"
d01.long $taste [baseball] <- "野球"
d01.long $taste [rugby] <- "ラグビー"
d01.long $taste [bike] <- "バイク"
d01.long $taste [mah.jongg] <- "麻雀"
d01.long $taste [rock] <- "ロックバンド"

d01.long$ taste <- factor(d01.long$ taste)
summary(d01.long$ taste)
##     アイドル       アニメ   お菓子作り   カフェ巡り       バイク       バレエ 
##         1648         1648          824          824          824          824 
##         ヨガ     ラグビー ロックバンド           服         麻雀         漫画 
##          824          824         1648         1648          824         1648 
##         野球 
##          824
library(gplots)
## 
## 次のパッケージを付け加えます: 'gplots'
## 以下のオブジェクトは 'package:stats' からマスクされています:
## 
##     lowess
# 漫画に関するヴィネットに関する回答だけを subset = で集めて、ヴィネット中の男女別に平均値をプロット 
plotmeans(discomfort.n ~ sex.v, data = d01.long, subset = manga)  

# ロック  (以下同文)
plotmeans(discomfort.n ~ sex.v, data = d01.long, subset = rock)

# 服 (以下同文)
plotmeans(discomfort.n ~ sex.v, data = d01.long, subset = cloth)