社会調査情報処理実習A 2組

2017年度 後期 木04 15:15-16:45 瀬田2-119

重み付きデータ

ランク時給人数
D-17502
D-280010
C-18507
C-29004
C-310004
B-112003
B-215002
B-320002
A30001

表はA社契約社員のランクとその時給、およびランクごとの人数を示したものである。A社の契約社員の平均時給を求めよ。

data <- read.csv("http://kyoto-edu.sakura.ne.jp/weblesson/statistics/data/hourly-wage.csv", fileEncoding = "utf-8")
summary(data)
value <- data$時給

#人数列を無視して時給列のみで計算すると間違い
mean(value) #平均
median(value) #中央値
var(value) #分散

この問題の解答はもちろんmean(時給)→1333.33ではない。時給3000円もらっているのが1人なのに対して時給800円は10人もいる。このような形式のデータを「重み付きデータ」と呼ぶ。

関数 weighted.mean

重みを考慮に入れた平均値を「加重平均」という。この加重平均を求める関数がweighted.meanである。

weighted.mean(変数,度数変数)
data <- read.csv("http://kyoto-edu.sakura.ne.jp/weblesson/statistics/data/hourly-wage.csv", fileEncoding = "utf-8")
summary(data)
value <- data$時給
freq <- data$人数
weighted.mean(value,freq)

元データの復元

weighted.mean関数は(当たり前だが)加重平均にしか対応していない。中央値や分散などを計算する時には一旦元データを復元してから計算する。

重み付きデータというのは度数分布表のことなので、これを集計前の表に戻すのである。

data <- read.csv("http://kyoto-edu.sakura.ne.jp/weblesson/statistics/data/hourly-wage.csv", fileEncoding = "utf-8")
summary(data)
freq.name <- "人数"

freq <- data[colnames(data) == freq.name][[1]]
origin.data <- data.frame(lapply(data,function(row){rep(row,freq)}))[, colnames(data) != freq.name]
summary(origin.data)

value <- origin.data$時給

#origin.dataは普通の(重みのない)データなので今まで通りに扱える
mean(value) #平均
median(value) #中央値
var(value) #分散
lapply(X,function)
リストデータすべての要素に関数を適用する。
  • X…リストデータ
  • function…関数定義または関数名
rep(x,freq)
  • x…繰り返したい要素
  • freq…繰り返し回数

convert.weighted.data.to.original関数(socialStatisticsBasic.Rで読み込まれる自作関数)

convert.weighted.data.to.original(data.frame, freq.name)

重み付きデータから元データを復元する。

  • data.frame=重み付きデータ(data.frame型)
  • freq.name="Freq" 度数変数の項目(変数)名
data <- read.csv("http://kyoto-edu.sakura.ne.jp/weblesson/statistics/data/hourly-wage.csv", fileEncoding = "utf-8")
summary(data)

source("http://kyoto-edu.sakura.ne.jp/weblesson/statistics/socialStatisticsBasic.R", encoding="UTF-8")
#読み込んだconvert.weighted.data.to.original関数を用いる
origin.data <- convert.weighted.data.to.original(data, freq.name="人数")

summary(origin.data)

value <- origin.data$時給

#origin.dataは普通の(重みのない)データなので今まで通りに扱える
mean(value) #平均
median(value) #中央値
var(value) #分散