Main Content

테이블에서 정리되지 않은 데이터와 누락된 데이터 정리하기

이 예제에서는 정리되지 않은 데이터 값과 누락된 데이터 값이 있는 테이블을 어떻게 정리하고 재구성하는지 보여줍니다. 먼저, 가져오기 툴을 사용하거나 summaryismissing 함수와 같은 함수를 사용하여 누락된 데이터를 식별할 수 있습니다. standardizeMissing, fillmissing 또는 rmmissing 함수를 사용하여 누락값을 표준화하거나 채우거나 제거할 수 있습니다. 그런 다음 테이블을 재구성하여 테이블을 추가적으로 정리할 수 있습니다. sortrowsmovevars 함수와 같은 함수를 사용하여 테이블의 행과 변수의 순서를 바꿀 수 있습니다.

파일의 데이터 검토하기

가져오기 툴을 사용하여 쉼표로 구분된 값(CSV) 샘플 파일 messy.csv의 데이터를 검토합니다. 이 툴을 사용하면 데이터를 미리 보고 데이터를 어떻게 가져올지 지정할 수 있습니다. 가져오기 툴에서 messy.csv를 검토하려면 MATLAB®에서 이 예제를 연 후 탭으로 이동하여 변수 섹션에서 데이터 가져오기를 클릭하고 파일 선택 대화 상자를 사용하여 messy.csv를 엽니다.

가져오기 툴은 messy.csv에 텍스트 및 숫자형 값이 있는 5개 열이 있음을 보여줍니다.

Import Tool, showing the five columns of text and numeric data in the messy.csv file

파일에 다음과 같은 다양한 형태의 누락된 데이터 표시자가 많이 있습니다.

  • 빈 텍스트

  • 마침표(.)

  • NA

  • NaN

  • -99

가져오기 툴은 숫자형 열의 NaN이나 텍스트 열의 빈 텍스트와 같은 일부 누락된 데이터 표시자를 자동으로 인식합니다(시각적으로 강조 표시하지는 않음).

이 툴은 열 B에 있는 빈 텍스트, 마침표, NA와 같은 다른 표시자를 강조 표시합니다. 이러한 값은 표준 누락값이 아닙니다. 그러나 숫자형 열에 숫자형이 아닌 값이 들어 있으면 이러한 값은 누락값을 나타내는 것일 수 있습니다. 데이터를 가져올 때 이러한 값도 누락값으로 처리되도록 지정할 수 있습니다.

숫자형 데이터가 양수 값으로 구성된 경우, 단일 음수 값(예: -99)을 누락된 데이터에 대한 플래그로 사용할 수도 있습니다. 특정 숫자(예: -99)가 테이블에서 누락된 데이터를 나타낸다면, 테이블을 정리할 때 이 숫자가 누락값임을 지정해야 합니다.

데이터를 테이블로 가져오기

가져오기 툴에서 데이터를 MATLAB 작업 공간으로 가져올 수 있습니다. readtable 함수를 사용하여 파일에서 데이터를 읽어 들여 테이블로 가져올 수도 있습니다.

readtable 함수를 사용하여 messy.csv의 데이터를 가져옵니다. 텍스트 데이터를 string형 배열인 테이블 변수로 읽어오려면 TextType 이름-값 인수를 사용합니다. 숫자형 열에서 지정된 숫자형이 아닌 값을 누락값으로 처리하려면 TreatAsMissing 이름-값 인수를 사용합니다. 텍스트 데이터가 있는 열 AC의 경우 readtable은 빈 텍스트를 <missing>으로 표시되는, 누락값인 string형으로 가져옵니다. 숫자형 데이터가 있는 열 B, D, E의 경우 readtable은 빈 텍스트를 NaN 값으로 가져옵니다. 또한 TreatAsMissing을 사용하여 .NA를 지정했다면 이들도 NaN 값으로 가져옵니다. 그러나 값 -99는 숫자형이므로 변경되지 않은 상태로 유지됩니다.

