Muszę przeanalizować niektóre dane o Interneciesesje dla linii DSL. Chciałem zobaczyć, jak rozkładają się czasy trwania sesji. Uznałem, że prostym sposobem na zrobienie tego byłoby rozpoczęcie od wykresu gęstości prawdopodobieństwa czasu trwania wszystkich sesji.
Załadowałem dane do R i użyłem density()
funkcjonować. To było coś takiego
plot(density(data$duration), type = "l", col = "blue", main = "Density Plot of Duration",
xlab = "duration(h)", ylab = "probability density")
Jestem nowy w R i tego rodzaju analizach. To właśnie znalazłem, przeglądając google. Mam fabułę, ale pozostały mi pytania. Czy to właściwa funkcja do robienia tego, co próbuję zrobić, czy jest coś jeszcze?
Na wykresie stwierdziłem, że skala osi Y wynosiła od 0 ... 1,5. Nie rozumiem, jak może być 1,5, czy nie powinno być od 0 ... 1?
Chciałbym również uzyskać gładszą krzywą. Ponieważ zestaw danych jest naprawdę duży, linie są naprawdę postrzępione. Przyjemniej byłoby je wygładzić, kiedy to prezentuję. Jak miałbym to zrobić?
Odpowiedzi:
10 dla odpowiedzi № 1Jak powiedział Nico, powinieneś sprawdzić hist
, ale możesz także połączyć oba z nich. Wtedy możesz nazwać gęstość za pomocą lines
zamiast. Przykład:
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)
Powinien dać ci coś takiego:
Zauważ, że oszacowanie gęstości jądra domyślnie zakłada jądro Gaussa. Ale przepustowość jest często najważniejszym czynnikiem. Jeśli zadzwonisz density
bezpośrednio zgłasza domyślną szacowaną przepustowość:
> 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
Tutaj jest 0,7752. Sprawdź, czy nie ma danych, i baw się nimi, jak sugeruje Nico. Możesz na to spojrzeć ?bw.nrd
.
2 dla odpowiedzi nr 2
Powinieneś grać z bandwith (bw
), aby zmienić gładkość krzywej. Zasadniczo R wykonuje dobrą robotę i automatycznie daje ładną i płynną krzywą, ale może nie jest tak w przypadku konkretnego zestawu danych.
Jeśli chodzi o połączenie, którego używasz, tak, jest poprawne, type="l"
nie jest konieczne, jest to domyślne ustawienie używane do kreślenia obiektów gęstości. Obszar pod krzywą (tj. całka od -Inf do + Inf funkcji gęstości) będzie wynosił = 1.
Czy krzywa gęstości jest najlepszym rozwiązaniem w twoim przypadku? Może, a może nie ... to naprawdę zależy od tego, jaki rodzaj analizy chcesz wykonać. Prawdopodobnie za pomocą hist
będą wystarczające, a może nawet bardziej pouczające, ponieważ możesz wybrać określone przedziały czasu trwania (patrz ?hist
po więcej informacji).
1 dla odpowiedzi nr 3
Chciałem dodać to jako komentarz dopoprzednia odpowiedź, ale jest za duża. Widoczne pochylenie wynika ze sposobu, w jaki wartości są dzielone na histogram. Często błędem jest stosowanie histogramów do dyskretnych danych. Zobacz poniżej ...
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())