Supervised Learning (지도학습): 
- Training is necessary to build a model (트레이닝 필수)
- Needs pre-assigned category labels (카테고리명 미리할당 필수)
- Used for classification (분류법에 사용)

Unsupervised Learning (비지도 학습):
-No need for training ahead (트레이닝 불필요)
-No need for pre-assigned category labels (카테고리명 미리할당 불필요)
-Useful to find patterns (정밀 패턴에 유용)
-Used for Clustering (군집화에 사용)

 

 

https://blog.naver.com/myksh0903/222092335491

 

[머신러닝] Supervised vs Unsupervised learning

머신러닝의 학습 종류는 Supervised Learning 지도 학습과 Unsupervised Learning 비지도 학습 으로 나...

blog.naver.com

 

출처 : https://blog.naver.com/sjy5448/222458248562

 

Sensitivity 민감도 = TP/(TP+FN)

Specificity 특이성 = TN/(TN+FP)

Accuracy 정확도 = (TPs + TNs)/(Ts+Ns)

 

예제 MTE: Junk Food Tester

You are working for a school as a data scientist and your job is to make an AI model for lunch menus called Junk Food Tester (JFT), which will generate an alarm for Junk Food. JFT will scan each image of food and will generate either + or - result.

 

Here is the result after scanning 500 food images

- There are 100 Junk Food and 400 non-Junk Food images.

- From 100 Junk Food images, 90 were classified as Junk Food.

- From 400 non-Junk Food images, 100 were classified as Junk Food.

 

TP: 90FP: 10TN: 300

FN: 100

 

Sensitivity = 90/(90+100) = 90/190 = 0.47

Specificity = 300/(300+10) = 300/310 = 0.97

Accuracy = (Sensitivity+Specificity)/2 = 0.72 혹은 (TPs+TNs)/(Ts+Ns) = (90+300)/500 = 0.78

 

 

 

 

 

+ 추가내용

Predictive Value

Positive Predictive Value (PPV, PV+): the likelihood that the prediction is correct if the test result is positive.

Negative Predictive Value (NPV, PV-): the likelihood that the prediction is correct if the test result is negative.

t 검정(t-test)

이는 데이터 검정 방식 중에 하나로, 범주형 변수(집단이 2개)에 따른 연속형 변수의 차이를 확인할 때 사용된다. 즉 두 집단의 평균을 비교했을 때 차이가 있는지 확인하기 위한 분석 방법이다.

 

예제

건강검진정보를 이용해서 성별에 따른 신장에 차이가 있는지를 분석해보자.

 

귀무가설: 성별에 따라 신장에 차이가 없다.

대립가설: 성별에 따라 신장에 차이가 있다.

 

건강검진정보 <- read.csv("C:/Users/User/Downloads/국민건강보험공단_건강검진정보_20201231/국민건강보험공단_건강검진정보_20201231_1.csv")

sex <- as.factor(건강검진정보$성별코드)
height <- as.factor(건강검진정보$신장.5Cm단위.)

table(sex, height)

t.test(건강검진정보$성별코드, 건강검진정보$신장.5Cm단위.)

 

 p 값은 0.00000000000000022로 0.05보다 작게 나왔다. 즉, 귀무가설을 기각하고 대립가설을 지지하므로, 성별에 따라 신장에는 차이가 있다고 분석할 수 있다.

귀무가설(null hypothesis)

 영가설이라고도 불리는 귀무가설은 쉽게 말해 아무것도 일어나지 않는다는 의미이다. 예를 들어, '직업에 따라 몸무게에 차이가 없을 것이다.', '나이에 따라 키 차이가 없을 것이다' 등을 예로 들 수 있다.

 

대립가설(alternative hypothesis)

 이는 귀무가설과 반대로 무언가 일어났다는 의미이다. 예를 들어, '직업에 따라 몸무게에 차이가 있을 것이다.', '나이에 따라 키 차이가 있을 것이다.' 등을 예로 들 수 있다.

 

