R言語で重み付きの平均である加重平均を計算する関数やその使用例について紹介していきます。
実行例では、加重平均の具体的な計算例について見ていき、どのような場面で用いられるのか理解を深めていきます。
この記事で扱うプログラミングコードは以下からダウンロードできます。
加重平均について詳しく見たい方は次の記事を参照。
【統計学】加重平均の計算 重み付きの平均 記述統計
重み付きの平均である加重平均について解説する。 加重平均の定義やその具体的な計算例や用い方について詳しく見ていく。 R言語での加重平均の計算については以下の記事を参照。 算術平均(相加平均)・幾何平均 ...
続きを見る
加重平均
加重平均の概要とR言語の関数を紹介します。
概要
加重平均はWeighted arithmetic meanと呼ばれ、名前の通り算術平均に重みが付いたもので定義されます。
加重平均の定義は以下の通りです。
加重平均
\(n\)個の標本\(x_1, x_2, \ldots , x_n\)と重み\(w_1, w_2, \ldots , w_n\)に対し、加重平均は次で定義される。
定義から分かるように、各データの重要度を考慮し平均を求めたいときは、加重平均の方が適しています。
また、重みが全て等しいとき、すなわち\(w_1 = w_2 = \cdots w_n\)のとき、加重平均は算術平均と一致します。
関数weighted.mean
加重平均を計算するには、次の関数weighted.meanを用います。
weighted.mean(x, w, …)
# S3 method for default
weighted.mean(x, w, …, na.rm = FALSE)
関数weighted.meanの引数は以下の通りです。
x | 加重平均を計算するオブジェクト。 |
w | numeric型のベクトル加重平均の重み。 |
... | 他のメソッドに渡す引数。 |
ma.rm | logical型。欠測値NAを加重平均の計算の前に除去するかどうか。 |
実行例
関数weighted.meanを用いた加重平均の計算例について見ていきます。
加重平均の理解が深まるよう、計算例を2つほどまとめました。
グラフの作成で次のパッケージggplot2を用います。インストールしておいてください。
1 2 | install.packages("ggplot2") library(ggplot2) |
計算例1
次の商品A, B, C, D, Eの数と価格についてのデータについて、商品1つ当たりの価格の平均の計算を行いたいと思います。
1 2 3 4 5 6 7 8 9 10 | > dataset <- data.frame(count = c(1000, 2000, 1500, 1750, 500), + price = c(100, 150, 300, 200, 400), + row.names = c("A", "B", "C", "D", "E")) > dataset count price A 1000 100 B 2000 150 C 1500 300 D 1750 200 E 500 400 |
また、商品の数と価格の棒グラフは下の画像のようになります。
1 2 3 | ggplot(dataset, aes(x = as.factor(price), y = count, fill = as.factor(row.names(dataset)))) + geom_bar(stat = "identity") + labs(fill = "") |
A, B, C, D, Eの5つの商品の1個あたりの価格を求めるときは、それぞれの商品の価格に数を掛けた和を全商品の数で割るのが普通なので、加重平均によって平均を算出するのが適しています。
この場合、加重平均の重みは各商品の数となるので、関数weighted.meanの引数を次のように与えてあげます。
1 2 3 | > weightedMean_score <- weighted.mean(dataset$price, dataset$count) > weightedMean_score [1] 207.4074 |
ちなみに、商品の数を考慮せずに5種類の商品の平均を計算すると次となります。
1 2 3 | > mean_score <- mean(dataset$price) > mean_score [1] 230 |
価格が小さい商品が多くあることが考慮されていないため、加重平均よりも小さくなります。
これらの結果をcsvファイルに保存したいときは、関数data.frameを用いて結果を格納し、関数write.csvなどでファイルに出力すると便利です。
1 2 | statsTable <- data.frame(mean = mean_score, weighted.mean = weightedMean_score, row.names = NULL) write.csv(statsTable, "平均_加重平均.csv", row.names = FALSE) |
計算例2
他の加重平均の例も紹介する。
次の5人の中間テストと期末テストの点数に関するデータが得られたとする。下の画像は各5人の中間テストと期末テストの点数の推移を表している。
ID | 中間テスト | 期末テスト |
1 | 70 | 80 |
2 | 50 | 60 |
3 | 80 | 70 |
4 | 90 | 60 |
5 | 30 | 100 |
中間テストと期末テストの点数から成績を決定する際に、中間テストよりも期末テストの方を重視して成績を計算することがよくあります。
例えば中間テストと期末テストの点数の比重を3対7としたとき、5人の2期の点数の平均は次のように加重平均により計算することができます。
下のコードでは重みを0.3, 0.7と与えていますが、3, 7と与えても大丈夫です。
1 2 3 4 | > testWeight <- c(0.3, 0.7) > weightedMean_test <- apply(dataset, 1, function(x) {weighted.mean(x, w = testWeight)}) > weightedMean_test [1] 77 57 73 69 79 |
また、通常の算術平均を用いた場合、5人の平均は次のようになります。
1 2 3 | > mean_test <- apply(dataset, 1, mean) > mean_test [1] 75 55 75 75 65 |
加重平均による平均点と通常の算術平均による平均点をまとめると次のようになります。
1 2 3 4 5 6 7 8 | > statsTable <- cbind(dataset, average.score = mean_test, weighted.score = weightedMean_test) > statsTable midterm final average.score weighted.score 1 70 80 75 77 2 50 60 55 57 3 80 70 75 73 4 90 60 75 69 5 30 100 65 79 |
期末テストの点数の比重が高いため、5人目のように中間テストの点数が悪くても期末テストの点数が高ければ他の平均よりも高くっているのが確認できます。
まとめ
R言語で加重平均を計算する関数やその実行例について見ていきました。
関数weighted.meanを用いることで加重平均を計算することができます。
各データの重要度を考慮した平均を計算することが可能です。