[R]Zipf’s law in R

出現頻度がk 番目に大きい要素が全体に占める割合が1/k に比例する、というジップの法則(Zipf’s Law)というのがある。

数学的には次のように定義される。(wikipedia から)

  • N be the number of elements;
  • k be their rank;
  • s be the value of the exponent characterizing the distribution.

  • 単語の使用頻度
  • 都市の人口
  • 人々の収入

などは、この法則に従う例でよく引用される。

wikipedia に N を固定してsを動かした場合の可視化(Probability Mass FunctionCumulative distribution function)があったので、現実逃避に R で再発明をしてみる。

以下、白背景が wikipedia。グレー背景がggplot2
—–
Probability Mass Function

# Zipf Probability mass function
# N = 10 on a log-log scale
create_zipf <- function(N, s) {
  val         <- seq(1, N)
  numerator   <- 1 / (val ^ s)
  denominator <- sum(numerator)
  zipf        <- numerator/denominator
  data.frame(k=val, s=s, zipf=zipf)
}

dat <- rbind(create_zipf(10, 1),
             create_zipf(10, 2),
             create_zipf(10, 3),
             create_zipf(10, 4),
             create_zipf(10, 5))

p <- ggplot(dat, aes(x=k, y=zipf, group=s))
p + geom_line(aes(color=s)) + geom_point() + scale_x_log10() + scale_y_log10() + opts(title='Zipf Probability mass function(N = 10)')

Cumulative distribution function

# Zipf Cumulative distribution function
# N = 10. 

create_cum_zipf <- function(N, s) {
  val           <- seq(1, N)
  numerator     <- 1 / (val ^ s)
  denominator   <- sum(numerator)
  zipf          <- numerator/denominator
  total_zipf    <- sum(zipf)
  relative_zipf <- zipf/total_zipf

  data.frame(k=val, s=s, zipf=cumsum(relative_zipf))
}
dat <- rbind(create_cum_zipf(10, 1),
             create_cum_zipf(10, 2),
             create_cum_zipf(10, 3),
             create_cum_zipf(10, 4),
             create_cum_zipf(10, 5))

p <- ggplot(dat, aes(x=k, y=zipf, group=s))
p + geom_line(aes(color=s)) + geom_point() + opts(title='Zipf Cumulative distribution function(N = 10)')

TODO

時間が足りずギブアップした点

  • データフレームをrbind でつなげている処理はもっとすっきりかけるはず。
  • probability mass function のデータフレームをいじるだけで cumulative function 向けのデータフレームを作成できるはず
Advertisements
Tagged with: , , ,
Posted in R

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: