문제
한글 해석본 (실제 시험에서는 영어로 나옴)
-
txt 파일 읽기.
-
결측값이 9999인 경우 이를 제거하는 방법. 결측값 빼서 새로 data를 만든 후, 그때 row의 수를 구하기
-
BMI라는 이름의 변수를 만들고, 해당 그래프를 만들기. (저수준 그래프 함수를 사용할 것)
단, BMI를 그래프화 할 때 남녀 간의 차이를 보일 수 있게 할 것.
-
탄산음료 섭취 빈도 변수를 범주형 변수로 만들고, 비만인 사람 (비만의 기준 : bmi > 25)를 성별과 탄산음료 섭취 빈도 비율로 분류할 것.
섭취 빈도는 다음과 같이 구분한다.
| 섭취량 | |
| 0 ~ 1 미만 | "NOT at all" |
| 1 ~ 4 미만 | "At least once per week" |
| 4 ~ 7 이하 | "At least once per day" |
| 5. 가설 : “청소년들은 더 살이 쪘다고 생각하나 실제로는 아니다.” |
위의 문제에서 얻은 데이터와 그래프를 볼 때, 이 가설은 맞는가? 틀리다면 그 이유는?
첨부파일
첨부파일prod-files-secure.s3.us-west-2.amazonaws.com해답
1번
read.table()도 모르는 건 좀…header= 첫번째 행이 변수명으로 쓰이는지 판단.sep이랑fileEncoding은 무조건 기억할것. 모르면 나중에 꼬일수도 있음
r
#### 1 ####
rm(list=ls())
setwd("C:/Users/dlsfu/Desktop/EDA_rawData")
data = read.table("YHS2021_reduced.txt", header=T, sep="", fileEncoding = "UTF-8")
str(data)
dim(data)
- 불러오지 못하면 Rdata 쓰면 되기는 하는데 이러면 감점이 들어간다고 명시했었음.
setwd()의 경로는 각 컴퓨터에 맞게 조정해야 함.
2번
결측값이 9999인 경우 이를 제거하는 방법
grep()이랑 정규 표현식 써서 어떤 변수가 9999를 가지고 있는지 확인- 모든 변수를 grep() 안에 넣으면서 확인하는 방법이 가장 베스트이기는 함.
결측값 빼서 새로 data를 만든 후 그때 row의 수를 구하기
- 조건식 쓰는 방법은 당연히 알고 시험 보는 거죠?
nrow()쓰면 row의 수 구할 수 있음.
r
#### 2 ####
sum(is.na(data))
# missing values = 전부 9999
summary(data)
grep("$9", data$OBS)
grep("$9", data$MH)
grep("$9", data$STYPE)
# summary와 grep을 통해 9999가 존재하는 변수가 3개임을 알 수 있음.
# Answer : AGE, HT, WT로 총 3개.
datas = data[(data$AGE != 9999 & data$HT != 9999 & data$WT != 9999), ]
nrow(datas)
# Answer : observation = 총 29223개
3번
BMI라는 이름의 변수를 만들기.
- BMI 어떻게 만드는지는 시험지에 다 나와 있음.
BMI = WT~/~(HT * 0.01)^2
SEX라는 이름의 변수 만들기.
- 문제에 포함되어 있었는지는 기억이 나지 않음
- 범주형 변수 만들기 :
factor()기능을 이용해서 label을 붙임.
해당 그래프를 만들기. (저수준 그래프 함수를 사용할 것)
boxplot()이랑abline()이용해서 간단하면서도 좋은 그래프를 만듭시다.
r
#### 3 ####
datas$BMI = datas$WT/(datas$HT*0.01)^2 # BMI 만들어주기
datas$SEX = factor(datas$SEX, labels=c("Male", "Female")) # 데이터를 factor화
# 그래프 시작
boxplot(BMI~SEX, data=datas, ylab="Body Mass Index",
xlab="Gender")
abline(h=18.5, lty=2, col="red")
abline(h=25, lty=2, col="red")
abline(h=30, lty=2, col="red")
# 그래프 끝
4번
탄산음료 섭취 빈도 변수를 범주형 변수로 만들기.
cut()함수 써서 만들면 됨.
비만인 사람 (비만의 기준 : bmi > 25)를 성별과 탄산음료 섭취 빈도에 따라로 분류할 것.
prop.table,table무조건 써야 함.
r
#### 4 ####
str(datas$F_SODA)
## categorized soda drinking frequency using variable F_SODA
datas$F_SD.CAT = cut(datas$F_SODA, c(0, 1, 4, 7),
labels=c("NOT at all", "At least once per week", "At least once per day"))
str(datas$F_SD.CAT)
## proportions of being overweight or obese by SEX and F_SD.CAT
sodatable = round(prop.table(table(datas[datas$BMI>25,]$SEX, datas[datas$BMI>25,]$F_SD.CAT)), 4)
rownames(sodatable) = c("Male", "Female")
sodatable # 비율 측정 결과
# BMI가 25 초과인 사람 중 남성이면서, 1주일에 한번 탄산음료를 마시는 사람의 비중이 제일 컸음.
팁 : 결과를 주석으로 써주는 것이 좋음.
5번
가설 : “청소년들은 더 살이 쪘다고 생각하나 실제로는 아니다.”
위의 문제에서 얻은 데이터와 그래프를 볼 때, 이 가설은 맞는가? 틀리다면 그 이유는?
r
#### 5 ####
summary(datas$BMI)
datas$BMI.cat = cut(datas$BMI, c(0, 25, max(datas$BMI)), labels=c("not obese", "obese"))
# 데이터를 잘라서 BMI가 25 이상이면 obese, 그 이하면 not obese로 분류
str(datas$PR_BI)
datas$PR_BI.cat = cut(datas$PR_BI, c(0, 3, 5), labels = c("likely not obese", "likely obese"))
# "약간 살이 쪘다"와 "매우 살이 쪘다" 를 묶어서 likely obese로, 나머지는 "likely not obese"로 만듬
table.bmi = table(datas$PR_BI.cat, datas$BMI.cat)
round(prop.table(table.bmi), 4)
barplot(table.bmi[2,], main="'살이 쪘다'라고 생각한 응답자", ylim = c(0, 6000), ylab="freq")
# Answer : 자신이 "약간 살이 쪘다" 또는 "매우 살이 쪘다"라고 생각한 응답자 중 실제 비만인 응답자는 0.1718, 즉 전체 응답자의 약 17%.
# 반면 자신이 "약간 살이 쪘다" 또는 "매우 살이 쪘다"라고 생각한 응답자 중 실제 비만이 아닌 응답자는 0.2119, 즉 전체 응답자의 약 21%
# 따라서 본인의 생각과 달리 실제로 살이 찌지 않은 사람이 더 많으므로, 데이터가 가설을 뒷받침한다.
전체 코드
r
## Title : Midterm Exam 1 ###
## PID : "2018111373" ###
set.seed(100)
your.PID = "2018111373"
#### 1 ####
rm(list=ls())
setwd("C:/Users/dlsfu/Desktop/EDA_rawData")
data = read.table("YHS2021_reduced.txt", header=T, sep="", fileEncoding = "UTF-8")
str(data)
dim(data)
#### 2 ####
sum(is.na(data))
# missing values = 전부 9999
summary(data)
grep("$9", data$OBS)
grep("$9", data$MH)
grep("$9", data$STYPE)
# summary와 grep을 통해 9999가 존재하는 변수가 3개임을 알 수 있음.
# Answer : AGE, HT, WT로 총 3개.
datas = data[(data$AGE != 9999 & data$HT != 9999 & data$WT != 9999), ]
nrow(datas)
# Answer : observation = 총 29223개
#### 3 ####
datas$BMI = datas$WT/(datas$HT*0.01)^2 # BMI 만들어주기
datas$SEX = factor(datas$SEX, labels=c("Male", "Female")) # 데이터를 factor화
# 그래프 시작
boxplot(BMI~SEX, data=datas, ylab="Body Mass Index",
xlab="Gender")
abline(h=18.5, lty=2, col="red")
abline(h=25, lty=2, col="red")
abline(h=30, lty=2, col="red")
# 그래프 끝
#### 4 ####
str(datas$F_SODA)
## categorized soda drinking frequency using variable F_SODA
datas$F_SD.CAT = cut(datas$F_SODA, c(0, 1, 4, 7),
labels=c("NOT at all", "At least once per week", "At least once per day"))
str(datas$F_SD.CAT)
## proportions of being overweight or obese by SEX and F_SD.CAT
sodatable = round(prop.table(table(datas[datas$BMI>25,]$SEX, datas[datas$BMI>25,]$F_SD.CAT)), 4)
rownames(sodatable) = c("Male", "Female")
sodatable # 비율 측정 결과
# BMI가 25 초과인 사람 중 남성이면서, 1주일에 한번 탄산음료를 마시는 사람의 비중이 제일 컸음.
#### 5 ####
summary(datas$BMI)
datas$BMI.cat = cut(datas$BMI, c(0, 25, max(datas$BMI)), labels=c("not obese", "obese"))
# 데이터를 잘라서 BMI가 25 이상이면 obese, 그 이하면 not obese로 분류
str(datas$PR_BI)
datas$PR_BI.cat = cut(datas$PR_BI, c(0, 3, 5), labels = c("likely not obese", "likely obese"))
# "약간 살이 쪘다"와 "매우 살이 쪘다" 를 묶어서 likely obese로, 나머지는 "likely not obese"로 만듬
table.bmi = table(datas$PR_BI.cat, datas$BMI.cat)
round(prop.table(table.bmi), 4)
barplot(table.bmi[2,], main="'살이 쪘다'라고 생각한 응답자", ylim = c(0, 6000), ylab="freq")
# Answer : 자신이 "약간 살이 쪘다" 또는 "매우 살이 쪘다"라고 생각한 응답자 중 실제 비만인 응답자는 0.1718, 즉 전체 응답자의 약 17%.
# 반면 자신이 "약간 살이 쪘다" 또는 "매우 살이 쪘다"라고 생각한 응답자 중 실제 비만이 아닌 응답자는 0.2119, 즉 전체 응답자의 약 21%
# 따라서 본인의 생각과 달리 실제로 살이 찌지 않은 사람이 더 많으므로, 데이터가 가설을 뒷받침한다.