본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
데이터 전처리

탐색적 데이터 분석(Exploratory Data Analysis)의 자동화 패키지 in R - Part 1 : SmartEDA

by 아참형인간 2022. 9. 14.
eda.knit

자동 탐색적 데이터 분석

데이터 분석을 하기 위해서 가장 먼저 해야하는 작업은 분석에 필요한 적절한 데이터를 찾고 얻어내는 것일 것이다. 자신이 분석하기 원하는 데이터를 찾았다면 먼저 데이터를 R로 불러들여야 한다. 이 작업이 끝나면 이제 본격적으로 데이터 분석을 시작해야 한다.

그렇다면 이제 무슨 작업을 해야하는 것일까?

우선은 자신이 불러들인 데이터가 어떻게 생겼고 어떤 특성을 지녔는지 전반적으로 확인해야 할 것이다. 이 작업을 탐색적 데이터 분석( Exploratory Data Analysis : EDA)이라고 한다.

대부분의 R 관련 입문 도서들에서는 탐색적 데이터 분석을 위해 head()tail()로 개략적인 데이터를 확인하고 str()glimpse()를 사용하여 데이터프레임의 전반적인 구조를 확인하는 방법을 소개한다. 하지만 R에서는 이보다 강력한 EDA 패키지가 제공된다. 이번 포스트에서는 다양한 EDA 패키지에 대해 소개한다.

학업 중단자 데이터 로딩

