02.통계데이터분석 - 데이터 요약 - 연속형 변수.R
0.01MB

# 통계데이터분석 - 데이터 요약 - 연속형 변수 🔑 중심경향지표 | 중위수, 백분위수, 사분위수, 평균 | 변동성지표 | 범위, 사분위 범위, 분산, 표준편차
# https://www.youtube.com/watch?v=eF4Kl7xeJOI&list=PLY0OaF78qqGAxKX91WuRigHpwBU0C2SB_&index=3

library(MASS)
str(survey) # survey 데이터셋은 237명의 응답자로부터 수집한 12개의 정보가 저장. Pulse변수는 응답자의 맥박수를 나타냄

# 1. 비율에 대응되는 관측값 계산

# 맥박수에 대한 중위수를 계산
median(survey$Pulse) # 중위수는 작은 값에서 큰 값의 순서로 크기순으로 데이터값을 정렬했을 때 중앙에 위치하는 값을 의미 (전체 관측값의 절반보다는 크고 나머지 절반보다는 작은 값으로 정의)

# na.rm: NA를 포함하지 않고 중위수를 계산하라는 인수
median(survey$Pulse, na.rm=TRUE)


# 중위수는 크기순으로 정렬된 데이터셋을\절반으로 분할하는 값인데 이와 비슷한 방식으로 데이터셋을 백분위 비율로 분할하는 값을 구할 수 있고 이렇게 계산한 값을 백분위수라 함
quantile(survey$Pulse, probs=.05, na.rm =TRUE)

# 중위수는 50번째 백분위수임: 앞서 구한 중위수와 일치
quantile(survey$Pulse, probs=.5, na.rm =TRUE)

# quantile() 함수의 probs 인수에는 벡터를 지정할 수 있음. 두 개 이상의 비율을 벡터로 지정하게 되면 해당 비율에 해당하는 백분위수가 출력
quantile(survey$Pulse, probs=c(.5,.95), na.rm =TRUE) # 5번째 백분위수와 95번째 백분위수가 한꺼번에 출력

# 25번째 백분위수, 50번째 백분위수, 75번째 백분위수는전체 관측값을 4등분하기 때문에 별도로 사분위수라고 부르기도 함. 
# 25번째 백분위수: 첫번째 사분위수,1st quartile or Q1  
# 75번째 백분위수: 세번째 사분위수, 3rd quartile or Q3

?quantile
# probs 인수에 기본적으로 seq() 함수가 적용돼 미지정시, 0부터 1사이에 0.25 간격으로 5개 숫자 대응되는 백분위수 산출
seq(0, 1, 0.25)
# [1] 0.00 0.25 0.50 0.75 1.00

quantile(survey$Pulse, na.rm =TRUE) # 최소값 및 최대값과 함께 사분위수가 출력
# 0%   25%   50%   75%  100% 
# 35.0  66.0  72.5  80.0 104.0

# 2. 특정 값 주어졌을때 이 값에 대응되는 백분위 비율 계산
# 질문) 80 이하의 맥박수를 갖고 있는 사람이 전체의 몇퍼센트인가?

mean(survey$Pulse <= 80, na.rm = TRUE)
# [1] 0.7552083
# 맥박수가 80 이하인 응답자의 비율 

mean(survey$Pulse, na.rm = TRUE)

# 데이터셋의 summary() 함수를 적용하면 최소값, 최대값, 사분위수, 중위수, 평균과 같은 기초 기술통계량 한꺼번 산출. 적용되는 데이터 형식에 따라서 조금씩 다르게 작동
str(iris)
summary(iris$Sepal.Width) # 데이터 형식이 숫자 벡터
# Min.   1st Qu.  Median   Mean   3rd Qu.  Max. 
# 2.000  2.800    3.000    3.057  3.300    4.400
# 최소값, 첫 번째 사분위수, 중위수, 평균, 세 번째 사분위수 그리고 최대값이 출력

summary(iris$Species) # 데이터 형식이 팩터
# setosa versicolor  virginica 
# 50         50         50
# 팩터의 레벨별 빈도 출력. 빈도표를 만들어 줌

summary(as.character(iris$Species)) # 데이터 형식이 문자
# Length   Class      Mode 
# 150      character  character
# 관측값의 개수 그리고 Class, Mode와 같은 변수 정보가 출력


