おそらくあなたが望んでいるのは(シャノンの)エントロピーだと思います。これは次のように計算されます
これは、カテゴリ変数の情報量についての考え方を表します。
H(x )= −Σバツ私p (バツ私)ログ2p (バツ私)
ではR
、次のように計算できます。
City = c("Moscow", "Moscow", "Paris", "London", "London",
"London", "NYC", "NYC", "NYC", "NYC")
table(City)
# City
# London Moscow NYC Paris
# 3 2 4 1
entropy = function(cat.vect){
px = table(cat.vect)/length(cat.vect)
lpx = log(px, base=2)
ent = -sum(px*lpx)
return(ent)
}
entropy(City) # [1] 1.846439
entropy(rep(City, 10)) # [1] 1.846439
entropy(c( "Moscow", "NYC")) # [1] 1
entropy(c( "Moscow", "NYC", "Paris", "London")) # [1] 2
entropy(rep( "Moscow", 100)) # [1] 0
entropy(c(rep("Moscow", 9), "NYC")) # [1] 0.4689956
entropy(c(rep("Moscow", 99), "NYC")) # [1] 0.08079314
entropy(c(rep("Moscow", 97), "NYC", "Paris", "London")) # [1] 0.2419407
これから、ベクトルの長さが問題ではないことがわかります。可能なオプションの数(カテゴリ変数の「レベル」)により、その数は増加します。可能性が1つしかなかった場合、値は(可能な限り低い)です。確率が等しい場合、指定された数の可能性について、値が最大になります。 0
多少技術的には、より多くの可能なオプションを使用すると、エラーを最小限に抑えながら変数を表すためにより多くの情報が必要になります。オプションが1つしかない場合、変数には情報がありません。より多くのオプションがあっても、ほとんどすべての実際のインスタンスが特定のレベルである場合、情報はほとんどありません。結局のところ、あなたは「モスクワ」を推測することができ、ほとんど常に正しいです。
your.metric = function(cat.vect){
px = table(cat.vect)/length(cat.vect)
spx2 = sum(px^2)
return(spx2)
}
your.metric(City) # [1] 0.3
your.metric(rep(City, 10)) # [1] 0.3
your.metric(c( "Moscow", "NYC")) # [1] 0.5
your.metric(c( "Moscow", "NYC", "Paris", "London")) # [1] 0.25
your.metric(rep( "Moscow", 100)) # [1] 1
your.metric(c(rep("Moscow", 9), "NYC")) # [1] 0.82
your.metric(c(rep("Moscow", 99), "NYC")) # [1] 0.9802
your.metric(c(rep("Moscow", 97), "NYC", "Paris", "London")) # [1] 0.9412
推奨されるメトリックは、確率の2乗の合計です。いくつかの点で同様に動作します(たとえば、変数の長さに不変であることに注意してください)が、レベル数が増加するか、変数がより不均衡になると減少することに注意してください。エントロピーとは逆に移動しますが、単位(増分のサイズ)は異なります。メトリックはとによってバインドされますが、エントロピーはから無限大の範囲です。ここにそれらの関係のプロットがあります: 010