Tools (126)

반응형

오늘 모 워크샵에서 강의를 듣던 중 아래 github의 가상환경이 굉장히 잘 되어있어서 공유합니다. zero_to_deep_learning 이라는 외국 강의가 있는데 이곳에서 사용하는 것이라고 합니다. 이외에도 다양한 예제파일이 있는데 매우 유용하네요.


https://github.com/Dataweekends/zero_to_deep_learning_udemy


방법은 해당 깃허브 폴더를 clone한 후, yaml 파일에 정의된 아나콘다 가상환경을 만들고 이 가상환경을 activate 시킨다음에 파이썬을 사용하시면 됩니다.

반응형
반응형

Keras에서는 Theano Backend와 Tensorflow Backend 둘 중 하나를 골라서 사용할 수 있습니다. 둘 중 어느것을 Backend로 사용하더라도 별 차이는 없습니다. 아주 약간의 차이가 있는데 예를 들어 이미지를 input으로 줄 때 차원값의 순서가 바뀌기도 합니다.


Windows를 사용하는 유저의 경우, Keras를 설치하였다면 사용자 폴더 아래에 .keras 폴더가 있습니다. 이 폴더 아래에 keras.json 파일이 있는데 이것을 수정하시면 Backend를 바꿀 수 있습니다. 물론 Backend도 설치가 되어있어야합니다. 즉 Theano나 Tensorflow를 설치하여야합니다.


파일 경로

C:\Users\(사용자이름)\.keras\keras.json


Theano

{
    "image_dim_ordering": "th",
    "epsilon": 1e-07,
    "floatx": "float32",
    "backend": "theano"
}


Tensorflow

{
    "image_dim_ordering": "channels_last",
    "epsilon": 1e-07,
    "floatx": "float32",
    "backend": "tensorflow"
}


keras.json 파일을 위와같이 수정하면 각각 Theano backend와 tensorflow backend로 구동되어집니다.

반응형
반응형

/* 2017.6.29

파이썬 선형회귀분석 

by 3개월

*/


파이썬 선형회귀분석 (sklearn 라이브러리 사용)



필요한 라이브러리 임포트

import pandas as pd
from sklearn import datasets, linear_model
import matplotlib.pyplot as plt
import numpy as np


데이터 모양 출력

birth = pd.read_csv("C:/workspace/python/data/birth.csv")
print birth.head()
   case  gram  weeks  smoke
0     1  3147     40      0
1     2  2977     41      0
2     3  3119     38      0
3     4  3487     38      0
4     5  4111     39      0


데이터를 간단히 설명하면 산모의 임신주차(weeks)와 흡연여부(smoke)변수를 통해 태아의 몸무게(gram)을 예측하기 위한 예제 데이터입니다. 관측치(row)는 100개가 있습니다.



데이터 나누기

# split data
print len(birth)
birth_train = birth[0:90]
birth_test = birth[91:100]


90%의 데이터를 트레이닝 데이터, 10%의 데이터를 테스트 데이터로 쓰겠습니다.


# basic linear regression
model1 = linear_model.LinearRegression()
x_vars1 = ["weeks", "smoke"]
model1.fit(birth_train[x_vars1], birth_train["gram"])
print model.coef_, model.intercept_

x = np.linspace(25,50,100)

plt.scatter(birth_train['weeks'], birth_train['gram'], c=birth_train["smoke"])
plt.plot(x, x*model.coef_[0]+model.coef_[1]+model.intercept_)
plt.plot(x, x*model.coef_[0]+model.intercept_)
plt.show()


첫 번째 모델 : gram = W1*weeks + W2*smoke + Intercept



우선 교호작용을 고려하지 않은 첫번째 모델입니다. smoke는 0, 1만 갖는 이진 변수이므로 smoke=1 일 때만, W2*smoke는 하나의 상수가 됩니다. smoke=0 인 경우 W2*smoke는 0입니다. 그러므로 smoke=1일 때 W2 값만큼 회귀식의 절편이 이동합니다.


[ 123.76004061 -283.69489986] -1504.60207489


다음 결과를 통해 W1 = 123.76004, W2 = -283.69, Intercept = -1504.60임을 알 수 있습니다.




따라서 결과 플롯은 위와 같습니다. smoke=1일때가 밑에있는 주황색 선입니다. 또한 보라색 점은 smoke=0인 사람을 나타낸 것이고 노란색 점은 smoke=1 인 사람을 나타낸 것입니다.



교호작용을 고려한 모델


