강의 : [Fast campus] Data Science with R 1기 - 이부일 강사님

공부하면서 배운 내용 복습 겸 정리하는 곳입니다.


# R에서 제공해주는 hflights 패키지 사용
# 예제 데이터 : hflights::hflights
# 패키지::데이터 : 괄호가 없으면 데이터 불러오기

자료의 종류 : 통계적인 관점

  # 질적 자료 vs 양적자료

  # 질적 자료 : 글자(문자), 숫자(의미가 없는 숫자)

  # 양적 자료 : 숫자(의미가 있는 숫자 - 사칙연산이 가능)


일변량(Uni-variate) 질적 자료의 분석

  # 일변량 => 하나의 열


1. 표 = 빈도표 

  # 빈도(frequence), 백분율(percent)


  (1) 빈도 : table(데이터명$변수명)

# R에서 table은 질적자료의 빈도를 구할 때 많이 사용

1
2
3
4
5
> 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

# 백분율은 소수점 한 자리 까지만 보고서에 작성 

1
2
3
4
5
6
> 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(데이터명$변수명)

1
2
3
4
5
6
7
> 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를 추가

1
2
3
4
5
6
barplot(sort(table(hflights$Month), decreasing = TRUE),
        col  = "skyblue",
        main = "월별 운항의 현황",
        ylab = "운항 횟수",
        ylim = c(025000)
)
cs

   # 막대 색깔 : col = "color"

# 그래프 제목 : main = "제목"

# y축 제목 : ylab = "축제목"

   ylab = y label의 약자

   y축 제목은 꼭 써야한다.

# y축 눈금 : ylim = c(최소값, 최대값)

   ylim = y limit의 약자

   y축의 최소값은 0으로 해야된다.

   * 절단효과 : 최소값을 올리게 되면 전체적인 차이가 더 크게 보일 수 있기 때문


# 가로 막대 그래프 : horiz = TRUE

1
2
3
4
5
6
7
barplot(sort(table(hflights$Month), decreasing = TRUE),
        col   = "skyblue",
        main  = "월별 운항의 현황",
        xlab  = "운항 횟수",
        xlim  = c(025000),
        horiz = TRUE
) 
cs

가로 막대 그래프로 변경 했기에 xlab, xlim 으로 바꿔야 함

젤 위에 가장 큰 값을 주어야 한다. => 내림차순


  

(2) 원그래프

# pie(빈도)

# 원 그래프는 조각이 5개 이하인 경우에만 사용

1
2
3
pie(sort(table(hflights$Month), decreasing = TRUE),
    radius     = 1.0,
    init.angle = 90)
cs

# 반지름 : radius = 0.8 (기본값)

# 첫 번째 조각의 각도 : init.angle = 



  일변량(Uni-variate) 양적 자료의 분석


1. 표

  # 구간의 빈도, 백분율

  # 최소값, 최대값

