brunch

You can make anything
by writing

C.S.Lewis

by Jin Young Kim Oct 31. 2023

GPT 분석 시나리오: 데이터 정제 및 탐색적 분석

GPT4+Code Interpreter를 사용한 레고 데이터 분석 (1)

필자가 데이터 분석을 시작한 이래로 데이터 분석은 언제나 필자가 세상을 이해하는 창구 역할을 했다. 주어진 데이터를 이모 저모 뜯어 보며 숨겨진 패턴과 인사이트를 찾는 일은 직업이라기에는 너무나 흥미로운 일이다. 또한 관심을 갖는 주제에 대한 분석은 그 깊이와 완성도가 다르다고 느낀다. 그래서 ‘헬로데이터과학'에서는 스스로 관심 있는 주제의 주변 데이터로 분석을 시작하는 것을 강조하기도 했다.


생성형 AI라는 새로운 분석 도구가 나왔을때, 그 당시 관심이 가는 데이터셋을 찾기 시작했던 것은 그래서 어찌보면 너무 당연한 일이었다. 최근 들어 지친 심신을 달래기 위해 레고를 조립하곤 했던 상황이라 레고에 관련된 데이터를 구해서 보기 시작했다. 다행히 레고 커뮤니티에서 준비한 다양한 데이터셋을 찾을 수 있었다. 이제 레고에 대한 여러분의 (혹은 필자의?) 궁금증을 GPT와 함께 풀어보도록 하자. 


데이터 로딩하기

데이터 사이언스 업계에서 일을 하다 보면 주어진 데이터를 요모조모 뜯어보면서 준비하는 것이 얼마나 중요한지 이해할 것이다. 데이터를 직접 모은게 아니라면 주어진 데이터의 각 컬럼이 어떤 의미를 가지는지, 데이터의 누락이나 오류는 없는지, 데이터 각 컬럼의 값의 분포가 예상에 부합하는지 등을 확인하는 것은 본격적인 분석을 시작하기 전에 꼭 거쳐야 하는 단계이기 때문이다. 


오늘 사용할 데이터는 레고 세트의 발매 년도 및 테마, 그리고 가격 정보를 담은 엑셀 파일로서, 여기서 다운로드 할 수 있다. 레고 세트에 대한 정가, 그리고 발매가 중지된 세트의 경우 현재 중고가도 알 수 있다. 다음은 데이터를 엑셀에 로딩해서 컬럼 명과 첫 몇 행의 값을 출력한 것이다. 


레고 세트별 가격 데이터의 컬럼 목록과 샘플 데이터


이 데이터를 GPT4의 Code Interpreter에 업로드하면 다음과 같은 결과를 볼 수 있다. 데이터를 불러오고 결측치 여부도 확인해주는 것을 알 수 있다.

프롬프트: 데이터를 불러오고 스키마를 요약해 주세요.
GPT 입력 프롬프트와 출력 결과물 (이하 생략)                             

결측치 여부를 좀더 세부적으로 알아보자. 또한 데이터의 분포를 좀더 잘 이해하기 위해 각 컬럼의 고유한 값의 개수를 알아보는 것이 도움이 된다. 아래 결과에서는 이 데이터에 8400개의 세트가 존재하는 것을 알 수 있는데, 총 row수가 61만개가 넘으니 중복되는 row가 많음을 알 수 있다. 

각 열에 대한 결측 데이터의 비율과 고유한 값의 개수를 출력해 주세요.


데이터 준비하기

지금까지 데이터를 가볍게 살펴보며 다음 이슈를 발견했다. 1) 데이터의 한 세트가 여러 행에 중복되어 나오는 경우가 있다. (샘플 데이터의 Jazz Club 이 여러 row가 발견) 세트 단위로 분석을 하기 전에 이를 제거해야 한다. 2) 가격 정보가 누락된 경우가 종종 있다. (가격 분석을 위해서 필수적인) 누락의 현황과 원인을 확인해야 한다.

데이터 클리닝을 진행해 주세요.
- 모든 열의 값이 동일한 중복 행을 제거합니다.
- 1980년 이전의 행을 제거하고, 제거된 행의 비율을 출력합니다.
- 'minifigs', 'ownedBy', 'wantedBy', 'instructionsCount', 'minAge', 'maxAge' 열을 제거합니다.
- 결과를 나중에 사용할 수 있도록 CSV 파일로 저장합니다.