# with interaction term
birth["weekssmoke"] = birth["weeks"]*birth["smoke"]
birth_train = birth[0:90]
birth_test = birth[91:100]
model2 = linear_model.LinearRegression()
x_vars2 = ["weeks", "smoke", "weekssmoke"]
model2.fit(birth_train[x_vars2], birth_train["gram"])
print model.coef_, model.intercept_

x = np.linspace(25,50,100)

plt.scatter(birth_train['weeks'], birth_train['gram'], c=birth_train["smoke"])
plt.plot(x, x*(model.coef_[0]+model.coef_[2])+model.coef_[1]+model.intercept_)
plt.plot(x, x*model.coef_[0]+model.intercept_)
plt.show()


교호작용은 effect modification 이라고도 불리며, 한 변수에 의해 다른 변수의 효과가 변하는 것을 말합니다. 이 경우 모델의 식은 아래와 같습니다.



두 번째 모델 : gram = W1*weeks + W2*smoke + W3*(weeks*smoke) + Intercept


왜 weeks*smoke를 곱한 텀을 넣어주나면 이를 통해 weeks의 gram에 대한 effect를 변화시킬 수 있기 때문입니다. smoke=1인경우 (W1+W3)*weeks가 되기 때문에 smoke에 의한 weeks의 effect의 변화를 고려할 수 있게 됩니다.



[  132.01926109  1316.00125169   -41.03706632] -1820.91949297

위 결과를 통해 coefficient와 intercept를 알 수 있습니다.




Mean Squared Error 구하기

print "Model1 Training Mean squared error: %.2f" % np.mean((model1.predict(birth_train[x_vars1]) - birth_train['gram']) ** 2)
print "Model2 Training Mean squared error: %.2f" % np.mean((model2.predict(birth_train[x_vars2]) - birth_train['gram']) ** 2)

print "Model1 Test Mean squared error: %.2f" % np.mean((model1.predict(birth_test[x_vars1]) - birth_test['gram']) ** 2)
print "Model2 Test Mean squared error: %.2f" % np.mean((model2.predict(birth_test[x_vars2]) - birth_test['gram']) ** 2)

마지막으로 Training MSE와 test MSE를 구하는 코드입니다.


Model1 Training Mean squared error: 227136.45
Model2 Training Mean squared error: 223972.58
Model1 Test Mean squared error: 220233.22
Model2 Test Mean squared error: 226638.72


반응형
반응형

SAS 코드


data corr;
input method1 method2;
cards;
132 130
138 134
144 132
146 140
148 150
152 144
158 150
130 122
162 160
168 150
172 160
174 178
180 168
180 174
188 186
194 172
194 182
200 178
200 196
204 188
210 180
210 196
216 210
220 190
220 202
;run;



상관계수 출력 및 모상관계수=0을 검정


proc corr;
var method1 method2 ;
run;



상관계수 출력 및 모상관계수=0.98을 피셔의 방법으로 검정


proc corr fisher(rho0=0.98);
var method1 method2 ;
run;

반응형
반응형

R - 질적변수의 교호작용을 고려한 회귀모델

/* 2017.5.21  */


데이터의 형식은 아래와 같습니다.


  case gram weeks smoke

1    1 3147    40     0

2    2 2977    41     0

3    3 3119    38     0

4    4 3487    38     0

5    5 4111    39     0

6    6 3572    41     0


gram : 태아의 몸무게 

weeks : 임신주차

smoke : 임신기간 중 흡연 여부 



임신주차와 흡연여부 별로 태아의 몸무게가 어떻게 변하는지 설명하는 회귀식을 찾는 것입니다. 임신주차가 길 수록 태아의 몸무게는 무겁고, 흡연을 안할 수록 태아의 몸무게가 무겁다는 것을 예상해볼 수 있습니다.



이 때, smoke는 질적변수이며, 회귀모델을 구축하는 것에는 두 가지 종류가 있을 수 있습니다.



첫 번째는 smoke라는 질적변수에의해 회귀모델의 절편만 차이가 나는 경우

두 번째는 smoke라는 질적변수에 의해 절편과 기울기가 둘 다 차이가 나는 경우 (교호작용을 고려한 경우)



즉, 흡연여부에 의해 임신주차에 따른 태아의 몸무게의 변화가 영향을 주는 것까지 고려한 경우입니다.  이처럼 한 변수가 다른변수의 종속변수에 대한 효과에 영향을 끼치는 것을 다른말로 교호작용이라고 합니다. 예를 들어 흡연을 하는 경우, 임신주차에 따른 태아 몸무게의 증가 폭이 완만할 수 있겠죠.



