회사에 적응하기 위한 첫 주를 보내고 난 뒤, 실무에 관련된 교육을 받고 데이터들을 추출해보는 실습을 해보았습니다. 그리고 저희 둘은 각자 속한 프로젝트에 따른 업무 내용을 배우는 시간을 가졌습니다.

악성 유저(봇) 탐지 

- Spark를 활용한 시퀀스 데이터 가공 과정 살펴보기

먼저 악성 유저(BOT) 탐지에 대한 프로젝트 개요에 대해 설명 받을 수 있었는데요. 해당 프로젝트에서는 시퀀스 데이터를 활용한 Tensorflow 기반 딥러닝 분류 모델의 성능을 고도화 하고 계셨습니다. BOT 탐지를 위한 많은 분석 코드를 보기에 앞서, 학습 데이터 셋을 만드는 과정을 설명 해주셨는데요. 게임로그에서 내가 필요한 데이터만을 추출하고 구상한 모델의 인풋 형태에 맞도록 학습용 데이터를 가공하는 과정이 중요하다 말씀하셨습니다.

팀 내에서는 딥러닝 모델의 학습 데이터 구축을 위한 도구로 pyspark를 사용하고 있었는데요. 처음 보는 pyspark.sql 문법과 방대한 코드에 막막하고 낯설었지만, 멘토님이 직접 작성하신 코드에 대해 설명을 해주시며 이해를 도와주셨습니다.

먼저, 블레이드 앤 소울 게임 로그의 데이터에서 필요한 부분만 가져오기 위해 수집하고자 하는 날짜와, 게임 서버 명을 이용해 parquet 파일 명을 지정해주었습니다. 그 다음으로는 가져온 raw 데이터를 통해 시퀀스 데이터를 가공하는 과정인데요. 시퀀스 데이터의 구성은 각 게임 계정 id, 세션 id, 각 행동 로그의 인덱스, 수행 시각, 각 행동 로그 간 시간 간격 등으로 이루어져 있습니다. 예를 들어, 각 행동 로그의 시간 간격을 알기 위해서는 lag함수를 이용하여 이전 시간을 구할 수 있었는데요. 각종 SQL함수를 Python 스타일로 이어 붙여 작성하는 것이 Python을 주로 사용하는 저로서는 신기하고 더 직관적으로 와닿았습니다. 또한 중간 중간에 작성한 쿼리문의 결과물을 show 함수를 통해 출력해보며 작업을 할 수 있다는 점도 큰 장점이라고 느꼈습니다. 이렇게 각 유저 별 행동 로그, 행동 로그 간 시간 간격를 통해 구성된 시퀀스 데이터를 모델에 활용하기 위해 임베딩을 진행할 수 있는데요. 이 과정은 추후 알려드릴 예정입니다 :D

이 외에도 작업하고 계신 딥러닝 서버 환경에 접속하는 방법, 서버로부터 필요한 데이터를 전송하는 방법에 대해서도 알게 되었습니다. 필요한 데이터 항목을 직접 정의하고, 모델링에 필요한 형태로 집계하는 과정이 신기하면서도 이렇게 목표에 맞게끔 데이터를 가공하는 역량이 분석가에게 매우 중요하겠구나 하는 것을 느꼈습니다. 앞으로 데이터 가공을 능숙하게 하는 날 까지 많은 반복 연습이 필요할 것입니다.

모바일 마케팅 데이터 분석

- Hive 쿼리를 활용한 유저 정보 추출하기

게임 이용자들에 대한 많은 양의 데이터들은 Hive DB에 저장되고 있습니다. 하지만 데이터를 담고 있는 테이블도 많아서 필요한 정보만을 추출할 수 있는 방법이 필요합니다. 따라서 Hive 쿼리를 이용해서 필요한 데이터를 여러 테이블에서 뽑아서 한 테이블로 추출하는 방법에 대해서 알아보았습니다.

특정 기간의 광고 매체로 들어온 유저의 유입량이나 매출 이외에도, 게임 내에서 여러 활동들을 열심히 하는 유저를 살펴보기 위해 퀘스트 보상 횟수, 아이템 제작 횟수, 전투 횟수 등 플레이 활동 정보를 추출하는 것에 중점을 두었습니다.

제가 실행해본 쿼리는 리니지M 유저들 중 2018년 10월에 활동한 유저들에 관한 것이었습니다. 분석에 이용할 데이터를 보기 위해서는 연관된 모든 테이블들을 조인하고 필요한 컬럼들만 추출해 오는 작업이 필요했습니다. 또한, 추출한 컬럼들을 통해 새로운 파생 컬럼을 생성하기도 합니다. 이러한 작업을 효율적으로 하는 데에는 Hive에 내장되어 있는 함수들이 유용하게 쓰여졌습니다. 결과적으로 게임 유저들이 계정을 만든 시점이나 어떤 디바이스로 접속 했는지와 같은 유입 정보를 얻을 수 있었고, 어떤 컨텐츠를 얼만큼 즐기는지에 대한 정보도 살펴볼 수 있었습니다.

SQL 쿼리를 처음 접해본 것은 아니어서 대부분의 함수들이 새롭게 느껴지지는 않았지만 워낙 데이터의 양이 방대하여, 여러 테이블의 의미나 각 컬럼의 의미가 무엇인지 찾는 어려움이 있었습니다. 또한 대부분의 테이블이 효율적인 적재나 가공을 위하여 날짜 파티션으로 나누어 적재되고 있었습니다. 이러한 파티션을 조건 문에 넣어주지 않고 무작정 데이터를 보려 한다면, 활용할 수 있는 자원이 무방비하게 낭비되기 때문에 에러가 뜨게 된다는 것도 깨닫게 되었습니다.

한 주를 돌아보며…

생소한 분석 환경에 적응하고 방대한 데이터에서 어떻게 필요한 정보만 뽑을까 하는 어려움이 있었지만, 멘토님들과 하나씩 궁금증을 해소하며 업무에 적응해 나갈 수 있었습니다. 이처럼 중요한 데이터 추출 및 가공의 기본부터 잘 다져 나간 뒤, 다양한 분석 방법을 적용하여 인사이트 도출에 기여해보고 싶습니다. 다음 주에도 저희가 맡게 될 새로운 여정이 기대됩니다 :D