파이썬과 엑셀의 차이를 실험해보았습니다.
PM이라면 데이터 분석에 꽤 많은 시간을 쏟으실 거예요. 어떻게 하면 분석 업무를 조금 더 효율적으로 할 수 있는지 알아보다, SQL과 파이썬을 배워야 한다는 사실까지 접하셨겠죠? 오늘은 파이썬이 PM의 빠른 업무에 도움이 되는 이유를, 제가 실무에서 수행했던 데이터 업무로 예를 들어 엑셀과 1:1로 비교해볼게요.
이 글을 쓰게 된 계기는 지난 1월에 작성한 "기획자도 파이썬을 배워야 하나요?"라는 글에 달린 댓글입니다.
공감 가는 댓글이었습니다. 저 역시 지금 당장 쓸 수 있는 툴 중에서 엑셀을 가장 빠르게 쓸 수 있으니까요.
새로운 걸 배우는 데는 시간이 오래 걸리죠. 파이썬을 실무에 얼마나 써먹을 수 있을지도 미지수고요. 그래서 제가 대신 정리했습니다. 파이썬이 엑셀에 비해 구체적으로 얼마나 더 효율적 일지 말이에요.
엑셀과 파이썬을 비교하기 위해, 지난주에 엑셀로 분석한 결과를 똑같이 만들 수 있는 파이썬 코드를 작성했습니다. 정리하자면, 파이썬 코드를 짜는 데 익숙해지면 복잡한 데이터 분석도 1/3 수준으로 간소화할 수 있습니다. 분석 과정에 쓰인 아이템은 다음과 같습니다.
- 엑셀: 두 개의 피벗 테이블, 7개의 함수, 4개의 탭 (원본, 피벗 1, 피벗 2, 분석)
- 파이썬: 코드 4줄 (4개의 함수, 탭 없음)
그럼 이제 엑셀과 파이썬을 차이를 실제 사례와 함께 더 자세하게 알아볼까요?
2-1. 지난주에 정리한 데이터는...
지난주에 저는 새로운 서비스를 기획하면서, B tv VOD 중 음원을 인식한 콘텐츠 데이터를 정리했습니다. 데이터를 정리하기 전에 스스로에게 던진 목표는 이러합니다.
"1) 한 콘텐츠 당 평균 앨범 수, 2) 콘텐츠 당 평균 음원 수, 3) 평균 앨범 당 음원 수를 알고 싶어.
그런데 장르 별로도 구분해서 봐야 해. 장르 별로 인식되는 음원의 성격이 다르거든.
단, 가장 먼저 콘텐츠 별로 데이터를 정리해야 해.
장르 별로 평균을 <전체 음원 개수> 나누기 <전체 콘텐츠 개수>로 계산하면 안 돼.
<Unique 음원 개수> 나누기 <Unique 콘텐츠 개수>도 안 돼.
서로 다른 콘텐츠에 같은 배경음악이 쓰이기도 하잖아."
목표를 정리한 후, 데이터 추출이 필요한 테이블과 필드, 조건을 찾았습니다. 콘텐츠 DB에서 음원 정보가 한 건 이상 있는 콘텐츠와 해당 콘텐츠에 있는 모든 음원 정보를 csv 파일로 받은 후, 엑셀에서 다음과 같이 네 단계의 분석 과정을 거쳤습니다.
엑셀의 피벗 테이블 기능도 쓸만하지만, 몇 가지 한계가 있습니다.
먼저, unique 값을 바로 집계할 수 없습니다. 엑셀 2013 이상에서는 피벗 테이블 생성 시 체크 박스 선택을 통해 가능하지만, 그 외의 버전에서는 별도의 수식을 써야 합니다. 저는 엑셀에서 피벗 테이블을 두 번 사용하는 방식으로 앨범과 음원의 unique 개수를 집계했습니다.
둘째, 피벗 테이블을 선택하여 또 다른 피벗 테이블로 만들 수 없습니다. 피벗 테이블을 다시 피벗하기 위해서는 다른 곳에 일반 테이블로 복사 & 붙여넣기를 한 후에 가능합니다. 따라서 분석이 복잡할수록 탭이 많아집니다. 각 탭이 어떤 과정을 수행하기 위해 생성되었는지 헷갈리기 시작합니다. 분석이 틀렸다는 사실을 깨달아도 어떤 탭으로 되돌아갈지 찾는 데 시간이 오래 걸립니다.
엑셀로 정리한 결과를 똑같이 만드는 파이썬 코드를 짰고, 이제 각각의 프로세스를 비교해보겠습니다.
엑셀의 분석 과정 4가지를 두 개씩 잘라서 볼게요.
먼저, 엑셀에서는 음원 앨범과 음원 id의 unique count를 집계하기 위해 두 번의 피벗을 돌렸습니다. 같은 데이터를 추출하기 위해 파이썬으로는 pandas의 pivot_table 함수를 한 번 사용했습니다.
집계 기준이 unique count이기 위해서 "aggfunc = pd.Series.nunique"를 적었고, 피벗 테이블에 추가 작업을 하기 위해 일반 테이블 (DataFrame) 형태로 변환하기 위해 마지막 줄의 코드를 작성했습니다. 구글에서 검색하면 한국어로도 정보가 잘 나옵니다.
두 번째 분석 과정입니다. 엑셀부터 볼게요.
피벗 테이블에 '앨범 당 음원' 열을 추가하기 위해 탭을 하나 더 만들어 복사했습니다. 그 후, D 열의 값을 C열의 값으로 나누어 E 열에 추가했습니다. 그 후 장르 별 1) 평균 앨범 수, 2) 평균 음원 수, 3) 평균 앨범 당 음원 수를 알기 위해 averageif 함수를 (물론 복붙이지만) 6번 사용했습니다.
파이썬으로는 단 두 줄의 코드로 같은 데이터를 얻을 수 있습니다. 게다가 기초 파이썬만 배워도 알 수 있는 쉬운 코드입니다.
같은 결과를 만들기 위해 엑셀과 파이썬에 사용된 아이템입니다.
- 엑셀: 두 개의 피벗 테이블, 4개의 탭 (원본, 피벗 1, 피벗 2, 분석), 7개의 함수
- 파이썬: 한 개의 피벗 테이블, 탭 없음, 4개의 함수
사실 파이썬 기초 문법은 알더라도, 막상 업무에 적용하려면 코드 작성이 너무 오래 걸리죠. 다른 업무도 있는데 파이썬만 잡고 있을 수도 없고요. 저는 요즘 DataCamp로 SQL과 Python 공부를 하고 있는데, 주말에 공부하면서 자주 분석하는 데이터 정리 코드를 짜 놓으려고 합니다. 그러면 주중에 데이터 분석이 급하게 필요할 때 필요한 코드를 복사해서 쓸 수 있겠죠?
이번에 느낀 파이썬의 또 다른 장점 두 가지를 말씀드리고, 저는 이만 물러나겠습니다. :) 긴 글 읽어주셔서 감사합니다. 요새 데이터에 꽂혀서 글 주제가 데이터에 쏠려있는데, 조만간 다른 주제로도 찾아뵐게요.
1. 무시할 수 없는 로딩 시간
이번에 본 데이터는 40만 개가 넘는 행으로 구성되었습니다. 엑셀에서 데이터를 돌릴 때 로딩이 꽤 오래 걸렸습니다. 엑셀을 열 때 로딩, 피벗할 때 로딩, vlookup 해서 다른 테이블을 합칠 때도 로딩이 걸렸어요. 반면, 파이썬에서는 로딩에 소요된 시간은 다 합쳐서 몇 초 되지 않습니다.
2. 테이블 합치는 속도가 빠름
엑셀 vlookup 기능을 이번에 파이썬으로 처음 수행했습니다. 엑셀에서 vlookup 함수 사용 시 데이터가 많으면 로딩 시간도 오래 걸리고, 한 번에 한 열만 추가할 수 있죠. 파이썬에서는 두 테이블의 모든 테이블을 한 번에 합칠 수 있는 데다 로딩 시간도 거의 없습니다.
<pandas merge 기능 관련 기록>
- pandas의 merge 사용 시, 두 테이블의 key가 되는 열 이름만 같아도 바로 합칠 수 있음
- merge 사용 시 조심할 것 : 결합하는 두 테이블에 key value가 2개 이상씩 있으면 중복 값이 발생함
- merge 전에 key value 기준으로 중복을 제거(drop_duplicate)해주거나, 결합 후에 중복을 제거해야 함