[ADP] 5장-3절 분석(2단계)

가. 분석 대상의 구체화

(1) 2차 탐색
– 탐색을 통해 찾아낸 관계들 사이의 우선순의를 조정
– 잘라보기, 달리보기, 내려다보기, 올려다보기, 측정값, 차원값 조정 등을 다시 점검

(2) 분석 목표에 따른 분석 기법
– 패턴 자체를 확률적으로 검증하거나 패턴을 구성하는 핵심 함수의 모델 도출 등 분석

-평균에 대한 검정과 추정 : T 검정
-비율에 대한 검정과 추정 : 직접확률계산법, F분포법
-분할표의 검정 : 카이제곱 검정, Fisher의 직접확률 검정, 맥네마의 검정, 잔차 분석
. 각각 2개 이상의 분류값을 지닌 2개 이상의 차원이 있고, 그 결과로 하나의 측정값이 있을때,
분류 조합에 따라 측정값에 유효한 차이가 발생하는지를 점검
– 변수간의 상간관계 : 상관분석
. 독립적으로 움직이는 두 변수들 사이의 관계의 강도를 상관계수로 표현
– 변수들 간의 선형/비선형 인과 관계 : 회귀분석, 다중회귀분석,로지스특회귀,판별분석
. 종속적으로 움직이는 두 개 이상의 변수들 사이의 관계의 강도를 결정 계수로 나타내고, 각
변수의 계수를 추정해 모델화 함. 변수들은 연속적인 값일 수도 있고 분류값일 수도 있음
– 결과에 영향을 미치는 요인들 사이의 관계와 핵심요인 선별 : 요인분석, 주성분 분석
. 어떤 측정값에 변화 요인이 되는 값들이 세개의 차원이라고 할 때, 각 차원들 중에 어떤 것이
측정값에 가장 큰 영향을 미치는지, 각 차원은 다른 차원의 영향력과 어느 정도 겹치는지 분석
– 대상을 기준값에 따라 분류, 다차원 공간에 배치 : 군집분석, 다차원척도법(MDS)
. 측정값과 차원 값을 기준으로 측정값 사이의 거리를 계산하여 적절하게 그룹핑
– 차원값들의 패턴이 비슷한 측정값과 그렇지 않은 측정 값 분류 : 대응 분석
– 시간의 흐름에 따라 변하는 데이터 분석 : 시계열 분석

나. 분석과 시각화 도구
그래프를 통해 시각적으로 확인해보지 않고 함수식을 통해 도출된 예측값만으로 데이터를
보면 현실적인 가정 및 조건 등을 놓칠 수 있다. 예측된 추정 결과값이 절대로 어느 값 이상은
나올 수 없다든가. 현재 보유 데이터에 대해서는 적절한 추세선의 모양이 나오지만 어느 범위
이상의 예측값에 대해서는 그래프로 보면 추세선 자체에 문제가 있다던가 이런 부분들은
수치만으로는 판단하기가 어렵다.

다. 지표 설정과 분석
지표란 어떤 현상의 강도를 평가하는 기준이 되는 숫자로써 기업의 업무 성과 같은 경우에는
KPI (핵심성과 지표) , 기상예보에서 오늘의 강수 확률 같은 것을 말한다.

(1) 지표의 기본 구조
A,B,C 사이의 관계를 도출하였고 이것을 기반으로 D,E,F 사이의 관계를 살펴보는데 사용
하고자 할때, 앞에서 분석한 관계를 무언가 하나의 지표로 축약하면 다른관계를 살펴보기위한
기준으로 삼기가 훨씬 편해진다.
* X = abs(A,B) / C 와 같은 식으로 함수식으로 도출

(2) 지표 활용 시 주의점
지표는 원본 데이터에 추가되는 새로운 데이터이지만 지표를 구성하는 원본 데이터와 강력한
인과 관계를 맺고 있는 특수한 성격의 데이터이기 때문에 아래와 같은 사항을 주의해 함
– 지표의 단위를 고려해야 함 (X = A * B * C 라면 X는 m^3 가 됨 )
– 지표의 단위과 시각화 도구의 표현 공간 상의 다른 데이터와 적절하게 표현되는지 확인
– 새로 생선한 지표가 기존 지표와 중복 사용되면 모델의 설명력이 과대 평가 될 수 있다.

5장-2절 탐색 단계

가. 사용 가능한 데이터 확인
(1) 데이터 명세화 : 차원과 측정값
대상을 국가별 남성의 평균 수명이라고 하면 아래과 같이 예를 들 수 있다.
– 측정값 :  평균 나이 값
– 차원값 : 국가 , 성별
. 하나는 1차원, 두개 이상은 다차원이라고 명명 함
. 시간 연속 데이터는 일,연 단위로 묶어서 차원을 관리하기도 함

– 데이터의 형태
. 정수형 : -2 , -1, 0, 1, ,2, 3 과 같이 0, 음,/양의 비연속 수치
. 실수형 : 3.14와 같이 소수점을 포함하는 정수가 아닌 연속형 수치
. 문자형 : 하나의 문자 또는 문자들의 집합인 문자열
. 날짜형 : 열,월,일 과 같은 형태
. 고유 분류 : 예) 성별은 기본적으로 문자형이지만, 남자와 여자의 두가지 고정된 분류 값

(2) 데이터 구성 원리 1 : 이벤트 기록으로 서 접근
– 데이터로부터 통찰을 끌어내기 위해서는 데이터가 어떤 원리로 생성,구성되었는지를 항상
염두에 두고 있어야 한다. 이 구성 원리를 통해 궁극적으로 알아내고자 하는 것은 자료의
태생적 연결고리 탐색이다.
예) 동시 접속자 정보를 수집하고자 할때, 주어진 데이터의 이벤트는 접속이며, 접속의
특성상 동일 접속자의 중복을 제거해야 정확한 동시 접속자 정보 수집이 가능

(3) 데이터의 구성 원리 2: 객체지향 관점에서의 접근
– 객체지향론에서는 기본적으로 대상을 객체화 하는데, 모든 객체들은 행위와 고유 속성
값을 갖게 된다.
– 예) 학생이 어느 장소에서 언제 시험을 본다.
. 학생 (성별, 나이, 등.. )
. 장소 (건물, 주소, 동, .)
. 언제 (년,월,주말, 주일)
. 시험 (종류, 난이도.. )
위와 같으 방식으로 데이터를 나누고 구체화 하는 것을 객체관점 접근이라고 함

