연속형 확률분포 (Continuous probability distribution)에는

 

 - 정규분포 (normal distribution)

   : norm()

 

 - 균등분포 (uniform distribution)

   : unif()

 

 - 지수분포 (exponential distribution)

   : exp()

 

 - t-분포 (t-distribution)

   : t()

 

 - F-분포 (F-distribution)

   : f()

 

 - 카이제곱분포(chisq-distribution)

   : chisq()

 

등이 있습니다.  

 

 

이번 포스팅에서는 지수분포 (exponential distribution)에 대해서 소개하도록 하겠습니다.  지수분포 (exponential distribution)는 어떤 특정 사건이 발생하기 전까지 걸리는 시간을 나타내기 위해 많이 사용하는 확률분포 입니다. 

 

지수분포(exponential distribution)의 예로는 전자레인지의 수명시간, 콜센터에 전화가 걸려 올 때까지 걸리는 시간, 경부고속도로 안성나들목에서 다음번 교통사고가 발생할 때까지 걸리는 시간, 은행 지점에 고객이 내방하는데 걸리는 시간 등이 있겠습니다.

 

참고로, 이산형 확률분포 중에서 포아송 분포 (Poisson distribution)이 단위 시간 혹은 단위 공간에서 특정 사건이 발생하는 횟수에 대한 분포를 나타낼 때 주로 사용한다고 했는데요, 헷갈리지 않도록 주의를 해야겠습니다.

 

 

 

확률변수 X의 확률밀도함수가 위와 같을 때, 확률변수 X는 모수 λ인 지수분포를 따른다고 말합니다.

 

R에서 지수분포(exponential distribution)와 관련된 함수 및  파라미터는 다음과 같습니다.

 

 함수 구분

지수분포 함수/파라미터 

 exp()

 밀도 함수
 (Density function)

 d

  dexp(x, rate)

 누적분포 함수

 (Cumulative distribution function)

 p

  pexp(q, rate, lower.tail=TRUE/FALSE)

 분위수 함수

 (Quantile function)

 q

  qexp(p, rate, lower.tail=TRUE/FALSE)

 난수 생성

 (Random number generation)

 r

  rexp(n, rate)

 

 

(1) 지수분포 그래프 (Exponential distribution plot) : fun=dexp

 

 
> library(ggplot2)

> # (1) 지수분포 그래프 (Exponential distribution plot) : fun=dexp > ggplot(data.frame(x=c(0,10)), aes(x=x)) + + stat_function(fun=dexp, args=list(rate=1), colour="brown", size=1.5) + + ggtitle("Exponential Distribution") > + ggtitle("Exponential Distribution")

 

 

 

 

 

(2) 누적 지수분포 그래프 (Cumulative exponential distribution plot) : fun = pexp

 

 

> # (2) (Cumulative exponential distribution plot) : fun=pexp > ggplot(data.frame(x=c(0,10)), aes(x=x)) + + stat_function(fun=pexp, args=list(rate=1), colour="brown", size=1.5) + + ggtitle("Cumulative Exponential Distribution")

 

 

 

 

(3) 누적 지수분포 확률 값 계산 : pexp(q, rate, lower.tail=TRUE/FALSE)

 

 

 
> pexp(q=2, rate=1, lower.tail = TRUE)
[1] 0.8646647
 

 

λ (rate) = 1 인 지수분포에서 0~1까지의 누적 확률 값은 0.8646647 임을 알 수 있습니다.  

 

 

(4) 지수분포 분위수 함수 값 계산 : qexp(p, rate, lower.tail=TRUE/FALSE)

 

 

> qexp(p=0.8646647, rate=1, lower.tail = TRUE)
[1] 2
 

 

 

qexp()는 pexp()와 역의 관계에 있다고 보면 되겠습니다.

 

 

(5) 지수분포 난수 발생 (exponential distribution random number generation) : rexp(n, rate)

 

 

