LG U+ Why Not SW CAMP 7기 - 8주차 회고

God menu·2025년 7월 4일

<6/30 33일차>

오늘 오전에는 저번주에 마무리했던 1차 프로젝트 최종 발표를 하였다. 아직 부족한 것도 많고 공부해야 할 것도 많지만 다른 분들의 피드백을 참고해가며 2차 프로젝트를 디벨롭 시킬 것이다. 이후 두번째 분석 보고서를 작성하는 시간을 가졌다. 저번에 항공사 지연 요인 분석 보고서를 해본 적이 있어서 참고하며 하다 보니 비교적 시간이 많이 들진 않았지만 그래도 여전히 부족한 점이 많다.

https://github.com/jiyoung1634/hipython_rep/tree/main/02_data_anal_proj
내 깃허브 파일에 분석보고서를 올려놓았으니 위에서 볼 수 있다. 🤗

두번째 분석 보고서로 <전자상거래(Walmart) 상품 카테고리별 구매 트렌드 분석 보고서>를 진행하였다. 데이터는 Kaggle에서 수집하였고 여러 시각화 차트를 그렸다.

  • 상품 카테고리별 비중
  • 카테고리별 총 금액
  • 카테고리별 평균 금액
  • 카테고리별 연령대별 구매 건수
  • 카테고리별 거주 연차별 구매 건수
  • 카테고리별 도시 유형별 구매 건수
  • 카테고리별 결혼 여부별 구매 건수

카테고리 관련 여러 차트를 그려보고 인사이트를 도출해보았다.

  • 어떤 상품 카테고리의 비중이 가장 높은가?

    • 전체 판매 비중에서 5번 카테고리가 가장 높은 비율을 차지함.
  • 해당 카테고리는 대중적이고 접근성이 높은 상품군일 가능성이 있음.

  • 어떤 상품 카테고리에서 매출이 가장 높은가?

    • 1번 카테고리가 가장 높은 총 금액을 기록.
  • 해당 카테고리는 고가 제품 비중이 높아, 비율은 가장 많지 않아도 총 구매 금액이 큼.

  • 어떤 상품 카테고리의 평균 구매 금액이 가장 높은가?

    • 10번 카테고리의 평균 구매 금액이 가장 높음 -> 프리미엄 상품군일 가능성이 큼.
  • 고객 연령대/거주 연차별/도시 유형별/결혼 여부 등에 따라 카테고리 선호가 달라지는가?

    • 45세 이하 연령대/거주 1년차 고개들/모든 도시 고객들/기혼자,미혼자 모두 5번 카테고리를 가장 선호

결론적으로는

