소개
8년차 데이터 과학자, 데이터 엔지니어, 머신러닝 엔지니어로 근무했으며, 쏘카와 타다에서 데이터 분석, 데이터 엔지니어링 개발, 머신러닝 알고리즘을 개발했습니다.
카일스쿨 유튜브에 데이터 커리어 관련 영상을 올리고 있으며, 어떻게 해야 강의를 수강하신 분들이 회사에서 일을 잘할 수 있을까?를 고민하며 자료를 만들고 있어요.
카일스쿨 유튜브 : https://www.youtube.com/c/kyleschool
기술 블로그 : https://zzsza.github.io/
인스타그램 : https://www.instagram.com/data.scientist/
대표 컨텐츠 : https://github.com/Team-Neighborhood/I-want-to-study-Data-Science
데이터 과학자가 되기 위해 진행한 다양한 노력들 : https://zzsza.github.io/diary/2019/04/05/how-to-study-datascience/
강의
로드맵
전체 1수강평
- 초보자를 위한 BigQuery(SQL) 입문
- 블로그 페이지뷰 300만이 알려주는 "실용주의 기술 블로그 글쓰기"
- PM을 위한 데이터 리터러시(프로덕트 데이터 분석)
- 초보자를 위한 BigQuery(SQL) 입문
- BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
게시글
질문&답변
총 정리 문제 풀이 4번 질문 있습니다.
안녕하세요. 오타가 있네요. tw.trainer_id = tp.id 7분 50초 쯤을 잘 보시면 아래와 같이 말씀드렸습니다.tw.trainer_id = tp.trainer_id 대부분 오타 때문에 발생하는 경우가 많답니다. 발표 자료의 코드 부분을 보시면 코드가 있어서, 그 코드를 보시면서 확인해보셔도 좋을 것 같아요
- 0
- 1
- 10
질문&답변
총 정리 문제 풀이 2번 방출 여부 상관
안녕하세요. 열심히 학습하고 계시네요! 말씀해주신 내용이 관점에 따라서 여러가지로 생각할 수 있을 것 같아요. 방출 여부를 신경쓴다는 것이 방출 여부에 따른 포켓몬 타입 1, 포켓몬 이름을 출력하고 싶다고 하는 것일까요? 혹은 trainer_pokemon의 status 여부도 같이 보고 싶다는 것일까요? 쿼리를 작성하기 전에 내가 추출하려는 것의 문장을 구체화를 하면, 문제를 해결할 때 더 도움이 됩니다. train_pokemon의 status를 추가한다고 하면 저라면 간단하게 뽑을 것 같네요 SELECT p.type1, tp.status, p.kor_name, COUNT(tp.id) AS cnt FROM basic.trainer_pokemon AS tp LEFT JOIN basic.pokemon as p ON tp.pokemon_id = p.id GROUP BY p.type1, tp.status, p.kor_name ORDER BY cnt DESC 여기서 tp.status가 Training, Active인 것과 아닌 것을 나누고 싶다면 CASE WHEN을 쓸 것 같네요. SUM을 쓰는 것도 방법인데 저라면 CASE WHEN으로 분류하고 나중에 집계하는 것을 선호해요(trainer_pokemon의 status에 들어갈 값이 겹치지 않을 것이라 지금 해주신대로 하셔도 괜찮긴 합니다) 추가적으로 status, 타입1, 이름 별로 1마리만 뽑고 싶을 때는 윈도우 함수를 사용해야 하는데 이 부분은 초급 레벨에선 좀 어렵다고 판단해서 BigQuery 활용편 강의에 설명했어요. 윈도우 함수를 사용하면 각 요소 별로 Row가 1개씩 나오도록 할 수 있어요
- 0
- 2
- 30
질문&답변
총 정리 문제 풀이 2번 질문 있습니다
아경님 안녕하세요.pokemon을 왼쪽으로 두셨군요.이런 경우엔 2개의 쿼리를 둘 다 실행해보시고, 차이가 있나 확인해보시는 것을 추천드려요 좌 : 제가 작성한 쿼리우 : 아경님 쿼리편하게 비교하기 위해 ORDER BY에 kor_name을 추가했습니다 쿼리를 실행하면 다음과 같은 결과가 보입니다(사진) 출력된 결과를 보면 유사한 것을 확인할 수 있습니다. 버터풀, 잉어킹, 잠만보, 팬텀, 식스테일 등 pokemon_cnt도 동일한 것을 볼 수 있죠. 다만, 페이지 결과 수를 보면 좌측 쿼리 결과는 166행, 우측 쿼리 결과는 251행입니다. 결과가 다릅니다. 이런 경우에 왜 다르지?를 직접 확인해보면 원인을 빨리 파악할 수 있습니다. 그래서 저는 >|을 클릭해서 맨 뒤로 데이터를 확인했습니다 (사진)좌측 쿼리는 pokemon_cnt가 1인 경우까지 나오고, 우측 쿼리는 pokemon_cnt가 0인 경우가 나옵니다. 우측 쿼리 결과를 그렇다면 이 현상은 왜 발생할까요?제 쿼리LEFT : trainer_pokemonRIGHT : pokemon 아경님의 쿼리LEFT : pokemonRIGHT : trainer_pokemon trainer_pokemon : 트레이너가 잡은 포켓몬 현황pokemon : 모든 포켓몬의 종류trainer_pokemon 중에 잡힌 전적이 없는 포켓몬도 있을 수 있어요. pokemon은 1~251번의 포켓몬에 대한 데이터가 저장된거라서요. 그리고 trainer_pokemon엔 여러 포켓몬이 여러번 잡힐 수 있습니다. 이는 회사의 상황과 동일합니다. 판매하는 제품의 id가 있고, 고객이 주문을 넣을 때 주문 id가 생기죠. trainer_pokemon = 주문, pokemon = 제품이라고 생각하면 됩니다. 돌아와서, 아경님의 쿼리는 포켓몬 251마리를 LEFT에 두고 우측에 trainer_pokemon 기록을 붙입니다. 그렇게 되면 모든 포켓몬에 대해서 정보가 붙는데, 잡힌 정보가 없는 포켓몬이 있어서 pokemon_cnt가 0이 나오게 됩니다. 문제 조건에 "가장 많이 포획된"이라는 조건이 있었는데, 이것은 잡히지 않은 포켓몬은 제외하라는 것을 내포합니다. 그래서 아경님의 쿼리를 이렇게 수정한다면 동일한 결과가 나옵니다.SELECT type1, kor_name, COUNT(tp.id) AS pokemon_cnt FROM basic.pokemon AS p LEFT JOIN basic.trainer_pokemon AS tp ON p.id = tp.pokemon_id GROUP BY type1, kor_name HAVING pokemon_cnt >= 1 ORDER BY pokemon_cnt DESC HAVING pokemon_cnt >= 1 조건을 주면 동일하게 나옵니다. LEFT을 어디에 두어야 하나요? => 그건 상황에 따라 적절히 하면 됩니다. 공식보단 제가 쿼리를 작성한 경험에선 주문 데이터 같은 trainer_pokemon을 왼쪽에 두는 것이 의도에 맞게 나와서 이렇게 설정했습니다. 아경님이 하신대로 하고 RIGHT JOIN을 쓸 수도 있지만, 헷갈릴 위험이 있어 저는 LEFT만 쓰곤 합니다.결과가 다를 때 어떻게 디버깅을 해야하는지도 공유드렸으니 이런 상황이 또 발생하면 이렇게 디버깅을 해보셔요.
- 0
- 2
- 19
질문&답변
5-3 문제 trainer_pokemon을 LEFT에 두면
아경님 안녕하세요. 어떤 오류가 생기시나요?해당 쿼리를 실행했는데 저는 오류가 뜨지 않고 결과가 89로 나오네요..!
- 0
- 2
- 31
질문&답변
구글클라우드설정-테이블성성후 파티션 나누기 설정에서 battle_datetime 이 목록에 나타나지 않습니다.
안녕하세요! 종종 인터넷에 따라 저렇게 되는 경우가 있더라구요. 이 때 battle_datetime의 DATETIME 타입을 INTEGER로 수정하시고 필드로 파티션 나누기에 추가되는지 확인해보시겠어요? 또는 아예 필드 입력을 새롭게 작성하고 파티션 나누기에 추가가 될 경우, DATETIME으로 지정하면 다시 되더라구요. 이렇게 했는데 안되시면 말씀해주셔요. 파티션 설정이 100% 필수는 아니긴해서 (학습을 위해 알려드리는거라) 그냥 진행하셔도 괜찮긴 합니다. 파티션의 정의를 알려드리기 위해 정의한거라서요!
- 0
- 2
- 47
질문&답변
6-7. 데이터 로그 설계 연습 문제 풀이
은경님 안녕하세요! 문제 푸느라 고생하셨습니다!질문이나 알면 좋은 내용 위주로 공유드릴게요. 큰 지표 정의나 로그 설계는 잘 진행하네요! 👍 1번 문제이벤트의 파라미터의 datetime. 이벤트엔 항상 시간 데이터는 같이 저장되곤 합니다. 보통 파라미터로 빼지 않고 이벤트는 항상 그것이 발생한 시간을 기록하는 것을 가이드로 두곤 해요. 만약 이런 가이드가 없다면 이렇게 매번 datetime을 추가하긴 해야겠지요. 동네 맛집 클릭 이벤트는 저는 click_nearby_restaurant라고 할 것 같네요. 음식점을 레스토랑으로 표현하는 경우가 많아서..!2번 문제분모의 이벤트 이름을 use_search_api라고 해주셨네요..! API를 사용했다 관점인데 개발자분들과 논의할 때 Request랑 헷갈린 경우도 있어요이럴 때 저는 그냥 response를 명시적으로 사용합니다. request_search : API 요청시response_search : API의 요청 후 Response를 받을 시회사에 따라서는 두개를 사용하지 않고, 하나만 쓰는 경우도 있어요. response 대신 impression을 쓰는 경우도 있어요impression_search : 노출을 의미검색 -> 노출 -> 클릭의 흐름인거죠그럼 노출된 것 중에 클릭한 것을 확인할 수 있어요근데 이 과정이 복잡하면 간단하게, 클릭 버튼을 클릭하고 결제까지 간 건수를 확인해봐도 됩니다(같은 키워드의 제품인지는 확인이 필요)3번 문제검색 필터는 간단하게 클라이언트 로그로 어떤 것을 클릭했는가로 확인해도 괜찮답니다. 필터 기능 사용을 필터의 세부 부분을 클릭한 값을 토대로 필터 클릭률을 구할 수 있어요use라는 이름은 넓게 사용할 수 있어서 저는 덜 사용하는 네이밍이긴 했어요. use를 사용하게 된 이유가 있을까요? 고생하셨습니다!! 🙂
- 0
- 1
- 20
질문&답변
지표 정의 연습 질문
임갬님 안녕하세요. 지표 정의를 고민하고 계시는군요..! 이렇게 연습하시는 과정에서 역량이 향상될거에요. 고생하셨어요제가 서비스에 대한 이해가 낮은 편이라(서비스 예시만 보고 상상한 것이라) 궁금한 내용 위주로 공유를 드릴게요 우선 지표를 정의할 때, 지금 하려는 것의 큰 목적도 같이 고민해보시면 좋을 것 같아요. "AI로 청약 자격 검사를 해주고 신청서 작성까지 도와주는 서비스를 출시"라고 해주셨는데, 여기서 어떤 상황에 지표를 정의하는지에 따라 관점이 다양할 것 같아요.서비스 전체적인 지표 정의특정 부분을 개선하기 위한 지표 정의 가입 전환율을 작성해 주셨는데, 이 부분은 퍼널 관점의 전환율을 파악하기 위함일까요? 어떤 목적이냐에 따라 해석이 다양할 것 같아요."서비스 첫인상과 프로세스의 간편함 확인. 사용자들의 니즈 확인" : 이 부분은 지표를 선택한 이유 같네요. 그런데 프로세스의 간편함 확인이란 것은 다양하게 정의가 되지 않을까? 라는 생각이 들었네요. 가입 후 메인 페이지와 서비스 방문 페이지까지의 페이지 수(Depth)에 따라 다를 것 같네요(서비스의 페이지가 없어서 상상을 토대로 하느라 임갬님과 저의 관점이 다를 수 있어요)회원 가입 완료는 왜 화면이 따로 없을까요? 회원 가입 페이지가 보통 있을 것 같은데..!청약 자격 분석 완료율파라미터 관련해서 위 두개 이벤트에 아래 파라미터 모두 적용되는걸까요? 이벤트마다 파라미터가 같이 사용될 때도 있고, 분리해서 사용될 때도 있어요. 어떤 곳에서 활용되는지 명시적으로 보여주셔야 좋아요(로그 설계 파트의 Event Taxonomy처럼..!)파라미터에서 user_id가 있는데, user_id 같은 값은 모두 사용되는 값이라 파라미터로 빼진 않아요. 유저 프로퍼티 / 이벤트 / user_id가 기본적으로 같이 수집된다고 보시면 됩니다time_spent는 로직이 복잡할 수 있는데, 잠시 백그라운드로 이동했거나 켜두고 그냥 아무 행동을 하지 않았을 때 등의 시간도 다 포함될까요? 이런 시간 측정이 상황에 따라 다양하게 나올 수 있거든요error_type 파라미터는 언제 사용될까요? 에러가 발생하면 청약 자격 분석 시작, 청약 자격 분석 완료 이벤트가 발생하지 않을 것 같아요. 에러 이벤트니깐요청약 자격 분석 과정에서 분석 실패면 "validation_failure_reason"를 사용할 것 같아요. 검증하는 과정에서 실패 이유니깐요. error라는 것은 서비스 개발에서 프로그래밍적인 오류가 생겼을 때 주로 사용했네요이 내용을 청약 자격 분석 완료에 들어간다고 하면.. 분석 실패했는데 분석 완료가 될 수 없을거고, 분석 시작을 누른 후에 분석 실패가 발생할거라서 그 사이에 검증 결과가 나타나게 될 것 같네요가입 전환율 50% 이상 성공, 청약 신청서 작성 평균 소요 시간 3분 이하 유지라고 했는데 이 기준은 어떻게 나왔는지도 중요해요. 어떤 기준으로 계산하셨나요?Action Plan에서발급 완료율이 낮다면 신청 과정의 특정 단계에서 많은 사용자가 이탈했는지 분석 => 특정 단계에 대한 지표를 파악을 같이 하는 것도 방법이에요. 그 사이에 있는 페이지 접근 유저 수DAU 지표는 추상화된 Output 지표라서 이걸 기반으로 Action Item을 만드는 것은 덜 구체적이게 되더라구요(신규 사용자 유입 및 재방문 유도하는 것은 항상 고민해야 하는 요소라서 더 구체적으로 쪼개서 생각해야 Actionable하겠지요)Action Plan에선 성공 지표를 위주로 생각하는 것을 추천드려요유입 경로는 유저 프로퍼티에 넣는 편이고, 사용한 디바이스는 보통 전반적으로 저장됩니다데이터 로그를 더 쪼개보면기본적인 유저의 데이터(user_id, user_pseudo_id, platform, version)유저 데이터, 유저 프로퍼티 : 특정 시점의 유저의 속성(구독 여부, 특정 조건 여부 등)이벤트, 이벤트 파라미터
- 0
- 1
- 59
질문&답변
테이블 만들기 오류
mink.choi님 안녕하세요. 테이블을 만드는 과정에서 문제가 있으시군요..!저도 다시 데이터를 업로드하면서 테이블을 만들었는데 정상적으로 동작하네요.마우스가 빙글빙글 돈다는 것은 네트워크나 테이블 생성 요청에서 문제가 있는 상황이네요. 이 내용을 기반으로 어떤 문제가 있을지 추측하면서 질문 및 시도를 공유드려요 어떤 테이블을 생성할 때 문제가 발생하나요? 모든 테이블일까요?혹시 지금 사용하시는 브라우저가 무엇일까요? 브라우저를 바꿔서 해보면 어떨까요?현재 사용하시는 네트워크가 보안의 이슈가 있을까요?(회사 네트워크라던가)또는 핫스팟을 연결해서 하는 경우에 되는 경우도 있어요
- 0
- 2
- 37
질문&답변
[빠짝스터디 4주차] 6-1의 최종 과제
notion.so 링크는 다른 사람이 확인할 수 없는 링크에요. Publish해서 공유해주셔요.
- 0
- 2
- 68
질문&답변
[빠짝스터디 4주차 과제] 강의 6-1의 최종과제
notion.so 링크는 다른 사람이 확인할 수 없는 링크에요. Publish해서 공유해주셔요.
- 0
- 2
- 53