안녕하세요 DA 라이언입니다. 

지난번에는 데이터를 분석할때 검정방법 중 데이터가 29개 이하일 경우 정규성을 파악하는데 필요한 검증방법에 대해서 알아봤습니다. 

오늘은 지난시간에 이어서 다른 검정방법들을 확인해보도록 하겠습니다. 

우선 첫번째글을 보시지 않은 분들은 첫번째 글을 클릭해서 보시고 두번째 글로 보시기 바랍니다. 

003 데이터분석 시작전 검정 방법 선택 전략 (첫번째)
->http://daryan.tistory.com/79

지난시간에 본 검정전략의 흐름도 입니다. 


데이터를 확인할때 30개 미만일 경우에는  Sapiro-wilks test 로 정규성을 확인한다고 하였습니다. 
그러나 단순히 그래프의 산포도를 보면서 정규성을 확인 하는 방법또한 있고 그것는 Q-Q plot입니다.

지난번 코드에서 Q-Q plot을 그려보겠습니다. 



>dataA<-sample(1:100, 29, replace=TRUE)
>qqnorm(dataA)  #QQplot을 그리는 명령어
>qqline(dataA) #QQplot의 기준선을 그리는 명령어


>dataNorm <- rnorm(29,0,1)
>qqnorm(dataNorm) #QQplot을 그리는 명령어
>qline(dataNorm)   #QQplot의 기준선을 그리는 명령어



첫번째 그림과 두번째 그림을 보면 기준선에 대비해서 두번째 그림이 더 가까운것을 확인할수 있고, 이것을 기준으로 정상성을 가늠할수는 있으나 
정확한 판단은 Shapiro-Wilk normality test 를 하는 것이 좋다고 할수 있습니다. 

다만 그래프로 판단할수 있는 것은 첫번째 그림처럼 정상성을 벗어나는 데이터 포인트들이 몇개고 그것을 제거 하였을때 정상성이 더 좋아지겠다는 
판단을 할수 있으므로 그래프 그리는 것을 의미 없다고 생각하시면 안됩니다. 

그렇다면 정상성을 판별한 이후 우리는 데이터의 짝을 이루는지를 확인해볼 필요가 있습니다.

여기서 데이터의 짝이란, Before 와 After의 변화를 확인하는 데이터를 의미합니다.
단순히 남과여 평균 키 데이터는 데이터 짝을 이룬다고 표현하지 않습니다.
즉 동일한 집단에 대해서 어떤 처리를 하기전과 후에 반복하여 관측한 값이 차이있는지를 확인하는 경우에 사용합니다. 
예를 들면 지지율의 변화, 도는 약의 복용 전과 후의 결과, 광고 전과 후의 결과 등등 동일한 집단에서 쌍으로 발생하는 데이터를 의미합니다.


일단 데이터가 보통은 짝을 이루지 않고 , 독립표본 즉 예를 들면, 남학생 키 분포, 여학생 키분포와 같이  나누어져 있습니다. 
그래서 위의 도식과 같이 등분산 가정이 되는지 안되는지를 체크해 보아야 합니다. 

등분산 가정은 F- 검정을 통해서 확인할수 있습니다. 

F-검정이란 집단간의 분산차이가 있는가 없는가를 확인하는 것이고, 차이가 없는 것이 보통 귀무가설로 설정됩니다.
즉 예를 들면, 

아래는 남자 여자의 수능 점수의 차이에 대해서 확인해본 결과입니다.수능만점은 400점으로 가정합니다.

성별
표본의 수
평균점수
분산
비고
여자
40
305.25
S1

남자
40
290.07
S2


여기서 F-검정의 귀무가설을 확인하여야 하는데
귀무가설 H0는 S1=S2이다 라고 설정합니다.
대립가설 H1는 S1S2이다 라고 설정합니다.


이렇게 나왔을 경우 F-값을 구하게 되면 F= Max (남학생 점수분산,여학생 점수 분산)/Min(남학생 점수분산,여학생 점수 분산) 이 되며, 
이럴경우 자유도는 (39,39)가 된다. 자유도는 각 표본의 수에서 1을 빼주면 나온다. F 값이 가령 1.45가 나왔다고 하면, 
이것을 f-분포표에서 확인해볼 경우 p-value가 0.2545가 나오게 된다.


 방법
Num DF(자유도1)
Den DF(자유도2)
F value
Pr > F 
F-value
39
39
1.45
0.2545

따라서 이것으 결론은 F-검정의 유의확률은 0.2545 이라고 할수 있습니다. 이것을 그래프로 그려보면 아래와 같다.



이것은 p-value가 0.2545로 0.05보다 크므로 다른 표본을 쓰더라도 분산이 같을 확률이 0.05보다는 높다고 할수 있습니다.
따라서 H0는 성립한다고 표현하고 우리는 이 두집단은 등분산이라고 가정하고 계속 분석을 할수 있게 됩니다. 


지금껏 데이터 분석하기전에 검정 방법에 대해서 정리해봤습니다. 아래의 표를 기억하고 적용하면 좀더 쉬운 분석이 가능할 것이라 생각합니다.

참조 문헌

Enterprise guide 분석편 (자유아카데미, SAS 에반젤리스트 저) 참조

안녕하세요. 

DA ryan입니다. 데이터 과학의 관심을 가지기 시작하면서 여러가지 알고리즘을 배우고, 통계공부를 하며 머리 속에 많은 내용을 집어 넣었음에도 불구하고,

막상 데이터 앞에서는 내가 무엇을 해야하는지 , 내가 왜 이렇게 접근하는지 애매한 경우가 있습니다. 그래서 기본적으로 접근할수 있는 간단한 플로우 차트에 대해서 오늘은 

알아볼까합니다. 물론 이러한 접근이 100%모든 데이터를 분석할때 쓰이는 것은 아니지만, 가장 기본적으로 시작할때는 이러한 방법을 먼저 생각해보면,

이후 추가적인 알고리즘으로 분석할 때 비교 할수 있어서 편하게 진행을 할수 있습니다. 

설명을 먼저 하기 전에 아래의 사항에 대해서 전혀 모른다고 생각되시는 분들은 글을  읽기보다는, 아래 사항들을 검색하셔서 이런게 무엇이다 정도는 알고 계신 후에 읽어주시기 바랍니다.

<사전 지식 점검해야할 사항들>
  1. "T-검정" 에 대해서 알고 있는가?
  2. "F-검정"에 대해서 알고 있는가?
  3. "등분산"이란 알고 있는가?
  4. "귀무가설 "의 정의와 귀무가설을 알고 있는가?
  5. "정규성 혹은 정상성"을 알고 있는가?

위의 사항을 알고 계시면 이해하기 편하겠지만 위의 사항을 잘 모르시면 각각의 개념을 검색해보시고 정리해두신 다음에 읽어보시길 권장합니다. 

그럼 시작해보도록 해보겠습니다.

실제 보통의 데이터는 모분산을 우리가 모르는 상태에서 분석을 실시합니다. 
따라서 모분산(예를 들면, 대통령선거에서 국민들이 모두 투표를 하고 모든 투표결과를 분석해서 낸 실제 분산값)을 모르기때문에 아래와 같은 절차를
따져보고 진행해야 합니다.


[그림1] 검정방법 선택을 위한 기본 전략