카테고리 5번은 가장 많은 구매 비중을 차지하며 대중적으로 널리 소비되는 품목임을 나타냈고,
반면 카테고리 1번은 비교적 구매 빈도는 낮지만 총 매출이 높아 고가 상품군으로 볼 수 있다.
이러한 결과는 고객의 선호도가 높고 자주 구매되는 상품과, 소수의 고객이 고가로 구매하는 상품을 구분하여 맞춤형 마케팅 전략을 수립할 필요성을 보여준다.
향후 분석에서는 고객 연령대, 성별, 지역 등과 상품 카테고리를 함께 고려하여 보다 정밀한 구매 패턴 파악이 이루어질 수 있을 것이다.```

이상으로 나의 두 번째 분석보고서를 완성하였다. 시각화를 통해 고객의 소비 성향을 시각적으로 드러내는 과정이 흥미로웠고, 실제 분석 결과를 바탕으로 인사이트를 도출하고 전략을 제시하는 과정에서 문제 해결의 실마리를 찾는 경험을 할 수 있었다. 처음에는 단순히 그래프를 그리는 데 집중했다면, 점차 어떤 메시지를 전달할 수 있을지를 고민하게 되었다. 특히, 데이터를 해석하고 의미를 부여하는 과정이 분석에서 얼마나 중요한지를 다시 느꼈다. 분석 도구보다 분석 사고가 더 중요하다는 사실도 깨달았다. 앞으로는 분석의 흐름과 목적을 더 명확히 하며 실전 감각을 키워가고 싶다.


<7/1 34일차>

데이터베이스(DM)는 컴퓨터를 이용해 입력시킨 데이터를 관리할 수 있는 환경이며 여러 시스템 또는 사용자들이 공용(shared)할 목적으로 통합(integrated), 저장(stored)한 데이터 집합이다. 데이터베이스의 주요 기능은 다양한 데이터를 효율적으로 저장하고 관리하는 것이다.

  • 실시간 접근성 : 사용자 질의에 실시간 응답으로 처리한다
  • 지속적인 변화 : 삽입, 삭제, 수정 작업을 하여 항상 최신 데이터를 동적으로 유지한다
  • 동시 공유 : 목적이 서로 다른 여러 사용자가 동시에 원하는 데이터를 공유한다
  • 내용에 의한 참조 : 데이터베이스에 있는 데이터를 참조할 때 레코드의 주소나 위치가 아니라 사용자가 요구하는 데이터 내용을 참조한다

데이터베이스 관리 시스템(DBMS)는 데이터베이스를 관리하는 시스템으로 MySQL, Oracle, PostgreSql, MongoDB, Cassandra 등등 수많은 데이터베이스 관리 시스템이 존재한다. DBMS의 특징으로는 3가지가 있다.

  • 물리적 독립성 : 데이터베이스의 물리적 구조가 변경되더라도 응용 프로그램에 영향을 미치지 않도록 한다.
  • 접근의 독립성 : 사용자가 데이터에 접근하는 방식이나 경로가 변경되더라도 데이터베이스의 구조나 저장 방식에 영향을 주지 않는다.
  • 데이터 독립성 : 데이터베이스의 논리적 구조가 변경되더라도 응용 프로그램에 영향을 미치지 않도록 한다.

오늘부터는 SQL에 대해서 배우므로 MySQL을 설치하고 직접 코딩해보는 시간을 가졌다.

  • SELECT절에는 컬럼명 뿐만 아니라 수식이나 함수가 들어갈 수 있고 별명을 붙일 수 있다.
  • ORDER BY는 레코드를 순서대로 정렬할 때 사용한다. 오름차순(ASC) 정렬, 내림차순(DESC)
  • LIMIT n을 사용하여 반환되는 레코드의 개수도 지정할 수 있다.
  • DISTINCT는 데이터를 조회할 때 중복된 데이터를 한 번만 보일 때 사용한다.

SQL로 간단한 연산도 배웠다. 특히 집합 연산자 중에서 MySQL은 합집합에 대한 연산자만 제공한다. UNION이나 UNION ALL을 사용하고 주의할 점으로는 합치려는 각 SELECT문에서 컬럼의 개수, 데이터 타입이 동일해야한다.

IS NULL 연산자도 있는데 0이나 빈 문자열('')과는 다른 의미이다. 아래처럼 직접 입력해본 결과 빈 문자열의 결과와 IS NULL의 결과가 다른 것을 알 수 있다.

INBETWEEN ~ AND 연산자는 WHERE절을 조금 더 쉽고 효율적으로 사용할 수 있게 도와주는 연산자이다.

LIKE 연산자는 특정 문자열이 지정된 패턴과 일치하는지 확인할 때 사용한다. 와일드카드 문자(%, _)와 함께 사용하여 원하는 결과를 얻을 수 있다.


강사님께서 내주신 연습문제를 푸는 것으로 오늘 수업은 마무리했다. 단순히 데이터 저장소라고만 생각했던 데이터베이스가 실시간 접근성, 동시 공유 등 여러 기능을 포함하고 있다는 점이 인상 깊었다. MySQL을 직접 설치하고 SQL 기본 문법을 실습하면서 이론이 어떻게 실제 코드로 연결되는지도 체험할 수 있어 유익했다. SQL은 문법 자체는 간단하지만 정확한 구조와 논리가 필요하다는 점에서 더 연습이 필요하다고 느꼈다.


<7/2 35일차>

오늘도 SQL 문법에 대해 배우고 직접 코딩해보는 수업이 진행되었다.

  • CONCAT() : 문자열을 연결할 때 사용하는 함수
  • CONCAT_WS() : 문자열을 구분자와 함께 연결할 때 사용하는 함수
  • LEFT() : 문자열의 왼쪽부터 길이만큼 문자열을 반환하는 함수
  • RIGHT() : 문자열의 오른쪽부터 길이만큼 문자열을 반환하는 함수
  • SUBSTR() : 지정한 위치로부터 길이만큼의 문자열을 반환하는 함수
  • SUBSTRING_INDEX() : 지정한 구분자를 기준으로 문자열을 분리해서 가져올 때 사용하는 함수

이 뒤에는 날짜/시간형 함수에 대해서도 직접 코딩해보며 심심풀이로 몇가지 연습문제도 풀어보았다.

-- 태어난지 몇일 되었나? 
SELECT '2001-03-11'
, TIMESTAMPDIFF(DAY, '2001-03-11', NOW());   -- 결과 : 8879
-- 혹은 이렇게도 가능 -> SELECT DATEDIFF(CURDATE(), '2001-03-11');

-- 천일 기념일 
SELECT '2001-03-11'
, DATE_ADD('2001-03-11', INTERVAL 1000 DAY);   -- 결과 : 2003-12-06

-- 내가 태어난 요일 
SELECT '2001-03-11'
, DAYNAME('2001-03-11');   -- 결과 : 일요일
-- WEEKDAY()를 써도 됨 (결과는 6)

오늘을 기준으로 내가 세상에 나온 지 몇일인지, 태어난 요일이 언제였는지를 알 수 있는 게 흥미로웠다.

IF함수는 기존에 알고 있고 많이 쓰는 if함수와 다르지 않아서 이해하기 쉬웠다.
CASE함수도 마찬가지로 기존에 알던 개념과 다르지 않아서 이해하기 쉬웠다. 항상 END로 마무리 되어야 하고 중간에 THEN을 깜빡하고 빼먹는 실수를 종종 하긴 했지만..ㅎㅎ

GROUP BY절과 HAVING절과 WITH ROLLUP, GROUPING에 대해서 배우고 강사님께서 주신 연습문제를 풀어보았는데 조금 헷갈리는 부분이 있었다.

-- 고객구분(VIP,일반)에 따른 고객수, 평균 마일리지, 총합

SELECT
 CASE
 	WHEN 마일리지 > 10000 THEN 'VIP고객'
     ELSE '일반고객'
 END AS 고객구분
, COUNT(*) AS 고객수
, AVG(마일리지) AS 평균
FROM 고객
GROUP BY 고객구분 WITH ROLLUP;

해당 문제에서는 무엇을 그룹으로 묶어야 하는지

-- 주문내역에서 월별 발송지연건

SELECT MONTH(주문일) AS 주문월
, COUNT(*) AS 발송지연건수
FROM 주문
WHERE 발송일 > 요청일
GROUP BY 주문월
ORDER BY 1;

해당 문제에서는 WHERE절에 조건을 발송날짜와 요청날짜의 MONTH, DAY를 각각 비교하려다가 에러가 났었는데 그냥 단순 비교가 가능한지를 몰랐었다.

오늘 수업을 통해 SQL 문법에 대한 감각이 조금씩 익숙해지고 있다는 느낌이 들었다. 처음에는 익숙하지 않아 막막했던 문법들이지만, 직접 코드를 작성하고 오류를 고쳐보는 과정에서 미숙하지만 배우려고 수업듣는 것이니 열심히 듣고 있다. 특히 실수했던 부분들을 되짚어보면서 나의 반복적인자주 오류 패턴을 파악할 수 있었다. 조금씩 속도가 붙고 있지만 여전히 반복 학습과 복습이 중요한 시점이라 느꼈다.


<7/3 36일차>

오늘은 SQL 문법 중 조인에 대해 배우고 직접 코딩해보는 수업이 진행되었다.

조인(JOIN)은 두 개 이상의 테이블을 연결하여 데이터를 검색하는 방법으로 서로 다른 테이블에 저장된 관련된 데이터를 함께 가져와 하나의 결과로 표시할 수 있다. 조인을 사용하면 여러 개의 테이블을 마치 하나의 테이블인 것처럼 쓸 수 있다.

조인의 종류는 4가지가 있다. (ANSI SQL 조인 형식으로 배웠다)

  • 크로스 조인(Cross Join) : 한족 테이블의 각 행마다 다른 쪽 테이블의 모든 행이 한 번씩 각각 매칭되는 조인으로 Cartesian Product라고도 부른다.
    • 크로스 조인의 결과 행의 개수 : 테이블A 행의 개수 X 테이블B 행의 개수
    • SELECT *
      FROM 테이블A
      CROSS JOIN 테이블B 
    • 문법은 위와 같고 CROSS는 생략할 수 있다.
  • 내부 조인(Inner Join) : 각 테이블에서 조인 조건에 일치하는 데이터만 가져오는 조인
    • 내부 조인에는 이퀴 조인과 비이퀴 조인이 있다
    • 이퀴 조인(Equi Join) => 조인 조건에 = 연산자를 사용함
    • 비이퀴 조인(Non-Equi Join) => 조인 조건에 = 연산자 이외의 비교 연산자를 사용함
    • SELECT *
      FROM 테이블A
      INNER JOIN 테이블B
      ON 조인조건
  • 외부 조인(Outer Join) : 두 테이블에서 한쪽에는 데이터가 있고 한쪽에는 데이터가 없는 경우 데이터가 있는 쪽의 테이블을 기준으로 데이터를 출력
    • 외부 조인은 조인할 테이블명 사이에 LEFT 또는 RIGHT와 함께 OUTER JOIN을 넣음
    • LEFT JOIN : 왼쪽에 있는 테이블의 결과를 기준으로 오른쪽 테이블의 데이터를 매칭
    • RIGHT JOIN : 오른쪽에 있는 테이블의 결과를 기준으로 왼쪽 테이블의 데이터를 매칭
    • 매칭되는 데이터가 없는 경우에는 NULL로 표시됨
    • SELECT *
      FROM 테이블A
      LEFT OUTER JOIN 테이블B
      ON 조인조건
  • 셀프 조인(Self Join) : 동일한 테이블 내에서 한 컬럼이 다른 컬럼을 참조하는 조인
    • 셀프 조인을 하려면 조인 조건에 동일한 테이블명이 두 번 나타나게 됨
    • 이때 테이블명을 다른 별명으로 지정하여 다른 테이블인 것처럼 사용함
    • 또한 컬럼명도 모두 동일하므로 테이블의 별명과 컬럼명을 함께 써 컬럼의 소속을 구분해주어야 함
순서대로 조인에 대해 연습해 보았다. SQL 조인에 대해 본격적으로 학습하며, 여러 테이블을 연결해 데이터를 추출하는 개념을 명확히 이해할 수 있었다. 특히 처음 접한 개념이었지만 오늘 하루 내내 조인을 연습하다 보니 수업 끝날 즈음에는 챗GPT 도움 없이 조인 연습문제를 풀 수 있었다. 내일은 서브쿼리에 대해 배우고 실습하는 수업이 될 것이다. 이번 주 내내 SQL 기본 문법에 대해 배우고 실습하다 보니 점차 SQL의 매력이 느껴지는 것 같다. 😎

<7/4 37일차>

오늘은 SQL의 문법 중 서브쿼리와 DML에 대한 수업이 진행되었다.

서브쿼리(SubQuery)는 SQL문 내부에서 사용하는 SELECT문이다. 서브쿼리는 괄호 안에 기술해야 하며, WHERE절, SELECT절, FROM절, HAVING절 등에 넣어 사용할 수 있고 반환하는 컬럼수에 따라 단일컬럼, 다중컬럼 서브쿼리가 있다.

단일 행 서브쿼리(Single-Row SubQuery) 👇

-- 최고 마일리지를 보유한 고객의 정보
SELECT 고객회사명, 담당자명, 마일리지
FROM 고객
WHERE 마일리지 = (
	SELECT MAX(마일리지)
    FROM 고객
);

복수 행 서브쿼리(Multi-Row SubQuery) 👇

-- '부산광역시' 전체 고객의 마일리지보다 마일리지가 큰 고객의 정보
SELECT 담당자명, 고객회사명, 마일리지
FROM 고객
WHERE 마일리지 > ANY (
	SELECT 마일리지
	FROM 고객
	WHERE 도시='부산광역시');
  • 복수 행 서브쿼리는 IN, ALL, ANY, SOME, EXISTS와 같은 복수 행 비교 연산자를 사용하여 메인쿼리와 서브쿼리를 연결한다.

FROM절에서도 서브쿼리를 사용할 수 있는데, 이를 인라인 뷰(Inline View)라고 한다. 뷰에는 반드시 별명을 지정해주어야 하고 테이블명처럼 사용할 수 있다.

SELECT절 내에서도 서브쿼리를 사용할 수 있는데, 이때 서브쿼리가 하나의 값을 생성하는 형태를 스칼라 서브쿼리(Scalar SubQuery)라고 한다.

CTE(Common Table Expression)은 쿼리로 만든 임시 데이터셋으로 WITH절에서 정의한다. 인라인 뷰와 마찬가지로 테이블명처럼 사용할 수 있고 쿼리 내에서 여러 번 참조할 수 있기 때문에 재사용성이 좋다.

서브쿼리 실습을 한 이후에는 DML 문법에 대해서도 배웠다.
DML(Data Manipulation Language, 데이터 조작어)은 테이블을 관리(추가, 변경, 삭제)할 때 사용한다.

  • INSERT : 테이블에 새로운 행 삽입
-- 사원 테이블에 한 문장으로 세 명의 레코드 추가
INSERT INTO 사원(사원번호, 이름, 직위, 성별, 입사일)
VALUES('E20', '김사과', '수습사원', '남', CURDATE())
, ('E21', '박사과', '수습사원', '여', CURDATE())
, ('E22', '정사과', '수습사원', '여', CURDATE());
  • UPDATE : 기존 행에 있는 데이터 값 변경
-- 제품번호가 91인 제품의 단가를 10% 인상하고, 재고에서 10을 뺀 값으로 변경
UPDATE 제품
SET 단가 = 단가 * 1.1
, 재고 = 재고 - 10
WHERE 제품번호 = 91;
  • DELETE : 기존에 있는 행 삭제
-- 사원 테이블에서 입사일이 가장 늦은 사원 3명의 레코드 삭제
SELECT * FROM 사원;
DELETE FROM 사원
ORDER BY 입사일 DESC
LIMIT 3;

오늘 수업을 통해 SQL의 서브 쿼리 개념과 활용 방식에 대해 더 깊이 있게 이해할 수 있었다. 특히 인라인 뷰나 스칼라 서브 쿼리처럼 서브 쿼리가 실제 쿼리문 안에서 다양하게 사용된다는 점이 흥미로웠다. 처음에는 서브쿼 리와 메인 쿼리의 실행 순서가 헷갈렸지만, 실습을 통해 점차 익숙해졌다. 또한 DML을 통해 테이블의 데이터를 직접 추가하거나 수정하고 삭제하는 과정을 실습하면서 SQL이 단순히 데이터를 조회하는 언어가 아니라, 데이터를 조작하는 강력한 도구임을 체감할 수 있었다. SQL이 처음이라 어려움도 있었지만, 수업에 뒤처지지 않기 위해 꾸준히 노력하며 잘 따라가고 있다. 😃

0개의 댓글