# 1. 보스턴 데이터(boston.csv) 범죄율 컬럼(CRIM) top10 중
# 10번째 범죄율 값으로 1~10위의 범죄율 값을 변경 후
# AGE 변수 80이상의 범죄율 평균 산출(5.759)
[내 답안]
bos <- read.csv('boston.csv')
head(bos)
str(bos)
# 10번째 범죄율 값을 구한 후 1~10의 값 변경하기
a1 <- arrange(bos, -bos$crim)[10,]
a2 <- a1$crim
bos1 <- arrange(bos, -bos$crim)
bos1[1:10, ]$crim <- a2
# age 변수 80 이상의 범죄율 평균 구하기
bos2 <- bos1[bos1$age >= 80,]
bos2
mean(bos2$crim)
> mean(bos2$crim)
[1] 5.759387
[문제풀이]
boston <- read.csv('boston.csv')
v1 <- sort(boston$crim, decreasing = T)[10]
boston$crim[boston$crim >= v1] <- v1
res1 <- boston[boston$age >= 80, 'crim'] |> mean() |> round(3)
print(res1)
# 2. 주어진 housing.csv 데이터 첫번째 행 부터 순서대로 80%까지의 데이터를 추출 후
# 'total_bedrooms' 변수의 결측값(NA)을 'total_bedrooms' 변수의 중앙값으로 대체하고
# 대체 전 표준편차와 대체 후의 표준편차 차이(양수) 출력
# (1.975)
[내 답안]
hou <- read.csv('housing.csv')
str(hou) # 20640 obs
head(hou)
# 80% 추출하기
a3 <- 20640 * 0.8
hou1 <- hou[1:a3,]
head(hou1)
hou2 <- hou1
# 침실의 결측값을 침실의 중앙값으로 대체하기
hou2$total_bedrooms <- coalesce(hou2$total_bedrooms, median(hou2$total_bedrooms, na.rm=T))
# 대체 전 표준편차와 대체 후의 표준편차 차이(양수) 출력
sd(hou1$total_bedrooms, na.rm = T) - sd(hou2$total_bedrooms)
> sd(hou1$total_bedrooms, na.rm = T) - sd(hou2$total_bedrooms)
[1] 1.975147
[문제풀이]
housing <- read.csv('housing.csv')
str(housting)
head(housing)
# 상위 80% 행 선택
rn <- nrow(housing) * 0.8
housing2 <- housing[1:rn,]
# 중앙값 확인
m1 <- median(housing2$total_bedrooms, na.rm = T)
# 대치 전 표준편차 확인
sd1 <- sd(housing2$total_bedrooms, na.rm = T)
# 결측치 대치 및 대치 후 표준편차 확인
housing2$total_bedrooms[is.na(housing2$total_bedrooms)] <- m1
sd2 <- sd(housing$total_bedrooms)
# 정답제출
res2 <- round(abs(sd1 - sd2), 3)
print(res2)
# 3. insurance.csv 파일을 읽고
[내 답안] : 데이터 전처리
# 열 분리 및 제목 수정
df1 <- str_match(ins$V1, '(.+)(,.+)(,.+)(,.+)(,.+)(,.+)(,.+)')
n1 <- str_match(df1[1,1], '(.+)(,.+)(,.+)(,.+)(,.+)(,.+)(,.+)')
colnames(df1) <- str_remove_all(n1, ',')
# 필요한 행렬만 추출
ins2 <- df1[-1,-1]
# 불필요한 ',' 제거
ins2[,] <- str_remove_all(ins2[,], ',')
# 숫자로 변환
ins2 <- as.data.frame(ins2)
ins2$bmi <- as.numeric(ins2$bmi)
ins2$charges <- as.numeric(ins2$charges)
head(ins2)
str(ins2)
print(ins2)
> print(ins2)
age sex bmi children smoker region charges
1 19 female 27.900 0 yes southwest 16884.924
2 18 male 33.770 1 no southeast 1725.552
3 28 male 33.000 3 no southeast 4449.462
4 33 male 22.705 0 no northwest 21984.471
5 32 male 28.880 0 no northwest 3866.855
6 31 female 25.740 0 no southeast 3756.622
7 46 female 33.440 1 no southeast 8240.590
8 37 female 27.740 3 no northwest 7281.506
9 37 male 29.830 2 no northeast 6406.411
10 60 female 25.840 0 no northwest 28923.137
# 1) 데이터의 특정컬럼(bmi, charges)의 이상치를 찾아 두 컬럼의 이상치들의 합의 제곱근 산출
# (이상치 기준 : IQR)
[내 답안]
# bmi 이상치 확인
q1 <- quantile(ins2$bmi)[2]
q3 <- quantile(ins2$bmi)[4]
viqr <- q3 - q1
r1 <- ins2[ins2$bmi > q3 + 1.5*viqr, ]
r2 <- ins2[ins2$bmi < q1 - 1.5*viqr, ]
outlier <- rbind(r1, r2)
out_bmi <- outlier
# charges 이상치 확인
q1 <- quantile(ins2$charges)[2]
q3 <- quantile(ins2$charges)[4]
viqr <- q3 - q1
r1 <- ins2[ins2$charges > q3 + 1.5*viqr, ]
r2 <- ins2[ins2$charges < q1 - 1.5*viqr, ]
outlier <- rbind(r1, r2)
out_charges <- outlier
# 이상치들의 합의 제곱근 구하기
sqrt_result <- sqrt(sum(out_bmi$bmi, out_charges$charges))
print(sqrt_result)
> print(sqrt_result)
[1] 2419.275
[문제풀이]
insurance <- read.csv('insurance.csv')
head(insurance)
str(insurance)
# 1) 데이터의 특정컬럼(bmi, charges)의 이상치를 찾아 두 컬럼의 이상치들의 합의 제곱근 산출(2419.275)
# (이상치 기준 : IQR)
# 이상치 검출
# 1-1) bmi
q3 <- quantile(insurance$bmi)['75%']
q1 <- quantile(insurance$bmi)['25%']
out1 <- insurance$bmi[insurance$bmi >= q3 + 1.5*(q3-q1)]
# 1-2) charges
q3 <- quantile(insurance$charges)['75%']
q1 <- quantile(insurance$charges)['25%']
out2 <- insurance$charges[insurance$charges >= q3 + 1.5*(q3-q1)]
# 1-3) 이상치 총합
sqrt(sum(out1) + sum(out2))
# 2) 두 컬럼(bmi, charges)의 상자그림을 시각화
# 이상치에 해당하는 행번호를 함께 출력
[내 답안]
head(ins3)
dev.new()
ins3 <- ins2[,c('bmi', 'charges')]
boxplot(ins3, col = my_col2[1:2], las =1,
main = 'boxplot (bmi, charges)',
xlab = '컬럼명')
text(rep(2, nrow(out_charges)), out_charges$charges, cex = 0.8)
text(rep(1, nrow(out_bmi)), out_bmi$bmi, cex = 0.8)

[문제풀이]
par(mfrow=c(1,2))
par('mar' = c(1,4,1,2))
boxplot(insurance$bmi, outcex = 0.5)
text(1.05, out1, cex = 0.4)
boxplot(insurance$charges, outcex = 0.5)
text(1.08, out2, cex = 0.4)

'아이티윌_데이터 분석 55기 > 문제풀이_통계 및 분석' 카테고리의 다른 글
| #2-2. 2일차 퀴즈에 대한 문제풀이 (0) | 2026.04.14 |
|---|---|
| #1-2. 1일차 퀴즈에 대한 문제풀이 (0) | 2026.04.13 |
| #8-2. 8일차 퀴즈에 대한 문제풀이 (0) | 2026.04.09 |
| #7-2. 7일차 퀴즈에 대한 문제풀이 (0) | 2026.04.08 |
| #6-2. 6일차 퀴즈에 대한 문제풀이 (0) | 2026.04.07 |