# ref : https://stackoverflow.com/questions/40307510/central-limit-theorem-in-r
# ref : https://ko.wikipedia.org/wiki/%EC%A4%91%EC%8B%AC%EA%B7%B9%ED%95%9C%EC%A0%95%EB%A6%AC
#
# 확률분포를 가진 독립 확률 변수 n개의 [평균의 분포]는 n이 적당히 크다면 정규분포에 가까워진다는 정리
library(ggplot2)
library(gridExtra)
Attaching package: 'gridExtra'
The following object is masked from 'package:dplyr':
combine
The following object is masked from 'package:randomForest':
combine
# 모집단 : N(0, 1) , 10000000 elements
population = rnorm(n = 10000000, m = 0, sd = 1)
plot(density(population), main = paste("mean = ", mean(population), "/ sd = ", var(population)))

# 평균들의 분포
sample.means <- function(population, sample_size, repeat_count) {
rowMeans(matrix(population, nrow = repeat_count , ncol = sample_size))
}
qqplot.data <- function (vec) {
y <- quantile(vec[!is.na(vec)], c(0.25, 0.75))
x <- qnorm(c(0.25, 0.75))
slope <- diff(y)/diff(x)
int <- y[1L] - slope * x[1L]
d <- data.frame(resids = vec)
ggplot(d, aes(sample = resids)) + stat_qq() + geom_abline(slope = slope, intercept = int, colour="red") + ggtitle("Q-Q plot")
}
eval <- function(population, sample_size, repeat_count) {
sample.means.small <- sample.means(population, sample_size, repeat_count)
simul_variance <- round(var(sample.means.small),5)
expected_variance <- round(var(population) / sample_size,5)
diff <- round(abs(expected_variance - simul_variance),5)
p1 <- qplot(sample.means.small,
geom="histogram",
bins=30,
main=paste("sample_n : ", sample_size ," variance : ", simul_variance, " vs ", expected_variance, "(", diff , ") mean : ", round(mean(sample.means.small),5) ))
p2 <- qqplot.data(sample.means.small)
grid.arrange(p1,p2,nrow=2)
}
eval(population, 10, 1000)

eval(population, 50, 1000)

eval(population, 200, 1000)

# 모집단 : chi squared distribution , 10000000 elements
population = rchisq(n = 10000000, df = 0, ncp = 2.)
plot(density(population), main = paste("mean = ", mean(population), "/ sd = ", var(population)))

eval(population, 10, 1000)

eval(population, 50, 1000)

eval(population, 200, 1000)