위와같이 보통 데이터를 분석할 때 30개 기준으로 많고 적음에 따라서 분석방법을 달리 하여야 합니다.
왜 30개가 기준인지는 30개 이상일때 근사적으로  중심 극한정리(데이터들이 평균을 중심으로 많이 분포하게 된다는 통계적 이론)에
의해서 표준 정규분포의 형태로 나타난다는 것이 증명되었기 때문이라고 합니다.

실제 증명되었는지는 통계학 교수님이나 혹은 주변의 통계학 박사과정에 계신 분에게 말씀하시면 증명을 시도한 논문을 받아보며 눈물 흘릴수 있으시리라 생각됩니다.^^

일단 30개 미만인 경우에는 분석의 의미가 좀 퇴색될수 있습니다. 30개 이상의 데이터를 분석하는 것보다 ,
30개 미만의 데이터를 분석하는 것이 어찌보면 상세하다고 할수 없기 때문입니다. 
그렇다고 분석을 못하지는 않습니다. 부득이하게 분석을 한다면, 이정도는 되지 않는가 라는 정도의
분석정도 할수 있도록 우리 과거의 지혜로운 선배님들께서 이렇게 본인의 이름을 걸어놓으시고 방법을 개발하시고 
증명까지 해주셔서 후대의 우리가 아름답게 쓸 수 있게 되었습니다. 


그리하여 우선 데이터가 30개 미만 일때 부터 방법을 살펴보도록 하여야 합니다.
30개 미만일때는 데이터가 정규분포를 따르지 않을수도 있으므로 정규성(즉 정규분포를 따르는 성질)을 체크해보아야 합니다. 

많은 방법들이 있지만 대표적인 방법 중 3가지를 이렇게 소개하고자 합니다.

1)Kolmogorov-Smirnov test(콜모고로프 스미르노프 방법)
   -> 이방법은 주로 데이터가 2000개 이상 있을때 정규성을 확인할때 적합하다고 합니다. 그래서 일단 이런게 있구나 정도로만 알아놓으시기 바랍니다.

2)Sapiro-wilks test
  -> 이방법은 3개 이상 데이터에 주로 쓰이는 방법으로 자세히 살펴보도록 하겠습니다.

3)Q-Q plot
  -> 그래프의 산포도를 보면서 확인하는 방법으로 이또한 자세히 살펴보도록 하겠습니다.

일단 Sapiro-wilks test 부터 확인하도록 하겠습니다. 


>dataA<-sample(1:100, 29, replace=TRUE)
>hist(dataA, col = "green", las=1)
>shapiro.test(dataA)

======== 결   과 ========================
Shapiro-Wilk normality test

data:  dataA
W = 0.91912, p-value = 0.02897


위와 같이 1에서 100까지 재추첨할수 있게 데이터를 29개 뽑았습니다. 
이것을 히스토그램으로 확인했을 경우 딱봐도 정규성을 안띈다고 볼수 있습니다(그래프 모양이 종의 모양이 아니라는 이야기죠)

하지만 우리는 더 정확한 수치를 확인하기 위해서 Shapiro-wilk 정규성 테스트 결과를 위와 같이 확인하여 보았습니다.

p value가 0.02897이 나와서 0.05보다 작게 나온것을 확인할수 있습니다. 

p-value를 확인할때 가장 헷갈리는 것은 이것이 높게 나와야 좋은 것인지 낮게 나와야 좋은것인지 초보자들은 잘 모르는경우가 많습니다.

유의확률 즉 p-value는 어떠한 확률값을 표현한것으로
보통 0.05보다 높으면 기대했던 결과가 대부분 정규분포안에 들어가므로 맞다고 판단하고 있으며,
0.05보다 낮으면 정규분포에 속하지 않으므로 기대했던 결과가 논리적으로 정규분포 밖에 있으므로 기대했던 결과는 거짓이라고 판단하고 있습니다.

그래서 보통 p-value를 확인할때는 어떤 가설을 확인하고자 했는지를 생각해보는 것이 가장 중요합니다. 
그것이 바로 귀무가설이라고 하고 영어로는 null hypothesis라고 합니다. 
그런데 사람들은 이 귀무가설에 대해서 언급을 잘 하는 경우도 있지만, 때로는 언급하지 않고 넘어가는 경우도 있습니다. 
그럴 경우에는 항상 H0 는 귀무가설이고 이 귀무가설은 무엇인지 해설을 통해서 유추하셔야 합니다. 

이번의 실험에서 지정한 귀무가설 H0는 "이 데이터 값들이 정규성을 가진다" 입니다.
그래서 가진다고 생각하고 실험을 해봤는데 실험 결과 p-value는 0.02897이 나오고 0.05보다 작으므로 희귀한 일이 되는 것입니다. 
따라서 우리는 어려운 말로 이 p-value는 0.05보다 작기때문에 귀무가설을 기각하고 대립가설을 채택한다고 이야기 할수 있습니다.
대립가설은 귀무가설을 부정한 것으로 이번에는 "데이터값들이 정규성을 가지지 않는다" 입니다.

따라서 이번에 한 실험에서 이 데이터로는 비모수적인 방법의 분석을 해야한다는 결론을 내야 합니다. 

다음 실험을 확인해보도록 하죠 

> dataNorm <- rnorm(29,0,1)
> hist(dataNorm)
> hist(dataNorm,las=1)
> shapiro.test(dataNorm)

======== 결   과 ========================
    Shapiro-Wilk normality test

data:  dataNorm
W = 0.98018, p-value = 0.8426


위와같이 하였을 경우 데이터들은 p-value값이 0.8426이므로 이것은 귀무가설을 기각하지 못한다고 할수 있습니다. 
통계는 참 말이 어렵습니다. 기각하지 못한다는 것은 그러하다는 뜻인데 왜 그렇게 어렵게 쓰면서 노는지 이해할수는 없습니다. ㅎㅎ
하지만 어쨌든 H0 는 이 데이터들은 정규성을 가진다 였으므로 p-value가 0.05보다 높으므로 귀무가설이 맞을 가능성이 있다는 결론을 내는 것입니다.
따라서 이 데이터들은 정규성을 가진다는 가정을 해도 논리적이라고 할수 있게 됩니다. 

이럴경우에는 데이터수가 29개라도 정규성을 가지기 때문에 데이터를 t-검정을 통해서 분석하거나 진행할수 있게 됩니다. 

알고나면 참 재미나는데 모르니까 헷갈려서 포기하는게 통계입니다. 
모른다고 포기하지말고 이해 될때까지 보시고 이해 되지 않더라도 언젠가는 이해되겠지 하고 생각하고 보시면
이해가 될거라 믿습니다. 

그럼 나머지는 다음에 하도록 하겠습니다. 




참조 문헌
Enterprise guide 분석편 (자유아카데미, SAS 에반젤리스트 저) 참조




안녕하세요 DA 라이언입니다. 

오늘은 가설 검증과 t-검정에 대해서 정리해보고자 합니다. 

우선 t- 검정에 대해서 정의를 살펴보면, 


t-검정은 정규분포를 따르는 하나 또는 두 모집단의 평균에 대한 가설 검정이다.

이렇게 나와 있습니다. 

즉 t-검정을 하는 이유는

내가 얻은 샘플들(예 100명의 키 데이터)의 평균이 모집단(전교생 600명)의 평균과 동일한가 ? 

를 알아보기 위해서 가설을 세우는데 기존적으로 가설을 세울때는 평균이 동일하다라고 가정을 해야 합니다.