나. 연결 고리의 확인
  만약 데이터가 데이터가 하나만 있으면, 연결고리라고 할만 한 것이 없어 바로 데이터 내에서
연결관계를 찾으면 되지만, 사용가능한 데이터가 복수일 경우 데이터 명세서를 통해서 연결
고리를 찾아 낼 수 있도록 한다.
(1) 공통 요소 찾기
– 데이터 항목명이 아닌, 해당 항목의 정의와 데이터형을 보고 찾아야 함
예) 부모 자식간의 성 , 학생들의 동일 학년 반 등 ..??

(2) 공통 요소로 변환 하기
– 대표적으로 시간, 장소 혹은 동일 대상이 다른 명칭 관리는 공통 요소로 변환이 가능하다 .
예) 다른 나라의 시간 , 지명주소와 GPS 주소
. Spread Sheet 에서 제공하는 문자열 처리 함수 (split, find, left, mid)
. 위치변환(geocoding) : 비즈GIS – X-Ray Map

(3) 탐색 범위의 설정
– 모든 측정값과 차원의 조합이 탐색 범위가 되지만 현실적으로 모든 대상을 탐색하는
것은 어렵다. 이때문에 탐색 범위를 설정할 필요가 있으며, 탐색범위 설정시에는
아래와 같은 내용들을 고려하여야 한다.
– 복수 데이터일 경우 하나의 데이터 내에서 먼저 탐색
– 하나의 차원부터 탐색을 시작하여 복수의 차원으로 탐색 범위를 늘림
– 같은 데이터에서 차원과 측정 값을 바꾸면 다른 통찰을 찾아 낼 수 있다
– 비주얼 인사이트를 활용하여 목표에 관련된 조합을 찾는다
– 상식적으로 관련이 있을 수 없는 관계는 배제하도록 한다.

다. 관계의 탐색
탐색과 관계의 대상이 되는 관계는 크게 상관관계와 인과관계로 나뉜다.
인과관계는 상관관계 중에서도 명호가하게 원인과 결과를 시간적 선후 관계가 있는과관계로 볼 수 있으며, 인과관계가 있는데 상관관계가 없는 경우는 없다

(1) 이상값 처리
이상값은 다른 관측값들과 동떨어진 값을 의미한다.
– 데이터 측정시 오류가 발생
– 측정 후 기록/관리 단계에서 오류 발생
– 오류가 아닌 의미있는 이유 때문에 발생

이상값 제거의 예
. 숫자가 들어가기로 되어 있는 컬럼에 Text
. 의도된 범위를 초과하는 값
. 시각화를 통한 이상치 제거

(2) 차원과 측정값 유형에 따른 관계 파악 시각화
시각화를 잘하려면 측정값을 바라보는 적절한 관점을 설정해야 한다.
1차원, 2차원, 3차원 등으로 시각화를 할 수가 있으며, 1차원으로 유용하게 시각화를
하는 방법은 거의 없다. 시각화시 각 축은 차원변수가 될수도 있고 측정값이 될 수도
있다. 3차원이 보기에는 멋지지만 데이터가 많아 질 경우 원근감의 혼돈으로 인해
오히려 혼돈을 줄 수도 있으며,  그런 경우 2차원 그래프에 색상으로 구분하는 방법도
사용이 가능하다.
– 그래프의 축은 차원 값만 지정할 수 있는 것이 아니다.
– 2차원 평면에서 도형의 면적도 연속값으로 된 차원을 처리하는 도구가 된다
– 색상은 구분 값으로 된 차원을 처리하는 유용한 방법이다
– 연속값으로 된 차원을 색상 그라데이션 변화로 처리 할 수도 있다

– 시각화 분석 방법
. x 축에 시간을 설정해 평면이나 공간상에 데이터를 뿌리고 변화의 모습을 관찰
. 모션차트 : 시간이 흐름에 따라 시간 외의 달느 차원에 있는 측정 값들이 어떻게
변화하는지를 움직임을 통해 보여준는 도구
. 워들 : 문장들 안에 어떤 의미를 지니는 단어들이 어떤 빈도로 분포하는지 탐색 등

(3) 잘라보고 달리보기
잘라보기(slice) : 전체 연령 데이터 중에 20~30대 데이터만 필터링해서 본다던지..
달리보기(Dice) : 차원을 기준으로 잘라내 서로 다른 관점의 단면들을 살표 봄

(4) 내려다보고 올려다보기
내려다보기 (Drill Down) :  현재 관점에서 더 세분화해서 보는 것
올려다보기 (Reverse Drill Down) : 현재 관점에서 더 상위 계층의 관점에서 보는 것
예) 일, 주, 월, 분기 , 연 단위 변화

(5) 척도의 조정
서로 범위가 다른 데이터를 같이 표현하는 경우 범위가 적은 데이터의 패턴이 잘 표현되지 않는 경우가 있다.
–  시각화 도구 예 : Sparkline Chart

 

5장-1절 시각화 인사이트 프로세스의 의미

가. Insight 통찰력
– 영문 의미와 한글 의미의 주요 공통점은 정보, 인과관계, 본질, 이해

(1) 데이터, 정보, 지식, 지혜, 관계
1Level : 지혜 – 적용된 지식
. 지역별, 기후 반복주기 최대치를 고려한 관계
2Level : 지식 – 조직화된 정보
. A 마을의 강수량과 지형조건, 배수 시설 등의 정보를 고려한 관계
3Level : 정보 – 연관된 요소들
. 수해 대책이 몸에 밴 특정 주민의 삶의 노하우
4Level : 데이터 – 개별적인 요소 하나하나
. 마을 주민의 생활 노하우

나. 시각화와 인사이트
문제가 눈에 보이도록 시각화하는 것은 통찰에서의 핵심적일 역할을 함

(1) 삼찰 : 관찰, 성찰, 통찰
– 관찰 : 대상사이의 상호 작용을 주의깊게 살펴 의미있는 관계를 찾아 냄
– 성찰 : 자신의 내면 세계를 깊이 살핌
– 통찰 : 내부 외부 요인들 간의 관계를 통해 살펴 대상과 대상들 사이의 숨겨진 관계를 찾음

(2) 통찰 과정의 시각화
– 1단계 (탐색) [대상 : 자료] [목표: 자료사이의 관계] [시각화 형태 : 패턴 파악]
. 자료들 간에 어떤 관계들이 있고 어떤 관계들이 가능한지 최초로 살펴보는 단계
. 탐색 대상은 데이터, 정보, 지식, 지혜까지 전체 대상을 포함
. 특정한 방향을 정하지 않고 모든 가능성을 열고 탐색을 진행

