- 우리는 특정 변수에 중요한 영향을 미치는 변수들을 찾고, 그들이 각각 목표로하는 변수에 어떻게 영향을 미치는지 파악하고, 나아가 이를 예측하기 위해서 회귀분석을 사용한다.


   하지만 만약 우리가 비만의 정도인 BMI 지수에 영향을 미치는 요인과 그 정도를 파악하고자 하는데 "BMI 지수는 커피를 마신 양의 세제곱을 한 값에 크림을 마신 양의 제곱을 한 것과 미약한 정도의 관련이 있습니다." 라고 이야기한다면 말하는 자신도 그것이 의미하는 것을 이해하기 힘들 것이다.


   그래서 가장 단순하게 생각할 수 있는 것은 단순한 선형 관계이다.

   단순한 선형 관계는 변수들 사이의 관계를 이해하기 쉽게 나타낼 수 있기 때문에 다소 정밀한 예측이 아니라도 많이 사용된다. (정밀도 또한 그렇게 나쁘지 않은 경우가 많다.)


   그렇게 해서 회귀분석을 수행하면 패키지에서 필요한 값들을 출력해준다. 남은 것은 이 값들을 해석하는 것이다. 여기서 어떤 변수가 유의한지, 그 변수에 대한 추정값은 무엇이며 추정값에 대한 표준오차는 어느정도인지, 모형은 적절한지 등을 확인할 수 있다.


   그 중에서 모형이 잘 적합되었는지 판단할 때 R-squared 또는 adjusted R-squared를 사용하고, 모형이 통계적으로 적절한지 판단할 때 F-통계량을 사용한다고 알려져있다.


   사실 이 내용으로 보았을 때, 그 의미가 잘 구분이 되지 않는다. 그냥 보면 R제곱 값이나 F값이나 다 모형이 적절한지 보는 것 같은데 왜 둘을 따로 쓸까? 

   특히 F값은 유의한 정도로 크지만 R-squared 값은 작은 경우는 무엇을 의미할까?


  결론부터 말하자면 두 값은 모형이 적절한지를 말해주는 값이지만 각각 의미하는 바가 다르다.  

  • F-통계량 값은 자유도로 조정된 설명된 변동과 설명되지 않는 변동의 비를 나타낸 것이다. 이 값은 결국 이 관계를 선형으로 볼수 있는가 없는가를 의미한다(즉, 회귀 계수가 유의한가?).
  • R-squared 값은 전체 변동에 대해 모형이 설명하는 변동의 비를 나타낸다. 이 값은 자료들이 우리가 설정한 회귀 직선 주위에 얼마나 밀집되어 있는지를 의미하는 것이다. 이 값이 낮다는 것은 선형에서 많이 퍼져있는 것이다.


   그래서 F값은 유의하지만, R-squared 값이 아주 낮은 경우에는 

1) X가 Y에 미치는 영향은 여전히 유의하다. 


2) 하지만 우리가 추정한 회귀식에서 각 값들의 분산이 커서 예측에 대해서는 신뢰하기 힘들다.

   라고 결론 지을 수 있겠다.



참고) 

http://blog.minitab.com/blog/adventures-in-statistics-2/how-to-interpret-a-regression-model-with-low-r-squared-and-low-p-values

 데이터를 살펴보면, 교과서를 제외한 대부분의 데이터는 결측값을 포함하고 있다.

실제로 처음 분석과제를 접했을 때 이 결측값을 어떻게 처리해야 할까? 에 대해서 많이 고민했고, 그에 대한 합리적인 결과를 내리지 못했던 것 같다.

지금도 머리 속에 정확하게 결측값을 어떻게 다루어야 한다는 체계는 잡히지 않았으나, 이 때까지 생각한 바를 조금 정리해볼 것이다.


< 특정 참고서에 있거나, 연구를 통해 밝혀진 내용이 아닌 뇌피셜임을 밝힙니다! >

   틀린 내용이 있다면 건설적인 피드백을 부탁드립니다.

====================================================================