그래서 H0 (귀무가설, 기본이되는 가설)=> 샘플100명의 평균 = 전교생의 평균 이다 라고 정해집니다.
귀무 가설을 세울 때 주의 해야하는것은 귀무가설은 내가 마음대로 설정하는 것은 아닙니다.
기본적으로 표본의 평균과 모집단의 평균이 같다 가 귀무가설이 된다. 하지만 때에 따라서는 귀무가설이 꼭 평균이 같다고 
설정되지 않을때도 있습니다. 그래서 사람들이 많이 헷갈리는데 헷갈리지 않게 아래와 같이 팁을 드리고자 합니다. 
귀무가설을 세울때 가장 생각해봐야 할것은 그 가설이 변화를 주지 않는 쪽으로 설정되어야 한다는 것입니다.

쉽게 설명해보면

  1. 고양이의 평균 수명은 20년이라고 알려져 있다 그러한지 알아보기 위해서는 귀무가설이  
         귀무가설 H0: 표본의 고양이 평균수명 = 20년 이다.
         대립가설 H1: 표본의 고양이 평균수명 ≠ 20년 이다. 
         이렇게 설정될수 있습니다. 즉 귀무가설은 평균 수명이 20년으로 설정해야 다시 평균을 찾는일 따위는 하지 않게 됩니다.
         여기서 표본이 독립표본이고, 정규분포를 따를경우
         전체 모집단을 대표하는 표본이라고 말할수 있습니다. 
        그래서 그 모집단을 대표하는 샘플 표본들이 20년정도 평균이 나온다면 우리는 과학적인 통계 근거에 의해
        "고양이의 평균 수명은 20년정도 라고 이야기 할수 있습니다."

  1. 다른 예제를 살펴보면,  피자업체에서 피자 배달 시간을 램덤하게 추출 데이터 100개를 분석하고,   
    경쟁업체의 광고 30분보다 적게 나온다 광고를 하고자 합니다. 그럴경우
    귀무가설 H0 : 우리회사 피자배달시간은 30분보다 적다. 
    대립가설 H1 : 우리회사는 피자 배달시간은 30분보다 같거나 크다  
    라고 설정할수 있고, 검정을 통해서 
    "우리 회사의 피자 배달시간은 D사보다 더 빠릅니다 " 라고 이야기해도 과학적인 이론에 기초하여 이야기했다고 할수 있습니다.

          
  1. 마지막으로  전교생이 600명인 학교에서 남학생 키와 여학생 키를 100명씩 측정해  평균이 각각 170cm 와 160cm가 나왔다고 가정해봅시다.
          이 평균의 차이가 진짜 600명의 키를 다 전수 조사해도 10cm정도 차이가 날것인지, 
          아니면 우연히 키가 남학생은 크고 여학생은 작은쪽만 조사해서 10cm정도 차이가 나는 것인지 
         평균의 차이가 이렇게 유의(의미가 있는것인지 )확인하기 하고 싶을때 가설 검증합니다. 그래서 가설 검증은 아래와 같이 할수 있습니다.
        귀무가설 H0 : 남학생 평균 키와 여학생 평균 키 차이가 없다
        대립가설 H1 : 남학생 평균 키와 여학생 평균 키 차이가 있다
        라고 설정할수 있고, 검정을 통해서 
        "100명만 조사했지만 전교생의 남학생의 평균 키는 여학생의 평균키와는 차이가 없다 "라고 증명하고 싶은 것이고, 
        이것을 좀더 유식하게 말해본다면 
        "100명만 조사했지만 전교생의 남학생의 평균 키는 여학생의 평균키보다  차이가 유의하지 않다(There is not statistical significance between two groups)
        라고 이야기 할수 있습니다. 


그럼 마지막으로 t-검정의 실제적 예시를 아래와 같이 설명해보겠습니다. 

아래는 남자 여자의 수능 점수의 차이에 대해서 확인해본 결과입니다.수능만점은 400점으로 가정합니다.

성별
표본의 수
평균점수
분산
비고
여자
50
305.25
9.81

남자
50
290.07
8.18


이런 경우 등분산 가정이 맞다고 하고 t검정을 실시하면 

method
t Value
Pr>t(p-value)
pooled
1.88
0.0321

이렇게 나왔다고 가정해봅시다. pooled 방법은 등분산 가정일경우 할수 있는 t-검정의 한 종류이며, 
t-value가 1.88 , p-value는 나왔다고 해봅시다. 
여기서 귀무가설은 H0 : 여자 평균점수은 남자 평균점수 차이가 없다 
           대립가설은 H1 : 여자 평균점수은 남자 평균점수 차이가 있다.

이것을 그림으로 그리면,  아래와 같이 나오고 , 이것은  t-검정을 한결과 p-value가 0.0321이 나왔으므로,
보통 0.05기준으로 작게 나오면 일어날 확률이 너무 작아서
신뢰구간 95% 내에서 우리는 귀무가설 H0가 성립됨을 증명되지 못한 것이고 
이걸 좀 어렵게 말하싶으시면 귀무가설을 기각한다 라고 이야기 하면 됩니다. 

따라서 우리는 이러한 검증을 거쳐서 
여자 평균점수는 남자 평균점수와 유의미한 차이가 있다고 할수 있다고 할수 있습니다.

즉 전체를 검증하지 않아도 무작위로 뽑은 50명만 검증해도 전교생의 수능 성적을 비교할수 있고, 
그 무작위로 뽑은 값에서 남녀가 차이가 나는데 이것은 다시 실험을 해도 비슷하게 나올 확률이 95%이므로 
서로 남녀 점수가 차이나는 건 의미가 있는 결과다 라고 이야기 할수 있는 것입니다. 

오늘은 가설 검증과 t -검증에 대해서 이야기 해보았습니다. 

어려운 이야기를 좀 쉽게 설명하기 위해서 노력해봤는데 그래도 어렵네요. 
잘 보시고 이해하시면 감사드리겠습니다.



안녕하세요.

오늘은 선형회귀 및 polynomial Regression을 이해하고 행렬을 프로그램으로 변환하는 방법에 대해서 이해해보도록 해보겠습니다.
특히 모델링이라는 말의 의미를 이 포스팅을 보시고 이해해주시면 감사하겠습니다.

이해가 안가실 것같으니 아래와 같이 python으로 그래프를 그리면서 이야기를 해보면 쉽게 이해하실수 있습니다. 


%matplotlib inline
#문서내에 그래프 출력

import numpy as np
import pylab as pl


def f(size):
    '''
    사인곡선을 적용하여 원데이터를 발생
    Returns a sample with 'size' instances without noise.
    '''
    x = np.linspace(0, 4.5, size)
    y = 2 * np.sin(x * 1.5)
    return (x,y)

def sample(size):
    '''
    원데이터에 random함수를 적용해서 사인곡선을 적용하고
    여기에 노이즈를 추가로 더하여 size수량만큼 무작위로 뽑는 함수를 만듬
    Returns a sample with 'size' instances.
    '''
    x = np.linspace(0, 4.5, size)
    y = 2 * np.sin(x * 1.5) + pl.randn(x.size)
    return (x,y)

pl.clf()
f_x, f_y = f(50)
pl.plot(f_x, f_y)
x, y = sample(50)
pl.plot(x, y, 'k.')



