Data science (105)

반응형

TF-IDF를 통해 sentence classification 해보기


/* 2017.7.7 by 3months.*/


TF-IDF 는 TF/DF 이며, TF(Term Frequency)와 DF(Document Frequency)는 아래와 같이 정의된다.


TF : 현재 문서에서 단어 A가 나타난 횟수

DF : 모든 문서에서 단어 A가 나타난 총 횟수


예를 들어 문서1에서 Mars라는 단어가 3회 나타났고, 모든 문서를 통틀어서 5번 나왔다고 하면

TF-IDF 값은 3/5 = 0.6이다.


문서1에서 Have라는 단어가 100회 나타났고, 모든 문서를 통틀어서는 100000번 나왔다고 하면

TF-IDF 값은 100/100000 = 0.001 이다.


이러한 방식으로 어떠한 단어에 대한 TF-IDF 값을 통해 문서를 feature화 할 수 있고, 이것은 특정 단어의 상대적인 빈도를 나타내주는 값이므로 합리적으로 그 문서를 나타낼 수 있는 feature가 된다.


TF-IDF 모델로 sentence classification


from sklearn.feature_extraction.text import TfidfVectorizer
sentences = ['This is the first document.',
              'This is the second document.',
              'And the third one.',
              'Is this the first document?']
vect = TfidfVectorizer()
X = vect.fit_transform(sentences)
X.todense()


위와 같이 4개의 문장이 있다고 해보자. 그러면 sklearn 라이브러리에서 제공하는 함수를 통해 이를 tfidf vector로 만들 수 있다. 각각의 sentence에 이것을 적용하면 결과 X는 매트릭스가 될 것이다.


y = [1,2,3,4]


위와같이 label을 임의로 정의해보자.


from sklearn.linear_model import SGDClassifier
model = SGDClassifier(loss='logloss')
model.fit(X, y)


tf-idf vectorization을 통해 sentence의 feature를 정의했으면 다시 sklearn의 라이브러리를 이용해 classifier를 만들고, 적합을 시키면된다. 여기서는 SGDClassifier (Stochastic Gradient Descent)라는 linear classifier를 사용하였는데, 아무 classifier나 사용해도된다. (ex LogisticRegression 등등)


X_pred = vect.transform(['My new document third'])

y_pred = model.predict(X_pred)


이제 테스트 데이터를 위와 같이 정의하고 구축한 모델로 예측해보자.


print y_pred


결과

[3]


구축한 모델은 해당 문장을 3번으로 분류했다. third라는 단어가 포함돼서 그런 것 같다. 만약 테스트 데이터에 second라는 단어나 first를 포함시켜보면 모델이 다른 label로 분류한다는 것을 확인할 수 있다.


반응형
반응형

/* 2017.7.7 by 3months */


Vectorization : Low Rank Matrix Factorization

* Coursera의 앤드류 응 교수님의 강의를 머신러닝을 보고 요약한 것입니다. 스스로 공부를 하면서 정리를 한 것이기 때문에 내용 설명이 세세하지 않을 수 있으니 참고해주십시오.



영화 A와 영화 B가 비슷하다는 것을 어떻게 판단할 수 있을까?


위와 같은 영화-사용자 테이블에서 주어진 rating들을 Y라는 matrix form으로 나타내어보자.


또 predicted rating, 즉 rating에 대한 예측값을 위와같은 matrix form으로 쓸 수 있다. 여기서 는 i번 째 사용자의 파라미터 벡터이고

는 j번째 영화에 대한 feature 벡터이다. 예를들어 위 matrix의 1행 1열은 1번 째 사용자 1번째 영화에 대해 내린 rating의 예측값이다.



위의 predicted ratings matrix는 사용자 파라미터 매트릭스 A와 영화 feature 매트릭스 B로 분해할 수 있다.


A = [ - theta1 -

 - theta2 -

 - theta3 -

- ....  -

 - thetan -]


(예를 들어, theta1은 유저1의 사용자 파라미터 벡터)


B = [- x1 -

- x2 -

- x3 -

- ... -

- xm -]


(x1은 영화1의 feature 벡터)