두 번째 경우에 대해서만 R을 이용하여 모델을 구축하여보겠습니다.




data <- read.csv("C:/태아몸무게.csv") head(data) # 교호작용도 고려한 질적변수 처리 model2 <- lm(gram~weeks*smoke, data=data) coef <- coefficients(model2) inter <- coef[1] weeks <- coef[2] smoke <- coef[3] # 절편의 차이 weeks_smoke <- coef[4] # 기울기의 차 y1 <- inter+weeks*0:50 # non-smoker y2 <- inter+(weeks+weeks_smoke)*0:50+smoke # smoker plot(data$weeks, data$gram) lines(y1, col="red") lines(y2, col="blue")





  • model2 <- lm(gram~weeks*smoke, data=data) 라고하면 weeks와 smoke의 모든 경우에 수를 고려하여 회귀식을 만들겠다는 것입니다.
  • 그러면 weeks의 회귀계수(beta1)와 smoke의 회귀계수(beta2), weeks*smoke(beta3)의 회귀계수가 생기게 됩니다.
  • beta2는 smoke효과로 인한 절편의 차이이며, beta3는 smoke효과로 인한 기울기의 차이입니다.
  • 일반적인 모델에서는 beta3가 없고 절편의 차이만 있는데 교호작용까지 고려하면 기울기의 차이도 고려하는 것입니다.


결과




붉은색은 smoke=0 즉 비흡연자이고, 파란색은 smoke=1 즉 흡연자입니다. 흡연자는 임신주차가 증가하더라도 태아의 몸무게가 완만하게 증가하는 경향을 볼 수 있습니다. 절편값은 흡연자가 더 높은 것을 볼 수 있는데, 이것은 의미가 없습니다. (0주차에 출산하는 경우는 없기 때문) 절편의 효과를 보고 싶다면 centering 기법을 사용하면 됩니다.




반응형

Tools/R

R - 단순회귀분석

2017. 5. 21. 01:16
반응형

R 단순회귀분석



단순회귀모형 만들기 코드



weight <- c(64,75.3,73,82.1,76.2,95.7,59.4,93.4,82.1,78.9,76.7,82.1,83.9,73,64.4,77.6) blood <- c(108,109,104,102,105,121,79,107,101,85,99,100,108,104,102,87) model <- lm(blood~weight) summary(model) # 회귀분석 결과 요약 anova(model) # anova table confint(model) # 회귀계수의 confidence interval




summary(model)의 결과



Residuals: ## 잔차정보 요약

     Min       1Q   Median       3Q      Max 

-17.0962  -2.9774   0.8138   5.5072  13.4990 


Coefficients:  ## 회귀계수의 추정과 회귀계수의 유의성 검정

            Estimate Std. Error t value Pr(>|t|)   

(Intercept)  61.8769    19.1890   3.225  0.00611 **

weight        0.5098     0.2462   2.070  0.05740 . 


F-statistic: 4.286 on 1 and 14 DF,  p-value: 0.0574      ## 모델이 유의한지에 대한 F-Test (분산분석)






anova(model)의 결과



Analysis of Variance Table


Response: blood

          Df Sum Sq Mean Sq F value Pr(>F)  

weight     1  368.8  368.80  4.2861 0.0574 .

Residuals 14 1204.6   86.05                 



  • ANOVA F-test의 p-value와 회귀계수에 대한 t-test의 p-value가 같다. (0.0574)
  • 또한 단순회귀분석에서는 모델이 유의한지에 대한 F-test의 p-value도 위의 p-value와 같다.



confint(model)의 결과



2.5 %     97.5 %

(Intercept) 20.7205466 103.033319

weight      -0.0183444   1.037845


  • 회귀계수의 confidence interval을 구할 수 있다.



Prediction



newdata <- data.frame(weight=95)
predict(model, newdata, interval="predict")
predict(model, newdata, interval="confidence")


  • weight=95일 때, blood의 값을 예측한다. 만약 여러개의 값을 예측하고 싶은경우는 weight=c(95,90,80, ...) 처럼 vector 형식으로 값을 주면 된다.
  • interval=prediction으로 하면 예측구간이고 interval=confidence로하면 신뢰구간이다.



Prediction 결과



 fit      lwr      upr

1 110.3032 87.77959 132.8269

  fit      lwr      upr

1 110.3032 99.74413 120.8623


  • fit이 예측값이고, lwr, upr은 각각 신뢰구간의 lower bound와 upper bound이다.
  • 위와 같이 예측구간과 신뢰구간을 구할 수 있다. 예측구간이 신뢰구간에 비해 넓다. 예측구간은 y에 대한 95% interval이고 신뢰구간은 E(y|x) 에 대한 95% interval이다. 따라서 예측구간이 신뢰구간에 비해 넓은 것이다.