# 3. summary함수 설명
# 행렬이나 df에 summary함수 적용 시 열단위로 요약통계량계산
# summary함수에 iris 데이터셋 전체 지정 시,
# 숫자 구성열 6개 기초통계량 출력
# 팩터 구성열 빈도 계산
summary(iris)

# 리스트 data type에 summary함수 적용 시, 단지 각 리스트 원소 크기와 데이터 형식만 출력
iris.lst <- as.list(iris) # iris df 데이터셋을 리스트로 변환해 확인
summary(iris.lst)

# 리스트 구조 데이터셋에서 요약통계량 계산위해 lapply함수로 리스트 각 원소를 summary함수로 넘기는 방식으로 해야 함
lapply(iris.lst, summary) # 리스트 구조 데이터셋에 포함된 각 원소들이 summary함수로 넘겨져 각 원소별로(여기선 각 열), 요약통계량 산출

# 4. 변동성 지표
library(MASS)
range(survey$Pulse, na.rm = TRUE) # range함수는 범위 자체를 출력이 아닌 최소값과 최대값 출력

# 분산과 표준편차는 가장 널리 사용되는 변동성지표
var(survey$Pulse, na.rm = TRUE)
sd(survey$Pulse, na.rm = TRUE)

# 5. 그외 기술통계량 보여주는 함수
str(mtcars) # 32개 자동차 모델에 대해 11가지 정보들저장

# 5-1. pastecs 패키지 내 stat.desc함수
install.packages("pastecs")
library(pastecs)
stat.desc(mtcars[c("mpg", "hp", "wt")]) 
# nbr.val: 관측값의 개수 출력
# nbr.null: NULL 값 개수 출력
# nbr.na: NA 값 개수 출력
  # 데이터셋에 NULL과 NA가 포함이 안 돼 모두 0이 출력
  # 32개 자동차 모델들이 사용돼 관측값 개수 32로 출력
# min, max: 최소값, 최대값
# range: 범위 / sum: 합계 / median: 중위수 / mean: 평균
# SE.mean: 표준오차
# CI.mean.0.95: 평균의 95% 신뢰구간
# 분산, 표준편차: var, std.dev
# coef.var: 변동계수(표준편차/평균)

# 5-2. psych 패키지 내 describe함수
install.packages("psych")
library(psych)
describe(mtcars[c("mpg", "hp", "wt")])
# 관측값 개수, 평균, 표준편차, 중위수
# trimmed: 절삭평균으로 기본값으로 상하위 10% 제외한 10%의 절삭평균 산출
# mad:중위수 절대편차/min:최소값/max:최대값/range:범위
# skew: 왜도, 분포의 치우침 정도 나타내고, 양수이면 정규분포에 비해 오른쪽으로 긴 꼬리를 갖는 분포를 갖고, 음수이면 왼쪽으로 긴 꼬리 갖는 분포 가짐
# kurtosis: 첨도, 분포의 뾰족함 정도 나타내고, 큰 값 가질수록 정점이 높은 분포를 나타냄. 첨도가 양수이면 정규분포에 비해 정점이 높은 분포를 가지고, 음수이면 정규분포에 비해 정점이 낮은 분포를 가짐
# se: 표준오차

# 6. 집단별 기술통계량을 계산
# 집단을 나타내는 변수가 포함돼 있을 때 집단별 기술통계량 계산 후 비교하는 데 관심을 갖는 경우가 많음
library(MASS)
str(survey)
levels(survey$Exer) # 운동습관 나타내는 집단변수로 팩터 형식, 즉, 범주형 변수로 저장

# 데이터셋 내 범주 나타내는 변수 포함시 범주별로 연속형 변수의 평균, 표준편차 등 계산

# 집단별 기술통계량을 계산 함수1: tapply 함수
# 문제1) 운동습관별 맥박수 평균
tapply(survey$Pulse, INDEX=survey$Exer, FUN=mean, na.rm=TRUE)
# 1st인수: 벡터 형식의 데이터셋 (집단별 맥박수 계산위해 맥박수로 지정)
# 2nd인수: INDEX 인수로 집단변수 지정(운동습관별 맥박수 평균을 계산위해운동습관 나타내는 Exer로 지정)
# 3rd인수: FUN 인수로 집단별로 적용할 통계량 계산 함수 지정(집단별로 맥박수 평균 계산위해 mean함수 적용)

