<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>msoo5880 님의 블로그</title>
    <link>https://msoo5880.tistory.com/</link>
    <description>msoo5880 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Wed, 20 May 2026 06:46:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>msoo5880</managingEditor>
    <item>
      <title>주제 선정 피드백을 통한 구체화</title>
      <link>https://msoo5880.tistory.com/56</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 주제 : 리뷰 분석을 통해 구매 전환을 높이자!
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;But! '구매 전환'이라는 단어가 조심스러움. 리뷰와 구매 전환의 인과관계 설명이 애매함.&lt;/li&gt;
&lt;li&gt;전날의 리뷰 변화와 다음날 판매 반응의 관계를 모름(누적 판매수의 데이터 수집 방식/시기를 모름)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;바꾼 주제 : 'MD들에게 리뷰를 통한 상품별 대응 플랜 대시보드를 제시하자.'&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, 업데이트 된 리뷰의 수와 리뷰 텍스트의 키워드, 리뷰 텍스트의 길이, 사진의 유무(착샷과 제품샷도 구별)를 통해 리뷰의 질이 좋고 나쁨을 판단하여, 상품들을 그룹으로 나누어 분류한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 리뷰의 질을 정하기가 매우 애매한 난관에 봉착했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트의 길이로 예시를 들자면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시 1 : '사이즈가 작네요. 색감도 별로에요. 기장은 왜이렇게 짧죠? 정말 별로네요'&lt;/li&gt;
&lt;li&gt;예시 2 : '색감이 사진보다 쨍하고 물빠진 부분이 있어요.'&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 1보다 예시 2가 텍스트 길이는 짧지만, 예시 2가 더 나쁜 리뷰라고 할 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 따라서 분석 방향을 다시 설계함.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타겟 브랜드를 지정 (ex. 무신사 스탠다드)&lt;/li&gt;
&lt;li&gt;타겟 브랜드의 목적으로 하는 카테고리(아우터, 상의, 바지)의 전체 상품에 대해서 각 리뷰의 키워드 분석을 통해 N일간 긍/부정 비율의 변화율을 분석한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) 전체 대비 N일간 부정 리뷰의 퍼센트 변화율을 본다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 처음 피드백에서 대시보드를 간단하게 스케치 후, 프로세스를 진행하는 역설계 방식을 사용하는게 어떻냐는 피드백에 따라서 대시보드의 큰 그림을 그려보았다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대시보드 A : 무신사에 있는 전체 리뷰에 대한 분석 (기본적인 리뷰 설명 페이지) - N일 데이터가 쌓이기 전 전체 리뷰에 대한 설명&lt;/li&gt;
&lt;li&gt;대시보드 B&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대시보드 B - 1 : 전체 긍정 / 부정 변화량 top N을 보여주는 시트&amp;nbsp;&lt;/li&gt;
&lt;li&gt;대시보드 B - 2 : 특정 키워드에 대한 키워드가 큰 상품들을 보여주는 시트
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사이즈 10/ 색상 0/ 배송0 (바지a) : 1/0/0 &amp;rarr; 대시보드 B-2&lt;/li&gt;
&lt;li&gt;사이즈 30/ 색상 40/ 배송30 (바지c) :0.3/0.4/0.3 &amp;rarr; 대시보드 B-1 - 수는 많지만 비율이 낮음.&lt;/li&gt;
&lt;li&gt;사이즈 1/ 색상 8/ 배송1 (바지b) : 0.1/0.8/0.1 &amp;rarr; 대시보드 B-2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;대시보드 C : 대시보드 B와 동일하지만, 페르소나 기법으로 원하는 상황을 보여준다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 데이터에서 프로젝트 기간동안 '즉각 대응 필요' 상품이 타겟 브랜드에 없을 수 있음.&lt;/li&gt;
&lt;li&gt;따라서, 임의로 리뷰데이터를 추가하여 설명용으로 대시보드를 구축한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;아래는 정말 대충 스케치한 대시보드..(99퍼센트 뜯어고칠겁니다 호호..)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1401&quot; data-origin-height=&quot;903&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CHeFZ/dJMcaaSuCQP/xoSeLhqLo5YSivGFTGj9D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CHeFZ/dJMcaaSuCQP/xoSeLhqLo5YSivGFTGj9D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CHeFZ/dJMcaaSuCQP/xoSeLhqLo5YSivGFTGj9D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCHeFZ%2FdJMcaaSuCQP%2FxoSeLhqLo5YSivGFTGj9D1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;503&quot; height=&quot;903&quot; data-origin-width=&quot;1401&quot; data-origin-height=&quot;903&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내일 할 일&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;피드백을 통한 주제 확정 및 제출&lt;/li&gt;
&lt;li&gt;크롤링 시도&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>msoo5880</author>
      <guid isPermaLink="true">https://msoo5880.tistory.com/56</guid>
      <comments>https://msoo5880.tistory.com/56#entry56comment</comments>
      <pubDate>Tue, 14 Apr 2026 21:50:13 +0900</pubDate>
    </item>
    <item>
      <title>주제선정의 가닥과 간단 크롤링</title>
      <link>https://msoo5880.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;주말동안 각자 주제 아이디어를 생각해오기로 했음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 분석을 위한 프로젝트가 아니라, 기업이 필요로 하는 프로젝트여야 더 경쟁력이 있다고 판단했고, 각 패션 플랫폼들에 대해서 조사를 하기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.wiseapp.co.kr/insight/detail/523?&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.wiseapp.co.kr/insight/detail/523?&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776084063259&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;패션 전문몰 앱 사용자 수 1위 에이블리, 결제추정금액 1위 무신사&quot; data-og-description=&quot;패션 전문몰 앱 '에이블리vs무신사vs지그재그'의 2024년 현황이 궁금하다면? 와이즈앱 인사이트에서 확인하세요!&quot; data-og-host=&quot;www.wiseapp.co.kr&quot; data-og-source-url=&quot;https://www.wiseapp.co.kr/insight/detail/523?&quot; data-og-url=&quot;https://www.wiseapp.co.kr/insight/detail/523&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bWcPz4/dJMb8UHQrYS/7B6fwkG2kKorbH71GbBkC0/img.png?width=4000&amp;amp;height=1000&amp;amp;face=0_0_4000_1000&quot;&gt;&lt;a href=&quot;https://www.wiseapp.co.kr/insight/detail/523?&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.wiseapp.co.kr/insight/detail/523?&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bWcPz4/dJMb8UHQrYS/7B6fwkG2kKorbH71GbBkC0/img.png?width=4000&amp;amp;height=1000&amp;amp;face=0_0_4000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;패션 전문몰 앱 사용자 수 1위 에이블리, 결제추정금액 1위 무신사&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;패션 전문몰 앱 '에이블리vs무신사vs지그재그'의 2024년 현황이 궁금하다면? 와이즈앱 인사이트에서 확인하세요!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.wiseapp.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.businesspost.co.kr/BP?command=article_view&amp;amp;num=435487&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.businesspost.co.kr/BP?command=article_view&amp;amp;num=435487&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776084221057&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;에이블리코퍼레이션 작년 매출 3697억 역대 최대, 4910과 아무드 모두 성장률 높아&quot; data-og-description=&quot;에이블리코퍼레이션 작년 매출 3697억 역대 최대, 4910과 아무드 모두 성장률 높아&quot; data-og-host=&quot;www.businesspost.co.kr&quot; data-og-source-url=&quot;https://www.businesspost.co.kr/BP?command=article_view&amp;amp;num=435487&quot; data-og-url=&quot;https://www.businesspost.co.kr/BP?command=article_view&amp;amp;num=435487&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/chWTyJ/dJMb9fZwDtn/XzEiMbiAbvkRX9vIgWprl0/img.png?width=300&amp;amp;height=150&amp;amp;face=0_0_300_150,https://scrap.kakaocdn.net/dn/dAbGaD/dJMb9cBJpJN/a8GZ38bMernhFaxft2Jpx0/img.png?width=300&amp;amp;height=150&amp;amp;face=0_0_300_150&quot;&gt;&lt;a href=&quot;https://www.businesspost.co.kr/BP?command=article_view&amp;amp;num=435487&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.businesspost.co.kr/BP?command=article_view&amp;amp;num=435487&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/chWTyJ/dJMb9fZwDtn/XzEiMbiAbvkRX9vIgWprl0/img.png?width=300&amp;amp;height=150&amp;amp;face=0_0_300_150,https://scrap.kakaocdn.net/dn/dAbGaD/dJMb9cBJpJN/a8GZ38bMernhFaxft2Jpx0/img.png?width=300&amp;amp;height=150&amp;amp;face=0_0_300_150');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;에이블리코퍼레이션 작년 매출 3697억 역대 최대, 4910과 아무드 모두 성장률 높아&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;에이블리코퍼레이션 작년 매출 3697억 역대 최대, 4910과 아무드 모두 성장률 높아&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.businesspost.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 인사이트를 통해서 에이블리 타 플랫폼과 비교했을 때 높은 유저 수 대비 결제 추정 금액이 낮은 것을 알 수 있었고, 아래 기사를 통해 매출이 많이 상승했지만 여전히 적자임을 알게되었다. 이를 해결하기 위해 &lt;b&gt;고마진 상품(뷰티/라이프)을 패션과 함께 추천해주는 크로스셀링 모델을 구축&lt;/b&gt;하는 아이디어를 제시했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 아이디어를 들은 팀원들의 의견
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 의류와 뷰티 크로스셀링 전략이 먹힐 것인가?&lt;/li&gt;
&lt;li&gt;2. 젊은 층이 많이 사용하는 저가 플랫폼인 에이블리가 객단가를 높이는 것이 가능할까?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;해당 아이디어를 들은 튜터님의 의견
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 아이디어는 매우 좋지만 크롤링이 가능할지 확인해보아야 한다.&lt;/li&gt;
&lt;li&gt;2. 어떤 인사이트나 목적이 나올지, 분석 모델과 같은 구체성이 잘 그려지지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 의견을 들었고, 가장 현실성있는 제안을 하신 팀원의 의견을 중심으로 나와 다른 팀원들의 아이디어를 덧붙여가는 식으로 방향을 잡았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 현실성있는 제안을 하신 팀원의 의견은 &lt;b&gt;리뷰가 구매 전환에 미치는 영향을 분석&lt;/b&gt;하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 우리는 가장 정보가 많고 크롤링이 용이한 무신사 플랫폼을 단독으로 분석하기로 결정을 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석 목적은 리뷰관리를 통해 수익(판매량)을 높이는 것이고 분석의 가닥은 크게 2가지로 잡았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 단순히 리뷰수가 많은 상품이 잘 팔리는 것이 아니라 어떤 리뷰의 상품이 실제 구매에 영향을 미치는지 분석한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 부정 리뷰 텍스트를 확인하여 불만 키워드를 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(우선은 이렇고 프로젝트를 진행하면서 더 키워갈 예정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 아이디어 역시 무신사의 크롤링이 가능한지가 가장 핵심이었으며 크롤링 가능여부를 확인을 해보았다.&lt;/p&gt;
&lt;pre id=&quot;code_1776085423074&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
import pandas as pd
import time
import sys

# ==========================================
# 0. 기본 설정 및 세션 초기화
# ==========================================
HEADERS = {
    &quot;User-Agent&quot;: &quot;My-Agent&quot;,
    &quot;Referer&quot;: &quot;https://www.musinsa.com/&quot;,
    &quot;Origin&quot;:  &quot;https://www.musinsa.com&quot;,
}

# Session 객체를 사용하면 연결을 재사용하여 크롤링 속도가 훨씬 빨라집니다.
session = requests.Session()
session.headers.update(HEADERS)

# ==========================================
# 1. 데이터 탐색 유틸리티 함수
# ==========================================
def extract_product_columns(data):
    &quot;&quot;&quot;JSON 구조 내에서 'PRODUCT_COLUMN' 캡슐만 모두 찾아 리스트로 반환&quot;&quot;&quot;
    nodes = []
    def _traverse(node):
        if isinstance(node, dict):
            if node.get(&quot;type&quot;) == &quot;PRODUCT_COLUMN&quot;:
                nodes.append(node)
            for v in node.values():
                if isinstance(v, (dict, list)):
                    _traverse(v)
        elif isinstance(node, list):
            for item in node:
                if isinstance(item, (dict, list)):
                    _traverse(item)
    _traverse(data)
    return nodes

def get_value_by_keys(data_dict, keys_to_check, default=None):
    &quot;&quot;&quot;여러 예상 키값 중 매칭되는 첫 번째 값을 찾아 반환&quot;&quot;&quot;
    if isinstance(data_dict, dict):
        for k in keys_to_check:
            if k in data_dict and data_dict[k] is not None:
                return data_dict[k]
        for v in data_dict.values():
            if isinstance(v, (dict, list)):
                res = get_value_by_keys(v, keys_to_check)
                if res is not None:
                    return res
    elif isinstance(data_dict, list):
        for item in data_dict:
            if isinstance(item, (dict, list)):
                res = get_value_by_keys(item, keys_to_check)
                if res is not None:
                    return res
    return default

# ==========================================
# 2. 핵심 크롤링 함수들
# ==========================================
def fetch_ranking_products(category_code, category_name):
    &quot;&quot;&quot;특정 카테고리의 랭킹 상품 50개를 수집&quot;&quot;&quot;
    url = &quot;https://api.musinsa.com/api2/hm/web/v5/pans/ranking/sections/199&quot;
    params = {
        &quot;storeCode&quot;: &quot;musinsa&quot;,
        &quot;categoryCode&quot;: category_code,
        &quot;contentsId&quot;: &quot;&quot;,
        &quot;subPan&quot;: &quot;product&quot;,
        &quot;gf&quot;: &quot;A&quot;,
        &quot;ageBand&quot;: &quot;AGE_BAND_ALL&quot;
    }

    response = session.get(url, params=params)
    if response.status_code != 200:
        print(f&quot;[{category_name}] API 호출 실패: {response.status_code}&quot;)
        return []

    raw_data = response.json()
    product_nodes = extract_product_columns(raw_data)

    # 중복 제거 (상품 id 기준)
    unique_nodes = []
    seen = set()
    for node in product_nodes:
        gno = str(node.get(&quot;id&quot;, &quot;&quot;))
        if gno and gno not in seen:
            seen.add(gno)
            unique_nodes.append(node)

    products_data = []
    for item in unique_nodes[:50]: # 상위 50개만 추출
        gno = str(item.get(&quot;id&quot;, &quot;&quot;))
        brand = get_value_by_keys(item, [&quot;brandName&quot;, &quot;brand_name&quot;, &quot;brand&quot;], default=&quot;&quot;)
        name = get_value_by_keys(item, [&quot;goodsName&quot;, &quot;goods_name&quot;, &quot;productName&quot;, &quot;item_name&quot;, &quot;text&quot;], default=&quot;이름없음&quot;)
        price = get_value_by_keys(item, [&quot;price&quot;, &quot;salePrice&quot;, &quot;item_price&quot;], default=0)
        sale_rate = get_value_by_keys(item, [&quot;saleRate&quot;, &quot;discount_rate&quot;], default=0)
        review_cnt = get_value_by_keys(item, [&quot;reviewCount&quot;, &quot;reviewCnt&quot;, &quot;review_count&quot;], default=50)

        products_data.append({
            &quot;플랫폼&quot;: &quot;무신사&quot;,
            &quot;카테고리&quot;: category_name,
            &quot;goodsNo&quot;: gno,
            &quot;브랜드&quot;: brand,
            &quot;상품명&quot;: name,
            &quot;정가&quot;: price,
            &quot;판매가&quot;: price,
            &quot;할인율(%)&quot;: sale_rate,
            &quot;리뷰수&quot;: review_cnt,
            &quot;리뷰점수&quot;: 0,
            &quot;조회수&quot;: 0,
            &quot;누적판매수&quot;: 0
        })
    return products_data

def fetch_product_stats(goods_no):
    &quot;&quot;&quot;상품의 누적 판매량 및 조회수 수집&quot;&quot;&quot;
    url = f&quot;https://goods-detail.musinsa.com/api2/goods/{goods_no}/stat&quot;
    try:
        r = session.get(url, timeout=5)
        if r.status_code == 200:
            data = r.json().get(&quot;data&quot;, {})
            return data.get(&quot;purchaseTotal&quot;, 0), data.get(&quot;pageViewTotal&quot;, 0)
    except Exception:
        pass
    return 0, 0

def fetch_product_reviews(goods_no, target_count, max_pages=30):
    &quot;&quot;&quot;특정 상품의 리뷰 수집&quot;&quot;&quot;
    reviews = []
    for page in range(max_pages):
        if len(reviews) &amp;gt;= target_count:
            break

        url = &quot;https://goods.musinsa.com/api2/review/v1/view/list&quot;
        params = {
            &quot;page&quot;: page,
            &quot;pageSize&quot;: 10,
            &quot;goodsNo&quot;: goods_no,
            &quot;sort&quot;: &quot;up_cnt_desc&quot;,
            &quot;selectedSimilarNo&quot;: goods_no,
            &quot;myFilter&quot;: &quot;false&quot;,
            &quot;hasPhoto&quot;: &quot;false&quot;,
            &quot;isExperience&quot;: &quot;false&quot;,
        }

        try:
            r = session.get(url, params=params, timeout=10)
            if r.status_code != 200: break

            data = r.json().get(&quot;data&quot;, {})
            review_list = data.get(&quot;list&quot;, [])
            if not review_list: break

            for review in review_list:
                profile = review.get(&quot;userProfileInfo&quot;) or {}
                reviews.append({
                    &quot;goodsNo&quot;: str(goods_no),
                    &quot;리뷰내용&quot;: review.get(&quot;content&quot;, &quot;&quot;),
                    &quot;평점&quot;: int(review.get(&quot;grade&quot;, 0)),
                    &quot;체험단&quot;: review.get(&quot;type&quot;) == &quot;experience&quot;,
                    &quot;사이즈&quot;: review.get(&quot;goodsOption&quot;, &quot;&quot;),
                    &quot;키&quot;: profile.get(&quot;userHeight&quot;, &quot;&quot;),
                    &quot;몸무게&quot;: profile.get(&quot;userWeight&quot;, &quot;&quot;),
                    &quot;성별&quot;: profile.get(&quot;reviewSex&quot;, &quot;&quot;),
                    &quot;작성일&quot;: review.get(&quot;createDate&quot;, &quot;&quot;),
                })
                if len(reviews) &amp;gt;= target_count:
                    break

            if page &amp;gt;= data.get(&quot;page&quot;, {}).get(&quot;totalPages&quot;, 0) - 1:
                break

            time.sleep(0.3)
        except Exception:
            break

    return reviews

# ==========================================
# 3. 메인 실행 블록
# ==========================================
if __name__ == &quot;__main__&quot;:
    CATEGORIES = {&quot;002000&quot;: &quot;아우터&quot;}
    all_products = []

    # [1] 랭킹 상품 수집
    for code, name in CATEGORIES.items():
        products = fetch_ranking_products(code, name)
        all_products.extend(products)
        print(f&quot;[{name}] 랭킹 {len(products)}개 수집 완료&quot;)
        time.sleep(0.5)

    if not all_products:
        print(&quot;\n:rotating_light: 상품 데이터를 찾지 못했습니다. 스크립트를 종료합니다.&quot;)
        sys.exit()

    df_products = pd.DataFrame(all_products)
    print(f&quot;\n:white_check_mark: 상품 총 {len(df_products)}개 수집 성공&quot;)
    print(&quot;-&quot; * 50)

    # [2] 상품별 통계 및 리뷰 수집
    all_reviews = []
    total_items = len(df_products)

    for idx, row in df_products.iterrows():
        goods_no = str(row[&quot;goodsNo&quot;])
        target_count = int(row[&quot;리뷰수&quot;]) if pd.notna(row[&quot;리뷰수&quot;]) else 50
        current = idx + 1

        # 통계 수집
        sales, views = fetch_product_stats(goods_no)
        df_products.at[idx, '누적판매수'] = sales
        df_products.at[idx, '조회수'] = views

        if not goods_no or target_count == 0:
            print(f&quot;[{current}/{total_items}] [스킵] 상품번호: {goods_no}&quot;)
            continue

        print(f&quot;[{current}/{total_items}] 수집중: [{row['브랜드']}] {str(row['상품명'])[:20]} (판매: {sales})&quot;)

        # 리뷰 수집
        reviews = fetch_product_reviews(goods_no, target_count)
        print(f&quot;  &amp;rarr; 리뷰 {len(reviews)}개 완료&quot;)
        all_reviews.extend(reviews)

        time.sleep(0.3) 

    # [3] 데이터 병합 및 저장
    df_reviews = pd.DataFrame(all_reviews)
    print(f&quot;\n:white_check_mark: 리뷰 총 {len(df_reviews)}개 수집 완료!&quot;)

    if not df_reviews.empty:
        df_merged = df_products.merge(df_reviews, on=&quot;goodsNo&quot;, how=&quot;left&quot;)

        df_merged.to_csv(&quot;musinsa_merged.csv&quot;, index=False, encoding=&quot;utf-8-sig&quot;)
        df_reviews.to_csv(&quot;musinsa_reviews.csv&quot;, index=False, encoding=&quot;utf-8-sig&quot;)
        df_products.to_csv(&quot;musinsa_products.csv&quot;, index=False, encoding=&quot;utf-8-sig&quot;)

        print(&quot;\n:tada: 모든 데이터 병합 및 CSV 파일 저장 완료!&quot;)
    else:
        df_products.to_csv(&quot;musinsa_products.csv&quot;, index=False, encoding=&quot;utf-8-sig&quot;)
        print(&quot;\n:warning: 수집된 리뷰가 없어 상품 데이터만 저장했습니다.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 이렇게 무신사의 아우터 카테고리의 실시간 랭킹 상품 Top50에 대해서 크롤링을 해보니&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6VD6t/dJMcaaLHw4V/ZudZcsiPvNJAXkk5toA3Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6VD6t/dJMcaaLHw4V/ZudZcsiPvNJAXkk5toA3Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6VD6t/dJMcaaLHw4V/ZudZcsiPvNJAXkk5toA3Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6VD6t%2FdJMcaaLHw4V%2FZudZcsiPvNJAXkk5toA3Wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;656&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 50개 중 6개의 상품만 누적판매수 정보가 없음을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 실시간 정보이고 꾸준히 바뀌겠지만, 상위 랭킹에 있는 상품들은 비교적 누적판매수 정보가 많이 포함이 되어있는 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내일은, 다른 카테고리와 조회기간을 픽스해서 제대로 크롤링을 마쳐볼 계획이다.&lt;/p&gt;</description>
      <author>msoo5880</author>
      <guid isPermaLink="true">https://msoo5880.tistory.com/55</guid>
      <comments>https://msoo5880.tistory.com/55#entry55comment</comments>
      <pubDate>Mon, 13 Apr 2026 22:39:35 +0900</pubDate>
    </item>
    <item>
      <title>프로젝트 주제 정하기? 데이터셋 찾기?</title>
      <link>https://msoo5880.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;어제 봤던 취업 공고들에서 눈에띄는 키워드 들이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[취업 공고 키워드 정리]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. A/B 테스트 : A안과 B안을 비교하는 대표적인 실험 방법. 대조군(통제군)과 실험군을 두고, 특정 변수 한 개만 다르게 변화를 주어 그 변수에 대한 효과를 측정하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. RFM : 고객의 구매 행동인 최근성(Recency), 구매 빈도(Frequency), 구매 금액(Monetary)을 기준으로 고객 가치를 평가하고 세분화하는 마케팅 분석 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 코호트 분석 : 고객을 특정 단위로 쪼개서 분석하는 방법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rU3vL/dJMcaiJDrTV/XVy6Fhos4eak4IPzSVmQkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rU3vL/dJMcaiJDrTV/XVy6Fhos4eak4IPzSVmQkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rU3vL/dJMcaiJDrTV/XVy6Fhos4eak4IPzSVmQkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrU3vL%2FdJMcaiJDrTV%2FXVy6Fhos4eak4IPzSVmQkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;354&quot; height=&quot;788&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;788&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 퍼널 분석 : 사용자가 목표 행동을 완료하기까지 거치는 단계(step)을 순서대로 분석하여 각 단계에서 얼마나 이탈(drop-off)하는지 파악하는 분석 방법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qIUuV/dJMcaaLEwxl/pxUaip1tGYkcDgK29Nznu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qIUuV/dJMcaaLEwxl/pxUaip1tGYkcDgK29Nznu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qIUuV/dJMcaaLEwxl/pxUaip1tGYkcDgK29Nznu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqIUuV%2FdJMcaaLEwxl%2FpxUaip1tGYkcDgK29Nznu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;589&quot; height=&quot;316&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. AARRR : 모바일 서비스를 관통하는 핵심 개념. Acquisition(사용자 획득), Activation(활성화), Retention(유지/재방문), Revenue(수익화), Referral(추천)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 키워드들을 토대로 주제를 생각하던 중 막막함을 느꼈고, 의문이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[주제 선정을 위한 서칭중 든 의문점]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. A/B 테스트, 퍼널분석, 코호트 분석, AARRR 등 공통적으로 요구되는 분석들이 있는데 이러한 것들을 과연 진행할 수 있는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 국내 데이터셋을 사용하고싶은데 과연 우리가 접근할 수 있을 것인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 남들과 다른 차별성을 가진 프로젝트를 진행하고싶은데 해당 도메인과 데이터셋들로 가능할 것인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[해결방안]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 우선은 A/B 테스트, 퍼널 분석, 코호트 분석, AARRR등 분석방법을 정해두기 보다는 팀이 어떤 문제를 해결하고 싶은지를 먼저 잡는게 더 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 우리가 구할 수 있는 데이터로 어떤 분석이 가능한가를 먼저 보는게 더 현실적.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현실적으로는 공개 데이터 / 공개 웹에서 수집 가능한 비개인정보 데이터 / 해외 오픈 dataset + 국내 시장 해석. 이런 세 가지 방향 중 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 차별성은 데이터셋 자체 보다 누구의 어떤 의사결정을 돕는지 / 문제 정의가 얼마나 구체적인지 / 분석 결과를 어떤 액션으로 연결했는지에서 훨씬 크게 갈린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 어떤 카테고리의 상품을 우선 운영해야 하는지 / 어떤 연령 및 성별 타겟에 어떤 상품군을 먼저 노출해야 하는지 / 재구매 가능성이 높은 고객군은 누구인지 / 이탈 가능성이 높은 고객군에게 어떤 메시지를 써야 하는지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하자면, 당장의 프로세스를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 누구의 의사결정을 돕는 프로젝트인지 정하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 어떤 문제를 풀 것인지 정하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 문제를 풀 수 있는 데이터가 있는지 확인하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 분석 방법을 붙이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순으로 진행하면 좋겠다고 판단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀원들 모두 동의했고, 일단 모두 패션관련 데이터셋들을 찾아보기로 했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 공개 API를 통해서 크롤링을 진행해보았다. 이전에 실습에서 네이버 검색 api를 통해서 진행 해봤었기 때문에, 네이버 쇼핑 api를 통해서 간단하게 진행해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진행할 수 있는 레퍼런스들은 많았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Csb53/dJMcabDNwIH/6e0UYJ6KMXWqpYIlk9KUZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Csb53/dJMcabDNwIH/6e0UYJ6KMXWqpYIlk9KUZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Csb53/dJMcabDNwIH/6e0UYJ6KMXWqpYIlk9KUZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCsb53%2FdJMcabDNwIH%2F6e0UYJ6KMXWqpYIlk9KUZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;308&quot; height=&quot;495&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 가장 위의 쇼핑인사이트 분야별 트렌드 조회를 크롤링 하면서 감을 익히려 했다.&lt;/p&gt;
&lt;pre id=&quot;code_1775738591386&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from pprint import pprint #딕셔너리를 보기좋게 하는 라이브러리

# API 요청 URL
service_url = 'https://openapi.naver.com/v1/datalab/shopping/categories'

headers={
    'X-Naver-Client-Id' : client_id,
    'X-Naver-Client-Secret' : client_secret
}

body = {
    'startDate': '2025-01-01',
    'endDate': '2025-12-31',
    'timeUnit': 'month', # day, week, month
    'category': [
        {'name': '여성의류', 'param': ['50000167']},  # 1번째 카테고리
        {'name': '남성의류', 'param': ['50000169']}, # 2번째 카테고리
        {'name': '패션잡화', 'param': ['50000001']}  # 3번째 카테고리
    ],
    'device': '',
    'gender': '',
    'ages': []
}

response = requests.post(
    service_url,
    headers=headers,
    json=body
)

# print(response.status_code) # 응답 코드 출력

shopping_results = [] 
if response.status_code == 200:
    result = response.json() # json 형태의 응답 텍스트 결과를 딕셔너리로 반환
    pprint(result)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이까지만 진행을 했을 때의 결과가 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1775738630276&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{'endDate': '2025-12-31',
 'results': [{'category': ['50000167'],
              'data': [{'period': '2025-01-01', 'ratio': 71.47497},
                       {'period': '2025-02-01', 'ratio': 64.61226},
                       {'period': '2025-03-01', 'ratio': 76.76955},
                       {'period': '2025-04-01', 'ratio': 74.12554},
                       {'period': '2025-05-01', 'ratio': 70.27673},
                       {'period': '2025-06-01', 'ratio': 66.15099},
                       {'period': '2025-07-01', 'ratio': 61.22641},
                       {'period': '2025-08-01', 'ratio': 36.10964},
                       {'period': '2025-09-01', 'ratio': 38.05684},
                       {'period': '2025-10-01', 'ratio': 46.85505},
                       {'period': '2025-11-01', 'ratio': 51.55804},
                       {'period': '2025-12-01', 'ratio': 46.96579}],
              'title': '여성의류'},
             {'category': ['50000169'],
              'data': [{'period': '2025-01-01', 'ratio': 36.20601},
                       {'period': '2025-02-01', 'ratio': 31.23253},
                       {'period': '2025-03-01', 'ratio': 37.70146},
                       {'period': '2025-04-01', 'ratio': 35.55807},
                       {'period': '2025-05-01', 'ratio': 32.46524},
                       {'period': '2025-06-01', 'ratio': 28.20887},
                       {'period': '2025-07-01', 'ratio': 25.08116},
                       {'period': '2025-08-01', 'ratio': 15.88451},
                       {'period': '2025-09-01', 'ratio': 18.78175},
                       {'period': '2025-10-01', 'ratio': 27.14426},
                       {'period': '2025-11-01', 'ratio': 28.2326},
                       {'period': '2025-12-01', 'ratio': 23.60732}],
              'title': '남성의류'},
             {'category': ['50000001'],
              'data': [{'period': '2025-01-01', 'ratio': 91.87743},
                       {'period': '2025-02-01', 'ratio': 90.55038},
                       {'period': '2025-03-01', 'ratio': 99.58413},
                       {'period': '2025-04-01', 'ratio': 99.93379},
                       {'period': '2025-05-01', 'ratio': 100},
                       {'period': '2025-06-01', 'ratio': 98.11807},
                       {'period': '2025-07-01', 'ratio': 93.46096},
                       {'period': '2025-08-01', 'ratio': 69.17017},
                       {'period': '2025-09-01', 'ratio': 62.60968},
                       {'period': '2025-10-01', 'ratio': 60.94504},
                       {'period': '2025-11-01', 'ratio': 56.79026},
                       {'period': '2025-12-01', 'ratio': 57.5468}],
              'title': '패션잡화'}],
 'startDate': '2025-01-01',
 'timeUnit': 'month'}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실질적으로 알 수 있는건 구간별 클릭량의 상대적 비율(ratio)밖에 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연령과 성별, 기기에 대해서 차이를 볼 수는 있겠지만 전체적인 데이터셋으로 보기에는 조금 아쉬운 감이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 쇼핑인사이트 API 레퍼런스도 비슷해서 일단은 네이버 쇼핑은 여기까지 보고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내일 본격적으로 다른 데이터셋을 많이 찾아봐야겠다.&lt;/p&gt;</description>
      <category>최종프로젝트</category>
      <author>msoo5880</author>
      <guid isPermaLink="true">https://msoo5880.tistory.com/54</guid>
      <comments>https://msoo5880.tistory.com/54#entry54comment</comments>
      <pubDate>Thu, 9 Apr 2026 21:51:35 +0900</pubDate>
    </item>
    <item>
      <title>최종프로젝트 발제</title>
      <link>https://msoo5880.tistory.com/53</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;최종 프로젝트 도메인 : 이커머스(패션)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[튜터님의 3가지 조언]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 원하는 회사 5-10개를 먼저 조사 후, &lt;span style=&quot;color: #ee2323;&quot;&gt;취업공고에 맞는 프로젝트를 진행&lt;/span&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. (선택사항) SQL로 데이터를 추출/변환/분석을 뽑는다는 공고가 많다. SQL로 분석용 테이블을 만들어서 파이썬으로 2차분석한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. AI의 사용은 좋다만, &lt;span style=&quot;color: #ee2323;&quot;&gt;AI의 오류 및 본인의 시행착오를 기록&lt;/span&gt;하라.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[오늘 한 일] : 취업 공고 서칭&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;크림(KREAM) 데이터 분석가 공고 (경력 3-10년)(상시채용)&amp;nbsp;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wanted.co.kr/wd/346919&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.wanted.co.kr/wd/346919&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;세가지 도메인에 걸쳐 진행됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;서비스 도메인&lt;/b&gt; : 탐색, PLP, PDP, 스타일 등 KREAM 서비스 전반의 사용자 경험을 다루는 Product 팀과 함께 일함. 사용자가 어떻게 아이템을 발견하고, 어떤 경로로 구매 의사결정에 이르는지를 분석한다. ※ PLP (Product Listing Page) : 상품 목록 페이지. 카테고리나 검색 결과에서 여러 상품을 한 눈에 보여주는 페이지. ※ PDP (Product Detail Page) : 상품 상세 페이지. 특정 상품의 이미지, 가격, 후기 등 상세 정보를 보여주는 페이지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장바구니/주문/결제 도메인&lt;/b&gt; : 구매 퍼널 전반을 다루는 Product 팀과 함께 일함. 전환율 최적화부터 정산, 포인트 등 거래 완결과 관련된 데이터를 분석한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;셀러 도메인&lt;/b&gt; : 셀러 비즈니스 팀과 메인으로 일하고 셀러/파트너 Product 팀과 협업하는 구조로 업무를 진행함. 셀러의 행동 패턴과 성과를 분석하고, 셀러 관련 비즈니스 의사결정을 데이터로 지원한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주요 업무&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;분석 과제 정의 및 인사이트 도출&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;팀이 풀어야 할 문제를 데이터 분석 과제로 직접 정의하고, 인사이트를 행동으로 연결&lt;/li&gt;
&lt;li&gt;소속 도메인의 핵심 지표 모니터링 및 변화 원인 분석&lt;/li&gt;
&lt;li&gt;분석 결과를 PM, 비즈니스, 운영팀 누구나 이해할 수 있도록 구조화하여 전달&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실험 설계 및 운영&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;A/B 테스트 설계, 결과 분석, 의사결정까지 전 과정 주도&lt;/li&gt;
&lt;li&gt;지표와 가설을 설정하고, 실험 결과를 올바르게 해석하여 액션 아이템 제안&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 환경 기여&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;도메인 핵심 지표 정의 및 대시보드 구축으로 팀 전체의 데이터 접근성 향상&lt;/li&gt;
&lt;li&gt;이벤트 설계 및 로그 품질 검증에 참여하여 신뢰할 수 있는 데이터 환경 유지&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자격요건&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;분석 사고 및 문제 정의&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;비즈니스 문제를 데이터 분석 과제로 직접 정의하고, 다양한 가설을 입체적으로 사고하는 능력&lt;/li&gt;
&lt;li&gt;단일 지표가 아니라 사용자와 비즈니스를 다차원으로 세분화하여 바라보는 분석적 사고 (RFM, 코호트, 퍼널, AARRR 등 다양한 프레임을 상황에 맞게 적용한 경험)&lt;/li&gt;
&lt;li&gt;숫자를 통해 현상의 원인을 논리적으로 추론하고, 결과를 구조화하여 전달하는 능력&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기술 역량&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;SQL 기반 데이터 추출 및 분석 능력 (복잡한 쿼리를 스스로 작성하고 검증할 수 있는 수준)&lt;/li&gt;
&lt;li&gt;웹/앱 로그 수준의 데이터를 가공하여 분석 결과까지 도출할 수 있는 전체 분석 프로세스 경험&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실험 및 의사결정&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;A/B 테스트 설계, 결과 해석, 액션 아이템 도출까지 전 과정을 주도한 경험&lt;/li&gt;
&lt;li&gt;분석 결과를 PM, 비즈니스, 운영팀 누구나 이해할 수 있도록 구조화하여 전달하고 의사결정에 실질적으로 영향을 준 경험&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비즈니스 이해&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이커머스, 마켓플레이스, 또는 플랫폼 비즈니스에서의 데이터 분석 경험&lt;/li&gt;
&lt;li&gt;팀의 목표가 지표로 체계화될 수 있도록 핵심 지표를 정의하고 모니터링한 경험&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;에이블리코퍼레이션(ABLY) 데이터 분석가 공고 (신입 이상) (상시채용)
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wanted.co.kr/wd/262250&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.wanted.co.kr/wd/262250&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;포지션 상세&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;가드레일 문제
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;가드레일 지표&lt;/b&gt; : A/B 테스트를 할 때, 실험 결과에서 반드시 유지해야하는 핵심 지표&lt;/li&gt;
&lt;li&gt;(이전 도입) &lt;b&gt;열등성 검정&lt;/b&gt; : 빠른 변화와 액션을 위해서 유의미하게 하락하지 않은 지표는 가드레일 통과라고 간주하는 방법 &amp;rarr; 지표의 작은 하락 가능성에도 기대 손실이 증가하는 문제가 발생. 따라서, 가드레일 지표 설정의 필요성이 제기됨.&lt;/li&gt;
&lt;li&gt;(현재 도입) &lt;b&gt;비열등성 검정&lt;/b&gt; : **정해진 마진(NIM,Non-Inferiority Margin)**까지 매출이나 구매 비율 등 지표의 하락 가능성이 없다면 가드레일을 통과한 것으로 판단하는 방법 &amp;rarr; 한 피처에서 발생할 수 있는 손실 가능성의 기준이 될 NIM 설정에 대해 고심 중(실험기간, 분석대상을 트리거링하는 조건, 기존 실험 중 가드레일 지표의 평균적인 상승률, 표준편차 등) &amp;rarr; 지표를 보수적으로 잡는 것은 경계(가드레일 지표가 제 기능을 상실하고 &amp;lsquo;끌어올려야 하는 지표&amp;rsquo;로 의미가 변질되는 문제 발생)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;기여(Attribution) 문제
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;(이전 도입) &lt;b&gt;라스트 터치(Last-Touch Attribution)&lt;/b&gt; : (장바구니, 찜 등을 제외한) 가장 마지막으로 노출된 지면을 기준으로 기여를 할당하는 방식&lt;/li&gt;
&lt;li&gt;(현재 도입) 다양한 기여 방식 : 특정 기간 동안 기여한 모든 지면을 기록하여 분석 목적에 맞게 다양한 기여 방식을 설정할 수 있도록 개선함. &lt;b&gt;퍼스트 터치(First-Touch Attribution), 라스트 터치(Last-Touch Attribution), 멀티 터치(Multi-Touch Attribution)&lt;/b&gt; 등 &amp;rarr; 보편적인 기여 규칙 및 가이드 방법에 대한 지속적 논의가 이루어지고 있음.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;고객 세그먼트/타이밍/혜택 구조를 요인 분석하여 핵심 인사이트를 도출&lt;/li&gt;
&lt;li&gt;일본 플랫폼에서 발생한 주문 취소의 원인을 가설 기반으로 분석하고, 우선순위를 정해 취소율을 줄여나간다.&lt;/li&gt;
&lt;li&gt;여러 실험 결과를 바탕으로 신규 기능의 단계별 출시 여부를 결정하고, 롤아웃 후 지표 변화를 모니터링 한다. &lt;br /&gt;※ 롤아웃 : 발표, 생산, 출시&lt;/li&gt;
&lt;li&gt;예산 시뮬레이션 툴을 통해 &amp;ldquo;리소스 10% 재배분 시 예상 매출 X%&amp;rdquo;와 같은 구체적 의사결정 근거를 마련한다.&lt;/li&gt;
&lt;li&gt;전사 마케팅 데이터를 수집하고 데이터를 대표할 매트릭을 만든다. 이를통해 전사 마케팅 예산을 최적화하는 분배안을 고민한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주요업무&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;여러 액션(실험, 사업 전략, 프로모션 등)의 효과성을 데이터로 검증, 도출한 인사이트를 실행 가능한 태스크로 구체화.&lt;/li&gt;
&lt;li&gt;다양한 영역(패션, 라이프스타일, 뷰티, 콘텐츠 등)에서 성장 기회를 발굴하고, A/B 테스트 중심으로 임팩트를 측정.&lt;/li&gt;
&lt;li&gt;빠르고 일관된 의사결정을 위해 스쿼드에서 활용가능한 지표 성과 체계 등을 설계. &lt;br /&gt;※ 스쿼드 : 사업 과제를 중심으로 형성된 목적 조직(에이블리 데이터 분석가는 하나의 [스쿼드]와 데이터 분석 [챕터]에 소속)&lt;/li&gt;
&lt;li&gt;비즈니스 상황을 다면적으로 해석 및 시각화하여 구성원이 다양한 시각에서 문제 해결 방법을 논의할 수 있도록 지원.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자격요건&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;에이블리 조직문화에 공감하여, One Team으로 GRIT하게 일하며 Impact를 만들어갈 의지가 있는 분 &lt;br /&gt;※ GRIT : 목표를 향한 열정과 끈기를 의미하는 심리학 용어&lt;/li&gt;
&lt;li&gt;데이터 정제, 문제 정의, 인사이트 도출 및 액션 아이템 제시까지 데이터 분석의 전반을 경험한 분&lt;/li&gt;
&lt;li&gt;SQL과 Python을 활용해 복잡한 데이터를 손쉽게 추출 및 가공이 가능한 분&lt;/li&gt;
&lt;li&gt;다양한 직군의 동료가 복잡한 분석 결과를 쉽게 이해 및 활용할 수 있도록 명확하게 의사소통할 수 있는 분&lt;/li&gt;
&lt;li&gt;실험 설계 (A/B 테스트 등)와 지표에 대한 고민이 깊고, 의사결정 시스템을 설계 및 고도화해본 분&lt;/li&gt;
&lt;li&gt;커머스 및 플랫폼 데이터에 대한 이해도가 높은 분&lt;/li&gt;
&lt;li&gt;새로운 기술 및 툴 도입에 적극적이며, 팀의 생산성을 높이는 방법을 지속적으로 탐구할 수 있는 분&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;마켓컬리 상품마케팅 분석 담당자 공고 (경력1년이상) (상시채용)
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://offercent.co.kr/jd/191666?from=list&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://offercent.co.kr/jd/191666?from=list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;담당 업무&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;커머스 및 마케팅 캠페인 활동의 성과 분석을 수행하고, 데이터 기반 의사결정 지원을 위한 인사이트 제공&lt;/li&gt;
&lt;li&gt;커머스 및 마케팅 대시보드 설계 및 유지보수&lt;/li&gt;
&lt;li&gt;고객 세분화 및 타겟팅을 위한 데이터 모델링 및 분석&lt;/li&gt;
&lt;li&gt;시장 트렌드 및 고객 행동 데이터를 활용한 예측 분석 및 트렌드 파악&lt;/li&gt;
&lt;li&gt;A/B 테스트 설계 및 경영진의 의사결정을 지원하기 위한 모니터링 대시보드 개발, 구축, 유지&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자격 요건&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;SQL 사용이 능숙하며, 이를 바탕으로 대시보드 구축 및 In-depth 분석 업무를 수행한 경험이 있는 분 &lt;br /&gt;※ In-depth 분석 : 데이터나 주제의 단순 표면적 수치를 넘어 &amp;lsquo;왜(why)&amp;rsquo; 발생했는지 원인을 탐구하는 조사 기법&lt;/li&gt;
&lt;li&gt;데이터 마트 구축 및 운영 경험이 있으며, 분석 목적에 맞춘 데이터 모델링이 가능하신 분&lt;/li&gt;
&lt;li&gt;고객, 주문 데이터 분석 경험이 있으신 분 (코호트, LTV, 리텐션 분석 등)&lt;/li&gt;
&lt;li&gt;시각화 도구 활용이 능숙하신 분 (Redash, Tabuleau, Power BI, Looker Studio 등)&lt;/li&gt;
&lt;li&gt;데이터 기반의 의사결정과 문제해결 능력을 보유한 분&lt;/li&gt;
&lt;li&gt;분석 결과 및 인사이트를 협업 조직에 명확하고 설득력 있게 전달할 수 있는 분&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우대 사항&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이커머스 / IT 환경에서 비즈니스 데이터 분석 경험이 있으신 분&lt;/li&gt;
&lt;li&gt;업무 및 데이터 분석 자동화 능력이 있으신 분&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;버킷플레이스(오늘의집) 데이터 분석가 (신입) (지원마감)
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wanted.co.kr/wd/57436&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.wanted.co.kr/wd/57436&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;주요업무&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;판매 데이터에 기록되어 있는 유저의 행동 및 상품의 성과를 집계하여 시사점 도출&lt;/li&gt;
&lt;li&gt;프로덕트 개선 및 비즈니스 모멘텀 발견을 위한 가설을 검증하는 AB 테스트 설계 및 실험 운영&lt;/li&gt;
&lt;li&gt;커머스 트랙 주요 지표 및 ad-hoc 데이터 추출&lt;/li&gt;
&lt;li&gt;반복적으로 요청이 오는 데이터의 대시보드화&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자격요건&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;SQL을 활용하여 데이터를 원하는 결과물로 가공할 수 있는 분&lt;/li&gt;
&lt;li&gt;데이터를 통해 가설을 수립하고 이를 검증하는 방법을 설계할 수 있는 분&lt;/li&gt;
&lt;li&gt;데이터 분석 결과를 비전공자들이 이해할 수 있는 방식으로 전달 가능한 분&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우대사항&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Python, Scala로 데이터 가공이 가능하신 분&lt;/li&gt;
&lt;li&gt;데이터 시각화 툴에 대한 이해 및 경험을 보유하신 분 (태블로, 구글데이터스튜디오, 퀵사이트, 리대쉬 등)&lt;/li&gt;
&lt;li&gt;스파크, 제플린 노트북 등의 인프라 활용 경험을 보유하신 분&lt;/li&gt;
&lt;li&gt;IT플랫폼 / 이커머스 / 홈퍼니싱 &amp;middot; 인테리어 / 스타트업을 경험하신 분&lt;/li&gt;
&lt;li&gt;컴퓨터공학, 수리통계학 등 데이터모델링과 직접 관련된 전공자&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;딜리셔스(신상마켓) 데이터 분석가 (경력 5년이상) (지원마감)
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wanted.co.kr/wd/312709&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.wanted.co.kr/wd/312709&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;주요업무&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;주요 이슈에 대한 가설을 세우고 실험 및 검증을 통한 개선 실행안 도출&lt;/li&gt;
&lt;li&gt;사용자 데이터 분석을 통해 의사결정을 지원하고 인사이트를 도출&lt;/li&gt;
&lt;li&gt;데이터를 이용해 서비스에 적합한 소프트웨어 로직 만들기&lt;/li&gt;
&lt;li&gt;분석에 필요한 데이터 마트를 적재하고 관리하기&lt;/li&gt;
&lt;li&gt;Python을 이용하여 업무 자동화 워크플로우를 만들고, 슬랙봇을 제작&lt;/li&gt;
&lt;li&gt;사업 및 프로덕트의 핵심 지표를 정의/측정하고 리포팅 및 시각화하여 관리&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자격요건&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;5년 이상의 데이터 분석 경험 또는 유관 역량을 보유하신 분&lt;/li&gt;
&lt;li&gt;Python, SQL을 이용한 데이터 추출 및 정제가 능숙하신 분&lt;/li&gt;
&lt;li&gt;Airflow, Jenkins 등의 Job Scheduling Tool을 이용하여 데이터 적재 경험이 있으신 분&lt;/li&gt;
&lt;li&gt;Tableau, Redash 등을 이용해 대시보드 시각화 능력이 있으신 분&lt;/li&gt;
&lt;li&gt;알고리즘을 활용한 예측 분석/통계 모델링을 해본 경험이 있으신 분&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우대사항&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;데이터 분석 방법론(Funnel, Cohort, AARRR)에 대한 이해와 관련 실무 경험이 있으신 분&lt;/li&gt;
&lt;li&gt;패션 및 리테일 업계 데이터를 분석한 경험이 있으신 분&lt;/li&gt;
&lt;li&gt;가설을 세워 A/B 테스트를 설계하고 검증하며 지속적해서 개선해 나간 경험이나 지식이 있는 분&lt;/li&gt;
&lt;li&gt;조직 내에서 데이터를 기반으로 전략을 제안하고 실행에 옮겨 임팩트를 낸 경험이 있으신 분&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[내일 할 일] : &lt;/b&gt;주제 선정 브레인스토밍을 위해 &lt;b&gt;프로젝트 주제 생각하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>최종프로젝트</category>
      <author>msoo5880</author>
      <guid isPermaLink="true">https://msoo5880.tistory.com/53</guid>
      <comments>https://msoo5880.tistory.com/53#entry53comment</comments>
      <pubDate>Wed, 8 Apr 2026 21:44:32 +0900</pubDate>
    </item>
    <item>
      <title>태블로 강의</title>
      <link>https://msoo5880.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;태블로 Prep을 활용하면 SQL이나 python에서 진행한 전처리를 시각적으로 진행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Union이나 Join같은 처리도 가능하며, 필드 제거나 추출도 되게 편한 방법으로 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 실습을 진행하면서 들었던 의문점은 &quot;지금은 적은 파일 수와 적은 컬럼과 데이터 행 수로 인해서 시각적인 전처리가 편하게 느껴지지만, 만약 파일이 엄청 많으면서 각각의 파일의 컬럼과 행 수가 크면 그때도 과연 편하다고 할 수 있을까?&quot;였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실히는 모르겠지만, 만약 Tableau가 전처리가 너무 좋고 끝판왕이라면 아마 SQL과 Python에서의 전처리를 먼저 배우지 않았을 것 같다. 각각의 장단점이 있는 것이고, 데이터 분석가로서 방점이라고도 할 수 있는 설득력 높은 시각화자료를 만드는 Tableau를 잘 이용 해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tableau는 프로그램, 즉 시각화 툴이다 보니까, 각각의 설명을 적기는 애매했고, 다만 진행을 하면서 모르는 것들은 AI나 서칭을 통해서 알아내면 될 것 같았고, Tableau를 사용할 때 제일 중요한 것은 결국 사용자의 큰 틀을 잘 설정해야 하는 것 같다.&lt;/p&gt;</description>
      <author>msoo5880</author>
      <guid isPermaLink="true">https://msoo5880.tistory.com/52</guid>
      <comments>https://msoo5880.tistory.com/52#entry52comment</comments>
      <pubDate>Tue, 17 Mar 2026 21:16:15 +0900</pubDate>
    </item>
    <item>
      <title>데이터 수집을 위한 API 및 크롤링 3회차</title>
      <link>https://msoo5880.tistory.com/51</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 요청 헤더에는 꼭 필요한 정보만 넣는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 제외해야 할 헤더&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. :(클론)으로 시작하는 헤더&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Content-Length&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 제외 가능 : Accept-Encoding, Connection, Host&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필수 헤더&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Cookie (별도로 관리해야 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. User-Agent, Referer, Content-Type (필수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Origin, X-Requested-With, Accept&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TLS핑거프린트란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;봇 차단 3단계 방어벽&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차 방어 : TLS 핑거프린트 검증 &amp;larr; 가장 먼저(연결 단계)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차 방어 : HTTP 헤더 검증 &amp;larr; 그 다음(요청 단계)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3차 방어 : 쿠키 / 세션 / 행동 패턴 &amp;larr; 마지막(응답 단계)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해결방법 : curl_cffi 라이브러리 (브라우저로 위장)&lt;/p&gt;</description>
      <author>msoo5880</author>
      <guid isPermaLink="true">https://msoo5880.tistory.com/51</guid>
      <comments>https://msoo5880.tistory.com/51#entry51comment</comments>
      <pubDate>Mon, 16 Mar 2026 21:21:53 +0900</pubDate>
    </item>
    <item>
      <title>공공 API를 통한 데이터 수집</title>
      <link>https://msoo5880.tistory.com/49</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;공공 API를 통한 데이터 수집&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API(Application Programming Interface)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버와 클라이언트 간 데이터를 주고받는 표준화된 방법을 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HTTP(Hyper Text Transfer Protocol)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터넷 환경에서 정보를 주고받기 위한 규칙&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTTP 요청 메소드&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;GET : 정보를 가져올 때&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;POST : 새로운 정보를 생성할 때&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PUT/PATCH : 정보를 수정할 때&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DELETE : 정보를 삭제할 때&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;HTTP 요청 구조
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;요청 라인(Request Line)&lt;/li&gt;
&lt;li&gt;일반 헤더(General Header)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;요청 헤더(Request Header)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;역할 : 요청에 대한 추가 정보 및 클라이언트 정보 제공&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;엔티티 헤더(Entity Header)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;본문(Body)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;역할 : 서버로 전송할 실제 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;HTTP 응답 구조
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;상태 라인(Status Line)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;구성 요소: HTTP 버전 + &lt;b&gt;응답코드 + 상태 메시지&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;일반 헤더(General Header)&lt;/li&gt;
&lt;li&gt;응답 헤더(Response Header)&lt;/li&gt;
&lt;li&gt;엔티티 헤더(Entity Header)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;본문(Body)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;역할 : 서버가 클라이언트에게 반환하는 실제 데이터&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;HTTP의 요청 헤더
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Host : &lt;b&gt;요청이 전송되는 타겟의 host URL 주소&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예시 : Host: www.example.com&lt;/li&gt;
&lt;li&gt;활용 : 요청을 보내는 대상 서버의 도메인 이름이나 IP 주소를 지정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;User-Agent : 요청을 보내는 클라이언트의 정보
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예시 : User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0.4472.124 Safari/537.36&lt;/li&gt;
&lt;li&gt;활용 : &lt;b&gt;서버는 이 정보를 통해 기기나 브라우저에 최적화된 콘텐츠를 제공할 수 있다. 모바일 기기인지 데스크톱인지 구분할 때도 사용된다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Authorization
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예시 : Authorization: Bearer eyJhbGci0iJIUzI1NiIsInR5cCI6IkpXVCJ9...&lt;/li&gt;
&lt;li&gt;활용 : API 사용 시 &lt;b&gt;인증 정보를 전달할 때 사용&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cookie
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예시 : Cookie: session_id=abc123; user_preference=dark_mode&lt;/li&gt;
&lt;li&gt;활용 : &lt;b&gt;로그인 상태 유지, 사용자 설정 기억, 장바구니 정보 등 세션 관리에 사용&lt;/b&gt;된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;HTTP 주요 응답 코드
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;200번대 : 성공(초록불)&lt;/li&gt;
&lt;li&gt;400번대 : 클라이언트 측 문제(노란불)&lt;/li&gt;
&lt;li&gt;500번대 : 서버 측 문제(빨간불)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;REST API
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터넷에서 정보를 주고받는 가장 인기있는 방식&lt;/li&gt;
&lt;li&gt;HTTP 프로토콜을 기반으로 동작&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;자원(Resource)을 URL로 표현하고, HTTP 메서드로 자원에 대한 행위를 정의하는 방식이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;URL 기본 구조 : &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;프로토콜://호스트:포트/경로?쿼리스트링&lt;/span&gt;&lt;/b&gt;&lt;/span&gt; ex) &lt;a href=&quot;http://www.domain.com:1234/path/to/resource?a=b&amp;amp;x=y&quot;&gt;http://www.domain.com:1234/path/to/resource?a=b&amp;amp;x=y&lt;/a&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;프로토콜 :&lt;/b&gt; 통신 규칙&lt;/li&gt;
&lt;li&gt;&lt;b&gt;호스트(Host) :&amp;nbsp;&lt;/b&gt;도메인 이름 또는 IP 주소&lt;/li&gt;
&lt;li&gt;&lt;b&gt;포트(Port) : &lt;/b&gt;서비스 접속 번호(생략 가능, HTTP는 80, HTTPS는 443)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;경로(Path) :&amp;nbsp;&lt;/b&gt;자원의 위치를 나타내는 문자열&lt;/li&gt;
&lt;li&gt;&lt;b&gt;쿼리 스트링(Query String) :&amp;nbsp;&lt;/b&gt;자원에 대한 추가 정보 필터링(검색어 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;REST API의 HTTP 메서드별 역할
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GET : 자원 조회 (읽기 전용, 안전한 작업)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;POST : 자원 생성 (서버에 새 데이터 제출, 종종 데이터 수집에서도 활용됨)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;PUT : 자원 전체 수정 (지정된 자원의 모든 데이터 변경)&lt;/li&gt;
&lt;li&gt;PATCH : 자원 부분 수정 (지정된 자원의 일부 데이터 변경)&lt;/li&gt;
&lt;li&gt;DELETE : 자원 삭제 (지정된 자원 제거)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;API, REST API, HTTP 프로토콜 간 관계 : API 안에 REST API가 있고, REST API는 HTTP 프로토콜로 통신한다!
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API는 &quot;무엇을 할 수 있는가&quot; (기능 인터페이스)&lt;/li&gt;
&lt;li&gt;HTTP는 &quot;어떻게 주고 받는가&quot; (통신 규칙)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;오픈 API를 통해 데이터를 수집할 때!
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;API 이용 준비
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API 키 발급&lt;/li&gt;
&lt;li&gt;&lt;b&gt;API 문서를 숙지&lt;/b&gt;하라! : API 사용 방법을 파악해야 함&lt;/li&gt;
&lt;li&gt;사용 제한 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;API 호출 및 데이터 수집
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 요청 테스트&lt;/li&gt;
&lt;li&gt;본격적 데이터 수집&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터 처리 및 저장
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응답 데이터 파싱 및 정제, 검증
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;응답 데이터 파싱 : 응답 데이터를 객체(딕셔너리/리스트)로 변환&lt;/li&gt;
&lt;li&gt;데이터 추출 및 정제 : 필요한 필드만 선택, 형식 통일&lt;/li&gt;
&lt;li&gt;누락값 확인 : 결측 데이터 탐지 및 처리방식 결정 (제거/대체 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터 변환 및 저장
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;수집 목적에 맞게 데이터 구조화(데이터 프레임 등)&lt;/li&gt;
&lt;li&gt;적절한 형식으로 저장 (CSV,JSON,DB 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>msoo5880</author>
      <guid isPermaLink="true">https://msoo5880.tistory.com/49</guid>
      <comments>https://msoo5880.tistory.com/49#entry49comment</comments>
      <pubDate>Thu, 12 Mar 2026 20:30:15 +0900</pubDate>
    </item>
    <item>
      <title>심화프로젝트 전처리 시작</title>
      <link>https://msoo5880.tistory.com/48</link>
      <description>&lt;h1&gt;중복값 확인&lt;/h1&gt;
&lt;pre id=&quot;code_1772539429218&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(f&quot;Order_Items 중복: {df_order_items.duplicated().sum():,}건&quot;)

print(f&quot;Sellers 중복: {df_sellers.duplicated().sum():,}건&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[전체 행 기준]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Order_Items 중복: 0건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sellers 중복: 0건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1772539440547&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(f&quot;Sellers(seller_id): {df_sellers.duplicated(subset='seller_id').sum():,}건&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[ID 기준]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sellers(seller_id) 중복: 0건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ order_item 테이블의 경우 종속테이블이기 때문에 ID 기준으로 처리하지 않았음.&lt;/p&gt;
&lt;h1&gt;데이터 타입 변환&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;order_item 테이블의 &amp;lsquo;shipping_limit_date&amp;rsquo; 컬럼 str&amp;rarr;datetime으로 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772539482759&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df_order_items['shipping_limit_date'] = pd.to_datetime(df_order_items['shipping_limit_date'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4 shipping_limit_date 112650 non-null datetime64[us]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;order_item_id를 범주형으로 가야하나?&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772539491914&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df_order_items[df_order_items.duplicated(subset=['order_id'], keep=False).sort_values()]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tnBFw/dJMcadA4d7O/L29SPCz5YOOeVX0KpkBEXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tnBFw/dJMcadA4d7O/L29SPCz5YOOeVX0KpkBEXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tnBFw/dJMcadA4d7O/L29SPCz5YOOeVX0KpkBEXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtnBFw%2FdJMcadA4d7O%2FL29SPCz5YOOeVX0KpkBEXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1241&quot; height=&quot;342&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; &amp;lsquo;order_id&amp;rsquo; 컬럼은 동일한 주문에 포함된 품목 수를 나타내는 순번임.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt; &amp;lsquo;1개 샀다.&amp;rsquo; &amp;lsquo;2개 샀다&amp;rsquo;가 아니라, 예를들어 동일한 신발을 3개 샀으면  order_item_id가 순차적으로 1 / 2 / 3 이렇게 존재하는 듯.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(아마 범주형으로 갈 필요는 없을거같긴 함. 혹시나~?싶어서!)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우편번호 4자리는 앞에 0을 붙이는게 낫지 않을까?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;팀원이 알려준 도메인 지식상에서는 우편번호 숫자 각각의 자리가 의미를 가지지만, 데이터셋을 보면 &amp;lsquo;3075&amp;rsquo;이런식으로 &amp;lsquo;03075&amp;rsquo;가 아니라 맨 앞의 0이 생략되어있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;컬럼명 정제&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미 깔끔해 보이지만 혹시 몰라서 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772539543799&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df_order_items.columns = df_order_items.columns.str.lower().str.strip()

df_sellers.columns = df_sellers.columns.str.lower().str.strip()&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;결측치 처리&lt;/h1&gt;
&lt;pre id=&quot;code_1772539558349&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tables = {
    #&quot;olist_customers_dataset&quot;: df_customers,
    ##&quot;olist_geolocation_dataset&quot;: df_geolocation,
    &quot;olist_order_items_dataset&quot;: df_order_items,
    #&quot;olist_order_payments_dataset&quot;: df_order_payments,
    #&quot;olist_order_reviews_dataset&quot;: df_order_reviews,
    #&quot;olist_orders_dataset&quot;: df_orders,
    ##&quot;olist_products_dataset&quot;: df_products,
    &quot;olist_sellers_dataset&quot;: df_sellers
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1772539572303&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;\n&quot; + &quot;=&quot;*60)
print(&quot;결측치 확인&quot;)
print(&quot;=&quot;*60)

for table in tables.values():
    missing_df = pd.DataFrame({
        '결측수' : table.isnull().sum(),
        '결측비율(%)' : (table.isnull().sum() / len(table) * 100).round(2)
    })
    missing_df = missing_df[missing_df['결측수']&amp;gt;0].sort_values('결측수',ascending=False)

    if len(missing_df) &amp;gt; 0:
        print(&quot;\n[결측치 현황]&quot;)
        display(missing_df)
    else:
        print(f&quot;\n결측치 없음&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결측치 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결측치 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 두 테이블의 결측치가 없음을 확인할 수 있다.&lt;/p&gt;
&lt;h1&gt;이상치 처리&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;order_items 테이블&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;order_item_id 개수&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;df_order_items['order_item_id'].value_counts().sort_index()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 98666&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2 9803&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3 2287&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4 965&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5 460&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6 256&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7 58&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8 36&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9 28&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10 25&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11 17&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12 13&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13 8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14 7&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15 5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; order_item_id가 21개까지 존재한다. 즉, 한 번에 동일 제품을 21개까지 산 사람이 존재한다 - 정상일까?/ 비정상일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(일단 저는 정상이라고 생각합니다 호호..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shipping_limit_date 컬럼의 범위&lt;/p&gt;
&lt;pre id=&quot;code_1772539719223&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df_order_items['shipping_limit_date'].dt.year.value_counts().sort_index()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shipping_limit_date 2016 370 2017 49765 2018 62511 2020 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 2016~2018까지의 데이터인데 2020 데이터라&amp;hellip; 이상치일까?/아닐까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(저는 이상치라 생각합니당)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr;2016년 몇 월부터 시작했는지 한번 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;price 컬럼 이상치확인&lt;/p&gt;
&lt;pre id=&quot;code_1772539741657&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;[가격 기초 통계]&quot;)
print(df_order_items['price'].describe())

print(&quot;\n [가격 샘플 (최소~최대)]&quot;)
print(&quot;최소값 10개:&quot;)
display(df_order_items.nsmallest(10, 'price'))

print(&quot;\n최대값 10개:&quot;)
display(df_order_items.nlargest(10,'price'))

price_skew = skew(df_order_items['price'])
price_kurt = kurtosis(df_order_items['price'])
print(f&quot;\n왜도(Skewness): {price_skew:.3f}&quot;)
print(f&quot;첨도(Kurtosis): {price_kurt:.3f}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[가격 기초 통계]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;count 112650.000000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mean 120.653739&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;std 183.633928&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;min 0.850000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;25% 39.900000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;50% 74.990000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;75% 134.900000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;max 6735.000000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜도(Skewness): 7.923&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첨도(Kurtosis): 120.823&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SbG3O/dJMcadA4eif/R7AdSKB1TSCluAL0MhX5Ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SbG3O/dJMcadA4eif/R7AdSKB1TSCluAL0MhX5Ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SbG3O/dJMcadA4eif/R7AdSKB1TSCluAL0MhX5Ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSbG3O%2FdJMcadA4eif%2FR7AdSKB1TSCluAL0MhX5Ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1276&quot; height=&quot;759&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 이렇게만 봐서는 잘 모르겠음. 필요한 컬럼이라고 생각된다면 그때 추가로 볼 필요가 있을 듯&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;freight_value 컬럼도 동일한 방법으로 유사한 결론이 나옴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>msoo5880</author>
      <guid isPermaLink="true">https://msoo5880.tistory.com/48</guid>
      <comments>https://msoo5880.tistory.com/48#entry48comment</comments>
      <pubDate>Tue, 3 Mar 2026 21:10:59 +0900</pubDate>
    </item>
    <item>
      <title>[분석적 사고 훈련] - 문제를 정의하는 방법!</title>
      <link>https://msoo5880.tistory.com/47</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;많은 사람들이 겪는 문제!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. EDA의 함정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EDA를 진행하고 시각화 및 결과를 알았다.&lt;/li&gt;
&lt;li&gt;평균, 분포는 알았는데 그래서 무슨 말을 해야 하나?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 모델링의 함정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ML 모델부터 만들었고 Accuracy 95% 달성했다.&lt;/li&gt;
&lt;li&gt;결과가 나왔는데 그래서 이 모델이 왜 필요한거지?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ &lt;b&gt;'도구'&lt;/b&gt;에만 집중했기 때문에 문제에 직면한다. 우리는 &lt;b&gt;'더 나은 &lt;span style=&quot;color: #ee2323;&quot;&gt;의사결정&lt;/span&gt;'&lt;/b&gt;을 돕기 위해 데이터 분석을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 모든 EDA, 모델링, 보고서는 &quot; 이 다음엔 무엇을 해야 하는가?&quot;라는 질문에 답해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 분석의 두가지 상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 상황 모두 &lt;span style=&quot;color: #ee2323;&quot;&gt;의사결정&lt;/span&gt;이라는 하나의 목표로 귀결된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Bottom-Up : 데이터셋만 있을 때&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 데이터셋으로 어떤 &lt;span style=&quot;color: #ee2323;&quot;&gt;의사결정&lt;/span&gt;에 도움을 줄 수 있을까?&lt;/li&gt;
&lt;li&gt;의사결정을 돕는 '가치 있는 &lt;span style=&quot;color: #ee2323;&quot;&gt;질문&lt;/span&gt;'을 찾는 순서가 필요하다.&lt;/li&gt;
&lt;li&gt;&quot;이 회사가 어떻게 하면 이 데이터를 가지고 이득을 볼 수 있을까?&quot;를 먼저 고민해 보아야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[질문의 흐름]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 이 데이터의 &lt;b&gt;보고 대상이 누구&lt;/b&gt;일지 모색해 본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 이 보고 대상이 데이터를 통해 &lt;b&gt;어떤 의사결정이 필요&lt;/b&gt;할지 생각해 보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;모호하다면? 데이터 제공처의 &lt;u&gt;비즈니스 모델&lt;/u&gt;이나 &lt;u&gt;전체 Goal&lt;/u&gt;을 생각해보자.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 어떤 Output이 이 의사결정을 가장 잘 도울 수 있을지 정의한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;모델링? (i.e. 이탈 예측 모델, 이탈 위험군 리스트)&lt;/li&gt;
&lt;li&gt;대시보드? (i.e. 이탈률 현황 파악, 프로덕트의 Health)&lt;/li&gt;
&lt;li&gt;인사이트 보고서? (i.e. 의사결정을 돕는 여러 Recommendation)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;저희는 이 쇼핑몰이 &quot;&lt;b&gt;어떤 고객에게 마케팅할지&quot;에 대한 결정&lt;/b&gt;하는 것을 돕기 위해, (-&amp;gt; 의사결정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이탈 위험군 예측&lt;/b&gt;이라는 주제를 정했습니다. (-&amp;gt; 질문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 산출물은 &lt;b&gt;고위험 타겟 고객 리스트&lt;/b&gt;입니다. (-&amp;gt; Output)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Top-Down : 문제가 주어졌을 때 (현업)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 모호한 문제 뒤에 숨어있는 &lt;span style=&quot;color: #ee2323;&quot;&gt;진짜 의사결정 니즈&lt;/span&gt;가 무엇일까?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex ) 문제 : 우리 회사가 요즘 힘들어. 리텐션 지표가 떨어지고 있는데, 어떻게 해야될까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[질문의 흐름]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Stop! 그리고 요청사항을 더 &lt;b&gt;Scope&lt;/b&gt; 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;잠시만요. 리텐션의 정의가 무엇인가요? 어떻게 계산하고 있나요?&quot;&lt;/li&gt;
&lt;li&gt;&quot;떨어지고 있다는 건 무엇과 비교해서인가요?&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 이 분석을 통해 어떤 의사결정이 필요할지 질문한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(요청자의 니즈) : &quot;사실 어제 배포한 '신규 기능'을 Rollback 할지 말지 결정해야 해요.&quot;&lt;/li&gt;
&lt;li&gt;(해석) &quot;아! 지금 필요한 건 '예측 모델'이 아니라, '신규 기능'과 '리텐션 하락'의 'Correlation 분석'이구나.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 그 '의사결정'에 맞는 Output에 대해 합의한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Decision: Rollback 결정&lt;/li&gt;
&lt;li&gt;Output: A/B 테스트 분석 결과 또는 '신규 기능 사용자 vs 비사용자'의 리텐션 비교 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;★ 이것이 분석적 사고 기반의 분석이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의사결정에 도움이 안되는 '이탈 예측 모델'을 만드는 데 시간을 쓰는게 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;요청자&lt;/u&gt;의 의사결정에 꼭 필요한 &lt;u&gt;'원인 분석'&lt;/u&gt;을 통해 &lt;u&gt;의미있는 분석&lt;/u&gt;을 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 &lt;b&gt;질문&lt;/b&gt;을 통해 어디서 시작하고, 어떻게 끝내야하는지를 정의했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TIP : Devil's Adovocate (악마의 변호사)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Devil's Adovocate?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 분석/논리의 모든 단계를 스스로가 가장 신랄하게 공격하는 선의의 비판자가 되는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 훈련을 하는 이유?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 1. 내 논리의 치명적 허점을 미리 찾기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 2. 그에 대한 방어 로직을 만들기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 3. 내 분석이 견고하고, 의미 있도록 만들기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 이 데이터는 믿을 수 있나?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;Twyman's law : &quot;흥미롭거나 다르게 보이는 모든 데이터는 대개 잘못된 것이다&quot;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;내가 정의한 '리텐션'과 PM이 말한 '리텐션'이 다른 정의를 쓰는 것은 아닐까?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;혹시 특정 그룹만 편향되게 수집된 건 아닐까?&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;2. 이 문제는 풀 가치가 있나?&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 주제에 대해 혹시 나만 궁금한거 아닐까? (의사결정과 무관함)&lt;/li&gt;
&lt;li&gt;통계적으로 유의미해도 실제 비즈니스적으로 의미 없는 차이 아닐까?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 이 결론은 진짜인가?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이탈률 10% 하락? 혹시 그냥 '운'이 좋았던 거 아닐까? (Random Spike)&lt;/li&gt;
&lt;li&gt;&quot;이 개선이 정말 '내 ML 모델' 덕분일까? 다른 '경쟁사 장애'나 '마케팅 캠페인' 때문이 아닐까?&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;★ 이러한 '딴지'들을 방어할 수 있을 때, 비로소 분석이 가치를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에 앞서, 간단하게 도메인 지식 쌓기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B2B2C&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단어 그대로 Business(기업) &amp;rarr; Business(파트너 기업) &amp;rarr; Consumer(최종 소비자)까지 세 주체가 연결된 거래 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;Olist 비즈니스 프로세스 사이클(with gemini)&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-border=&quot;0&quot; data-indent=&quot;0&quot; data-list-tree=&quot;true&quot; data-stringify-type=&quot;ordered-list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;0&quot;&gt;&lt;b data-stringify-type=&quot;bold&quot;&gt;상품 등록 (Seller &amp;rarr; Olist):&lt;/b&gt; 중소 판매자가 Olist 플랫폼에 자신의 상품 정보와 가격을 입력합니다. 이때 Olist의 데이터 분석 툴이 적정 가격이나 키워드를 가이드해주기도 합니다.&lt;/li&gt;
&lt;li data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;0&quot;&gt;&lt;b data-stringify-type=&quot;bold&quot;&gt;채널 노출 (Olist &amp;rarr; Marketplaces):&lt;/b&gt; Olist는 이 데이터를 받아 아마존, 메르카도 리브레 등 브라질 내 10여 개의 대형 마켓플레이스에 **'Olist Store'**라는 이름으로 일괄 등록합니다.&lt;/li&gt;
&lt;li data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;0&quot;&gt;&lt;b data-stringify-type=&quot;bold&quot;&gt;주문 발생 (Customer &amp;rarr; Marketplace):&lt;/b&gt; 소비자는 평소 이용하던 쇼핑몰(예: 아마존 브라질)에서 상품을 구매합니다. 이때 소비자는 개별 판매자가 아닌 'Olist'가 판매하는 제품으로 인지하고 결제합니다.&lt;/li&gt;
&lt;li data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;0&quot;&gt;&lt;b data-stringify-type=&quot;bold&quot;&gt;주문 전달 및 송장 발행 (Marketplace &amp;rarr; Olist &amp;rarr; Seller):&lt;/b&gt; 주문이 들어오면 Olist 시스템이 즉시 해당 중소 판매자에게 알림을 보냅니다. 판매자는 Olist 시스템 내에서 바로 통합 송장을 출력할 수 있습니다.&lt;/li&gt;
&lt;li data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;0&quot;&gt;&lt;b data-stringify-type=&quot;bold&quot;&gt;포장 및 발송 준비 (Seller):&lt;/b&gt; 판매자는 상품을 포장하고 Olist에서 제공한 송장을 붙입니다.&lt;/li&gt;
&lt;li data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;0&quot;&gt;&lt;b data-stringify-type=&quot;bold&quot;&gt;물류 및 배송 (Olist Envios):&lt;/b&gt; Olist와 계약된 물류 파트너가 판매자의 창고를 방문해 물건을 픽업하거나, 판매자가 지정된 접수처에 물건을 맡깁니다. 이후 **Olist Envios(자체 물류망)**를 통해 최종 소비자에게 배송됩니다.&lt;/li&gt;
&lt;li data-stringify-border=&quot;0&quot; data-stringify-indent=&quot;0&quot;&gt;&lt;b data-stringify-type=&quot;bold&quot;&gt;정산 (Olist &amp;rarr; Seller):&lt;/b&gt; 배송이 완료되면 Olist는 마켓플레이스로부터 대금을 받아, 수수료를 제외한 금액을 중소 판매자에게 정산해 줍니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>msoo5880</author>
      <guid isPermaLink="true">https://msoo5880.tistory.com/47</guid>
      <comments>https://msoo5880.tistory.com/47#entry47comment</comments>
      <pubDate>Fri, 27 Feb 2026 21:03:15 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝 정리</title>
      <link>https://msoo5880.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝 종류&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;지도학습 - 정답(y)가 있다.&lt;/li&gt;
&lt;li&gt;비지도학습 - 정답이 없다.&lt;/li&gt;
&lt;li&gt;강화학습 - 보상 기반 의사결정&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;머신러닝 프로젝트의 흐름&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;데이터 준비&lt;/li&gt;
&lt;li&gt;학습 / 시험 데이터 분리(Train / Test)&lt;/li&gt;
&lt;li&gt;모델 학습 (fit)&lt;/li&gt;
&lt;li&gt;예측 (predict)&lt;/li&gt;
&lt;li&gt;평가 - (metrics : 분류 = 정확도/F1/ROC 등, 회귀 = MAE/RMSE/R^2)&lt;/li&gt;
&lt;li&gt;개선 (튜닝, 전처리, 더 나은 모델)&lt;/li&gt;
&lt;/ol&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ scikit-learn&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파이썬 머신러닝 표준 라이브러리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일관된 API : &lt;b&gt;fit -&amp;gt; predict -&amp;gt; score&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 데이터 준비&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Train / Test 분리&lt;/h3&gt;
&lt;pre id=&quot;code_1772085421167&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
	X, y, test_size = 0.2, stratify=y, random_state=42
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 모델 학습 (fit)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DecisionTree 사용.&lt;/li&gt;
&lt;li&gt;모델을 바꿔 끼우기만 하면 된다. ( ex. DecisionTreeClassifier -&amp;gt; LogisticRegression, KNeighborsClassifier 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772085642339&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. 모델 생성
dt = DecisionTreeClassifier(random_state=18)

# 2. 학습 (fit) &amp;mdash; 모델이 데이터의 패턴을 학습
dt.fit(X_train, y_train)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ random_state를 고정하면 항상 같은 결과가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ random_state를 고정하지 않으면 실행할 때마다 다른 결과가 나온다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 예측&lt;/h3&gt;
&lt;pre id=&quot;code_1772085679056&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 3. 예측 (predict) &amp;mdash; 처음 보는 테스트 데이터로 예측
pred = dt.predict(X_test)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 평가&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정확도 = (맞춘개수) / (전체개수)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;정확도는 직관적이지만, 데이터가 불균형하면 착시가 생길 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772085699969&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 4. 평가 (score) &amp;mdash; 정확도 계산
acc = accuracy_score(y_test, pred)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 구조 파악 체크&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 데이터 크기 확인&lt;/h4&gt;
&lt;pre id=&quot;code_1772086249992&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1단계: 데이터 크기 확인 &amp;mdash; 몇 행, 몇 열?
print(f&quot;데이터 크기: {df.shape}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 각 컬럼의 데이터 타입 확인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자(float64, int64) / 문자(object)에 따라 전처리 방법이 달라진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772086292130&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(df.dtypes)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 데이터 전체 요약&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;info()는 타입, 결측치, 메모리까지 한 번에 확인 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772086378004&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df.info()&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결측치 확인&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결측치 = 비어있는 데인터(NaN)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772086478257&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 컬럼별 결측치 수 확인
print(df.isnull().sum())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 결측치가 있다면?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 행 삭제 : df.dropna()&lt;/li&gt;
&lt;li&gt;평균값으로 채우기 : df.fillna(df.mean())&lt;/li&gt;
&lt;li&gt;중앙값으로 채우기 : df.fillna(df.median())&lt;/li&gt;
&lt;li&gt;sklearn의 SimpleImputer 사용&lt;/li&gt;
&lt;li&gt;어떤 방법을 쓸지는 &lt;b&gt;데이터 특성&lt;/b&gt;에 따라 다름.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Target(정답) 분포 확인&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스별 &lt;b&gt;데이터 개수가 균등한지 확인&lt;/b&gt;하는 것이 중요하다.&lt;/li&gt;
&lt;li&gt;한 쪽 클래스만 많으면 모델이 편향될 수 있다.(불균형 데이터 문제)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772086756824&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Target 분포 확인 &amp;mdash; value_counts()로 각 클래스의 개수 세기
print(df[&quot;target&quot;].value_counts())

# normalize=True로 비율 확인
print(df[&quot;target&quot;].value_counts(normalize=True))&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시각화해서 확인해도 좋긴 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 통계 확인&lt;/h2&gt;
&lt;pre id=&quot;code_1772087022084&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df.describe()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;describe의 포인트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;count : 결측치가 있으면 컬럼마다 count가 다르다.&lt;/li&gt;
&lt;li&gt;mean과 std : 데이터의 중심과 퍼진 정도&lt;/li&gt;
&lt;li&gt;min과 max : 이상치가 있는지 확인&lt;/li&gt;
&lt;li&gt;25%, 50%, 75% : 데이터의 분포 형태 파악&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시각화 EDA&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델을 돌리기 전에 데이터가 어떻게 생겼는지 &lt;b&gt;눈으로 확인&lt;/b&gt;하자. (산점도, 히스토그램 등)&lt;/li&gt;
&lt;li&gt;시각화를 통해 예측 난이도를 미리 가늠하고, 어떤 알고리즘이 좋을지 판단할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 산점도에서 읽어내야하는 포인트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터가 완전히 분리 됨 -&amp;gt; 쉽게 구분이 가능&lt;/li&gt;
&lt;li&gt;데이터가 많이 겹침 -&amp;gt; 그 피쳐만으로는 분류가 어렵다&lt;/li&gt;
&lt;li&gt;분리가 잘된 산점도에서도 데이터가 일부 겹쳤다면 -&amp;gt; 모델이 헷갈릴 수 있는 구간이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전체 피처 관계 한 눈에 보기(Pairplot)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 피처 조합의 산점도를 한 번에 그린다.&lt;/li&gt;
&lt;li&gt;어떤 피처 조합이 분류에 유리한지 한 장으로 파악 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772087725872&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Iris Dataset 내용임

import seaborn as sns
import matplotlib.pyplot as plt

# pairplot: 모든 피처 조합의 산점도 + 대각선에 히스토그램
sns.pairplot(
    df,
    hue=&quot;species&quot;,
    diag_kind=&quot;hist&quot;, # 대각선 히스토그램으로 채워짐
    vars=iris_data.feature_names,
    palette=&quot;Set1&quot;
)
plt.suptitle(&quot;Iris 전체 피처 Pairplot&quot;, y=1.02)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XX2ba/dJMcaflnK6j/WMPRjucTiKuHxQI8FTezs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XX2ba/dJMcaflnK6j/WMPRjucTiKuHxQI8FTezs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XX2ba/dJMcaflnK6j/WMPRjucTiKuHxQI8FTezs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXX2ba%2FdJMcaflnK6j%2FWMPRjucTiKuHxQI8FTezs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;739&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;739&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ Pairplot 해석&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대각선 : 각 피처의 히스토그램&lt;/li&gt;
&lt;li&gt;대각선 아래/위 : 두 피처 조합의 산점도&lt;/li&gt;
&lt;li&gt;색이 잘 분리되는 조합 = 분류에 유리한 피처 조합&lt;/li&gt;
&lt;li&gt;petal length + petal width 조합이 가장 잘 분리된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772088035546&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 박스플롯: 품종별 피처 분포 비교
plt.figure(figsize=(12, 4))

for i, feature in enumerate(iris_data.feature_names):
    plt.subplot(1, 4, i + 1)
    sns.boxplot(data=df, x=&quot;species&quot;, y=feature)
    plt.title(feature.replace(&quot; (cm)&quot;, &quot;&quot;))
    if i &amp;gt;= 0:
        plt.ylabel(&quot;&quot;)

plt.suptitle(&quot;품종별 피처 분포 (Boxplot)&quot;, y=1.02)
plt.tight_layout()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbOWJt/dJMcahXNNGR/GbyAGMbGJG6DxfwEZ3KxIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbOWJt/dJMcahXNNGR/GbyAGMbGJG6DxfwEZ3KxIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbOWJt/dJMcahXNNGR/GbyAGMbGJG6DxfwEZ3KxIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbOWJt%2FdJMcahXNNGR%2FGbyAGMbGJG6DxfwEZ3KxIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1514&quot; height=&quot;518&quot; data-origin-width=&quot;1514&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 박스플롯 해석&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수염 밖의 점 = 이상치(outlier)&lt;/li&gt;
&lt;li&gt;상자가 겹치지 않는 피처 -&amp;gt; 분류에 유리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상관관계 확인&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;피처들 간의 관계를 숫자로 확인한다.&lt;/li&gt;
&lt;li&gt;상관계수 : 1에 가까우면 강한 양의 상관, -1에 가까우면 강한 음의 상관, 0이면 관계 없음.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772088357035&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 수치 피처만 추출해서 상관행렬 계산

df[iris_data.feature_names].corr()&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1772088393060&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 상관행렬 히트맵- 색으로 직관적 확인
fig=px.imshow(corr, text_auto=True, color_continuous_scale='RdBu_r')
fig.update_layout(title='피처 간 상관관계 (Correlation Matrix)')
fig.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1662&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MYLHh/dJMcagR8AN4/CgNl5ynZKrjPIi0vfYKnSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MYLHh/dJMcagR8AN4/CgNl5ynZKrjPIi0vfYKnSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MYLHh/dJMcagR8AN4/CgNl5ynZKrjPIi0vfYKnSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMYLHh%2FdJMcagR8AN4%2FCgNl5ynZKrjPIi0vfYKnSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1662&quot; height=&quot;562&quot; data-origin-width=&quot;1662&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 상관관계 해석&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 피처의 상관계수가 1에 가까우면 매우 강한 양의 상관(함께 커진다) - petal length와 petal width&lt;/li&gt;
&lt;li&gt;한 피처가 다른 피처들과 상관이 낮음 -&amp;gt; 독립적인 정보를 제공 - sepal width&lt;/li&gt;
&lt;li&gt;상관이 너무 높은 피처들은 중복 정보일 수 있다. -&amp;gt; 나중에 피처 선택/제거를 고려해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후에 계속..&lt;/p&gt;</description>
      <author>msoo5880</author>
      <guid isPermaLink="true">https://msoo5880.tistory.com/46</guid>
      <comments>https://msoo5880.tistory.com/46#entry46comment</comments>
      <pubDate>Thu, 26 Feb 2026 20:43:20 +0900</pubDate>
    </item>
  </channel>
</rss>