0. 정확한 예측이 필요한 것이 아니다.

  - 원하는 변수에 대한 (통계적) 예측은 정확할 수 없다. 그래서 대부분의 통계 방법은 (이론적으로) 오차를 최소한으로 하는 방법을 채택한다.


    결측값을 보정하는 것도 이러한 관점에서 접근해야 한다고 생각한다. 우리가 하는 분석은 적절한 insight를 얻거나 Target을 적절히 예측하기 위함인데, 결측값에 대한 보정값으로 예측한 것이 맞는 지 알 수 없는 상황에서 우리가 선택할 수 있는 것은 오차를 최소로 하는 방안일 것이다.


    이러한 관점에서 결측값을 평균(연속형 자료), 최빈값(범주형 자료), 중앙값 등으로 보정하는 것은 합리적이다.


    특히 결측값의 비율이 낮을 때, 이런 방법으로 보정하는 것은 (시간이라는) 비용을 절약할 수 있는 좋은 방법일 것이다.


    당연히 변수에 대한 사전 지식을 가지고 있어 이를 채울 수 있는 경우 (주로 전문가의 자문을 구한다던가...)에는  이것이 오차를 최소로하는 방법이 될 수도 있다. 이렇게 우리는 오차를 최소로 하면서 해당 관측값이 가지는 다른 변수의 정보를 추가해서 모형을 구축할 수 있다.


    중요한 것은 결측값을 정확하게 예측하기 위해 많은 시간을 들이는 것이 과연 필요한 것인지가 중요한 것 같다. 최대한 자료를 끌어모아 결측값을 보정하면 오차를 더욱 줄일 수 있겠지만, 평균이나 최빈값으로 대체했을때의 오차에 비해 그 차이가 그리 크지 않을 수도 있다.






1. 결측 자체가 의미를 지니는가?

  - Kaggle의 House Prices data는 부동산 거래 정보 데이터에서 부동산 가격을 예측하는 competition이다. 여기서 데이터는 약 3,000개의 관측값과 80여개의 변수로 구성되어있다. 처음 데이터를 살펴볼 때, 결측값의 비율을 살펴보았다. PoolQC는 수영장의 품질을 의미하는데 이 변수는 약 2900개의 결측값을 가지고 있었다. 처음에는 결측값의 비율이 너무 높아서 이 변수를 사용할 수 없을 것이라고 생각했지만, 대부분의 가구가 수영장을 가지고 있지않기 때문에 이 값은 사실 상 "수영장을 가지고 있지 않다."를 의미하는 결측이였다. 


    이처럼 결측 자체가 어떤 의미를 가지는 경우가 존재하기 때문에, 결측의 비율이 어떻든 그 의미와 형태를 고려해보는 것은 중요하다.







2. MICE algorithm(?)의 효율성 or 신뢰성



 * 이 글은 

    http://thestatsgeek.com/2013/09/28/the-t-test-and-robustness-to-non-normality/

   의 글을 보고 참고한 내용을 작성한 포스트입니다.


* 항상 T-test를 할 때 궁금한 점이 있었다.

  1) 대표본인 경우 sample의 정규성을 고려하지 않아도 좋은가? (중심극한정리에 의해)

  2) 중심극한정리는 sample의 수가 많을 때, 표본평균의 분포가 근사적으로 정규분포를 따른다는 것을 의미한다. 하지만, T분포의 경우 표준정규분포와 sqrt(S/df)의 비의 분포이므로 카이제곱분포를 또한 근사적으로 sample mean으로 만들 수 있는지를 살펴봐야 한다.

      내가 생각한 바로는 카이제곱 분포의 경우 sample mean 뿐만이 아니라 각각의 Xi들 또한 필요하기 때문에 t분포가 중심극한정리에 의해 대표본 근사하기 어렵다고 생각한다.


이러한 의문을 해결하지 못해서, 검색하던 중 발견한 포스팅이다.


===================================================


 - T-test는 기본적으로 두 집단의 평균이 같은지에 대해서 검증할 수 있는 방법이다.

   이 때 기본적인 가정이 필요하다.


   1) 두 집단은 각각 정규분포를 따른다.

   2) 두 집단은 분산이 동일하다.

   

   가정을 만족하지 않는 경우, 귀무가설이 사실임에도 이를 잘못 기각할 여지가 생긴다.


 - 이 가정에 대한 확장을 고려해볼 수 있다.

   왜냐하면, 기본적으로 raw data는 완전한 정규성이나 등분산성을 만족하기 어렵기 때문이다.


 - 실제로, 이 포스팅은 대표본일 때 t-test가 타당하다는 것을 지지한다.

    (즉, the type 1 error rate 가 0.05로 통제되어진다는 것을 지지한다.)

    이에 대한 근거로 t-test는 각 그룹의 sample mean에 기반한 검정이라는 것을 들고있다.(중심극한정리)

     또한, 표본평균의 표준 오차에 사용하는 추정량이 X의 분포에 관계 없이 일관성이 있고, 그에 따라 자료의 정규성에 영향을 받지 않는다고 말한다.


 - 위 포스팅의 결론 : 

      sample size가 너무 작지 않다면, 데이터의 정규성에 대해서 심하게 걱정할 필요가 없다.(신뢰구간을 구할 때도 마찬가지)

      물론 sample size가 아주 작거나 highly skewed distributions인 경우에는 고려해야한다.