그러면 가 predicted ratings matrix가 된다. 이처럼 매트릭스를 A, B로 분해하는 것을 low rank matrix factorization이라 한다. Optimization을 통해 B 매트릭스를 얻을 수 있고, 최종적으로 i번째 영화의 feature vector인 를 얻을 수 있다. = [x1, x2, x3 ... xn] 으로 나타낼 수 있고 예를 들어, x1 = action, x2= romance, x3 = comedy ... 와 같이 생각해볼 수 있다. 그러면 영화i와 영화 j와 연관되어 있다는 것은 어떻게 알 수 있을까? 그러면 영화 i를 좋아하는 사용자에게 영화 j를 추천해줄 수 있을 것이다.  가장 편리한 measure은 바로 두 벡터의 distance인 이다. 이 값이 작을 수록 두 영화가 비슷하다고 판단할 수 있다.





반응형
반응형

Collaborative Filtering 기초


/* 2017.7.5 by 3months */



 Movie

 Alice

 Bob

 Carol

 Dave

 x1(romance)

x2(action)

 Love at last

 5

 5

 0

 0

?

?

 Romance Forever

 5

 ?

 ?

 0

 ?

?

 Cute puppies of love

 ?

 4

 0

 ?

?

?

 Nonstop car chases

 0

 0

 5

 4

 ?

 ?

 Swords vs. karate

 0

 0

 5

?

 ?

 ?


앞서 contents based approach에서 movie와 user로 이루어진 위와 같은 평점 테이블에서 x1, x2를 알아내기 어렵다는 것을 알았다. (왜냐하면 이 영화가 얼마나 로맨틱한지 얼마나 액션 영화인지 일일이 보고 평가를 내리는 것은 어렵기 때문이다.) 그런데 각 유저들의 feature에 대한 파라미터들을 이미 알고있다고 가정하면 어떨까? 예를 들어 parameter(alice) = [0 5 0], parameter(bob) = [0 5 0], parameter(carol) = [0 0 5], parameter(dave) = [0 0 5] 라고 하자. 그러면 Love at last의 feature은 대략 x0=1, x1 = 1, x2 = 0 라는 것을 알 수 있다. Alice를 예로 들어보면 [0 5 0][1 1 0] = 5 이라서 love at last의 rating이 5가 된다. 이처럼 각 유저들의 parameter들을 안다면 같은 방식으로 다른 영화들의 feature 값을 알아낼 수 있다.





그러므로 위와 같은 optimization 과정을 통해 콘텐츠의 feature vector인 x(i)를 알아낼 수 있다.


정리하면 contents based approach는 콘텐츠의 feature를 통해 유저의 파라미터를 알아내서 이를 통해 rating을 예측하는 것이고, 앞서 설명한 방식은 이와 반대로 유저의 파라미터를 통해 콘텐츠의 feature를 알아내서 이를 통해 rating을 예측하는 것이다. 이는 마치 닭이먼저냐 달걀이 먼저냐와 같은 문제가 된다. 유저의 파라미터를 알면 콘텐츠의 feature를 알 수 있고, 콘텐츠의 feature를 알면 유저의 파라미터를 알 수 있다. 실제로 할 수 있는 것은, random 하게 유저의 파라미터(theta)를 설정하는 것이다. 그리고 이를 통해 콘텐츠의 feature (x)를 추정하고 이를 통해 다시 theta를 설정하고, 다시 x를 설정하는 과정을 반복적으로 수행한다. 이것이 바로 collaborative filtering의 기초적인 아이디어이다.



반응형
반응형
Recommendation System, Contents Based Approach


/* 2017.7.5 by 3months. */


앤드류 응 교수님의 Coursera 머신러닝 강의를 정리한 포스팅입니다.


예 : 영화 평점 예측하기


Movie 

 Alice

Bob

Carol

Dave

 Love at last

 5

 5

 0

 0

 Romance Forever

 5

 ?

 ?

 0

 Cute puppies of love

 ?

 4

 0

 ?

 Nonstop car chases

 0

 0

 5

 4

 Swords vs. karate

 0

 0

 5

 ?


Notation



출처: http://3months.tistory.com/141 [Data Science & Personalized Medicine]

예 : 영화 평점 예측하기


Movie 

 Alice

Bob

Carol

Dave

 Love at last

 5

 5

 0

 0

 Romance Forever

 5

 ?

 ?

 0

 Cute puppies of love

 ?

 4

 0

 ?

 Nonstop car chases

 0

 0

 5

 4

 Swords vs. karate

 0

 0

 5

 ?