EDA 패키지의 기능을 소개하기 위해 사용하는 데이터는 ‘평균과 중간값 등 통계치의 시각화 in R’(https://2stndard.tistory.com/132) 포스트에서 사용했던 학업 중단자 데이터를 사용하도록 하겠다.

df_dropout <- read_excel('데이터저장폴더/유초 주요-04 시도별 행정구역별 교육통계 현황_방통제외(1999-2022)_20220824y.xlsx', 
           sheet = '2021-2022',
           skip = 11, 
           col_names = FALSE, 
           col_types = c(rep('text', 4), rep('numeric', 166)))

df_dropout <- df_dropout |> 
  select(1, 2, 3, 4, 22, seq(from = 127, to = 142, by = 3)) |>
  rename(c('연도' = ...1, '시도' = ...2, '시군' = ...3, '학교급' = ...4, '전체학생수' = ...22, '학업중단자' = ...127, '유예' = ...130, '면제' = ...133, '자퇴' = ...136, '퇴학' = ...139, '제적' = ...142))

여기에 일부 열을 팩터로 변경하여 사용한다.

df_dropout <- df_dropout  |>
  mutate(시도 = as.factor(시도),
         학교급 = as.factor(학교급))

SmartEDA 패키지

SmartEDA 패키지는 데이터프레임의 구조와 관계를 설명하는 다양한 함수를 제공한다. 특히 그래트와 차트를 통해 EDA를 제공하고 EDA를 종합한 보고서도 작성할 수 있다는 장점이 있다.

우선 SmartEDA 패키지를 설치한다.

if (!require(SmartEDA)) {
  install.packages('SmartEDA')
  library(SmartEDA)
}

전체 데이터 요약

SmartEDA에서 가장 기본적으로 사용되는 함수는 ExpData()이다. 이 함수는 데이터프레임의 전반적인 개요를 설명해주는 메타데이터와 데이터들의 종합값을 보여준다. ExpData()는 type 1과 type 2의 두 가지 요약 결과를 보여준다.

ExpData(df_dropout, type = 1)
##                                           Descriptions     Value
## 1                                   Sample size (nrow)      4047
## 2                              No. of variables (ncol)        11
## 3                    No. of numeric/interger variables         7
## 4                              No. of factor variables         2
## 5                                No. of text variables         2
## 6                             No. of logical variables         0
## 7                          No. of identifier variables         0
## 8                                No. of date variables         0
## 9             No. of zero variance variables (uniform)         0
## 10               %. of variables having complete cases 100% (11)
## 11   %. of variables having >0% and <50% missing cases    0% (0)
## 12 %. of variables having >=50% and <90% missing cases    0% (0)
## 13          %. of variables having >=90% missing cases    0% (0)

type 1의 결과를 보면 전체 샘플 사이즈는 4047개, 변수(열)의 수는 11개, 수치형 변수는 7개, 팩터형 변수는 2개, 문자형 변수는 2개, 논리형 변수, ID 변수, 날짜형 변수, 0 분산 변수는 0개, 완전한 케이스(NA를 포함하지 않는)를 가지는 변수는 100%(11개), 결측치의 범위에 따른 변수의 개수를 보여준다.

ExpData(df_dropout, type = 2)
##    Index Variable_Name Variable_Type Sample_n Missing_Count Per_of_Missing
## 1      1          연도     character     4047             0              0
## 2      2          시도        factor     4047             0              0
## 3      3          시군     character     4047             0              0
## 4      4        학교급        factor     4047             0              0
## 5      5    전체학생수       numeric     4047             0              0
## 6      6    학업중단자       numeric     4047             0              0
## 7      7          유예       numeric     4047             0              0
## 8      8          면제       numeric     4047             0              0
## 9      9          자퇴       numeric     4047             0              0
## 10    10          퇴학       numeric     4047             0              0
## 11    11          제적       numeric     4047             0              0
##    No_of_distinct_values
## 1                      2
## 2                     17
## 3                    208
## 4                     13
## 5                   2999
## 6                    399
## 7                    191
## 8                    182
## 9                    249
## 10                    21
## 11                    11

type 2의 결과를 보면 각각의 변수에 따른 변수타입, 샘플 개수, 결측치수, 결측치의 비율, 유일값의 개수를 보여준다.

이 type 2의 결과에 합계, 평균, 중앙값, 분산 등의 요약 통계치를 같이 나타내는 코드는 다음과 같다.

ExpData(df_dropout, type = 2, fun = c('sum', 'mean', 'sd'))
##    Index Variable_Name Variable_Type Sample_n Missing_Count Per_of_Missing
## 1      1          연도     character     4047             0              0
## 2      2          시도        factor     4047             0              0
## 3      3          시군     character     4047             0              0
## 4      4        학교급        factor     4047             0              0
## 5      5    전체학생수       numeric     4047             0              0
## 6      6    학업중단자       numeric     4047             0              0
## 7      7          유예       numeric     4047             0              0
## 8      8          면제       numeric     4047             0              0
## 9      9          자퇴       numeric     4047             0              0
## 10    10          퇴학       numeric     4047             0              0
## 11    11          제적       numeric     4047             0              0
##    No_of_distinct_values      sum    mean       sd
## 1                      2       NA      NA       NA
## 2                     17       NA      NA       NA
## 3                    208       NA      NA       NA
## 4                     13       NA      NA       NA
## 5                   2999 39361942 9726.20 40123.41
## 6                    399   262627   64.89   262.79
## 7                    191    63495   15.69    98.91
## 8                    182    52558   12.99    75.28
## 9                    249   144060   35.60   134.18
## 10                    21     2193    0.54     2.05
## 11                    11      321    0.08     0.63

수치형 변수 요약

SmartEDA에서는 데이터프레임 중에서 수치형 변수에 대한 상세한 EDA를 위해 ExpNumStat()가 제공된다.

ExpNumStat(df_dropout)
##        Vname Group   TN nNeg nZero nPos NegInf PosInf NA_Value Per_of_Missing
## 4       면제   All 4047    0  2807 1240      0      0        0              0
## 3       유예   All 4047    0  2546 1501      0      0        0              0
## 5       자퇴   All 4047    0  1866 2181      0      0        0              0
## 1 전체학생수   All 4047    0    27 4020      0      0        0              0
## 7       제적   All 4047    0  3904  143      0      0        0              0
## 6       퇴학   All 4047    0  3328  719      0      0        0              0
## 2 학업중단자   All 4047    0   962 3085      0      0        0              0
##        sum min     max     mean median        SD    CV    IQR Skewness Kurtosis
## 4    52558   0    2484   12.987      0    75.285 5.797    2.0   20.484  552.900
## 3    63495   0    4089   15.689      0    98.914 6.305    4.0   26.025  894.955
## 5   144060   0    3758   35.597      3   134.178 3.769   26.0   16.774  394.019
## 1 39361942   0 1656804 9726.203   1991 40123.410 4.125 6869.5   23.366  804.639
## 7      321   0      11    0.079      0     0.627 7.902    0.0   12.035  165.617
## 6     2193   0      45    0.542      0     2.052 3.786    0.0    9.252  138.857
## 2   262627   0   10385   64.894     12   262.793 4.050   50.0   22.030  712.289

ExpNumStat()는 변수의 그룹에 따라 EDA를 보여주는 매개변수를 제공한다. ‘by’는 ’A’, ‘G’, ‘GA’의 세 가지 값을 가지는데 ’A’는 전체적인 EDA, ’G’는 ’gp’ 매개변수에 설정된 열의 값게 따라 그룹화하여 수치형 변수에 대한 EDA를 보여준다. ’GA’는 전체와 그룹화 EDA를 보여준다.

ExpNumStat(df_dropout, by = 'GA', gp = '연도')
##         Vname     Group   TN nNeg nZero nPos NegInf PosInf NA_Value
## 4        면제  연도:All 4047    0  2807 1240      0      0        0
## 11       면제 연도:2021 2126    0  1473  653      0      0        0
## 18       면제 연도:2022 1921    0  1334  587      0      0        0
## 3        유예  연도:All 4047    0  2546 1501      0      0        0
## 10       유예 연도:2021 2126    0  1334  792      0      0        0
## 17       유예 연도:2022 1921    0  1212  709      0      0        0
## 5        자퇴  연도:All 4047    0  1866 2181      0      0        0
## 12       자퇴 연도:2021 2126    0   981 1145      0      0        0
## 19       자퇴 연도:2022 1921    0   885 1036      0      0        0
## 1  전체학생수  연도:All 4047    0    27 4020      0      0        0
## 8  전체학생수 연도:2021 2126    0    14 2112      0      0        0
## 15 전체학생수 연도:2022 1921    0    13 1908      0      0        0
## 7        제적  연도:All 4047    0  3904  143      0      0        0
## 14       제적 연도:2021 2126    0  2045   81      0      0        0
## 21       제적 연도:2022 1921    0  1859   62      0      0        0
## 6        퇴학  연도:All 4047    0  3328  719      0      0        0
## 13       퇴학 연도:2021 2126    0  1764  362      0      0        0
## 20       퇴학 연도:2022 1921    0  1564  357      0      0        0
## 2  학업중단자  연도:All 4047    0   962 3085      0      0        0
## 9  학업중단자 연도:2021 2126    0   515 1611      0      0        0
## 16 학업중단자 연도:2022 1921    0   447 1474      0      0        0
##    Per_of_Missing      sum min     max      mean median        SD    CV     IQR
## 4               0    52558   0    2484    12.987      0    75.285 5.797    2.00
## 11              0    29754   0    2484    13.995      0    94.809 6.774    2.00
## 18              0    22804   0     535    11.871      0    44.641 3.761    2.00
## 3               0    63495   0    4089    15.689      0    98.914 6.305    4.00
## 10              0    40910   0    4089    19.243      0   130.717 6.793    4.00
## 17              0    22585   0     786    11.757      0    40.950 3.483    4.00
## 5               0   144060   0    3758    35.597      3   134.178 3.769   26.00
## 12              0    84840   0    3758    39.906      2   174.357 4.369   24.00
## 19              0    59220   0     555    30.828      3    65.188 2.115   30.00
## 1               0 39361942   0 1656804  9726.203   1991 40123.410 4.125 6869.50
## 8               0 26368674   0 1656804 12402.951   2093 53674.467 4.328 7530.75
## 15              0 12993268   0  147176  6763.804   1851 13683.564 2.023 6273.00
## 7               0      321   0      11     0.079      0     0.627 7.902    0.00
## 14              0      216   0      11     0.102      0     0.772 7.597    0.00
## 21              0      105   0       7     0.055      0     0.409 7.484    0.00
## 6               0     2193   0      45     0.542      0     2.052 3.786    0.00
## 13              0     1266   0      45     0.595      0     2.397 4.026    0.00
## 20              0      927   0      22     0.483      0     1.581 3.277    0.00
## 2               0   262627   0   10385    64.894     12   262.793 4.050   50.00
## 9               0   156986   0   10385    73.841     11   342.901 4.644   47.75
## 16              0   105641   0    1794    54.993     13   123.320 2.242   53.00
##    Skewness Kurtosis
## 4    20.484  552.900
## 11   18.851  414.435
## 18    6.932   57.866
## 3    26.025  894.955
## 10   21.159  554.418
## 17    8.658  111.052
## 5    16.774  394.019
## 12   14.316  260.403
## 19    3.763   18.363
## 1    23.366  804.639
## 8    18.376  473.495
## 15    4.642   29.823
## 7    12.035  165.617
## 14   10.614  123.352
## 21   11.859  168.844
## 6     9.252  138.857
## 13    9.287  129.648
## 20    6.611   64.450
## 2    22.030  712.289
## 9    18.564  464.160
## 16    5.974   53.142

SmartEDA는 수치형 변수에 대한 밀도분포 함수의 시각화를 보기 위해서 ExpNumViz()를 제공한다. ExpNumViz()는 각각의 변수의 EDA 값에 따른 밀도분포 함수 그래프들을 리스트로 리턴한다.

plot <- df_dropout |> filter(시군 != '소계', 학교급 == '고등학교') |> ExpNumViz(Page=c(3,3))

plot
## $`0`

만약 특정 변수에 따른 변수별 EDA 시각화 결과를 보기 위해서는 ‘target’ 매개변수에 목표 변수를 설정하면 설정된 목표 변수의 타입에 따른 시각화 결과를 보여준다. 수치형 변수에 따른 수치형 EDA 시각화는 다음과 같이 산점도로 보여준다.

plot <- df_dropout |> filter(시군 != '소계', 학교급 == '고등학교') |> ExpNumViz(Page=c(3,3), target = '전체학생수')

plot
## $`0`

목표 변수를 팩터형 변수로 설정하면 다음과 같이 박스 플롯으로 표현된다.

plot <- df_dropout |> filter(시군 != '소계', 학교급 == '고등학교') |> ExpNumViz(Page=c(3,3), target = '연도')

plot
## $`0`

범주형 변수 요약

범주형 변수에 대한 EDA를 위해 SmartEDA 패키지는 ExpCTable()을 제공한다. 이 함수는 범주형 변수를 자동으로 선택하여 변수에 대한 빈도나 테이블을 제공한다.

ExpCTable(df_dropout)
##   Variable Valid Frequency Percent CumPercent
## 1     연도  2021      2126   52.53      52.53
## 2     연도  2022      1921   47.47     100.00
## 3     연도 TOTAL      4047      NA         NA

‘Target’ 매개변수를 사용하면 특정 매개변수에 따른 EDA를 출력한다. ‘Target’ 매개변수가 팩터형 변수라면 해당 펙터 값에 따른 빈도와 분포율을 보여준다.

ExpCTable(df_dropout, Target = '학교급', per = T)
##   VARIABLE CATEGORY Number 학교급:(일반고) 학교급:(자율고) 학교급:(특목고)
## 1     연도     2021     nn          243.00           103.0          116.00
## 2     연도     2022     nn          226.00            71.0           99.00
## 3     연도    TOTAL     nn          469.00           174.0          215.00
## 4     연도     2021      %           51.81            59.2           53.95
## 5     연도     2022      %           48.19            40.8           46.05
## 6     연도    TOTAL      %          100.00           100.0          100.00
##   학교급:(특성화고) 학교급:각종학교 학교급:고등공민학교 학교급:고등기술학교
## 1            212.00           68.00                6.00                  13
## 2            193.00           55.00                3.00                   7
## 3            405.00          123.00                9.00                  20
## 4             52.35           55.28               66.67                  65
## 5             47.65           44.72               33.33                  35
## 6            100.00          100.00              100.00                 100
##   학교급:고등학교 학교급:소계 학교급:유치원 학교급:중학교 학교급:초등학교
## 1          246.00      246.00        246.00        246.00          246.00
## 2          229.00      229.00        229.00        229.00          229.00
## 3          475.00      475.00        475.00        475.00          475.00
## 4           51.79       51.79         51.79         51.79           51.79
## 5           48.21       48.21         48.21         48.21           48.21
## 6          100.00      100.00        100.00        100.00          100.00
##   학교급:특수학교   TOTAL
## 1          135.00 2126.00
## 2          122.00 1921.00
## 3          257.00 4047.00
## 4           52.53   52.53
## 5           47.47   47.47
## 6          100.00  100.00

만약 ‘Target’ 매개변수가 수치형이라면 해당 수치형 변수를 구간으로 그룹화하여 해당 구간에 나타난 빈도와 분포율을 출력한다.

ExpCTable(df_dropout, Target = '전체학생수', per = T)
##   VARIABLE CATEGORY Number 전체학생수:(-1.66e+03,5.52e+05]
## 1     연도     2021     nn                          2123.0
## 2     연도     2022     nn                          1921.0
## 3     연도    TOTAL     nn                          4044.0
## 4     연도     2021      %                            52.5
## 5     연도     2022      %                            47.5
## 6     연도    TOTAL      %                           100.0
##   전체학생수:(5.52e+05,1.1e+06] 전체학생수:(1.1e+06,1.66e+06]   TOTAL
## 1                             2                             1 2126.00
## 2                             0                             0 1921.00
## 3                             2                             1 4047.00
## 4                           100                           100   52.53
## 5                             0                             0   47.47
## 6                           100                           100  100.00

SmartEDA는 범주형 변수에 대한 요약 통계 EDA를 확인하기 위해 ExpCatStat()를 제공한다. ExpCatStat()는 특정 변수에 따른 나머지 변수들의 상대적 요약통계를 제공하기 때문에 반드시 ‘Target’ 매개변수로 목적 변수를 설정해야 한다. 특히 Weight of evidence and Information values에 따른 IV 값을 기반으로 예측 파워와 두 이산형 변수의 연관성 정도인 Cramer’s V를 보여준다는 점이 특이하다.

ExpCatStat(df_dropout, Target = '자퇴')
##     Variable Target Unique Chi-squared p-value   df IV Value Cramers V
## 1       연도   자퇴      2     424.159       0  248     0.03      0.32
## 2 전체학생수   자퇴     10    4686.143       0 2232     0.98      0.36
## 3 학업중단자   자퇴      8   14294.486       0 1736     0.76      0.71
## 4       유예   자퇴      4    1099.291       0  744     0.11      0.30
## 5       면제   자퇴      4    1027.813       0  744     0.12      0.29
## 6       자퇴   자퇴      6   20235.000       0 1240     0.34      1.00
## 7       퇴학   자퇴      2    2119.303       0  248     0.01      0.72
## 8       제적   자퇴      1  214646.802       0  248     0.00      0.00
##   Degree of Association    Predictive Power
## 1                Strong      Not Predictive
## 2                Strong   Highly Predictive
## 3                Strong   Highly Predictive
## 4                Strong Somewhat Predictive
## 5              Moderate Somewhat Predictive
## 6                Strong   Highly Predictive
## 7                Strong      Not Predictive
## 8             Very Weak      Not Predictive

범주형 변수의 EDA 시각화는 ExpCatVis()를 사용하는데 아래와 같이 막대 그래프로 비율을 보여준다.

plot2 <- ExpCatViz(df_dropout)
plot2
## [[1]]

댓글