위와같이 파란색으로  Sin곡선을 만들어봅니다. 가로는 0~4.5, 세로는 플러스 마이너스 2 범위내에서 한 주기가 되는 sin곡선을 만들었습니다.
여기에 50개의 샘플링을 한 점을 위와같이 무작위로 찍어봅니다.
이때 이 점은 원래는 파란색 선을 따라서 나와야 하지만 error 가 각각의 점마다 더하고 빼져서 파란색선을 따르지만 거리의 편차가 있는 점을 만들었다고 생각하시면 됩니다.

이러한 곡선은 현실세계에서는 존재하지 않지만 그래도 억지로 인위적으로 만들어 본다면,
계절마다 에어콘 가격 트랜드라고 예를 들어볼수 있습니다. 즉 파란선은 에어콘 가격의 절대적인 트랜트 이며,
실제 가격은 이 트랜드를 따른다고 생각하시면 됩니다.

X가 1일때 여름이라고 가정하고 그때가 가장 높게 가격이 책정되어 팔린다고 생각하시고,
X가 3일때 겨울이라고 생각하시고 그때가 가장 낮게 가격이 책정되어 팔린다고 생각하시면 됩니다.

하지만 이 절대적인 트랜드를 각 판매처에서 따른다고 하더라도, 실제 판매처에서는 이윤을 더 붙이든 , 아니면 낮게 붙일수 있습니다.
이렇게 절대적인 트랜드 보다 높거나 낮은 실제 가격에는 각각의 가격마다 error가 들어갔다고 보시면 됩니다.


pl.clf()
x, y = sample(50)
pl.plot(x, y, 'k.')



그래서 지금부터 설명하고자 하는 variance와 bias는 위와같이 각각의 판매처가 임의로 정한 가격들(검은색점)을 보고
에어콘의 가격트랜드(위에 사라진 파란색 선)를 파악하고자 할때 고민해야하는 상황으로 가정하고, 설명하도록 하겠습니다.

그렇습니다. 위의 데이터들만 보았을때는 X축은 오른쪽으로 갈수록 시간이 지나간다고 가정하고,
Y축은 기준 가격으로부터 상대적 차이를 표현한다고 가정하더라도,
어떠한 패턴을 나타내는지 눈으로 아니면 직감적으로 파악한다는 것은 어려운 일이 아닐수가 없습니다.

패턴을 파악한다는 것은 각각의 데이터를 보고 거리에 대해서 평균을 내서 그 데이터들을 대표하는 하나의 선으로 표현하는 것을 의미하는데,
여기서 선은 직선이 될수 있고 곡선이 될수도 있습니다. 


from sklearn.linear_model import LinearRegression

def fit_polynomial(x, y, degree):
    '''
    Fits a polynomial to the input sample.
    (x,y): input sample
    degree: polynomial degree
    '''
    model = LinearRegression()
    model.fit(np.vander(x, degree + 1), y)
    return model

def apply_polynomial(model, x):
    '''
    Evaluates a linear regression model in an input sample
    model: linear regression model
    x: input sample
    '''
    degree = model.coef_.size - 1
    y = model.predict(np.vander(x, degree + 1))
    return y

model = fit_polynomial(x, y, 1)
p_y = apply_polynomial(model, x)

pl.plot(x, y, 'k.')
pl.plot(x, p_y,'g')


직선이 된다면 위와같이 그릴수 있습니다. 
위와같이 직선으로만 트랜드선을 긋는것을 1차 선형 회귀라고 합니다. 

여기서는 데이터 트랜드가 직선임을 가정하고 모델을 Y=AX+B라고 지정한후에 

원 데이터들의 각 X를 입력했을때 나오는 Y의 값과 원 데이터 값의 차이를 평균을 내서 A와 B를 정한후

가장 공평한 선을 위와 같이 긋고 ,
이것이 데이터들의 패턴을 대표한다고 이야기 할수 있습니다.

하지만 눈으로 보아도 알수 있듯이 직선은 원 데이터가 가지고 있는 패턴을 너무나 많이 생략하여서
저 선만으로 판단할경우에는 시간이 갈수록 가격은 떨어져간다고 파악하게 됩니다.

하지만 원래 의도한 가격 그래프는 sin데이터 이므로 시간에 따라 가격이 떨어지는 것을 표현한 것이 아니라 
계절에 따라 가격은 변화하지 가격이 떨어짐을 표현한 것은 아닙니다. 

따라서 직선으로만 데이터의 패턴을 파악하면, 간단하여서 좋긴 하지만, 자칫 데이터의 가지고 있는 실제 패턴을 
오해해서 이해할수 있습니다.
'
그렇다면 좀 더 구체적인 선형 회귀를 하기 위해서는 데이터의 트랜드를 직선이 아닌 곡선이라고 가정할 필요가 있습니다.
즉 1차식이 아닌 다항식이라고 규정하고 선을 그어보는 것입니다.


그전에 필수적으로 알아야 할  파이썬의  함수 np.vander로 예제를 먼저 알아보도록 하겠습니다. 

np는 numpy의 줄임말로 
윗부분에서 import numpy as np 라고 줄임말을 지정해서 np라고 사용할수 있습니다. 
import numpy as num 이라고 하면 , 우리는 num.vander라고 사용해야합니다.
우선 예제를 보도록 하겠습니다.


# This illustrates how vander function works:
x = np.array([1,2,3])
print np.vander(x, 4)

결과 : 
[[ 1 1 1 1]
 [ 8 4 2 1]
 [27 9 3 1]]

x=np.array([1,2,3])은 x1을 가로 행렬 [1,2,3]을 제작한 것이고 , 

np.vander(x, 4)는 실제로는 아래와 같이 4개의 다항식을 만들어서 x를 차례대로 입력하라는 지시를 내린 것입니다.


즉 첫번째로 x^0(X의 영 승)은 1이고 , 이것을 처음 만들고

두번째로 x^1은  두번째 만들고 기존의 1은 오른쪽으로 이동시킵니다. 

세번째 x^2은 세번째 만들고 기존 결과를 오른쪽으로 이동시키고 왼쪽에 x^2를 위치시킵니다. 

네번째 x^3은 네번째 만들고 기존 결과는 오른쪽 이동, 왼쪽에 배치 시킵니다.

그리서 아래와 같은 행렬을 만들게 되고 


결과적으로 아래와 같은 결과를 만들게되었습니다.

결과 : 
[[ 1 1 1 1]
 [ 8 4 2 1]
 [27 9 3 1]]

이것은 머신러닝이나 수치해석을 할때 굉장히 중요한 개념입니다. 

즉 여러가지 다항식을 행렬로 계산하면 계산이 깔끔할뿐만 아니라 시간도 적게 걸리는 경우가 많습니다. 

행렬로 구하지 않을 경우 for문으로 1부터 N까지 x가 변할때마다 x의 값을 세제곱, 네제곱 하는 등의 계산을 해야하는데,
이것은 프로그래밍에서 굉장히 비효율적으로 바라보는 경향이 많습니다 

따라서 데이터를 분석할때는 다항식의 계산을 행렬로 변환하여 기억하고 프로그램까지 작성할수 있다면 잘하고 있다고 스스로를 칭찬하셔도 됩니다.

다시 데이터 포인트가 4개 즉 


 일경우 다항식의 계산은 아래와같이  표현할수 있습니다. 


 

.여기서 n은 몇차 다항식 지정할 것인가 의 질문에 차수에 해당되는 숫자입니다.
즉 ,  n=2면 2차 다항식, n=3이면 3차 다항식으로 표현하여 선을 그어 볼수 있겠지요.


그럼 polynomial 다항식을 사용하는 방법을 아래와 같이 작성예제를 확인해봅니다.