Notation



출처: http://3months.tistory.com/141 [Data Science & Personalized Medicine]

예 : 영화 평점 예측하기


Movie 

 Alice

Bob

Carol

Dave

 Love at last

 5

 5

 0

 0

 Romance Forever

 5

 ?

 ?

 0

 Cute puppies of love

 ?

 4

 0

 ?

 Nonstop car chases

 0

 0

 5

 4

 Swords vs. karate

 0

 0

 5

 ?


Notation



출처: http://3months.tistory.com/141 [Data Science & Personalized Medicine]

예 : 영화 평점 예측하기


Movie 

 Alice

Bob

Carol

Dave

 Love at last

 5

 5

 0

 0

 Romance Forever

 5

 ?

 ?

 0

 Cute puppies of love

 ?

 4

 0

 ?

 Nonstop car chases

 0

 0

 5

 4

 Swords vs. karate

 0

 0

 5

 ?


이러한 영화 평점 테이블에서 missing value(?) 을 예측하는 것이 recommendation system의 목적이다. 그렇다면 어떻게 평점을 예측할 수 있을까? 한 가지 방법은 바로 Content Based Recommendation Approach이다.


 Movie

 Alice

 Bob

 Carol

 Dave

 x1(romance)

x2(action)

 Love at last

 5

 5

 0

 0

0.9

 0

 Romance Forever

 5

 ?

 ?

 0

 1.0

 0.01

 Cute puppies of love

 ?

 4

 0

 ?

 0.99

 0

 Nonstop car chases

 0

 0

 5

 4

 0.1

 1.0

 Swords vs. karate

 0

 0

 5

?

 0

 0.9


다음과 같이 영화에 대한 feature가 있다고 가정하자. x1은 romance 장르의 정도를 나타낸다. 그러면 Love at last에 대한 feature vector x_1 = [1 0.9 0] 이라고 하자. (첫번째 원소인 1은 interceptor feature이다.) Romance Forever의 feature vector을 x_2이라하면 x_2 = [1 1 0.01] 이라고 할수 있다.


그러면 이를 linear regression으로 풀 수 있다. 각 사람마다 parameter 3개가 있다고 보고 이 파라미터를 러닝하면된다. 그리고 종속변수는 rating이다. 만약 alice의 파라미터인 parameter(alice) = [0 5 0] 이라고 가정한다면, alice의 cute puppies of love에 대한 평점의 예측값은 [0 5 0][1 0.99 0] = 4.95이다. 지금은 그냥 파라미터값을 임의로 정한 것이지만 이 파라미터들을 러닝할 수 있을 것이다.


이렇게 Contents의 속성을 통해 rating을 예측하는 방법을 contents based recommendation system이라 한다. 이러한 contents의 속성별로 유저가 각각의 속성에 대응하는 파라미터를 가지고 있다고 보면 되는 것이다.




수식으로 표현하면 위와 같다. 우리의 목적은 데이터를 통해 유저마다 존재하는 파라미터를 학습하는 것이다. 이 파라미터와 영화 속성값과의 내적값을 통해 rating을 구할 수 있다.  또한 user j의 평가한 영화의 갯수 m(j)를 regulariztion term에 넣어서 활용할 수 있다. (데이터가 적은 사람은 overfitting을 방지하기 위해 더 regularization한다.)





파라미터 학습 방법은 위와같은 squared error을 최소화 시키면된다. 또한 overfitting을 방지하기 위해 regularization term을 넣어줄 수도있다. 이를 위해서 mle 같은 통계적인 모수 추정방법을 사용할 수 있지만 머신러닝에서는 gradient descent 방법을 일반적으로 사용하여 구하게 된다. gradient descent 방법에서는 iteration을 돌면서 파라미터들을 변경시켜 오차값을 줄이는 방식으로 동작한다.


contents based approach의 단점은 영화나 책에 대하여 feature를 알아내는 것이 어렵다는 것이다. 이 영화가 얼마나 로맨틱한지 얼마나 액션영화인지 그 정도를 수치화해서 feature로 정의하는 것은 간단하지 않다.


반응형
반응형

앤드류 응 교수님의 Coursera Machine Learning 강의를 정리한 포스팅입니다.


