강의 : [Fast campus] Data Science with R 1기 - 이부일 강사님
R 공부하면서 배운 내용 복습 겸 정리하는 곳입니다.
# R에서 제공해주는 hflights 패키지 사용
# 예제 데이터 : hflights::hflights
# 패키지::데이터 : 괄호가 없으면 데이터 불러오기
※ 자료의 종류 : 통계적인 관점
# 질적 자료 vs 양적자료
# 질적 자료 : 글자(문자), 숫자(의미가 없는 숫자)
# 양적 자료 : 숫자(의미가 있는 숫자 - 사칙연산이 가능)
※ 일변량(Uni-variate) 질적 자료의 분석
# 일변량 => 하나의 열
1. 표 = 빈도표
# 빈도(frequence), 백분율(percent)
(1) 빈도 : table(데이터명$변수명)
# R에서 table은 질적자료의 빈도를 구할 때 많이 사용
| > sort(table(hflights$Month), + decreasing = TRUE) 7 8 6 3 5 12 1 10 4 9 11 2 20548 20176 19600 19470 19172 19117 18910 18696 18593 18065 18021 17128 | cs |
(2) 백분율 = (빈도/합계) * 100
# prop.table(빈도결과) * 100
# prop = proportional(비율)
# 비율 : 0~1 / 백분율 : 0~100
# 백분율은 소수점 한 자리 까지만 보고서에 작성
| > round(sort(prop.table(table(hflights$Month))*100, + decreasing = TRUE), + digits = 1) 7 8 6 3 5 12 1 10 4 9 11 2 9.0 8.9 8.6 8.6 8.4 8.4 8.3 8.2 8.2 7.9 7.9 7.5 | cs |
## prettyR 패키지
# prettyR::freq(데이터명$변수명)
| > prettyR::freq(hflights$Month) Frequencies for hflights$Month 7 8 6 3 5 12 1 10 4 9 11 2 NA 20548 20176 19600 19470 19172 19117 18910 18696 18593 18065 18021 17128 0 % 9 8.9 8.6 8.6 8.4 8.4 8.3 8.2 8.2 7.9 7.9 7.5 0 %!NA 9 8.9 8.6 8.6 8.4 8.4 8.3 8.2 8.2 7.9 7.9 7.5 | cs |
# 결과는 백분율과 유효백분율이 나타남
# 유효백분율 : 실질적으로 응답한 사람(NA제외)
# display.na = FALSE : 유효백분율이 출력되지 않음
2. 그래프 : 막대그래프(세로, 가로), 원그래프
(1) 막대그래프
# barplot(빈도결과) - 기본 세로 막대그래프
# 그래프에 다양한 arguments를 추가
| barplot(sort(table(hflights$Month), decreasing = TRUE), col = "skyblue", main = "월별 운항의 현황", ylab = "운항 횟수", ylim = c(0, 25000) ) | cs |
# 막대 색깔 : col = "color"
# 그래프 제목 : main = "제목"
# y축 제목 : ylab = "축제목"
ylab = y label의 약자
y축 제목은 꼭 써야한다.
# y축 눈금 : ylim = c(최소값, 최대값)
ylim = y limit의 약자
y축의 최소값은 0으로 해야된다.
* 절단효과 : 최소값을 올리게 되면 전체적인 차이가 더 크게 보일 수 있기 때문
# 가로 막대 그래프 : horiz = TRUE
| barplot(sort(table(hflights$Month), decreasing = TRUE), col = "skyblue", main = "월별 운항의 현황", xlab = "운항 횟수", xlim = c(0, 25000), horiz = TRUE ) | cs |
# 가로 막대 그래프로 변경 했기에 xlab, xlim 으로 바꿔야 함
# 젤 위에 가장 큰 값을 주어야 한다. => 내림차순
(2) 원그래프
# pie(빈도)
# 원 그래프는 조각이 5개 이하인 경우에만 사용
| pie(sort(table(hflights$Month), decreasing = TRUE), radius = 1.0, init.angle = 90) | cs |
# 반지름 : radius = 0.8 (기본값)
# 첫 번째 조각의 각도 : init.angle =
※ 일변량(Uni-variate) 양적 자료의 분석
1. 표
# 구간의 빈도, 백분율
# 최소값, 최대값
| > range(hflights$ArrDelay, + na.rm = TRUE) [1] -70 978 | cs |
# 구간의 개수 구하는 법
1. Sturge's : 1+3.3*log10(데이터의 개수)
| > 1 + 3.3*log10(length(hflights$ArrDelay)) [1] 18.67801 | cs |
2. sqrt(데이터의 개수)
| > sqrt(length(hflights$ArrDelay)) [1] 476.9654 | cs |
... 기타 등
# 구간의 폭 = 계급의 폭
# (최대값 - 최소값) / 구간의 개수
# 첫 번째 구간에는 최소값 포함, 마지막 구간에는 최대값이 포함되어야 함
| > range(hflights$ArrDelay, na.rm = TRUE) [1] -70 978 > diff(range(hflights$ArrDelay, na.rm = TRUE)) [1] 1048 | cs |
# diff(숫자)
# diff( c(1, 3, 5) ) => 3-1 / 5-3 => 2개씩 짝 지어서 계산됨
| > diff( c(1, 3, 5) ) [1] 2 2 | cs |
# cut을 통해 내가 원하는 구간별로 나눌 수 도 있다.
| hflights$ArrDelay.group = cut(hflights$ArrDelay, breaks = seq(from = -120, to = 1020, by = 60), right = FAㅣSE) | cs |
2. 그래프
(1) 히스토그램(Histogram)
i. hist(데이터명$변수명) : Sturge 공식 적용
ii. hist(데이터명$변수명, breaks = 구간의 개수)
| hist(hflights$ArrDelay, breaks = 100) | cs |
iii. hist(데이터명$변수명, breaks = 구간의 정보)
| hist(hflights$ArrDelay, breaks = seq(from = -120, to = 1020, by = 60), xlim = c(-120, 1020)) | cs |
(2) 상자그림(Boxplot) : 이상치 유무 판별
i. boxplot(데이터명$변수명)
| boxplot(hflights$ArrDelay) | cs |
ii. 집단별 상자그림
# boxplot(데이터명$변수명 ~ 데이터명$변수명)
# boxplot( 양적자료 ~ 질적자료 )
# R의 관점에서 factor형태로 되어 있어야 한다.
| boxplot(hflights$ArrDelay ~ hflights$Origin) boxplot(hflights$ArrDelay ~ hflights$Month) | cs |
# boxplot을 통해 각 이상치를 제거할까? 변환할까? 등을 판별
3. 기술통계량 = 요약통계량 => 숫자
# Descriptive Statistics = Summary Statistics
# 모수(Parameter) vs 통계량(Statistics)
# 모집단(Population) vs 표본(Sample)
# 기술통계량, 요약통계량 => 표본에서 나온 것
# 모수는 모집단이 어떻게 형태인지 알려주는 수많은 숫자들
# 모집단의 평균, 표준편차, 최소값, 최대값... 등 => 모수 (하지만 현실에서는 대부분 알 수 없다.)
# 표본에서 나온 평균, 표준편차, 최소값, 최대값... 등 => 통계량
# 양적 자료를 바탕으로 다양한 숫자를 만들어내는 것 = 통계량
# 통계적 추론 : 표본으로 부터 나온 통계량을 바탕으로 모집단의 모수들을 추측
(1) 중심 = 대표값
# 평균, 절사평균, 중위수(중앙값), 최빈수(최빈값)
# 절사평균 : 평균은 이상치(Outlier)에 영향을 많이 받는다. -> 이상치를 뺀 평균
# 최빈수 : 동일한 값이 많이 나타난 수
i. 평균
# mean(데이터명$변수명, na.rm = TRUE)
| > mean(hflights$ArrDelay, na.rm = TRUE) [1] 7.094334 | cs |
# 하지만 이 평균을 가지고 분석을 시행하기에는 위험하다.
# 이상치(Outlier)의 존재 때문
ii. 5% 절사평균(Trimmed Mean)
# mean(데이터명$변수명, trim = 0.05, na.rm = TRUE)
# 작은쪽, 큰쪽 각 5%씩 절사해서 90%의 평균을 계산하여 분석
# 5%는 바꿔도 되는 기준
| > mean(hflights$ArrDelay, trim = 0.05, na.rm = TRUE) [1] 3.121585 > mean(hflights$ArrDelay, trim = 0.1, na.rm = TRUE) [1] 1.847091 | cs |
iii. 중위수
# median(데이터명$변수명, na.rm = TRUE)
| > median(hflights$ArrDelay, na.rm = TRUE) [1] 0 | cs |
# 중위수 0을 기준으로 일찍 오거나 늦게 온 비행기가 50%씩 존재한다.
iv. 최빈수(Mode)
1) which.max(table(데이터명$변수명)
| > which.max(c(10, 5, 3, 200)) [1] 4 | cs |
# 벡터의 가장 큰 값 200의 index를 알려준다.
| > which.max(table(hflights$ArrDelay)) -4 54 | cs |
# -4가 54번째 있었다.
# ArrDelay 데이터에서 4분 일찍 도착한 게 가장 많았다.
2) prettyR::Mode()
| > prettyR::Mode(hflights$ArrDelay) [1] "-4" | cs |
(2) 퍼짐 = 산포 = '다름'
# 통계는 '다름'이 존재하기에 분석한다. 이 다름의 차이를 수치화 하여 나타냄
# 이 '다름'은 왜 발생했을까?
# 범위, 사분위수범위, 분산
# 표준편차(평균과의 차이), 중위수 절대편차(중위수와 차이)
# 범위와 표준편차는 이상치(Outlier)에 영향을 많이 받는다.
# 중위수 절대편차는 이상치(Outlier)의 영향을 적게 받는다.
i. 범위(Range)
| > range(hflights$ArrDelay, na.rm = TRUE) [1] -70 978 | cs |
# R에서 range()는 최소값, 최대값 2개를 알려준다.
# diff()를 통해 2개의 차이를 계산
| > diff(range(hflights$ArrDelay, na.rm = TRUE)) [1] 1048 | cs |
# 범위는 이상치의 영향을 많이 받는다.
# 그래서 나온게 사분위수 범위
ii. 사분위범위 = 사분위수범위 = IQR(Inter Quartile Range)
# IQR(데이터명$변수명, na.rm = TRUE)
| > IQR(hflights$ArrDelay, na.rm = TRUE) [1] 19 | cs |
# 범위(1048) , 사분위범위(19) 의 차이는 다르다.
# 사분위범위를 보고 항공기들은 19분정도 늦거나 일찍 도착하네 라고 생각 할 수 있음.
iii. (표본) 분산(Variance)
# 모든 데이터에서 평균을 빼고 제곱을 한다.
# 데이터 - 평균 : 편차(Deviation) => 편차를 다 더하면 0 => 따라서 제곱한 값을 사용
# 통게는 데이터의 합계가 아닌 '자유도'로 나눈다
# df : degree of freedom
# var(데이터명$변수명, na.rm = TRUE)
| > var(hflights$ArrDelay, na.rm = TRUE) [1] 943.013 | cs |
# 분산은 각 데이터 제곱을 통해 계산하므로 ArrDelay의 결과는 '분의 제곱'이다.
iv. (표본) 표준편차(SD : Standard Deviation)
# sd(데이터명$변수명, na.rm = TRUE)
| > sd(hflights$ArrDelay, na.rm = TRUE) [1] 30.70852 | cs |
# 평균은 7분 정도 늦는데, 각 데이터들마다 평균과의 차이가 다름
# 여기서 평균과의 차이는 약 30분(표준편차)
# 즉, -27분 ~ 37분 범위 안에서 대부분 도착한다.
# 표준편차가 작다 - 평균이랑 가까운 데이터들
# 표준편차가 크다 - 평균이랑 먼 데이터들
v. 중위수 절대편차(MAD : Median Absolute Deviation)
# mad(데이터명$변수명, na.rm = TRUE)
| > mad(hflights$ArrDelay, na.rm = TRUE) [1] 13.3434 | cs |
# 중위수 절대편차를 기준으로 비행기들이 13분 늦거나 일찍오는구나 라고 생각
(3) 분포의 모양
# 데이터는 하나가 아니라 여러개다.
# R의 기본 기능에서는 못 구함 - 왜도, 첨도
i. 왜도(Skewness) : 대칭여부
# 왜도가 0에 가까운 값이라면 '데이터들이 대칭이다' 라고 볼 수 있다.
# 왜도가 0에서 멀어진다면 ' 데이터들이 비대칭이다'라고 볼 수 있다.
# 왜도 > 0 : 이상하게 큰 애가 있다면 오른쪽으로 긴 곡선
# 왜도 < 0 : 이상하게 작은 애가 있다면 왼쪽으로 긴 곡선
ii. 첨도(Kurtosis) : 중심이 얼마나 뾰족한가?
# 첨도가 0에 가까운 값이라면 중심이 보통높이
# 첨도 > 0 : 중심이 높아진다 -> 비슷한 데이터가 많이 있다.
# 첨도 < 0 : 중심이 낮아진다 -> 비슷한 데이터가 적다.
# psych::describe(), describeBy()
# R에서 by가 있다면 항상 집단별로 무엇을 한다는 의미
| > psych::describe(hflights$ArrDelay) vars n mean sd median trimmed mad min max range skew kurtosis se X1 1 223874 7.09 30.71 0 1.85 13.34 -70 978 1048 5.04 55.57 0.06 | cs |
# 결과 중 se : standard error(표준오차) : 0.06
# 지금 표본에서 평균이 7.09분이 나왔는데,
# '다른 표본'을 뽑으면 평균이 지금 표본의 평균과 달라질 것이다.
# 그렇다면 얼마나 달라질까를 알려주는 값 -> 표준오차
# psych::describeBy(데이터명$변수명, 데이터명$변수명)
# psych::describeBy(양적자료, 질적자료)
| > psych::describeBy(hflights$ArrDelay, hflights$Origin) Descriptive statistics by group group: HOU vars n mean sd median trimmed mad min max range skew kurtosis se X1 1 51309 7.49 31.95 -1 1.77 11.86 -44 822 866 4.98 46.08 0.14 ---------------------------------------------------------------- group: IAH vars n mean sd median trimmed mad min max range skew kurtosis se X1 1 172565 6.98 30.33 0 1.87 13.34 -70 978 1048 5.05 58.88 0.07 | cs |
# summary(데이터명$변수명)
# 질적 자료 = 빈도, 백분율 / 만약에 factor라면 빈도만 알려줌
# 양적 자료 = 6개(최소값, 최대값, 평균, 123사분위수)
# by(양적자료, 질적자료, 함수명)
| > by(hflights$ArrDelay, hflights$Origin, mean, na.rm = TRUE) hflights$Origin: HOU [1] 7.487946 ---------------------------------------------------------------- hflights$Origin: IAH [1] 6.977301 | cs |
# 공항이 2개가 있는데 각 공항에 대하서 ArrDelay에 대한 평균을 구해줘
# 질적자료를 기준으로 양적자료에 함수를 적용한 결과를 알려줌