[실무 프로젝트로 배우는...] 데이터 분석을 위한 확률분포
> #### 3.2 데이터 분석을 위한 확률분포
>
> #### 3.2.1 이산형 확률분포
>
> # 이항분포
>
> Audi_NonHybrid = Audi %>%
+ filter(fuelType != "Hybrid")
> ggplot(Audi_NonHybrid) +
+ geom_bar(aes(x = fuelType, y = (..count..)/sum(..count..),
+ fill = fuelType)) +
+ theme_bw() +
+ ylab("Perc")
>
> P_Petrol = sum(Audi$fuelType == "Petrol")/nrow(Audi_NonHybrid)
> P_Diesel = 1 - P_Petrol
> P_Diesel
[1] 0.5241541
>
> # 다항분포
>
> ggplot(Audi) +
+ geom_bar(aes(x = fuelType, y = (..count..)/sum(..count..),
+ fill = fuelType)) +
+ theme_bw() +
+ ylab("Perc")
>
> Probs = summary(as.factor(Audi$fuelType))/nrow(Audi)
> Probs
Diesel Hybrid Petrol
0.522778403 0.002624672 0.474596925
>
> # 확률질량함수 예시
>
> n_F = factorial(10)
> x_F = factorial(5) * factorial(1) * factorial(4)
> Prob = (n_F / x_F) * Probs['Diesel']^5 * Probs['Hybrid']^1 * Probs['Petrol']^4
> Prob
Diesel
0.00655139
>
> dmultinom(c(5,1,4),
+ prob = c(Probs['Diesel'],Probs['Hybrid'],Probs['Petrol']))
[1] 0.00655139
>
>
> #### 3.2.3 연속형 확률분포
>
> # 정규분포
>
> k1 = c()
> p1 = c()
>
> # mean = 0, sd = 3
> for(k in seq(-15,15,by = 0.01)){
+ p = dnorm(x = k,mean = 0,sd = 3)
+ k1 = c(k1,k)
+ p1 = c(p1,p)
+ }
>
> k2 = c()
> p2 = c()
>
> # mean = 0, sd = 5
> for(k in seq(-15,15,by = 0.01)){
+ p = dnorm(x = k,mean = 0,sd = 5)
+ k2 = c(k2,k)
+ p2 = c(p2,p)
+ }
>
> DF = data.frame(
+ k = k1,
+ p1 = p1,
+ p2 = p2
+ )
>
> DF %>%
+ melt(id.vars = c("k")) %>%
+ ggplot() +
+ geom_line(aes(x = k, y = value, col = as.factor(variable))) +
+ geom_vline(xintercept = 0,linetype = 'dashed') +
+ theme_bw() +
+ theme(legend.position = 'none') +
+ xlab("") + ylab("") +
+ scale_y_continuous(expand = c(0,0))
>
> # 표준정규분포
> mean(Audi$price)
[1] 22896.69
> mean(scale(Audi$price))
[1] 1.482181e-16
> # 평균이 0으로 맞추어짐.
>
> # 카이제곱분포
>
> Z1 = rnorm(n = 500,mean = 0,sd = 1)
> Z1_2 = Z1^2
>
> ggplot(NULL) +
+ geom_density(aes(x = Z1_2, y= ..density..)) +
+ xlab("") + ylab("") +
+ theme_bw()
>
> df_V = c()
> Z2_V = c()
>
> for(df in c(1,3,5,10)){
+ Z_ADD = 0
+
+ for(iteration in 1:df){
+ Z = rnorm(n = 500,mean = 0, sd = 1)
+ Z2 = Z^2
+ Z_ADD = Z_ADD + Z2
+ }
+
+ Z2_V = c(Z2_V,Z_ADD)
+ df_V = c(df_V,rep(df,500))
+ }
>
> Chisq_DF = data.frame(
+ df = df_V,
+ Z2 = Z2_V
+ )
>
> ggplot(Chisq_DF) +
+ geom_density(aes(x = Z2, y = ..density.., fill = as.factor(df)),
+ alpha = 0.4) +
+ xlab("") + ylab("") +
+ theme_bw() +
+ theme(legend.position = "bottom") +
+ labs(fill = "df")
> # 카이제곱 분포는 자유도가 증가할수록 정규분포와 유사한 형태를 띤다.
>
> # F 분포
> # F 분포는 두 카이제곱 분포의 비로 정의된다.
>
> F_Value_13 = (Chisq_DF$Z2[Chisq_DF$df == 1]/1) / (Chisq_DF$Z2[Chisq_DF$df == 3] /3)
> F_Value_101 = (Chisq_DF$Z2[Chisq_DF$df == 10]/10) / (Chisq_DF$Z2[Chisq_DF$df == 1] /1)
> # F(1,3) 분포와 F(10,1) 분포
>
> F_DF = data.frame(
+ df = c(rep("1.3",length(F_Value_13)),
+ rep("10.1",length(F_Value_101))),
+ F_Value = c(F_Value_13,F_Value_101)
+ )
>
> ggplot(F_DF) +
+ geom_density(aes(x = F_Value, y = ..density.., fill = df),
+ alpha = 0.4) +
+ xlim(0,20) +
+ theme_bw() +
+ xlab("") + ylab("") +
+ theme(legend.position = "bottom")
경고메시지(들):
Removed 115 rows containing non-finite values (stat_density).
> # F 분포의 형태는 카이제곱 분포와 매우 비슷하다.
>
> # student's t 분포
> # t 분포는 모분산은 모르는 상황에서 평균 검정을 위해 고안된 분포, 모분산 대신 표본분산 활용
> # 표준정규분포 Z에 대해 자유도가 n-1인 카이제곱 분포 V와 그 자유도 v로 나눈 분포를 t 분포로 정의
>
> kv = c()
> z = c()
> t = c()
>
> for(k in seq(-6,6,by = 0.01)){
+ n_dist = dnorm(x = k,mean = 0,sd = 1)
+ t_dist = dt(x=k, df = 3)
+ kv = c(kv,k)
+ z = c(z,n_dist)
+ t = c(t,t_dist)
+ }
>
> DF = data.frame(
+ k = kv,
+ Z = z,
+ t = t
+ )
>
> DF %>%
+ melt(id.vars = c("k")) %>%
+ ggplot() +
+ geom_line(aes(x = k, y = value, col = as.factor(variable))) +
+ geom_vline(xintercept = 0,linetype = 'dashed') +
+ theme_bw() +
+ theme(legend.position = "bottom") +
+ labs(col = "Distribution") +
+ xlab("") + ylab("")
> # t 분포는 정규분포에 비해 데이터가 중심으로 덜 모여 있기 때문에 양쪽 꼬리가 정규분포보다 더 두껍다.
>
> Z_Value = qnorm(p = 0.025,mean = 0, sd = 1)
> T_Value = qt(p = 0.025,df = 3)
> # 각각 정규분포와 t 분포의 2.5%에 해당하는 분위수를 구한다.
>
> DF$Z_CV = ifelse(DF$k < Z_Value|DF$k > Z_Value * (-1),DF$Z,0)
> DF$T_CV = ifelse(DF$k < T_Value|DF$k > T_Value * (-1),DF$t,0)
>
> ggplot(DF) +
+ geom_line(aes(x = k, y = Z),col = "blue") +
+ geom_area(aes(x = k, y = Z_CV),fill = 'royalblue', alpha = 0.6) +
+ geom_line(aes(x = k, y = t),col = 'red') +
+ geom_area(aes(x = k, y = T_CV),fill = 'red', alpha = 0.6) +
+ theme_bw() + ylab("") + xlab("")
> # 각 분포의 0~2.5%와 97.5~100% 구간을 표시
> # 정규분포의 음영보다 t 분포의 음영이 중심으로부터의 거리가 먼 것을 확인할 수 있다.
출처 : 실무 프로젝트로 배우는 데이터 분석 with R