1 엑셀 .csv 데이터 추출

가장 많이 사용되는 직사각형 데이터 형태가 엑셀파일이다. 엑셀파일에 담긴 워크쉬트(worksheet) 데이터를 엑셀을 열지 않고 .csv 파일로 추출하는 방법을 살펴보자. 먼저 가장 많이 알려진 데이터 사이언스 대표 데이터셋을 엑셀 워크시트에 넣어 엑셀 파일을 구성해 보자.

데이터 과학 대표 데이터셋 모음

데이터 과학 대표 데이터셋 모음

2 csvkit 설치

csv 데이터를 쉘에서 CLI로 처리할 때 많이 사용되는 도구는 csvkit이다. wireservice 회사가 개발하여 github에 공개한 csvkit.csv 파일을 비롯하여 직사각형 표형태(tabular format) 데이터를 처리하는데 적합하다.

파이썬으로 개발되어 pip install csvkit 명령어로 설치한다. 이미 설치된 경우 최신 버전은 pip install --upgrade csvkit 명령어로 가능하다.

3 엑셀 워크쉬트 추출

in2csv 명령어를 사용하여 대상 엑셀 파일을 지정하고 엑셀 파일에 포함된 워크시트를 특정하기 위해서 --sheet 선택인자를 명세하여 특정 워크시트만 뽑아내서 이를 data/ 하위디렉토리 iris_ws.csv 파일명으로 저장한다. 여기서 > 리다이렉션 연산자로 엑셀 파일에서 뽑아낸 워크시트를 화면에 뿌리는 대신 파일로 저장시킨다.

sepal.length,sepal.width,petal.length,petal.width,variety
5.1,3.5,1.4,0.2,Setosa
4.9,3,1.4,0.2,Setosa
4.7,3.2,1.3,0.2,Setosa
4.6,3.1,1.5,0.2,Setosa
5,3.6,1.4,0.2,Setosa
5.4,3.9,1.7,0.4,Setosa
4.6,3.4,1.4,0.3,Setosa
5,3.4,1.5,0.2,Setosa
4.4,2.9,1.4,0.2,Setosa
엑셀 워크시트 .csv 파일 변환 후 살펴보기

엑셀 워크시트 .csv 파일 변환 후 살펴보기

4 .csv 파일 살펴보기

csvkit에 포함된 csvlook 명령어는 .csv 파일을 마크다운 포맷으로 보기 좋게 화면에 출력시킨다.

| sepal.length | sepal.width | petal.length | petal.width | variety |
| ------------ | ----------- | ------------ | ----------- | ------- |
|          5.1 |         3.5 |   2001-01-04 |         0.2 | Setosa  |
|          4.9 |         3.0 |   2001-01-04 |         0.2 | Setosa  |
|          4.7 |         3.2 |   2001-01-03 |         0.2 | Setosa  |
|          4.6 |         3.1 |   2001-01-05 |         0.2 | Setosa  |
|          5.0 |         3.6 |   2001-01-04 |         0.2 | Setosa  |
|          5.4 |         3.9 |   2001-01-07 |         0.4 | Setosa  |
|          4.6 |         3.4 |   2001-01-04 |         0.3 | Setosa  |
|          5.0 |         3.4 |   2001-01-05 |         0.2 | Setosa  |
|          4.4 |         2.9 |   2001-01-04 |         0.2 | Setosa  |

5 .csv 기술분석

csvkit에 포함된 csvstat 명령어를 통해 직사각형 데이터의 변수별 단변량 기술통계량(descriptive statistics)를 뽑아볼 수 있다. 이를 통해 자료형, 결측값을 포함한 기초 통계를 자료유형별로 뽑아볼 수 있다.

  1. "sepal.length"

    Type of data:          Number
    Contains null values:  False
    Unique values:         35
    Smallest value:        4.3
    Largest value:         7.9
    Sum:                   876.5
    Mean:                  5.843
    Median:                5.8
    StDev:                 0.828
    Most common values:    5 (10x)
                           5.1 (9x)
                           6.3 (9x)
                           5.7 (8x)
                           6.7 (8x)

  2. "sepal.width"

    Type of data:          Number
    Contains null values:  False
    Unique values:         23
    Smallest value:        2
    Largest value:         4.4
    Sum:                   458.6
    Mean:                  3.057
    Median:                3
    StDev:                 0.436
    Most common values:    3 (26x)
                           2.8 (14x)
                           3.2 (13x)
                           3.4 (12x)
                           3.1 (11x)

  3. "petal.length"

    Type of data:          Number
    Contains null values:  False
    Unique values:         43
    Smallest value:        1
    Largest value:         6.9
    Sum:                   563.7
    Mean:                  3.758
    Median:                4.35
    StDev:                 1.765
    Most common values:    1.4 (13x)
                           1.5 (13x)
                           4.5 (8x)
                           5.1 (8x)
                           1.3 (7x)

  4. "petal.width"

    Type of data:          Number
    Contains null values:  False
    Unique values:         22
    Smallest value:        0.1
    Largest value:         2.5
    Sum:                   179.9
    Mean:                  1.199
    Median:                1.3
    StDev:                 0.762
    Most common values:    0.2 (29x)
                           1.3 (13x)
                           1.5 (12x)
                           1.8 (12x)
                           1.4 (8x)

  5. "variety"

    Type of data:          Text
    Contains null values:  False
    Unique values:         3
    Longest value:         10 characters
    Most common values:    Setosa (50x)
                           Versicolor (50x)
                           Virginica (50x)

