일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- data analyst
- 크롤링
- Python
- 프로젝트
- da
- SQL
- 데이터분석
- jd
- 팀프로젝트
- 기초프로젝트
- lambda
- GA4
- cross join
- 클러스터링
- 데이터 분석
- 기초통계
- SQLD
- 히트맵
- 태블로
- 군집화
- streamlit
- Chat GPT
- 전처리
- 시각화
- 최종 프로젝트
- 프롬프트 엔지니어링
- If
- pandas
- 서브쿼리
- 머신러닝
- Today
- Total
세조목
TIL(Today I Learned) 3일차(23.11.30) 본문
1. SQL 예제
Q. 67: 주문량이 많은 아이스크림들 조회하기
https://school.programmers.co.kr/learn/courses/30/lessons/133027
문제에서는 FIRST_HALF와 JULY 두 개의 테이블을 제공해준다.
어떻게 코드를 작성해야 문제에서 요구하는 값을 구할수 있을까??
우선 두 개의 각기 다른 테이블 값을 더해줘야하니 두 테이블을 합쳐줘야 할 것 같다.
select F.FLAVOR 'FLAVOR'
from FIRST_HALF F inner join JULY J on F.FLAVOR = J.FLAVOR
JULY와 FIRST_HALF 테이블을 열어보면 JULY에는 strawberry가 두 번 나온다.
FIRST_HALF는 중복된 FLAVOR가 없기때문에 그냥
F.TOTAL_ORDER를 하면되지만 JULY 테이블은 그렇지 않기때문에
SUM(J.TOTAL_ORDER)와 group by F.FLAVOR를 해서 FLAVOR별로 값을 더해줘야한다.
그렇게 했을때 코드는
select F.FLAVOR 'FLAVOR'
F.TOTAL_ORDER,
SUM(J.TOTAL_ORDER)
from FIRST_HALF F inner join JULY J on F.FLAVOR = J.FLAVOR
group by 1
이 된다.
문제에서 요구하는건 두 테이블의 주문량의 합이기때문에 위 코드에
F.TOTAL_ORDER + SUM(J.TOTAL_ORDER) 를 넣어줘야한다.
select F.FLAVOR 'FLAVOR'
F.TOTAL_ORDER,
SUM(J.TOTAL_ORDER),
F.TOTAL_ORDER + SUM(J.TOTAL_ORDER)
from FIRST_HALF F inner join JULY J on F.FLAVOR = J.FLAVOR
group by 1
여기서 값이 큰 순서대로 상위 3개의 맛을 조회하라고 했으니
총 주문량을 나타내는 TOTAL을 내림차순으로 정렬하고
limit 함수를 활용해서 3개까지만 끊어낸다.
그렇게 했을때 코드는 아래와 같다.
select FLAVOR
from
(
select F.FLAVOR 'FLAVOR'
F.TOTAL_ORDER,
SUM(J.TOTAL_ORDER),
F.TOTAL_ORDER + SUM(J.TOTAL_ORDER) 'TOTAL'
from FIRST_HALF F inner join JULY J on F.FLAVOR = J.FLAVOR
group by 1
) a
order by TOTAL desc
limit 3
2. python
1) count 함수
sparta_data('group')['user_id'].count()
sparta_data[sparta_data==1].count()
sparta_data[sparta_data['group']==1].count()
sparta_data[sparta_data['group']==1]['user_id'].count()
각각 무슨 차이일까??
첫번째는 sparta_data 테이블 group 열에 속한 각 항목의 개수가 몇개인지를 나타냄
두번째는 sparta_data 테이블 전체에서 1이라는 값을 가진 column과 그 수를 나타냄
세번째는 sparta_data의 group 열 값이 1인 사람의 수
네번째는 sparta_data의 group 열 값이 1인 사람의 수를 알려주는데 group열의 값만 보여줌
음... 그런데
['user_id'] 가 없을때는 왼쪽 이미지처럼 모든 열이 표시되고
있을때는 오른쪽 이미지처럼 group 열에서의 값만 표시가 되는 이유가 무엇일까??
이 질문에 답하려면 count 함수가 어떤 함수인지를 알아야 한다.
count함수란 무엇인가?
count 다시 말해 '세아리는' 것이다.
무엇을 세아리는가?
테이블에서 비어있지 않은 칸만 세아린다.
sparta_data[sparta_data['group']==1 은
sparta_data 테이블의 group 열에 1이라는 값이 있는 것들의 개수를 구하겠다는 함수이다.
group열에 1이라는 값이 있는 index(행)을 한번 보자
각각의 열에 모두 값이 들어가 있지 않은가?
내가 구하고자 한건 group열에서 값이 1인 것들의 개수였지만 위와 같은 이유로
이렇게 각 열의 개수들도 똑같이 5654로 표시되는 것이다.
위의 경우 모든 칸에 값이 있기 때문에 gorup에서 값이 1인 것들의 개수와 같은 개수가 표시됐지만
아래와 같이 빈 칸이 있는 경우는 어떨까?
sparta_data[sparta_data['group']==1].count( )
를 입력하면 group열은 그 개수가 3이 나올 것이다.
다른 열들은??
user_id 열에는 값이 세개 들어가있기때문에 3
gender 열에는 값이 두개 들어있기때문에 2
area 열에는 값이 두개 들어 있기때문에 2
age열에는 값이 세개 들어 있기때문에 3
access_media 열에는 값이 세개 들어 있기 때문에 3
discounted 열에는 값이 두개 들어 있기 때문에 2
그래서 결과값은
user_id 3
gender 2
area 2
age 3
access_media 3
group 3
discounted 2
이 나오게 된다.
sparta_data[sparta_data['group']==1]['user_id'].count( )
여기서 ['user_id']가 추가되면
모든 열들 중에서 'user_id'의 값만 출력하겠다는 말이므로
값인 '3' 이 출력된다.
2) plot 차트에 범례를 표시하려면??
plt.legend( ) 를 입력해주어야하는데
plt.plot( ) 을 입력할 때 label='이름'도 반드시 함께 입력해주어야 범례가 표시된다.
3) x_list를 써야만 하는 이유
왼쪽의 경우 항목들이 문자고, 오른쪽의 경우 숫자다.
항목들이 문자일 경우에는 .index 했을때 x축에 그 값들이 들어가지만
항목들이 숫자일 경우에는 값이 자동으로 분포되어서 y축에 들어가는 값들과 대응되지 못하는 문제가 발생해서 그림이 그려지지 않게 되는 것이다.
그래서 x축에 들어갈 값들을 별도의 리스트로 만들어서 plt.bar( )안에 넣어주는 것이다.
항목들이 숫자이기때문에 그림이 그려지지 않는것이라면 항목들을 문자로 바꿔주면 되지 않을까??
우선 students_discounted의 index값만을 문자로 바꿀 것이기 때문에 students_discounted.index로 index값만을 뽑아낸다.
그걸 x_list라는 새로운 변수에 넣어준다.
x_list = students_discounted.index
그런 다음 x_list를 문자화 시켜주는 작업이 필요한데 이때 map함수와 list함수를 써준다.
map함수는 첫번째 인자에 함수, 두번째 인자에 시퀀스가 들어간다.
* 시퀀스 : 리스트, 튜플, 문자열 등을 의미함
첫번째 인자를 두번째 인자에 적용시키는 것이다.
코드를 작성하면 아래와 같은데
map(str, x_list)
우리가 앞에서 x_list라고 명명한 students_discounted의 index 값에 str함수를 적용해서 문자화 시킨다는 말이다.
그런데 map함수의 경우 map함수 자체만으로는 x_list를 목록으로 만들어주지 않기때문에 list로 한번 더 감싸줘야한다. 그렇게 했을때 코드는 아래와 같다.
list(map(str, x_list))
이 값을 다시 x_list에 넣어주게 되면
x_list =["1만원 쿠폰 그룹", "2만원 쿠폰 그룹", "3만원 쿠폰 그룹"] 없이도
bar 그래프가 그려지게 된다.
'데이터 분석 공부 > TIL(Today I Learned)' 카테고리의 다른 글
TIL(Today I Learned)6일차(23.12.05) (4) | 2023.12.05 |
---|---|
TIL(Today I Learned) 5일차(23.12.04) (0) | 2023.12.04 |
TIL(Today I Learned) 4일차(23.12.01) (2) | 2023.12.01 |
TIL(Today I Learned) 2일차(23.11.29) (1) | 2023.11.29 |
TIL(Today I Learned) 1일차(23.11.28) (0) | 2023.11.28 |