[R] 기술통계
기술통계란 자료를 그래프나 숫자등으로 요약하는 통계적 행위 및 관련 방법을 의미합니다. 기술통계를 통해 데이터의 분석에 앞서 전체적으로 데이터의 특징을 파악하고 데이터를 다양한 각도로 접근할 수 있습니다. 기술통계는 데이터를 요약하고 시각화해서 잘 설명하는 것이 중점을 두며 데이터에 대해서 쉽게 설명하기 위해서 시각화를 많이 활용합니다.
#01. 기술통계 절차
아래 절차에 따라 데이터의 기본 특성을 파악한 후 데이터 전처리와 데이터 정제 과정을 거쳐 분석을 진행하게 된다.
1) 데이터의 전체 크기와 형태
- 행과 열의 수를 확인한다.
- 10만건의 데이터 전체를 출력하는 것은 매우 부담이 큰 처리이므로 상위 n건, 하위 n건의 일부만을 확인한다.
2) 집단의 특성을 잘 나타내는 요약 통계량을 확인한다.
- 평균, 중앙값, 표준편차, 범위(최대값~최소값), 사분위수 등을 확인한다.
- 요약통계량을 상자그림으로 시각화하여 확인한다.
3) 전체 데이터의 데이터 분포를 확인한다.
- 구간별 자료의 개수를 나타내는 표(=도수분포표)를 산정한다.
- 도수 분포표를 그래프로 표현한 히스토그램을 확인한다.
#02. summery()
함수를 통한 기초 통계량 확인
summary()
를 이용하여 데이터의 기초통계량을 확인한다 .
1) 패키지 로드 및 샘플 데이터 준비
패키지 로드하기
REPO_URL = "https://cran.seoul.go.kr/"
if (!require(dplyr)) install.packages("dplyr", repos=REPO_URL)
library(dplyr)
샘플 데이터 준비하기
성적표 <- read.csv("https://data.hossam.kr/r/grade.csv", stringsAsFactors=F, fileEncoding="utf-8")
성적표
💻 출력결과
2) 기초 통계량 확인
데이터 프레임 전체에 대한 확인
summery()
함수에 데이터 프레임 객체를 파라미터로 전달하여 확인할 수 있다.
요약통계 <- summary(성적표)
요약통계
💻 출력결과
특정 컬럼에 대한 확인
summery()
함수에 데이터프레임$컬럼이름
형식으로 파라미터로 전달하여 확인할 수 있다.
국어 점수에 대한 요약통계량 확인
요약통계 <- summary(성적표$국어)
요약통계
💻 출력결과
3) 기초 통계량 정보 분석하기
이름 | 설명 |
---|---|
Min. | 최소값 |
1st Qu. | 1사분위 수 (하위 25% 지점의 데이터) |
Median | 중앙값 (=2사분위 수) (50% 지점의 데이터) |
Mean | 평균 |
3rd Qu. | 3사분위 수 (하위 75%, 상위 25% 지점의 데이터) |
Max. | 최대값 |
NA’s | 결측치 수 |
#03. 기초 통계량을 이해하기 위한 통계학 개념
1) 평균값
- 모든 값을 더한 후 개수로 나눈 값.
1, 2, 3, 4, 5, 100
의 평균은(1+2+3+4+5+100)/6
이므로19.17
이다.- 평균은 특정 값이 다른 값들의 범위와 차이가 큰 경우 신뢰도가 떨어진다.
- 위의 데이터에서 100에 해당하는 값은 다른 값들에 비해 극단적으로 높다. 이러한 값을 극단치라고 한다.
2) 중앙값
- 모든 값을 순서대로 정렬한 후 가운데 위치의 값.
- 평균의 신뢰도가 현저히 낮을 경우 데이터의 분포를 확인하기 위해 사용한다.
데이터의 수가 홀수개인 경우
- 모든 값을 순서대로 정렬한 후 가운데 위치의 값.
1, 2, 3, 4, 5
의 중앙값은3
이다.
데이터의 수가 짝수개인 경우
- 모든 값을 순서대로 정렬한 후 가운데 두 값의 평균.
1, 2, 3, 4, 5, 6
의 중앙값은(3+4)/2
이므로3.5
이다.
3) 사분위 수
- 데이터 표본을 4개의 동일한 부분으로 나눈 값.
- 사분위수를 사용하여 데이터 집합의 범위와 중심 위치를 신속하게 평가할 수 있다.
- 이는 데이터를 이해하는 데 중요한 첫 번째 단계이다.
용어 | 설명 |
---|---|
1사분위 수(Q1) | 데이터의 하위 25%가 이 값보다 작거나 같음. |
2사분위 수(Q2) | 중위수 데이터의 50%가 이 값보다 작거나 같음. (=중앙값) |
3사분위 수(Q3) | 데이터의 하위 75%가 이 값보다 작거나 같음. |
사분위간 범위(IQR) | 3사분위 수부터 1사분위 수 구간 |
1사분위 수
\[Q_1 = ((총도수 - 1) \times 0.25)+1\]3사분위 수
\[Q_3 = ((총도수 - 1) \times 0.75)+1\]- 반대로 말하면 데이터의 상위 25%는 3사분위 수 보다 크다.
- 예를 들어, 데이터가
7, 9, 16, 36, 39, 45, 45, 46, 48, 51
인 경우
Q1 = 14.25
Q2(중위수) = 42
Q3 = 46.50
사분위간 범위 = 14.25 ~ 46.50 또는 32.25
- 사분위수는 데이터의 관측치가 아닌 계산된 값이다.
- 사분위수를 정확하게 계산하려면 종종 두 관측치 사이를 보간해야 한다.
- 중위수와 사분위간 범위는 극단치의 영향을 받지 않기 때문에 평균 및 표준 편차보다 치우침이 많은 데이터의 중심 위치와 범위의 더 나은 측도가 될 수 있다.
#04. Wage 데이터셋에 대한 요약 통계량
1) 급여와 교육 수준에 대한 요약 통계량 확인하기
패키지 가져오기
REPO_URL <- "https://cran.seoul.go.kr/"
if (!require("ISLR")) { install.packages("ISLR", repos=REPO_URL) }
library(ISLR)
급여와 교육 수준에 대한 요약 통계량
summary(Wage[, c('wage', 'education')])
💻 출력결과
2) 해석
- wage의 최소값은 20.09이다.
- 교육수준은 5개의 그룹으로 구분된다.
- wage는 양적 변수 이다.
- education은 순서형 변수이다.
#05. 기초 통계량 항목을 개별적으로 확인하기 위한 함수
각각의 열별로 개별 조회를 위해서는 다음의 함수들을 사용한다.
기능 | 함수 | 출력결과 | 설명 |
---|---|---|---|
최대값 | max(성적표$국어) | 120 | |
최소값 | min(성적표$국어) | 63 | |
평균값 | mean(성적표$국어) | 92.2 | |
분산 | var(성적표$국어) | 419.2 | |
표준편차 | sd(성적표$국어) | 20.4743742273116 | |
중앙값 | median(성적표$국어) | 92 | |
길이 | length(성적표$국어) | 5 | |
순위 | rank(성적표$국어) | 4 2 3 1 5 | 데이터를 순서대로 정렬했을 때 해당 행이 몇 번째 순위인지 표시한다. |
역순정렬 | rev(성적표$국어) | 120 63 92 88 98 | |
순차정렬 | sort(성적표$국어) | 63 88 92 98 120 |
#05. 상자그림
데이터의 요약 정보를 시각화 해 놓은 그래프로 데이터의 범위, 사분위 수 등을 확인할 수 있는 시각화 자료이다.
아래 극단치 경계
\[Q1 - 1.5 \times (Q3 - Q1)\]위 극단치 경계
\[Q3 + 1.5 \times (Q3 - Q1)\]1) jupyter에서의 시각화 옵션 지정하기
a) 그래프 크기 설정
출력될 시각화 결과물의 사이즈를 지정한다. 한번 설정하면 다시 재설정하기 전까지는 이후의 모든 시각화 출력에 영향을 준다.
options(repr.plot.width=5, repr.plot.height=5)
b) 불필요한 경고 메시지 끄기
한글 처리 과정에서 표시되는 불필요한 경고 메시지가 표시되지 않도록 설정한다.
options(warn=-1)
c) 한글 폰트 처리하기
# 패키지 설치
REPO_URL <- "https://cran.seoul.go.kr/"
if (!require("extrafont")) install.packages("extrafont", repos=REPO_URL)
# 패키지 로드하기
library(extrafont)
# 시스템에서 폰트 가져오기
font_import(pattern = "NanumGothic")
# 폰트 목록 확인
ftable <- fonttable()
ftable$FamilyName
💻 출력결과
Loading required package: extrafont
Registering fonts with R
Importing fonts may take a few minutes, depending on the number of fonts and the speed of the system.
Continue? [y/n] y
Scanning ttf files in /Library/Fonts/, /System/Library/Fonts, ~/Library/Fonts/ ...
Extracting .afm files from .ttf files...
/Users/leekh/Library/Fonts/NanumGothic.ttf
: NanumGothic already registered in fonts database. Skipping.
/Users/leekh/Library/Fonts/NanumGothicCoding-Bold.ttf
: NanumGothicCoding-Bold already registered in fonts database. Skipping.
/Users/leekh/Library/Fonts/NanumGothicCoding.ttf
: NanumGothicCoding already registered in fonts database. Skipping.
Found FontName for 0 fonts.
Scanning afm files in /usr/local/Cellar/r/4.0.3/lib/R/library/extrafontdb/metrics
... 생략 ...
'NanumGothic''NanumGothicCoding''NanumGothicCoding'
2) 특정 컬럼에 대한 상자그림 표시하기
모든 컬럼이 숫자값으로만 이루어진 데이터프레임의 경우 boxplot(데이터프레임)
형식으로 전체 데이터 프레임을 지정하면, 모든 컬럼에 대해 일괄 처리한다.
하지만 현재 사용중인 샘플 데이터는 이름이라는 문자열 컬럼이 있기 때문에 한번에 일괄 표시는 할 수 없다.
영어 점수에 대한 상자 그림
boxplot(성적표$영어)
💻 출력결과
3) 다중 컬럼에 대한 상자그림
콤마로 시각화 하고자 하는 컬럼들을 나열한다.
국어, 영어 점수에 대한 상자 그림 표시
boxplot(성적표$국어, 성적표$영어)
💻 출력결과
4) 상자그림의 파라미터 사용하기
파라미터 | 설명 |
---|---|
col | 색상 |
main | 제목지정 |
xlab | x축 이름 |
ylab | y축 이름 |
xlim | x값 범위 |
ylim | y값 범위 |
names | 각 데이터 이름 |
파라미터를 지정한 상자그림
par(family = "NanumGothic") # 사용할 글꼴 지정
boxplot(성적표$국어, 성적표$수학,
col=c('#ffff00', '#ff6600'), # 색상값. 항목 수 만큼 백터로 지정
main='국어,수학 점수 분포',
xlab='과목',
ylab='점수',
xlim=c(0,3),
ylim=c(0,150),
names=c('국어','수학'))