LS0tCnRpdGxlOiAi7KSR7Ius6re57ZWc7KCV66asIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7cn0KIyByZWYgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MDMwNzUxMC9jZW50cmFsLWxpbWl0LXRoZW9yZW0taW4tcgojIHJlZiA6IGh0dHBzOi8va28ud2lraXBlZGlhLm9yZy93aWtpLyVFQyVBNCU5MSVFQyU4QiVBQyVFQSVCNyVCOSVFRCU5NSU5QyVFQyVBMCU5NSVFQiVBNiVBQwojCiMgIO2ZleuloOu2hO2PrOulvCDqsIDsp4Qg64+F66a9IO2ZleuloCDrs4DsiJggbuqwnOydmCBb7Y+J6reg7J2YIOu2hO2PrF3ripQgbuydtCDsoIHri7ntnogg7YGs64uk66m0IOygleq3nOu2hO2PrOyXkCDqsIDquYzsm4zsp4Tri6TripQg7KCV66asCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ3JpZEV4dHJhKQoKIyDrqqjsp5Hri6ggOiBOKDAsIDEpICwgMTAwMDAwMDAgZWxlbWVudHMKcG9wdWxhdGlvbiA9IHJub3JtKG4gPSAxMDAwMDAwMCwgbSA9IDAsIHNkID0gMSkKcGxvdChkZW5zaXR5KHBvcHVsYXRpb24pLCBtYWluID0gcGFzdGUoIm1lYW4gPSAiLCBtZWFuKHBvcHVsYXRpb24pLCAiLyBzZCA9ICIsIHZhcihwb3B1bGF0aW9uKSkpCmBgYAoKCmBgYHtyfQojIO2Pieq3oOuTpOydmCDrtoTtj6wgCnNhbXBsZS5tZWFucyA8LSBmdW5jdGlvbihwb3B1bGF0aW9uLCBzYW1wbGVfc2l6ZSwgcmVwZWF0X2NvdW50KSB7CiAgcm93TWVhbnMobWF0cml4KHBvcHVsYXRpb24sIG5yb3cgPSByZXBlYXRfY291bnQgLCBuY29sID0gc2FtcGxlX3NpemUpKQp9CgpxcXBsb3QuZGF0YSA8LSBmdW5jdGlvbiAodmVjKSB7CiAgeSA8LSBxdWFudGlsZSh2ZWNbIWlzLm5hKHZlYyldLCBjKDAuMjUsIDAuNzUpKQogIHggPC0gcW5vcm0oYygwLjI1LCAwLjc1KSkKICBzbG9wZSA8LSBkaWZmKHkpL2RpZmYoeCkKICBpbnQgPC0geVsxTF0gLSBzbG9wZSAqIHhbMUxdCgogIGQgPC0gZGF0YS5mcmFtZShyZXNpZHMgPSB2ZWMpCgogIGdncGxvdChkLCBhZXMoc2FtcGxlID0gcmVzaWRzKSkgKyBzdGF0X3FxKCkgKyBnZW9tX2FibGluZShzbG9wZSA9IHNsb3BlLCBpbnRlcmNlcHQgPSBpbnQsIGNvbG91cj0icmVkIikgKyBnZ3RpdGxlKCJRLVEgcGxvdCIpICAKfQoKZXZhbCA8LSBmdW5jdGlvbihwb3B1bGF0aW9uLCBzYW1wbGVfc2l6ZSwgcmVwZWF0X2NvdW50KSB7CiAgc2FtcGxlLm1lYW5zLnNtYWxsIDwtIHNhbXBsZS5tZWFucyhwb3B1bGF0aW9uLCBzYW1wbGVfc2l6ZSwgcmVwZWF0X2NvdW50KQogIHNpbXVsX3ZhcmlhbmNlIDwtIHJvdW5kKHZhcihzYW1wbGUubWVhbnMuc21hbGwpLDUpCiAgZXhwZWN0ZWRfdmFyaWFuY2UgPC0gcm91bmQodmFyKHBvcHVsYXRpb24pIC8gc2FtcGxlX3NpemUsNSkKICBkaWZmIDwtIHJvdW5kKGFicyhleHBlY3RlZF92YXJpYW5jZSAtIHNpbXVsX3ZhcmlhbmNlKSw1KQogIAogIHAxIDwtIHFwbG90KHNhbXBsZS5tZWFucy5zbWFsbCwgCiAgICAgICAgZ2VvbT0iaGlzdG9ncmFtIiwgCiAgICAgICAgYmlucz0zMCwgCiAgICAgICAgbWFpbj1wYXN0ZSgic2FtcGxlX24gOiAiLCBzYW1wbGVfc2l6ZSAsIiB2YXJpYW5jZSA6ICIsIHNpbXVsX3ZhcmlhbmNlLCAiIHZzICIsIGV4cGVjdGVkX3ZhcmlhbmNlLCAiKCIsIGRpZmYgLCAiKSAgbWVhbiA6ICIsIHJvdW5kKG1lYW4oc2FtcGxlLm1lYW5zLnNtYWxsKSw1KSAgKSkKICBwMiA8LSBxcXBsb3QuZGF0YShzYW1wbGUubWVhbnMuc21hbGwpCiAgCiAgZ3JpZC5hcnJhbmdlKHAxLHAyLG5yb3c9MikKfQoKZXZhbChwb3B1bGF0aW9uLCAxMCwgMTAwMCkKZXZhbChwb3B1bGF0aW9uLCA1MCwgMTAwMCkKZXZhbChwb3B1bGF0aW9uLCAyMDAsIDEwMDApCgpgYGAKCmBgYHtyfQojIOuqqOynkeuLqCA6IGNoaSBzcXVhcmVkIGRpc3RyaWJ1dGlvbiAsIDEwMDAwMDAwIGVsZW1lbnRzCnBvcHVsYXRpb24gPSByY2hpc3EobiA9IDEwMDAwMDAwLCBkZiA9IDAsIG5jcCA9IDIuKQpwbG90KGRlbnNpdHkocG9wdWxhdGlvbiksIG1haW4gPSBwYXN0ZSgibWVhbiA9ICIsIG1lYW4ocG9wdWxhdGlvbiksICIvIHNkID0gIiwgdmFyKHBvcHVsYXRpb24pKSkKYGBgCgpgYGB7cn0KZXZhbChwb3B1bGF0aW9uLCAxMCwgMTAwMCkKZXZhbChwb3B1bGF0aW9uLCA1MCwgMTAwMCkKZXZhbChwb3B1bGF0aW9uLCAyMDAsIDEwMDApCmBgYAo=