2010-11-18 3 views
9

DSL 회선의 인터넷 세션에 대한 데이터를 분석해야합니다. 세션 기간이 어떻게 분포되어 있는지 살펴보고 싶었습니다. 나는 이것을하기위한 간단한 방법이 모든 세션의 지속 시간에 대한 확률 밀도 도표를 작성하는 것으로 시작한다고 생각했습니다.데이터의 확률 얻기

데이터를 R에로드하고 density() 함수를 사용했습니다. 그래서 이런 식이었습니다

plot(density(data$duration), type = "l", col = "blue", main = "Density Plot of Duration", 
    xlab = "duration(h)", ylab = "probability density") 

저는 R에 익숙하지 않으며 이런 종류의 분석입니다. 이것은 내가 구글을 통해 겪은 것으로 나타났습니다. 음모가 있지만 몇 가지 질문이 남아 있습니다. 이 일은 내가하려는 일을하는 데 적합한 기능입니까 아니면 다른 일이 있습니까?

플롯에서 나는 Y 축 스케일이 0 ... 1.5 인 것을 발견했습니다. 나는 그것이 1.5 일 수있는 방법을 얻지 못한다. 그것은 0 ... 1 일 것이 틀림 없어?

또한 부드러운 곡선을 만들고 싶습니다. 데이터 세트가 실제로 커지기 때문에 라인이 정말로 들쭉날쭉합니다. 나가 이것을 선물 할 때 그들을 부드럽게하는 것은 좋을. 그 일을 어떻게 하죠?

+5

밀도가 잘못 입력됩니다. X의 밀도는 ** 가까운 거리에있는 숫자를 모집단에서 끌어낼 확률 **에 비례하는 값 **으로 볼 수 있습니다. 정의에 따르면 밀도 함수의 적분은 1입니다.이것은 밀도 함수의 최대 값이 1이어야 함을 의미하지 않으며 쉽게 커질 수 있습니다. 사실, df = (1,1) 인 F 분포의 경우 밀도의 최대 값 (0에서)은 무한대입니다. –

+0

@Joris 예. 나는 그것을 올바르게 해석하지 못했다는 것을 알았습니다. 오히려 단순하게 나는 확률 분포 때문에 1보다 작을 것이라고 가정했다. – sfactor

답변

2

커브의 부드러움을 변경하려면 대역폭이 (bw) 매개 변수로 재생해야합니다. 일반적으로 R은 좋은 일을하고 좋고 매끄러운 곡선을 자동으로 제공하지만 특정 데이터 세트의 경우는 그렇지 않을 수도 있습니다.

당신이 사용하고있는 전화는 맞습니다. type="l"은 필요하지 않습니다. 이것은 밀도 개체를 플로팅하는 데 사용되는 기본값입니다. 곡선 아래의 영역 (즉, 밀도 함수의 -Inf에서 + Inf 로의 적분)은 1이됩니다.

이제 밀도 곡선이 가장 적합합니까? 어쩌면, 아마도 ... 그것은 정말로 당신이하고 싶은 분석의 유형에 달려 있습니다. 아마도 hist을 사용하면 충분하며 특정 기간을 선택할 수 있으므로 더 많은 정보를 얻을 수 있습니다 (자세한 내용은 ?hist 참조).

+0

고마워. 나는 모양을 가질 것이다. 그러나 왜 여전히 밀도 축이 1보다 커야하는지 알지 못한다. – sfactor

+0

내가 말했듯이, 그것은 곡선 아래의 영역이다 (즉, 합계 (dx * y)) = 1이다. y 축의 실제 값은 대역폭에 따라 다릅니다. 대역폭 값이 작을수록 y 값이 높아집니다. 그 차이를보기 위해'밀도 (rnorm (1000), 0.2)'와'density (rnorm (1000), 2) '를 그려보십시오. – nico

+0

hist가 밀도에 비례하여 오른쪽으로 비뚤어져 보입니다. 그것은 poisson distrbuted 변수가있는 일반 커널을 가정하기 때문입니까? –

10

nico가 말한 것처럼 hist을 확인해야하지만 그 중 두 개를 결합 할 수도 있습니다. 그러면 lines으로 밀도를 대신 호출 할 수 있습니다. 예 : 커널 밀도 추정는 기본적으로 가우시안 커널을 가정합니다 Histogram of duration

참고 :

duration <- rpois(500, 10) # For duration data I assume Poisson distributed 
hist(duration, 
    probability = TRUE, # In stead of frequency 
    breaks = "FD",  # For more breaks than the default 
    col = "darkslategray4", border = "seashell3") 
lines(density(duration - 0.5), # Add the kernel density estimate (-.5 fix for the bins) 
    col = "firebrick2", lwd = 3) 

당신에게 뭔가를 제공해야합니다. 그러나 대역폭은 종종 가장 중요한 요소입니다. 이 0.7752이다 여기

> density(duration) 

Call: 
     density.default(x = duration) 

Data: duration (500 obs.);  Bandwidth 'bw' = 0.7752 

     x     y    
Min. : 0.6745 Min. :1.160e-05 
1st Qu.: 7.0872 1st Qu.:1.038e-03 
Median :13.5000 Median :1.932e-02 
Mean :13.5000 Mean :3.895e-02 
3rd Qu.:19.9128 3rd Qu.:7.521e-02 
Max. :26.3255 Max. :1.164e-01 

: 당신이 density를 호출하는 경우 직접은 기본 예상 대역폭을보고합니다. 니코가 제안한대로 데이터를 확인하고 놀아 라. ?bw.nrd을보고 싶을 수도 있습니다.

+0

아주 좋은 ~~~~~~~~~~~~~~~~~~ –

1

이전 답변에 댓글로 추가하려고했으나 너무 큽니다. 겉보기 비뚤어 짐은 값이 히스토그램에서 비닝되는 방식 때문입니다. 이산 데이터에 히스토그램을 사용하는 것은 종종 실수입니다. 아래를 참조하십시오 ...

set.seed(1001) 
tmpf <- function() { 
    duration <- rpois(500, 10) # For duration data I assume Poisson distributed 
    hist(duration, 
     probability = TRUE, # In stead of frequency 
     breaks = "FD",  # For more breaks than the default 
     col = "darkslategray4", border = "seashell3", 
     main="",ann=FALSE,axes=FALSE,xlim=c(0,25),ylim=c(0,0.15)) 
    box() 
    lines(density(duration), # Add the kernel density estimate 
     col = "firebrick2", lwd = 3) 
    par(new=TRUE) 
    plot(table(factor(duration,levels=0:25))/length(duration), 
     xlim=c(0,25),ylim=c(0,0.15),col=4,ann=FALSE,axes=FALSE) 
} 

par(mfrow=c(3,3),mar=rep(0,4)) 
replicate(9,tmpf()) 
+0

예, 바로 즉, 쓰레기통은 항상 (오른쪽 = FALSE 대 우측 = TRUE) 정수의 양쪽으로 될 것입니다. 나는 주로 데이터의 사전 시각화를 위해 이것을 사용합니다. 거의 피해가 없습니다. 하지만 간단히 -0.5로 고정시킬 수 있습니다. – eyjo

+0

@eyjo : 정수 나누기를 사용하고 있다고 가정하고 있지만 그 제한을받지는 않습니다 – nico