강의 내용: https://rpubs.com/zau0hon/R_data_analytics
실습 data: http://naver.me/GNWHZpdr
상단 메뉴에서 File -> New File -> R Script를 선택합니다.
스크립트 창에 코드를 작성합니다. 예를 들어, 다음과 같이 작성할 수 있습니다.
RStudio는 R 프로그래밍 언어를 위한 통합 개발 환경(IDE)입니다. RStudio의 주요 패널과 기능을 소개합니다.
RStudio를 처음 사용할 때 설정해야 할 몇 가지 기본 사항을 소개합니다.
-> Global Options -> Appearance에서 테마를 변경할 수 있습니다.-> Global Options -> Pane Layout에서 패널의 위치를 조정할 수 있습니다.-> Set Working Directory -> Choose Directory를 선택하여 작업 디렉토리를 설정합니다.R에서는 다양한 연산자를 사용하여 기본적인 산술 연산을 수행할 수 있습니다.
## [1] 8
## [1] 2
## [1] 15
## [1] 1.666667
## [1] 2
## [1] 1
## [1] 125
## [1] TRUE
## [1] FALSE
## [1] FALSE
## [1] TRUE
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10.40 15.43 19.20 20.09 22.80 33.90
## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
## [1] 4
## [1] 2.302585
## [1] 1
## [1] 2
## [1] 22026.47
## [1] 20.09062
## [1] 19.2
## [1] 6.026948
## [1] 33.9 32.4 30.4 30.4 27.3 26.0 24.4 22.8 22.8 21.5 21.4 21.4 21.0 21.0 19.7
## [16] 19.2 19.2 18.7 18.1 17.8 17.3 16.4 15.8 15.5 15.2 15.2 15.0 14.7 14.3 13.3
## [31] 10.4 10.4
## [1] 21.0 22.8 21.4 18.7 18.1 14.3 24.4 19.2 17.8 16.4 17.3 15.2 10.4 14.7 32.4
## [16] 30.4 33.9 21.5 15.5 13.3 27.3 26.0 15.8 19.7 15.0
## [,1]
## [1,] 0.1508848
## [2,] 0.1508848
## [3,] 0.4495434
## [4,] 0.2172534
## [5,] -0.2307345
## [6,] -0.3302874
사용자 정의 함수: 특정 작업을 수행하는 함수를 직접 정의할 수 있습니다.
## [1] 8
# 정규화 함수: 데이터를 0과 1 사이로 정규화하는 함수(백분위수화)
normalize <- function(x) {
return((x - min(x)) / (max(x) - min(x)))
}
normalize(data)## [1] 0.4510638 0.4510638 0.5276596 0.4680851 0.3531915 0.3276596 0.1659574
## [8] 0.5957447 0.5276596 0.3744681 0.3148936 0.2553191 0.2936170 0.2042553
## [15] 0.0000000 0.0000000 0.1829787 0.9361702 0.8510638 1.0000000 0.4723404
## [22] 0.2170213 0.2042553 0.1234043 0.3744681 0.7191489 0.6638298 0.8510638
## [29] 0.2297872 0.3957447 0.1957447 0.4680851
벡터는 동일한 유형의 데이터를 저장하는 1차원 배열입니다. R에서 가장 기본적인 데이터 구조입니다.
## [1] 1 2 3 4 5
## [1] "a" "b" "c"
## [1] TRUE FALSE TRUE
## [1] 3 4 5 6 7
## [1] 1
리스트는 서로 다른 유형의 데이터를 저장할 수 있는 1차원 배열입니다. 벡터와 달리 다양한 데이터 유형을 포함할 수 있습니다.
# 리스트 생성: list() 함수를 사용하여 리스트를 생성합니다.
my_list <- list(name = "John", age = 25, scores = c(90, 85, 88))
# 리스트 접근: $ 연산자 또는 인덱스를 사용하여 리스트의 요소에 접근합니다.
my_list$name # name 서브 리스트 값을 보여준다 ## [1] "John"
## $age
## [1] 25
## [1] 25
## $scores
## [1] 90 85 88
## [1] 90 85 88
데이터 프레임은 행과 열로 구성된 2차원 데이터 구조로, 각 열은 서로 다른 유형의 데이터를 가질 수 있습니다. 데이터 분석에서 가장 많이 사용되는 구조입니다.
# 데이터 프레임 생성: data.frame() 함수를 사용하여 데이터 프레임을 생성합니다.
df <- data.frame(
name = c("John", "Jane", "Doe"),
age = c(25, 30, 22),
scores = c(90, 85, 88)
)
# 데이터 프레임 접근: $ 연산자 또는 인덱스를 사용하여 데이터 프레임의 요소에 접근합니다.
names <- df$name # "John", "Jane", "Doe"
first_row <- df[1, ] # 첫 번째 행
first_column <- df[, 1] # 첫 번째 열
# 데이터 프레임 요약: summary() 함수를 사용하여 데이터 프레임의 요약 통계를 확인합니다.
summary(df)## name age scores
## Length:3 Min. :22.00 Min. :85.00
## Class :character 1st Qu.:23.50 1st Qu.:86.50
## Mode :character Median :25.00 Median :88.00
## Mean :25.67 Mean :87.67
## 3rd Qu.:27.50 3rd Qu.:89.00
## Max. :30.00 Max. :90.00
## X names.precip. precip
## 1 1 Mobile 67.0
## 2 2 Juneau 54.7
## 3 3 Phoenix 7.0
## 4 4 Little Rock 48.5
## 5 5 Los Angeles 14.0
## 6 6 Sacramento 17.2
# readxl 패키지 설치 및 로드
# install.packages("readxl")
library(readxl)
# 엑셀 파일 읽기
bt <- read_excel("BreastTissue.xls", sheet="Data")
head(bt)## # A tibble: 6 × 11
## `Case #` Class I0 PA500 HFS DA Area `A/DA` `Max IP` DR P
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 car 525. 0.187 0.0321 229. 6844. 29.9 60.2 221. 557.
## 2 2 car 330 0.227 0.265 121. 3163. 26.1 69.7 99.1 400.
## 3 3 car 552. 0.232 0.0635 265. 11888. 44.9 77.8 254. 657.
## 4 4 car 380 0.241 0.286 138. 5402. 39.2 88.8 105. 494.
## 5 5 car 363. 0.201 0.244 125. 3290. 26.3 69.4 104. 425.
## 6 6 car 390. 0.150 0.0977 119. 2476. 20.9 49.8 108. 429.
데이터를 정리하는 데는 dplyr 패키지가 유용합니다. dplyr 패키지를 사용하면 데이터를 쉽게 필터링, 선택, 변환할 수 있습니다.
##
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# 데이터 필터링: 특정 조건에 맞는 데이터를 필터링할 수 있습니다.
# filter() 함수: 조건에 맞는 행을 선택합니다.
mt_mpg_ge_30 <- filter(mtcars, mpg >= 30)
mt_mpg_ge_30## mpg cyl disp hp drat wt qsec vs am gear carb
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
# 데이터 선택: 특정 열을 선택할 수 있습니다.
# select() 함수: 원하는 열만 선택합니다.
# 필요한 패키지 로드
library(tibble)
# 행 이름을 "car" 열로 변환하여 데이터프레임에 추가
mtcars <- rownames_to_column(mtcars, var = "car")
# 변경된 데이터셋 확인
select_mtcars <- select(mtcars, car, mpg)
head(select_mtcars)## car mpg
## 1 Mazda RX4 21.0
## 2 Mazda RX4 Wag 21.0
## 3 Datsun 710 22.8
## 4 Hornet 4 Drive 21.4
## 5 Hornet Sportabout 18.7
## 6 Valiant 18.1
# 데이터 변환: 데이터를 변환하거나 새로운 열을 추가할 수 있습니다.
# mutate() 함수: 새로운 열을 추가합니다.
transformed_data <- mutate(select_mtcars, mpg_category = ifelse(mpg > 20, "High", "Low"))
head(transformed_data)## car mpg mpg_category
## 1 Mazda RX4 21.0 High
## 2 Mazda RX4 Wag 21.0 High
## 3 Datsun 710 22.8 High
## 4 Hornet 4 Drive 21.4 High
## 5 Hornet Sportabout 18.7 Low
## 6 Valiant 18.1 Low
mtcars data로 기술통계량을 계산하고 요약 보고서를 만들어보겠습니다.
## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
## mpg cyl disp hp
## Min. :10.40 Min. :4.000 Min. : 71.1 Min. : 52.0
## 1st Qu.:15.43 1st Qu.:4.000 1st Qu.:120.8 1st Qu.: 96.5
## Median :19.20 Median :6.000 Median :196.3 Median :123.0
## Mean :20.09 Mean :6.188 Mean :230.7 Mean :146.7
## 3rd Qu.:22.80 3rd Qu.:8.000 3rd Qu.:326.0 3rd Qu.:180.0
## Max. :33.90 Max. :8.000 Max. :472.0 Max. :335.0
## drat wt qsec vs
## Min. :2.760 Min. :1.513 Min. :14.50 Min. :0.0000
## 1st Qu.:3.080 1st Qu.:2.581 1st Qu.:16.89 1st Qu.:0.0000
## Median :3.695 Median :3.325 Median :17.71 Median :0.0000
## Mean :3.597 Mean :3.217 Mean :17.85 Mean :0.4375
## 3rd Qu.:3.920 3rd Qu.:3.610 3rd Qu.:18.90 3rd Qu.:1.0000
## Max. :4.930 Max. :5.424 Max. :22.90 Max. :1.0000
## am gear carb
## Min. :0.0000 Min. :3.000 Min. :1.000
## 1st Qu.:0.0000 1st Qu.:3.000 1st Qu.:2.000
## Median :0.0000 Median :4.000 Median :2.000
## Mean :0.4062 Mean :3.688 Mean :2.812
## 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :1.0000 Max. :5.000 Max. :8.000
## mpg disp hp drat wt qsec
## 20.090625 230.721875 146.687500 3.596563 3.217250 17.848750
## mpg disp hp drat wt qsec
## 19.200 196.300 123.000 3.695 3.325 17.710
## mpg disp hp drat wt qsec
## 6.0269481 123.9386938 68.5628685 0.5346787 0.9784574 1.7869432
## vars n mean sd median trimmed mad min max range skew
## mpg 1 32 20.09 6.03 19.20 19.70 5.41 10.40 33.90 23.50 0.61
## cyl 2 32 6.19 1.79 6.00 6.23 2.97 4.00 8.00 4.00 -0.17
## disp 3 32 230.72 123.94 196.30 222.52 140.48 71.10 472.00 400.90 0.38
## hp 4 32 146.69 68.56 123.00 141.19 77.10 52.00 335.00 283.00 0.73
## drat 5 32 3.60 0.53 3.70 3.58 0.70 2.76 4.93 2.17 0.27
## wt 6 32 3.22 0.98 3.33 3.15 0.77 1.51 5.42 3.91 0.42
## qsec 7 32 17.85 1.79 17.71 17.83 1.42 14.50 22.90 8.40 0.37
## vs 8 32 0.44 0.50 0.00 0.42 0.00 0.00 1.00 1.00 0.24
## am 9 32 0.41 0.50 0.00 0.38 0.00 0.00 1.00 1.00 0.36
## gear 10 32 3.69 0.74 4.00 3.62 1.48 3.00 5.00 2.00 0.53
## carb 11 32 2.81 1.62 2.00 2.65 1.48 1.00 8.00 7.00 1.05
## kurtosis se
## mpg -0.37 1.07
## cyl -1.76 0.32
## disp -1.21 21.91
## hp -0.14 12.12
## drat -0.71 0.09
## wt -0.02 0.17
## qsec 0.34 0.32
## vs -2.00 0.09
## am -1.92 0.09
## gear -1.07 0.13
## carb 1.26 0.29
mtcars data의 mpg로 시각화하겠습니다.
ggplot(data = , mapping = aes(
)) + ()
aes() 함수로 변수와 시각적 속성을 매핑geom_function: 시각화 유형을 지정하는 함수 (예: geom_point(), geom_line())##
## 다음의 패키지를 부착합니다: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
# 레이어 추가: ggplot2는 여러 레이어를 추가하여 시각화를 풍부하게 할 수 있습니다.
ggplot(data = mtcars, mapping = aes(x = wt, y = mpg)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) # geom_smooth(): 회귀선을 추가하는 함수## `geom_smooth()` using formula = 'y ~ x'
# 색상 및 테마 설정
ggplot(data = mtcars, mapping = aes(x = wt, y = mpg, color = factor(cyl))) +
geom_point() +
theme_minimal()# color: 점의 색상을 실린더 수에 따라 다르게 설정
# theme_minimal(): 미니멀한 테마 적용
# 축 및 제목 설정
ggplot(data = mtcars, mapping = aes(x = wt, y = mpg)) +
geom_point() +
labs(title = "산점도 예제", x = "Weight", y = "Miles per Gallon")# ggplot2 패키지 설치 및 로드
# install.packages("ggplot2")
library(ggplot2)
# mpg 데이터셋을 사용하여 boxplot 생성
ggplot(data = mpg, mapping = aes(x = class, y = hwy, color = factor(cyl))) +
geom_boxplot() +
labs(title = "Class별 연비 분포", x = "Class", y = "Highway Miles per Gallon") +
theme_minimal()막대그래프는 이산형 변수를 집계 내는 그래프로 막대 도표는 이산형 변수를 x축으로 두고, y축은 빈도(Counting)나 양을 표현하는 도표입니다.
##
## 다음의 패키지를 부착합니다: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
library(carData) # TitanicSurvival 데이터가 있는 패키지 활성화
g1 <- ggplot(TitanicSurvival,aes(x=sex)) + geom_bar()
# x축에 sex 설정, y축은 설정하지 않음(자동집계; 빈도)
g2 <- ggplot(TitanicSurvival,aes(x=survived)) + geom_bar()
g3 <- ggplot(TitanicSurvival,aes(x=passengerClass)) + geom_bar()
g4 <- ggplot(TitanicSurvival,aes(x=age)) + geom_histogram(bins=10)
grid.arrange(g1,g2,g3,g4,nrow=2,ncol=2)## Warning: Removed 263 rows containing non-finite outside the scale range
## (`stat_bin()`).
col =, fill = 옵션을 줌으로써 그래프에 색을 더할 수가 있다. col옵션을 통해 색을 바꿔주며, 면적이 있는 그래프들은 fill 옵션을 통해 색을 변경해준다.g21 <- ggplot(TitanicSurvival,aes(x=sex)) + geom_bar(fill = "#1B9E77")
g22 <- ggplot(TitanicSurvival,aes(x=survived)) + geom_bar(fill = "#D95F02")
g23 <- ggplot(TitanicSurvival,aes(x=passengerClass)) + geom_bar(fill = "#7570B3")
g24 <- ggplot(TitanicSurvival,aes(x=age)) + geom_histogram(fill = "#E7298A", bins=10)
grid.arrange(g21,g22,g23,g24,nrow=2,ncol=2)## Warning: Removed 263 rows containing non-finite outside the scale range
## (`stat_bin()`).
library(RColorBrewer)
# 그래프 여백 조정
par(cex = 0.7) # 텍스트 크기를 70%로 설정
display.brewer.all(colorblindFriendly = TRUE)## [1] "#1B9E77" "#D95F02" "#7570B3" "#E7298A"
g31 <- ggplot(TitanicSurvival,aes(x=sex)) + geom_bar(aes(fill=survived)) + scale_fill_brewer(palette = "Dark2")
g32 <- ggplot(TitanicSurvival,aes(x=passengerClass)) + geom_bar(aes(fill=survived)) + scale_fill_brewer(palette = "Dark2")
g33 <- ggplot(TitanicSurvival,aes(x=age)) + geom_histogram(aes(fill=survived),bins=10) + scale_fill_brewer(palette = "Dark2")
g34 <- ggplot(TitanicSurvival,aes(x=survived)) + geom_bar(aes(fill=passengerClass)) + scale_fill_brewer(palette = "Dark2")
grid.arrange(g31,g32,g33,g34,nrow=2,ncol=2)## Warning: Removed 263 rows containing non-finite outside the scale range
## (`stat_bin()`).
범례 이름 편집: labs(fill = )을 추가해줌으로써 색 구분 정보를 나타내는 label 제목을 바꿔줄 수 있다.
# 생존자 별 클래스 비율 시각화
ggplot(TitanicSurvival,aes(x=survived)) +
geom_bar(aes(fill=passengerClass)) +
labs(fill = "Divided by passengerClass")# 클래스별 생존자 비율 시각화
ggplot(TitanicSurvival,aes(x=passengerClass)) +
geom_bar(aes(fill=survived)) +
labs(fill = "Divided by survived") g41 <- g31 + labs(fill = "Divided by survived") + theme(text = element_text(size = 10), legend.position = "top")
g42 <- g32 + labs(fill = "Divided by survived") + theme(text = element_text(size = 10), legend.position = "top")
g43 <- g33 + labs(fill = "Divided by survived") + theme(text = element_text(size = 10), legend.position = "top")
g44 <- g34 + labs(fill = "Divided by passengerClass") + theme(text = element_text(size = 10), legend.position = "top")
grid.arrange(g41,g42,g43,g44,nrow=2,ncol=2)## Warning: Removed 263 rows containing non-finite outside the scale range
## (`stat_bin()`).
geom_bar()에는 width=0.8이라고 기재하나 안하나 같은 그래프가 생성되지만, geom_text() 안에서는 반드시 width를 설정해줘야 label이 제대로 표시됨에 유의
ggplot(TitanicSurvival,aes(x=passengerClass, y=..count.., fill=survived)) +
geom_bar(position = "dodge", width=0.8) +
geom_text(stat = "count", aes(label=..count..),position = position_dodge(width=0.8), vjust=-0.5) +
scale_fill_brewer(palette = "Dark2") +
labs(fill = "Divided by survived") +
theme(text = element_text(size = 10), legend.position = "top")## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
누적막대그래프에서 막대 안쪽 가운데에 레이블을 위치. geom_text() 안의 position 항목을 position_stack()으로 설정. 그 안에서 vjust 값을 0.5로 설정
ggplot(data=TitanicSurvival, mapping = aes(x=passengerClass, y=..count.., fill=as.factor(survived))) +
geom_bar(position = "stack", width=0.8) +
geom_text(stat = "count", aes(label=..count..),position = position_stack(vjust=0.5)) +
scale_fill_brewer(palette = "Dark2") +
labs(fill = "Divided by survived") +
theme(text = element_text(size = 10), legend.position = "top")히스토그램은 연속형 변수를 일정 범위로 구간을 만들어 x축으로 설정, y축은 빈도(Counting)를 나타내는 그래프입니다.
# 구간 수정 및 색 입히기
ggplot(TitanicSurvival,aes(x=age)) +
geom_histogram(binwidth = 5,col='red',fill='royalblue') ## Warning: Removed 263 rows containing non-finite outside the scale range
## (`stat_bin()`).
연속형 변수를 집계 내는 그래프: 밀도그래프는 연속형 변수를 일정 범위로 구간을 만들어, x축으로 설정하고 y축은 밀도(density)를 나타내는 그래프입니다.
## Warning: Removed 263 rows containing non-finite outside the scale range
## (`stat_density()`).
## Warning: Removed 263 rows containing non-finite outside the scale range
## (`stat_density()`).
Box and Whisker(상자 수염)는 이산형 변수에 따라 연속형 변수의 분포 차이를 표현해주는 그래프로 데이터 탐색과정(EDA) 에서 매우 중요하게 쓰입니다.
mtcars$cyl<-as.factor(mtcars$cyl)
ggplot(mtcars,aes(x=cyl, y=mpg, group=cyl)) +
geom_boxplot(aes(fill = cyl)) +
xlab("엔진형태") +
ylab("연비") +
ggtitle("Boxplot") +
labs(fill = "기통")두 연속형 변수의 상관관계를 표현해주는 2차원 그래프, 모델링 전에 변수들 간의 관계를 파악하는데 있어 효과적입니다.
# Change color of points
library(gridExtra)
h1 <- h + geom_point(color="red") #모든 point를 red로
h2 <- h+ geom_point(aes(color=wt)) #mtc 데이터에서 wt는 continuous variable
h3 <- h + geom_point(aes(color=factor(am))) #am은 1 또는 0로 factor로 설정. continuous variable 아님.
grid.arrange(h1,h2,h3,nrow=3,ncol=1)# Change default colors in color scale
h + geom_point(aes(color=factor(am))) + scale_color_manual(values = c("orange", "purple"))# 색과 마찬가지로 기본으로 설정된 모양 역시 바꿀 수 있다
h + geom_point(aes(shape = factor(am))) + scale_shape_manual(values=c(0,2))# change points
h11 <- h + geom_point(size=5)
h12 <- h + geom_point(aes(size=wt))
h13 <- h + geom_point(aes(shape=factor(am)))
grid.arrange(h11, h12, h13, ncol=1)# Add lines to scatterplot
h21 <- h + geom_point(color="blue") + geom_line() #각 point를 선으로 연결
h22 <- h + geom_point(color="red") + geom_smooth(method="lm",se=TRUE) #regression line을 추가(s.e.도 보여줌)
h23 <- h + geom_point() + geom_vline(xintercept=18,color="red") #vertical line 추가
grid.arrange(h21,h22,h23,ncol=1)## `geom_smooth()` using formula = 'y ~ x'
# line plot을 그릴수도 있으며 line의 크기와 색 또한 바꿀 수 있다.
h24 <- h + geom_point() + geom_line(size=0.9,aes(color=factor(vs)))## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
h25 <- h + geom_point() + geom_line(size=1.5,aes(color=factor(vs)),linetype="dotted")+ scale_color_manual(values = c("orange", "purple"))
grid.arrange(h24,h25,ncol=1)# Change axis labels
h26 <- h1 + labs(x="1/4마일 도달 시간",y="Miles per Gallon") #x,y축 label 추가
h27 <- h1 +
theme(axis.title.x=element_text(face="bold",size=20)) + #x축 label의 특성 추가
labs(x="1/4마일 도달 시간",y="Miles per Gallon")
h28 <- h1 +
scale_x_continuous("1/4마일 도달 시간",limits=c(10,25),breaks=seq(10,25,5))
#x축 label과 x축의 범위를 바꿈
grid.arrange(h26,h27,h28,ncol=1)Figure 3.1: 선택 가능한 점 표현
Figure 3.2: 선택 가능한 선 표현
# 축 및 제목 설정
# labs(): 그래프의 제목과 축 레이블을 설정합니다.
p <- p + labs(title = "산점도 예제", x = "Displacement", y = "Highway Miles per Gallon")
print(p) # 색상 및 테마 설정
# color: 점의 색상을 class 변수에 따라 다르게 설정합니다.
# theme_minimal(): 미니멀한 테마를 적용합니다.
p <- p + geom_point(aes(color = class)) +
theme_minimal()
print(p)# 레이블 및 텍스트 추가
# geom_text(): 각 점에 레이블을 추가합니다.
p1 <- p + geom_text(aes(label = model), vjust = -1, size = 3)
print(p1)# 테마 커스터마이징
# theme(): 그래프의 다양한 요소를 커스터마이징합니다.
# plot.title: 그래프 제목의 위치, 크기, 스타일을 설정합니다.
# axis.title.x, axis.title.y: x축과 y축 제목의 크기를 설정합니다.
# legend.position: 범례의 위치를 설정합니다.
p1 <- p1 + theme(
plot.title = element_text(hjust = 0.5, size = 20, face = "bold"),
axis.title.x = element_text(size = 15),
axis.title.y = element_text(size = 15),
legend.position = "bottom"
)
print(p1)opar <- par(no.readonly = TRUE) #현재 상태를 opar에 저장
par(mfrow = c(2, 2)) # 화면을 2*2로 나눈다
plot(mtcars$wt, mtcars$mpg, main = "Scatterplot of wt vs. mpg")
plot(mtcars$wt, mtcars$disp, main = "Scatterplot of wt vs disp")
hist(mtcars$wt, main = "Histogram of wt")
boxplot(mtcars$wt, main = "Boxplot of wt")바 차트는 데이터를 비교하는 인사이트를 도출하는 데 매우 유용한 도구입니다. 예를 들어, 특정 제품의 월별 판매량을 비교하거나, 여러 카테고리 간의 수익을 비교할 때 사용할 수 있습니다.
아래 막대 그래프 시각화를 통해 실린더 개수가 증가하면 평균 연비가 감소한다는 것을 알 수 있다.
# ggplot2 패키지 로드
library(ggplot2)
# 실린더 수에 따른 평균 연비 계산
avg_mpg <- aggregate(mpg ~ cyl, data = mtcars, mean)
# 바 차트 생성
ggplot(avg_mpg, aes(x = factor(cyl), y = mpg)) +
geom_bar(stat = "identity", fill = "lightblue") +
geom_text(aes(label = sprintf("%.2f",avg_mpg$mpg)), vjust = -0.5, color = "black") +
theme_minimal() +
labs(title = "Average Miles Per Gallon by Number of Cylinders",
x = "Number of Cylinders",
y = "Average Miles Per Gallon (mpg)") +
theme(axis.text.x = element_text(angle = 0, hjust = 1))라인 차트는 시간에 따른 데이터의 변화를 시각화하는 데 매우 유용합니다. 예를 들어, 특정 기간 동안의 주식 가격 변동이나 월별 기온 변화를 분석할 때 사용할 수 있습니다.
아래 라인 차트를 통해 8월이 가장 평균 기온이 높고, 9월이 5월보다 덥다는 것을 알 수 있다.
# ggplot2 패키지 로드
library(ggplot2)
# 월별 평균 기온 계산
avg_temp <- aggregate(Temp ~ Month, data = airquality, mean)
# 라인 차트 생성
ggplot(avg_temp, aes(x = Month, y = Temp)) +
geom_line(color = "blue") +
geom_point(color = "red") +
geom_text(aes(label = sprintf("%.2f",avg_temp$Temp)), vjust = -1, color = "black") +
theme_minimal() +
ylim(0, max(airquality$Temp)) +
labs(title = "Average Monthly Temperature",
x = "Month",
y = "Temperature (F)") +
scale_x_continuous(breaks = 1:12, labels = month.abb)산점도는 두 변수 간의 관계를 시각화하는 데 매우 유용합니다. 예를 들어, 자동차의 마력과 연비 간의 관계를 분석할 때 사용할 수 있습니다.
아래 산포도를 보면 마력과 연비는 반비례 관계라는 것을 알 수 있다.
# ggplot2 패키지 로드
library(ggplot2)
# 산점도 생성
ggplot(mtcars, aes(x = hp, y = mpg)) +
geom_point(color = "blue") +
theme_minimal() +
labs(title = "Scatter Plot of Horsepower vs. Miles Per Gallon",
x = "Horsepower (hp)",
y = "Miles Per Gallon (mpg)")
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## 6 28 NA 14.9 66 5 6
# 각 열의 평균 계산 (결측치를 제외한 값들로)
mean_values <- colMeans(airquality, na.rm = TRUE)
# 결측치를 각 열의 평균으로 대체
airquality_filled <- airquality
for (i in 1:ncol(airquality)) {
airquality_filled[is.na(airquality_filled[, i]), i] <- mean_values[i]
}
head(airquality_filled)## Ozone Solar.R Wind Temp Month Day
## 1 41.00000 190.0000 7.4 67 5 1
## 2 36.00000 118.0000 8.0 72 5 2
## 3 12.00000 149.0000 12.6 74 5 3
## 4 18.00000 313.0000 11.5 62 5 4
## 5 42.12931 185.9315 14.3 56 5 5
## 6 28.00000 185.9315 14.9 66 5 6
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
mtcars_winsor <- mtcars
# 상위 5%와 하위 5% 임계값 계산
lower_bound <- quantile(mtcars$mpg, 0.05)
upper_bound <- quantile(mtcars$mpg, 0.95)
lower_bound## 5%
## 11.995
## 95%
## 31.3
# 윈저화 적용
mtcars_winsor$mpg <- ifelse(mtcars_winsor$mpg < lower_bound, lower_bound, mtcars_winsor$mpg)
mtcars_winsor$mpg <- ifelse(mtcars_winsor$mpg > upper_bound, upper_bound, mtcars_winsor$mpg)
mtcars_winsor## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.000 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.000 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.800 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.400 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.700 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.100 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.300 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.400 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.800 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.200 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.800 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.400 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.300 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.200 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 11.995 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 11.995 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.700 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 31.300 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.400 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 31.300 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.500 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.500 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.200 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.300 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.200 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.300 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.000 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.400 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.800 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.700 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.000 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.400 4 121.0 109 4.11 2.780 18.60 1 1 4 2
# 트리밍 적용
mtcars_trimmed <- mtcars[mtcars$mpg >= lower_bound & mtcars$mpg <= upper_bound, ]
mtcars_trimmed## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
## log_mpg
## Mazda RX4 3.044522
## Mazda RX4 Wag 3.044522
## Datsun 710 3.126761
## Hornet 4 Drive 3.063391
## Hornet Sportabout 2.928524
## Valiant 2.895912
## Duster 360 2.660260
## Merc 240D 3.194583
## Merc 230 3.126761
## Merc 280 2.954910
## Merc 280C 2.879198
## Merc 450SE 2.797281
## Merc 450SL 2.850707
## Merc 450SLC 2.721295
## Cadillac Fleetwood 2.341806
## Lincoln Continental 2.341806
## Chrysler Imperial 2.687847
## Fiat 128 3.478158
## Honda Civic 3.414443
## Toyota Corolla 3.523415
## Toyota Corona 3.068053
## Dodge Challenger 2.740840
## AMC Javelin 2.721295
## Camaro Z28 2.587764
## Pontiac Firebird 2.954910
## Fiat X1-9 3.306887
## Porsche 914-2 3.258097
## Lotus Europa 3.414443
## Ford Pantera L 2.760010
## Ferrari Dino 2.980619
## Maserati Bora 2.708050
## Volvo 142E 3.063391
tidyr 패키지의 pivot_longer()를 이용하여 피벗해제를 할 수 있다.
# 필요 패키지 활성화
library(dplyr)
library(tidyr)
# 예시 데이터셋 생성
relig_income <- data.frame(
religion = c("Agnostic", "Atheist", "Buddhist", "Catholic"),
`<$10k` = c(27, 12, 27, 418),
`$10-20k` = c(34, 27, 21, 617),
`$20-30k` = c(60, 37, 30, 732)
)
print("원본 데이터프레임:")## [1] "원본 데이터프레임:"
## religion X..10k X.10.20k X.20.30k
## 1 Agnostic 27 34 60
## 2 Atheist 12 27 37
## 3 Buddhist 27 21 30
## 4 Catholic 418 617 732
# 피벗해제 수행
relig_income_long <- relig_income %>%
pivot_longer(
cols = -religion,
names_to = "income",
values_to = "count"
)
print("피벗해제 후 데이터프레임:")## [1] "피벗해제 후 데이터프레임:"
## # A tibble: 12 × 3
## religion income count
## <chr> <chr> <dbl>
## 1 Agnostic X..10k 27
## 2 Agnostic X.10.20k 34
## 3 Agnostic X.20.30k 60
## 4 Atheist X..10k 12
## 5 Atheist X.10.20k 27
## 6 Atheist X.20.30k 37
## 7 Buddhist X..10k 27
## 8 Buddhist X.10.20k 21
## 9 Buddhist X.20.30k 30
## 10 Catholic X..10k 418
## 11 Catholic X.10.20k 617
## 12 Catholic X.20.30k 732
특정 조건에 맞는 데이터를 필터링합니다. 예를 들어, 연비(mpg)가 20 이상인 자동차만 선택합니다.
# 필요 패키지 활성화
library(dplyr)
library(tidyr)
# 필터링
filtered_data <- mtcars %>% filter(mpg >= 20)
print(filtered_data)## mpg cyl disp hp drat wt qsec vs am gear carb log_mpg
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 3.044522
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 3.044522
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 3.126761
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 3.063391
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 3.194583
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 3.126761
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 3.478158
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 3.414443
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 3.523415
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 3.068053
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 3.306887
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 3.258097
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 3.414443
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 3.063391
데이터를 특정 열을 기준으로 정렬합니다. 예를 들어, 연비(mpg)를 기준으로 내림차순 정렬합니다.
# 필요 패키지 활성화
library(dplyr)
library(tidyr)
# 정렬
sorted_data <- mtcars %>% arrange(desc(mpg))
print(sorted_data)## mpg cyl disp hp drat wt qsec vs am gear carb
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## log_mpg
## Toyota Corolla 3.523415
## Fiat 128 3.478158
## Honda Civic 3.414443
## Lotus Europa 3.414443
## Fiat X1-9 3.306887
## Porsche 914-2 3.258097
## Merc 240D 3.194583
## Datsun 710 3.126761
## Merc 230 3.126761
## Toyota Corona 3.068053
## Hornet 4 Drive 3.063391
## Volvo 142E 3.063391
## Mazda RX4 3.044522
## Mazda RX4 Wag 3.044522
## Ferrari Dino 2.980619
## Merc 280 2.954910
## Pontiac Firebird 2.954910
## Hornet Sportabout 2.928524
## Valiant 2.895912
## Merc 280C 2.879198
## Merc 450SL 2.850707
## Merc 450SE 2.797281
## Ford Pantera L 2.760010
## Dodge Challenger 2.740840
## Merc 450SLC 2.721295
## AMC Javelin 2.721295
## Maserati Bora 2.708050
## Chrysler Imperial 2.687847
## Duster 360 2.660260
## Camaro Z28 2.587764
## Cadillac Fleetwood 2.341806
## Lincoln Continental 2.341806
기존 데이터를 바탕으로 새로운 열을 추가합니다. 예를 들어, 무게(wt)를 kg 단위로 변환한 열을 추가합니다.
# 필요 패키지 활성화
library(dplyr)
library(tidyr)
# 새로운 열 추가
mtcars <- mtcars %>% mutate(wt_kg = wt * 453.592)
print(head(mtcars))## mpg cyl disp hp drat wt qsec vs am gear carb log_mpg
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 3.044522
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 3.044522
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 3.126761
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 3.063391
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 2.928524
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 2.895912
## wt_kg
## Mazda RX4 1188.411
## Mazda RX4 Wag 1304.077
## Datsun 710 1052.333
## Hornet 4 Drive 1458.298
## Hornet Sportabout 1560.356
## Valiant 1569.428
데이터를 그룹화하고 요약 통계를 계산합니다. 예를 들어, 실린더 수(cyl)별로 평균 연비(mpg)를 계산합니다.
# 필요 패키지 활성화
library(dplyr)
library(tidyr)
# 그룹화 및 요약
grouped_data <- mtcars %>% group_by(cyl) %>% summarise(mean_mpg = mean(mpg))
print(grouped_data)## # A tibble: 3 × 2
## cyl mean_mpg
## <fct> <dbl>
## 1 4 26.7
## 2 6 19.7
## 3 8 15.1
여러 작업을 결합하여 복잡한 쿼리를 작성할 수 있습니다. 예를 들어, 실린더 수가 6인 자동차 중에서 연비가 20 이상인 자동차의 평균 마력을 계산합니다.
# 필요 패키지 활성화
library(dplyr)
library(tidyr)
# 실린더 수 6 이상, 연비 20 이상 자동차의 평균 마력
complex_query <- mtcars %>%
filter(cyl == 6, mpg >= 20) %>%
summarise(mean_hp = mean(hp))
print(complex_query)## mean_hp
## 1 110
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ readr 2.1.5
## ✔ lubridate 1.9.3 ✔ stringr 1.5.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggplot2::%+%() masks psych::%+%()
## ✖ ggplot2::alpha() masks psych::alpha()
## ✖ gridExtra::combine() masks dplyr::combine()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## 6 28 NA 14.9 66 5 6
# 날짜 정보 생성
df <- df %>%
mutate(Date = make_date(1973, Month, Day))
# 결측치 처리 (평균으로 대체)
df <- df %>%
mutate(Ozone = ifelse(is.na(Ozone), mean(Ozone, na.rm = TRUE), Ozone),
Solar.R = ifelse(is.na(Solar.R), mean(Solar.R, na.rm = TRUE), Solar.R))
print(head(df))## Ozone Solar.R Wind Temp Month Day Date
## 1 41.00000 190.0000 7.4 67 5 1 1973-05-01
## 2 36.00000 118.0000 8.0 72 5 2 1973-05-02
## 3 12.00000 149.0000 12.6 74 5 3 1973-05-03
## 4 18.00000 313.0000 11.5 62 5 4 1973-05-04
## 5 42.12931 185.9315 14.3 56 5 5 1973-05-05
## 6 28.00000 185.9315 14.9 66 5 6 1973-05-06
# Ozone 농도의 일별 변화
ggplot(df, aes(x = Date, y = Ozone)) +
geom_line() +
labs(title = "Time Series of Ozone Levels",
x = "Date",
y = "Ozone Level")# 월별 평균 Ozone 농도 변화
df %>%
group_by(Month) %>%
summarise(mean_ozone = mean(Ozone)) %>%
ggplot(aes(x = Month, y = mean_ozone)) +
geom_line() +
geom_text(aes(label = sprintf("%.2f",mean_ozone)), vjust = -0.5, color = "black") +
labs(title = "Monthly Average Ozone Levels",
x = "Month",
y = "Average Ozone Level") +
ylim(0,max(airquality$Ozone)) 주장하는 가설 입증
① 연구목적에 맞는 대립가설 설정
② 연구목적과 수집된 자료에 부합되는 적절한 통계적 검정 방법을 선택
③ 대립가설과 귀무가설 명시
④ 유의수준을 결정한 후 각 분포유형에 따라 역함수를 이용하여 임계치 구하고 기각역 설정
⑤ 통계적 검정유형에 필요한 통계량을 각 검정유형의 공식을 이용하여 계산
⑥ 임계치와 통계량을 비교하여 귀무가설 기각과 수용 결정
⑦ 검정 결과에 따라 대립가설 입증 여부 판단
아래 세 조건 중 하나라도 충족되지 않으면 비 모수 통계 사용
많은 통계 분석 방법에서 자료가 정규분포를 따른다는 가정 하에 검정 통계량과 p-value를 계산합니다.
만약 실제 자료가 정규성 가정을 만족하지 않는다면 통계 분석 결과에 대한 타당성이 떨어지기 때문에 분석을 하기 전에 정규성 가정이 만족되는지 검토하는 것이 바람직합니다.
정규성 가정(Tests for Normality)을 검토하는 방법으로는 다음 세 가지가 있습니다.
그래프를 그려서 정규성 가정이 만족되는지 시각적으로 확인하는 방법입니다.
Q-Q plot은 아래와 같이 대각선 참조선을 따라서 값들이 분포하게 되면 정규성을 만족한다고 할 수 있습니다. 만약 한 쪽으로 치우치거나 직선과 차이가 많이 나는 모습이라면 정규성 가정에 위배되었다고 볼 수 있습니다.
R 내장 데이터인 Nile 데이터로 Q-Q plot을 그려본 결과 정규성을 다소 벗어나 보입니다.
오차항이 정규분포를 따르는지 알아보는 검정으로, 회귀분석에서 모든 독립변수에 대해서 종속변수가 정규분포를 따르는지 알아보는 방법입니다.
귀무가설은 ’H0:정규분포를 따른다’는 것으로 p-value가 0.05보다 크면 정규성을 가정할 수 있습니다.
Nile 데이터의 결과는 p값이 0.05보다 작으므로 Nile 데이터는 정규분포를 따르지 않는다고 판단됩니다.
##
## Shapiro-Wilk normality test
##
## data: Nile
## W = 0.97343, p-value = 0.04072
EDF, 즉 Empirical distribution function에 기반한 적합도 검정 방법입니다.
자료의 평균/표준편차와 히스토그램을 표준정규분포와 비교하여 적합도를 검정합니다.
Shapiro-Wilk test와 마찬가지로 p-value가 0.05보다 크면 정규성을 가정하게 된다.
Nile 결과를 보면 p값이 0.05보다 작으므로 정규분포를 따르지 않는다.
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: Nile
## D = 0.095957, p-value = 0.02399
F 검정은 두 실험군의 데이터 모집단 분산이 동일한지 여부를 검정하는 방법입니다.
두 실험군의 모집단은 정규 분포를 따라야 합니다.
p값 > 0.05이면 등분산으로 판단합니다.
학생들의 영어, 수학 점수 데이터인 ’em_score.xlsx’를 불러다가 정규성 검사와 등분산 검사를 수행하겠습니다.
shpiro test 결과를 보면 두 점수 데이터 모두 정규성을 따르고 있습니다.
F test 결과 p값이 0.05보다 작으므로 이분산이라고 보면 될 것 같습니다.
## tibble [40 × 4] (S3: tbl_df/tbl/data.frame)
## $ no : num [1:40] 1 2 3 4 5 6 7 8 9 10 ...
## $ math : num [1:40] 67 75 74 76 90 72 62 77 59 64 ...
## $ english: num [1:40] 77 84 77 83 78 90 75 86 76 80 ...
## $ gender : num [1:40] 1 0 1 1 0 0 0 1 1 0 ...
##
## Shapiro-Wilk normality test
##
## data: em_score$math
## W = 0.98866, p-value = 0.9543
##
## Shapiro-Wilk normality test
##
## data: em_score$english
## W = 0.97934, p-value = 0.6649
##
## F test to compare two variances
##
## data: em_score$math and em_score$english
## F = 3.476, num df = 39, denom df = 39, p-value = 0.0001761
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 1.838479 6.572228
## sample estimates:
## ratio of variances
## 3.476047
\(𝑁(𝜇_1, 𝜎_1^2 ), 𝑁(𝜇_2, 𝜎_2^2 )\) 정규분포를 따르는 모집단에서 2개의 표본을 추출했을 때, ’\(𝜇_1\)이 \(𝜇_2\)와 같지않다/크다/작다’에 관한 모평균의 검정
\(𝐻_1:𝜇_1>𝜇_2\) or \(𝜇_1<𝜇_2\) or \(𝜇_1≠𝜇_2\)
\(𝐻_0:𝜇_1=𝜇_2\)
예시: 대한민국 50~54세 남자 50명, 19~24세 50명을 무작위로 표본추출했을 때 신뢰도 95%에서 50~54세 키의 평균이 19~24세 키의 평균 보다 작다고 할 수 있는지 판단하세요. (2017년 기준 50~54세 키 평균 170.2cm, 표준편차 5.78cm, 19~24세 키 평균 174.3cm, 표준편차 5.68cm)
## 필요한 패키지를 로딩중입니다: lattice
##
## 다음의 패키지를 부착합니다: 'BSDA'
## The following objects are masked from 'package:carData':
##
## Vocab, Wool
## The following object is masked from 'package:datasets':
##
## Orange
library(lattice)
set.seed(55)
x <- rnorm(n=50, mean=170.2, sd=5.78)
y <- rnorm(n=50, mean=174.3, sd=5.68)
z.test(x,y,alternative="less",sigma.x=5.78,sigma.y=5.68,conf.level=.95)##
## Two-sample z-Test
##
## data: x and y
## z = -2.7694, p-value = 0.002808
## alternative hypothesis: true difference in means is less than 0
## 95 percent confidence interval:
## NA -1.288731
## sample estimates:
## mean of x mean of y
## 170.4882 173.6620
p값이 0.05보다 작으므로 50~54세 키가 19~24세 키 보다 작다고 할 수 있습니다.
정규분포를 따르고 분산이 같은 두 집단에서 2개의 표본을 추출했을 때, ’\(𝜇_1\)이 \(𝜇_2\)와 같지않다/크다/작다’에 관한 모평균의 검정 (정규성, 등분산)
\(𝐻_1:𝜇_1>𝜇_2\) or \(𝜇_1<𝜇_2\) or \(𝜇_1≠𝜇_2\)
\(𝐻_0:𝜇_1=𝜇_2\)
예시: mtcars 데이터에서 기어의 형태(자동,수동)에 따른 연비를 찾고 자동 기어의 평균 연비가 수동 기어의 평균 연비에 비해 신뢰도 95%에서 낮은지 판단하세요.
## 'data.frame': 32 obs. of 13 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ...
## $ disp : num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec : num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear : num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb : num 4 4 1 1 2 1 4 2 2 4 ...
## $ log_mpg: num 3.04 3.04 3.13 3.06 2.93 ...
## $ wt_kg : num 1188 1304 1052 1458 1560 ...
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10.40 15.43 19.20 20.09 22.80 33.90
## [1] 13
## [1] 19
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.9458, p-value = 0.5363
##
## Shapiro-Wilk normality test
##
## data: y
## W = 0.97677, p-value = 0.8987
##
## F test to compare two variances
##
## data: x and y
## F = 2.5869, num df = 12, denom df = 18, p-value = 0.06691
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.934280 8.040391
## sample estimates:
## ratio of variances
## 2.586911
##
## Two Sample t-test
##
## data: y and x
## t = -4.1061, df = 30, p-value = 0.0001425
## alternative hypothesis: true difference in means is less than 0
## 95 percent confidence interval:
## -Inf -4.250255
## sample estimates:
## mean of x mean of y
## 17.14737 24.39231
t-test p값이 0.05보다 작으므로 낮다고 할 수 있습니다.
정규분포를 따르고 분산이 같지 않은 두 집단에서 2개의 표본을 추출했을 때,
, ’\(𝜇_1\)이 \(𝜇_2\)와 같지않다/크다/작다’에 관한 모평균의 검정 (정규성, 이분산)
\(𝐻_1:𝜇_1>𝜇_2\) or \(𝜇_1<𝜇_2\) or \(𝜇_1≠𝜇_2\)
\(𝐻_0:𝜇_1=𝜇_2\)
예시: mtcars 데이터에서 엔진의 형태(V-shaped,straight)에 따른 마력을 찾고 V-shaped 엔진의 평균 마력이 straight 엔진의 평균 마력에 비해 신뢰도 95%에서 높은지 판단하세요.
x1 <- mtcars[mtcars$vs==1,4] # straight
y1 <- mtcars[mtcars$vs==0,4] # V-shaped
shapiro.test(x1); shapiro.test(y1) # 정규성 검정##
## Shapiro-Wilk normality test
##
## data: x1
## W = 0.89932, p-value = 0.1102
##
## Shapiro-Wilk normality test
##
## data: y1
## W = 0.9578, p-value = 0.5598
##
## F test to compare two variances
##
## data: x1 and y1
## F = 0.16417, num df = 13, denom df = 17, p-value = 0.002002
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.0589191 0.4931365
## sample estimates:
## ratio of variances
## 0.1641657
##
## Welch Two Sample t-test
##
## data: y1 and x1
## t = 6.2908, df = 23.561, p-value = 9.099e-07
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
## 71.5933 Inf
## sample estimates:
## mean of x mean of y
## 189.72222 91.35714
t-test p값이 0.05보다 작으므로 높다고 할 수 있습니다.
데이터가 정규성을 충족하지 않거나 서열형 데이터일 때 두 집단의 평균 ’\(𝜇_1\)이 \(𝜇_2\)와 같지않다/크다/작다’에 관한 모평균의 검정 (정규성, 이분산)
\(𝐻_1:𝜇_1>𝜇_2\) or \(𝜇_1<𝜇_2\) or \(𝜇_1≠𝜇_2\)
\(𝐻_0:𝜇_1=𝜇_2\)
예시: Cars93 데이터에서 생산지(미국산,비미국산)에 따른 가격 데이터를 근거로 생산지에 따른 가격 차이가 있는지 신뢰도 95%에서 판단하세요.
##
## 다음의 패키지를 부착합니다: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
# Cars93
a <- subset(Cars93$Price,Cars93$Origin=="USA")
b <- subset(Cars93$Price,Cars93$Origin=="non-USA")
shapiro.test(a)##
## Shapiro-Wilk normality test
##
## data: a
## W = 0.88411, p-value = 0.0002006
##
## Shapiro-Wilk normality test
##
## data: b
## W = 0.87756, p-value = 0.0002036
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.00 11.60 19.10 20.51 26.70 61.90
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 7.40 13.47 16.30 18.57 20.73 40.10
##
## Wilcoxon rank sum test with continuity correction
##
## data: a and b
## W = 1024.5, p-value = 0.6724
## alternative hypothesis: true location shift is not equal to 0
## 95 percent confidence interval:
## -4.399986 2.599967
## sample estimates:
## difference in location
## -0.7000468
p값이 0.05보다 크므로 차이가 없다고 판단됩니다.
예시: 광고안 5개를 보여주고 순위를 매기는 조사를 시행했습니다. 이 때 광고A가 광고B 보다 95% 신뢰수준에서 좋은 순위를 받았다고 주장할 수 있는지 판단하세요.
library(readxl)
rank <- read_excel("rank.xlsx", sheet = "two")
shapiro.test(rank$A); shapiro.test(rank$B) # 정규성##
## Shapiro-Wilk normality test
##
## data: rank$A
## W = 0.67936, p-value = 2.207e-05
##
## Shapiro-Wilk normality test
##
## data: rank$B
## W = 0.74089, p-value = 0.0001284
##
## Wilcoxon rank sum test with continuity correction
##
## data: rank$A and rank$B
## W = 130, p-value = 0.02041
## alternative hypothesis: true location shift is less than 0
## 95 percent confidence interval:
## -Inf -9.477129e-07
## sample estimates:
## difference in location
## -0.9999886
p값이 0.05보다 작으므로 광고A가 좋은 평가를 받았다고 판단됩니다.
자료가 명목 척도(nominal)인 경우, 각 셀 별 빈도가 모두 5 이상인 경우 두 집단의 분포가 같은지, 다른지를 검정해야 하는 경우 카이스퀘어 검정으로 판단할 수 있다.
\(𝐻_1\): 분포가 같지 않다
\(𝐻_0\): 분포가 같다
예시: Titanic data를 근거로 남녀 간 생존율의 차이가 있는지 확인하세요.
## 'data.frame': 1309 obs. of 4 variables:
## $ survived : Factor w/ 2 levels "no","yes": 2 2 1 1 1 2 2 1 2 1 ...
## $ sex : Factor w/ 2 levels "female","male": 1 2 1 2 1 2 1 2 1 2 ...
## $ age : num 29 0.917 2 30 25 ...
## $ passengerClass: Factor w/ 3 levels "1st","2nd","3rd": 1 1 1 1 1 1 1 1 1 1 ...
##
## female male
## 466 843
##
## no yes
## 809 500
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tab
## X-squared = 363.62, df = 1, p-value < 2.2e-16
chisquare-test p값이 0.05보다 작으므로 남녀 생존률 차이가 있다고 판단됩니다.
자료가 명목 척도(nominal)인 경우, 각 셀 별 빈도가 5 이하인 경우가 20%가 넘는 경우 두 집단의 분포가 같은지, 다른지를 검정해야 하는 경우 Fisher’s test 로 판단할 수 있다. Odds ration=1이면 두집단 분포 차이가 없다고 판단한다.
\(𝐻_1: 𝑂𝑑𝑑𝑠 𝑟𝑎𝑡𝑖𝑜 ≠1\)
\(𝐻_0: 𝑂𝑑𝑑𝑠 𝑟𝑎𝑡𝑖𝑜=1\)
예시: # 라면을 끓일 때 면 먼저 넣고 끓인 것과 스프 먼저 넣고 끓인 것의 맛 차이가 있다고 주장하는 사람이 있어 블라인드 테스트를 진행했습니다. 자기가 좋아하는 순서의 라면이 좋다고 한 경우를 Yes, 못 맞혔을 때 No일 때 구분 능력이 있는지 판단하세요.
library(readxl)
noodle_soup <- read_excel("noodle_soup.xlsx", sheet = "noodle_soup")
tab2 <- table(noodle_soup$fact,noodle_soup$guess_soup)
#Fisher's exact test
fisher.test(tab2, alternative = "two.sided")##
## Fisher's Exact Test for Count Data
##
## data: tab2
## p-value = 0.04056
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 0.9040436 953.3729037
## sample estimates:
## odds ratio
## 13.95942
p값이 0.05보다 작으므로 구분능력이 없다고 판단됩니다.
정규분포를 따르는 쌍체 비교에서, ’\(𝜇_1\)이 \(𝜇_2\)와 같지않다/크다/작다’에 관한 모평균의 검정
\(𝐻_1:𝜇_1>𝜇_2\) or \(𝜇_1<𝜇_2\) or \(𝜇_1≠𝜇_2\)
\(𝐻_0:𝜇_1=𝜇_2\)
예시: Membership 가입 전, 가입 후의 구매금액 데이터를 근거로 가입 후 구매금액이 가입 전 보다 높은지 95% 신뢰도에서 판단하세요.
library(readxl)
bf <- read_excel("before_after_sales.xlsx", sheet = "sales")
x <- bf$before
y <- bf$after
shapiro.test(x)##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.99236, p-value = 0.8466
##
## Shapiro-Wilk normality test
##
## data: y
## W = 0.99218, p-value = 0.8339
##
## Paired t-test
##
## data: x and y
## t = -6.4554, df = 99, p-value = 2.014e-09
## alternative hypothesis: true mean difference is less than 0
## 95 percent confidence interval:
## -Inf -6.734136
## sample estimates:
## mean difference
## -9.066
p값이 0.05보다 작으므로 가입후가 가입전 보다 구매금액이 크다고 판단됩니다.
쌍체 비교에서 정규성이 없는 경우 ’\(𝜇_1\)이 \(𝜇_2\)와 같지않다/크다/작다’에 관한 모평균의 검정
\(𝐻_1:𝜇_1>𝜇_2\) or \(𝜇_1<𝜇_2\) or \(𝜇_1≠𝜇_2\)
\(𝐻_0:𝜇_1=𝜇_2\)
예시: # 신제품 A와 기존제품 B에 대한 선호도 36명의 타겟고객 대상으로 실시한 설문 데이터를 근거로 신제품 A가 기존제품 B 보다 선호도가 높다고 판단할 수 있는지 95% 신뢰도에서 판단하세요.
##
## Shapiro-Wilk normality test
##
## data: p$A
## W = 0.87409, p-value = 0.0007187
##
## Shapiro-Wilk normality test
##
## data: p$B
## W = 0.90026, p-value = 0.003468
# wilcox signed rank test
wilcox.test(p$A, p$B, alternative = c("greater"), paired = TRUE, conf.level = 0.95, conf.int=T, exact=F)##
## Wilcoxon signed rank test with continuity correction
##
## data: p$A and p$B
## V = 153, p-value = 0.9727
## alternative hypothesis: true location shift is greater than 0
## 95 percent confidence interval:
## -1.000011 Inf
## sample estimates:
## (pseudo)median
## -0.999945
p값이 0.05보다 작으므로 신제품A의 선호도가 높다고 판단됩니다.
명목 척도의 쌍체 비교에서, 비율 차이가 있는지 없는지에 대한 검정
\(𝐻_1:비율 차이가 있다\)
\(𝐻_0: 비율 차이가 없다\)
예시: 치료약 복용 전 후의 질병 유무를 100명의 자원자 대상 조사한 결과를 근거로 치료약의 효과가 있는지 95% 신뢰수준에서 판단하세요.
library(readxl)
dbf <- read_excel("before_after_comparision.xlsx", sheet = "bf_comp")
tab3 <- table(dbf$before,dbf$after); tab3##
## absent present
## absent 43 10
## present 23 24
##
## McNemar's Chi-squared test with continuity correction
##
## data: tab3
## McNemar's chi-squared = 4.3636, df = 1, p-value = 0.03671
p값이 0.05보다 작으므로 치료약의 효과가 있다고 판단됩니다.
# mtcars 데이터 로드
data(mtcars)
# 데이터 분할 (훈련 데이터: 70%, 테스트 데이터: 30%)
set.seed(123) # 재현성을 위해 시드 설정
trainIndex <- sample(1:nrow(mtcars), 0.7 * nrow(mtcars))
trainData <- mtcars[trainIndex, ]
testData <- mtcars[-trainIndex, ]
# 스텝와이즈 회귀 분석
full_model <- lm(mpg ~ ., data = trainData)
step_model <- step(full_model, direction = "both")## Start: AIC=57.41
## mpg ~ cyl + disp + hp + drat + wt + qsec + vs + am + gear + carb
##
## Df Sum of Sq RSS AIC
## - drat 1 0.000 110.00 55.408
## - gear 1 0.183 110.18 55.444
## - vs 1 0.315 110.31 55.471
## - carb 1 2.477 112.48 55.898
## - cyl 1 2.980 112.98 55.996
## - hp 1 5.906 115.91 56.558
## - disp 1 7.265 117.27 56.815
## - am 1 8.874 118.88 57.115
## - qsec 1 8.892 118.89 57.118
## <none> 110.00 57.408
## - wt 1 31.836 141.84 61.000
##
## Step: AIC=55.41
## mpg ~ cyl + disp + hp + wt + qsec + vs + am + gear + carb
##
## Df Sum of Sq RSS AIC
## - gear 1 0.195 110.19 53.447
## - vs 1 0.337 110.34 53.475
## - carb 1 2.615 112.62 53.925
## - cyl 1 2.981 112.98 53.996
## - hp 1 6.463 116.46 54.664
## - disp 1 7.788 117.79 54.913
## - qsec 1 9.230 119.23 55.180
## - am 1 10.043 120.04 55.330
## <none> 110.00 55.408
## + drat 1 0.000 110.00 57.408
## - wt 1 33.477 143.48 59.253
##
## Step: AIC=53.45
## mpg ~ cyl + disp + hp + wt + qsec + vs + am + carb
##
## Df Sum of Sq RSS AIC
## - vs 1 0.406 110.60 51.528
## - carb 1 2.454 112.65 51.931
## - cyl 1 3.061 113.26 52.049
## - hp 1 7.178 117.37 52.835
## - disp 1 7.845 118.04 52.960
## - am 1 9.906 120.10 53.340
## - qsec 1 10.276 120.47 53.408
## <none> 110.19 53.447
## + gear 1 0.195 110.00 55.408
## + drat 1 0.012 110.18 55.444
## - wt 1 33.713 143.91 57.319
##
## Step: AIC=51.53
## mpg ~ cyl + disp + hp + wt + qsec + am + carb
##
## Df Sum of Sq RSS AIC
## - carb 1 2.389 112.99 49.998
## - cyl 1 3.787 114.39 50.268
## - hp 1 6.846 117.45 50.849
## - disp 1 7.442 118.04 50.960
## - am 1 9.599 120.20 51.359
## <none> 110.60 51.528
## - qsec 1 12.734 123.33 51.925
## + vs 1 0.406 110.19 53.447
## + gear 1 0.263 110.34 53.475
## + drat 1 0.000 110.60 53.527
## - wt 1 33.607 144.21 55.365
##
## Step: AIC=50
## mpg ~ cyl + disp + hp + wt + qsec + am
##
## Df Sum of Sq RSS AIC
## - cyl 1 4.112 117.10 48.784
## - hp 1 4.971 117.96 48.945
## - disp 1 5.670 118.66 49.075
## - am 1 8.060 121.05 49.514
## - qsec 1 10.359 123.35 49.927
## <none> 112.99 49.998
## + carb 1 2.389 110.60 51.528
## + vs 1 0.340 112.65 51.931
## + drat 1 0.262 112.73 51.946
## + gear 1 0.012 112.98 51.995
## - wt 1 40.704 153.69 54.766
##
## Step: AIC=48.78
## mpg ~ disp + hp + wt + qsec + am
##
## Df Sum of Sq RSS AIC
## - disp 1 2.477 119.58 47.244
## - hp 1 11.027 128.13 48.764
## <none> 117.10 48.784
## + cyl 1 4.112 112.99 49.998
## + carb 1 2.713 114.39 50.268
## - qsec 1 21.585 138.69 50.506
## + gear 1 1.190 115.91 50.559
## + vs 1 1.055 116.05 50.585
## + drat 1 0.812 116.29 50.631
## - am 1 25.778 142.88 51.161
## - wt 1 37.411 154.51 52.883
##
## Step: AIC=47.24
## mpg ~ hp + wt + qsec + am
##
## Df Sum of Sq RSS AIC
## - hp 1 9.126 128.70 46.862
## <none> 119.58 47.244
## - qsec 1 19.284 138.86 48.534
## + disp 1 2.477 117.10 48.784
## + cyl 1 0.918 118.66 49.075
## - am 1 23.311 142.89 49.163
## + drat 1 0.339 119.24 49.182
## + carb 1 0.086 119.49 49.229
## + vs 1 0.080 119.50 49.230
## + gear 1 0.001 119.58 49.244
## - wt 1 41.789 161.37 51.838
##
## Step: AIC=46.86
## mpg ~ wt + qsec + am
##
## Df Sum of Sq RSS AIC
## <none> 128.70 46.862
## + hp 1 9.126 119.58 47.244
## - am 1 17.940 146.64 47.733
## + cyl 1 5.052 123.65 47.981
## + carb 1 3.077 125.63 48.330
## + drat 1 0.586 128.12 48.762
## + disp 1 0.576 128.13 48.764
## + gear 1 0.538 128.17 48.770
## + vs 1 0.133 128.57 48.840
## - qsec 1 107.362 236.07 58.208
## - wt 1 138.020 266.72 60.894
##
## Call:
## lm(formula = mpg ~ wt + qsec + am, data = trainData)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.8902 -1.6234 -0.6141 1.6720 5.2297
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.8994 8.7564 0.902 0.37890
## wt -4.1677 0.9486 -4.394 0.00035 ***
## qsec 1.3689 0.3533 3.875 0.00111 **
## am 2.9837 1.8837 1.584 0.13061
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.674 on 18 degrees of freedom
## Multiple R-squared: 0.8622, Adjusted R-squared: 0.8392
## F-statistic: 37.54 on 3 and 18 DF, p-value: 5.916e-08
# 예측 수행
predictions <- predict(step_model, newdata = testData)
# 결과 비교
results <- data.frame(Actual = testData$mpg, Predicted = predictions)
# 결과 시각화
library(ggplot2)
ggplot(results, aes(x = Actual, y = Predicted)) +
geom_point() +
geom_abline(slope = 1, intercept = 0, color = "red") +
labs(title = "Actual vs Predicted MPG",
x = "Actual MPG",
y = "Predicted MPG")## [1] "RMSE: 2.13100494386592"