패스트캠퍼스데이터분석부트캠프 19

[패캠] SQL: 실무 문제 풀이 (유저 세그먼트별 + 매출 분석)

Q. 전체 유저의 Demographic을 알고 싶어요. 성/연령별로 유저 수를 알려주세요. 어느 세그먼트가 가장 숫자가 많나요? -- 참고로 기타 성별은 하나로, 연령은 5세 단위로 적당히 묶어주시고, 유저 수가 높은 순서대로 보여주세요. -- gender가 비어있는(null) 경우 Others에 하나로 묶어주기SELECT CASE WHEN gender IS NULL THEN 'Others' ELSE gender END AS gender, COUNT(*)FROM fastcampus.tbl_customerGROUP BY 1;-- IS NULL로 확인하는 위 방법은 잘 안 먹힘 (공공데이터 등 데이터가 더티할 때 종종 있는 일)-- 해결: LENGTH 함수 활용-- 'gender ..

[패캠] SQL: 실무 문제 풀이 (날짜 함수)

Q. 2020년 7월의 평균 DAU를 구해주세요. Active User가 증가하는 추세인가요?-- 2020-07-01 00:00:12+00:00를 2020-07-01 형태로 바꿔주려면?SELECT DATE_FORMAT(visited_at, '%Y-%m-%d')FROM fastcampus.tbl_visit; -- 2020년 7월의 DAU 구하기SELECT DATE_FORMAT(visited_at, '%Y-%m-%d'), COUNT(DISTINCT customer_id)FROM fastcampus.tbl_visitWHERE visited_at >= '2020-07-01'AND visited_at  -- 이상한 점: 2020-08-01까지 나오고, 첫째 날인 2020-07-01의 고객 수가 지나치게 적음-- ..

[패캠] SQL: 실무 문제 풀이