추천시스템은 머신러닝 분야의 중요한 응용 분야중의 하나이다. 많은 실리콘 밸리 회사들이 더 좋은 추천 시스템을 만들기 위해 노력하고 있다. 아마존, 넷플릭스 등등의 회사들이 웹 사이트에서 이러한 추천 시스템을 활용하고 있다. 이러한 추천 시스템은 이러한 회사들이 더 좋은 수익을 올릴 수 있도록 도와준다. 그러므로 추천 시스템의 성능을 개선하는 것은 기업의 이익에 큰 영향을 미친다. 추천 시스템 분야는 학계보다는 산업계에서 더 선호되는 분야라고 한다.


예 : 영화 평점 예측하기


Movie 

 Alice

Bob

Carol

Dave

 Love at last

 5

 5

 0

 0

 Romance Forever

 5

 ?

 ?

 0

 Cute puppies of love

 ?

 4

 0

 ?

 Nonstop car chases

 0

 0

 5

 4

 Swords vs. karate

 0

 0

 5

 ?


Notation


n_u = no.users. (= 4)

n_m = no.move (= 5)

r(i,j) = 1 if user j has rate movie i (rating을 한 경우 1로 정의)

y(i,j) = rating given by user j to movie i (only if r(i,j) = 1) (movie i가 user j 에게 받은 평점)



?은 아직 영화를 보지 않고, 평점을 내리지 않은 것이다. 이를 예측하는 것이 바로 기본적인 추천 시스템의 목적이다.



반응형
반응형

/* 2017.7.2 */


Universal Approximation Theorem


Universal Approximation Theorem이란 1개의 히든 레이어를 가진 Neural Network를 이용해 어떠한 함수든 근사시킬 수 있다는 이론을 말합니다. (물론 활성함수는 비선형함수여야합니다.) 재미로 1개의 히든 레이어를 가진 신경망 모델로 실제 함수를 근사시킬 수 있는지 확인해보았습니다.


import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from keras import optimizers
import math

우선 필요한 라이브러리를 임포트합니다.


x = np.linspace(-10, 10, 100)
y = 3*np.sin(x)*np.cos(x)*(6*x**2+3*x**3+x**1)*np.tan(x)

제가 근사시키고 싶은 함수는 위와 같습니다.

y = 3sin(x)cos(x)(6x^2+3x^3+x)tan(x) 라는 함수인데 그냥 생각나는대로 만든 함수입니다.




이 함수의 모양은 이렇게 생겼습니다. Universal Approximation Theorem은 신경망 모델로 이러한 복잡한 함수도 근사시킬 수 있다는 이론인데 한 번 확인해보겠습니다.


우선 여러개의 히든 레이어를 가진 신경망 모델로 확인해보겠습니다.



Multi layer perceptron

model = Sequential()
model.add(Dense(10, input_shape=(1,), activation='relu'))
model.add(Dense(10, input_shape=(1,), activation='relu'))
model.add(Dense(10, input_shape=(1,), activation='relu'))
model.add(Dense(10, input_shape=(1,), activation='relu'))
model.add(Dense(1, activation='linear'))
rms = optimizers.RMSprop(lr=0.01, rho=0.9, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=rms, metrics=['accuracy'])
model.fit(x, y, epochs=3000)


위와 같은 4개의 히든 레이어로 구성된 신경망 모델을 만들고 RMSProp optimizer을 통해 학습하였습니다. 학습된 모델로 구현된 함수는 아래와 같이 생겼습니다.


prediction = model.predict(x) plt.plot(x, prediction) plt.show()




조금 다른 부분도 있지만 잘 근사한 것을 확인할 수 있습니다. 사실 처음에는 adam optimizer을 사용하였는데, loss 한계점 아래로는 떨어지지가 않았습니다. 그래서 learning rate를 조절할 수 있는 rmsprop optimizer을 이용하였고, learning rate를 다양하게 변화시켜가면서 위와 같은 hyperparameter일 때 가장 잘 학습하는 것을 확인하였습니다.



Singlel hidden layer perceptron

model = Sequential()
model.add(Dense(10000, input_shape=(1,), activation='relu'))
model.add(Dense(1, activation='linear'))
rms = optimizers.RMSprop(lr=0.06, rho=0.9, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=rms, metrics=['accuracy'])
model.fit(x, y, epochs=5000)


