[R 데이터 탐색] 5. 외부 파일 로드 시 NA 값 처리

수진·2020년 2월 24일
0

R

목록 보기
7/12
post-thumbnail

  외부 파일(엑셀, csv, txt)을 R로 불러올 때 실제 비어져있는 데이터이지만 NA로 표시되지 않는 경우가 많습니다. 이렇게 되면 아래의 문제가 발생할 수 있습니다.

1) 변수 유형 파악에 문제가 생긴다 👉 수치형 변수가 문자형 변수로 나옴
2) 결측값 진단이 실제와 다르게 나온다 👉 결측값이 아닌 것으로 나옴

  따라서 본격적인 데이터 탐색 이전에 데이터 진단을 해보고 NA가 제대로 안나오는 것을 확인하면 다시 NA가 제대로 처리된 데이터를 불러와주어야 합니다. 이 때, 어떻게 NA를 처리하느냐를 간단히 정리해보겠습니다. 😀

  데이터는 케글에서 csv 파일 형식의 Video Games Sales with Ratings(바로 가기)를 활용하였습니다.

  • 데이터 확인하기
# csv 파일을 불러와 videoGames에 저장했다
> videoGames <- read.csv(file = "Video_Games_Sales_as_at_22_Dec_2016.csv")

# 데이터를 확인해보니 NA로 결측치가 표시되어 있는 열도 있으나 User_Score, Developer, Rating는 그냥 빈 칸으로 나온다
# NA가 빈 칸으로 표시된 열 중 User_Score는 숫자형 데이터이지만 factor형 데이터로 인식되어있다
> dplyr::glimpse(videoGames)
Observations: 16,719
Variables: 16
$ Name            <fct> Wii Sports, Super Mario Bros., Mario Kart Wii, Wii Sports Resort, Pokemon Red/Pokemon Blue, T…
$ Platform        <fct> Wii, NES, Wii, Wii, GB, GB, DS, Wii, Wii, NES, DS, DS, GB, Wii, X360, Wii, PS3, PS2, SNES, DS…
$ Year_of_Release <fct> 2006, 1985, 2008, 2009, 1996, 1989, 2006, 2006, 2009, 1984, 2005, 2005, 1999, 2007, 2010, 200…
$ Genre           <fct> Sports, Platform, Racing, Sports, Role-Playing, Puzzle, Platform, Misc, Platform, Shooter, Si…
$ Publisher       <fct> Nintendo, Nintendo, Nintendo, Nintendo, Nintendo, Nintendo, Nintendo, Nintendo, Nintendo, Nin…
$ NA_Sales        <dbl> 41.36, 29.08, 15.68, 15.61, 11.27, 23.20, 11.28, 13.96, 14.44, 26.93, 9.05, 9.71, 9.00, 8.92,…
$ EU_Sales        <dbl> 28.96, 3.58, 12.76, 10.93, 8.89, 2.26, 9.14, 9.18, 6.94, 0.63, 10.95, 7.47, 6.18, 8.03, 4.89,…
$ JP_Sales        <dbl> 3.77, 6.81, 3.79, 3.28, 10.22, 4.22, 6.50, 2.93, 4.70, 0.28, 1.93, 4.13, 7.20, 3.60, 0.24, 2.…
$ Other_Sales     <dbl> 8.45, 0.77, 3.29, 2.95, 1.00, 0.58, 2.88, 2.84, 2.24, 0.47, 2.74, 1.90, 0.71, 2.15, 1.69, 1.7…
$ Global_Sales    <dbl> 82.53, 40.24, 35.52, 32.77, 31.37, 30.26, 29.80, 28.92, 28.32, 28.31, 24.67, 23.21, 23.10, 22…
$ Critic_Score    <int> 76, NA, 82, 80, NA, NA, 89, 58, 87, NA, NA, 91, NA, 80, 61, 80, 97, 95, NA, 77, NA, NA, NA, 9…
$ Critic_Count    <int> 51, NA, 73, 73, NA, NA, 65, 41, 80, NA, NA, 64, NA, 63, 45, 33, 50, 80, NA, 58, NA, NA, NA, 5…
$ User_Score      <fct> 8, , 8.3, 8, , , 8.5, 6.6, 8.4, , , 8.6, , 7.7, 6.3, 7.4, 8.2, 9, , 7.9, , , , 8.1, 8.7, , 7.…
$ User_Count      <int> 322, NA, 709, 192, NA, NA, 431, 129, 594, NA, NA, 464, NA, 146, 106, 52, 3994, 1588, NA, 50, …
$ Developer       <fct> "Nintendo", "", "Nintendo", "Nintendo", "", "", "Nintendo", "Nintendo", "Nintendo", "", "", "…
$ Rating          <fct> E, , E, E, , , E, E, E, , , E, , E, E, E, M, M, , E, , , , M, M, , E, , E, M, , , M, , M, M,# 결측치와 유일값 진단을 할 수 있는 diagnose함수를 사용해보니 역시 실제 데이터에서 NA가 있는 열도 결측치가 없다고 나온다
> dlookr::diagnose(videoGames)
# A tibble: 16 x 6
   variables       types   missing_count missing_percent unique_count unique_rate
   <chr>           <chr>           <int>           <dbl>        <int>       <dbl>
 1 Name            factor              0          0             11563    0.692   
 2 Platform        factor              0          0                33    0.00197 
 3 Year_of_Release factor              0          0                41    0.00245 
 4 Genre           factor              0          0                15    0.000897
 5 Publisher       factor              0          0               583    0.0349  
 6 NA_Sales        numeric             0          0               402    0.0240  
 7 EU_Sales        numeric             0          0               307    0.0184  
 8 JP_Sales        numeric             0          0               244    0.0146  
 9 Other_Sales     numeric             0          0               155    0.00927 