– 2단계 (분석) [대상 : 자료간 관계] [목표: 관계의 구체화] [시각화 형태 : 그래프 분석]
. 관계의 형태를 명확하게 규명하고 그 형태가 지니는 의미를 찾아내는 과정
. 데이터간의 구체적인 관계를 찾거나 그 관계를 더 잘 설명할 수 있는 데이터를 찾는 과정

– 3단계 (활용)  [목표: 내부적용,외부설득,정교화] [시각화 형태 : 인포그래픽]
. 찾아낸 특정한 원리나 모델을 서비스나 제품의 구동 원리에 직접 반영
. 도출한 통찰을 다른 사람에게 설명하거나 설득
다. 예) 당일 할인 숙박권 판매 서비스의 최적화
– 기본적으로 쇼핑몰 비지니스이기 대문에 어떤 상품을 소싱하고 어떻게 전시하느냐에 따라
매출 규모가 크게 달라진다. 특히 모바일 디바이스의 특성상 작은 화면에서 상품 목록을
보여 주어야 하기 때문에 어떤 순서와 형태로 상품을 보여주느냐가 매출에 대한 핵심 통찰

Neural Net 활용

AI 의 대표적인 방법론인 Neural Net 의 활용 방안에 대한 아이디어를 찾기 위해서는 기존에 어떤 분야에 활용되는지를 알 필요가 있다.

http://www.alyuda.com/products/forecaster/neural-network-applications.htm

가) Financial
(1) 주식시장 예측 : 오픈, 최고, 최저, 마감, 가격 등으로 주식 시장 예측
(2) 신용도 예측 : 개인 데이터, 수입, 지출, 신용 History 등 활용
(3) 회사 신용도 : 회사의 재무적인 지표 등으로 신용도 예측
(4) 부도 예측
(5) 자산관리/증식
(6) 거짓말 탐지
(7) 가격 예측
(8) 경제 지표 예측

나) Medical
(1) 의학적 진료 : 환자개인 정보, 증상 패턴, 맥박, 혈압으로 병명진단
(2) 의학적 현상 감지 : 간질발생 예측, 신체 이상 기관 사이즈 등 수치 예측
(3) 생존일 예측
(4) 치료비용 예측

다) Industrial
(1) Process Control : 최적의 컨트롤 세팅, 과거의 이력을 신경망을 통해 수식화
(2) Quality Control : 원재료의 품질 예측, 결함 예측, 디젤 테스트, 타이어 테스트 등
(3) Temperature and force prediction in mills and factories

라) Science
(1) 패턴인식
(2) 재료와 화학식 최적화
(3) 화학 혼합물 식별
(4) 물리 시스템 모델링
(5) 환경시스템 평가
(6) 고분자 화합물 식별
(7) 유전자 인식
(8) 식물 분류
(9) 신호 프로세싱
(10) 생물학적 시스템 분석
(11) 심층 OZone 예측
(12) 향기 식별

마) Educational
(1) 학생 성취도 예측

바) Data Mining
(1) 예측 : 다양한 데이터 셋으로 미래의 일의 예측
(2) 분류 : 데이터를 특징으로 분류
(3) 변화와 편차 검출
(4) 지식 탐색 : 기존에 정의되지 않은 데이터간의 관계 도출
(5) Response Modeling
(6) Time Series Analysis

사) Sales and Marketing
(1) 판매 예측 : 마케팅 비용, 광고수, 할인행사 등이 세일에 주는 영향
(2) 타겟 마케팅 : 고객 맞춤형 마케팅
(3) 서비스 수요 예측 : 식당 이용자 수, 서버접속자 등을 예측 적절하게 대응 할 수 있도록
(4) 판매 마진 예측 :  제품 가격, 마케팅 비용, 시장 상황 등이 마진에 주는 영향

마) Operational Analysis
(1) 판매 목록 최적화 : 소비자를 만족시키는 최적의 판매 목록 구성
(2) 스케줄 최적화 :  비행기, 버스, 비행기 스케줄 최적화
(3) 경영 의사 결정
(4) 현금흐름 예측 : 자원의 활용 극대화, 현급 희름의 정확한 예측

바) HR Management
(1) 직원 고용
(2) 직원 근무 기간 : 직원이 회사에 머무를 것으로 예상되는 기간 예측
(3) 필요 직원 수 예측 : 식당, 은행 등에 필요할 것으로 예상되는 인원 예측
(4) 개인 프로파일링 : 트레이닝의 효과, 직원의 업무 적합성
(5) 직원 기여도 : 직원이 회사에 기여하는 정도 평가

사) Energy
(1) 에너지 저장 예측
(2) 에너지 소요 예측
(3) 원유/가스 가격 예측
(4) 수력발전소 모니터링
(5) 발전 컨트롤 시스템
(6) Short and Long-Term Load Estimation

아) Other
(1) 도박
(2) 경마 등
(3) 기상 예측
(4) 게임 개발
(5) 문제 최적화
(6) 농업 생산 평가

 

[예제]

this is a good example of reinforcement algorithm

 

모바일 지자기 정보

 

1. 안드로이드 지자기 정보 활용

sensor magnetic

IPS 에서 지구 자기장 강도를 Finger Print 방식으로 실내에서 위치를 찾는다고 하는데 실제 Android 코드로 어떤 값이 어떤식으로 수집되고 사용되는지 알아보고자 하였다.

Android Sensor 에서는 자기장에 대하여 X,Y,Z 방향에 대한 자기장 강도를 리턴하는 것으로 확인하였으며, 각각의 값은 스마트폰의 회전 등 움직임에 크게 영향을 받기 때문에Finger Print 방식으로 지자기 값을 사용하고자 한다면 자기장의 총량 값을 사용하는 것이 맞는 것으로 보이며, 총량값은 간단하게 아래와 같이 계산된다. (그림에서 보면M값)

Math.sqrt( (Xvalue*Xvalue) + (Yvalue*Yvalue) + (Zvalue*Zvalue) );

K-060

fingerprint 방식으로 건물 전체의 지자기 값을 측정하여 그림으로 표현한다면 위와 같이 될 것 같다. 다만, 지자기 값은 같은 위치에서도 높낮이 방향등에 따라 상당히 예민하게 값이 바뀌기 때문에 이를 보정하기 위한 아이디어들이 필요할 것으로 보인다.

