#title Histogram [[TableOfContents]] ==== shape ==== {{{ library(rgr) shape(iris$Sepal.Length, ifqs = TRUE) }}} attachment:4-plot/shape.png ==== 겹쳐그리기 ==== rgb()로 rgb(red, green, blue, alpha ..) 색깔, 투명도를 조정한다. {{{ hist(iris[iris$Species =="setosa", 1], col="grey", xlim=range(iris$Sepal.Length), ylim=c(0,25)) hist(iris[iris$Species =="versicolor", 1], col=rgb(1, 0, 0, 0.5), add=TRUE) hist(iris[iris$Species =="virginica", 1], col=rgb(0, 1, 0, 0.5), add=TRUE) }}} attachment:Histogram/hist_group.png ==== hist함수에 boxplot 추가하기 ==== {{{ hist(iris$Sepal.Length) sfsmisc::histBxp(iris$Sepal.Length) }}} attachment:Histogram/hist_boxplot.png {{{ library(packHV) hist_boxplot(iris$Sepal.Length) }}} attachment:Histogram/hist_boxplot2.png ==== hist함수에 line 추가하기 ==== 방법: https://cran.r-project.org/doc/contrib/Lemon-kickstart/kr_adlin.html {{{ rescale<-function(x,newrange) { if(nargs() > 1 && is.numeric(x) && is.numeric(newrange)) { # if newrange has max first, reverse it if(newrange[1] > newrange[2]) { newmin<-newrange[2] newrange[2]<-newrange[1] newrange[1]<-newmin } xrange<-range(x) if(xrange[1] == xrange[2]) stop("can't rescale a constant vector!") mfac<-(newrange[2]-newrange[1])/(xrange[2]-xrange[1]) invisible(newrange[1]+(x-xrange[1])*mfac) } else { cat("Usage: rescale(x,newrange)\n") cat("\twhere x is a numeric object and newrange is the min and max of the new range\n") } } set.seed(1) val1 <- rnorm(50) set.seed(100) val2 <- rnorm(100) + 5 val <- c(val1, val2) h <- hist(val) plot(h) lines(rescale(spline(h$counts)$x, range(h$mids)), spline(h$counts)$y) }}} attachment:Histogram/hist_add_line.png ==== sigma level ==== attachment:Histogram/sigma_level.png --출처: https://en.wikipedia.org/wiki/Six_Sigma ==== 도수분포표(히스토그램) ==== 어떤 데이터가 전체 중에 차지하는 위치를 알아내기 위해서는 전체 경향을 파악하는 일이 매우 중요하다. 전체 경향을 파악하는데는 도수분포표가 매우 유용하다. 도수분포표는 다음과 같은 방법으로 만들 수 있다. 1. 데이터의 최대, 최소값을 구한다. 1. 자료의 크기에 따라 적당한 계급의 수를 정한다.(이상치는 제거한다.([이상치 제거 방법])) 1. 중복되지 않게 계급의 크기를 정한다. 1. 각 계급에 속하는 도수(데이터 수)를 구한다. 1. 계급은 연속으로 표시한다. 1. 상대도수를 구한다. (상대도수 = 해당 계급의 도수 / 전체 도수) ==== 스튜아지스 방법 ==== 스튜아지스의 방법은 통계학 책의 거의 처음 부분에 나오는 내용이다. 스튜아지스는 계급의 수[* 몇 개로 쪼갤 것인가]를 결정하는 방법으로 다음과 같은 공식을 만들었다. * 계급의 수 k {{{=}}} 1 + (log,,10,,N / log,,10,,2) (N; 자료의 수) = {{{1 + (LOG10(N) / LOG10(2))}}} * 계급의 범위 R = (Max값 - Min값) / k 분류하는 방법은 위의 공식을 이용하여 다음과 같은 순서로 구하면 된다. 1. 데이터의 총 개수, Max값, Min값을 구한다. 이 때 Max값, Min값을 구할 때는 이상치를 제거하는 것이 좋다. 2. 스튜아지스의 방법을 이용하여 계급의 수(k)를 구한다. 3. 윗 단계에서 구해진 계급의 수 k를 이요하여 값의 범위를 구한다. 4. 구해진 범위로 데이터를 구분한다. 다음은 SQL Server 2005에서 T-SQL 구현한 예이다. {{{ DECLARE @k int , @r bigint , @avg bigint , @sigma bigint , @min bigint , @max bigint , @cnt int , @min_real bigint , @max_real bigint --1 + (LOG10(N) / LOG10(2)) SELECT @sigma = STDEV(Score) , @avg = AVG(Score) , @min_real = MIN(Score) , @max_real = MAX(Score) FROM #Score -- 이상치 제거후 구간을 구한다.: 평균 - (1.5 * 표준편차) ~ 평균 + (1.5 * 표준편차) SELECT @r = (MAX(Score) - MIN(Score)) / (1 + (LOG10(COUNT(*)) / LOG10(2))) , @k = (1 + (LOG10(COUNT(*)) / LOG10(2))) , @cnt = COUNT(*) , @min = MIN(Score) , @max = MAX(Score) FROM #Score WHERE Score > @avg - (3 * @sigma) AND Score < @avg + (3 * @sigma) ;WITH Dumy(Seq) AS ( SELECT 1 Seq UNION ALL SELECT Seq + 1 FROM Dumy WHERE Seq + 1 <= @k ), Grade AS ( SELECT (@k - Seq ) + 1 Grade , @min + ((Seq-1) * @r) BeginScore , @min + (Seq * @r) EndScore FROM Dumy ), RealGrade AS ( SELECT Grade, BeginScore, EndScore FROM Grade UNION ALL SELECT Grade + 1, @min_real, EndScore + 1 FROM Grade WHERE Grade = (SELECT MAX(Grade) FROM Grade) UNION ALL SELECT Grade - 1, BeginScore + 1, @max_real FROM Grade WHERE Grade = (SELECT MIN(Grade) FROM Grade) ) SELECT B.Grade , COUNT(*) AccountCnt , SUM(NetAMT) NetAMT FROM #Score A INNER JOIN RealGrade B ON A.Score BETWEEN B.BeginScore AND B.EndScore GROUP BY B.Grade ORDER BY 1 }}} ==== 표준편차를 이용하는 방법 ==== 표준편차를 이용하면 단순히 우수, 보통, 취약 이렇게 3개의 그룹으로 나눌 수 있다. 예를 들어, 50명이 정원인 한 학급에서 학생들의 키에 대한 평균치가 170Cm이고, 표준편차가 7Cm였을 때에 다음과 같이 나뉠 수 있다. (σ[* 시그마]: 표준편차, μ[* 뮤]: 평균) * 취약: 163Cm 미만 (μ - σ) * 보통: 163 ~ 177Cm (68.3%) * 우수: 177Cm 초과 (μ + σ) 표준편차는 자료의 특성을 매우 잘 나타내는 지표로 정규분포의 15.85% 정도의 하위, 상위를 나타내므로 취약과 우수를 판단하는데에는 매우 큰 도움이 된다. 3개의 그룹대신 {(μ - 3σ) ~ (μ + 3σ)} 과 같이 6개의 구간으로 나눌 수도 있다. attachment:Histogram/normal_distribution.jpg {{{표준정규분포}}} 참고로 '6시그마'의 시그마는 위의 그림과 같은 뜻을 내포하고 있다. 6시그마는 (μ - 6σ) ~ (μ + 6σ)의 구간을 뜻을 나타낸다. ==== 5단계 평가 ==== 위의 정규분포에서 다음과 같이 5개의 구간으로 나눌 수도 있다. ||구분||범위||범위(%)|| ||E||(최소값) ~ (m - 1.5σ)||7%|| ||D||(m - 1.5σ) ~ (m - 0.5σ)||24%|| ||C||(m - 0.5σ) ~ (m + 0.5σ)||38%|| ||B||(m + 0.5σ) ~ (m + 1.5σ)||24%|| ||A||(m + 1.5σ) ~ (최대값)||7%|| ==== 기타 ==== * [기준치와 편차치] 도 세분화에 참고할 만하다. ==== R을 이용한 히스토그램 ==== {{{ x <- rnorm(100) xnm <- "정규분포" hist(x, labels=TRUE, main = paste("Histogram of" , xnm), xlab = xnm) }}} attachment:Histogram/hist01.jpg {{{ x <- rnorm(1000) hist(x, probability=T) lines(density(x)) }}} attachment:Histogram/hist02.jpg ==== 그룹별로 ==== {{{ install.packages("sm") library("sm") y <- c(1,2,3) levels(x9$lf_group) <- c("group1", "group2", "group3") sm.density.compare(x9$frd_cnt, x9$lf_group) legend("topright", levels(x9$lf_group), fill=2+(0:nlevels(x9$lf_group))) }}} {{{ library("ggplot2") diamonds_small <- diamonds[sample(nrow(diamonds), 1000), ] ggplot(diamonds_small, aes(depth, fill = cut)) + geom_density(alpha = 0.2) + xlim(55, 70) }}} attachment:Histogram/hist04.png ==== 2D 히스토그램 ==== {{{ install.packages('squash') library('squash') attach(quakes) hist2(depth, long) }}} attachment:Histogram/hist03.png