# polynomial 다항식을 정의하는 함수를 작성합니다.

def fit_polynomial(x, y, degree):
    model = LinearRegression()
    model.fit(np.vander(x, degree + 1), y)
    return model

좀 상세하게 본다면 아래는 사용자가 직접 함수를 만들때 쓰는 명령어입니다. 

def fit_polynomial(x, y, degree):

def는 definition의 줄임말이고 fit_polynmial은 사용자가 지정한 함수 명입니다.
(x,y,degree)는 함수를 사용할때 필히 입력해야하는 변수를 지정해놓았습니다.

    model = LinearRegression()


위의 명령어는 model이라는 사용자 정의명에 LinearRegression()의 함수를 지정하였습니다. 
LinearRegression()은 sklearn 라는 라이브러리에 저장되어 있고

from sklearn.linear_model import LinearRegression

라고 초반에 작성하여 라이브러리를 불러냈다면 이후 사용은 언제든지 저렇게 간단하게 사용할수 있습니다.

    model.fit(np.vander(x, degree + 1), y)

마찬가지로 LinearRegression함수 안에 fit이라는 메서드 를 이미 지정되어있기 때문에 그냥 가져다 쓰기만 하면됩니다.
여기서 np.vander(x, degree + 1) 은 지정된 X를 1부터 시작해서 X의 N승까지 행렬로 표현해서 입력한 것입니다.

  return model

그리고 사용자가 지정한 모델을 반환하시면 향후 fit_polynomial(x, y, degree) 명령어만으로도 x와 y의 데이터 포인트 그리고 degree만 입력하면 

python이 알아서 polynomial regression으로 모델링을 해줍니다. 

여기서 모델링을 한다는 것은 다항식의 각각의 계수를 지정해준다는 말로 아래의 B 베타값을 계산하여 정한다는 이야기라고 생각하시면 됩니다.


def apply_polynomial(model, x):
     degree = model.coef_.size - 1
    y = model.predict(np.vander(x, degree + 1))
    return y

위의 함수는 모델링된 함수를 그래프로 그리기 편하게
X가 입력되면 모델에 의해서 
Y의 값이 자동적으로 출력되도록 함수를 작성하였습니다.

그래서 아래와 같이 8차 다항식의 모델을 만든후에 모델링후 
각각의 x값을 적용해준다면 아래와같이 모델링된 데이터패턴을 확인할수 있습니다.

model = fit_polynomial(x, y, 8)
p_y = apply_polynomial(model, x)
pl.plot(x, y, 'k.')
pl.plot(x, p_y,'g')



위와 같이 각각의 데이터를 이용해서 8차 다항식의 선형회귀 모델을 모델링 하였습니다.

여기서는 기존의 원 트랜드와 같이 sin 곡선과 유사한 패턴을 그려서 먼저번의 직선보다 좀더 정확한 데이터 패턴을 구했다고 생각하시면 됩니다.

그럼 여기까지 하고 추가적으로 다음시간에는 좀 더 자세히 분산과 bias에 대해서 알아보도록 하겠습니다.
감사합니다.

참조 사이트



안녕하세요

본 강의(포스팅)은 아래의 사이트 내용을 일부 번역하고 필자의 의견을 추가 구성한 글임을 미리 밝혀드립니다.

데이터 해카톤(Data Hackathons)를 종종 모니터 하다보면 흥미로운 점들이 발견됩니다. 
그 흥미로운 점은 해카톤의 성적 순위를 공개되어 있는 것을 보면 PUBLIC LEADER BOARD 순위와
 PRIVATE  LEADER BOARD순위 로 나누어 져있는 것을 볼수 있습니다.
(이것은 단체 순위 , 개인순위로 해석되기보다는 공개용 데이터로 분석하고 내놓은 모델의 정확도 순위와
 그 동일한 모델을 가지고 비공개적으로 다른 데이터를 여러게 적용해보고 난 이후에 매긴  정확도 순위로 
해석하는게 좋을듯 싶습니다.)

PUBLIC  LEADER BOARD 순위 에서 상위에 올라있는 참가자는 순위표가 PRIVATE LEADER BOARD순위 에서 
유효성을 확인한 후 공개용 순위에서 많이 떨어져 있는 경우도 있었고,일부는 TOP 10안에 들어감에도 불구하고 
PRIVATE LEADER BOARD순위 에서 (아래 이미지)에서 상위 20 위도 차지하지 못했습니다.
왜 이러한 현상이 발생하는 것일까요?

왜 이러한 순위의 큰 변동이 일어나는 이유는 무엇일까요?
즉 주어진 공개용 데이터를 바탕으로 만들어진  모델링 알고리즘이 왜 다른 데이터를 기반으로 모델을 평가할경우 
그 모델의 안정성이 저하되는 이유는 무엇일까요?


맞춰보세요! 랭크의 높은 변동에 대한 가능한 이유는 무엇일까요? 즉, 개인 리더에서 평가할 때 모델의 안정성이 
저하되는 이유는 무엇입니까? 가능한 이유를 살펴 보겠습니다.

왜 모델의 안정성(Stability)이 줄어들었을까요?

아래의 그림을 바탕으로 이해해 보도록 해보겠습니다. 

여기에 사이즈와 가격간의 상관관계를 찾는 그래프가 여러가지 있습니다. 

주어진 데이터를 기반으로 관계 그래프를 위와같이 만들었고 주어진 데이터들은 5개의 점으로 표현하였습니다. 첫번째 그래프는 주어진 5개의 학습데이터 포인트(training data point)에 높은 error를 가지고 있지만  모델은 곧은 선형으로 표현했습니다. 이 모델은 높은 에러를 가지고 있으므로 예측이 정확하지 않아서 public 과 private leader board에서 높은 순위를 가지고 올수 없을것입니다. 이렇게 높은 error를 가지고 있는 fitting을 "under fitting"이라고 합니다. 이 모델은 데이터의 트렌드를 이해하는데 부적절하다고 볼수 있습니다.

두번째 그래프는 size와 가격의 데이터 포인트를 잘 표현하였고, 그 추세를 잘 표현한 모델이라고 할수 있습니다. 낮은 학습 에러(trainning error)를 포함하였고, 가격과 사이즈에 대한 관계를 일반화(generalization of relationship) 했다고 이야기 할수 있습니다. 

세번째 그래프는 거의 영에 가까운 학습 에러를 가진 모델입니다.(relationship which has almost zero training error). 즉 주어진 5개의 데이터 포인트로 완벽에 가까운 관계식을 만들었고, 5개의 데이터 포인트로 비교해 봤을 때 size를 입력했을 때 그 관계식에서 발생하는 값과  실제값의 차이(즉 오류 error)는 0에 가깝다고 할수 있을 정도로 복잡한 모델을 만들었다고 보면 됩니다.

복잡한 모델 즉 관계식은 "Over fitting"되었다고 표현하고, 보통 이런 경우에 public learder board 와 private learder board에 큰 차이를 발생시킵니다. 즉 정확한것처럼 보이지만 그 모델(관계식)이 표현하고자 하는 size와 price의 관계가 너무 민감하게 표현되어서 , 실제 눈으로 예측하는 관계와는 큰 차이가 발생하게 되는 것입니다

