문제집을 사서 풀다 보니, 지난번 기출문제가 있었다.
당시엔 긴장해서 제대로 풀었는지 기억이 나지 않았는데
다시 한번 차근차근 풀어보았다.
1. BostonHousing 데이터세트.
crim 항목의 상위 10번째 값으로 상위 10개의 값을 변환
Age 80 이상인 값에 대하여
crim 의 평균을 구하시오.
[풀이]
1) 데이터 살펴보기
data(BostonHousing)
df<-BostonHousing
str(df)
'data.frame': 506 obs. of 14 variables:
$ crim : num 0.00632 0.02731 0.02729 0.03237 0.06905 ...
$ zn : num 18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
$ indus : num 2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
$ chas : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ nox : num 0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
$ rm : num 6.58 6.42 7.18 7 7.15 ...
$ age : num 65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
$ dis : num 4.09 4.97 4.97 6.06 6.06 ...
$ rad : num 1 2 2 3 3 3 5 5 5 5 ...
$ tax : num 296 242 242 222 222 222 311 311 311 311 ...
$ ptratio: num 15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
$ b : num 397 397 393 395 397 ...
$ lstat : num 4.98 9.14 4.03 2.94 5.33 ...
$ medv : num 24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...
2) crim 내림차순으로 정렬, 10번째 값으로 1~10개의 값을 바꾸기
library(dplyr)
df_1<- df %>% arrange(desc(crim))
df_1[1:10,1]<-df_1[10,1]
3) Age 80이상에서 crim 평균 내기
result <- df_1 %>% filter(age>=80) %>% summarise(mean=mean(crim))
print(result)
mean
1 5.759387
2. 첫번째 행부터 순서대로 80%까지 데이터를 훈련데이터로 추출, housing_office 항목에서 'total_bedrooms' 변수 결측값(NA) 를 'total_bendrooms' 변수의 중앙값으로 대체하고 대체전의 'total_bedrooms'의 변수 표준편차값과 대체후의 표준편차값의 차이를 구하시오.
[풀이]
1) 데이터 살펴보기
df<-read.csv("https://raw.githubusercontent.com/ageron/handson-ml/master/datasets/housing/housing.csv")
str(df)
'data.frame': 20640 obs. of 10 variables:
$ longitude : num -122 -122 -122 -122 -122 ...
$ latitude : num 37.9 37.9 37.9 37.9 37.9 ...
$ housing_median_age: num 41 21 52 52 52 52 52 52 42 52 ...
$ total_rooms : num 880 7099 1467 1274 1627 ...
$ total_bedrooms : num 129 1106 190 235 280 ...
$ population : num 322 2401 496 558 565 ...
$ households : num 126 1138 177 219 259 ...
$ median_income : num 8.33 8.3 7.26 5.64 3.85 ...
$ median_house_value: num 452600 358500 352100 341300 342200 ...
$ ocean_proximity : Factor w/ 5 levels "<1H OCEAN","INLAND",..: 4 4 4 4 4 4 4 4 4 4 ...
2) 첫행부터 80% 를 훈련값으로 만들기
train<-df[c(1:nrow(df)*0.8),]
3) 표준편차 구하기
sd_1<- sd(train$total_bedrooms, na.rm=T)
4) NA 값을 중앙값으로 대체하고 표준편차 구하기
sd_2<-train %>% mutate(new = ifelse(is.na(total_bedrooms), median(total_bedrooms, na.rm=T), total_bedrooms)) %>% summarise(sd=sd(new))
5) 두 표준편차 값의 차이 구하기
print(abs(sd_1-sd_2))
sd
1 1.956984
3. Insurance 데이터 세트, Charges 항목에서 이상값의 합을 구하시오
[풀이]
1) 데이터 살펴보기
df<-read.csv("https://raw.githubusercontent.com/stedy/Machine-Learning-with-R-datasets/d20658ec6d336af2d4ddb5fd72b6f677dd46136e/insurance.csv")
str(df)
summary(df)
age sex bmi children smoker
Min. :18.00 female:662 Min. :15.96 Min. :0.000 no :1064
1st Qu.:27.00 male :676 1st Qu.:26.30 1st Qu.:0.000 yes: 274
Median :39.00 Median :30.40 Median :1.000
Mean :39.21 Mean :30.66 Mean :1.095
3rd Qu.:51.00 3rd Qu.:34.69 3rd Qu.:2.000
Max. :64.00 Max. :53.13 Max. :5.000
region charges
northeast:324 Min. : 1122
northwest:325 1st Qu.: 4740
southeast:364 Median : 9382
southwest:325 Mean :13270
3rd Qu.:16640
2) charges에서 이상값의 합 구하기
이상치의 정의 : 아래 boxplot을 보면 위 점들을 말하며, 정의는 평균에서 1.5*(3분위수-1분위수) 를 뺀 값보다 낮거나 더한 값보다 높은 값들을 의미한다.
plot(df)
low <- fivenum(df[,7])[2] - 1.5*IQR(df[,7])
upp <- fivenum(df[,7])[4] + 1.5*IQR(df[,7])
result <- sum(df[which(df[,7]>=upp | df[,7]<=low),7])
print(result)
[1] 5852449