# 문제2) 성별 맥박수 평균
tapply(survey$Pulse, INDEX=survey$Sex, FUN=mean, na.rm=TRUE)
 
# 문제3) 두 개 집단변수 모두 고려한 운동습관별, 성별 맥박수 평균: 두 개 집단변수가 교차표 행과 열로 사용돼 셀값으로 맥박수 평균 출력
tapply(survey$Pulse, INDEX=list(survey$Exer, survey$Sex), FUN=mean, na.rm=TRUE)
# INDEX 인수에 집단변수 두 개 지정하면 되고, 리스트 형식으로 지정

# 집단별 기술통계량을 계산 함수2: aggregate함수(tapply함수와 결과 동일하나 1) 출력 형태 다르고 2) df형식 데이터셋 처리가능하고 3) 사용자 정의 함수 지정가능)
aggregate(survey$Pulse, by=list(survey$Exer), FUN=mean, na.rm=TRUE) # tapply함수와 결과동일
aggregate(survey$Pulse, by=list(Exercise=survey$Exer), FUN=mean, na.rm=TRUE) # 집단변수 지정 시 이름지정 가능
aggregate(survey$Pulse, by=list(Exercise=survey$Exer, Sex=survey$Sex), FUN=mean, na.rm=TRUE) # tapply함수 같이 두 개의 집단변수를 지정가능)

# 1st인수 지정 데이터셋에 1개 변수만 지정할 수 있는 게 아닌 2개 이상 변수 지정해 "다수변수에 대한 집단별 기술통계량" 한꺼번에 계산 가능
aggregate( survey[c("Pulse", "Age")], by=list(Exercise=survey$Exer), FUN=mean, na.rm=TRUE) # 데이터셋으로 2개 변수 Pulse, Age 지정


# aggregate함수의 FUN 인수에는 R제공함수뿐 아니라 사용자 정의 함수도 지정가능
# 사용자 정의 함수: myStats (관측값 개수, 평균, 표준편차, 왜도, 첨도 계산해 출력)
myStats <- function(x, na.rm=FALSE) {
  if (na.rm) x <- x[!is.na(x)]
  n <- length(x)
  mean <- mean(x)
  sd <- sd(x)
  skew <- sum((x-mean)^3/sd^3)/n
  kurt <- sum((x-mean)^4/sd^4)/n - 3
  return(c(n=n, mean=mean, sd=sd, skewness=skew, kurtosis=kurt))
}

by(survey[c("Pulse", "Age")], INDICES=list(Exercise=survey$Exer), FUN=summary)
# 집단별 기술통계량을 계산 함수3: by 함수
# 1st인수: 데이터셋 (맥박수, 나이 지정)
# 2nd인수: INDICES 인수로 집단변수 지정(운동습관 나타내는 Exer로 지정)
# 3rd인수: FUN 인수로 사용함수 지정(summary로 지정)
aggregate(survey[c("Pulse", "Age")], by=list(Exercise=survey$Exer), FUN=summary) # 결과동일함

# by함수의 FUN 인수에 aggregate함수처럼 사용자 정의 함수 지정가능
# But, FUN 인수에 바로 지정 안되고, sapply함수에 데이터값을 하나씩 넘겨 처리하는 식으로 지정해야 함
by(survey[c("Pulse", "Age")], INDICES=list(Exercise=survey$Exer), FUN=function(x) sapply(x, myStats, na.rm=TRUE))


# 집단별 기술통계량을 계산 함수3: psych 패키지 내 describeBy함수
# 같은 패키지 내 describe함수와 동일 기술통계량을 집단별로 산출
# 1st인수: 데이터셋 (맥박수, 나이 지정)
# 2nd인수: group 인수로 집단변수 지정(운동습관 나타내는 Exer로 지정)
# 3rd인수: FUN 인수로 사용함수 지정(summary로 지정)
describeBy(survey[c("Pulse", "Age")], group=list(Exercise=survey$Exer))
# describeBy함수는는 사용자 정의 함수 지정불가
# 오직 describe함수 제공 기술통계량만을 출력

 

+ Recent posts