아이티윌_데이터 분석 55기/문제풀이_통계 및 분석

#9-2. 9일차 퀴즈에 대한 문제풀이

ecosso 2026. 4. 10. 17:59

# 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)