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 (군집화에 사용)
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.
영가설이라고도 불리는 귀무가설은 쉽게 말해 아무것도 일어나지 않는다는 의미이다. 예를 들어, '직업에 따라 몸무게에 차이가 없을 것이다.', '나이에 따라 키 차이가 없을 것이다' 등을 예로 들 수 있다.
대립가설(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보다 작다. 이 경우 귀무가설은 기각되고 대립가설이 채택된다. 즉 짬뽕이 더 맛있으므로 짬뽕을 먹겠다는 새로운 주장이 통계적으로 맞게 된다.
먼저 분석에 앞서 가설을 미리 세우고 유의미한 값인지 판단하는 p 값으로 분석 결과를 나타낼 수 있다. '가설'이란 아직 검증되지 않은 추측적 예비 이론을 말한다. 분석 방법은 변수 종류가 범주형 변수인지 연속형 변수인지에 따라 달라진다. 변수 역시 영향을 주는 독립변수와 영향을 받는 종속변수 두 가지가 있으므로 이 조합에 따라 분석 방법이 달라진다.
독립변수(영향을 주는 변수)
종속변수(영향을 받는 변수)
분석 방법
범주형 변수
범주형 변수
카이제곱검정(교차표 분석)
연속형 변수
t 검정 분산분석(집단이 세 개 이상인 경우)
연속형 변수
범주형 변수
로지스틱 회기분석 다항 로지스틱 회기분석
연속형 변수
단순/다중회기분석 구조방정식
연속형 + 범주형 변수
범주형 변수
로지스틱 회기분석 의사결정나무
연속형 변수
공분산분석(ANCOVA)
예를 들어 직업이 몸무게에 미치는 영향이 있는지 분석한다면 영향을 주는 변수는 직업(범주형 변수)이고 영향을 받는 변수는 몸무게(연속형 변수)이다. 범주형 변수 -> 연속형 변수이므로 t 검정과 분산분석을 수행한다. 만일 변수의 집단이 세 개 이상이라면 분산분석을 사용한다.
summary 함수
R은 통계 기반의 언어이므로 간단히 summary 함수 하나만으로도 벡터, 행렬, 요인, 데이터 프레임 등에 대해 최솟값, 최댓값, 중앙값, 평균 등 기본적이면서도 유용한 통계치를 모두 보여준다.
요인 타입의 변수를 요약하면 수준별 도수도 알 수 있다. 예를 들어, 성별 코드를 요인으로 취급하여 summary 함수를 실행해보면, 1번인 남자는 424,668명, 2번인 여자는 575304명, 성별을 모르는 사람은 27명인 것을 알 수 있다.
데이터 분석에 있어서는 기본 함수들만 이용해도 충분하지만 보고서용 그래프와 같이 보다 미적인 그래프를 작성하려면 ggplot을 이용해야 한다. R의 강점 중 하나가 ggplot이라고 할 만큼 ggplot은 데이터 시각화에서 널리 사용되고 있다. ggplot을 이용하면 복잡하고 화려한 그래프를 작성할 수 있는 장점이 있지만, 그만큼 배우기 어렵다는 단점도 있다.
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에게 알려주게 된다.
# 추가 예제
# 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'는 막대들을 겹치지 말고 병렬적으로 그리도록 지정하는 것이다.
품종별 히스토그램의 결과는 다음과 같다. 구간별로 분홍색, 초록색, 파란색 막대가 함께 표시된 것을 알 수 있다.
사각 타일의 형태로 표현되는 나무지도는 데이터의 정보를 타일의 크기와 색깔로 나타낼 수 있다. 또한 타일들은 계층 구조로 되어 있어서 데이터에 존재하는 계층 구조까지 표현할 수 있다.
나무지도 작성하기
# 나무 지도 패키지 설치
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'
# 타일의 컬러링 방법
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)
# 품종의 이름을 나타낸다.