Q. 2020년 7월의 활성(Active) 유저의 구매율은?구매율 = 구매유저 수 / 활성유저 수(= 방문 이력이 있는 유저 수) 1. 쿼리로 구매유저 수와 활성유저 수를 구한다. * 활성유저 수 = 방문유저 수아래 두 코드는 테이블만 다름-- 구매유저 수SELECT COUNT(DISTINCT customer_id)FROM fastcampus.tbl_purchase WHERE purchased_at >= '2020-07-01'AND purchased_at = '2020-07-01'AND visited_at  2. 위 쿼리에서 구한 두 값(구매유저 수: 11174 / 활성유저 수: 16414)을 나눠주기SELECT 11174 / 16414; -- 0.6808 SQL에서 SELECT는 '출력' 키워드 (co..

[패캠] SQL: 조건문, JOIN, 집합연산자

IF문SELECT 절에 작성형태: IF(조건식, 참일 때 값, 거짓일 때 값)SELECT name, IF(attack >= 60, 'strong', 'weak') AS attack_classFROM pokemon.mypokemon;  IFNULL문SELECT 절에 작성NULL 값을 다른 값으로 대체할 때 사용형태: IFNULL(컬럼명, NULL일 때 값)SELECT name, IFNULL(name, 'unknown') AS full_nameFROM pokemon.mypokemon;  CASE문* 자바스크립트 등의 다른 언어(왼쪽)와 동일 개념을 대조해본 모습조건이 여러 개일 때 (1개일 때는 IF문)항상 END로 닫아줘야결과값을 새로운 컬럼으로 반환 (= 뒤에 AS 별칭 붙이기 가능)ELSE는 위의 WH..

[패캠 15일차] 파이썬: Numpy, Pandas

Numpy수학적 연산을 쉽게 할 수 있도록 도와주는 라이브러리순수 파이썬에 비해 속도가 매우 빠름!pip install numpyimport numpy as np 1차원 배열array1 = np.array([1,2,3])print(array1)type(array1) # numpy.ndarray (= 1차원 배열) 2차원 배열array2 = np.array([[1,'2',3], [4,5,6]])print(array2)print(type(array2)) # 1차원과 똑같은 numpy.ndarray# 2차원 배열인 것을 판별하려면?# array2.shape # (2, 3) = '2행 3열'array2.ndim # 2 (= 2차원이라는 뜻) 요소의 데이터 타입 확인array2.dtype # dtype('int3..

[패캠 14일차] 파이썬: 다양한 크롤링 방법 실습

구글 뉴스 크롤링카드 한 개 크롤링url='https://www.google.com/search?q=%EB%8D%B0%EC%9D%B4%ED%84%B0+%EB%B6%84%EC%84%9D%EA%B0%80&sca_esv=fc0f42412f6fa1c1&biw=932&bih=702&tbm=nws&ei=GX48ZtuyOM-fvr0Ps56KsAs&udm=&ved=0ahUKEwibo5zZiICGAxXPj68BHTOPArYQ4dUDCA0&uact=5&oq=%EB%8D%B0%EC%9D%B4%ED%84%B0+%EB%B6%84%EC%84%9D%EA%B0%80&gs_lp=Egxnd3Mtd2l6LW5ld3MiE-uNsOydtO2EsCDrtoTshJ3qsIAyBRAAGIAEMgUQABiABDIFEAAYgAQyBRAAGIAEMgUQ..

[패캠 13일차] 파이썬: 시각화, 전처리, 크롤링, 분석 실습

Plotly인터랙티브한 그래프를 만드는 라이브러리인터랙티브 = 그래프 위에 커서를 올리면 그래프에 대한 정보를 보여주는 것 Plotly는 작성한 그래프를 html로 저장하기에 용이 기본 문법fig = px.그래프종류(data_frame=데이터, x=x축 컬럼, y=y축 컬럼, color=범례 컬럼, title=제목, labels=dict(X축 컬럼=X축 라벨, Y축 컬럼=Y축 라벨), width=가로길이, height=세로길이, text_auto=bool타입(T/F))fig.show()# 막대 그래프fig = px.bar(data_frame=df_groupby1, x=’island’, y=’body_mass_g’, color=’sex’, barmode=’group’, text_auto=’.0d’, wid..

[패캠 12일차] 파이썬: 데이터 전처리, 시각화

Pandas 개요주요 기능정렬, 슬라이싱, 인덱싱 (빠름)그룹핑, 피봇팅데이터 간의 join데이터 요약, 통계파이썬 리스트, 튜플, 딕셔너리와 호환외부 데이터(csv, 엑셀, SQL DB, txt) 다루기 용이Pandas 불러오기import pandas as pdSeries1차원 리스트딕셔너리를 넣으면 리스트로 반환dic = { 'a': 1, 'b': 2, 'c': 3 }dic_series = pd.Series(dic) a         1b         2c         3dtype: int64 리스트로 시리즈를 만들 때 인덱스를 지정하지 않으면자동으로 0부터 인덱스 부여ls = [1, 2, 3] 0         11         22         3dtype: int64 ls_series =..

[패캠 11일차] 파이썬: 예외처리, 함수, 클래스, 크롤링 기본

예외처리(try/except)유저는 자유롭다..!숫자 입력하라고 했는데 문자 입력하는 유저 꼭 있음 코드에는 오류가 날 수 있는데오류로 인해 프로그램이 종료되는 것은 막아야 함=> 예외처리 필요 형태 try:   실행할 내용 (오류가 날 수 있는 코드를 try에 넣음)except:    try에서 에러 발생 시 실행할 내용finally:    try에서 오류가 발생하던 안 하던 무조건 실행할 내용  공공데이터에서 같은 열에 문자와 숫자가 섞여 있는 경우가 많음 함수함수: def ⇒ define, definition 정의한다뭔가를 내 손으로 직접 ‘정의’ 반복적인 코드들을 재사용하고 싶을 때하나의 함수로 만든다 (코드 블록을 묶는 작업) 100줄을 그냥 작성하는 것보다20줄짜리 5개 함수를 보는 것이오류를..

[패캠 10일차] 파이썬: comprehension, 함수, 예외처리

n개의 정수 입력받기1번째 방법: num = int(input('몇 개의 정수를 입력하시겠습니까?'))user_input_list = []for i in range(num): user_input = int(input(f'숫자를 입력하세요 - ({i + 1}번째 숫자)')) user_input_list.append(user_input)2번째 방법:한 줄로 해결 - more pythonic!num_list = list(map(int, input().split()))  break, continue, pass 차이점break실행되는 순간 반복문이나 조건문을 멈춤i = 8while i > 0: i -= 1 if i % 2 == 0: break # 실행되는 순간 while문 자체가 멈춰버림..