자기계발/자격증

[빅데이터 분석기사] 실기 모의고사 3회 - 1/2 (R tool 사용)

혁이e 2022. 6. 21.

모의고사 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

댓글

💲 추천 글