모의고사 3회 연습 풀이 R 코드이다.
(1) 필답형
CDC (Change Data Capture) / 강화 학습 / 모멘텀 / 다차원 척도법
랜덤 포레스트 / 데이터 비식별화 / 임베디드 기법 / k-익명성 / DBSACN 알고리즘 / 이익 도표(Gain chart)
(2) 작업형
1. R의 esoph 데이터 세트를 이용, 환자 수(ncases)와 대조군 수(ncontrols)를 합한 새로운 칼럼인 관측자 수(nsums)를 생성하고, 음주량과 흡연량에 따른 관측자 수의 이원교차표(two-way table)를 생성하여 확인하고 카이제곱 값을 구하시오.
# 데이터 로드
> ds <- esoph
> str(ds)
'data.frame': 88 obs. of 5 variables:
$ agegp : Ord.factor w/ 6 levels "25-34"<"35-44"<..: 1 1 1 1 1 1 1 1 1 1 ...
$ alcgp : Ord.factor w/ 4 levels "0-39g/day"<"40-79"<..: 1 1 1 1 2 2 2 2 3 3 ...
$ tobgp : Ord.factor w/ 4 levels "0-9g/day"<"10-19"<..: 1 2 3 4 1 2 3 4 1 2 ...
$ ncases : num 0 0 0 0 0 0 0 0 0 0 ...
$ ncontrols: num 40 10 6 5 27 7 4 7 2 1 ...
# 데이터 확인 & 결측치 처리
> summary(ds)
agegp alcgp tobgp ncases ncontrols
25-34:15 0-39g/day:23 0-9g/day:24 Min. : 0.000 Min. : 0.000
35-44:15 40-79 :23 10-19 :24 1st Qu.: 0.000 1st Qu.: 1.000
45-54:16 80-119 :21 20-29 :20 Median : 1.000 Median : 4.000
55-64:16 120+ :21 30+ :20 Mean : 2.273 Mean : 8.807
65-74:15 3rd Qu.: 4.000 3rd Qu.:10.000
75+ :11 Max. :17.000 Max. :60.000
> colSums(is.na(ds))
agegp alcgp tobgp ncases ncontrols
0 0 0 0 0
> head(ds)
agegp alcgp tobgp ncases ncontrols
1 25-34 0-39g/day 0-9g/day 0 40
2 25-34 0-39g/day 10-19 0 10
3 25-34 0-39g/day 20-29 0 6
4 25-34 0-39g/day 30+ 0 5
5 25-34 40-79 0-9g/day 0 27
6 25-34 40-79 10-19 0 7
# 새로운 변수 생성
> ds$nsums <- ds$ncases + ds$ncontrols
> head(ds)
agegp alcgp tobgp ncases ncontrols nsums
1 25-34 0-39g/day 0-9g/day 0 40 40
2 25-34 0-39g/day 10-19 0 10 10
3 25-34 0-39g/day 20-29 0 6 6
4 25-34 0-39g/day 30+ 0 5 5
5 25-34 40-79 0-9g/day 0 27 27
6 25-34 40-79 10-19 0 7 7
> tail(ds)
agegp alcgp tobgp ncases ncontrols nsums
83 75+ 40-79 20-29 0 3 3
84 75+ 40-79 30+ 1 0 1
85 75+ 80-119 0-9g/day 1 0 1
86 75+ 80-119 10-19 1 0 1
87 75+ 120+ 0-9g/day 2 0 2
88 75+ 120+ 10-19 1 0 1
# 테이블 형성 (xtabs 함수 사용)
> nsums_tab <- xtabs(nsums ~ alcgp + tobgp, data=ds)
> nsums_tab
tobgp
alcgp 0-9g/day 10-19 20-29 30+
0-39g/day 261 84 42 28
40-79 179 85 62 29
80-119 61 49 16 12
120+ 24 18 12 13
# 카이제곱 검정
> chi <- chisq.test(nsums_tab)
> result <- chi$statistic
> print(result)
X-squared
43.67211
2. MASS 패키지의 ChickWeight 데이터 세트에서 weight 를 최소-최대 척도(Min-Max Scaling)로 변환한 결과가 0.5 이상인 레코드 수를 구하시오.
# 데이터 로드
> data("ChickWeight")
> ds <- ChickWeight
> str(ds)
Classes ‘nfnGroupedData’, ‘nfGroupedData’, ‘groupedData’ and 'data.frame': 578 obs. of 4 variables:
$ weight: num 42 51 59 64 76 93 106 125 149 171 ...
$ Time : num 0 2 4 6 8 10 12 14 16 18 ...
$ Chick : Ord.factor w/ 50 levels "18"<"16"<"15"<..: 15 15 15 15 15 15 15 15 15 15 ...
$ Diet : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
- attr(*, "formula")=Class 'formula' language weight ~ Time | Chick
.. ..- attr(*, ".Environment")=<environment: R_EmptyEnv>
- attr(*, "outer")=Class 'formula' language ~Diet
.. ..- attr(*, ".Environment")=<environment: R_EmptyEnv>
- attr(*, "labels")=List of 2
..$ x: chr "Time"
..$ y: chr "Body weight"
- attr(*, "units")=List of 2
..$ x: chr "(days)"
..$ y: chr "(gm)"
> summary(ds)
weight Time Chick Diet
Min. : 35.0 Min. : 0.00 13 : 12 1:220
1st Qu.: 63.0 1st Qu.: 4.00 9 : 12 2:120
Median :103.0 Median :10.00 20 : 12 3:120
Mean :121.8 Mean :10.72 10 : 12 4:118
3rd Qu.:163.8 3rd Qu.:16.00 17 : 12
Max. :373.0 Max. :21.00 19 : 12
(Other):506
> head(ds)
weight Time Chick Diet
1 42 0 1 1
2 51 2 1 1
3 59 4 1 1
4 64 6 1 1
5 76 8 1 1
6 93 10 1 1
# 최대-최소 정규화
> library(caret)
> pre_ds <- preProcess(ds, method="range")
> ds2 <- predict(pre_ds, ds)
> head(ds2)
Grouped Data: weight ~ Time | Chick
weight Time Chick Diet
1 0.02071006 0.0000000 1 1
2 0.04733728 0.0952381 1 1
3 0.07100592 0.1904762 1 1
4 0.08579882 0.2857143 1 1
5 0.12130178 0.3809524 1 1
6 0.17159763 0.4761905 1 1
# 행 숫자 추출
> ds3 <- ds2
> library(dplyr)
> nrow(ds3)
[1] 81
> reulst <- nrow(ds3)
> print(reulst)
[1] 81
3. mlbench 패키지의 PimalndiansDiabetes2 데이터 세트이다.
glucose, pressure, mass 컬럼의 결측값이 있는 행을 제거하고, 나이(age) 조건에 맞게 그룹화
(1:20~40, 2:41~60, 3:60세 이상) 한 후 발병률이 가장 높은 나이 그룹의 발병률을 구하시오.
(발병률 = diabetes 중 pos의 수 / 인원수)
# 데이터 로드
> library(mlbench)
> data("PimaIndiansDiabetes2")
> ds <- PimaIndiansDiabetes2
> str(ds)
'data.frame': 768 obs. of 9 variables:
$ pregnant: num 6 1 8 1 0 5 3 10 2 8 ...
$ glucose : num 148 85 183 89 137 116 78 115 197 125 ...
$ pressure: num 72 66 64 66 40 74 50 NA 70 96 ...
$ triceps : num 35 29 NA 23 35 NA 32 NA 45 NA ...
$ insulin : num NA NA NA 94 168 NA 88 NA 543 NA ...
$ mass : num 33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 NA ...
$ pedigree: num 0.627 0.351 0.672 0.167 2.288 ...
$ age : num 50 31 32 21 33 30 26 29 53 54 ...
$ diabetes: Factor w/ 2 levels "neg","pos": 2 1 2 1 2 1 2 1 2 2 ...
> summary(ds)
pregnant glucose pressure triceps insulin mass pedigree
Min. : 0.000 Min. : 44.0 Min. : 24.00 Min. : 7.00 Min. : 14.00 Min. :18.20 Min. :0.0780
1st Qu.: 1.000 1st Qu.: 99.0 1st Qu.: 64.00 1st Qu.:22.00 1st Qu.: 76.25 1st Qu.:27.50 1st Qu.:0.2437
Median : 3.000 Median :117.0 Median : 72.00 Median :29.00 Median :125.00 Median :32.30 Median :0.3725
Mean : 3.845 Mean :121.7 Mean : 72.41 Mean :29.15 Mean :155.55 Mean :32.46 Mean :0.4719
3rd Qu.: 6.000 3rd Qu.:141.0 3rd Qu.: 80.00 3rd Qu.:36.00 3rd Qu.:190.00 3rd Qu.:36.60 3rd Qu.:0.6262
Max. :17.000 Max. :199.0 Max. :122.00 Max. :99.00 Max. :846.00 Max. :67.10 Max. :2.4200
NA's :5 NA's :35 NA's :227 NA's :374 NA's :11
age diabetes
Min. :21.00 neg:500
1st Qu.:24.00 pos:268
Median :29.00
Mean :33.24
3rd Qu.:41.00
Max. :81.00
> head(ds)
pregnant glucose pressure triceps insulin mass pedigree age diabetes
1 6 148 72 35 NA 33.6 0.627 50 pos
2 1 85 66 29 NA 26.6 0.351 31 neg
3 8 183 64 NA NA 23.3 0.672 32 pos
4 1 89 66 23 94 28.1 0.167 21 neg
5 0 137 40 35 168 43.1 2.288 33 pos
6 5 116 74 NA NA 25.6 0.201 30 neg
# 결측치가 있는 행 걸러내기
> ds3 <- ds %>% filter(!is.na(glucose) & !is.na(pressure) & !is.na(mass))
> colSums(is.na(ds3))
pregnant glucose pressure triceps insulin mass pedigree age diabetes
0 0 0 192 332 0 0 0 0
# 그룹화를 위해 새로운 매개변수 age_grp 생성
> ds3 <- ds3 %>% mutate(age_grp = ifelse(age >=60, "3", ifelse(age >=41, "2", "1")))
# 확률 계산을 위해 각각 노가다
> ds_grp1 <- ds3 %>% filter (age_grp==1 & diabetes=="pos")
> ds_grp2 <- ds3 %>% filter (age_grp==2 & diabetes=="pos")
> ds_grp3 <- ds3 %>% filter (age_grp==3 & diabetes=="pos")
> cnt1 <- nrow(ds_grp1)
> cnt2 <- nrow(ds_grp2)
> cnt3 <- nrow(ds_grp3)
> total1 <- ds3 %>% filter (age_grp==1)
> total2 <- ds3 %>% filter (age_grp==2)
> total3 <- ds3 %>% filter (age_grp==3)
> cnt_total1 <- nrow(total1)
> cnt_total2 <- nrow(total2)
> cnt_total3 <- nrow(total3)
# 확률 계산
> cnt1/cnt_total1
[1] 0.2806691
> cnt2/cnt_total2
[1] 0.5705128
> cnt3/cnt_total3
[1] 0.3
> result <- cnt2/cnt_total2
> print(result)
[1] 0.5705128
'자기계발 > 자격증' 카테고리의 다른 글
[빅데이터 분석기사] 실기 후기 - 대구 시험장 선택 (영진직업전문학교) (0) | 2022.06.26 |
---|---|
[빅데이터 분석기사] 6/25 실기 후기 및 다음 시험을 위한 준비 (0) | 2022.06.25 |
[빅데이터 분석기사] 실기 모의고사 2회 - 2/2 (0) | 2022.06.20 |
[빅데이터 분석기사] 실기 모의고사 2회 - 1/2 (0) | 2022.06.19 |
[빅데이터 분석기사] 실기 모의고사 1회 - 2/2 (0) | 2022.06.18 |
댓글