물론 지자기 값을 일반적인 건물에서 사용하기 위한 많은 알고리즘들이 수년전부터 사용화 되어 있다. 다만, 이러한 지자기 데이터는 철골 구조물이 고정적이라는 가정하에 사용되고 있어, 공장과 같이 철골 구조물이 이동하는 경우에는 정보 왜곡이 발생할 수 있어 애로 사항이 발생한다.

이러한 문제를 해결하기 위하여 앞으로 더 자료를 찾아보고자 하는 내용은 아래와 같은 철골 구조물에 의한 자기장 왜곡을 시뮬레이션 할 수 있는가 여부이다.

Magnetic%20Field%20Distortion-web

[참조 논문] Numerical analysis of the magnetic field for arbitrary magnetic susceptibility distributions in 3D  (35.9 달러 -_- ;; 유료..)

This paper demonstrates a method to calculate the magnetic field distribution in and around a 3D object when it is magnetized by a strong homogeneous magnetic field. The numerical technique is based on the explicit finite difference method. The calculation method is validated against analytical solutions for a sphere. As an application cylinders with different ratios of lengths and diameter are studied.

http://www.sciencedirect.com/science/article/pii/0730725X94923574

 

[예제]

public class TestOrientationActivity extends Activity implements SensorEventListener
{
// 센서 관련 객체
SensorManager m_sensor_manager;
Sensor m_acc_sensor, m_mag_sensor;

// 데이터를 저장할 변수들
float[] m_acc_data = null, m_mag_data = null;
float[] m_rotation = new float[9];
float[] m_result_data = new float[3];

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// 시스템서비스로부터 SensorManager 객체를 얻는다.
m_sensor_manager = (SensorManager)getSystemService(SENSOR_SERVICE);

// SensorManager 를 이용해서 가속센서와 자기장 센서 객체를 얻는다.
m_acc_sensor = m_sensor_manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
m_mag_sensor = m_sensor_manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
}

// 해당 액티비티가 포커스를 얻으면 가속 데이터와 자기장 데이터를 얻을 수 있도록
// 리스너를 등록한다.
protected void onResume() {
super.onResume();
m_check_count = 0;

// 센서 값을 이 컨텍스트에서 받아볼 수 있도록 리스너를 등록한다.
m_sensor_manager.registerListener(this, m_acc_sensor, SensorManager.SENSOR_DELAY_UI);
m_sensor_manager.registerListener(this, m_mag_sensor, SensorManager.SENSOR_DELAY_UI);
}

// 측정한 값을 전달해주는 메소드.
public void onSensorChanged(SensorEvent event)
{
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
m_acc_data = event.values.clone();
} else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
m_mag_data = event.values.clone();
}

// 데이터가 존재하는 경우
if(m_acc_data != null && m_mag_data != null) {
// 가속 데이터와 자기장 데이터로 회전 매트릭스를 얻는다.
SensorManager.getRotationMatrix(m_rotation, null, m_acc_data, m_mag_data);
// 회전 매트릭스로 방향 데이터를 얻는다.
SensorManager.getOrientation(m_rotation, m_result_data);

(float)Math.toDegrees(m_result_data[0]);  //방위
(float)Math.toDegrees(m_result_data[1]);  //경사
(float)Math.toDegrees(m_result_data[2]);  //회전

m_mag_data[0] ; // 자기장 X 방향
m_mag_data[1] ; // 자기장 Y 방향
m_mag_data[2] ; // 자기장 Z 방향

//자기장 총량의 값은 0 ~ 200 , 실질적으로 지구에서는 20 ~ 70
double teslaXYZ = Math.sqrt((m_mag_data[0] *m_mag_data[0] )+(m_mag_data[1] *m_mag_data[1] )+(m_mag_data[2] *m_mag_data[2] ));

…. (중략)

 

R- 시계열 모형

1. 정상성

– 평균이 일정하다. 즉 모든 시점에 대해 일정한 평균을 가진다.

– 분산도 시점에 의존하지 않는다

– 공분산은 단지 시차에만 의존하고 실제 어느 시점 t,s 에는 의존하지 않는다.

대부분의 경우 실제의 데이터는 이러한 정상성을 만족하지 않는다.

그래서 정상성을 만족하지 않는 데이터를 정상 시계열 데이터로 변환해야 하는데

이때, 변환, 차분과 같은 방법을 사용할 수 있다.

일반적으로 평균이 일정하지 않는 경우에는 차분을 이용하고, 분산이 일정하지 않은 경우에는

변환을 이용하여 정상 시계열 데이터로 변환한다.

차분의 경우 바로 전 시점의 데이터를 빼는 것을 일반차분, 계절성을 갖는 데이터의 경우 여러 시점전의

데이터를 빼는 계절차분을 사용한다.

2. 시계열 모형

– 자기 회귀 모형 (AR)

: P 시점전의 자료가 현재 자료에 영향을 주는 모형

Z(현재 시점) = Z (현재-(P+1)) * (영향도 계수) + Z (현재-(P+2)) * (영향도 계수) + …. + 백색잡음

–> AR(1) : Z = @Z(t-1)

AR(2) : Z= @Z(t-1) + @Z(t-2)

– 이동평균 모형 (MA)

: 유한한 개수의 백색잡음의 결합으로 언제나 정상성을 만족한다

그전 시간의 변수가 아니라 백색잡음만 가지고 식을 만든다…

(백색 잡음이란 시계열 분석에서의 오차항을 의미함 )

–> MA(1) : Z = a(핸재잡음) – a(t-1)(현재시간 -1 잡읍)

MA(2) : Z = a(핸재잡음) – a(t-1)(현재시간 -1 잡읍) – a(t-2)(현재시간 -2 잡읍)

– 자기회귀누적이동평균모형 (ARIMA)

: 비정상 시계열 모델 ARIMA 를 정상 시계열 ARMA 로 만들어야 하는데 …

차분 몇번 변환 몇번을 하였는가에 따라 ARIMA(p, d, q) 가 달라진다..

ARIMA(p , d, q)

-> p : AR , q : MA, d : 차분 횟수

d(차분횟수)가 0 이면 ARMA(p,q) 이되고 정상성을 만족함

p(AR) 0이면 IMA(d,q) 모형으 따르고 d 번 차분하면 MA(q) 로 정상성을 만족

나머지 케이스도 동일 ~

3. 분해 시계열

– 시계열에 영향을 주는 일반적인 요인을 시계열에서 분리해 분석하는 방법을 말하면 회귀적인 방법을 주로사용

1) 추세요인