반응형
반응형

이 포스트는 아래 포스팅을 참고한 포스팅입니다.

https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/


Jupyter Notebook


기존에는 IPython Notebook으로 알려졌던 Jupyter Notebook은 코드, 이미지, 분석 결과, 코멘트, 수식 등을 분석자가 "노트북"처럼 Keep할 수 있게하여 다른 사람들이 분석의 흐름을 읽기 쉽게 만들 수 있는 유연하고 강력한 툴입니다. Jupyter Notebook은 여러가지 언어를 지원합니다. (Python, R, Julia 등) 또한 어떤 컴퓨터에서든지 쉽게 호스팅할 수 있습니다. http나 ssh로 접속하기만 하면 됩니다. 또 무엇보다도 Jupyter Notebook은 무료입니다. IPython 프로젝트에서부터 시작된 Juypter Notebook는 Julia, Python, R의 앞 글자를 따시 지어졌고, 파이썬 이외의 여러가지 언어를 지원하기 위하여 시작되었습니다. 주피터에서 파이썬 코드를 실행할 때 내적으로는 IPython Kernel이 돌아가게 됩니다.


1. 키보드 단축키


Help > Keyboard Shortcuts에 가면 키보드 단축키들을 확인할 수 있습니다. 아시다시피 키보드 단축키는 개발에서 시간을 많이 단축해줍니다. 위 메뉴를 주피터가 업데이트될 때마다 확인하시면 좋은데, 키보드 단축키들이 자주 추가되기 때문입니다.


또는 Cmd + Shift + P (또는 Ctrl + Shift + P 리눅스, 윈도우의 경우) 을 누르면 대화창이 뜨는데 키보드 단축키들을 이름으로 검색해서 실행시킬 수 있습니다. 키보드 단축키가 생각나지 않으실 때는 이 기능을 활용하시면 좋습니다.


몇 가지 유용한 단축키롤 소개합니다. 


esc : command 모드로 변경한다.


command 모드 안에서

  • A : 현재 셀의 위에 새로운 셀을 추가한다.
  • B : 현재 셀 밑에 새로운 셀을 추가한다.
  • M : 현재 셀을 markdown 모드로 변경한다. 
  • Y : markdown 모드를 다시 code 모드로 변경한다.
  • D+D : 현재 셀을 삭제한다.
  • Enter : command 모드에서 edit 모드로 변경한다.
  • F : 코드를 find and replace 한다.
  • O : Output을 toggle한다.
shift + tab : 객체의 docstring(documentation)을 출력한다. 

복수의 셀을 선택하기
  • Shift J 나 Shift down(키보드 방향키)을 누르면 아래방향으로 복수의 셀을 선택할 수 있다. Shift K나 Shift Up을 누르면 위 방향으로 복수의 셀을 선택한다. 
  • 복수의 셀이 선택되면 마찬가지로 delete, copy, cut, paste, run을 할 수 있다. 
  • Shift M을 누르면 선택된 셀들을 merge 한다.

2. 변수를 이쁘게 출력하기


가장 널리쓰이는 방법은 print 문을 안 쓰고 그냥 변수명만 셀에 쓴 다음에 run을 하는 것입니다. 그러면 IPython Kernel이 해당 객체를 이쁘게 나타내주는데 예를 들어 pandas DataFrame을 출력할 때 유용한 방법입니다. 


덜 알려진 방법은 kernel 의 세팅을 바꾸면 여러개의 변수명에 대해서 output을 내줄 수 있다는 것인데

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
import pandas as pd


위와 같이 세팅하면


data = pd.DataFrame({'a':("A", "B","C","D","E","F","G"), 'b':(1,2,3,4,5,6,7)}) data.head() data.tail()

Out[11]:
ab
0A1
1B2
2C3
3D4
4E5
Out[11]:
ab
2C3
3D4
4E5
5F6
6G7


위와 같이 여러개의 statement가 있어도 그 statement의 수만큼의 output을 내줍니다. (세팅을 안 하게 되면 가장 마지막 output 만 나타내줍니다.)


~/.ipython/profile_default/ipython_config.py

 

일일이 세팅을 해주기 귀찮으면 위의 코드를


c = get_config()

# Run all nodes interactively
c.InteractiveShell.ast_node_interactivity = "all"

이렇게 바꾸어주면 일일이 코드상에서 세팅해주지 않아도 됩니다.