> rexp(100, rate=1)
  [1] 0.805385854 1.077017598 0.941678341 2.059229603 0.517943248 0.955476408 0.575837716
  [8] 0.851462637 0.086982322 1.243358626 1.077268675 2.604957888 0.007571515 1.793674221
 [15] 0.118729103 0.096055712 0.015758928 0.201158101 0.914114063 0.130984491 2.752139235
 [22] 0.829986667 0.651976457 1.265562156 2.635988993 1.190808342 0.444055191 1.480476206
 [29] 1.741018226 2.692880185 0.804053361 3.127147071 0.902618388 1.432761851 0.369694262
 [36] 0.290926187 0.576759913 0.827636680 1.634353038 2.113214617 0.570110160 0.609782309
 [43] 1.985241502 1.067016441 0.098556668 3.326005637 2.261946740 6.395236475 1.906314444
 [50] 0.503994692 1.578938061 0.144050682 0.361734510 1.495605791 1.167056286 1.397221429
 [57] 1.598533234 0.370363955 0.153343928 0.351399011 0.957647500 1.053767695 0.272256882
 [64] 1.176451771 0.222995248 1.125289913 0.076051627 3.489328747 0.199440748 3.143880822
 [71] 1.640546855 4.492400575 1.102261695 0.189814932 0.222941682 2.305212835 0.069710370
 [78] 1.972949872 0.201703040 1.783014953 1.297271054 2.173743544 2.350792197 2.018307233
 [85] 0.417343667 2.533255698 0.522270208 2.068958899 1.062778262 0.210765630 0.804149691
 [92] 1.261281259 0.006859250 0.620238345 3.478939042 2.692230696 0.557543887 1.830330845
 [99] 0.478452368 0.904496278
> hist(rexp(100, rate=1), breaks=10)
 

 

 

 

 

(6) dexp(x, rate, log=TRUE)

 

log=TRUE 옵션을 설정하면 지수분포의 확률밀도함수값에 밑이 e (약 2.17)인 자연로그 ln 을 취한 값을 계산합니다. (참고 : 자연로그인 ln 의 역함수는 지수함수인 exp() )

 

아래에는 X가 모수 λ가  1인 지수분포를 따른다고 했을 때, X: 1, 2, .., 10 의 확률밀도함수값을 계산한 것입니다.  (지수분포는 연속형 확률분포이지만, log 취한거와 비교를 이해하기 쉽도록 1, 2, ..., 10 의 값을 가지고 계산했음)  'log=TRUE' 라는 옵션을 취한 값과, log(dexp) 라는 수식을 직접 입력해서 계산한 값이 서로 정확히 일치함을 알 수 있습니다.

 

> # dexp(x, rate, log=TRUE)
> dexp <- dexp(c(1:10), rate=1)
> dexp_log <- dexp(c(1:10), rate=1, log=TRUE)
> 
> exp_df <- data.frame(cbind(c(1:10), dexp, dexp_log))
> exp_df
   V1         dexp dexp_log
1   1 3.678794e-01       -1
2   2 1.353353e-01       -2
3   3 4.978707e-02       -3
4   4 1.831564e-02       -4
5   5 6.737947e-03       -5
6   6 2.478752e-03       -6
7   7 9.118820e-04       -7
8   8 3.354626e-04       -8
9   9 1.234098e-04       -9
10 10 4.539993e-05      -10
> 
> exp_df <- transform(exp_df, dexp_logarithm = log(dexp))
> exp_df
   V1         dexp dexp_log dexp_logarithm
1   1 3.678794e-01       -1             -1
2   2 1.353353e-01       -2             -2
3   3 4.978707e-02       -3             -3
4   4 1.831564e-02       -4             -4
5   5 6.737947e-03       -5             -5
6   6 2.478752e-03       -6             -6
7   7 9.118820e-04       -7             -7
8   8 3.354626e-04       -8             -8
9   9 1.234098e-04       -9             -9
10 10 4.539993e-05      -10            -10

 

 

 

 

