열렬히.뛰기

2022년 탐자 1차 시험

수학 & 통계 > 탐색적 자료분석 > 탐색적 자료분석 : 문제 > 2022년 탐자 1차 시험

문제

한글 해석본 (실제 시험에서는 영어로 나옴)

  1. txt 파일 읽기.

  2. 결측값이 9999인 경우 이를 제거하는 방법. 결측값 빼서 새로 data를 만든 후, 그때 row의 수를 구하기

  3. BMI라는 이름의 변수를 만들고, 해당 그래프를 만들기. (저수준 그래프 함수를 사용할 것)

    단, BMI를 그래프화 할 때 남녀 간의 차이를 보일 수 있게 할 것.

  4. 탄산음료 섭취 빈도 변수를 범주형 변수로 만들고, 비만인 사람 (비만의 기준 : 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%
# 따라서 본인의 생각과 달리 실제로 살이 찌지 않은 사람이 더 많으므로, 데이터가 가설을 뒷받침한다.