진짜 universal approximation theorem은 "단 한 개"의 히든레이어로도 이런 것을 할 수 있다는 것이기 때문에 한 개의 히든 레이어만 가지고 함수를 근사시켜보겠습니다. 무려 10000개의 node를 갖는 1개의 히든레이어를 5000 epochs 을 돌려서 다음과 같은 근사함수를 만들어냈습니다.




위의 multi layer perceptron 보다는 못하지만 어느정도 근사할 수 있다는 것을 확인할 수 있었습니다. 노드수, learning rate, optimizer 등을 바꿔가면서 해보면 더 잘 함수를 근사시킬 수 있을 것입니다.



반응형
반응형

Word Embedding


Word Embedding이란 Deep Learning 분야, 이 중에서도 특히 자연어처리에서 필수적으로 알아야할 개념이다. Word Embedding은 Word를 R차원의 Vector로 매핑시켜주는 것을 말한다.



예를 들어 위와 같이 cat이나 mat같은 단어를 특정 차원의 벡터로 바꾸어주는 것이다. 이렇게 단어를 벡터로 바꾸어주는 것은 하나의 Matrix이다. 이를 W라 부른다. W 함수는 매우 중요하다. 이를 통해 단어가 의미 있는 벡터로 변한다. 비슷한 두 개의 단어는 비슷한 벡터로 바뀐다던지 하는 식으로 말이다. W는 Learning을 통해 학습할 수 있다.


예를 들어, 5000개의 단어로 이루어진 단어 세트가 있으면 각각의 단어는 [0,0,0,1,0 ... 0,0,0] (5000열) 과 같이 나타낼 수 있다. 이 때 각각의 단어를 Word Embedding을 통해 32차원 벡터로 나타내고자 하면 W의 차원은 5000*32이다. 이를 학습하여 [0.2,0,4,0.5 ... 0.8,8] 과 같은 32차원의 벡터를 형성해낸다.


Word Embedding은 다음과 같은 놀라운 특성도 가질 수 있다.



woman을 나타내는 벡터와 man을 나타내는 벡터의 차이는 남녀의 차이를 나타내는 벡터이다. 이것이 aunt와 uncle의 차이를 만들어낸다. 예를 들어 he is a man는 옳은문장 she is a man은 틀린 문장을 구분하는 classifier에서 aunt와 uncle에 대해서도 똑같은 일을 할 수 있게 만든다.


참고


http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/

반응형
반응형

임상실험은 사람을 대상으로하는 실험이며, 특정 집단을 대상으로 임의로 그룹을 나누고(Randomization), 그룹별로 처치를 다르게 하여, 그룹별 결과의 차이를 살펴 보는 실험이다. 임상실험은 스터디 디자인 중 메타분석을 제외하면 가장 결과의 타당도가 높은 실험이며, 인과성 추론(causal inference)의 강한 증거가 된다.


예를 들어 10명을 대상으로 임상실험을 한다고 하면


실험 참여자 : {1,2,3,4,5,6,7,8,9,10}


이들 중에 5명은 A그룹으로 A약을 처치하고 5명은 B그룹으로 위약을 처치한다고 하자. 그러면 5명을 임의추출 하여 A 그룹으로 그 이외의 5명을 B 그룹으로 나누게 된다. (일반적인 임의 추출법을 사용하는 경우) 예를 들어,


A : {2,3,7,8,10}

B: {1,4,5,6,9}

(randomization이 잘 됐다면 두 그룹에서 confounder의 분포는 기대적으로 같다.)


임상실험의 장점은 다른 관찰 실험들에 비해 Randomization을 통해 많은 바이어스를 제거할 수 있다는 것이다. Randomization을 잘 한다면, 바이어스의 3가지 종류(selection bias, information bias, confounding bias) 모두 감소시킬 수 있다.


하지만 randomization이 잘 안되었을 경우, RCT에도 바이어스가 생길 수 있는데 그 예는 아래와 같다.


  • Selection bias & confounding bias : randomization이 제대로 되지 않았다면, 그룹별로 기본적인 특성이 달라서 생길 수 있다.
  • Information bias
    • Performance bias : 연구자가 그룹별로 다르게 대우한다면 결과에 바이어스가 있을 수 있다. 예를 들어, 신약 임상실험에서 신약을 섭취한 대상의 예후를 좋게하기 위해 더 케어를 해준다면 이런 바이어스가 나타날 수 있다.
    • Reporting bias : 결과가 좋은 환자만을 대상으로 리포팅한다면 바이어스가 생길 수 있다.
    • Attrition bias : 중도 탈락자에 의해 생길 수 있는 바이어스.

