안녕하세요. 미국에서 패션 인더스트리 데이터 사이언티스트로 일하고 있는 루나입니다. 석사를 할 때까지만 해도 대부분 Pandas 데이터 프레임을 썼었고, 데이터 사이언티스트로 일을 하면서는 작은 데이터는 Pandas 데이터 프레임을 쓰기도 하지만 확실히 데이터가 커지면 커질 수록 Pyspark 데이터 프레임을 쓰게 됩니다.
오늘은 이 두 데이터 프레임의 개념적 차이와 그리고 사용법에 대해 알아보겠습니다.
1. 언어, 환경, 처리속도
Pandas는 데이터 분석에 자주 쓰이는 파이썬 라이브러리이며 단일 머신에서 작동합니다. 그렇기 때문에 컴퓨터 메모리에 맞는 데이터만 이용할 수 있으며 그렇지 않을 경우 out of memory 에러가 납니다. 반면에 Pyspark는 Spark를 기본으로 하며, 대규모 데이터를 처리 분석하는 데 주로 이용됩니다. Pyspark는 클러스터 컴퓨팅을 사용하기 때문에 대규모 분산처리가 가능합니다. 작은 규모의 데이터는 판다스가 처리 속도가 더 빠를 수 있지만, 데이터 사이즈가 커질 수록 파이스파크를 쓰는 것이 더 빠른 처리속도를 가져올 수 있습니다.
2. Pandas를 추천하는 경우 vs. Pyspark를 추천하는 경우
- Pandas: 작은 규모의 데이터 셋 (수십만행, 몇백 MB 정도), 실시간으로 데이터를 탐색하고 시각화 해야할 때
- Pyspark: 대용량 데이터 처리 (GB, TB 정도) , 높은 계산이 요구되는 복잡한 분석, 대규모 데이터의 머신러닝 모델 학습
3. 사용법
3-1. 데이터 읽기 Load Data
- 판다스는 파이썬에 기본적으로 따라와서 따로 설치할 필요가 없지만 파이스파크는 처음 쓰신다면 !pip install pyspark 코드를 이용해서 설치해주세요.
3-2. 데이터 프레임의 structure 및 non-null count 확인
pandas에서는 verbose = True하면 카운트까지 다 나오는데 printSchema()는 그런 기능은 없는 것 같습니다. 그래서 printSchema()로 data type을 뽑아냈고, non-null count는 count를 이용해서 따로 뽑았습니다. 혹시 한 번에 할 수 있는 방법 아시는 분 있으면 알려주세요.
3-3. Unique Value Count 각 열에서 유니크한 값의 카운트
겹치는 customer_id가 없다는 건 repeated customer가 없다는 얘기고 그래서 재미있는 분석을 많이 못 할 수도 있는 데이터로 보입니다. 이쪽 분야에서 데이터 분석을 하시게 되면 주로 다시 오는 고객들의 행동/구매 패턴을 분석하는 경우가 많아요.
3-4. 가장 잘 팔리는 카테고리 , Groupby
Pandas랑 Pyspark 둘 다 groupby와 agg을 쓰는 것을 확인할 수 있습니다. 다만 파이스파크 쓰실 때는 groupBy에 B가 대문자라는 점 유의해주세요. pyspark.sql에서 functions를 import한 걸 보실 수 있는데요. 이 functions에는 여기에 쓰인 count, sum 뿐만 아니라 min, max, avg, stddev 등 여러 함수를 쓸 수 있게 도와줍니다.
3-5. 기존에 있는 열들을 가지고 새로운 열 만들어보기
캐글에서 가져온 데이터가 이스탄불 currency인지라 정말 알 수 없는 revenue가 나왔어요. 그래서 저희가 알기 쉽게 달러로 바꿔보겠습니다.
판다스에서는 ['col_name']을 이용해서 새로운 열을 만들 수 있는 데 반면 파이스파크에서는 .withColumn을 써서 새로운 열을 만들 수 있습니다.
이렇게 보니 Clothing 카테고리가 가장 잘 팔리네요. 이제 이 카테고리가 전체의 몇 %를 차지하는 지 확인해볼까요?
위에 보여드렸듯이 판다스를 쓰는 것과, 파이스파크를 쓰는 것이 조금 사용법은 다르지만 똑같은 결과를 낼 수 있습니다. 본인이 분석하는 데이터 규모에 맞는 것을 선택해서 쓰시면 됩니다.
데이터셋 출처: https://www.kaggle.com/datasets/mehmettahiraslan/customer-shopping-dataset/
예제에 사용 된 코드: https://colab.research.google.com/drive/1bIH2Yd2GIU_likCcthiqB6F5cNQWsw31?usp=sharing