: 데이터 오르거나 내리거나 2차식 형태를 취하거나 하는 형태가 있을 경우~ 추세가 있다고 한다.

2) 계절요인

: 고정주기에 자료가 변화할 경우 (계절처럼 고정 주기가 있는 경우) 계절용인이 있다고 한다.

3) 순환요인

: 명백한 경제적이거나 자연적인 이유 없이 알려지지 않은 주기를 가지고 변화하는 자료 (여튼 주기가 있다!)

4) 불규칙요인

: 위의 세가지 요인으로 설명할수 없는 오차에 해당하는 데이터를 불규칙 요인이라고 한다.

※ 이제 코드를 좀 봐야 할 시간
install.packages(“xts”)
install.packages(“TTR”)
install.packages(“forecast”)
install.packages(“zoo”)
install.packages(“timeDate”)
install.packages(“colorspace”)
install.packages(“fracdiff”)
install.packages(“tseries”)
install.packages(“Rcpp”)
library(TTR)
library(forecast)

R – Decision Tree

install.packages(“rattle”)
install.packages(“RColorBrewer”)
install.packages(“rpart.plot”)

#######################################
#1. 데이터 구성
#######################################
library(rattle)
library(RColorBrewer)
library(rpart.plot)

#일정한 Random 값을 갖도록한다. (언제 실행해도 1426 이라면 같은 Random 값)
set.seed(1426)

#R 에 내장된 샘플 CSV weather 를 읽어 온다
data(weather)

#weather 데이터를 ds 에 담는다.
ds <- get(“weather”)

# 제외할 컬럼 “Date” “Location” “RISK_MM”
id <- c(“Date”, “Location”)
risk <- “RISK_MM”
ignore <- c(id, if (exists(“risk”)) risk )

# vars : RainTommmorw 포함, 제외 컬럼은 제거
(vars <- setdiff(names(ds), ignore)) #B에는 없고 A 에만 있는 값만 리턴

# vars : RainTommmorw 제거
target <- “RainTomorrow”
inputs <- setdiff(vars, target)

# 원본 데이터의 Row 수 366
(nobs <- nrow(ds))

#intersect : 두 데이터가 공통적으로 가지고 있는 데이터만 리턴
#inputs : RainTomorrow 를 제외한 컬럼 리스트
#names(ds) : 데이터의 전체 컬럼 리스트
#vars : RainTomorrow 를 포함하고 제외항목을 뺀 리스트
#ds[vars] : vars 컬럼과 일치하는 데이터 셋
#apply : apply(M, 1, min)
# – M : 데이터
# – 1 : 열 , 2 : 행
# – 처리할 함수 : min 최소, max 최대, mean 평균
#sapply : apply 와 비슷함. 행으로 리턴
#lapply : apply 와 비슷함. 열로 리턴
#names(ds)[which(sapply(ds[vars], is.numeric))] : 값이 숫자인 컬럼만 리턴
(numerics <- intersect(inputs, names(ds)[which(sapply(ds[vars], is.numeric))]))

#데이터가 Fator (Char 포함) / RainTomorrow 제외
(categorics <- intersect(inputs, names(ds)[which(sapply(ds[vars], is.factor))]))

#RainTomorrow ~ . 이라고 formula 생성 / 막다른 변수 같은거 넣어서도 만들 수 있음
(form <- formula(paste(target, “~ .”)))

## nobs(366) 안에서 366*0.7 만큰의 Rnadom 값을 생성
length(train <- sample(nobs, 0.7*nobs))
length(test <- setdiff(seq_len(nobs), train))

## 내일 비가 올 것이냐, 그 확률 두가지 데이터를 뽑았다.
actual <- ds[test, target]
risks <- ds[test, risk]
#######################################
#2. 데이터 확인
#######################################
dim(ds)
names(ds)
head(ds)
tail(ds)
str(ds)
summary(ds)
######################################
#3. Decision Tree 생성
######################################
#rpart 메서드 사용 도움말
str(rpart)

#
model <- rpart(formula=form, data=ds[train, vars])

print(model)
summary(model)
plotcp(model)

# Plot Type 1
plot(model, uniform=TRUE)
text(model)

# Plot Type 2
plot(model, uniform=TRUE)
text(model, use.n=TRUE, all=TRUE, cex=.8)

# Plot Type 3
fancyRpartPlot(model)

# Plot Type 4
prp(model)

# Plot Type 5
prp(model, type=2, extra=104, nn=TRUE, fallen.leaves=TRUE,
faclen=0, varlen=0, shadow.col=”grey”, branch.lty=3)