3. 라이브러리 도큐먼트를 쉽게 찾기


Help 메뉴에 가시면 Scipy, Numpy, Matplotlib, Pandas와 같은 흔히 쓰이는 라이브러이의 도큐먼트를 확인할 수 있습니다. 또한 코드상에서 ? 접두사를 붙여서 라이브러리의 도큐먼트를 확인할 수도 있습니다.


?str.replace()


Docstring:
S.replace(old, new[, count]) -> str

Return a copy of S with all occurrences of substring
old replaced by new.  If the optional argument count is
given, only the first count occurrences are replaced.
Type:      method_descriptor




반응형
반응형

SAS - Signed Rank Sum Test



Dataset


아래 데이터는 대두콩군과 천식군 내에 CD3+ T-cell의 개수를 나타낸 데이터이다.

대두콩군과 천식군의 CD3+ T-cell에 유의미한 차이가 있는지 알아보자.


Code


proc import datafile = '/folders/myshortcuts/myFolders/data/asthma.txt' out=asthma replace;
run;
proc univariate data =asthma normal;
run;
proc npar1way data=asthma wilcoxon;
 class group;
 exact wilcoxon;
 var x;
run;



결과



proc univariate 로 정규성 검정결과 표본이 정규분포를 따르지 않는다고 결론내린다. 또한 두 그룹이 독립적이므로 Wilcoxon rank sum test를 한다.




proc npar1way는 비모수 검정을 위한 프로시져이다. 결과는 위와 같다.

signed rank sum test의 귀무가설은 '그룹간의  값들의 중위수에는 차이가 없다.'이다.

p-value가 0.05보다 작으므로 유의수준 5% 내에서 귀무가설을 기각하고, 그룹간에 유의미한 차이가 있다고 결론 내린다. 



반응형
반응형

SAS를 통한 비모수 검정


1. Paired Sample에 대한 Sign Test와 Signed Rank Test 



위 데이터셋은 특정 공군부대에 배치된 14명 신병들의 치주에서 부착상실을 보인 위치들에 대한 백분율을 비교한 자료이다.

치료전(before)과 치료후(after)의 변화를 보고 해당 치료법이 부착상실을 치료하는 효과가 있는지를 평가해보자. 이 경우 한 사람에 대해 Before과 After를 측정했으므로 해당 sample은 paired 되어있다고 말한다.


two-related sample에 대한 비모수 검정은 sign test signed-rank test가 있다. 이 두 가지 검정을 모두 하는 PROC UNIVARIATE 프로시져를 사용한다. 


proc import datafile = '/folders/myshortcuts/myFolders/data/attachment.txt' out=attachment replace;
run;
data attachment;
 set attachment;
 diff = before-after;
run;
proc univariate data=attachment normal;
 var diff;
run


proc univariate 의 normal 옵션을 주면 data에 대한 정규성 검정을 한다. 정규성 검정의 결과를 보면 p-value < 0.05로 매우 작으므로 유의수준 5% 내에서 정규분포를 따르지 않는다. (p-value가 낮다는 것은 그만큼 귀무가설을 기각하는 쪽으로 힘이 실린다.) 표본이 정규분포를 따르지 않으므로 모수적 검정보다는 비모수적 검정을 하는 것이 좋다.

two-related sample에 대한 비모수 검정은 sign test와 signed-rank test가 있다.


univariate 내부에 var diff; 를 입력하면 diff에 대한 비모수 검정을 하게된다. (diff = before-after)

'부호'라고 표시된 부분이 sign test이고 '부호 순위'라고 표시된 부분이 signed-rank test이다.


sign test와 signed-rank test의 귀무가설은 diff의 중위수 = 0 이다. 이 때의 p 값은 sign test에서 0.0923이고 signed-rank test에서 0.0942 이므로 두 개의 검정 모두 유의수준 5% 내에서 귀무가설을 기각하지 못한다.




반응형
반응형


Data set



위의 Data set에서 age가 0~10일 때는 1, 10~20일 때는 2 ... 90~100 일 때는 9인 새로운 범주형 변수를 생성하고자 한다.


Code


/* 연령 category */
data workshop.data3(replace=yes);
    set workshop.data3;
    do i = 0 to 9;
        if age >= i*10 & age < i*10+10 then cage = i;
    end;
    drop i;
run;




Do end문과 if then 문을 통하여 위와 같이 간단하게 구현할 수 있다. 마지막으로 SAS 는 임시변수도 Data set 내부에 변수로 저장하므로 drop i; 를 통해 임시변수를 없애준다.




반응형
반응형