데이터 과학 경진 대회의 일반적인 목적은 다양한 모델을 반복하여 더 나은 성능 모델을 찾는 것입니다.
그러나 관계식을 주어진 데이터로만 만들다보면 우리가 관계를 더 잘 포착했거나 주어진 데이터에만 모델을 지나치게 잘 맞추고 있기 때문에 주어진 데이터로만 성능가 향상되는지 여부를 구별하기가 어려워집니다.그렇다고 여기에 새로운 데이터를 학습시켜볼수는 또 없는 노릇입니다. 따라서 주이진 데이터를 가지고 좀더 과학적인 교차 검증 기술이 필요합니다. 이 방법만 있다면 주어진 데이터만으로 일반화를 시키고 이것이 객관적으로 사람들에게 말할수 있는 size와 price간의 관계라고 이야기 할수 있다고 하는 것이죠.

그렇다면 교차 검증 혹은 교차 유효성 검사(cross validation)은 어떻게 하는 것일까요?

Cross Validation 은 주어진 데이터를 일부 나누어서 한 쪽 데이터로는 학습을 시켜 모델를 만들고
(모델을 만든다는 의미는 x와 y의 관계식을 추정한다고 이해하시면 됩니다.)
나머지 학습시키지 않은 데이터로 그 모델에 대해서 검증하는 방법을 말합니다.
방법은 아래와 같습니다.

1. 예를 들어 100개의 데이터 set이 있다고 하고, 70개는 학습을 시키는 데이터 즉 train data set,
    30개는  검증하는 데이터 즉 test data set 혹은 validation data set으로 지정해놓습니다.
2. train data set을 가지고 모델링을  하여 모델을 만듭니다.
3. 만든 모델을 test data set으로 모델을 평가합니다.
4. train data set과 test data set을 통해 얻은 error를 그래프를 그려보고 그 그래프가 만나는 최적의 점을 찾아 최적화 합니다.

Cross validataion의 종류 및 각각의 방법들 
cross valiation 은 예를 들어 설명하긴 하였지만, 꼭 70 : 30으로 만 나눌 필요는 없고, 
또한 두개의 그룹으로만 나눌 필요는 없습니다. 
나누는 비율과 그룹에 따라서 여러가지 종류의 cross validation이 존재하며 
대표적인 방법들은 아래와 같이 설명합니다.

1. The validation set Approach
이방법은 50%의 data 는 검증을 위해 남기고, 다른 50%는 모델 학습을 위해서 남겨놓습니다. 
모델 학습후 모델 검증은 validation data를 가지고 합니다. 
(보통은 50:50도 많이 하지만 70:30 도 하는경우도 있고 
둘다 the validation set approach라고 이야기 할수 있습니다.)

이 방법의 단점은 
1. 일부의 데이터만 학습을 하기 때문에 모델이 일부 데이터를 설명하기에는 
    부족하지 않겠지만 경우에 따라 전체 데이터를 설명하는데는 부족한 모델이 될수 있습니다.
    이것을 통계적 용어로 "bias 가 높다"고 할수 있는데 , 경우에 따라 일부 데이터로만 학습하였기 때문에 
    모델이 bias가 높은 경우가 될 가능성이 높습니다
   
   즉 한국인의 한달 소득과 소비 값의 관계식을 파악하고자 모델을 만들었는데, 
   하필 학습시킨 데이터는 30대 이상이고, 검증하는 데이터는 30대 이하일 경우,
  30대 이상의 데이터로 만 학습하게 되면   전체 소득과 소비 값에 대비해서 
   편중된 모델이 만들어질수 있습니다. 즉 편중된 모델이라는 것은 높은 bias 나타난다라고 이야기 할수 있고,
  이것은 전체를 설명하는데 부적절해 지게 됩니다.

2. Leave one out cross validation (LOOCV)

 이 방법은 하나의 데이터 포인트만 남기고 나머지 모든 데이터로 학습을 시켜 모델을 만드는 것입니다.
 그리고 다시 다른 하나의 데이터 포인트만 남기고 나머지 모든 데이터로 학습을 시킨 후 여러번 반복해서
 남겨둔 포인트들로 검증을 하는 방법입니다.
 
이렇게 될경우에는 몇가지 장점과 단점이 발생하는데

 장점 : 거의 모든 데이터로 모델링해서 bias가 적다 
 단점 : 1. n번 반복시행할 경우 n배 만큼 실행시간이 길어진다.
            2. 이 방법은 모델검증에서 여러가지 다양한 결과가(즉, 높은 분산이) 발생 시킬수 있습니다.
                다시 말해서 검증을 위해서 제외시킨 하나의 data point가 예측의 큰 영향을 미치기 때문에,
                그 검증 데이터가 outlier였다면 모델은 최적의 모델이었으나, 검증 결과는 최악의 모델이 될수도 있고,
                모델은 최악의 모델이었으나 검증 결과는 최적의 모델로 검증될수도 있습니다.

3. k-fold cross validation

위의 두가지 방법을 통해서 우리는 아래와 같은 사항을 배울수 있었습니다.

1. 우리는 data set에서 많은 부분의 데이터로 모델을 학습시켜야 합니다 .
 그렇지 않으면 높은 bias를 가진 모델을 얻게됩니다.
(즉 한국인의 소득과 지출관계에서 40대 이상의 모델을 얻고 
 이것이 한국인을 대표한다고 말해야하는 경우가 high bias라고 할수 있습니다)

2. 우리는 최적의 비율로 test data set을 나누어야 합니다 
  적은 수의 데이터로 test 를 할 경우 모델의 효율성을 평가할때 높은 분산을 얻게 됩니다.
 (즉 효율성이 좋다고 나와야 함에도 적은 데이터로 인해 검증할때는 
  효율성이 낮게 나올수 있다는 것입니다.그리고 이것을 10번할때 
 이러한 오차가 빈번하게 발생하면 높은 분산을 얻었다고 표현할수 있습니다.)

3. 우리는 학습과 test(검증)을 여러번 시행하되, 학습과 검증의 분포를 다르게 해서 여러번 시행해야 합니다.
   이것이 검증에 큰도움을 줍니다.

그렇다면 세가지 요건에 맞는 방법은 무엇일까요 
그것은 k- fold cross validation” 입니다.
그것의 세부 방법은 아래와 같습니다.

1. 무작위로 데이터를 k개의 fold (겹, ex> 여러겹) 로 나눕니다. 즉 100개를 k 개의 집단으로 무작위로 나눕니다.
2. 각 집단 중 하나의 집단이 test set이 되고 나머지는 학습을 위한 데이터로 진행합니다.
3. 학습한 모델을 기준으로 test set으로 평가한 error를 기록합니다.
4. 이것을 돌아가면서 k번 실시합니다.
5. 기록한 error를 평균을 내고 그것을 cross-validation error라고 칭하고, 모델을 평가하는 하나의 지표로 활용합니다.

아래는 k가 10이라고 하고 , 10개의 군집을 나누어서 training하고 validation을 한 것을 표현한 것입니다.


그럼 좋은 결과를 얻기 위해서는 k를 몇으로 지정하여야 하까요?

정해진 것은 없지만, 보통 10개를 하고, 필요에 따라서 더 많이 합니다.
명심해야할 것은 K가 적어질수록 모델의 평가는 편중될수 밖에 없으며, 결과도 정확하지 않습니다.
k가 높을수록 평가는 bias가 낮아지지만, 결과의 분산이 높을수 있습니다.
(즉 k=100일 경우 정확도가 1~100점이라고 나올수 있으며, 이럴경우에는 
50점의 정확도를 가진다고 표현할수 있으며,
k=20일 경우 정확도가 25~75점이라고 나와서 , 
정확도가 50이라고 표현할수도 있습니다. 
 동일한 정확도이지만 k-100일 경우가 분산이 더 높은 결과임은 틀림없습니다.)


