brunch

You can make anything
by writing

C.S.Lewis

by 지은 x NULL Oct 09. 2018

[R] 어느 날, 엑셀의 한계에 봉착했을 때

의식의 흐름대로 쓰는 - 왜 R인가? MS Excel로는 안 될까?(2)

계산이 어디서 잘못된 걸까?


※ 이전글 : https://brunch.co.kr/@llun/18




받은 CSV파일의 줄수(line數, 데이터의 수량)가 수백만 건이고, 전해 듣기로는 각 항목별 빈도의 총합은 억 단위였다.

그런데 =SUM(B:B)의 값은 왜 4,000만밖에 안 되지?


데이터를 처음부터 다시 훑어보다가 가장 마지막줄에 다다랐다.


RAW 데이터가 300만 건은 족히 넘는다고 했는데 마지막 줄번호가 1048576. 끊어 읽으면 104만8,576이다.

10만도 100만도 아니고 이상한(?) 숫자인데 왠지 낯설지가 않다. 아니나 다를까 2의 10제곱은 1024이고, 1024 곱하기 1024가 바로 이 숫자다. (=2^20)

의심을 거두자


이 사태에 대해 구글에 물어보자. (https://www.google.co.kr/search?q=%EC%97%91%EC%85%80+%ED%96%89+%ED%95%9C%EA%B3%84)

검색결과 중엔 이런 내용도 있다.

"말씀해 주신 Excel 2003 형식의 경우에는 65536 행까지만 지원이 가능한 형식입니다. 그 이상의 행을 읽어 들이기 위해선 Excel 2007 ~ 2010 형식으로 파일을 만들어 주셔야 합니다. (1048576행까지 사용 가능)"
- 출처 : MS Office 커뮤니티 답변 中


65536행이 아닌 게 다행이다..만, 데이터를 다 읽어올 수가 없다. 300만이니까 파일을 세 번에 나눠서 열면 되나? 그 전에 데이터 자체가 누락된 건 아닌지 의심했지만 텍스트 에디터에서는 전체가 다 잘 보인다. 대략 100만 줄까지 드래그로 선택해서 복사, 엑셀에 붙여넣기하고 이전 글에서 걸었던 수식을 다시 옮겨 적은 다음에 두 번째 파일의 맨 윗줄에 첫 번째 파일의 마지막줄 누적합을 꼼꼼하게 옮겨적으면? 세 파일의 =SUM(B:B) 값을 이면지에 적어뒀다가 윈도우 계산기에서 다 더하면 끝.이 아니라 그 최종 결과를 C1 셀에 다시 세 번 각각 옮겨적어야 각 비율과 누적비율이 올바르게 계산될 것이다.


데이터는 아직 보지도 못했다.

단순히 누계와 비율을 계산하는 '산수'만 이만큼이 걸렸는데 위에 적은 작업 중에 1000000 줄까지 복사했다가 다음은 1000001 줄에서 시작해야 하는데 다시 1000000번째 줄부터 복사했다든지 하는, 매우 소소한 실수를 하게 되면 그 산수는 무조건 틀린다.


방법을 찾아야했다. 가장 먼저 떠오른 건 데이터베이스(DB)인 MS Access, MS-SQL, MySQL, MongoDB, 기타 등등. 하지만 데이터를 '보자'고(이때만 해도 단순히 집계하는 수준의 요구사항만 있었으므로) DB를 구축한다는 게 쉬운 일은 아니었다.

사실 프로그래머가 아닌 대다수의 '회사원'들이라면 크게 고민할 일도 아닌 것이, 파일을 세 개로 나눠서 세 번 반복하면 된다. 번거롭긴 해도 어려운 일은 아니지 않은가. DB를 만드는 것은 어려운 정도가 아니라 할 수 없는 일이다.


이런저런 고민을 하던 차에 일은 일대로 진행*해야 하니까, 적당히 100만 건 미만은 버리기로 하고 $C$1에 들어가야 할 문젯거리인 총합은 =SUM()을 세 번해서 더하는 것이 아닌, RAW 데이터를 통해 받은 억대의 숫자를 그대로 쓰기로 했다. (a.k.a 하드코딩)

*여기서 한가지 중요한 포인트는 이러한 '(본인에게만)큰' 문제에 직면했을 때 당장 데이터베이스를 공부하는 열정이 필요한 게 아니라는 점이다-회사원의 덕목이라고 내맘대로 붙여본다-. 간혹 업무 경험이 적은 사원**들 특히 엔지니어라면 문제의 수준과 상관없이 어마어마한(?) 기술을 끌어들이는 모습을 볼 수 있는데, 가령 이정도 문제에서 갑자기 파이썬으로 코딩을 한다면서 라이브러리 import부터 시작한다든지 하는, 문제의 해결과는 동떨어진 일을 하고 있는 경우도 왕왕 있다. 과업 즉, 문제를 다시 한번 짚고 넘어가면, 상위 x%의 데이터가 어디까지인가, 그리고 그 내용들은 무엇이 있는가를 알아보려고 했던 것이다. 코딩이 수단이 될 수는 있을지언정 문제 해결의 본질과는 상관없는 일이라는 얘기다.

**신입사원들의 모습이라고 했지만 사실 내 얘기이기도 하다. 당장 해결 못하는 문제를 맞닥뜨렸을 때 다른 지식에 대한 탐구와 구글링은 언제나 즐겁다. 마치 시험 기간에 책상 정리로 시간가는 줄 모를 때처럼.


분모가 되는 총합계를 바꾸기 전(左)과 후(右)

E열의 누적비율이 100(%)에서 제대로 된 숫자로 바뀐 것을 확인했다. C열도 바뀌었다. 100만 건만 잘라서 보기로 했지만 300만 줄을 그대로 쓰더라도 실수만 없다면 마지막 파일의 마지막 줄 E열에는 '100'으로 딱 맞아 떨어질 것이다.


뭔가 엑셀로도 충분한 것 같다...?

하지만 수식이 여러 개 걸린 100만 건 × 3~4개의 파일을 열었다 닫았다 하다 보면 그런 생각이 싹 가시게 된다. 게다가 회사의 업무용 시스템이라면 파일 암호화 프로그램이 적용되기도 하고 그밖에 각종 업무용/보안 프로그램들이 상주하는 PC에서 100만 줄을 꽉꽉 채운 엑셀 파일을 열어봤다면 독자 여러분이라도 이내 다른 방법이 없을까 고민해봤을 것이라고 믿어 의심치 않는다.


원하던 값은 대략 구했다. 상위 50%(절반)를 확인하려던 것이었으니까 100만까지도 아니고 20만 번에서 끝났다. 시간도 그리 오래 걸리지 않았다.


문제 해결! (데이터의 내용은 천천히 보자..)

.

.

.

인 줄 알았겠지만 데이터라는 것이 매 월단위로, 보통 주단위로, 빠르면 일단위로 업데이트되고 있었다.


이걸 매일마다 이렇게 해야하나?




*다음 글 예고 : 데이터 하면 R이라는 게 유명하다던데?

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari