외부 파일(엑셀, 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, " "(띄어쓰기), ""(공백)으로 표시되는 점을 확인했다
# 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
패키지 위주로 사용하여 탐색해보도록 하겠습니다. 😺