messyTable = readtable("messy.csv","TextType","string","TreatAsMissing",[".","NA"])
messyTable=21×5 table
      A        B          C         D       E  
    ______    ____    _________    ____    ____

    "afe1"     NaN    "yes"           3       3
    "egh3"     NaN    "no"            7       7
    "wth4"     -99    "yes"         -99     -99
    "atn2"    23.7    <missing>     NaN    23.7
    "arg1"     NaN    "yes"           5     NaN
    "jre3"    34.6    "yes"        34.6    34.6
    "wen9"     234    "yes"         234     234
    "ple2"       2    "no"            2       2
    "dbo8"       5    "no"            5       5
    "oii4"       5    "yes"           5       5
    "wnk3"     245    "yes"         245     245
    "abk6"     563    "no"          563     563
    "pnj5"     463    "no"          463     463
    "wnn3"       6    "no"            6       6
    "oks9"      23    "yes"          23      23
    "wba3"      14    "yes"          14      14
      ⋮

테이블 요약 보기

테이블의 요약을 보려면 summary 함수를 사용합니다. 요약에 각 테이블 변수에 대한 데이터형 및 기타 기술 통계량이 표시됩니다. 예를 들어, summarymessyTable의 각 숫자형 변수에서 누락값의 개수를 보여줍니다.

summary(messyTable)
Variables:

    A: 21x1 string

    B: 21x1 double

        Values:

            Min             -99   
            Median          22.5  
            Max             563   
            NumMissing      3     

    C: 21x1 string

    D: 21x1 double

        Values:

            Min             -99   
            Median          14    
            Max             563   
            NumMissing      2     

    E: 21x1 double

        Values:

            Min             -99   
            Median          21.5  
            Max             563   
            NumMissing      1     

누락값을 가지는 행 찾기

messyTable에서 누락값이 최소한 하나 있는 행을 찾으려면 ismissing 함수를 사용합니다. 데이터에 비표준 누락값(예: -99)이 있는 경우 표준 누락값과 함께 지정할 수 있습니다.

ismissing의 출력값은 messyTable에서 누락값을 갖는 요소를 식별하는 논리형 배열입니다.

missingElements = ismissing(messyTable,{string(missing),NaN,-99})
missingElements = 21x5 logical array

   0   1   0   0   0
   0   1   0   0   0
   0   1   0   1   1
   0   0   1   1   0
   0   1   0   0   1
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
      ⋮

누락값이 있는 행을 식별하는 논리형 벡터를 만들려면 any 함수를 사용합니다.

rowsWithMissingValues = any(missingElements,2)
rowsWithMissingValues = 21x1 logical array

   1
   1
   1
   1
   1
   0
   0
   0
   0
   0
      ⋮

테이블의 요소를 참조하여 누락값이 있는 행만 반환하려면 논리형 벡터 rowsWithMissingValues를 사용합니다.

missingValuesTable = messyTable(rowsWithMissingValues,:)
missingValuesTable=6×5 table
      A        B          C         D      E  
    ______    ____    _________    ___    ____

    "afe1"     NaN    "yes"          3       3
    "egh3"     NaN    "no"           7       7
    "wth4"     -99    "yes"        -99     -99
    "atn2"    23.7    <missing>    NaN    23.7
    "arg1"     NaN    "yes"          5     NaN
    "gry5"      21    "yes"        NaN      21

누락값 채우기

테이블의 누락값을 정리하는 한 가지 전략은 누락값을 더욱 유의미한 값으로 바꾸는 것입니다. 표준 누락값을 삽입하여 비표준 누락값을 대체할 수 있습니다. 그런 다음 누락값을 조정된 값으로 채울 수 있습니다. 예를 들어, 누락값을 최근접이웃이나 테이블 변수의 평균값으로 채울 수 있습니다.

이 예제에서 -99는 누락값을 나타내는 비표준 값입니다. -99인 요소를 표준 누락값으로 바꾸려면 standardizeMissing 함수를 사용합니다. 단정밀도 및 배정밀도 부동소수점 숫자형 배열에서는 NaN이 표준 누락값입니다.

messyTable = standardizeMissing(messyTable,-99)
messyTable=21×5 table
      A        B          C         D       E  
    ______    ____    _________    ____    ____

    "afe1"     NaN    "yes"           3       3
    "egh3"     NaN    "no"            7       7
    "wth4"     NaN    "yes"         NaN     NaN
    "atn2"    23.7    <missing>     NaN    23.7
    "arg1"     NaN    "yes"           5     NaN
    "jre3"    34.6    "yes"        34.6    34.6
    "wen9"     234    "yes"         234     234
    "ple2"       2    "no"            2       2
    "dbo8"       5    "no"            5       5
    "oii4"       5    "yes"           5       5
    "wnk3"     245    "yes"         245     245
    "abk6"     563    "no"          563     563
    "pnj5"     463    "no"          463     463
    "wnn3"       6    "no"            6       6
    "oks9"      23    "yes"          23      23
    "wba3"      14    "yes"          14      14
      ⋮

누락값을 채우려면 fillmissing 함수를 사용합니다. 이 함수는 누락값을 채우는 여러 방법을 제공합니다. 예를 들어, 누락값이 아닌 최근접이웃으로 누락값을 채웁니다.

filledTable = fillmissing(messyTable,"nearest")
filledTable=21×5 table
      A        B        C       D       E  
    ______    ____    _____    ____    ____

    "afe1"    23.7    "yes"       3       3
    "egh3"    23.7    "no"        7       7
    "wth4"    23.7    "yes"       7    23.7
    "atn2"    23.7    "yes"       5    23.7
    "arg1"    34.6    "yes"       5    34.6
    "jre3"    34.6    "yes"    34.6    34.6
    "wen9"     234    "yes"     234     234
    "ple2"       2    "no"        2       2
    "dbo8"       5    "no"        5       5
    "oii4"       5    "yes"       5       5
    "wnk3"     245    "yes"     245     245
    "abk6"     563    "no"      563     563
    "pnj5"     463    "no"      463     463
    "wnn3"       6    "no"        6       6
    "oks9"      23    "yes"      23      23
    "wba3"      14    "yes"      14      14
      ⋮

누락값을 가지는 행 제거하기

테이블의 누락값을 정리하는 또 다른 전략은 누락값이 있는 행을 제거하는 것입니다.

누락값이 있는 행을 제거하려면 rmmissing 함수를 사용합니다.

remainingTable = rmmissing(messyTable)
remainingTable=15×5 table
      A        B        C       D       E  
    ______    ____    _____    ____    ____

    "jre3"    34.6    "yes"    34.6    34.6
    "wen9"     234    "yes"     234     234
    "ple2"       2    "no"        2       2
    "dbo8"       5    "no"        5       5
    "oii4"       5    "yes"       5       5
    "wnk3"     245    "yes"     245     245
    "abk6"     563    "no"      563     563
    "pnj5"     463    "no"      463     463
    "wnn3"       6    "no"        6       6
    "oks9"      23    "yes"      23      23
    "wba3"      14    "yes"      14      14
    "pkn4"       2    "no"        2       2
    "adw3"      22    "no"       22      22
    "poj2"    34.6    "yes"    34.6    34.6
    "bas8"      23    "no"       23      23

테이블 행과 변수를 정렬하고 순서를 바꾸기

테이블의 누락값을 정리한 후에는 테이블을 다른 방법으로 구성할 수 있습니다. 예를 들어, 하나 이상의 변수 값을 기준으로 테이블의 행을 정렬할 수 있습니다.

첫 번째 변수 A의 값을 기준으로 행을 정렬합니다.