Row count: 150
.csv 파일 필터링

.csv 파일 필터링

6 행과 열 필터링

csvkit에 포함된 csvcut 명령어를 통해서 칼럼을 선택하고, csvgrep 명령어를 통해서 행을 필터링한다. grep의 특성을 갖추고 있어 정규표현식도 사용이 가능하다.

  • csvcut 명령어와 -n을 조합하여 칼럼명을 추출한다.
  • csvcut 명령어로 칼럼을 뽑아내는 방법은 두가지가 있다.
    • -c 선택옵션과 숫자를 조합하게 되면 해당 위치의 칼럼을 뽑아낼 수 있다.
    • -c 선택옵션과 "변수명" 조합하게 되면 해당 칼럼명으로 칼럼을 뽑아낼 수 있다.
  1: sepal.length
  2: sepal.width
  3: petal.length
  4: petal.width
  5: variety

칼럼 위치 숫자로 칼럼 추출

sepal.length,sepal.width,variety
5.1,3.5,Setosa
4.9,3,Setosa
4.7,3.2,Setosa
4.6,3.1,Setosa
5,3.6,Setosa
5.4,3.9,Setosa
4.6,3.4,Setosa
5,3.4,Setosa
4.4,2.9,Setosa

칼럼명으로 칼럼 추출

variety,sepal.length
Setosa,5.1
Setosa,4.9
Setosa,4.7
Setosa,4.6
Setosa,5
Setosa,5.4
Setosa,4.6
Setosa,5
Setosa,4.4

csvgrep 명령어는 -m, -r, -f 선택옵션을 지정하여 직사각형 .csv 파일에서 행을 추출할 수 있다. 칼럼을 먼저 특정하고 해당 필터링 조건을 -m 선택옵션으로 지정한 값과 매칭되는 행을 추출한다.

  • -m: 특정값과 매칭되는 행을 추출
  • -r: 정규표현식을 적용시켜 행을 추출
sepal.length,sepal.width,petal.length,petal.width,variety
5.1,3.5,1.4,0.2,Setosa
4.9,3,1.4,0.2,Setosa
4.7,3.2,1.3,0.2,Setosa
4.6,3.1,1.5,0.2,Setosa
5,3.6,1.4,0.2,Setosa
5.4,3.9,1.7,0.4,Setosa
4.6,3.4,1.4,0.3,Setosa
5,3.4,1.5,0.2,Setosa
4.4,2.9,1.4,0.2,Setosa
csv 파일 csvgrep 쪼개고, csvstack 쌓기

csv 파일 csvgrep 쪼개고, csvstack 쌓기

7 csvgrepcsvstack 합치기

iris 데이터셋은 Setosa, Versicolor, Virginica 3종으로 구성되어 있어 이를 Setosa.csv, Versicolor.csv, Virginica.csv 쪼개서 저장하고, 이를 csvstack 명령어로 쌓아서 다시 저장시킨다.

7.1 csvgrep으로 파일 쪼개기

csvgrep -c 선택옵션으로 칼럼을 선택하여 꽃 종류를 -m 선택옵션으로 지정하여 필터링한 후 각 붓꽃종별로 저장시킨다.

data/iris_Setosa.csv
data/iris_Versicolor.csv
data/iris_Virginica.csv
data/iris_all.csv
data/iris_ws.csv

7.2 csvstack으로 파일 쌓아 합치기

-g 선택옵션을 넣을 경우 쌓게 되는 파일에 그룹을 지정할 수 있고, -n 선택옵션으로 그룹을 지정하는 변수명도 지정할 수 있다.

species,sepal.length,sepal.width,petal.length,petal.width,variety
Setosa,5.1,3.5,1.4,0.2,Setosa
Setosa,4.9,3,1.4,0.2,Setosa
Setosa,4.7,3.2,1.3,0.2,Setosa
Setosa,4.6,3.1,1.5,0.2,Setosa
Setosa,5,3.6,1.4,0.2,Setosa
Setosa,5.4,3.9,1.7,0.4,Setosa
Setosa,4.6,3.4,1.4,0.3,Setosa
Setosa,5,3.4,1.5,0.2,Setosa
Setosa,4.4,2.9,1.4,0.2,Setosa

csvstack 을 파이프 연산자로 체인으로 이뤄 출력결과값을 파일에 저장시킨다.

csvgrepcsvstack 명령어로 쪼개고 합친 결과를 R에서 불러와서 확인해보자.