How to measure the model’s bias-variance?

After k-fold cross validation, we’ll get k different model estimation errors (e1, e2 …..ek). In ideal scenario, these error values should add to zero. To return the model’s bias, we take the average of all the errors. Lower the average value, better the model.

Similarly for calculating model’ variance, we take standard deviation of all errors. Lower value of standard deviation suggests our model does not vary a lot with different subset of training data.

We should focus on achieving a balance between bias and variance. This can be done by reducing the variance and controlling bias to an extent. It’ll result in better predictive model. This trade-off usually leads to building less complex predictive models.


그렇다면 실습을 해볼 필요가 있습니다.

R 프로그래밍 예제
#C 드라이브에 RData폴더를 만들고 아래 명령어를 치게되면 working directory 가 Rdata로 지정됩니다. 폴더가 없으면 error나므로 일단 앞에 #을 붙여서 주석처리를 하였습니다.
#setwd('C:/RData')
#붓꽃데이터를 활용한 분석을 합니다. 데이터셋은 유명한 iris데이터 셋으로 진행할 것이며, 워낙 유명해서 보통 library에 내장되어 있습니다.
#iris데이터는 총 5개의 열로 이루어져 있고, 150행이 존재합니다.
#처음 4개의 열은 Sepal length(꽃받침 세로길이), Sepal width(꽃받침의 가로길이), Petal length(꽃입의 세로길이), Petal width(꽃입의 가로 길이)가 들어 있으며, 마지막열은 그 붓꽃의 종류를 적어놓고 종류는 , setosa, versicolor, virginica 이렇게 3종류로 되어 있습니다.
#모델링에 이용될 알고리즘은 rf즉 Random forest 알고리즘을 이용하였습니다.
#랜덤 포레스트 알고리즘을 이용해서 꽃받침 가로길이, 꽃입 세로길이, 꽃입 가로길이를 입력했을때, sepal.length 즉 꽃받침의 길이을 예측하고 그 결과를 검증하는 프로그램입니다.

install.packages("plyr")
install.packages("dplyr")
install.packages("randomForest")

#아래 라이브러리 가져오는 명령어들이 error날경우 위를 실행하세요.
#시작은 여기서부터

library(plyr)
library(dplyr)
library(randomForest)


data <- iris
#그 유명한 iris data set을 가지고 오기때문에 단순한 명령어가 가능합니다.

glimpse(data)
#데이터 확인해보는 명령어

#cross validation, using rf to predict sepal.length
k = 5

data$id <- sample(1:k, nrow(data), replace = TRUE)
list <- 1:k


# prediction and test set data frames that we add to with each iteration over
# the folds
prediction <- data.frame()
testsetCopy <- data.frame()
#데이터 프레임 초기화


#아래는 쓸데 없지만 그냥 멋있음을 위해 존재
#Creating a progress bar to know the status of CV
progress.bar <- create_progress_bar("text")
progress.bar$init(k)
#|================================================================================================================| 100%
#progress bar는 위의 모양같이 생겼고 굳이 넣을 필요없는데 비쥬얼을 위해서 넣음



#function for k fold
#i는 1부터 5로 나눈후에 5번을 진행하도록 합니다.

for(i in 1:k){
  # remove rows with id i from dataframe to create training set
  # select rows with id i to create test set
  trainingset <- subset(data, id %in% list[-i])
  testset <- subset(data, id %in% c(i))
  #데이터를 5등분하고 한번 뽑은 test data가 다시 train 으로 가지 않도록 5등분 합니다.

  #run a random forest model
  mymodel <- randomForest(trainingset$Sepal.Length ~ ., data = trainingset, ntree = 100)
  #랜덤 포레스트 알고리즘으로 꽃받침의 길이를 나머지 데이터로 예측하는 모델을 만듭니다.

  #remove response column 1, Sepal.Length
  temp <- as.data.frame(predict(mymodel, testset[,-1]))

  # append this iteration's predictions to the end of the prediction data frame
  prediction <- rbind(prediction, temp)

  # append this iteration's test set to the test set copy data frame
  # keep only the Sepal Length Column
  testsetCopy <- rbind(testsetCopy, as.data.frame(testset[,1]))

  progress.bar$step()
}


# add predictions and actual Sepal Length values
result <- cbind(prediction, testsetCopy[, 1])
names(result) <- c("Predicted", "Actual")
result$Difference <- abs(result$Actual - result$Predicted)


# As an example use Mean Absolute Error as Evalution
summary(result$Difference)



감사합니다.




빅데이터 알고리즘을 위한 커리큘럼은 아래와 같습니다.

  1. over-fitting and under-fitting 
  2. bias/variance trade-off
  3. ERM(Empirical Risk Minimization) principle
  4. 상관분석(correlation)
  5. 회귀분석(선형회귀, 로지스틱 회귀)
  6. 능형회귀(ridge regression)과 lasso(regularization)
  7. prediction algorithm 평가(evaluating) 및 비교(comparing)
  8. Ensemble method(sampling, bagging, Random foresting, boosting)
  9. Density estimation(Parzen windows, Kernel density estimation)
  10. KNN(K-Nearest Neighbors)
  11. Discriminant Analysis (LDA, QDA)
  12. Model selection(Cp, BIC, Adjusted R square, Cross-validation)
  13. kernel methods
  14. K-mean clustering 
  15. hierarchical clustering
  16. Dimensionality reduction and Principal Component Analysis(PCA)
  17. information Retrieval
  18. Bayes theorem and Bayesian learning 

위의 순서는 편의상 번호를 매겨본 것이고 위의 순서대로 배워야 하는 법은 없습니다.
그리고 모든 강의는 위의 순서를 따르지 않을 것이며, 강의가 진행될때마다 위의 내용들중 어느것이 적용되는지
알려드리고자 합니다.

강의는 기본적으로 R과 파이썬의 실습예제를 한번씩 해보는 것으로 진행될 것이며,
그 결과도 함께 같이 적어놓으려고 합니다. 

또한 강의가 진행되다가 위의 내용 중에 빠진 것이 있다면 집어넣고 
필요없다고 생각하는 경우에는 빼는 경우도 있을 것입니다



안녕하세요.

본 포스팅은 빅데이터 강의를 위해서 진행합니다. 
시중에는 많은 강의가 있습니다. 개발자를 위한 빅데이터 강의, 빅데이터 MBA 등등 차고도 넘친다고 생각합니다.
하지만 저처럼 아무런 개발자 경력없이 빅데이터에 관심을 가졌던 사람들을 위한 강의는 좀처럼 보기 힘들고 ,
또한 본다고 해도 어렵습니다. 그래서 강의를 만들어 보려고 합니다.

저는 공대를 나와서 경영 일반에 속하는 구매 업무를 7년하고, 
빅데이터를 심화공부하고 싶어서 영국에서 Msc. Machine Learning을 전공하고 돌아왔습니다.

얼핏보면 이미 공대의 백그라운드에서 대학교때 배운 가닥으로 배워서 가능하다고 생각하실수도 있는데,
대학을 졸업하고 8년이면 대학 때 공부하던 기억은 남지 않습니다. 
다만 공대생의 습관, 즉 궁금해하고, 쓸데없이 이것저것 해보고, 
그리고 포기하고, 다시 이것저것 해보고, 그리고 다시 포기하고, 그러다가 얻어걸려서 이해하게 되는 습관은 가지고 있습니다. 