===================================================


 * 이에 다른 이의 댓글이 달린다.

    - 엄격한 정규성에 대한 제한은 효율성을 낮춘다?

    - 비모수적인 검정방법은 교호작용에 대한 검정을 수행할 수 없다?


    - 다른 논문을 언급하며 해당 댓글을 지지한다.

(https://www.annualreviews.org/doi/pdf/10.1146/annurev.publhealth.23.100901.140546)

       < THE IMPORTANCE OF THE NORMALITY ASSUMPTION IN LARGE PUBLIC HEALTH DATA SETS - Thomas Lumley, Paula Diehr, Scott Emerson, and Lu Chen > 


       대표본인 경우 정규성이 대해 크게 걱정할 필요가 없다는 결과를 지지한다.


===================================================


 * 결론은 아직도 뭐가 맞는지 정확하게 모르겠음...














+) 다음은 미니탭 trainer의 포스팅이다.


http://blog.minitab.com/blog/understanding-statistics-and-its-application/what-should-i-do-if-my-data-is-not-normal-v2


    - 시뮬레이션을 통해 non-normal data에 대한 처리를 이야기한다.

       어떤 test는 non-normal에 대해 어느정도 robust하며, 다른 test는 그렇지 않다.

       그중 t-test나 ANOVA는 non-normal에 대해 비교적 robust한 test라고 한다.




+) 회귀분석에 대한 reponse variable의 normaliy


https://stats.stackexchange.com/questions/75054/how-do-i-perform-a-regression-on-non-normal-data-which-remain-non-normal-when-tr


    - LSE 회귀계수를 추정하고, 그것의 유용성을 밝혀낼 때(BLUE, Gauss-Markov theorem) 정규성에 대한 가정이 존재하지 않는다.

    - 이러한 가정은 오직 회귀계수의 추정값이 MLE임을 밝히는데 필요한 것이다.

    - 따라서, 반응 변수의 정규성은 회귀분석에 있어 필수가 아니다.


    - 또한, 독립성이나 등분산성이 훨씬 중요한 가정이며

       위에서 t-test의 경우에도 그렇듯 robust하다.

       적합 후에 residual plot을 확인하는 것이 훨씬 도움된다.


 

## 단순 선형회귀분석 모의실험
   # 미리 정해둔 모수( beta0, beta1, sigma )에 대해 생성한 데이터로 추정하고 맞는지 확인하기

beta0 = 2.5
beta1 = -3
sigma = 4
x = rnorm(100, 10, 4)
y <- beta0 + beta1 * x + rnorm(100, 0, sigma)
data <- data.frame( x,y )
plot(y~x, data)

 

 

# LSE
n=nrow(data)  # obs
Sxx = sum( (x-mean(x))^2)
Sxy = sum((x-mean(x))*(y-mean(y)))

Beta1H = Sxy/Sxx
Beta0H = mean(y)-Beta1H*mean(x)

yH = Beta0H + Beta1H*x
s = sqrt(sum((y-yH)^2)/(n-2))

SE_Beta1H = s/sqrt(Sxx)
SE_Beta0H = s*sqrt(1/n + mean(x)^2 / Sxx )

summary(lm(y~x, data))

  # 직접 구한 결과가 모델에서 구한 결과와 같음을 알 수 있다.
  # 실제 정한 모수와 추정값이 꽤 다른 이유는 표준편차가 크기 때문이다.(sigma=4)

 

 

# 분산분석 in reg
  # ANOVA table
SST = sum((y-mean(y))^2)
SSR = sum((yH-mean(y))^2)
SSE = SST-SSR
R2 = SSR/SST
cor(x,y)^2  # 단순선형회귀에서 R^2값은 상관계수의 제곱과 같음

MSR=SSR/1
MSE=SSE/(n-2)
F=MSR/MSE
pvalue=1-pf(F,1,n-2)

SS=c(SSR, SSE, SST)
df=c(1, n-2, n-1)
MS=c(MSR, MSE, 0)
F=c(F, 0, 0)
pvalue=c(pvalue, 0, 0)
AOV_table=cbind(SS, df, MS, F, pvalue)

summary(lm(y~x, data))

## 잔차 분석
e=y-yH
mean(e)
sd(e)
hist(e)
plot(y,e)


 

## plotting
mod <- lm(y~x, data)
plot(mod)

 



25 Open Datasets for Deep Learning Every Data Scientist Must Work With

https://www.analyticsvidhya.com/blog/2018/03/comprehensive-collection-deep-learning-datasets/