유의수준(significance level)

 상관관계가 '있다', '없다'의 기준이 되고 오류를 허용할 범위를 설정하는 값을 의미한다. 쉽게 말해 유의수준 0.1은 90% 믿을 수 있다는 뜻으로 생각하면 되고, 이를 신뢰수준(confidence level)이 90%라고 표현하기도 한다. 유의수준이 작아질수록 신뢰수준은 높아진다. 즉 유의수준 0.05는 95%의 신뢰수준을 의미한다. 참고로 유의수준을 얼마로 정할지는 때에 따라 다르다. 때에 따라 요구하는 신뢰수준이 다르기 때문이다. 관습적으로 0.05의 유의수준을 사용하지만, 노이즈가 많다면 0.1의 유의수준을 사용하거나 고위험 분야에서는 0.01의 유의수준을 요구하기도 한다.

 

유의확률(significance probability)

오류가 나올 수 있는 확률을 의미한다. 이를 나타내는 수치가 p 값(p-value)이다. 유의수준과 분석 결과 나온 p 값을 비교하여 가설을 평가하는 것이 바로 가설검정(test of hypothesis)이다.

 


 

예시로 알아보기

예를 들어 평소에 늘 짜장면을 먹다가 언젠가부터 맛이 없어진 것 같아 짬뽕이 먹고 싶어졌다고 하자. 이러한 생각이 의미 있는지 가설을 검정해보려 귀무가설과 대립가설을 세우면 다음과 같다.

 

귀무가설: 짜장면과 짬뽕의 맛은 동일하다

대립가설: 짬뽕이 짜장면보다 맛있다.

 

유의 수준은 0.05로 결정했다고 하자. 이제 실제로 데이터를 수집해 컴퓨터로 계산한 결과 p 값이 0.03이 나왔다고 하자. 그러면 p 값이 유의수준 0.05보다 작다. 이 경우 귀무가설은 기각되고 대립가설이 채택된다. 즉 짬뽕이 더 맛있으므로 짬뽕을 먹겠다는 새로운 주장이 통계적으로 맞게 된다.

 

 

 

예시로 알아보기 2

먼저 분석에 앞서 가설을 미리 세우고 유의미한 값인지 판단하는 p 값으로 분석 결과를 나타낼 수 있다. '가설'이란 아직 검증되지 않은 추측적 예비 이론을 말한다. 분석 방법은 변수 종류가 범주형 변수인지 연속형 변수인지에 따라 달라진다. 변수 역시 영향을 주는 독립변수와 영향을 받는 종속변수 두 가지가 있으므로 이 조합에 따라 분석 방법이 달라진다.

독립변수(영향을 주는 변수) 종속변수(영향을 받는 변수) 분석 방법
범주형 변수 범주형 변수 카이제곱검정(교차표 분석)
연속형 변수 t 검정
분산분석(집단이 세 개 이상인 경우)
연속형 변수 범주형 변수 로지스틱 회기분석
다항 로지스틱 회기분석
연속형 변수 단순/다중회기분석
구조방정식
연속형 + 범주형 변수 범주형 변수 로지스틱 회기분석
의사결정나무
연속형 변수 공분산분석(ANCOVA)

예를 들어 직업이 몸무게에 미치는 영향이 있는지 분석한다면 영향을 주는 변수는 직업(범주형 변수)이고 영향을 받는 변수는 몸무게(연속형 변수)이다. 범주형 변수 -> 연속형 변수이므로 t 검정과 분산분석을 수행한다. 만일 변수의 집단이 세 개 이상이라면 분산분석을 사용한다.

 

summary 함수

R은 통계 기반의 언어이므로 간단히 summary 함수 하나만으로도 벡터, 행렬, 요인, 데이터 프레임 등에 대해 최솟값, 최댓값, 중앙값, 평균 등 기본적이면서도 유용한 통계치를 모두 보여준다.

