重み付きデータ
| ランク | 時給 | 人数 | 
|---|---|---|
| D-1 | 750 | 2 | 
| D-2 | 800 | 10 | 
| C-1 | 850 | 7 | 
| C-2 | 900 | 4 | 
| C-3 | 1000 | 4 | 
| B-1 | 1200 | 3 | 
| B-2 | 1500 | 2 | 
| B-3 | 2000 | 2 | 
| A | 3000 | 1 | 
表は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) #分散