Cheat Sheet of Machine Learning and Python (and Math) Cheat Sheets

https://medium.com/machine-learning-in-practice/cheat-sheet-of-machine-learning-and-python-and-math-cheat-sheets-a4afe4e791b6

유튜브에서 유용한 통계 영상

http://flavioazevedo.com/stats-and-r-blog/2016/9/13/learning-r-on-youtube
https://www.datasciencecentral.com/profiles/blogs/109-commonly-asked-data-science-interview-questions?utm_content=bufferbfa26&utm_medium=social&utm_source=plus.google.com&utm_campaign=buffer



* 앙상블이라는 말은 많이 들어봤지만 머릿 속에 구체화 되지 않았다.


https://www.kaggle.com/erikbruin/titanic-2nd-degree-families-and-majority-voting

다음 게시글에서 "타이타닉 생존 문제"에 대한 분석을 보며 약간의 직관적인 이해를 할 수 있었다.


 - 준비 RF, SVM, GBM(Gradient Boosting Machine)의 3가지 방법을 사용할 때,

   1) 3가지 모델을 통해 결과를 출력하고, 다수결에 의해 최종 생존여부를 결정한다.

   2) 3가지 모델 중 가장 예측력이 좋다고 생각되는 1개의 모델을 선정하고,

       그것을 기준으로 하되, 나머지 2개의 모델이 모두 상반된 결과를 예측하면 이를 따른다.

   3) 각 변수마다 다른 최적의 모델을 결정한다.


등 과 같은 방식으로 앙상블을 구체화한 것을 확인했다.


1. tensorflow를 활용한 linear regression 적용 방법 및 cost minimization


    1) 생각보다 익숙하지 않은 방식의 코딩


    2) 라이브러리 설치하기

        - 특히 matplotlib 패키지가 import 되지 않아 고전했다.

        - 여러 방법을 검색하고 시도했지만 되지 않음.


        - 그러다가 방법을 찾음 (출처 : 아래에 명시 )

        - pycharm에서 [File] - [Settings]에 접속

          Project 탭에서 Interprete에서 matplotlib를 검색하고 install할 수 있다.





2. python에서 tensorflow를 활용한 Gradient Descent

  

  1) Gradient Descent : Cost 함수의 최소값을 찾기 위한 방법


  2) 손으로 미분해서 구한 것과 tensorflow에서 제공하는 minimize를 모두 해보고 

     비교할 수 있음.


  3) 추가로, 중간에 Gradient를 수정할 수도 있음.













출처 :  http://www.polarglow.com/2017/07/04/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%84-%ED%95%98%EB%82%98%EB%8F%84-%EB%AA%A8%EB%A5%B4%EB%8A%94-%EC%82%AC%EB%9E%8C%EC%9D%98-%EB%94%A5%EB%9F%AC%EB%8B%9D-anaconda-python-3-6-matplotlib-pyplot-import/



- 본 게시글은 홍콩과기대 김성훈 교수님의 "모두를 위한 머신러닝" 강의를 보고 개인 공부용으로 작성된 것입니다.



* Tensorflow의 작동방식


  1) Build graph(tensor) using TF operations

      - node / placeholder


  2) feed data and run gragh (operation)

      - sess.run(op, feed_dict={a:[1,3]} )


  3) update variables in the graph (and return values)


  - 예전에 SAS EM을 다룰 때 이미지로 되어있던 과정과 유사한 듯





* 데이터 입력


   1) node1 = tf.constant(3.0, tf.float32)

       - 위의 코딩을 통해 3.0이라는 실수를 입력할 수 있다.


   2) a = tf.placeholder(tf.float32)

       - 다른 노드를 사용해 계산할 때, 미지수로 간주하는 역할을 할 수 있다.

       - print(sess.run(adder_node, feed_dict={a:[1,3], b:[2,4]}))

       : 다음과 같이 feed_dict 인수를 사용해 어떤 미지수를 대입할 것인가를 결정할 수 있다.

         [1,3]과 같이 배열의 형태로 대입할 수 있다.




* Tensor Ranks, Shapes, and Types


  1) Rank

      (1) rank = 0 : Scalar (magnitude)

      (2) rank = 1 : Vector (magnitude and direction)

      (3) rank = 2 : Matrix (table of numbers)

      (4) rank = 3 : 3-Tensor (cube of numbers)

            ...

      (n+1) rank = n : n-Tensor (idea)


  2) Shape

      - tensor의 각 element에 몇 개씩 들어가 있는가?


  3) Types

      - 대부분 tf.float32(- 32bits floating point) 를 사용

+ Recent posts