重み付きデータ
ランク | 時給 | 人数 |
---|---|---|
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) #分散