10 Global_Sales    numeric             2          0.0120          630    0.0377  
11 Critic_Score    integer          8582         51.3              83    0.00496 
12 Critic_Count    integer          8582         51.3             107    0.00640 
13 User_Score      factor              0          0                97    0.00580 
14 User_Count      integer          9129         54.6             889    0.0532  
15 Developer       factor              0          0              1697    0.102   
16 Rating          factor              0          0                 9    0.000538

  • NA 처리하기 : 불러올 때 NA값 지정
# 데이터 파악시 NA가 NA, " "(띄어쓰기), ""(공백)으로 표시되는 점을 확인했다
# csv 파일 read 함수에서 na.strigs를 지정해준다
> videoGames <- read.csv(file = "Video_Games_Sales_as_at_22_Dec_2016.csv",
+                        na.strings = c("", " ", NA))

# NA가 모두 반영되어있다
# 다만, User_Score는 여전히 factor로 유형을 인식하여 따로 변경해야한다
> dplyr::glimpse(videoGames)
Observations: 16,719
Variables: 16
$ Name            <fct> Wii Sports, Super Mario Bros., Mario Kart Wii, Wii Sports Resort, Pokemon Red/Pokemon Blue, T…
$ Platform        <fct> Wii, NES, Wii, Wii, GB, GB, DS, Wii, Wii, NES, DS, DS, GB, Wii, X360, Wii, PS3, PS2, SNES, DS…
$ Year_of_Release <fct> 2006, 1985, 2008, 2009, 1996, 1989, 2006, 2006, 2009, 1984, 2005, 2005, 1999, 2007, 2010, 200…
$ Genre           <fct> Sports, Platform, Racing, Sports, Role-Playing, Puzzle, Platform, Misc, Platform, Shooter, Si…
$ Publisher       <fct> Nintendo, Nintendo, Nintendo, Nintendo, Nintendo, Nintendo, Nintendo, Nintendo, Nintendo, Nin…
$ NA_Sales        <dbl> 41.36, 29.08, 15.68, 15.61, 11.27, 23.20, 11.28, 13.96, 14.44, 26.93, 9.05, 9.71, 9.00, 8.92,…
$ EU_Sales        <dbl> 28.96, 3.58, 12.76, 10.93, 8.89, 2.26, 9.14, 9.18, 6.94, 0.63, 10.95, 7.47, 6.18, 8.03, 4.89,…
$ JP_Sales        <dbl> 3.77, 6.81, 3.79, 3.28, 10.22, 4.22, 6.50, 2.93, 4.70, 0.28, 1.93, 4.13, 7.20, 3.60, 0.24, 2.…
$ Other_Sales     <dbl> 8.45, 0.77, 3.29, 2.95, 1.00, 0.58, 2.88, 2.84, 2.24, 0.47, 2.74, 1.90, 0.71, 2.15, 1.69, 1.7…
$ Global_Sales    <dbl> 82.53, 40.24, 35.52, 32.77, 31.37, 30.26, 29.80, 28.92, 28.32, 28.31, 24.67, 23.21, 23.10, 22…
$ Critic_Score    <int> 76, NA, 82, 80, NA, NA, 89, 58, 87, NA, NA, 91, NA, 80, 61, 80, 97, 95, NA, 77, NA, NA, NA, 9…
$ Critic_Count    <int> 51, NA, 73, 73, NA, NA, 65, 41, 80, NA, NA, 64, NA, 63, 45, 33, 50, 80, NA, 58, NA, NA, NA, 5…
$ User_Score      <fct> 8, NA, 8.3, 8, NA, NA, 8.5, 6.6, 8.4, NA, NA, 8.6, NA, 7.7, 6.3, 7.4, 8.2, 9, NA, 7.9, NA, NA…
$ User_Count      <int> 322, NA, 709, 192, NA, NA, 431, 129, 594, NA, NA, 464, NA, 146, 106, 52, 3994, 1588, NA, 50, …
$ Developer       <fct> "Nintendo", NA, "Nintendo", "Nintendo", NA, NA, "Nintendo", "Nintendo", "Nintendo", NA, NA, "…
$ Rating          <fct> E, NA, E, E, NA, NA, E, E, E, NA, NA, E, NA, E, E, E, M, M, NA, E, NA, NA, NA, M, M, NA, E, N…

