본문 바로가기
프로그래머스/데이터분석 데브코스

프로그래머스 데이터분석 데브코스 6-3

by 포잉띠 2024. 3. 22.

마참내 너무 좋은 환경에서 쿼리를 짤 수 있게 되었다.

 

여러가지 실습을 진행하였는데 다시한번 반드시 기억해야 할 것을 알려주셨다.

가볍게 정리해 보자면

현업에서는 깨끗한 데이터셋이 존재하지 않는다.

말 그대로 이런 실습 환경, 캐글 데이터셋처럼 어느정도 정제된 데이터셋이 아닐 수 밖에 없다.

1. 항상 데이터셋을 의심할 것. / 어딘가에 결측치가 있을 가능성, 이상치가 가득할 가능성, 잘못 수집되었을 가능성 등등

2. isnull과 같은 함수로 확인해 보는것이 아닌 실제 레코드의 일부라도 한번 확인해 보는것이 큰 도움이 된다.

 

항상 데이터 품질을 의심하는 버릇이 필요하다.

1. 중복체크

2. 최근 데이터 존재 여부(freshness)

3. primary key uniqueness 지켜지는지 확인

4. 결측치 확인

5. 코딩을 통해 이 과정을 자동화

 

혼자 Tensor Flow로 모델을 만들어 kaggle 도전과제에 도전하면서 전처리의 중요성을 깨달았다.

시계열 + 주가지수 데이터를 넣어 선형회귀 모델을 돌려보면서 GIGO의 존재에 대해 알았다.

최근 프로젝트를 진행하며 결측치와 중복이 적다고 데이터 품질이 무조건 높은건 아니라는것을 알았다.

결국 품질을 판단하는건 사람이기에 여러가지 유형의 데이터들을 많이 맛보는것이 데이터 품질을 판단하는 눈을 기르는 길이라고 생각된다.

 

어느 시점이 되면 너무나 많은 테이블이 존재하게 된다.

회사 성장과 관련이 있는 부분이다.

회사가 성장할수록 필요로 하는 데이터들과 쌓이는 데이터들이 많아진다.

중요 테이블들이 무엇이고, 그것들의 메타 정보를 잘 관리하는것이 관건이라고 한다.

 

 

마지막으로 이런 출력을 만드는 쿼리를 숙제로 받고 쿼리를 짜고 해설해주신것을 보았다.

 

 

%%sql

SELECT 
    to_char(s_ts.ts, 'YYYY-MM' ) AS month, #left(s_ts.ts, 7)
    usc.channel as channel,
    count(distinct usc.userid) as uniqueUsers,
    count(s_t.refunded) as paidUser, 
    # COUNT(DISTINVT CASE WHEN amoint > 0 THEN usc.userid END) as paidUsers
    count(s_t.refunded) / count(distinct usc.userid) as conversionRate,
    # paidUsers::float/uniqueUsers AS conversionRate
    # ROUND(paidUsers * 100.0/uniqueUsers, 2) AS conversionRate 
    #100.0 을 곱함으로서 실수 반환  혹여나   분모가 0이 될  경우 error 발생
    # ROUND(paidUsers * 100..0 / NULLIF(unuqueUsers, 0 ), 2) AS conversionRate 분모가 0일때 NULL을 뱉어라. 
    sum(s_t.amount) as grossRevenue,
    sum(case when s_t.refunded=True then s_t.amount else 0 end) as netRevenue
    # sum(case when s_t.refunded = False then s_t.amount else 0 end) as netReveneu
FROM raw_data.session_timestamp s_ts 
inner JOIN raw_data.user_session_channel usc on s_ts.sessionid = usc.sessionid
inner join raw_data.session_transaction s_t on s_ts.sessionid = s_t.sessionid 
# session transaction 테이블 seesion id 필드에 null 값이 있음 
# left join raw_data.session_transaction s_t on s_ts.sessionid = s_t,.sessionid 
group by 1, 2
order by 1, 2

 

주석처리된 부분이 다 틀린 부분을 수정한 것이다.

전체적인 문제는

1. 결측치를 고려하지 않고 진행했다.

2. 필드의 Data Type을 고려하지 않고 진행했다.

3. 필드가 의미하는것을 제대로 이해하지 못한 채 진행했다.

이었다.

 

SQL 문법은 꽤나 많이 익숙해졌지만 구체적인 작동방식을 모른다는것과,

고려해야 할 부분이 생각보다 많다는것을 다시한번 깨달았다.