1
2
3
> range(hflights$ArrDelay,
+       na.rm = TRUE)
[1-70 978
cs

  

  # 구간의 개수 구하는 법

1. Sturge's : 1+3.3*log10(데이터의 개수)

1
2
> 1 + 3.3*log10(length(hflights$ArrDelay))
[118.67801
cs


2. sqrt(데이터의 개수) 

1
2
> sqrt(length(hflights$ArrDelay))
[1476.9654
cs

... 기타 등


  # 구간의 폭 = 계급의 폭

  # (최대값 - 최소값) / 구간의 개수

  # 첫 번째 구간에는 최소값 포함, 마지막 구간에는 최대값이 포함되어야 함    

1
2
3
4
5
> range(hflights$ArrDelay, na.rm = TRUE)
[1-70 978
 
> diff(range(hflights$ArrDelay, na.rm = TRUE))
[11048
cs

  # diff(숫자)

  # diff( c(1, 3, 5) ) => 3-1 / 5-3 => 2개씩 짝 지어서 계산됨

1
2
> diff( c(135)
[12 2
cs


  # cut을 통해 내가 원하는 구간별로 나눌 수 도 있다.

1
2
3
4
5
hflights$ArrDelay.group = cut(hflights$ArrDelay,
                              breaks = seq(from = -120,
                                           to = 1020,
                                           by = 60),
                              right = FAㅣSE
cs


2. 그래프

  (1) 히스토그램(Histogram)

i. hist(데이터명$변수명) : Sturge 공식 적용

1
hist(hflights$ArrDelay)
cs


ii. hist(데이터명$변수명, breaks = 구간의 개수)

1
2
hist(hflights$ArrDelay,
     breaks = 100)
cs


iii. hist(데이터명$변수명, breaks = 구간의 정보)

1
2
3
4
5
6
hist(hflights$ArrDelay,
     breaks = seq(from = -120,
                  to = 1020,
                   by = 60),
     xlim = c(-1201020))
 
cs

  

  (2) 상자그림(Boxplot) : 이상치 유무 판별

i. boxplot(데이터명$변수명)

1
boxplot(hflights$ArrDelay)
cs


ii. 집단별 상자그림

# boxplot(데이터명$변수명 ~ 데이터명$변수명)

# boxplot(     양적자료        ~      질적자료      )

# R의 관점에서 factor형태로 되어 있어야 한다.

1
2
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)

1
2
> mean(hflights$ArrDelay, na.rm = TRUE)
[17.094334
cs

# 하지만 이 평균을 가지고 분석을 시행하기에는 위험하다.

# 이상치(Outlier)의 존재 때문


ii. 5% 절사평균(Trimmed Mean)

# mean(데이터명$변수명, trim = 0.05, na.rm = TRUE)

# 작은쪽, 큰쪽 각 5%씩 절사해서 90%의 평균을 계산하여 분석

# 5%는 바꿔도 되는 기준

1
2
3
4
5
> mean(hflights$ArrDelay, trim = 0.05, na.rm = TRUE)
[13.121585
 
> mean(hflights$ArrDelay, trim = 0.1, na.rm = TRUE)
[11.847091
cs


iii. 중위수

# median(데이터명$변수명, na.rm = TRUE)

1
2
> median(hflights$ArrDelay, na.rm = TRUE)
[10
cs

# 중위수 0을 기준으로 일찍 오거나 늦게 온 비행기가 50%씩 존재한다.


iv. 최빈수(Mode)

  1) which.max(table(데이터명$변수명)

1
2
> which.max(c(1053200))
[14
cs

  # 벡터의 가장 큰 값 200의 index를 알려준다.


1
2
3
> which.max(table(hflights$ArrDelay))
-4 
54 
cs

  # -4가 54번째 있었다.

  # ArrDelay 데이터에서 4분 일찍 도착한 게 가장 많았다.


  2) prettyR::Mode()

1
2
> prettyR::Mode(hflights$ArrDelay)
[1"-4"
cs


  (2) 퍼짐 = 산포 = '다름' 

# 통계는 '다름'이 존재하기에 분석한다. 이 다름의 차이를 수치화 하여 나타냄

# 이 '다름'은 왜 발생했을까?

# 범위, 사분위수범위, 분산

# 표준편차(평균과의 차이), 중위수 절대편차(중위수와 차이)

# 범위와 표준편차는 이상치(Outlier)에 영향을 많이 받는다.

# 중위수 절대편차는 이상치(Outlier)의 영향을 적게 받는다.


i. 범위(Range)

1
2
> range(hflights$ArrDelay, na.rm = TRUE)
[1-70 978
cs

# R에서 range()는 최소값, 최대값 2개를 알려준다.

# diff()를 통해 2개의 차이를 계산

1
2
> diff(range(hflights$ArrDelay, na.rm = TRUE))
[11048
cs

# 범위는 이상치의 영향을 많이 받는다.

# 그래서 나온게 사분위수 범위


ii. 사분위범위 = 사분위수범위 = IQR(Inter Quartile Range)

# IQR(데이터명$변수명, na.rm = TRUE)

1
2
> IQR(hflights$ArrDelay, na.rm = TRUE)
[119
cs

# 범위(1048) , 사분위범위(19) 의 차이는 다르다.

# 사분위범위를 보고 항공기들은 19분정도 늦거나 일찍 도착하네 라고 생각 할 수 있음.


iii. (표본) 분산(Variance)

# 모든 데이터에서 평균을 빼고 제곱을 한다.

# 데이터 - 평균 : 편차(Deviation) => 편차를 다 더하면 0 => 따라서 제곱한 값을 사용

# 통게는 데이터의 합계가 아닌 '자유도'로 나눈다

# df : degree of freedom

# var(데이터명$변수명, na.rm = TRUE)

1
2
> var(hflights$ArrDelay, na.rm = TRUE)
[1943.013
cs

# 분산은 각 데이터 제곱을 통해 계산하므로 ArrDelay의 결과는 '분의 제곱'이다.


iv. (표본) 표준편차(SD : Standard Deviation)

# sd(데이터명$변수명, na.rm = TRUE)

1
2
> sd(hflights$ArrDelay, na.rm = TRUE)
[130.70852
cs

# 평균은 7분 정도 늦는데, 각 데이터들마다 평균과의 차이가 다름

# 여기서 평균과의 차이는 약 30분(표준편차)

# 즉, -27분 ~ 37분 범위 안에서 대부분 도착한다.

# 표준편차가 작다 - 평균이랑 가까운 데이터들

# 표준편차가 크다 - 평균이랑 먼 데이터들


v. 중위수 절대편차(MAD : Median Absolute Deviation)

# mad(데이터명$변수명, na.rm = TRUE)

1
2
> mad(hflights$ArrDelay, na.rm = TRUE)
[113.3434
cs

# 중위수 절대편차를 기준으로 비행기들이 13분 늦거나 일찍오는구나 라고 생각


  (3) 분포의 모양

# 데이터는 하나가 아니라 여러개다.

# R의 기본 기능에서는 못 구함 - 왜도, 첨도

i. 왜도(Skewness) : 대칭여부

# 왜도가 0에 가까운 값이라면 '데이터들이 대칭이다' 라고 볼 수 있다.

# 왜도가 0에서 멀어진다면 ' 데이터들이 비대칭이다'라고 볼 수 있다.

# 왜도 > 0 : 이상하게 큰 애가 있다면 오른쪽으로 긴 곡선

# 왜도 < 0 : 이상하게 작은 애가 있다면 왼쪽으로 긴 곡선


ii. 첨도(Kurtosis) : 중심이 얼마나 뾰족한가?

# 첨도가 0에 가까운 값이라면 중심이 보통높이

# 첨도 > 0 : 중심이 높아진다 -> 비슷한 데이터가 많이 있다.

# 첨도 < 0 : 중심이 낮아진다 -> 비슷한 데이터가 적다.


# psych::describe(), describeBy()

# R에서 by가 있다면 항상 집단별로 무엇을 한다는 의미

1
2
3
> 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(양적자료, 질적자료)

1
2
3
4
5
6
7
8
9
10
> 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(양적자료, 질적자료, 함수명)

1
2
3
4
5
6
> by(hflights$ArrDelay, hflights$Origin, mean, na.rm = TRUE)
hflights$Origin: HOU
[17.487946
---------------------------------------------------------------- 
hflights$Origin: IAH
[16.977301
cs

# 공항이 2개가 있는데 각 공항에 대하서 ArrDelay에 대한 평균을 구해줘

# 질적자료를 기준으로 양적자료에 함수를 적용한 결과를 알려줌

+ Recent posts