세조목

TIL(Today I Learned)12일차(23.12.13) 본문

데이터 분석 공부/TIL(Today I Learned)

TIL(Today I Learned)12일차(23.12.13)

세조목 2023. 12. 13. 21:25

1. SQL

 1) 프로그래머스 65번 문제

https://school.programmers.co.kr/learn/courses/30/lessons/62284#qna

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

65번 문제 요구사항이다.

Milk와 Yogurt를 동시에 구입한 장바구니를 출력해야한다.

어떻게 하면 될까?

 

WHERE NAME = 'Yogurt' or NAME = 'Milk'
로 하면 Yogurt없이 Milk만 / Milk없이 Yogurt만 있는 경우가 발생한다.
WHERE NAME = 'Yogurt' and NAME = 'Milk'
로 하면 NAME 컬럼 안에 Yogurt와 Milk가 모두 들어있는 ID와 CART_ID가 없기때문에 아무런 값도 출력되지 않는다.
WHERE 'NAME = 'Yogurt' and NAME = 'Milk' ' 를 다르게 표현할 수는 없을까?

 

NAME 컬럼으로만 해결하려고하면 해답을 찾을수가 없다.

NAME컬럼과 CART_ID 컬럼을 함께 활용해야한다.

무슨 말인고하면

우선 WHERE절에 Yogurt든 Milk든 'NAME = ' 조건을 먼저 하나 주고,

바로 이어서 CART_ID가 나머지 조건에 해당하는 조건을 주는 것이다.

예를 들어

WHERE NAME = 'Yogurt' 를 줬다면 이어서

AND CART_ID
(
	SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME = 'Milk'
 )

를 입력하는 것이다.

 

조금 더 설명을 하자면

WHERE NAME = 'Milk'를 했을때는

이같은 값이 추려진다.

AND CART_ID
(
	SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME = 'Yogurt'
 )

이어서 이 코드를 입력하면

이렇게 NAME이 Yogurt인 CART_ID들만 추려진다.

 

두 조건을 AND로 묶었기 때문에 두 조건을 모두 만족하는 CART_ID 286, 448, 636만 출력된다.

 

 2) 프로그래머스 66번 문제

https://school.programmers.co.kr/learn/courses/30/lessons/164671#qna

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

66번 문제의 요구사항이다.

이 문제에서는 조회수가 가장 높은 중고거래 게시물을 찾아내야하는데

처음 문제를 풀 때는 

SELECT CONCAT(CONCAT_WS('/','/home/grep/src', A.BOARD_ID, FILE_ID), FILE_NAME, FILE_EXT) 'FILE_PATH'
FROM USED_GOODS_BOARD A JOIN USED_GOODS_FILE B ON A.BOARD_ID = B.BOARD_ID
HAVING MAX(VIEWS)

이렇게 작성하는건가싶었다.

이렇게 할 경우 가장 조회수가 높은 값 딱 하나만 출력이 된다.

그런데 가장 조회수가 높은 게시글이 중복으로 존재할 수 있기때문에

'가장 조회수가 높은 게시글의 조회수를 가진' 이라는 조건을 먼저 만들어 주고

그 조건에 해당하는 값들을 모두 출력하게끔 코드를 작성해야한다.

 

'가장 조회수가 높은 게시글의 조회수를 가진' 이라는 조건은 어떻게 만들수 있을까?

WHERE VIEWS IN
(
    SELECT MAX(VIEWS)
    FROM USED_GOODS_BOARD
)

위와 같이 WHERE절에서 만들어 줄 수 있다.

가장 조회수가 높은 게시글의 조회수는 301개이다보니

결국은 WHERE VIEWS IN 301이라는 조건이 만들어지게된다.

 

그러면 WHERE VIEWS IN 301이라는 조건을 가진 게시글들만을 모두 출력하게된다.

 

2. PYTHON

 1) 데이터 분석 4주차 수업 - 인덱싱

sum_of_students_by_discounted = sparta_data[sparta_data['group']==1]['user_id'].count()
sum_of_students_by_discounted

https://eyeoftheworld1209.tistory.com/entry/TILToday-I-Learned-3%EC%9D%BC%EC%B0%A8231130

TIL 3주차 中

TIL 3일차에서 다뤘던 내용이다.

group 열에서 값이 1인 사람들의 수를 구하기 위해서는

sparta_data[sparta_data['group']==1].count( )

을 작성해야한다.

 

 2) 데이터 분석 4주차 수업 - 시각화

문제에서는 '할인받은 그룹', '할인받지못한 그룹' 이렇게 두 개의 그룹이 나온다.

plt.plot(x_list, percentage_of_discounted)
plt.plot(x_list, percentage_of_not_discounted)

시각화 할 때 나는 처음에 위와 같이 코드를 입력했으나 저렇게 입력하는 것이 아니었다.

 

x_list = ['할인', '정상가격']
y_list = [percentage_of_discounted, percentage_of_not_discounted]
plt.bar(x_list, y_list)

두 개의 그룹값으로만 존재한다면

위 코드처럼 x_list와 y_list를 각각 만들어서

plt.bar( ) 안에 넣어줘야한다.

 

 3) 기타

  1. 결측치 확인 : 변수.isnull( ).sum( )
  2. 결측치 제거 : 변수.dropna( )
  3. 행/열 삭제 : 변수.drop('행/열')
  4. 시각화 단계에서 두 개의 plot을 그려야한다면 plt.plot(index, values)를 각각 입력해주면 됨