기본적인 데이터 클리닝을 했지만 가격 정보가 누락된 부분이 마음에 걸린다. 결측치 제거는 데이터에 편향을 야기할 수 있기 때문에 신중해야 한다. 아래 결과를 보면 대부분의 가격 정보 누락은 2005년 이전에 발생한다. 여기서는 2000년 이후의 세트만을 분석하는 것이 최선이다. 

가격 정보가 누락된 이유를 조사해 주세요. 
가격 정보가 없는 모든 행을 제거하면 결과 데이터에 편향이 발생하는지 확인해 주세요.


데이터 탐색하기

이제 본격적으로 데이터를 탐색해보자. 탐색의 기본은 개별 컬럼의 분포를 살피는 것이다. 이에 더하여 레고 세트의 카테고리인 테마에 따른 차이, 그리고 연도별 추세를 이해해보자. 우선 개별 컬럼의 분포를 살펴본 결과, 대부분의 레고 세트는 2000개 이하의 부품을 갖고, 가격은 200$ 미만이라는 상식과 부합하는 관찰을 할 수 있다. 

컬럼별 분포를 시각화해 주세요.  
- 테마 (상위 20개 테마와 그 빈도를 보여주세요)
- 년도 (년도별 세트 수를 보여주세요)
- 총 부품 수
- 소매 가격
- 평점

이제 테마별 차이를 살펴보자. 아래 프롬프트를 통해 테마별 차이의 시각화와, 시각화 결과에 대한 간단한 요약을 부탁할 수 있다.  

상위 10개 테마에 대해 각 열의 값 분포를 가로형 박스 플롯을 사용하여 이해해 봅시다.
- 년도
- 총 부품 수
- 소매 가격
- 평점


이제 연도별 변화 추세를 살펴보자. 아래 연도별 추세를 살펴보면 연도별로 테마의 분포가 달라지는 것을 확인할 수 있지만 색상이 조금 불만족스럽다. 

시간이 지남에 따라 어떤 변화가 있었는지 이해해보자.
- 테마의 분포 (면적 그래프를 사용)
- 평균 소매 가격


이를 프롬프트를 통해 해결해보자. 아래와 같이 다양한 색상으로 시각화한 결과를 볼 수 있다. 2010년 이래로 프랜즈 / 디즈니 / 브릭헤즈 등 새로운 테마가 많이 등장했음을 알 수 있다. 

각 세트에 대해 구별 가능한 색상을 사용하여 면적 그래프를 다시 그려주세요.


맺음말

이것으로 GPT로 레고 데이터를 불러 정제 및 간단한 시각화를 수행해 보았다.간단한 한글 프롬프트를 사용해 적당한 크기의 데이터셋에 대한 기본적인 정제 및 시각화를 수행할 수 있으며, 대부분의 경우 GPT는 원하는 결과를 손쉽게 보여주는 것을 알 수 있다. 또한 데이터 및 차트의 해석에 있어서도 GPT는 준수한 역량을 보여준다. 이 모든 것을 가능하게 하는 GPT4모델은 분석용으로 나온 것도 아님을 기억하자. 


물론 GPT는 다음과 같은 한계점도 노출했다. 같은 프롬프트에 대해 올바른 동작이 나오지 않는 경우가 종종 있기 때문에 분석의 재현성 면에서 어려움을 야기할 수 있으며, 시각화 등 결과물의 파인 튜닝이 필요한 경우 결국 코드 레벨로 돌아가 작업해야 하는 한계가 있다. 마지막으로 현재 ChatGPT 환경에서는 대용량 데이터에 대한 지원이 미흡하며, 분석 세션이 만료되면 처음부터 돌아가서 작업해야 한다.


하지만 이 모든 한계에도 불구하고 생성형AI가 분석의 신기원을 열었다는 사실에는 의심의 여지가 없다. 분석을 위해 최적화된 모델과 환경이 등장함에 따라 생성형AI의 역량을 점점 강화되고 그 한계는 줄어들 것이다. 데이터 분석에 종사하는, 혹은 관련 커리어를 준비하는 모든 분들이 지금부터 준비하고 고민해야 하는 이유다. 다음 글에서는 본격적인 분석 시나리오를 통해 GPT의 한계와 가능성을 탐험해 보자.


p.s. 표지로 사용한 이미지를 얻기 위해 아래와 같이 반복적인 '파인 튜닝'을 거쳐야 했다. 이처럼 생성형 AI 기술은 놀라움과 짜증을 동시에 안겨준다. Welcome to the brave new world!


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