자기계발 Diary

오늘의 공부Day_10(데이터 분석가에게 코딩테스트가 필요할까?,SQL공부)

siron94 2024. 11. 19. 17:55

데이터 분석가에게 코딩테스트가 필요할까?

 

코딩테스트란 무엇인가?

개발자에게 필요한 역량을 확인하는 목적으로 코딩시험을 보며 코딩 시험이 생소한 분들을 위해 코딩 시험이 어떤 과정으로 이뤄지는지 간단히 설명하면 아래와 같습니다.

 

  1. 실제 업무와 유사한, 그러나 ‘상당히’ 줄어든 범위의 문제를 풀어내는 코드를 작성하고, 시험을 위해 주어지는 예시 데이터들을 기준으로
  2. 코드가 정상적으로 돌아가고, 올바른 결과 값을 보여주는지
  3. 그 과정에서 메모리를 비롯한 컴퓨팅 리소스를 얼마나 효율적으로 활용하는지
  4. 계산 시간은 어느 정도 걸리는지

즉, '특정 프로그래밍 언어를 사용하여 주어진 문제를 잘 해결할 수 있는지'의 기술적인 부분을 확인하는 시험입니다.

특이한 점은 코딩테스트를 제공하는 서비스(또는 기술 면접 과정)에서, C, 자바(Java), 파이썬(Python) 같이 자주 쓰이는 프로그래밍 언어가 아닌 마이너 한 프로그래밍 언어로 시험을 하는 일도 종종 있습니다. 가령 R이나 SQL 같은 비개발용 언어와 Ruby나 Dart, Go 같은 산업에서 상대적으로 적게 활용되는 개발 언어가 이 상황에 해당됩니다.

그런데 비개발직군, 데이터분석가의 업무 역량을 파악하는 건 조금 다릅니다. 코딩테스트만으로 확인하기 어려울 수도 있습니다.

 

 

데이터 분석가가 업무에서 하게 되는 것들

데이터 분석가는 기업의 문제를 ‘데이터를 분석/활용하여’ 풀어내는 역할을 합니다. 기업이나 팀의 상황에 따라 하는 업무의 범위는 다를 수 있지만, 아래 표현들은 채용 공고에 자주 등장하는 몇 가지 내용입니다.

  • 데이터를 활용하여 현재 운영 중인 서비스/프로덕트의 고도화
  • 데이터 기반 의사 결정을 위한 전략 및 분석 지원
  • 전사적 목표 달성을 위한 가설 설정 및 이를 검증하기 위한 실험 설계 및 분석
  • 인사이트 제공을 위한 지표 정의 및 대시보드 및 리포트 제작
  • 새로운 가치 발견

위와 같은 기술적 역량을 발휘할 수 있다면 어느 기업에서나 기여할 수 있는 데이터 분석가의 업무가 될 수 있다고 생각합니다.

 

 

국내 사건사고 데이터 시각화 (서비스 고도화)

소방청에서 하는 주요 업무 중 하나는 구조입니다. 이 구조를 하나의 ‘서비스’로 보면 위험에 처한 사람(고객)을, 더 빠르고 안전하게 구조하는 것이 더 고도화된 구조 서비스의 한 방향이라 볼 수 있습니다.

이를 위해서 소방청에서는 데이터 분석을 통해, 어느 위치에서 어떠한 유형의 사고가 자주 일어나는지를 파악했고, 해당 위치에 선제적으로 안전 난간을 설치하는 등의 액션까지 이어졌습니다. 이런 활동을 통해 약 22%의 출동 건수 감소 및 사상자 수 43% 감소와 같은 사고 저감 효과를 냈습니다.

 

 

오바마 캠프의 A/B테스트 사례 (실험설계/분석)

대선을 치르던 당시 오바마 캠프는 ‘대통령 선거 승리’라는 명확한 목표를 가지고 있었습니다. 이를 위해 여러 대선 캠페인을 진행했고, 온라인 활동도 그중 하나였습니다. 미국은 특히나 다양한 인종과 가치를 존중하는 다양한 사람들로 구성된 만큼, 국민이라는 ‘고객’들을 만족시킬 수 있는 세그먼트별 타깃 전략이 필요했습니다. 이를 위해 오바마 캠프는 A/B 테스트를 통한 데이터 분석을 활용했습니다.

SNS의 좋아요 버튼을 통해 수집되는 유저 데이터부터 이메일 수신자 그룹 데이터, 오바마 홍보 웹페이지에 접속한 이후의 로그 데이터 등 다양한 데이터를 활용해서 세그먼트 별 가장 효과적인 캠페인을 진행할 수 있도록 A/B 테스팅을 진행했고 그 결과로 오바마는 미국 대통령에 당선될 수 있었습니다. (물론 A/B 테스팅 외에도 기부 금액 최적화, 설득가능점수 같은 지표 설정도 했습니다)

 

 

서울시 심야버스 노선 최적화 (데이터 기반 의사결정 전략)

