엑셀과 파이썬으로 데이터셋 처리 비교하기
우리가 보는 데이터는 대부분 저렇게 생겼습니다.
그리고 항상 헷갈리죠. 파이썬을 좀 배웠긴 했는데, 엑셀로 그냥 할까? 파이썬으로 할까?
이런 분들을 위해서 오늘 몇 가지 실험을 해보고자 합니다.
우리는 위 자료를 가지고 기초통계량, 교차분석, 상관분석, 평균비교를 하고 싶습니다.
자, 백마디 말보다 한 번 바로 시작해볼까요?
1. a,b,c에 대한 기초통계량
기초통계량이란, 평균, 표준편차, 최대값, 최소값, 중위값, 왜도, 첨도 등 그 데이터의 특성을 알 수 있는 기초 값을 의미합니다.
엑셀의 경우
평균, 표준편차, 중위값, 최대, 최솟값을 구하는 함수가 각각 있습니다. 대부분 외우고 있지만, 생각나지 않는 경우에는 구글에 물어보면 금방 함수명을 알아낼 수 있습니다.
파이썬 판다스의 경우
파이썬은 이런 작업에 최적화된 판다스(pandas) 패키지를 이용합니다. 주로 데이터프레임 형태로 불러와서 작업합니다.
import pandas as pd
df = pd.read_csv(r'파일이 있는 풀 경로',encoding='cp949')
print(df.describe())
위와 같이 세 줄 입력해주면 아래와 같은 경로를 얻을 수 있습니다. 파일 경로 앞에 r 붙이는 거 잊지 마세요.
일단 파이썬은 한 줄로 해결됐네요. 여기서는 median이 없으므로 median을 구하고 싶다면, df.median()을 해주시면 중위값도 구할 수 있습니다.
물론 파이썬을 깔고, 설치하고, pandas를 설치해서 데이터를 가져오기까지는 나름대로 많은 공이 듭니다. 사실 저는 여전히 매일 판다스를 이용하고 있지만, 정말 수천번도 넘는 오류를 경험해보았기 때문에 지금도 약간 겁이 납니다.
데이터 처리를 위해서라면 데이터프레임형태로 불러오는 것이 오류를 줄이는 것을 알고 있어서 그렇게 합니다. 확실히 오류가 줄고, 나중에는 효율이 올라갑니다. 데이터양이 늘어날수록 효율은 올라갑니다.
2. 교차표 구하기
데이터를 다뤄보신 분이라면 알겠지만, 우리는 교차표를 구할 일이 꽤 많습니다. 예를 들어 이 표에 따르면 연도와 유형(type)의 교차를 구하는 겁니다. 어느 해에 어떤 모델이 많이 팔렸는지 검증하는 거죠. 엑셀로 하면 다음과 같이 피벗테이블을 만들면 됩니다.
엑셀의 경우
엄청나게 진일보한 기능이죠.
파이썬 판다스의 경우
판다스를 이용할 경우 crosstab매서드를 이용하면 됩니다. 물론 이런 메서드를 어떻게 다 익히느냐, 사용법이 쉽지는 않습니다. 그러나 일단 사용법을 익히고 나면 한 줄이면 됩니다.
여러분이 타이핑 하셔야 할 것은
print(pd.crosstab(df['year'],df['type])
정도입니다.
서식이 아쉬우다고요? 모든 서식을 파이썬으로 구현하는 것도 가능하지만, 그래도 서식만큼은 엑셀로 작업하고 싶다면, to_clipboard() 매서드를 써서 클립보드로 붙여넣기하면 됩니다.
다음과 같이 입력하면, 클립보드에 결과값이 저장됩니다.
pd.crosstab(df['year'], df['type']).to_clipboard()
아래 명령어가 실행되고 나면, 엑셀을 열어서 다음과 같이 Ctrl-V를 한번 눌러주시면, 크로스테이블의 결과물이 엑셀에 착 달라붙습니다. 여기서부터는 엑셀에서 작업해도 되겠죠?
3. 상관분석
대단한 분석은 아니지만, 그래도 데이터를 다루는 사람들에게 상관분석은 꽃이라고 할 수 있겠죠?
엑셀의 경우
엑셀에서 상관분석을 할 때는 correl함수를 써줍니다. 두개의 array 배열을 나란이 입력해주면 잘 입력됩니다.
파이썬 판다스의 경우
파이썬 판다스의 경우 여러분이 타이핑해야 할 명령어는 다음과 같습니다. 끝입니다.
print(df.corr())
이거 실화인가요?
한 줄입니다. 게다가 명령어는 네 글자입니다. df.corr()만 치면 a, b, c 각 변수가 다른 변수들과 어떻게 상관관계를 가지는지 나옵니다.
물론 여기까지 도달하기 위해서 여러분은 파이썬을 설치하고, 판다스를 임포트하고, 엑셀에 데이터를 넣고, 그 데이터를 불러오는 방법을 익혀야 합니다. 이건 좀 번거로운 일이긴 하죠. 그러나 번거러운 일 몇 단계를 거치면, 여러분의 업무속도는 더 빨라집니다.
4. 평균비교: 독립표본 t검정
두 개의 서로 다른 표본에서 t검정을 수행하는 경우를 예로 들어보겠습니다(양측검정, 등분산 가정). 물론 두 프로그램은 서로 다른 특성이 있습니다. b와 c의 평균 차이에 대한 t검정을 실시하고 싶은 경우, 엑셀과 파이썬을 어떻게 작동해야 하는지 한번 살펴봅니다.
엑셀을 사용
엑셀의 경우에는 친절하게 무슨 값을 넣을지 프로그램이 물어봐줍니다. 그래서 통계용어를 잘 모른다면 조금은 애매할 수도 있겠습니다.
엑셀은 다음과 같이 t.test함수를 입력하고, 두 개의 array(배열)을 입력한 후 각각의 조건을 입력합니다. 현재 등분산 조건으로 양측검정으로 유의확률을 구했습니다. 결과값은 0.53이 나오는군요. p가 0.05보다는 크기 때문에 통계적으로 유의하다고 보기는 조금 애매한 값인 것 같습니다.
파이썬의 경우: 싸이파이 이용(모르면 구글에 바로 물어본다)
파이썬에서 통계를 활용하는 방법은 여러가지가 있습니다만, 통계를 사용할 때는 scipy(싸이파이)를 주로 사용합니다. 여기에서 t.test를 할 수 있는 stats 매서드를 입력해줍니다. 이 명령어들을 저도 모두 외우고 다니는 것이 아닙니다. 그냥 필요할 때마다 구글에 검색하면 바로 나옵니다.
같은 값 0.053이 나왔네요. 이 경우 파이썬이 조금은 더 불친절합니다. 기본 stats.ttest_ind(array1, array2)를 실행하면, 독립표본 t검정을 실시합니다. 이 때 기본값이 양측검정이며, 등분산 가정이 되어 있는 것 같습니다.
엑셀에서 얻은 값(0.053)이 나왔네요. 참고로 이건 95% 유의수준에서 귀무가설을 아슬아슬하게 기각시키지 못해, 여하간 둘의 평균차이는 의미있다고 보기 어려운 수준입니다(짐작컨대, 표본 수가 작아서 그럴 겁니다. t검정의 경우 표본수 30은 넘어야 의미 있는 비교가 가능하다는 것이 중론입니다).
결론
데이터 처리를 위해서 엑셀과 파이썬 중 어떤 프레임이 더 나은지 한 번 비교해봤습니다. 이건 제 업무이자, 거의 일상으로 매일 하는 일입니다. 그러나 누군가에게는 판다스의 새로운 명령어를 떠듬떠듬 배우는 것보다 익숙한 엑셀의 클릭질과 마우스질로 빠르게 계산해버리는 것이 빠를 수 있습니다.
주판에서 계산기, 계산기에서 엑셀로 바뀌었을 때 일의 생산량은 엄청나게 늘어났을 것이라고 생각합니다. 저는 가끔 머리 속으로 두자리수 곱셈을 해보곤 하는데, 요즘 하도 계산을 안해서 그런지 혼자 버벅댈 때가 많습니다. 그러나 많은 양의 계산을 수행할 때는 파이썬을 사용하여 남들보다 빨리 해낼 자신 있습니다. 왜냐하면 데이터량이 늘어날수록 엑셀에서 드래그, 단축키, 클릭질 하는 속도보다 스크립트로 처리하는 대량 처리의 속도를 따라가지 못하기 때문이죠.
데이터량이 늘어날수록 파이썬으로 데이터를 다루는 것에 비해서 가지게 되는 단점이 있습니다. 그것은 손으로 명령어를 입력하거나 클릭질을 하는 과정에서 실수가 빈번하다는 것입니다. 물론 이와 같은 문제가 파이썬에도 없는 것은 아닙니다. 그러나 기계는 잘못된 명령어에 반응하지 않기 때문에 파이썬으로 할 경우 우리는 명령어를 정확하게 입력하여, 우리가 원하는 결과값을 얻어내고야 맙니다. 하지만, 클릭을 하거나 드래그를 하다가 한 줄이 드래그 안된다거나 하는 실수는 엑셀에서 흔한 일이죠. 이럴 때는 기계로 대량처리하는 것이 훨씬 믿음직 스럽니다.
제 책을 보시고, 어떤 분들은 "그걸 판다스로 하느니 엑셀로 하는 겟 낫다"고 말씀하시는 분들을 가끔 봅니다. 그러나 숙달되면 숙달될수록 스크립트 기반의 명령어와 익숙해지는 것이 정확도와 처리속도를 높이는데 도움이 된다는 결론은 변하지 않는 것 같습니다.
물론 엑셀 역시 훌륭한 기능을 겸비한 계산기이자, 서식기입니다. 둘의 장점을 잘 살려서 업무 특성에 맞게 사용하시면 될 것 같습니다. 이 때 내가 큰 데이터를 다뤄야 하는지, 작은 데이터를 다뤄야 하는지, 엑셀로 데이터를 다루다가 잦은 실수나 오류가 생겨 곤혹스럽진 않은지 생각해보시고 파이썬 판다스 이용을 생각해보시면 좋을 것 같습니다.