■ R을 활용한 머신러닝
통계학개론----->머신러닝
■ 머신러닝 책 수업 목차
책: R을 활용한 머신러닝 2/e 저자: 브레트 란츠 출판사: 에이콘
1. 머신러닝이 무엇인지?(1장)
2. 머신러닝을 배우기 위해 기본적으로 알아야 하는 내용(2장)
데이터의 종류
데이터 수치 요약
3. 지도학습
분류: knn------------------------산포도 그래프
의사결정트리----------엔트로피 개념
서포트 백터머신----오즈비율->시그모이드 함수->로지스틱회귀
나이브베이즈----------확률(3장. 확률과 변수)
신경망-------------------딥러닝
회귀: 선형회귀---------------상관계수, 결정계수(5장. 통계적 추정)
4. 비지도 학습 : k-means-----산포도 그래프 + 거리계산
5. 기타 머신러닝 기법 : 부스팅, 배깅---cohne's kappa(5장. 통계적 추정)
■ 머신러닝이란?
지도학습: 개고양이 처럼 테스트/라벨링 만들어줘서 지도학습하는 방법
비지도학습: 라벨없이 스스로 학습하게끔 패턴/규칙을 탐색하는 방법
강화학습: 비지도학습인데 보상을 줘서 더 강력하게 학습시키는 항법
■ 머신러닝을 배우기 위해 기본적으로 알고 있어야하는 내용
통계학 개론
-데이터의 종류
-데이터 수치 요약(평균값, 중앙값, 최빈값, 사분위수, 분산, 표준편차)
-범주형 데이터
-그래프
산포도 그래프, 이원 교차표
■ 데이터의 종류
1. 범주형 데이터
-명목형(norminal) 데이터 : 몇 개의 범주로 나누어진 자료
예: 성별 - 남/녀
-순서형(ordinal) 데이터 : 명목형 데이터 + 순서
예: low, middle, high
2. 수치형 데이터
-이산형 데이터(discreat : 뚜렷이 구별되다)
주사위처럼 1~6까지의 숫자(각 숫자가 의미가 있는 것)
예: 2016년 음주운전 적발건수가 22만 6599건
계수(세어서(헤아려) 얻는 것)
-연속형 데이터 : 연속적인 값의 데이터
예: 신장, 체중(82.32) ---연속적인 숫자(실수형)
계량(측정해서 얻는 것)
*이산형 데이터 보다는 연속형 데이터가 얻을 수 있는 정보가 많다.
1. 데이터 중심화 경향: 중앙값, 평균값, 최빈값
2. 데이터의 퍼짐 정도: 분산, 표준편차, 범위
3. 데이터의 분포와 대칭 정도: 왜도(좌우로 기울어짐의 정도)
첨도(위아래 뾰족한 정도)
딥러닝--->분류
통계학--->분석
예제. 헬스클럽에 오는 특정 사람의 나이를 가지고
가장 적합한 운동교실을 선택하기 위한 분석
↓
사용할 통계기법? 평균값, 중앙값, 최빈값
○
-↑-
↙↘
50대 남자
헬스클럽에 찾아와서 자신과 비슷한 나이대에 사람들이 있는
운동교실을 알려달라고 했다.
추천해준 교실의 사람들 나이대
나이 |
19 |
20 |
21 |
145 |
147 |
도수 |
3 |
6 |
3 |
1 |
1 |
문제162.
위의 표를 R로 구현하고 나이의 평균값을 출력하시오
class1<-c(rep(19,3), rep(20,6), rep(21,3),
145, 147)
> class1
[1] 19
19 19 20 20 20
20 20 20
21 21 21 145 147
> table(class1)
class1
19
20 21 145 147
3
6 3 1 1
> mean(class1)
[1] 38
이 교실은 쿵푸교실인데
나이 19 20 21 145 147
도수 3 6 3 1 1
↑ ↑
고수 고수
※ 이상치 때문에 평균이 높아졌다
※ 이상치? 다른 데이터에 비해 눈에 뜨일 정도로 지나치게 높거나 낮은값
※ 편향이란? 이상치에 의해서 평균값이 상승 되었다.
이런 현상을 보이면 데이터가 편향되었다고 한다.
문제163.
위의 class1 의 이상치를 출력하시오
install.packages('outliers')
library(outliers)
> outlier(calss1)
[1] 147
# 사용할 땐 outlier. s 안붙임
*이상치가 2개인데 하나만 나왔다.
*이상치 전부 보려면
class1<-c(rep(19,3), rep(20,6), rep(21,3), 145, 147)
class1 #rep = repeat
x2<-boxplot(class1)
x2
$out
[1] 145 147
문제164.
데이터 분석을 잘못해서 이런일이 벌어졌다.
이 문제를 해결하기 위해 알아야 하는 값이 무엇인가
답: 중앙값(median)을 구하는 것이다
median(class1)
summary(class1)
median(class1)
[1] 20
> summary(class1) #사분위수로 나타남
Min. 1st
Qu. Median Mean 3rd Qu. Max.
19 20 20
38 21 147
19 19 19 20 20 20 20 20 20 21 21 21 145 (홀수)
↑
중앙값
19 19 20 20 21 21 21 145 (짝수)
↑
가운데 평균값(20.5) ←실제로 존재하지 않는 수
평균값이 갖는 위험은 실제로 데이터 집합에 존재하지 않는 수라는 것이다.
■ 편향
만약 데이터가 중앙에 편향되면 편향이 낮다
데이터가 중앙에서 멀리 떨어진곳에 있으면 편향이 높다
평균이 outlier를 따라감
문제165.
위의 두개의 그래프를 R로 직접 그려서 편향 여부를 확인하시오
table(class1)
class1
1 2 3 4 5 6 7 8
4 6 4 4 3 2 1 1
> table(class2)
class2
1
4 6 8 9 10
11 12
1
1 2 3
4 4 5 5
mean(class1)
[1] 3.44
> median(class1)
[1] 3
> mean(class2)
[1] 9.28
> median(class2)
[1] 10
summary(class1)
Min. 1st
Qu. Median Mean 3rd Qu. Max.
1.00
2.00 3.00 3.44 5.00 8.00
boxplot(class1)
> summary(class2)
Min. 1st
Qu. Median Mean 3rd Qu. Max.
1.00
8.00 10.00 9.28 11.00 12.00
boxplot(class2)
plot(class1, dnorm(class1, mean=mean(class1), sd=sd(class1)),
type='l', main="정규분포 그래프")
plot(class2, dnorm(class2, mean=mean(class2), sd=sd(class2)),
type='l', main="정규분포 그래프")
■ 왜도와 첨도(p.99)
-왜도: 데이터의 좌우로 기울어짐의 정도(skewness)
왜도값 > 0 : 오른쪽 꼬리가 길다
왜도값 < 0 : 왼쪽 꼬리가 길다
-첨도: 위아래 뾰족한 정도(kurtosis)
첨도값이 3에 가까울 수록 정규분포에 해당하고
3보다 작은 경우 완만한 곡선
3보다 크면 뾰족한 곡선
문제166.
install.packages("fBasics")
library(fBasics)
skewness(class1)
[1] 0.5805801 <-왜도값이 0보다 크다는 것은 오른쪽 꼬리가 길다
"오른쪽 편향"
(우뚝 솟은 부분은 반대.왼쪽)
대부분의 데이터들이 작은쪽에 있다는 것.
평균값 > 중앙값
skewness(class2)
[1] -1.326201 <-왜도값이 0보다 작다는 것은 왼쪽 꼬리가 길다
"왼쪽 편향"
(우뚝 솟은 부분은 반대.오른쪽)
대부분의 데이터들이 큰쪽에 있다는 것.
평균값 < 중앙값
이상치가 어디에 있을 가능성이 높은가?
class1 은 오른쪽에 많다(값이 큰 쪽)
class2 는 왼쪽에 많다(값이 작은 쪽)
문제167.
우리반 나이 데이터를 가지고 정규분포 그래프를 그리고
왜도값을 확인하시오
emp8 <- read.csv("emp8.csv", header=T)
attach(emp8)
emp88<-sort(emp8$age)
emp88
plot(emp88, dnorm(emp88, mean=mean(emp88), sd=sd(emp88)),
type='l', main="정규분포 그래프")
skewness(emp88)
[1] 1.808622
※설명: 이상적인 경우는 데이터가 좌우대칭을 형성하는 것이다.
데이터가 좌우대칭이면 평균값은 가운데에 위치한다.
평균값을 한쪽 방향으로 잡아끄는 이상치가 없으며,
좌우에 형성되는 차트의 모양이 중앙을 중심으로 했을 때
동일하다.
문제168.(점심시간문제)
위에서 말하는 좌우 대칭의 정규분포 그래프를 그리시오
x<-seq(-3.5, 3.5, length=700)
y<-dnorm(x)
# rnorm 정규분포에서 몇개를 뽑아라
# dnorm 확률분포에서 E(확률)값이 나올 누적확룔
plot(x,y, type='l', lwd=1, ylim=c(0,0.6), col='#777777',
main="표준정규분포", col.main='#7777ff',
xlab="",
ylab="",
las=1)
skewness(x)
kurtosis(x)
■ 최빈값
"저랑 나이대가 비슷한 10대들이 있는 수영교실에 저를 등록시켜주세요~"
swim_class1<-c(rep(1,3),rep(2,4),rep(3,2),rep(31,2),rep(32,4),rep(33,3))
> swim_class1
[1] 1
1 1 2 2 2
2 3 3 31 31 32 32 32 32 33 33 33
mean(swim_class1)
[1] 17
> median(swim_class1)
[1] 17
평균, 중앙값만 보면 요구충족이 된다!
하지만 실제는 엄마와 아기가 함께하는 수영교실 이였다.
summary(swim_class1)
Min. 1st
Qu. Median Mean 3rd Qu. Max.
1 2 17 17 32 33
1 1 1 2 2 2 2 3 3 □ 31 31 32 32 32 32 33 33 33(18, 짝수)
↑
평균값 17
중앙값 17( (3+31) / 2)
이 교실의 평균값, 중앙값은 17세인 사람이 없는데도
모두 17을 갖는다.
학생 수가 짝수여서 존재하지 않는 값인 17 이 나온게 문제다
그렇다면 홀수가 되면 중앙값이 어떻게 되는가?
영유아가 1명 더 있었다면 중앙값은 3.
엄마가 1명 더 있었다면 31
즉, 평균값, 중앙값 만으로는 데이터를 분석할 수 없다.
이런경우 때문에 최빈값이 필요하다.
■ 최빈값(mode) 이란?
평균과 중앙값 이외의 세번째 종류의 평균이 존재하는데
그게 바로 최빈값이다.
최빈값이란 가장 흔하게 나타나는 값을 말한다.
table(swim_class1)
swim_class1
1
2 3 31 32 33
3
4 2
2 4 3
**최빈값이 2세, 32세 임을 알 수 있다.
문제169.
swim_class1 데이터에서 최빈값을 출력하시오
table(swim_class1)
swim_class1
1
2 3 31 32 33
3
4 2 2
4 3
swim_class1<-c(rep(1,3),rep(2,4),rep(3,2),rep(31,2),rep(32,4),rep(33,3))
swim_class1
table(swim_class1)
which.max(table(swim_class1))
#가장큰값과 위치를 알려줌
names(table(swim_class1))[2]
###############################################
#Create the function.
getmode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
# Create the vector with numbers.
v <- c(2,1,2,3,1,2,3,4,1,5,5,3,2,3)
table(v)
# Calculate the mode using the user function.
result <- getmode(v)
print(result)
# Create the vector with characters.
charv <- c("o","it","the","it","it")
# Calculate the mode using the user function.
result <- getmode(charv)
print(result)
table(v)
v
1 2 3 4 5
3 4 4 1 2
■ 범위
"평균값과 중앙값과 최빈값만으로는 데이터 분석을 하기 부족한
경우가 있다.
이런 평균 데이터는 중심이 어디쯤인지는 알려주지만
데이터가 어떤식으로 변화하는지에 대해서는 알려주지 않았다.
특정 데이터가 평균을 중심으로 어떻게 분포되어있는지 알려면
범위를 알아야 한다"
질문: 어느 농구단의 감독이 아래의 3명의 농구선수 중
한 명을 선택해야 할려고 데이터 분석을 하려고 한다.
아래의 3명의 선수의 게임장 점수를 가지고 평균값, 중앙값, 최빈값을
각각 구하시오
table(x1)
x1
7
8 9 10 11 12 13 <<<--- 각각의 점수를 받았던 게임 수
1
1 2 2
2 1 1
*윗줄이 점수, 아랫줄이 시합수.
즉 1번의 시합에서 7점 획득
table(x2)
x2
7
9 10 11 13
1
2 4 2 1
table(x3)
x3
3
6 7 10 11 13 30
2
1 2 3
1 1 1
mean(x1)
mean(x2)
mean(x3)
median(x1)
median(x2)
median(x3)
which.max(table(x1))
9
3
> which.max(table(x2))
10
3
> which.max(table(x3))
10
4
중앙값, 평균값, 최빈값 이 다 동일해서 특정 선수를 선택하기가 어렵다
그래서 감독이 각 선수의 점수가 어떻게 분포되어있는지
분포방식을 측정할 수 있으면 결정을 내리는데
도움을 줄 수 있을 것이다
range(x1)
[1] 7 13
> range(x2)
[1] 7 13
> range(x3)
[1] 3 30
획득한 점수의 범위를 나타낸다.
범위는 그 자체로는 데이터의 폭 만을 설명할 뿐
그 안에서 데이터가 분포되는 방식은 설명해주지 않는다.
특히 이상치에 민감하다.
3번째 선수같은 경우 만약 어쩌다 한번 잘한 게임(30점)인
이상치 때문에 범위가 넓어져 버리게 되면 분석하기 어렵다.
그래서 이상치로부터 멀어질 필요가 있다.
이 문제는 사분위 범위로 해결 할 수 있다.
4분위수 = 상한 사분위수 - 하한 사분위수
4분위수로 4조각내고
양 끝 노란색 동그라미는 이상치라서 잘라내버린다.
빨간선 안에 있는 데이터가 우리가 원하는 범위 데이터다.
하한 사분위수 Q1
중앙값은? Q2
상한 사분위수 Q3
문제170.
아래의 데이터에서 하한 사분위수, 중앙값, 상한 사분위수가 무엇인지
x<-c(3,3,6,7,7,10,10,10,11,13,30)
> table(x)
x
3
6 7 10 11 13 30
2
1 2 3
1 1 1
summary(x)
Min. 1st
Qu. Median Mean 3rd Qu. Max.
3.0 6.5
10.0 10.0 10.5 30.0
x2<-boxplot(x)
x2
$stats
[,1]
[1,] 3.0 <- 하한값
[2,] 6.5 <- 하한 사분위수
[3,] 10.0 <- 중앙값
[4,] 10.5 <- 상한 사분위수
[5,] 13.0 <- 상한값
$out #아웃라이어
[1] 30
문제171.
다음 데이터에서 하한값, 하한 사분위수, 중앙값, 상한 사분위수,
상한값을 출력하시오
1 1 1 2 2 □ 2 2 3 3 3 □ 3 3 4 4 4 □ 4 5 5 5 10
↑ ↑ ↑ ↑ ↑
하한 하한 중앙값 상한 상한
사분위수 사분위수
table(x)
x
1
2 3 4 5 10
3
4 5 4
3 1
> boxplot(x)
> x2<-boxplot(x)
> x2
$stats
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5
$out
[1] 10
※ 이런 값들을 구하는 이유가 무엇인가
이상치 때문이다. 이상치를 제거하고 가운데 50%의 데이터에만
집중함으로써 문제를 우회할 수 있는 것이다.
문제172.
아래의 3명의 농구선수들의 점수를 가지고
사분위수 그래프를 그리는데 1번 선수와 3번 선수 두 명의 그래프를
하나의 그래프로 출력하시오
x1<-c(7 ,8 ,9 ,9 ,10 ,10 ,11 ,11 ,12 ,13)
table(x1)
x2<-c(7 ,9 ,9 ,10 ,10 ,10 ,10 ,11 ,11 ,13,13 )
table(x2)
x3<- c(3 ,3 ,6 ,7 ,7 ,10 ,10 ,10 ,11 ,13 ,30 )
table(x3)
x2와 x3 만 가지고 cbind로 묶어보자
zz<-cbind(x2,x3)
> boxplot(zz, horizontal=TRUE)
> zz<-cbind(x3,x2)
> zz
x3 x2
[1,]
3 7
[2,]
3 9
[3,]
6 9
[4,]
7 10
[5,]
7 10
[6,] 10 10
[7,] 10 10
[8,] 10 11
[9,] 11 11
[10,] 13 13
[11,] 30 13
※ 설명
짙은검정색선: 중앙값
2번선수가 3번선수보다 상대적으로 좁은 범위를 가지고 있고
2번선수의 평균값이 3번선수보다 약간 높다.
( 2번선수: 10.27273, 3번선수: 10)
3번선수는 넓은 범위를 가지고 있고 이 선수는 2번 선수에 비해
훨씬 높은 점수로 득점을 했지만 다른 경우에는 훨씬 낮은 점수를 기록했다.
따라서 감독이라면 2번선수를 고를 것이다.
■ 분산과 표준편차
사분위수 범위(미니범위: 이상치 제외시킨 범위)가 유용한것 처럼 보이지만
때때로 정말 낮은 점수를 올리는 선수가 있다면 어떻게 할까?
어떤 선수가 시합 날 분위기를 망치면 우리는 리그를 포기해야 하나?
범위 혹은 사분범위가 가장 일관성 있는 선수가 누구인지를
확실히 측정할 수 있을까?
더 정확하게 측정할 수는 없을까?
그 방법 중에 하나가 각각의 값들이 평균값으로부터
얼마나 떨어져 있는지를 확인하는 것이다.
만약 값들이 평균값들로부터 많이 떨어져 있다면 시합당일에
어떤 모습을 보여줄지 예상하기가 어렵다.
그러나 값들이 평균값에 가까우면 시합날 어떤 모습일지
예측할 수 있다.
그게 무엇인가? "분산" 이다
분산 = (실제값-평균)^2 / N
그런데 우리가 정말 필요한 것은 평균값으로부터의 거리를 제곱한 것이
아니라 그냥 거리 자체가 분포되있는 양상을 알려주는 수이다.
그게 무엇인가? 표준편차
위 그림에서 75, 55는 슈팅성공률
정규분포 공식
*뮤= 평균
*시그마=표준편차
**분산 var // 표준편차 sd
sd(x1) # 표준편차
[1] 1.825742
> sd(x2)
[1] 1.737292
■ 범주형 데이터 살펴보기(p.103)
범주형 데이터를 살펴보는 방법 2가지
1. table 함수
2. prop.table 함수
예제: 사원 테이블의 부서번호, 부서번호별 인원수를 출력하시오
table(emp$deptno)
10 20 30 70
3
5 6 1
> table(emp$deptno)*100
10 20
30 70
300 500 600 100
> prop.table(table(emp$deptno) )
10 20 30 70
0.20000000 0.33333333 0.40000000 0.06666667
> prop.table(table(emp$deptno) )*100
10 20 30 70
20.000000 33.333333 40.000000 6.666667
*prop = propercetage 퍼센트로 보여준다.
문제174.
중고차의 색깔과 색깔별 비율이 어떻게 되는 출력하시오
car<-read.csv("usedcars.csv",header=T)
head(car)
round(prop.table(table(car$color))*100,digit=1)
Black
Blue Gold Gray
Green Red Silver White Yellow
23.3
11.3 0.7 10.7
3.3 16.7 21.3
10.7 2.0
※ 설명:
검정색이 전체 차 중에 23% 차지하는 비율임을 알 수 있다.
■ 산포도 그래프(p 106)
문제175.
커미션을 받는 사원들의 월급의 분포도가 어떻게 되는지
산포도 그래프로 확인하시오
############## set this file location to working directory ##########################
packages <- 'rstudioapi'
if (length(setdiff(packages, rownames(installed.packages()))) > 0) {
install.packages(setdiff(packages, rownames(installed.packages())))
}
library('rstudioapi')
current_dir<-dirname(rstudioapi::getSourceEditorContext()$path)
setwd(current_dir)
package_in<-function(p_name,option=1){
packages <- p_name
if (length(setdiff(packages, rownames(installed.packages()))) > 0) {
install.packages(setdiff(packages, rownames(installed.packages())))
}
if (option==1){
library(p_name,character.only = TRUE)
}
}
###########################1. 패키지 설치##########################################
package_in('shinydashboard')
package_in('shiny')
package_in('ggplot2')
package_in('plotly')
package_in('lattice')
######################### 2. 화면 개발 ###########################################
sidebar <- dashboardSidebar(
sidebarMenu(
fileInput("file1", "Choose CSV File",
multiple = FALSE,
accept = c("text/csv",".xlsx",".txt",
"text/comma-separated-values,text/plain",
".csv")),
menuItem("Plot",
menuSubItem('Barplot',tabName='barplot'),
menuSubItem('Piechart',tabName='piechart'),
menuSubItem('Lineplot',tabName='lineplot'),
menuSubItem('Scatterplot',tabName='scatterplot')
)
)
)
body <- dashboardBody(
tabItems(
##### bar plot
tabItem(tabName = "barplot",
sidebarPanel(
selectInput("in_sel_bar_yVar","y Variable:", choices = NULL),
selectInput("in_sel_bar_xVar","x Variable:", choices = NULL)
),
mainPanel(
plotOutput('plot_bar')
)
),
##### piechart
tabItem(tabName = "piechart",
sidebarPanel(
selectInput("in_sel_pie_xVar","x Variable:", choices = NULL)
),
mainPanel(
plotlyOutput('plot_pie')
)
),
##### line plot
tabItem(tabName = "lineplot",
sidebarPanel(
selectInput("in_sel_line_yVar","y Variable:", choices = NULL),
selectInput("in_sel_line_xVar","x Variable:", choices = NULL)
),
mainPanel(
plotlyOutput('plot_line')
)
),
##### scatter plot
tabItem(tabName = "scatterplot",
sidebarPanel(
selectInput("in_sel_scatter_yVar","y Variable:", choices = NULL),
selectInput("in_sel_scatter_xVar","x Variable:", choices = NULL)
),
mainPanel(
plotOutput('plot_scatter'),
textOutput('text_scatter')
)
)
)
)
ui<-dashboardPage(
dashboardHeader(title='my graph'),
sidebar,
body
)
######################3. 서버단 개발 ########################################
server <- function(input, output,session) {
options(warn = -1)
options(shiny.maxRequestSize = 30*1024^2)
dataload<-reactive({
req(input$file1)
file1 = input$file1
data1 = read.csv(file1$datapath)
updateSelectInput(session, "in_sel_bar_xVar", choices = colnames(data1))
updateSelectInput(session, "in_sel_bar_yVar", choices = colnames(data1))
updateSelectInput(session, "in_sel_pie_xVar", choices = data1[,1])
updateSelectInput(session, "in_sel_line_xVar", choices = colnames(data1))
updateSelectInput(session, "in_sel_line_yVar", choices = colnames(data1))
updateSelectInput(session, "in_sel_scatter_xVar", choices = colnames(data1))
updateSelectInput(session, "in_sel_scatter_yVar", choices = colnames(data1))
return(data1)
})
####nomal_bar
output$plot_bar <- renderPlot({
table_in<-dataload()
xdata<-as.factor(table_in[,input$in_sel_bar_xVar])
ydata<-as.factor(table_in[,input$in_sel_bar_yVar])
fdata=data.frame(x=xdata,y=ydata)
ggplot(fdata) +
geom_bar(aes_string(x='x',y='y',fill='x'),stat = "identity",show.legend=F)
})
output$plot_pie <- renderPlotly({
table_in<-dataload()
plot_ly(table_in, labels = ~colnames(table_in)[-1], values=~as.factor( table_in[table_in[,1] == input$in_sel_pie_xVar,-1] ),type='pie')
})
output$plot_line <- renderPlotly({
table_in<-dataload()
x <- list(title = input$in_sel_line_xVar)
y <- list(title = input$in_sel_line_yVar)
plot_ly(data = table_in,x=~table_in[,input$in_sel_line_xVar],y=~table_in[,input$in_sel_line_yVar],type='scatter',mode='dot')%>%
layout(xaxis = x, yaxis = y)
})
output$plot_scatter <- renderPlot({
table_in<-dataload()
xyplot(table_in[,input$in_sel_scatter_yVar]~table_in[,input$in_sel_scatter_xVar], grid=T,type=c('p','smooth'),col.line='darkorange',lwd=2, xlab=input$in_sel_scatter_xVar,ylab=input$in_sel_scatter_yVar)
})
output$text_scatter <- renderText({
table_in<-dataload()
paste("The correlation between the two is: ", cor(table_in[,input$in_sel_scatter_yVar],table_in[,input$in_sel_scatter_xVar]))
})
}
######################### 4. 샤이니 실행 ###############################
shinyApp(ui = ui, server = server)
문제176.(마지막문제)
중고차의 주행거리가 높으면 중고차의 가격이 낮아진다는 것을
plot 그래프로 확인하시오
*이원교차표란?
두 명목 변수간의 관계를 관찰하기 위해 이원 교차표를 사용한다
문제177. 직업(가로), 부서번호(세로), 직업별 부서번호별
인원수를 출력하시오 !
ANALYST CLERK MANAGER PRESIDENT SALESMAN
10 0 1 1 1 0
20 2 2 1 0 0
30 0 1 1 0 4
답:
tapply(emp$empno, list(emp$deptno, emp$job), length, default=0)
↑
여기는 아무값을 써도 상관없는 이유가
length가 갯수를 세는거니까!
만약 sum이나 mean 이면 sal을 써야된다.
※default =0 은 NA값을 0으로 하라는 명령어
length는 가로형 카운트
문제178.
위의 결과를 이원교차표를 출력하는 CrossTable 함수를 이용해서
위의 결과를 출력하시오
install.packages("gmodels")
library(gmodels)
CrossTable(x=emp$deptno, y=emp$job)
문제179.
직업별로 월급의 차이가 존재하는지 이원교차표로 확인하시오
월급 2500 을 기준으로
직업별로 각각 월급이 2500 이상인 사원과
2500 보다 적은 사원들이
어떻게 분포되어있는지 확인하시오
data.table(sal, sal>=2500)
이 data.table 로 true, false 나오는 걸 확인하고,
답:
CrossTable(emp$job, emp$sal>=2500)
■ 머신러닝에서 이원교차표를 어떻게 활용하는가?
학습시킨 모델의 정확도를 확인하고 분석하기 위해서 사용한다.
정상으로 예측model prediction 했는데
실제정답라벨이 암default(1)으로 나오는 경우를 0에 가깝게 해야 한다.
FN(False Negative)가 최악.
양성Benign 을 예측predict했는데
실제라벨test_labels가 암Malignant 일 경우가 최악의 상황이다.
우리의 목표는 이 건수를 최대한 0에 가깝에 줄여주는게 목표다.
'R' 카테고리의 다른 글
loop문 (0) | 2019.03.10 |
---|---|
if문 (0) | 2019.03.09 |
샤이니에 데이터 테이블 표시하는 방법 (0) | 2019.03.09 |
그래프(사분위수, 지도그래프, 워드클라우드) (0) | 2019.03.09 |
그래프(산포도, 구글 그래프) (0) | 2019.03.09 |