보통 밤 11시 이후 심야에 퇴근하려면 자가용을 이용하거나 택시를 타게 됩니다. 그렇지만 대도시 서울에서의 늦은 퇴근은 택시만으로는 감당할 수 없었습니다. 이는 많은 서울 시민의 불만 사항이었고, 이를 개선하기 위해 서울시에서는 심야 시간에만 운행되는 버스를 운영해 왔습니다.

일반 대중교통과는 살짝 다르게 심야버스는 추가 수요를 감당하는 관점이기 때문에 수요에 따라 지속적인 최적화가 필요했습니다. 이를 위해 서울시는 통신사 KT와의 협업을 통한 휴대전화 이력 데이터를 통해 어느 지역에 심야 인구가 많은지 파악했습니다. 이후 이러한 데이터를 기반으로 기존 심야버스 노선을 변경하거나 노선을 신설해 고도화를 진행했습니다.

 

 

기업 내 데이터 분석가의 업무

기업은 데이터 분석가들에게 위와 같은 성공사례를 만드는 걸 기대합니다. 도메인이나 스케일이 다르지만, 위의 사례에서 공통으로 나타나는 5가지 특징을 알려드리겠습니다

 

  1. 분석할 수 있는 데이터는 준비되어 있다.
  2. 서비스를 통해 풀고자 하는 문제를 명확하게 인지했다.
  3. 복잡한 혹은 최신 논문에 나오는 데이터 분석 기법을 활용하지 않았다.
  4. 데이터 분석팀 외에도 다양한 팀과의 협업을 통해 문제를 해결했다.
  5. 특별히 어떤 툴을 썼다 하는 내용은 언급되지 않는다.

여기서 연관되는 역량을 다음과 같이 정의하고 싶습니다. 문제정의, 데이터 분석에 대한 이해, 타 직군과의 협업, 빠른 학습입니다.

 

 

정해진 답이 없는 데이터 분석가의 업무

데이터 분석가는 데이터를 활용해 정해진 답이 없는 문제를 해결해야 합니다. 그리고 이러한 역량을 확인하는 데에는 정답이 정해져 있는 코딩테스트보다 과제 전형이 대체로 더 효과적입니다.

기업 성향에 따라서 데이터 분석을 위해 수집부터 하는 경우도 있습니다. 

다만 개인적으로 원활하게 데이터 수집을 하는 환경을 만들고, 수집하는 직군은 데이터 분석가보다 ‘데이터 엔지니어’로 정의하는 것이 자연스럽다고 생각합니다. 또한 위와 같은 데이터 분석 사례들은 특별히 어떤 툴을 썼다 하는 내용이 언급되지 않습니다. 그 이유는 많은 조직에서 데이터 분석가에게 ‘어떤 문제를 왜 풀어서 무슨 변화를 만들 수 있는지’가 ‘문제를 어떻게 풀 것인지’보다 더 크게 기대하기 때문이라고 생각합니다.

 

 

코딩테스트와 데이터 분석

 데이터 직군의 경우, 지금까지 위에 설명한 것처럼 성공 사례를 만들기 위해 기술 외에도 코딩테스트로는 확인하기 어려운 다른 역량들 또한 필요합니다.

개발 직군과 비개발 직군의 애매한 사이에 있는 데이터 직군이지만, ‘조직의 문제를 해결하고 고객을 만족시킨다’라는 너무 기술적인 관점에만 몰입하면 정작 필요한 결과를 얻기 어렵습니다. 기술적인 부분 외에 다른 역량에도 중점을 두면 데이터 분석가로서 기업에 훨씬 더 큰 기여를 할 수 있기 때문입니다.

 

다음의 예시들은 데이터 직군의 코딩테스트에서 언급되는 (실무에서도 자주 하게 되는) 예시들입니다.

  • 머신러닝 모델의 평가 지표 계산
  • SQL을 활용한 메트릭 계산
  • 텍스트 등의 데이터 파싱 및 전처리

당연히 코딩이 필요한, 실무에서도 자주, 그리고 익숙하게 해야 하는 작업이기 때문에 데이터 직군도 이 정도의 코딩 역량은 중요합니다. 개인적으로는 ‘Scientific Programming’이라 표현되는 개념이 ‘이 정도의 코딩’에 가깝다고 생각합니다.

 

통계학

데이터를 다룬다는 것은, 궁극적으로 데이터에서 일정한 패턴을 찾거나 다른 것을 찾아 의미를 부여하는 일입니다. 이는 통계라는 이름으로 오래전부터 다루어졌으며, 상당히 많은 데이터 분석 방법들이 통계학을 기반으로 하고 있습니다. 따라서 통계학에 대한 이해가 깊을수록 데이터를 더 온전히 활용할 수 있습니다. 학부 수준의 기초통계학에 대한 이해도 충분하지만 그 이상이라면 자신의 전문성을 더 키울 수 있을 것입니다.

 

 

심리학

