いっかくのデータサイエンティストをいく

1からプログラミングとデータサイエンスを独習したい

【統計学】度数分布表とヒストグラム(R)

Rで度数分布表とヒストグラムを実装します。

上の書籍の第1章SECTION5に該当。 この記事ではRで実装する。

データを確認する

データは0から200までの数字をランダムで100個発生させた下のようなものを使用します。

154,196,190,28,122,78,150,99,72,117,
73,195,3,62,190,125,7,63,182,56,
7,29,56,104,154,12,117,63,90,176,
101,168,47,99,69,124,55,173,115,71,
93,31,66,21,5,155,8,54,131,146,
54,160,10,59,140,103,40,23,125,35,
170,145,148,109,22,60,63,13,167,111,
125,78,97,130,118,140,29,156,146,94,
98,12,78,171,161,71,96,198,170,177,
145,5,197,186,15,95,30,162,165,108

Rで度数分布表

cut関数で数値をカテゴリ化して、table関数で集計する。 階級数は5から15までの間で決める(7つくらいが一番妥当と聞いたことがあります)のですが スタージェスの公式が目安になることもあります。 今回は階級数8、階級の幅25で作成します。

#データ読込
data <- c(
 154,196,190,28,122,78,150,99,72,117,
 73,195,3,62,190,125,7,63,182,56,
 7,29,56,104,154,12,117,63,90,176,
 101,168,47,99,69,124,55,173,115,71,
 93,31,66,21,5,155,8,54,131,146,
 54,160,10,59,140,103,40,23,125,35,
 170,145,148,109,22,60,63,13,167,111,
 125,78,97,130,118,140,29,156,146,94,
 98,12,78,171,161,71,96,198,170,177,
 145,5,197,186,15,95,30,162,165,108)


#数値を階級のカテゴリに変換
caegory_data <- cut(data, breaks =seq(0, 200, by = 25), right = FALSE)
category_data
 # [1] [150,175) [175,200) [175,200) [25,50)   [100,125) [75,100)  [150,175)
# [8] [75,100)  [50,75)   [100,125) [50,75)   [175,200) [0,25)    [50,75)  
# [15] [175,200) [125,150) [0,25)    [50,75)   [175,200) [50,75)   [0,25)   
# [22] [25,50)   [50,75)   [100,125) [150,175) [0,25)    [100,125) [50,75)  
# [29] [75,100)  [175,200) [100,125) [150,175) [25,50)   [75,100)  [50,75)  
# [36] [100,125) [50,75)   [150,175) [100,125) [50,75)   [75,100)  [25,50)  
# [43] [50,75)   [0,25)    [0,25)    [150,175) [0,25)    [50,75)   [125,150)
# [50] [125,150) [50,75)   [150,175) [0,25)    [50,75)   [125,150) [100,125)
# [57] [25,50)   [0,25)    [125,150) [25,50)   [150,175) [125,150) [125,150)
# [64] [100,125) [0,25)    [50,75)   [50,75)   [0,25)    [150,175) [100,125)
# [71] [125,150) [75,100)  [75,100)  [125,150) [100,125) [125,150) [25,50)  
# [78] [150,175) [125,150) [75,100)  [75,100)  [0,25)    [75,100)  [150,175)
# [85] [150,175) [50,75)   [75,100)  [175,200) [150,175) [175,200) [125,150)
# [92] [0,25)    [175,200) [175,200) [0,25)    [75,100)  [25,50)   [150,175)
# [99] [150,175) [100,125)
#8 Levels: [0,25) [25,50) [50,75) [75,100) [100,125) [125,150) ... [175,200)

#度数分布表
table(category_data)
#category_data
#   [0,25)   [25,50)   [50,75)  [75,100) [100,125) [125,150) [150,175) 
#       14         8        17        12        12        12        15 
#[175,200) 
#       10 

Rでヒストグラム

hist関数でOK。

h <- hist(data)

f:id:imakoto0323:20180619173723p:plain

ヒストグラム戻り値と度数分布表

実はhist関数の戻り値のなかに度数分布表が隠されています。 breaksが階級幅で、countsが度数です。

h <- hist(data)
h
#$breaks
# [1]   0  20  40  60  80 100 120 140 160 180 200
#
#$counts
# [1] 11 10  8 13  9 10  9 11 11  8
#
#$density
# [1] 0.0055 0.0050 0.0040 0.0065 0.0045 0.0050 0.0045 0.0055 0.0055 0.0040
#
#$mids
# [1]  10  30  50  70  90 110 130 150 170 190
#
#$xname
#[1] "data"
#
#$equidist
#[1] TRUE
#
#attr(,"class")
#[1] "histogram"

次回はPythonで度数分布表です。