# User_Score를 수치형으로 변경해주었다
> videoGames$User_Score <- as.integer(videoGames$User_Score)
> dplyr::glimpse(videoGames)
Observations: 16,719
Variables: 16
$ Name            <fct> Wii Sports, Super Mario Bros., Mario Kart Wii, Wii…
$ Platform        <fct> Wii, NES, Wii, Wii, GB, GB, DS, Wii, Wii, NES, DS,…
$ Year_of_Release <fct> 2006, 1985, 2008, 2009, 1996, 1989, 2006, 2006, 20…
$ Genre           <fct> Sports, Platform, Racing, Sports, Role-Playing, Pu…
$ Publisher       <fct> Nintendo, Nintendo, Nintendo, Nintendo, Nintendo, …
$ NA_Sales        <dbl> 41.36, 29.08, 15.68, 15.61, 11.27, 23.20, 11.28, 1…
$ EU_Sales        <dbl> 28.96, 3.58, 12.76, 10.93, 8.89, 2.26, 9.14, 9.18,…
$ JP_Sales        <dbl> 3.77, 6.81, 3.79, 3.28, 10.22, 4.22, 6.50, 2.93, 4…
$ Other_Sales     <dbl> 8.45, 0.77, 3.29, 2.95, 1.00, 0.58, 2.88, 2.84, 2.…
$ Global_Sales    <dbl> 82.53, 40.24, 35.52, 32.77, 31.37, 30.26, 29.80, 2…
$ Critic_Score    <int> 76, NA, 82, 80, NA, NA, 89, 58, 87, NA, NA, 91, NA…
$ Critic_Count    <int> 51, NA, 73, 73, NA, NA, 65, 41, 80, NA, NA, 64, NA…
$ User_Score      <int> 78, NA, 81, 78, NA, NA, 83, 64, 82, NA, NA, 84, NA…
$ User_Count      <int> 322, NA, 709, 192, NA, NA, 431, 129, 594, NA, NA, …
$ Developer       <fct> Nintendo, NA, Nintendo, Nintendo, NA, NA, Nintendo…
$ Rating          <fct> E, NA, E, E, NA, NA, E, E, E, NA, NA, E, NA, E, E,# 결측치 진단에도 NA가 잘 포함되어 있다
> dlookr::diagnose(videoGames)
# A tibble: 16 x 6
   variables     types  missing_count missing_percent unique_count unique_rate
   <chr>         <chr>          <int>           <dbl>        <int>       <dbl>
 1 Name          factor             2          0.0120        11563    0.692   
 2 Platform      factor             0          0                33    0.00197 
 3 Year_of_Rele… factor             0          0                41    0.00245 
 4 Genre         factor             2          0.0120           15    0.000897
 5 Publisher     factor             0          0               583    0.0349  
 6 NA_Sales      numer…             0          0               402    0.0240  
 7 EU_Sales      numer…             0          0               307    0.0184  
 8 JP_Sales      numer…             0          0               244    0.0146  
 9 Other_Sales   numer…             0          0               155    0.00927 
10 Global_Sales  numer…             2          0.0120          630    0.0377  
11 Critic_Score  integ…          8582         51.3              83    0.00496 
12 Critic_Count  integ…          8582         51.3             107    0.00640 
13 User_Score    integ…          6704         40.1              97    0.00580 
14 User_Count    integ…          9129         54.6             889    0.0532  
15 Developer     factor          6623         39.6            1697    0.102   
16 Rating        factor          6769         40.5               9    0.000538


na.strings를 추가하여 NA값을 지정해주면 되는 쉬운 방법이었습니다. 대신 이 작업이 반복(알고보니 놓친 NA 표기 방식이 있다면 또 작업해주어야 함)되지 않도록 꼼꼼히 데이터를 살펴봐야겠네요.

  다음 포스팅에서는 이어서 videoGames 데이터를 dlookr 패키지 위주로 사용하여 탐색해보도록 하겠습니다. 😺

profile
안녕하세요! 이것저것 하고 있습니다 👩‍🔧

0개의 댓글