데이터 분석가 중 꽤 많은 분이 심리학을 배경으로 가지고 있습니다. 심리학에서 통계를 많이 활용하기도 하지만, 고객의 심리를 파악하고 구매와 같은 액션을 끌어내는 방향으로도 데이터를 활용할 수 있습니다. 심리학에 이해가 있으면 데이터 분석 업무에 크게 도움이 될 수 있습니다. 단, 여기서 말하는 심리학은 ‘내가 지금 무슨 생각하고 있게?’와 같은 가벼운 교양 심리보다는 이 고객이 다음 행동을 진행하기 위해서 필요한 보상과 이를 막는 장벽 등을 모델링하고 설계하는 조금 깊은 심리학이라고 생각하셔야 합니다.

 

 


SQL공부

 

SQL로 Pivot Table 만들어보기

피벗 테이블이란: 2개 이상의  기준으로 데이터를 집계할 때, 보기 쉽게 배열하여 보여주는 것을 의미합니다.

피벗 테이블 뷰를 생성하는 방법은 먼저 베이스가 되는 데이터를 생성하고 그다음 베이스 데이터를 활용해 피벗 테이블을 사용하는 것입니다.

  • 피벗 테이블의 기본 구조
집계 기준 구분 컬럼
데이터

 

  • 피벗 테이블 예시
    • 집계 기준: 일자, 시간
  1시 2시 3시 4시
10월 1일 5 3 5 2
10월 2일 7 10 1 8
10월 3일 3 3 9 4
10월 4일 9 16 10 1

 

 

[실습] 음식점별 시간별 주문건수 Pivot Table 뷰 만들기 (15~20시 사이, 20시 주문건수 기준 내림차순)

select restaurant_name,
           max(if(hh='15', cnt_order, 0)) "15",
           max(if(hh='16', cnt_order, 0)) "16",
           max(if(hh='17', cnt_order, 0)) "17",
           max(if(hh='18', cnt_order, 0)) "18",
           max(if(hh='19', cnt_order, 0)) "19",
           max(if(hh='20', cnt_order, 0)) "20"
from 
(
select a.restaurant_name,
           substring(b.time, 1, 2) hh,
           count(1) cnt_order
from food_orders a inner join payments b on a.order_id=b.order_id
where substring(b.time, 1, 2) between 15 and 20
group by 1, 2
) a
group by 1
order by 7 desc
  1. 베이스 데이터에는 음식점별 시간별 주문 건수가 담겨있습니다.
  2. Pivot Table 구조에 따라 음식점명을 기준으로 시간별 값을 추가 하며 컬럼을 추가하여 작성해 나갑니다.
  3. 서브 쿼리 를 사용하여 베이스 데이터를 한 번 더 연산하여 Pivot Table View를 만듭니다.
  4. Pivot View 조회를 위해 최댓값을 이용해 구조를 만들고, 각 컬럼에 시간 별 명칭을 붙입니다.
  5. 함수를 계산할 때는 GROUP BY절을 꼭 적용하고, 마지막에는 마지막 컬럼을 내림차순으로 정렬합니다.
  6. 조회 결과, 레스토랑 이름과 시간대별로 Pivot View를 볼 수 있으며, 이를 복사하여 보고서에 활용할 수 있습니다.

 

 

[실습] 성별, 연령별 주문건수 Pivot Table 뷰 만들기 (나이는 10~59세 사이, 연령 순으로 내림차순)

select age,
           max(if(gender='male', order_count, 0)) male,
           max(if(gender='female', order_count, 0)) female
from 
(
select b.gender,
       case when age between 10 and 19 then 10
                when age between 20 and 29 then 20
                when age between 30 and 39 then 30
                when age between 40 and 49 then 40
                when age between 50 and 59 then 50 end age,
       count(1) order_count
from food_orders a inner join customers b on a.customer_id=b.customer_id
where b.age between 10 and 59
group by 1, 2
) t
group by 1
order by age
  1. food_orders와 customers 테이블을 INNER JOIN하여 베이스 데이터를 만들고, 연령 범위는 10세에서 59세로 지정합니다.
  2. 조건문으로 10, 20, 30, 40, 50대로 구분하여 주문 건수를 구합니다.
  3. 성별, 연령별로 주문 건수 Pivot View를 만들기 위해, 행 축에는 나이, 컬럼에는 성별을 적어 계산합니다
  4. Pivot View에서 여러 컬럼을 Max로 묶어 그룹화하고, ORDER BY로 정렬하여 연령, 성별에 따른 주문 건수를 확인합니다.

 

 


코딩테스트를 준비하기 위해 기본적인 역량이 어떤 것이 필요한지 알 수 있었고 심리학이 코딩에 접목해 활용할 수 있다는 점이 신기했으며 데이터 분석가는 코딩 테스트보다 과제 전형이 대체로 효과 적이라는 부분에 흥미로웠다.

SQL공부는 피벗테이블에 대해서 처음 배웠는데 온전히 이해하려고 하니 시간이 오래 걸렸다 max를 사용해 컬럼을 묶는다는 걸 알았고 베이스 데이터가 있어야 피벗테이블을 활용할 수 있다는 점도 배웠다.