# Plot Type 6
col <- c(“#FD8D3C”, “#FD8D3C”, “#FD8D3C”, “#BCBDDC”,
“#FDD0A2”, “#FD8D3C”, “#BCBDDC”)
prp(model, type=2, extra=104, nn=TRUE, fallen.leaves=TRUE,
faclen=0, varlen=0, shadow.col=”grey”, branch.lty=3, box.col=col)

# Plot Type 7
prp(model, type=1)
prp(model, type=2)
prp(model, type=3)
prp(model, type=4)

#
install.packages(“partykit”, repos=”http://R-Forge.R-project.org“)
library(partykit)
plot(as.party(model))

R – Nonlinear Regression

######################################################
## 19. Nonlinear Regression
## 비선형 회귀 분석에 사용한다.
## 말그대로 데이터가 선형관계가 아닌 비선형 관계일 경우 사용한다.
######################################################
## (1) One-Compartment Model
## 하나의 exp 만 가지고 증가하는 모델
## 데이터 로딩
setwd(“D:/DEVSource/CSV_DATA/”)
data = read.csv(“one_comp.csv”)
print(data)

## 비선형 분석
## nls 함수 사용
## C0, K 등 초기값 사용
## 결과 = a X
## exp : e^x (e = 20172882)
out = nls(conc~C0*exp(-K*time), start=list(C0=41.3, K=0.64), data=data)
summary(out)

## Grapth 로 표현
install.packages(“NRAIA”)
library(NRAIA)
plotfit(out)

## (2) Tow-Compartment Model
## 두개의 exp 를 가지고 더 급하게 증가하는 모델
data2 = read.csv(“two_comp.csv”)
print(data2)

out2 = nls(conc~SSbiexp(time, A1, lrcl, A2, lrc2), data=data2)
summary(out2)

plotfit(out2)
## (3) One-Compartment Model – 급속증가 – 증가둔화 – 감소
data3 = read.csv(“oral_dose.csv”)
print(data3)
out3 = nls(conc~SSfol(Dose=4.4, time, lKe, lKa, LCl), data=data3)
summary(out3)

plotfit(out3)
## (4)Michaelis-Menten model
data4 = read.csv(“MM.csv”)
out4 = nls(rate~SSmicmen(conc, Vm, K), data=data4)
summary(out4)
plotfit(out4)

## 초기 변수가 필요없는 self-starting function
1. SSasymp()
Description
This selfStart model evaluates the asymptotic regression function and its gradient. It has an initial attribute that will evaluate initial estimates of the parameters Asym, R0, and lrc for a given set of data.

Usage
SSasymp(input, Asym, R0, lrc)

Arguments
input a numeric vector of values at which to evaluate the model.

Asym a numeric parameter representing the horizontal asymptote on the right side (very large values of input).

R0 a numeric parameter representing the response when input is zero.

lrc a numeric parameter representing the natural logarithm of the rate constant.

Value
a numeric vector of the same length as input. It is the value of the expression Asym+(R0-Asym)*exp(-exp(lrc)*input). If all of the arguments Asym, R0, and lrc are names of objects, the gradient matrix with respect to these names is attached as an attribute named gradient.

Author(s)
José Pinheiro and Douglas Bates

See Also
nls, selfStart

Examples

Lob.329 <- Loblolly[ Loblolly$Seed == “329”, ]
SSasymp( Lob.329$age, 100, -8.5, -3.2 ) # response only
Asym <- 100
resp0 <- -8.5
lrc <- -3.2
SSasymp( Lob.329$age, Asym, resp0, lrc ) # response and gradient
getInitial(height ~ SSasymp( age, Asym, resp0, lrc), data = Lob.329)
## Initial values are in fact the converged values
fm1 <- nls(height ~ SSasymp( age, Asym, resp0, lrc), data = Lob.329)
summary(fm1)
2. SSasympOff()
Description
This selfStart model evaluates an alternative parametrization of the asymptotic regression function and the gradient with respect to those parameters. It has an initial attribute that creates initial estimates of the parameters Asym, lrc, and c0.

Usage
SSasympOff(input, Asym, lrc, c0)

Arguments
input a numeric vector of values at which to evaluate the model.

Asym a numeric parameter representing the horizontal asymptote on the right side (very large values of input).

lrc a numeric parameter representing the natural logarithm of the rate constant.

c0 a numeric parameter representing the input for which the response is zero.

Value
a numeric vector of the same length as input. It is the value of the expression Asym*(1 – exp(-exp(lrc)*(input – c0))). If all of the arguments Asym, lrc, and c0 are names of objects, the gradient matrix with respect to these names is attached as an attribute named gradient.

Author(s)
José Pinheiro and Douglas Bates

See Also
nls, selfStart; example(SSasympOff) gives graph showing the SSasympOff parametrization, where phi_1 is Asymp, phi_3 is c0.

Examples
CO2.Qn1 <- CO2[CO2$Plant == “Qn1”, ]
SSasympOff(CO2.Qn1$conc, 32, -4, 43) # response only
Asym <- 32; lrc <- -4; c0 <- 43
SSasympOff(CO2.Qn1$conc, Asym, lrc, c0) # response and gradient
getInitial(uptake ~ SSasympOff(conc, Asym, lrc, c0), data = CO2.Qn1)
## Initial values are in fact the converged values
fm1 <- nls(uptake ~ SSasympOff(conc, Asym, lrc, c0), data = CO2.Qn1)
summary(fm1)

3. SSasympOrig()
Description
This selfStart model evaluates the asymptotic regression function through the origin and its gradient. It has an initial attribute that will evaluate initial estimates of the parameters Asym and lrc for a given set of data.

Usage
SSasympOrig(input, Asym, lrc)

Arguments
input a numeric vector of values at which to evaluate the model.

Asym a numeric parameter representing the horizontal asymptote.

lrc a numeric parameter representing the natural logarithm of the rate constant.

Value
a numeric vector of the same length as input. It is the value of the expression Asym*(1 – exp(-exp(lrc)*input)). If all of the arguments Asym and lrc are names of objects, the gradient matrix with respect to these names is attached as an attribute named gradient.

Author(s)
José Pinheiro and Douglas Bates

See Also
nls, selfStart

Examples
Lob.329 <- Loblolly[ Loblolly$Seed == “329”, ]
SSasympOrig(Lob.329$age, 100, -3.2) # response only
Asym <- 100; lrc <- -3.2
SSasympOrig(Lob.329$age, Asym, lrc) # response and gradient
getInitial(height ~ SSasympOrig(age, Asym, lrc), data = Lob.329)
## Initial values are in fact the converged values
fm1 <- nls(height ~ SSasympOrig(age, Asym, lrc), data = Lob.329)
summary(fm1)

4. SSbiexp()

Description
This selfStart model evaluates the biexponential model function and its gradient. It has an initial attribute that creates initial estimates of the parameters A1, lrc1, A2, and lrc2.

Usage
SSbiexp(input, A1, lrc1, A2, lrc2)

Arguments
input a numeric vector of values at which to evaluate the model.

A1 a numeric parameter representing the multiplier of the first exponential.

lrc1 a numeric parameter representing the natural logarithm of the rate constant of the first exponential.

A2 a numeric parameter representing the multiplier of the second exponential.

lrc2 a numeric parameter representing the natural logarithm of the rate constant of the second exponential.

Value
a numeric vector of the same length as input. It is the value of the expression A1*exp(-exp(lrc1)*input)+A2*exp(-exp(lrc2)*input). If all of the arguments A1, lrc1, A2, and lrc2 are names of objects, the gradient matrix with respect to these names is attached as an attribute named gradient.

Author(s)
José Pinheiro and Douglas Bates

See Also
nls, selfStart

Examples
Indo.1 <- Indometh[Indometh$Subject == 1, ]
SSbiexp( Indo.1$time, 3, 1, 0.6, -1.3 ) # response only
A1 <- 3; lrc1 <- 1; A2 <- 0.6; lrc2 <- -1.3
SSbiexp( Indo.1$time, A1, lrc1, A2, lrc2 ) # response and gradient
print(getInitial(conc ~ SSbiexp(time, A1, lrc1, A2, lrc2), data = Indo.1),
digits = 5)
## Initial values are in fact the converged values
fm1 <- nls(conc ~ SSbiexp(time, A1, lrc1, A2, lrc2), data = Indo.1)
summary(fm1)

5. SSfol()

Description
This selfStart model evaluates the first-order compartment function and its gradient. It has an initial attribute that creates initial estimates of the parameters lKe, lKa, and lCl.

Usage
SSfol(Dose, input, lKe, lKa, lCl)

Arguments
Dose a numeric value representing the initial dose.

input a numeric vector at which to evaluate the model.

lKe a numeric parameter representing the natural logarithm of the elimination rate constant.

lKa a numeric parameter representing the natural logarithm of the absorption rate constant.

lCl a numeric parameter representing the natural logarithm of the clearance.

Value
a numeric vector of the same length as input, which is the value of the expression

Dose * exp(lKe+lKa-lCl) * (exp(-exp(lKe)*input) – exp(-exp(lKa)*input))
/ (exp(lKa) – exp(lKe))

If all of the arguments lKe, lKa, and lCl are names of objects, the gradient matrix with respect to these names is attached as an attribute named gradient.
Author(s)
José Pinheiro and Douglas Bates

See Also
nls, selfStart

Examples
Theoph.1 <- Theoph[ Theoph$Subject == 1, ]
SSfol(Theoph.1$Dose, Theoph.1$Time, -2.5, 0.5, -3) # response only
lKe <- -2.5; lKa <- 0.5; lCl <- -3
SSfol(Theoph.1$Dose, Theoph.1$Time, lKe, lKa, lCl) # response and gradient
getInitial(conc ~ SSfol(Dose, Time, lKe, lKa, lCl), data = Theoph.1)
## Initial values are in fact the converged values
fm1 <- nls(conc ~ SSfol(Dose, Time, lKe, lKa, lCl), data = Theoph.1)
summary(fm1)

6. SSfpl()

Description
This selfStart model evaluates the four-parameter logistic function and its gradient. It has an initial attribute that will evaluate initial estimates of the parameters A, B, xmid, and scal for a given set of data.

Usage
SSfpl(input, A, B, xmid, scal)

Arguments
input a numeric vector of values at which to evaluate the model.

A a numeric parameter representing the horizontal asymptote on the left side (very small values of input).

B a numeric parameter representing the horizontal asymptote on the right side (very large values of input).

xmid a numeric parameter representing the input value at the inflection point of the curve. The value of SSfpl will be midway between A and B at xmid.

scal a numeric scale parameter on the input axis.

Value
a numeric vector of the same length as input. It is the value of the expression A+(B-A)/(1+exp((xmid-input)/scal)). If all of the arguments A, B, xmid, and scal are names of objects, the gradient matrix with respect to these names is attached as an attribute named gradient.

Author(s)
José Pinheiro and Douglas Bates

See Also
nls, selfStart

Examples
Chick.1 <- ChickWeight[ChickWeight$Chick == 1, ]
SSfpl(Chick.1$Time, 13, 368, 14, 6) # response only
A <- 13; B <- 368; xmid <- 14; scal <- 6
SSfpl(Chick.1$Time, A, B, xmid, scal) # response and gradient
print(getInitial(weight ~ SSfpl(Time, A, B, xmid, scal), data = Chick.1),
digits = 5)
## Initial values are in fact the converged values
fm1 <- nls(weight ~ SSfpl(Time, A, B, xmid, scal), data = Chick.1)
summary(fm1)
7. SSgompertz()

Description
This selfStart model evaluates the Gompertz growth model and its gradient. It has an initial attribute that creates initial estimates of the parameters Asym, b2, and b3.

Usage
SSgompertz(x, Asym, b2, b3)

Arguments
x a numeric vector of values at which to evaluate the model.

Asym a numeric parameter representing the asymptote.

b2 a numeric parameter related to the value of the function at x = 0

b3 a numeric parameter related to the scale the x axis.

Value
a numeric vector of the same length as input. It is the value of the expression Asym*exp(-b2*b3^x). If all of the arguments Asym, b2, and b3 are names of objects the gradient matrix with respect to these names is attached as an attribute named gradient.

Author(s)
Douglas Bates

See Also
nls, selfStart

Examples
DNase.1 <- subset(DNase, Run == 1)
SSgompertz(log(DNase.1$conc), 4.5, 2.3, 0.7) # response only
Asym <- 4.5; b2 <- 2.3; b3 <- 0.7
SSgompertz(log(DNase.1$conc), Asym, b2, b3) # response and gradient
print(getInitial(density ~ SSgompertz(log(conc), Asym, b2, b3),
data = DNase.1), digits = 5)
## Initial values are in fact the converged values
fm1 <- nls(density ~ SSgompertz(log(conc), Asym, b2, b3),
data = DNase.1)
summary(fm1)
8. SSlogis()

Description
This selfStart model evaluates the logistic function and its gradient. It has an initial attribute that creates initial estimates of the parameters Asym, xmid, and scal.

Usage
SSlogis(input, Asym, xmid, scal)

Arguments
input a numeric vector of values at which to evaluate the model.

Asym a numeric parameter representing the asymptote.

xmid a numeric parameter representing the x value at the inflection point of the curve. The value of SSlogis will be Asym/2 at xmid.

scal a numeric scale parameter on the input axis.

Value
a numeric vector of the same length as input. It is the value of the expression Asym/(1+exp((xmid-input)/scal)). If all of the arguments Asym, xmid, and scal are names of objects the gradient matrix with respect to these names is attached as an attribute named gradient.

Author(s)
José Pinheiro and Douglas Bates

See Also
nls, selfStart

Examples
Chick.1 <- ChickWeight[ChickWeight$Chick == 1, ]
SSlogis(Chick.1$Time, 368, 14, 6) # response only
Asym <- 368; xmid <- 14; scal <- 6
SSlogis(Chick.1$Time, Asym, xmid, scal) # response and gradient
getInitial(weight ~ SSlogis(Time, Asym, xmid, scal), data = Chick.1)
## Initial values are in fact the converged values
fm1 <- nls(weight ~ SSlogis(Time, Asym, xmid, scal), data = Chick.1)
summary(fm1)
9. SSmicmen()

Description
This selfStart model evaluates the Michaelis-Menten model and its gradient. It has an initial attribute that will evaluate initial estimates of the parameters Vm and K

Usage
SSmicmen(input, Vm, K)

Arguments
input a numeric vector of values at which to evaluate the model.

Vm a numeric parameter representing the maximum value of the response.

K a numeric parameter representing the input value at which half the maximum response is attained. In the field of enzyme kinetics this is called the Michaelis parameter.

Value
a numeric vector of the same length as input. It is the value of the expression Vm*input/(K+input). If both the arguments Vm and K are names of objects, the gradient matrix with respect to these names is attached as an attribute named gradient.

Author(s)
José Pinheiro and Douglas Bates

See Also
nls, selfStart

Examples
PurTrt <- Puromycin[ Puromycin$state == “treated”, ]
SSmicmen(PurTrt$conc, 200, 0.05) # response only
Vm <- 200; K <- 0.05
SSmicmen(PurTrt$conc, Vm, K) # response and gradient
print(getInitial(rate ~ SSmicmen(conc, Vm, K), data = PurTrt), digits = 3)
## Initial values are in fact the converged values
fm1 <- nls(rate ~ SSmicmen(conc, Vm, K), data = PurTrt)
summary(fm1)
## Alternative call using the subset argument
fm2 <- nls(rate ~ SSmicmen(conc, Vm, K), data = Puromycin,
subset = state == “treated”)
summary(fm2)

10. SSweibull()

Description
This selfStart model evaluates the Weibull model for growth curve data and its gradient. It has an initial attribute that will evaluate initial estimates of the parameters Asym, Drop, lrc, and pwr for a given set of data.

Usage
SSweibull(x, Asym, Drop, lrc, pwr)

Arguments
x a numeric vector of values at which to evaluate the model.

Asym a numeric parameter representing the horizontal asymptote on the right side (very small values of x).

Drop a numeric parameter representing the change from Asym to the y intercept.

lrc a numeric parameter representing the natural logarithm of the rate constant.

pwr a numeric parameter representing the power to which x is raised.

Details
This model is a generalization of the SSasymp model in that it reduces to SSasymp when pwr is unity.

Value
a numeric vector of the same length as x. It is the value of the expression Asym-Drop*exp(-exp(lrc)*x^pwr). If all of the arguments Asym, Drop, lrc, and pwr are names of objects, the gradient matrix with respect to these names is attached as an attribute named gradient.

Author(s)
Douglas Bates

References
Ratkowsky, David A. (1983), Nonlinear Regression Modeling, Dekker. (section 4.4.5)

See Also
nls, selfStart, SSasymp

Examples
Chick.6 <- subset(ChickWeight, (Chick == 6) & (Time > 0))
SSweibull(Chick.6$Time, 160, 115, -5.5, 2.5) # response only
Asym <- 160; Drop <- 115; lrc <- -5.5; pwr <- 2.5
SSweibull(Chick.6$Time, Asym, Drop, lrc, pwr) # response and gradient
getInitial(weight ~ SSweibull(Time, Asym, Drop, lrc, pwr), data = Chick.6)
## Initial values are in fact the converged values
fm1 <- nls(weight ~ SSweibull(Time, Asym, Drop, lrc, pwr), data = Chick.6)
summary(fm1)

R – Logistic Regression

######################################################
## 13. Logistic Regression
## 종속변수가 0,1 / 죽다,살다 / 있다,없다 와 같은 Binary 인 경우 사용
## odds 의 log- 변환을 종속변수로 모형화 한다.
######################################################

## CASE1 : Respire.csv
## (1) 테스테 데이터 추출
setwd(“D:/DEVSource/CSV_DATA/”)
data1 = read.csv(“respire1.csv”)
data2 = read.csv(“respire2.csv”)
print(data1)
print(data2)

## (2) logistic test
## 귀무가설 : treat 종류에 따른 결과가 같다
## P-value : 6.7e-06 결과는 매우 유의한 차이가 있다
out = glm(outcome ~ treat, family=binomial, data=data)
summary(out)

## (3) 얼마나 더 좋은가?
## 새로운 약은 6배더 효과가 있다
exp(coef(out))

## (4) 신뢰 구간은?
## 2.8배 ~ 13.41배 효과가 있을 확률은 95% 이다
exp(confint(out))

## CASE2 : toxic.csv
data3 = read.csv(“toxic.csv”)
print(data3)

with(data3,tapply(count*response, dose, sum))
with(data3,tapply(count, dose, sum))
with(data3, tapply(count*response, dose, sum)/ tapply(count, dose, sum))
## P-value 가 0.331 로 dose 의 변화는 죽을 확률 변화와 연관이 있다
## 그 편차는(?) 1.1051 로 dose 1증가시 죽을 확률은 3.01 배 증가
out = glm(response ~ dose , weights=count, family=binomial, data=data3)
summary(out)
## 신뢰구간
## dose 가 1 증가할 때 죽을 확률은
## 1.16 ~ 9.33 배 증가할 확률이 95% 이다
exp(confint(out, parm=”dose”))

R – ANCOVA (analysis of covariance)공분산 분석

######################################################
## 13. ANCOVA (analysis of covariance)공분산 분석
## 사회과학과 같이 다른 변인의 통제가 쉽지 않은 상황에서
## 연속형 변수를 추가하여 오차를 줄이고 검정력을 높이는 방법
######################################################

## (1) 테스트 데이터 추출
setwd(“D:/DEVSource/CSV_DATA/”)
data = read.csv(“anorexia.csv”)
print(data)

## (2) 데이터에 대한 일원분산 분석
## 3개의 데이터가 같은 평균을 갖지는 않음
boxplot(Postwt – Prewt ~ Treat, data=data)
out = lm(Postwt – Prewt ~ Treat, data=data)
anova(out)
summary(out)

##전체 차이 조사 결과
##FT 와 Cont 사이에 유의한 차이가 존재함
library(multcomp)
tukey = glht(out, linfct=mcp(Treat=”Tukey”))
summary(tukey)

## Treat Level 조정
levels(data$Treat)
data$Treat = relevel(data$Treat, ref=”Cont”)
levels(data$Treat)

## (3) 공변량을 추가하여 분석
## 공변량을(현재 몸무게) 추가하여 분석을 하여도 치료 방법 별로 유의한 차이가 있다는 결론
## Treat 의 P-Value = 0.0008438
## Prewt 의 P-Value = 0.0019364
## 단 이전 몸무게 또한 유의한 차이가 있다는 결론이 있음
out2 = lm(Postwt ~ Prewt + Treat, data=data)
anova(out2)
summary(out2)

dunnett = glht(out2, linfct=mcp(Treat=”Dunnett”))
summary(dunnett )
plot(dunnett )