요인 타입의 변수를 요약하면 수준별 도수도 알 수 있다. 예를 들어, 성별 코드를 요인으로 취급하여 summary 함수를 실행해보면, 1번인 남자는 424,668명, 2번인 여자는 575304명, 성별을 모르는 사람은 27명인 것을 알 수 있다.

Sensitivity(민감도) = TP / (TP + FN)

= 실제로 양성이며 측정 결과도 양성인 경우 / (실제로 양성이며 측정 결과도 양성인경우 + 실제로 양성이지만 측정 결과는 음성인 경우)

= 실제로 양성이라고 잘 측정한 수 / 실제로 양성인 경우

 

Specificity(특이도) = TN / (TN + FP)

= 실제로 음성이며 측정 결과도 음성인 경우 / (실제로 음성이며 측정 결과도 음성인 경우 + 실제로 음성이지만 측정 결과는 양성인 경우)

= 실제로 음성이라고 잘 측정한 수 / 실제로 음성인 경우

ggplot?

데이터 분석에 있어서는 기본 함수들만 이용해도 충분하지만 보고서용 그래프와 같이 보다 미적인 그래프를 작성하려면 ggplot을 이용해야 한다. R의 강점 중 하나가 ggplot이라고 할 만큼 ggplot은 데이터 시각화에서 널리 사용되고 있다. ggplot을 이용하면 복잡하고 화려한 그래프를 작성할 수 있는 장점이 있지만, 그만큼 배우기 어렵다는 단점도 있다.

ggplot의 사례

 

 

 

 

 

ggplot 명령문의 형태

ggplot(data=xx, aes(x=x1, y=x2)) +
	geom_xx() +
	geom_yy() +
 ..

ggplot은 보통 하나의 ggplot() 함수와 여러 개의 geom_xx() 함수들이 +로 연결되어 하나의 그래프를 완성한다. 또한 ggplot() 함수의 매개변수로는 그래프를 작성할 때 사용할 데이터셋(data=xx)과 데이터셋 안에서 x축과 y축으로 사용할 열 이름(aes(x=x1, y=x2))을 지정한다. 그리고 이 데이터를 이용하여 어떤 형태의 그래프를 그릴지 geom_xx() 함수를 통해 지정한다. 예를 들면 geom_bar() 함수는 ggplot() 함수에서 지정한 데이터를 이용하여 막대그래프를 그리는 경우에 사용한다.

 

 

 

 

 

ggplot으로 막대그래프 작성하기

install.packages('ggplot2')
library(ggplot2)

month <- c(1, 2, 3, 4, 5, 6)
rain <- c(55, 50, 45, 50, 60, 70)
df <- data.frame(month, rain)
df

# 기본형
ggplot(df, aes(x=month, y=rain)) +
        geom_bar(stat='identity',
                 width=0.7,
                 fill='steelblue')

# aes(x=month, y=rain)
# aes() 함수를 통해 그래프를 그리기 위한 x축, y축 열을 지정한다.

# stat='identity'
# 막대의 높이는 ggplot() 함수에서 y축에 해당하는 열에 의해 결정되도록 지정한다.

# width=0.7
# 막대의 폭을 지정한다.

# fill='steelblue'
# 막대의 내부 색을 지정한다.

ggplot() 함수와 geom_bar() 함수가 + 기호로 연결되는데, + 기호는 반드시 명령문의 맨 마지막에 와야 한다. + 기호를 통해 다음 줄에 연결되는 함수가 있음을 R에게 알려주게 된다.

# 옵션 추가해서 그래프 다시 작성
ggplot(df, aes(x=month, y=rain)) +
        geom_bar(stat='identity',
                 width=0.7,
                 fill='steelblue') +
        ggtitle('월별 강수량') +
        theme(plot.title=element_text(size=25, face='bold', colour='steelblue')) +
        labs(x='월', y='강수량') +
        coord_flip()

# theme(plot.title=element_text(size=25, face='bold', colour='steelblue'))
# 폰트 크기는 25, 폰트 스타일은 bold, 색상은 어두운 파란색이다.