저는 회사에서 엑셀을 잘 다루는 편에 속하였습니다.
그래서 전 회사에서 엑셀에 대한 질문을 많이 받았습니다.
회사에서 같은 공대를 나오고 구매를 하시는 분들을 만나면서 크게 두 분류로 나눌수 있었습니다. 
무엇을 궁금해 하시어 조금만 알려줘도 이해하거나 이해를 못해도 스스로 깨닫기 위해 노력하시는 분들,
아니면 그것은 내가 잘못하기 때문에 그일은 절대 내가할수 없고, 
내가하는 것보다 남을 시켜야 효율이 난다고 생각하고 엑셀업무를 피하시는 분들


공대생은 졸업해서 개발을 하게되면 개발만 하시는 경우가 많습니다. 
개발만 하시는 분들도 문과생들처럼 사람들을 위해 이해시키는 보고서도 작성을 하고,
사람들을 만나서 관계를 맺고 이야기를 하고, 발표도 하게 됩니다. 
상대적으로 문과출신이라고 하시는 분들이 이런 보고서 작성과 , 발표에 능하다고 생각합니다.
하지만 회사생활 7년 8년차에 접하게 되면 그 배경이라는게 
나를 표현하는 하나의 무늬가 될뿐이지, 나의 선천적 능력이 될수는 없습니다. 
즉 처음에는 잘 못하지만, 공대생들도 발표연습을 하게 되면 발표도 잘할수 있고, 
기술 영업업무를 하시면 영업업무도 잘하시게 되고, 글짓기를 좋아하면 글을 잘쓰게 됩니다.

하지만 문과를 나오신 분들 중에 혹은 공대를 나왔지만, 
'나는 컴맹이지만 인터넷은 하는데 엑셀이나 이런 것은 잘 못하겠다. ' 라며
그건 내가 잘 할수 없는 장애인에 빗대어 본인을 설명하고 포기하는 경우를 많이 봤습니다.
그분들이 컴퓨터에 대해 두려움을 가지고 학습의 속도가 느린 것은 이해하나, 
포기를 하고 본인의 업무를 남에게 미루는 것은 이해할수 없습니다.

그러한 포기가 본인만의 선택이고 그선택을 존중하지만,
그 선택으로 인해서 본인은 그업무를 맡아야 함에도 불구하고 
남에게 미루어 본인의 역할을 못한다면 그때부터는 민폐가 됩니다 
그런 분들은 애초에 세상을 살고 사회생활을 하면서 
엑셀 혹은 컴퓨터로 복잡한 수치를 해석하고 데이터를 분석하는 일을 피해 다니며,
주변사람들과 업무분장에서 그러한 업무를 맡지 않고 잘 지내시기를 기원합니다. 
하지만 세상이 점점 처리해야하는 데이터도 많아지고, 
누구는 데이터를 분석해서 보고서를 쓰고 그러한 보고서들이 점점 대우를 받는 세상에서
스스로만 컴맹이라는 단어에 갇혀서 아무런 노력도 하지 않고, 
남에게 본인의 업무를 미루거나 강압하는 위치에 간다면 향후에는 도태될 것이라 생각됩니다.

요즘은 초등학교때 코딩을 배우고자 하는 아이들도 많고 , 가르치는 학교 학원도 많아졌습니다.
제가 초등학교때는 베이직이라는 코딩을 배웠습니다. 하지만 그때 배운 내용은 현시대에서는 더이상 쓰이지 않습니다.
그럼에도 불구하고 그때 배운 베이직이 저에게 소중한 경험인 이유는 그때 배운것은 베이직 프로그래밍이 아니라,
포기하지않고 스스로 문제를 인식하고, 해결해나가는 자세를 배웠습니다
아무도 가르쳐주지 않지만, 책을 보며 끙끙대며 비효율적이다 싶지만 
똑같은 시행착오를 10번씩 겪으면서, 다른 방법을 해야한다는 필요성을 느끼며
다른 방법으로 길을 찾아 문제를 해결하는 경험과 그 습관을 배웠습니다.

요즘 빅데이터를 공부해야 하시겠다고 하신분들은 굉장히 많고 국민적 관심을 가지고 있다고 생각합니다.
빅데이터를 공부해본 사람으로서 그분들에게 말씀드리고 싶은것은 쉽지 않다는 말씀을 드리고자 합니다.

기본적으로 빅데이터 분석에는 확률 및 통계학에 내용이 들어갑니다.
통계학이 필요한 이유는 데이터가 많아져도 그 데이터가 전체를 대표하지 못하기 때문에 
통계적 시각으로 그 데이터가 전체를 대표하는 의미를 뽑아낼수 있는지를
증명하거나 생각할때 필요하고, 혹은 어떤 일이 발생할 가능성, 
즉 확률을 계산해서 확률이 가장 높은 것을 제안하는 분석할 때 확률에 대한 지식이 필요합니다.

또한 그러한 발췌한 데이터를 행렬로 인식하고 그 행렬을 연산하는 프로그램을 짜기 때문에 
행렬에 대한 지식인 선형대수학도 필요합니다.

 컴퓨터로 진행하는 것이라서 프로그래밍이 포함됩니다.
물론 개발자가 될 정도의 프로그래밍을 할필요는 없고 기초 코딩은 하고,코드를 보고 읽을 정도는 되어야 합니다.

또한 분석하는 데이터에 대한 기본지식은 가지고 있어야 목표하고자하는 데이터가공 및 분석이 가능합니다.
즉 유전자 데이터를 이용한 유전자별 그룹을 나눌 경우에는 최소한  DNA염기서열에 대한 지식이 있어야 하며,
경제 지표를 긁어와서 경제 성장과 비슷한 패턴의 경제 지표를 찾으려고할때는 경제학이 필요합니다.

이렇듯 여러가지 지식이 필요하지만 어렵다고 벌써부터 겁을 먹고 포기할필요는 없습니다.
왜냐하면, 전문적인 수준까지 가기전에는 항상 기초적인 수준이 존재하니까요.
위의 지식들은 빅데이터 알고리즘을 만들기 위한 분들이라면 높은수준의 학습이 필요합니다.
하지만  여러분들은 모든 알고리즘을 새로 만드실 분들은 아닙니다.
 그저 만들어진 알고리즘을 각자의 분야에서 활용하고 거기에서 가치를 창출해나가시면 됩니다.

즉 집에 전구를 달고자 하시면 전구를 만드실 필요가 없고
전구의 특성과 주의할 점 그리고 어떻게 해야 불이 켜지는 정도만 알면되지,
전구의  구동원리, 전구의 재질, 전구의 효율을 높이게 위해서 개선된 회로를 만드실 필요가 없다는 것입니다.

따라서 강의는 빅데이터 분석에서 중요한 알고리즘을 선별해서 기초부터 심화까지 진행하고자 합니다.
그리고 그 분석을 하기 위한 툴은 R, 그리고 파이썬 프로그래밍, 마지막으로 SQL이 중심이 됩니다.
 
제가 올리는 포스트를 보게되도 모든 것을 이해할수는 없을 것입니다.
하지만 기초적인 흥미와 더 나은 next level를 위해서 디딤게 되는 디딤돌과 같은 역할은 할수 있도록하고자 합니다. 

그럼 많은 관심과 사랑부탁드립니다
감사합니다.


+ Recent posts