_대문 | 방명록 | 최근글 | 홈피소개 | 주인놈
FrontPage › Histogram

Contents

[-]
1 shape
2 겹쳐그리기
3 hist함수에 boxplot 추가하기
4 hist함수에 line 추가하기
5 sigma level
6 도수분포표(히스토그램)
7 스튜아지스 방법
8 표준편차를 이용하는 방법
9 5단계 평가
10 기타
11 R을 이용한 히스토그램
12 그룹별로
13 2D 히스토그램


1 shape #

library(rgr)
shape(iris$Sepal.Length, ifqs = TRUE)
shape.png

2 겹쳐그리기 #

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)
hist_group.png

3 hist함수에 boxplot 추가하기 #

hist(iris$Sepal.Length)
sfsmisc::histBxp(iris$Sepal.Length) 
hist_boxplot.png

library(packHV)
hist_boxplot(iris$Sepal.Length)
hist_boxplot2.png

4 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)

hist_add_line.png

6 도수분포표(히스토그램) #

어떤 데이터가 전체 중에 차지하는 위치를 알아내기 위해서는 전체 경향을 파악하는 일이 매우 중요하다. 전체 경향을 파악하는데는 도수분포표가 매우 유용하다. 도수분포표는 다음과 같은 방법으로 만들 수 있다.

  1. 데이터의 최대, 최소값을 구한다.
  2. 자료의 크기에 따라 적당한 계급의 수를 정한다.(이상치는 제거한다.(이상치 제거 방법))
  3. 중복되지 않게 계급의 크기를 정한다.
  4. 각 계급에 속하는 도수(데이터 수)를 구한다.
  5. 계급은 연속으로 표시한다.
  6. 상대도수를 구한다. (상대도수 = 해당 계급의 도수 / 전체 도수)

7 스튜아지스 방법 #

스튜아지스의 방법은 통계학 책의 거의 처음 부분에 나오는 내용이다. 스튜아지스는 계급의 수[1]를 결정하는 방법으로 다음과 같은 공식을 만들었다.

  • 계급의 수 k = 1 + (log10N / log102) (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


8 표준편차를 이용하는 방법 #

표준편차를 이용하면 단순히 우수, 보통, 취약 이렇게 3개의 그룹으로 나눌 수 있다. 예를 들어, 50명이 정원인 한 학급에서 학생들의 키에 대한 평균치가 170Cm이고, 표준편차가 7Cm였을 때에 다음과 같이 나뉠 수 있다. (σ[2]: 표준편차, μ[3]: 평균)

  • 취약: 163Cm 미만 (μ - σ)
  • 보통: 163 ~ 177Cm (68.3%)
  • 우수: 177Cm 초과 (μ + σ)

표준편차는 자료의 특성을 매우 잘 나타내는 지표로 정규분포의 15.85% 정도의 하위, 상위를 나타내므로 취약과 우수를 판단하는데에는 매우 큰 도움이 된다. 3개의 그룹대신 {(μ - 3σ) ~ (μ + 3σ)} 과 같이 6개의 구간으로 나눌 수도 있다.
normal_distribution.jpg 표준정규분포

참고로 '6시그마'의 시그마는 위의 그림과 같은 뜻을 내포하고 있다. 6시그마는 (μ - 6σ) ~ (μ + 6σ)의 구간을 뜻을 나타낸다.

9 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%

10 기타 #

11 R을 이용한 히스토그램 #

x <- rnorm(100)
xnm <- "정규분포"
hist(x, labels=TRUE, main = paste("Histogram of" , xnm), xlab = xnm)
hist01.jpg

x <- rnorm(1000)
hist(x, probability=T)
lines(density(x))
hist02.jpg

12 그룹별로 #

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)
hist04.png

13 2D 히스토그램 #

install.packages('squash')
library('squash')
attach(quakes)
hist2(depth, long)
hist03.png
----
   [1]  몇 개로 쪼갤 것인가
   [2]  시그마
   [3] 

댓글 남기기..
이름: : 오른쪽의 새로고침을 클릭해 주세요. 새로고침
EditText : Print : Mobile : FindPage : DeletePage : LikePages : Powered by MoniWiki : Last modified 2018-04-13 23:12:53

노력은 계획으로부터 성취되고 오만으로부터 무너진다. (관자)