디폴트인 dexp(x, log=FALSE) 와 dexp(x, log=TRUE) 옵션 설정해서 나온 값을 가지고 그래프로 그려서 비교해보면 아래와 같습니다.  log=TRUE 설정을 해서 자연로그를 취했더니 원래 밑으로 축 쳐졌던 지수분포 그래프가 곧은 직선으로 변환되었음을 알 수 있습니다.

 

> my_par = par(no.readonly = TRUE)
> par(oma = c(0, 0, 1, 0))
> par(mfrow = c(1, 2))
> 
> plot(dexp, main = "dexp : log = F")
> plot(dexp_log, main = "dexp : log = T")
> 
> mtext("density function of exponential distributin : log = FALSE vs. log = TRUE", 
outer = TRUE, cex = 1.2)

 

 

 

 많은 도움 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요.

 

Posted by R Friend R_Friend

연속형 확률분포 (Continuous probability distribution)에는

 

 - 정규분포 (normal distribution)

   : norm()

 

 - 균등분포 (uniform distribution)

   : unif()

 

  - 지수분포 (exponential distribution)

   : exp()

 

 - t-분포 (t-distribution)

   : t()

 

 - F-분포 (F-distribution)

   : f()

 

  - 카이제곱분포(chisq-distribution)

   : chisq()

 

등이 있습니다.  

 

 

이번 포스팅에서는 균등분포(uniform distribution)에 대해서 알아보겠습니다.  균등분포(uniform distribution)은 연속형 확률 분포 중에서 가장 간단한 형태로서, 구간 [mi=a, max=b]에서 값이 균등하게 퍼져 있는 집단, 일어날 확률이 균등한 분포를 말합니다. 

 

가령, 김포공항에서 제주도 공항까지 비행기로 이륙에서 착륙까지 걸리는 총 비행시간이 1시간~1시간5분 사이라고 하면, 0시~59분59초까지는 비행기가 도착할 확률이 0, 1시간~1시간5분 사이에 도착할 확률은 1, 1시간 5분 이후는 다시 확률이 0이 되는 균등분포를 따른다고 할 수 있겠습니다.

 

 

 

 

 

 

 

R에서 사용하는 균등분포 함수(uniform distribution function) 및 파라미터(parameter)들은 아래와 같으며, 필요한 함수, 파라미터를 가져다 사용하면 되겠습니다.

 

 

 함수 구분

 균등분포 함수/파라미더

 unif()

  밀도함수

  (density function)

 d

  dunif(x, min, max)

  누적분포함수

 (cumulative distribution function)

 p

  punif(q, min, max, lower.tail=TRUE/FALSE)

  분위수 함수

 (quantile function)

 q

  qunif(p, min, max, lower.tail=TRUE/FALSE)

  난수 발생

 (random number generation)

 r

  runif(n, min, max)

 

 

 

 

(1) 균등분포 그래프(uniform distribution plot) : fun = dunif

 

ggplot2의 fun= dunif() 함수를 사용해서 균등분포를 그래프로 그려보면 아래와 같이 특정 구간 [a, b]에서 확률이 균등함을 알 수 있습니다.

 

 

> library(ggplot2)

> # uniform distribution plot (min=0, max=10) > # 균등분포 : fun = dunif > ggplot(data.frame(x=c(-2,20)), aes(x=x)) + + stat_function(fun=dunif, args=list(min = 0, max = 10), colour="black", size=1) + + ggtitle("Uniform Distribution of (min=1, max=10)")

 

 

 

 

 

 

 

(2) 누적 균등분포 그래프(cumulative uniform distribution plot) : fun = punif

누적 균등분포 그래프를 그려보면 아래와 같습니다.

 

 

> # (2) 누적균등분포 함수 그래프 (Cumulative Uniform distribution plot) : fun = punif > ggplot(data.frame(x=c(-2,20)), aes(x=x)) + + stat_function(fun=punif, args=list(min = 0, max = 10), colour="black", size=1) + + ggtitle("Cumulative Uniform Distribution of (min=0, max=10)")

 

 

 

 

 

 