# coord_flip()
# 막대를 가로로 표시하도록 지정한다.

# 추가 예제

# 5개 반의 평균 성적을 막대그래프를 이용하여 작성하시오.
class <- c(1,2,3,4,5)
score <- c(65,75,63,50,60)
df <- data.frame(class,score)

ggplot(df, aes(x=class, y=score)) +
        geom_bar(stat='identity',
                 width=0.7, fill='green')

 

 

 

 

 

ggplot으로 히스토그램 작성하기

ggplot(iris, aes(x=Petal.Length)) +
        geom_histogram(binwidth=0.5)

# binwidth=0.5
# 히스토그램은 연속형 숫자 데이터에 대해 일정 길이로 구간을 나눈 후, 각 구간에 속하는 데이터값이 몇 개 있는지 센다. binwidth는 구간의 길이를 지정하는 매개변수로, 이 경우는 꽃잎의 길이를 0.5 간격으로 나누라는 의미이다.

# 꽃받침의 폭(Sepal.Width) 열에 대해 그룹별로 히스토그램을 작성하는 명령문
ggplot(iris, aes(x=Sepal.Width, fill=Species, color=Species)) +
        geom_histogram(binwidth=0.5, position='dodge') +
        theme(legend.position='top')
        
# x=Sepal.Width
# 히스토그램을 작성할 대상 열을 지정한다.

# fill=Species
# 히스토그램의 막대 내부를 채울 색을 지정한다. 여기서는 품종(Specise)을 지정했는데 품종(Specise)은 팩터 타입이므로 숫자 1,2,3으로 변환될 수 있다. 품종별로 막대의 색이 다르게 채워진다.

# color=Species
# 히스토그램의 막대 윤곽선의 색을 지정한다.

# binwidth=0.5
# 데이터의 구간을 0.5 간격으로 나누어 히스토그램을 작성한다.

# position='dodge'
# 이 히스토그램은 3개 품종의 히스토그램이 하나의 그래프 상에 작성된다. 동일 구간에 대해 3개의 막대가 작성되는데, position은 동일 구간의 막대들을 어떻게 그릴지를 지정한다. 'dodge'는 막대들을 겹치지 말고 병렬적으로 그리도록 지정하는 것이다.

품종별 히스토그램의 결과는 다음과 같다. 구간별로 분홍색, 초록색, 파란색 막대가 함께 표시된 것을 알 수 있다.

 

 

 

 

 

ggplot으로 산점도 작성하기

ggplot(data=iris, aes(x=Petal.Length, y=Petal.Width)) +
        geom_point()

# 매개변수 추가해서 다시 작성
ggplot(data=iris, aes(x=Petal.Length, y=Petal.Width,
                      color=Species)) +
        geom_point(size=3) +
        ggtitle('꽃잎의 길이와 폭') +
        theme(plot.title=element_text(size=25, face='bold', colour='steelblue'))

만약 점의 모양도 품종별로 다르게 하려면 ggplot() 함수의 aes() 함수에 shape=Species를 추가하면 된다.

# 추가 예제

# R에서 제공하는 cars 데이터셋을 이용해 x축은 자동차의 속력(speed), y축은 제동거리(dist)로 하여 ggplot으로 산점도를 작성하시오.
ggplot(data=cars, aes(x=speed, y=dist)) +
        geom_point()

 

 

 

 

 

ggplot으로 상자그림 작성하기

ggplot(data=iris, aes(x=Petal.Length)) +
        geom_boxplot(fill='yellow')
        
ggplot(data=iris, aes(y=Petal.Length)) +
        geom_boxplot(fill='yellow')

상자그림을 그릴 때 주의할 점은 상자그림을 그릴 대상 열을 지정할 때 ggplot() 함수의 aes() 함수에서 매개변수 x가 아닌 y에 Petal.Length를 지정해야 한다는 것이다.

# 꽃잎의 길이(Petal.Length)에 대해 품종(Species)별로 상자그림을 작성하는 코드
ggplot(data=iris, aes(x=Species, y=Petal.Length, fill=Species)) +
        geom_boxplot()