sortedTable = sortrows(remainingTable)
sortedTable=15×5 table
      A        B        C       D       E  
    ______    ____    _____    ____    ____

    "abk6"     563    "no"      563     563
    "adw3"      22    "no"       22      22
    "bas8"      23    "no"       23      23
    "dbo8"       5    "no"        5       5
    "jre3"    34.6    "yes"    34.6    34.6
    "oii4"       5    "yes"       5       5
    "oks9"      23    "yes"      23      23
    "pkn4"       2    "no"        2       2
    "ple2"       2    "no"        2       2
    "pnj5"     463    "no"      463     463
    "poj2"    34.6    "yes"    34.6    34.6
    "wba3"      14    "yes"      14      14
    "wen9"     234    "yes"     234     234
    "wnk3"     245    "yes"     245     245
    "wnn3"       6    "no"        6       6

행을 C를 기준으로 내림차순으로 정렬한 후 A를 기준으로 오름차순으로 정렬합니다.

sortedBy2Vars = sortrows(remainingTable,["C","A"],["descend","ascend"])
sortedBy2Vars=15×5 table
      A        B        C       D       E  
    ______    ____    _____    ____    ____

    "jre3"    34.6    "yes"    34.6    34.6
    "oii4"       5    "yes"       5       5
    "oks9"      23    "yes"      23      23
    "poj2"    34.6    "yes"    34.6    34.6
    "wba3"      14    "yes"      14      14
    "wen9"     234    "yes"     234     234
    "wnk3"     245    "yes"     245     245
    "abk6"     563    "no"      563     563
    "adw3"      22    "no"       22      22
    "bas8"      23    "no"       23      23
    "dbo8"       5    "no"        5       5
    "pkn4"       2    "no"        2       2
    "ple2"       2    "no"        2       2
    "pnj5"     463    "no"      463     463
    "wnn3"       6    "no"        6       6

C를 기준으로 정렬하면 행을 먼저 "yes"로 그룹화하고 그다음 "no"로 그룹화합니다. 그런 다음 A를 기준으로 정렬하면 행이 사전순으로 나열됩니다.

AC가 서로 옆에 오도록 테이블을 재정렬하려면 movevars 함수를 사용합니다.

sortedRowsAndMovedVars = movevars(sortedBy2Vars,"C","After","A")
sortedRowsAndMovedVars=15×5 table
      A         C       B       D       E  
    ______    _____    ____    ____    ____

    "jre3"    "yes"    34.6    34.6    34.6
    "oii4"    "yes"       5       5       5
    "oks9"    "yes"      23      23      23
    "poj2"    "yes"    34.6    34.6    34.6
    "wba3"    "yes"      14      14      14
    "wen9"    "yes"     234     234     234
    "wnk3"    "yes"     245     245     245
    "abk6"    "no"      563     563     563
    "adw3"    "no"       22      22      22
    "bas8"    "no"       23      23      23
    "dbo8"    "no"        5       5       5
    "pkn4"    "no"        2       2       2
    "ple2"    "no"        2       2       2
    "pnj5"    "no"      463     463     463
    "wnn3"    "no"        6       6       6

인덱싱을 사용하여 테이블 변수를 재정렬할 수도 있습니다. 괄호와 출력 테이블에 있는 변수의 순서를 지정하는 변수 인덱스를 사용합니다.

sortedRowsAndMovedVars = sortedBy2Vars(:,["A","C","B","D","E"])
sortedRowsAndMovedVars=15×5 table
      A         C       B       D       E  
    ______    _____    ____    ____    ____

    "jre3"    "yes"    34.6    34.6    34.6
    "oii4"    "yes"       5       5       5
    "oks9"    "yes"      23      23      23
    "poj2"    "yes"    34.6    34.6    34.6
    "wba3"    "yes"      14      14      14
    "wen9"    "yes"     234     234     234
    "wnk3"    "yes"     245     245     245
    "abk6"    "no"      563     563     563
    "adw3"    "no"       22      22      22
    "bas8"    "no"       23      23      23
    "dbo8"    "no"        5       5       5
    "pkn4"    "no"        2       2       2
    "ple2"    "no"        2       2       2
    "pnj5"    "no"      463     463     463
    "wnn3"    "no"        6       6       6

참고 항목

| | | | | | | | |

관련 항목