이 때, selection bias와 confounding bias는 눈가림법(bliding method)을 사용하고 표본의 수를 늘린다면 어느정도 해결 할 수 있을 것이다. 하지만 Information bias는 사람에 의해 일어나서 막기가 힘든 바이어스이다. (물론 중도 탈락자한테 돈을 지급해 줄테니 실험에 참여해달라고 할 수도 있다.) 이처럼 여러가지 스터디 디자인 중에 증거력이 좋은 임상실험이라 할지라도 결과에 어느정도 바이어스가 있을 수 있다.






반응형
반응형

적합도 검정이란 Goodness-of-fit 검정이라고 흔히 말하며, 데이터의 분포가 특정 분포함수와 얼마나 잘 맞는지를 검정하는 방법입니다. 가장 많이 사용하는게 정규성 검정인데, 모집단의 분포를 정규분포로 가정하고 하는 분석법, 예를 들어, t-test, anova, 회귀분석 등을 할 때, 데이터가 정규분포를 따르는가를 확인하는데 이 적합도 검정이 필요합니다.


적합도 검정에는 여러 방법이있는데 대표적인 것으로 카이제곱 검정과, Kolmogorov-Smirnov 검정이 있습니다. 카이제곱검정은 기댓값과 관측값을 이용한 방법이며, K-S 검정은 누적분포함수의 차이를 이용한 검정법입니다. 아래는 두 검정법를 비교한 표입니다.



Kolmogorov-Smirnov 검정

카이제곱 검정

 연속형 데이터에 사용 가능

 이산형 데이터에 사용가능. 연속형일 경우 그룹으로 묶어야함

 필요한 표본 크기가 상대적으로 작음

 표본 크기가 충분히 커야 정확도가 높음 (작으면 정확검정)

 모수를 추정해야하는 경우 정확도가 낮음

 자유도에 모수 추정된 것이 반영됨

반응형
반응형

크루스칼-왈리스 검정은 모수적 방법에서의 one-way anova와 같은 목적으로 쓰입니다.


대신 그룹별로 평균이 아닌 중위수가 같은지 아닌지를 검정합니다.



A (98,95,76,95,83,99,82,75,88)
B (95,71,80,81,77,70,80,72,81)
C (77,79,91,84,80,93,87,81,83)



예를 들어, 아래와 같은 세 그룹이 있는 이 세 그룹간의 중위수의 차이가 있는가를 알아보기 위하여 쓰입니다.


즉, H0 : A의 중위수 = B의 중위수 = C의 중위수 vs H1 : 최소 한 그룹의 중위수가 다르다.


이를 검정하기 위한 검정통계량은 아래와 같습니다.




이 때 N은 전체 표본의 수이고, ni는 각각의 그룹의 표본 수 입니다. ri는 표본들을 모두 합친 후 순위를 냈을 때의 그룹별 데이터의 순위값입니다. 만약 중위수가 정말 같다면(H0=True) ri의 평균은 비슷할 것입니다. 다르다면 이 값이 커지게 되고, 유의하게 컸을 때, H0를 기각하게 됩니다.


H의 정확한 분포를 구하는 것은 매우 복잡하기 때문에 그룹당 표본수가 충분하면 H가 자유도 (k-1)인 카이제곱 분포를 따른다는 것을 이용하여 검정할 수 있습니다. (이 때 k=그룹의 수)


R 을 통하여 크루스칼 왈리스 검정을 하는 법은 아래와 같습니다.



value1 <- c(98,95,76,95,83,99,82,75,88)
value2 <- c(95,71,80,81,77,70,80,72,81)
value3 <- c(77,79,91,84,80,93,87,81,83)
category <- c(rep("A",9),rep("B",9),rep("C",9))
data <- data.frame(value=c(value1,value2,value3), category)


kruskal.test(value~category, data=data)



결과

Kruskal-Wallis rank sum test



data: value by category


Kruskal-Wallis chi-squared = 5.6972, df = 2, p-value = 0.05793


반응형