# 추가 예제

# R에서 제공하는 cars 데이터셋에서 제동거리(dist)에 대한 상자그림을 ggplot으로 작성하시오.
ggplot(data=cars, aes(y=dist)) +
        geom_boxplot(fill='red')

 

 

 

 

 

ggplot으로 선그래프 작성하기

year <- 1937:1960
cnt <- as.vector(airmiles)
df <- data.frame(year, cnt)
head(df)

ggplot(data=df, aes(x=year, y=cnt)) +
        geom_line(col='red')

# 추가 예제

# R에서 제공하는 airquaility 데이터셋에 대해 5월의 일별 온도(Temp) 변화를 ggplot의 선그래프로 나타내시오.
df <- subset(airquality, Month==5)
ggplot(data=df, aes(x=Day, y=Temp)) +
        geom_line(col='red')

 

방사형 차트란?

레이더 차트나 거미줄 차트라고도 부른다. 다중변수 데이터는 시각화가 어려운데 방사형 차트는 다중변수 데이터를 2차원 평면상에 시각화할 수 있는 몇 안 되는 도구 중 하나이다.

 

 

 

 

방사형 차트 작성하기 (기본)

install.packages('fmsb')
library(fmsb)

# (1) 데이터 준비
score <- c(80, 60, 95, 85, 40)
max.score <- rep(100, 5)
min.score <- rep(0, 5)
ds <- rbind(max.score, min.score, score)
ds <- data.frame(ds)
colnames(ds) <- c('국어', '영어', '수학', '물리', '음악')
ds

# (2) 방사형 차트
radarchart(ds)

 

 

 

다양한 매개변수 지정

radarchart(ds,
           pcol='dark green',
           pfcol=rgb(0.2, 0.5, 0.5, 0.5),
           plwd=3,
           cglcol='grey',
           cglty=1,
           cglwd=0.8,
           axistype=1,
           seg=4,
           axislabcol='grey',
           caxislabels=seq(0, 100, 25))

# pcol
# 다각형 윤곽선 색

# pfcol
# 다각형 내부 색

# plwd
# 다각형 선의 두께

# cglcol
# 거미줄의 색

# cglty
# 거미줄의 타입 (1은 실선)

# cglwd
# 거미줄의 두께

# axistype
# 축의 레이블 타입(0~5)
# 0: 눈금에 레이블을 붙이지 않음(default)
# 1: 차트 상단 중심축에만 레이블 표시

# seg=4
# 축의 눈금 분할(이 경우 1~100 사이를 4등분하고 눈금 수는 5)

# axislabcol
# 축의 레이블 색

# caxislabels
# 축의 레이블 값
# seq(0, 100, 25)는 0, 25, 50, 75, 100을 의미한다.
# 매개변수 seg에서 지정한 눈금수와 개수가 맞도록 지정한다.

'Data Science > R' 카테고리의 다른 글

[R 언어] sensitivity and specificity  (0) 2021.11.17
[R 시각화 심화] ggplot  (0) 2021.10.05
[R 시각화 심화] 나무지도 그리기  (0) 2021.10.05
[R 시각화] 산점도 그리기  (0) 2021.10.05
[R 시각화] 상자그래프 그리기  (0) 2021.10.05

나무지도란?

사각 타일의 형태로 표현되는 나무지도는 데이터의 정보를 타일의 크기와 색깔로 나타낼 수 있다. 또한 타일들은 계층 구조로 되어 있어서 데이터에 존재하는 계층 구조까지 표현할 수 있다.

 

나무지도 작성하기

# 나무 지도 패키지 설치
install.packages('treemap')
library(treemap)

# 2014년도의 전 세계 국가별 인구 및 국민총소득(GNI), 소속 대륙 정보 가져오기
data(GNI2014)
head(GNI2014)