(3) 누적 균등분포 함수의 확률 값 계산 : punif()

 

 

> # (3) 누적 균등분포함수(cumulative uniform distribution function) 확률 값 계산 : punif() > # : punif(q, min, max, lower.tail = TRUE/FALSE) > punif(3, min=0, max=10, lower.tail=TRUE) [1] 0.3 > >

> # Uniform Distribution of (min=1, max=10), x from 0 to 3"

> ggplot(data.frame(x=c(-2,20)), aes(x=x)) + + stat_function(fun=dunif, args=list(min = 0, max = 10), colour="black", size=1) + + annotate("rect", xmin=0, xmax=3, ymin=0, ymax=0.1, alpha=0.2, fill="yellow") + + ggtitle("Uniform Distribution of (min=1, max=10), x from 0 to 3")

 

 

 

 

 

(4) 균등분포 분위수 함수 값 계산 : qunif(p, min, max, lower.tail=TRUE/FALSE)

 

이전 포스팅의 정규분포와는 함수는 qunif()로 동일하지만 괄호 안의 parameter 들은 다릅니다.

(참고: 정규분포에서는 qunif(p, mean, sd, lower.tail=T/F)

 

 
> # (4) 분위수 함수 : qunif(p, min, max, lower.tail=TRUE/FALSE)
> qunif(0.3, min=0, max=10, lower.tail = TRUE)
[1] 3

 

 

 

 

(5) 난수 발생 : runif(n, min, max)

 

난수는 매번 실행할 때마다 바뀌므로 제가 아래에 제시한 것과는 다른 숫자, 다른 그래프가 그려질 것입니다만, 형태는 균등분포를 띠는 유사한 모양이 될 것입니다.

 

 

> ru_100 <- runif(n=100, min=0, max = 10)
> ru_100

 

 [1] 7.33957568 2.78596723 6.30797744 5.01438337 6.57949706 5.90883342 3.51446293 9.28736811
  [9] 9.55213668 5.59377524 4.71003185 3.29525512 0.25759555 9.40326151 6.56466466 2.44973803
 [17] 4.88714900 3.10710648 3.84375758 8.55017741 3.09487276 0.13411621 0.44285713 8.90632265
 [25] 0.07968823 5.03465390 4.64601169 1.23565062 4.81310463 1.59225023 7.03799510 0.68870704
 [33] 4.03014086 9.97756283 5.55815726 2.01819345 7.00497545 8.50399118 2.29608430 2.92359120
 [41] 0.85656712 6.52544881 6.37193951 6.15247601 5.29502105 7.68988134 6.37691223 0.37387705
 [49] 6.89023959 1.65049129 3.75195268 7.97220092 6.50160025 9.52491436 1.70569894 9.80475205
 [57] 0.24770673 8.47412000 4.66718922 2.52269224 2.81985175 8.79845402 6.03852213 8.10848875
 [65] 1.10510449 9.35548906 1.83535387 0.47889795 6.54578585 1.61742080 4.51840400 3.99912651
 [73] 4.82545376 4.04589108 0.71750065 7.56085867 1.22887762 2.97822070 5.14541682 3.59126885
 [81] 5.00911758 1.02152702 7.78324707 4.69437196 1.13090493 3.70933500 0.03173870 5.74159309
 [89] 2.68879279 3.36398725 9.34593590 6.18818473 9.43490689 5.82578697 4.49576854 2.90029081
 [97] 3.34726356 7.19013351 9.97276521 9.39421932

 

 

> # density plot of runif(n=100, min=0, max = 10) & adding line of 0.1 uniform probability

> hist(ru_100, freq=FALSE, breaks=10, col="yellow")

> abline(h=0.1, lty=3, lwd=3, col="red")

 

 

 

 

 

많은 도움 되었기를 바랍니다. 

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요. ^^

 

 

Posted by R Friend R_Friend

이번 포스팅에서는 지혜 (경험 + 지식)와 자신감의 관계 (Relationship between Wisdom (Knowledge + Experience) and Confidence) 에 대해 탁월한 통찰력이 녹아있는 Dunning-Kruger Effect 에 대해서 소개해 보겠습니다.

 

아래에 소개하는 주요 내용은 WIKIPEDIA 의 내용을 많이 참고/번역하였으며, 개인적인 경험과 소견을 좀더 붙여 보았습니다.

 

코넬 대학교의 교수였던 David Dunning과 Juskin Kruger 는 1999년에 Journal of Personality and Social Psychology에 『Kruger, Justin; Dunning, David (1999). "Unskilled and Unaware of It: How Difficulties in Recognizing One's Own Incompetence Lead to Inflated Self-Assessments". 』라는 논문을 발표합니다. 

 

핵심 내용만 짧게 소개하자면, "상대적으로 지식과 경험이 부족한 사람은 자신의 역량을 실제보다 훨씬 높다고 평가하는 인지 오류 경향이 있으며, 반대로 지식과 경험이 많은 사람일 수록 자신에게 쉬운 일이 타인에게도 쉬울 것이라고 잘못 평가하는 인지오류에 빠져서 자신의 역량을 과소평가하는 경향이 있다"는 것입니다.

 

결국 자신의 역량을 제대로, 있는 그대로 평가할 수 있는 사람은 없다는 얘기가 되겠습니다. 

 

 

아래의 Dunning-Kruger Effect 그래프를 한번 보시지요.  Know-nothing에서 살짝 오른쪽으로 간 Know-a-little 단계에서 Confidence level이 Peak of "Mt. Stupid" 로 최고 수준을 보인다는 점, 그러다가 조금씩 지식과 경험이 쌓여갈 수록 자신의 역량 수준이 사실은 과대평가된 것이었음을 깨닫고 겸손해진다는점, 자신감의 수준이 지식과 경험이 쌓인다고 선형적으로 급상승하는 것이 아니라 완만한 언덕 형태를 띠면서 오랜 시간을 두고 조금씩 증가한다는 점을 알 수가 있습니다.

 

 

 

 

 

 

제가 분석 업무를 하는데 있어서도 위의 Dunning-Kruger Effect 가 잘 들어맞는 것 같다는 생각을 해보았습니다.  통계책 한권 띠면 분석 문제는 그게 무엇이든지 다 풀 수 있을 것 같은 자신감이 분기탱천하였던 저의 초짜 때의 모습이 떠오릅니다. 

 

그러다가 다변량통계분석으로 넘어가다보니 선형대수, 미적분을 모르고서는 제대로 이해할 수 없다는 것을 알고 공부할 거리가 차고도 넘친다는 것, 저의 수준이 정말 왕초짜라는 것을 알고 '이 길이 내가 가야할 길이 맞나?'라고 겁도 먹었던 시기도 있었습니다.  이론만 가지고는 성과, 결과를 낼 수 없고 R이든 SAS든 SQL이든 HIVE 든 분석 툴도 자유자재로 능수능란하게 사용할 수 있어야 한다는 것을 알고 한번 더 한숨을 내쉬며 이걸 언제 다 배우냐며 부담을 확 느끼기도 했구요.  이랬던 단계가 "Valley of Despair" 에 해당될 거 같아요.

 

퇴근 후 밤마다 12시, 1시까지 공부하고, 주말마다 도서관 가서 책보고 공부하고, R로 데이터 분석 연습도 해보면서 그동안 소련말처럼 보였던 통계, 수학 공식들이 하나, 둘씩 눈에 들어오기 시작하고 이해되기 시작했을 때의 짜릿한 지적 희열, 분석 역량 두뇌 근육이 조금씩 강해지고 있다고 느끼면서 조금씩 오르는 자신감, 더 공부해보고 싶고 더 분석해보고 싶은 욕심과 욕구... 이런 단계가 "Slope of Enlightment" 이지 않을까 싶습니다.

 

Biz. 문제를 접하면 이건 어떤 문제에 속하고, 무슨 분석 기법을 사용해서 이런 저런 데이터를 같이 활용해 어떻게 approach하면 될것 이라는 것을 통찰력을 가지고 제시할 수 있는 단계, 그래서 데이터 기반의 Biz. 문제 해결 및 솔루션까지 제시해줌으로써 성과를 이끌어 낼 수 있는 단계가 "Plateau of Sustainability"가 아닐까 싶은데요, 저도 계속 공부하고 노력하면 어느날은 이 단계에 다다를 날이 오리라 믿고 오늘도 공부하렵니다.  겸손한 맘과 지적 호기심을 채울 때의 기쁜 맘을 같이 가지고서요.

 

 

 

EBS 다큐 중에서 "학교란 무엇인가?" 방송 내용 중 "최상위 0.1%의 공부잘하는 학생들은 무엇이 다른가?"라는 부분에서 실험을 통해 밝히기를, "최상위권 아이들은 자신이 무엇을 알고, 무엇을 모르는지 정확히 파악하고 있었다" 라고 말하고 있습니다.  Dunning-Kruger Effect 의 인지 오류 함정에 빠지지 않는 학생이 최상위 0.1%의 학생이 될 수 있다는 것입니다. 

 

 

● 0.1% 학생들은 뭐가 다르던가.

 “IQ가 평균 134로 일반 학생(125)보다 약간 높긴 했다. 하지만 이 정도 IQ 차이로는 도저히 설명이 불가능했다. 실제로 IQ 상위 0.1% 영재들의 학교 성적은 상위 0.1%에 크게 못 미치는 경우가 대부분이다. 하루 일과도 0.1% 아이들이나 보통 학생들이나 크게 다르지 않았다. 기억력이 딱히 더 좋다고 하기도 어려웠다. ‘0.1%의 비밀’은 이들이 자신이 뭘 알고, 뭘 모르는지 정확히 파악하고 있었다는 점이다. 자신의 생각에 대해 비판적 사고를 하고, 스스로를 객관적으로 바라볼 줄 아는 능력을 ‘메타 인지’라고 한다. 최상위권 아이들은 메타 인지 능력이 아주 뛰어났다.”

 

 

● 메타 인지는 어떻게 길러지나.

 “서울대에 들어간 학생들의 공부법을 보면 스스로 공부하는 시간이 많았다. 0.1% 학생들은 혼자 차분히 복습하는 시간이 월등히 길었다.”

 

 

● 다른 특징은 없었나.

 “학습법뿐 아니라 부모와의 관계에도 차이가 있었다. 0.1% 아이들 중에는 부모와 대화하면 ‘편안함을 느낀다’ ‘즐겁고 유쾌하다’는 등의 긍정적 반응을 보인 비율이 74%나 됐다. 또 하나 차이는 아침식사를 하는 비율이 92%로 압도적이었다는 점이다. 아침을 먹어서 두뇌 활동이 활발해졌기 때문만은 아닐 것이다. 이보다는 아침 식탁에서 가족과 대화하면서 얻게 되는 것이 훨씬 많아 보였다.”

 

 

* 출처 : EBS, 학교란 무엇인가?  PD 인터뷰 中에서 (최낙언의 자료보관소)

 

 

서울대 들어간 학생들 중 차분히 스스로 공부하고 복습하는 시간을 가진 경우가 많았다고 하는데요, 부산한 가운데서도 혼자만의 시간을 내서 복습, 복기, 자기성찰을 해보는 시간을 꾸준이 가져야겠다는 생각을 해봅니다. 

 

 

그리스의 선인들이 했다던 말 "너 자신을 알라 (γνῶθι σεαυτόν 그노티 세아우톤, Know Yourself)"가 얼마나 어려운지, 얼마나 중요한지를 새삼 깨닫게 됩니다.

Posted by R Friend R_Friend