데이터분석/R

[실무 프로젝트로 배우는...] 데이터 분석을 위한 확률분포

버섯도리 2022. 1. 22. 09:25

> #### 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