treemap(GNI2014,
        index=c('continent', 'iso3'),
        vSize='population',
        vColor='GNI',
        type='value',
        bg.labels='yellow',
        title="World's GNI")
        

# index=c('continent', 'iso3')
# 나무지도 상에서 타일들이 대륙(continent) 안에 국가(iso3)의 형태로 배치되는 것을 지정한다.

# vSize='population'
# 타일의 크기를 결정하는 열을 지정하는데, 여기서는 인구수(population)로 지정했다.

# vColor='GNI'
# 타일의 색상을 결정하는 열을 지정하는데, 여기서는 소득(GNI)으로 지정했다.

# type='value'
# 타일의 컬러링 방법을 지정하는 것으로, 'value'는 vColor에서 지정한 열에 저장된 값의 크기에 의해 색이 결정됨을 의미한다. 'value' 외에도 'index', 'comp', 'dens' 등을 지정할 수 있다.

# bg.labels='yellow'
# 대륙을 나타내는 레이블의 배경색을 지정한다.

iso3 은 국가를 식별하는 표준 코드이다. 타일의 면적은 인구수와 비례하고 타일의 색깔은 GNI를 의미하는데, 소득이 높을수록 진한 초록색에 가깝고 낮을수록 노란색에 가깝다. 타일들은 굵은 테두리선에 의해서 대륙으로 묶여져 있으며, 대륙의 이름이 노란색 바탕의 글씨로 표기되어 있다.

 

 

 

state.x77 데이터셋으로 나무지도 예시 더 알아보기

# treemap 패키지 불러오기
library(treemap)
# 매트릭스를 데이터프레임으로 변환
st <- data.frame(state.x77)
# 주의 이름 열 stname을 추가
st <- data.frame(st, stname=rownames(st))

treemap(st,
        index=c('stname'),
        vSize='Area',
        vColor='Income',
        type='value',
        title='USA states area and income')

# state.x77 데이터셋에서 타일의 면적은 인구(Population)로 하고, 타일의 색은 문맹률(Illiteracy)로 지정한 나무지도를 작성하시오.
treemap(st,
        index=c('stname'),
        vSize='Population',
        vColor='Illiteracy',
        type='value',
        title='USA states 인구와 문맹률')


# index=c('stname')
# 타일에 주 이름 표기

# vSize='Population'
# 타일의 크기

# vColor='Illiteracy'
# 타일의 컬러

# type='value'
# 타일의 컬러링 방법

산점도란?

다중변수 데이터에서 두 변수에 포함된 값들을 2차원 그래프상에 점으로 표현하여 분포를 관찰할 수 있도록 하는 도구이다. 데이터의 주제를 통계 용어로 변수(variable)라고 하는데, 이러한 변수(=열)들 간 분석을 지원하는 것이 산점도이다.

 

 

 

두 변수 사이의 산점도

wt <- mtcars$wt
mpg <- mtcars$mpg

plot(wt, mpg,
     main='중량-연비 그래프',
     xlab='중량',
     ylob='연비(MPG)',
     col='red',
     pch=19)

# pch
# point의 종류이다. 즉, 점의 모양을 지정한다.

 

 

 

여러 변수들 간의 산점도

vars <- c('mpg', 'disp', 'drat', 'wt')
target <- mtcars[,vars]
head(target)
plot(target, main='Multi plots')

 

 

 

그룹 정보가 있는 2개 변수의 산점도

iris.2 <- iris[,3:4]
levels(iris$Species)
group <- as.numeric(iris$Species)
group
color <- c('red', 'green', 'blue')

plot(iris.2,
     main='Iris plot',
     pch=c(group)
     col=color[group])

legend(x='bottomright',
       legend=levels(iris$Species),
       col=c('red', 'green', 'blue'),
       pch=c(1:3))

# legend() 함수
# 작성된 산점도 위에 범례를 겹쳐 출력할 때 사용한다.

# legend 옵션
# 범례에 표시할 항목을 지정한다.

# levels(iris$Species)
# 품종의 이름을 나타낸다.

+ Recent posts