<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>subinz 님의 블로그</title>
    <link>https://subinz.tistory.com/</link>
    <description>subinz 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 5 Oct 2026 03:12:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>subinz</managingEditor>
    <item>
      <title>AARRR 프레임워크</title>
      <link>https://subinz.tistory.com/41</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;AARRR 프레임워크란? 사용자 여정을 5단계로 분석하는 방법&lt;/h2&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;이러한 사용자 여정을 5단계로 나누어 분석하는 프레임워크가 &lt;b&gt;AARRR&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AARRR이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AARRR은 다음 다섯 단계의 앞 글자를 딴 이름이다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Acquisition &amp;rarr; Activation &amp;rarr; Retention &amp;rarr; Revenue &amp;rarr; Referral
유입 &amp;rarr; 활성화 &amp;rarr; 유지 &amp;rarr; 수익 &amp;rarr; 추천
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해적의 외침인 AARRR과 비슷하다고 해서 &lt;b&gt;해적 지표(Pirate Metrics)&lt;/b&gt;라고도 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단계핵심 질문&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Acquisition&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용자는 어디에서 들어오는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Activation&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용자가 서비스의 가치를 경험했는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Retention&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용자가 다시 돌아오는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Revenue&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용자가 수익을 발생시키는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Referral&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용자가 다른 사람에게 추천하는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Acquisition: 유입&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Acquisition&lt;/b&gt;은 사용자가 어떤 경로를 통해 서비스에 들어왔는지를 확인하는 단계다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 유입 경로에는 검색, 광고, SNS, 커뮤니티, 추천 링크 등이 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;대표 지표&lt;/h3&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;광고 클릭률&lt;/li&gt;
&lt;li&gt;사용자 획득 비용&lt;/li&gt;
&lt;li&gt;회원가입 전환율&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;회원가입 전환율
= 회원가입자 수 &amp;divide; 방문자 수 &amp;times; 100
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 광고를 통해 1,000명이 방문하고 100명이 가입했다면 회원가입 전환율은 10%다.&lt;/p&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;100 &amp;divide; 1,000 &amp;times; 100 = 10%
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Acquisition 단계에서는 단순히 유입량만 보는 것이 아니라, &lt;b&gt;어떤 채널에서 가치 있는 사용자가 들어오는지&lt;/b&gt;를 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Activation: 활성화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Activation&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;따라서 서비스마다 활성화 행동을 별도로 정의해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서비스별 활성화 행동 예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스활성화 행동&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;쇼핑몰&lt;/td&gt;
&lt;td&gt;첫 상품 조회 또는 장바구니 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;음악 서비스&lt;/td&gt;
&lt;td&gt;첫 음악 재생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;채용 플랫폼&lt;/td&gt;
&lt;td&gt;첫 채용공고 조회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;숙박 서비스&lt;/td&gt;
&lt;td&gt;첫 숙소 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;협업 도구&lt;/td&gt;
&lt;td&gt;첫 프로젝트 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;학습 서비스&lt;/td&gt;
&lt;td&gt;첫 강의 수강&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;대표 지표&lt;/h3&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;가입 후 첫 행동까지 걸린 시간&lt;/li&gt;
&lt;li&gt;활성화 전환율&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;활성화 전환율
= 활성화 사용자 수 &amp;divide; 신규 가입자 수 &amp;times; 100
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가입자 100명 중 60명이 핵심 기능을 사용했다면 활성화 전환율은 60%다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Activation은 AARRR에서 특히 중요한 단계다. 사용자가 서비스의 가치를 경험하지 못하면 다시 방문하거나 결제할 가능성도 낮기 때문이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Retention: 유지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Retention&lt;/b&gt;은 사용자가 한 번 이용한 뒤 다시 서비스로 돌아오는지를 확인하는 단계다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신규 사용자가 많아도 대부분 한 번만 사용하고 떠난다면 서비스가 안정적으로 성장하기 어렵다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;대표 지표&lt;/h3&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;DAU, WAU, MAU&lt;/li&gt;
&lt;li&gt;이탈률&lt;/li&gt;
&lt;li&gt;코호트별 리텐션&lt;/li&gt;
&lt;li&gt;Classic, Range, Rolling Retention&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;리텐션
= 재방문 사용자 수 &amp;divide; 최초 사용자 수 &amp;times; 100
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 가입자 100명 중 7일 뒤 20명이 다시 방문했다면 7일 리텐션은 20%다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retention 단계에서는 전체 사용자 평균만 보는 것보다 &lt;b&gt;가입 시점이 같은 사용자를 코호트로 묶어 비교하는 것&lt;/b&gt;이 좋다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Revenue: 수익&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Revenue&lt;/b&gt;는 사용자가 실제로 매출이나 이익을 발생시키는지를 확인하는 단계다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 서비스를 자주 이용해도 결제로 이어지지 않는다면 사업 성과로 연결되기 어렵다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;대표 지표&lt;/h3&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;사용자당 평균 매출&lt;/li&gt;
&lt;li&gt;고객 생애가치&lt;/li&gt;
&lt;li&gt;유료 구독 전환율&lt;/li&gt;
&lt;li&gt;재구매율&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;구매 전환율
= 구매 사용자 수 &amp;divide; 전체 사용자 수 &amp;times; 100
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 1,000명 중 50명이 구매했다면 구매 전환율은 5%다.&lt;/p&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;50 &amp;divide; 1,000 &amp;times; 100 = 5%
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Revenue 단계에서는 단순 매출뿐만 아니라 &lt;b&gt;한 명의 사용자가 장기적으로 얼마나 많은 가치를 만드는지&lt;/b&gt;를 함께 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Referral: 추천&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Referral&lt;/b&gt;은 기존 사용자가 다른 사람에게 서비스를 추천하는지를 확인하는 단계다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 자발적으로 서비스를 공유하고 새로운 사용자를 데려온다면 광고비를 크게 늘리지 않고도 성장할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;대표 지표&lt;/h3&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;바이럴 계수&lt;/li&gt;
&lt;li&gt;추천 전환율&lt;/li&gt;
&lt;li&gt;리뷰 및 후기 작성률&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;추천 전환율
= 추천을 통해 가입한 사용자 수
  &amp;divide; 추천 링크 방문자 수 &amp;times; 100
&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;사용자가 먼저 서비스에 만족해야 다른 사람에게 추천할 가능성이 높아진다. 따라서 Referral은 Retention과 밀접하게 연결되어 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AARRR 분석 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인 쇼핑몰을 AARRR로 분석하면 다음과 같이 구성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단계사용자 행동대표 지표&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Acquisition&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;광고를 클릭하고 쇼핑몰 방문&lt;/td&gt;
&lt;td&gt;채널별 방문자 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Activation&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;상품을 조회하거나 장바구니에 추가&lt;/td&gt;
&lt;td&gt;장바구니 추가율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Retention&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;며칠 뒤 다시 방문&lt;/td&gt;
&lt;td&gt;7일 재방문율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Revenue&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;상품 구매&lt;/td&gt;
&lt;td&gt;구매 전환율, 매출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Referral&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;친구에게 상품 링크 공유&lt;/td&gt;
&lt;td&gt;공유 수, 추천 가입률&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 1,000명이 방문한 뒤 다음과 같이 행동했다고 가정해 보자.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;방문             1,000명
회원가입           300명
장바구니 추가       150명
재방문              60명
구매                30명
추천                 5명
&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;b&gt;Activation 단계의 개선이 우선&lt;/b&gt;일 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AARRR은 반드시 순서대로 진행될까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AARRR은 사용자 여정을 이해하기 위한 프레임워크지만, 모든 사용자가 정확히 같은 순서로 행동하는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자는 다음과 같이 움직일 수도 있다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;유입 &amp;rarr; 구매 &amp;rarr; 재방문 &amp;rarr; 추천
&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;따라서 AARRR을 절대적인 순서로 보기보다, &lt;b&gt;사용자의 주요 행동을 단계별로 구분하는 기준&lt;/b&gt;으로 사용하는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Revenue와 Referral의 순서를 바꾸어 AARRR을 다음과 같이 설명하는 경우도 있다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Acquisition &amp;rarr; Activation &amp;rarr; Retention &amp;rarr; Referral &amp;rarr; Revenue
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 단계의 순서보다 각 단계에서 어떤 사용자 행동을 측정할 것인지 명확하게 정하는 것이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;분석할 때 주의할 점&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;지표를 너무 많이 설정하지 않는다&lt;/h4&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;h4 data-ke-size=&quot;size20&quot;&gt;Activation 행동을 명확하게 정의한다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Activation을 단순 회원가입으로 설정하면 실제로 가치를 경험한 사용자를 구분하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스의 핵심 기능을 처음 사용한 행동을 기준으로 설정해야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;단계별 전환율을 함께 확인한다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 단계의 사용자 수만 보는 것보다 이전 단계에서 다음 단계로 얼마나 이동했는지 확인해야 한다.&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;단계별 전환율
= 다음 단계 사용자 수 &amp;divide; 이전 단계 사용자 수 &amp;times; 100
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전체 평균만 보지 않는다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유입 채널, 가입 시기, 사용자 유형에 따라 성과가 다를 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 채널별&amp;middot;코호트별&amp;middot;사용자 그룹별로 나누어 분석하는 것이 좋다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AARRR은 사용자가 서비스에 들어온 순간부터 추천과 수익으로 이어지는 과정을 분석하는 프레임워크다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Acquisition &amp;rarr; 어떻게 들어왔는가?

Activation &amp;rarr; 핵심 가치를 경험했는가?

Retention &amp;rarr; 다시 돌아오는가?

Revenue &amp;rarr; 수익을 발생시키는가?

Referral &amp;rarr; 다른 사람에게 추천하는가?
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AARRR 분석의 목적은 모든 지표를 한꺼번에 높이는 것이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 사용자 여정에서 &lt;b&gt;가장 큰 문제가 발생하는 단계가 어디인지 찾고, 해당 단계를 우선적으로 개선하는 것&lt;/b&gt;이 핵심이다.&lt;/p&gt;</description>
      <category>Data Analysis</category>
      <author>subinz</author>
      <guid isPermaLink="true">https://subinz.tistory.com/41</guid>
      <comments>https://subinz.tistory.com/41#entry41comment</comments>
      <pubDate>Wed, 5 Aug 2026 14:51:05 +0900</pubDate>
    </item>
    <item>
      <title>리텐션 - classic, range, rolling</title>
      <link>https://subinz.tistory.com/40</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;리텐션 분석의 3가지 방법: Classic, Range, Rolling Retention&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스에 들어온 사용자가 시간이 지난 뒤에도 다시 돌아오는지를 보여주는 지표가 &lt;b&gt;리텐션(Retention)&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신규 사용자가 계속 유입되더라도 대부분 한 번만 이용하고 떠난다면 서비스가 안정적으로 성장하기 어렵다. 따라서 사용자 수뿐만 아니라 &lt;b&gt;얼마나 많은 사용자가 다시 돌아오는지&lt;/b&gt;를 함께 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리텐션이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리텐션은 처음 서비스를 이용한 사용자 중 일정 시간이 지난 뒤 다시 서비스를 이용한 사용자의 비율이다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;리텐션 = 재방문 사용자 수 &amp;divide; 최초 사용자 수 &amp;times; 100
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 가입자 100명 중 7일 뒤 다시 서비스를 이용한 사용자가 20명이라면 리텐션은 20%다.&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;&lt;b&gt;시작 이벤트&lt;/b&gt;: 회원가입, 앱 설치, 첫 구매 등&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;사용자가 시작 이벤트를 수행한 날을 &lt;b&gt;Day 0&lt;/b&gt;이라고 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Classic Retention&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Classic Retention&lt;/b&gt;은 사용자가 &lt;b&gt;정확히 N일 차에 다시 방문했는지&lt;/b&gt;를 측정하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N-Day Retention이라고도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Day 7 Classic Retention은 가입 후 정확히 7일 차에 다시 방문한 사용자의 비율이다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;Day 7 Classic Retention
= 정확히 7일 차에 방문한 사용자 수
  &amp;divide; Day 0 사용자 수 &amp;times; 100
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가입자 100명 중 정확히 7일 차에 15명이 방문했다면 Day 7 Classic Retention은 15%다.&lt;/p&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;15 &amp;divide; 100 &amp;times; 100 = 15%
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 6일 차나 8일 차에 방문했더라도 &lt;b&gt;7일 차에 방문하지 않았다면 포함되지 않는다.&lt;/b&gt; Amplitude에서는 이러한 방식을 N-Day 또는 Return On으로 표현한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적합한 서비스&lt;/h3&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;SNS&lt;/li&gt;
&lt;li&gt;학습 앱&lt;/li&gt;
&lt;li&gt;운동 기록 앱&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&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;날짜에 따라 수치가 오르내릴 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Range Retention&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Range Retention&lt;/b&gt;은 사용자가 &lt;b&gt;정해진 기간 안에 한 번이라도 방문했는지&lt;/b&gt;를 측정하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Day 1~7 Range Retention은 가입 후 1일부터 7일 사이에 한 번이라도 방문한 사용자의 비율이다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;Day 1~7 Range Retention
= 1일부터 7일 사이에 방문한 사용자 수
  &amp;divide; Day 0 사용자 수 &amp;times; 100
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가입자 100명 중 1일부터 7일 사이에 한 번이라도 방문한 사용자가 40명이라면 Range Retention은 40%다.&lt;/p&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;40 &amp;divide; 100 &amp;times; 100 = 40%
&lt;/code&gt;&lt;/pre&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;Range Retention은 자료나 분석 도구에 따라 Bracket Retention, Custom Retention처럼 표현되기도 한다. Amplitude의 API 역시 기간을 구간으로 묶는 방식을 bracket으로 구분한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적합한 서비스&lt;/h3&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;li&gt;구독 서비스&lt;/li&gt;
&lt;li&gt;숙박 및 여행 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&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;구간 설정에 따라 결과가 달라질 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Rolling Retention&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Rolling Retention&lt;/b&gt;은 사용자가 &lt;b&gt;N일 차 또는 그 이후에 한 번이라도 방문했는지&lt;/b&gt;를 측정하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unbounded Retention이라고도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Day 7 Rolling Retention은 정확히 7일 차뿐만 아니라 8일, 10일, 30일 차에 방문한 사용자도 포함한다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;Day 7 Rolling Retention
= 7일 차 이후 한 번이라도 방문한 사용자 수
  &amp;divide; Day 0 사용자 수 &amp;times; 100
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가입자 100명 중 7일 차 이후 한 번이라도 방문한 사용자가 30명이라면 Day 7 Rolling Retention은 30%다.&lt;/p&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;30 &amp;divide; 100 &amp;times; 100 = 30%
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amplitude에서는 이를 Return On or After라고 표현하며, 특정 날짜 이후에 재방문한 사용자를 모두 포함한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적합한 서비스&lt;/h3&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;li&gt;부동산 플랫폼&lt;/li&gt;
&lt;li&gt;여행 예약 서비스&lt;/li&gt;
&lt;li&gt;금융상품 비교 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&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;N값이 커질수록 수치는 일반적으로 같거나 낮아진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세 가지 방식의 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자들의 방문 기록이 다음과 같다고 가정해 보자.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;사용자 A: Day 7 방문
사용자 B: Day 3, Day 10 방문
사용자 C: Day 10 방문
사용자 D: Day 1 방문
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Day 7을 기준으로 계산하면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방식포함되는 사용자판단 기준&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Classic&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;정확히 Day 7에 방문했는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Range&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;A, B, D&lt;/td&gt;
&lt;td&gt;Day 1~7 사이에 방문했는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Rolling&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;A, B, C&lt;/td&gt;
&lt;td&gt;Day 7 이후에 방문했는가?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 차이는 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Classic &amp;rarr; 정확히 그날 돌아왔는가?

Range &amp;rarr; 정해진 기간 안에 돌아왔는가?

Rolling &amp;rarr; 그날 또는 그 이후에 돌아왔는가?
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리텐션 방식 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분측정 기준Day 7의 의미적합한 경우&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 73px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;Classic&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;정확히 N일 차 방문&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;정확히 7일 차에 방문&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;이용 주기가 규칙적인 서비스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;Range&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;설정한 기간 내 방문&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;1~7일 사이에 방문&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;기간 단위의 재방문이 중요한 서비스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;Rolling&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;N일 차 이후 방문&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;7일 이후 한 번이라도 방문&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;이용 주기가 불규칙한 서비스&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;어떤 방식을 사용해야 할까?&lt;/h2&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;b&gt;Classic Retention&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;특정 기간 안에 다시 방문하는지가 중요하다면 &lt;b&gt;Range Retention&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;사용자가 필요할 때 불규칙하게 방문한다면 &lt;b&gt;Rolling Retention&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 게임은 정확히 다음 날 다시 접속했는지가 중요하므로 Classic Retention이 적합하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 쇼핑몰은 사용자가 정확히 7일 차에 방문하지 않더라도 이후 다시 구매할 수 있으므로 Rolling Retention이 더 적합할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;분석할 때 주의할 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리텐션을 계산할 때는 다음 기준을 명확하게 정해야 한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. 어떤 행동을 시작 이벤트로 볼 것인가?
2. 어떤 행동을 재방문으로 볼 것인가?
3. 하루를 달력 날짜로 나눌 것인가, 24시간 단위로 나눌 것인가?
4. Classic, Range, Rolling 중 어떤 방식을 사용할 것인가?
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Day 7 리텐션을 계산하려면 가입 후 최소 7일이 지난 사용자만 포함해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 가입 후 7일이 지나지 않은 사용자를 포함하면 재방문할 기회가 충분하지 않기 때문에 리텐션이 실제보다 낮게 계산될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 분석 도구마다 날짜 구간과 명칭이 다를 수 있으므로, 다른 서비스나 자료의 리텐션과 비교할 때는 계산 기준이 같은지 확인해야 한다. Amplitude 역시 달력 날짜와 사용자별 24시간 구간에 따라 결과가 달라질 수 있다고 설명한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&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;pre class=&quot;properties&quot;&gt;&lt;code&gt;Classic &amp;rarr; 특정 날짜의 재방문

Range &amp;rarr; 특정 기간의 재방문

Rolling &amp;rarr; 특정 날짜 이후의 재방문
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 리텐션 수치만 확인하기보다 &lt;b&gt;서비스의 이용 주기와 분석 목적에 맞는 계산 방식을 선택하는 것&lt;/b&gt;이 중요하다.&lt;/p&gt;</description>
      <category>Data Analysis</category>
      <author>subinz</author>
      <guid isPermaLink="true">https://subinz.tistory.com/40</guid>
      <comments>https://subinz.tistory.com/40#entry40comment</comments>
      <pubDate>Wed, 5 Aug 2026 14:46:32 +0900</pubDate>
    </item>
    <item>
      <title>Airflow</title>
      <link>https://subinz.tistory.com/39</link>
      <description>&lt;h1 data-end=&quot;45&quot; data-start=&quot;0&quot; data-section-id=&quot;p442jw&quot;&gt;Apache Airflow란? DAG&amp;middot;Task&amp;middot;Operator 핵심 개념 정리&lt;/h1&gt;
&lt;p data-end=&quot;134&quot; data-start=&quot;47&quot; data-ke-size=&quot;size16&quot;&gt;Apache Airflow는 데이터 수집, 전처리, 저장과 같은 여러 작업의 &lt;b&gt;실행 순서와 일정, 의존관계를 관리하는 워크플로 오케스트레이션 도구&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-end=&quot;218&quot; data-start=&quot;136&quot; data-ke-size=&quot;size16&quot;&gt;Airflow가 직접 데이터를 분석하는 것은 아니다. 어떤 작업을 언제 실행하고, 앞선 작업이 성공했을 때 어떤 작업을 이어서 실행할지를 관리한다.&lt;/p&gt;
&lt;p data-end=&quot;260&quot; data-start=&quot;220&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 일일 매출 데이터 파이프라인을 다음과 같이 자동화할 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;주문 데이터 수집
&amp;rarr; 데이터 전처리
&amp;rarr; 데이터베이스 저장
&amp;rarr; 매출 보고서 생성
&amp;rarr; 완료 알림&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;330&quot; data-start=&quot;327&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;352&quot; data-start=&quot;332&quot; data-section-id=&quot;4idd0p&quot; data-ke-size=&quot;size26&quot;&gt;Airflow의 핵심 구성 요소&lt;/h2&gt;
&lt;p data-end=&quot;392&quot; data-start=&quot;354&quot; data-ke-size=&quot;size16&quot;&gt;Airflow의 기본 구조는 다음 세 가지 개념으로 이해할 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;구성 요소의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;524&quot; data-start=&quot;394&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;524&quot; data-start=&quot;419&quot;&gt;
&lt;tr data-end=&quot;448&quot; data-start=&quot;419&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;425&quot; data-start=&quot;419&quot;&gt;DAG&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;448&quot; data-start=&quot;425&quot;&gt;전체 작업 흐름과 실행 순서를 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;482&quot; data-start=&quot;449&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;456&quot; data-start=&quot;449&quot;&gt;Task&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;482&quot; data-start=&quot;456&quot;&gt;DAG 안에서 실제로 실행되는 개별 작업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;524&quot; data-start=&quot;483&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;494&quot; data-start=&quot;483&quot;&gt;Operator&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;524&quot; data-start=&quot;494&quot;&gt;Task가 어떤 작업을 수행할지 정의하는 템플릿&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;529&quot; data-start=&quot;526&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;541&quot; data-start=&quot;531&quot; data-section-id=&quot;7ps84k&quot;&gt;1. DAG란?&lt;/h1&gt;
&lt;p data-end=&quot;613&quot; data-start=&quot;543&quot; data-ke-size=&quot;size16&quot;&gt;DAG(Directed Acyclic Graph)는 여러 Task의 &lt;b&gt;실행 순서와 의존관계를 정의한 전체 작업 흐름&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;652&quot; data-start=&quot;615&quot; data-ke-size=&quot;size16&quot;&gt;DAG 자체가 데이터를 처리하는 것은 아니며 다음 내용을 관리한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;738&quot; data-start=&quot;654&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;672&quot; data-start=&quot;654&quot; data-section-id=&quot;ucaten&quot;&gt;어떤 Task를 실행할 것인지&lt;/li&gt;
&lt;li data-end=&quot;695&quot; data-start=&quot;673&quot; data-section-id=&quot;ywi32b&quot;&gt;Task를 어떤 순서로 실행할 것인지&lt;/li&gt;
&lt;li data-end=&quot;708&quot; data-start=&quot;696&quot; data-section-id=&quot;1t9wx7e&quot;&gt;언제 실행할 것인지&lt;/li&gt;
&lt;li data-end=&quot;738&quot; data-start=&quot;709&quot; data-section-id=&quot;mfs97f&quot;&gt;앞선 Task가 실패했을 때 어떻게 처리할 것인지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;788&quot; data-start=&quot;740&quot; data-ke-size=&quot;size16&quot;&gt;DAG는 방향성이 있고 작업 흐름이 이전 단계로 되돌아가는 순환 구조를 가지지 않는다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;데이터 수집 &amp;rarr; 전처리 &amp;rarr; 저장 &amp;rarr; 알림&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;829&quot; data-start=&quot;826&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;842&quot; data-start=&quot;831&quot; data-section-id=&quot;2cgjs8&quot;&gt;2. Task란?&lt;/h1&gt;
&lt;p data-end=&quot;882&quot; data-start=&quot;844&quot; data-ke-size=&quot;size16&quot;&gt;Task는 DAG 안에서 실제로 실행되는 &lt;b&gt;하나의 작업 단위&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-end=&quot;918&quot; data-start=&quot;884&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 다음 작업들이 각각 하나의 Task가 될 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;977&quot; data-start=&quot;920&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;934&quot; data-start=&quot;920&quot; data-section-id=&quot;3gr5hd&quot;&gt;API에서 데이터 수집&lt;/li&gt;
&lt;li data-end=&quot;943&quot; data-start=&quot;935&quot; data-section-id=&quot;1uq9x8f&quot;&gt;결측값 처리&lt;/li&gt;
&lt;li data-end=&quot;959&quot; data-start=&quot;944&quot; data-section-id=&quot;1yfdb9x&quot;&gt;데이터베이스에 결과 저장&lt;/li&gt;
&lt;li data-end=&quot;968&quot; data-start=&quot;960&quot; data-section-id=&quot;r436bw&quot;&gt;보고서 생성&lt;/li&gt;
&lt;li data-end=&quot;977&quot; data-start=&quot;969&quot; data-section-id=&quot;1kc83ch&quot;&gt;이메일 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;데이터 수집 &amp;rarr; 데이터 전처리 &amp;rarr; DB 저장 &amp;rarr; 완료 알림
   Task 1        Task 2         Task 3       Task 4&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1145&quot; data-start=&quot;1077&quot; data-ke-size=&quot;size16&quot;&gt;각 Task는 독립적인 작업이지만 의존관계를 설정하여 앞선 Task가 성공한 뒤 다음 Task가 실행되도록 만들 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;1150&quot; data-start=&quot;1147&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1168&quot; data-start=&quot;1152&quot; data-section-id=&quot;14m9sfq&quot; data-ke-size=&quot;size26&quot;&gt;DAG와 Task의 관계&lt;/h2&gt;
&lt;p data-end=&quot;1234&quot; data-start=&quot;1170&quot; data-ke-size=&quot;size16&quot;&gt;DAG가 전체 업무 프로세스를 나타내는 &lt;b&gt;설계도&lt;/b&gt;라면, Task는 설계도 안에서 실행되는 &lt;b&gt;개별 작업&lt;/b&gt;이다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;DAG
├─ 데이터 수집 Task
├─ 데이터 전처리 Task
├─ 데이터 저장 Task
└─ 완료 알림 Task&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1371&quot; data-start=&quot;1313&quot; data-ke-size=&quot;size16&quot;&gt;하나의 DAG 안에는 여러 Task가 포함될 수 있으며, DAG가 Task 사이의 실행 순서를 관리한다.&lt;/p&gt;
&lt;hr data-end=&quot;1376&quot; data-start=&quot;1373&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1393&quot; data-start=&quot;1378&quot; data-section-id=&quot;2cg3ic&quot;&gt;3. Operator란?&lt;/h1&gt;
&lt;p data-end=&quot;1437&quot; data-start=&quot;1395&quot; data-ke-size=&quot;size16&quot;&gt;Operator는 Task가 &lt;b&gt;어떤 작업을 수행할지 정의한 템플릿&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1480&quot; data-start=&quot;1439&quot; data-ke-size=&quot;size16&quot;&gt;DAG 안에서 Operator를 생성하면 실제로 실행되는 Task가 된다.&lt;/p&gt;
&lt;p data-end=&quot;1572&quot; data-start=&quot;1482&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 파이썬 함수를 실행하는 Operator를 사용해 데이터 전처리 Task를 만들거나, 이메일 발송 Operator로 완료 알림 Task를 만들 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;Operator: 작업 방식 정의
Task: DAG 안에서 실행되는 Operator의 인스턴스&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1643&quot; data-start=&quot;1640&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1659&quot; data-start=&quot;1645&quot; data-section-id=&quot;13tz1nx&quot; data-ke-size=&quot;size26&quot;&gt;주요 Operator&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;Operator기능활용 사례
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2239&quot; data-start=&quot;1661&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2239&quot; data-start=&quot;1701&quot;&gt;
&lt;tr data-end=&quot;1751&quot; data-start=&quot;1701&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1720&quot; data-start=&quot;1701&quot;&gt;PythonOperator&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1732&quot; data-start=&quot;1720&quot;&gt;파이썬 함수 실행&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1751&quot; data-start=&quot;1732&quot;&gt;데이터 전처리, 집계, 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1801&quot; data-start=&quot;1752&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1769&quot; data-start=&quot;1752&quot;&gt;BashOperator&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1783&quot; data-start=&quot;1769&quot;&gt;Bash 명령어 실행&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1801&quot; data-start=&quot;1783&quot;&gt;스크립트 실행, 파일 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1847&quot; data-start=&quot;1802&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1820&quot; data-start=&quot;1802&quot;&gt;EmailOperator&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1829&quot; data-start=&quot;1820&quot;&gt;이메일 발송&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1847&quot; data-start=&quot;1829&quot;&gt;작업 완료 또는 오류 알림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1901&quot; data-start=&quot;1848&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1865&quot; data-start=&quot;1848&quot;&gt;HttpOperator&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1882&quot; data-start=&quot;1865&quot;&gt;외부 HTTP API 호출&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1901&quot; data-start=&quot;1882&quot;&gt;주문&amp;middot;날씨&amp;middot;환율 데이터 수집&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1970&quot; data-start=&quot;1902&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1927&quot; data-start=&quot;1902&quot;&gt;BranchPythonOperator&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1945&quot; data-start=&quot;1927&quot;&gt;조건에 따라 실행 경로 선택&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1970&quot; data-start=&quot;1945&quot;&gt;매출 목표 달성 여부에 따라 작업 분기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2040&quot; data-start=&quot;1971&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1996&quot; data-start=&quot;1971&quot;&gt;ShortCircuitOperator&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2018&quot; data-start=&quot;1996&quot;&gt;조건이 거짓이면 후속 Task 생략&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2040&quot; data-start=&quot;2018&quot;&gt;신규 데이터가 없을 때 작업 중단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2104&quot; data-start=&quot;2041&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2060&quot; data-start=&quot;2041&quot;&gt;DockerOperator&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2082&quot; data-start=&quot;2060&quot;&gt;Docker 컨테이너에서 작업 실행&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2104&quot; data-start=&quot;2082&quot;&gt;독립된 환경에서 전처리&amp;middot;모델 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2172&quot; data-start=&quot;2105&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2131&quot; data-start=&quot;2105&quot;&gt;KubernetesPodOperator&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2156&quot; data-start=&quot;2131&quot;&gt;Kubernetes Pod에서 작업 실행&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2172&quot; data-start=&quot;2156&quot;&gt;작업별 독립 자원 할당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2239&quot; data-start=&quot;2173&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2199&quot; data-start=&quot;2173&quot;&gt;TriggerDagRunOperator&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2214&quot; data-start=&quot;2199&quot;&gt;다른 DAG 실행 요청&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2239&quot; data-start=&quot;2214&quot;&gt;수집 DAG 완료 후 분석 DAG 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2244&quot; data-start=&quot;2241&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2295&quot; data-start=&quot;2246&quot; data-section-id=&quot;1lhehsw&quot; data-ke-size=&quot;size26&quot;&gt;BranchPythonOperator와 ShortCircuitOperator의 차이&lt;/h2&gt;
&lt;p data-end=&quot;2339&quot; data-start=&quot;2297&quot; data-ke-size=&quot;size16&quot;&gt;두 Operator 모두 조건에 따라 실행 흐름을 제어하지만 역할이 다르다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;구분BranchPythonOperatorShortCircuitOperator
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2501&quot; data-start=&quot;2341&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2501&quot; data-start=&quot;2408&quot;&gt;
&lt;tr data-end=&quot;2451&quot; data-start=&quot;2408&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2413&quot; data-start=&quot;2408&quot;&gt;목적&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2430&quot; data-start=&quot;2413&quot;&gt;여러 경로 중 하나를 선택&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2451&quot; data-start=&quot;2430&quot;&gt;조건이 거짓이면 후속 작업 중단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2501&quot; data-start=&quot;2452&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2457&quot; data-start=&quot;2452&quot;&gt;예시&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2480&quot; data-start=&quot;2457&quot;&gt;목표 달성 시 보고서, 미달 시 경고&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2501&quot; data-start=&quot;2480&quot;&gt;신규 데이터가 없으면 분석 생략&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2549&quot; data-start=&quot;2503&quot; data-ke-size=&quot;size16&quot;&gt;BranchPythonOperator는 조건에 따라 실행할 Task를 선택한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;매출 목표 달성 여부 확인
├─ 달성 &amp;rarr; 보고서 생성
└─ 미달 &amp;rarr; 경고 알림&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2659&quot; data-start=&quot;2608&quot; data-ke-size=&quot;size16&quot;&gt;ShortCircuitOperator는 조건이 충족되지 않으면 이후 Task를 건너뛴다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;신규 데이터 존재 여부 확인
├─ 있음 &amp;rarr; 전처리 실행
└─ 없음 &amp;rarr; 후속 작업 생략&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2725&quot; data-start=&quot;2722&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2745&quot; data-start=&quot;2727&quot; data-section-id=&quot;8d4gd1&quot;&gt;4. Airflow 활용 예시&lt;/h1&gt;
&lt;p data-end=&quot;2774&quot; data-start=&quot;2747&quot; data-ke-size=&quot;size16&quot;&gt;쇼핑몰의 일일 매출 데이터를 처리한다고 가정한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;HttpOperator
쇼핑몰 API에서 주문 데이터 수집
        &amp;darr;
ShortCircuitOperator
신규 주문 데이터가 있는지 확인
        &amp;darr;
PythonOperator 또는 DockerOperator
데이터 전처리 및 매출 집계
        &amp;darr;
BranchPythonOperator
매출 목표 달성 여부에 따라 경로 선택
        &amp;darr;
EmailOperator
결과 또는 경고 메시지 전송&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3083&quot; data-start=&quot;3023&quot; data-ke-size=&quot;size16&quot;&gt;각 Operator가 하나의 Task를 담당하고, Task 사이의 실행 순서와 의존관계를 DAG가 관리한다.&lt;/p&gt;
&lt;hr data-end=&quot;3088&quot; data-start=&quot;3085&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3111&quot; data-start=&quot;3090&quot; data-section-id=&quot;16gt04&quot;&gt;5. Airflow를 사용하는 이유&lt;/h1&gt;
&lt;p data-end=&quot;3165&quot; data-start=&quot;3113&quot; data-ke-size=&quot;size16&quot;&gt;Airflow를 사용하면 복잡한 데이터 작업을 일정에 맞춰 자동으로 실행하고 관리할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3276&quot; data-start=&quot;3167&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3178&quot; data-start=&quot;3167&quot; data-section-id=&quot;wxwffw&quot;&gt;반복 작업 자동화&lt;/li&gt;
&lt;li data-end=&quot;3194&quot; data-start=&quot;3179&quot; data-section-id=&quot;zlz3vo&quot;&gt;Task 실행 순서 관리&lt;/li&gt;
&lt;li data-end=&quot;3211&quot; data-start=&quot;3195&quot; data-section-id=&quot;g0gkwa&quot;&gt;정해진 시간에 DAG 실행&lt;/li&gt;
&lt;li data-end=&quot;3228&quot; data-start=&quot;3212&quot; data-section-id=&quot;17jwjqr&quot;&gt;작업 성공&amp;middot;실패 상태 확인&lt;/li&gt;
&lt;li data-end=&quot;3243&quot; data-start=&quot;3229&quot; data-section-id=&quot;w24ttg&quot;&gt;실패한 Task 재실행&lt;/li&gt;
&lt;li data-end=&quot;3261&quot; data-start=&quot;3244&quot; data-section-id=&quot;17ej15x&quot;&gt;조건에 따른 실행 흐름 제어&lt;/li&gt;
&lt;li data-end=&quot;3276&quot; data-start=&quot;3262&quot; data-section-id=&quot;1o0f2os&quot;&gt;로그와 실행 이력 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3344&quot; data-start=&quot;3278&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 매일 오전 9시에 데이터를 수집하고, 수집이 성공했을 때만 전처리와 저장 작업을 실행하도록 설정할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;3349&quot; data-start=&quot;3346&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3372&quot; data-start=&quot;3351&quot; data-section-id=&quot;1kaj1r4&quot; data-ke-size=&quot;size26&quot;&gt;Airflow 사용 시 주의할 점&lt;/h2&gt;
&lt;p data-end=&quot;3427&quot; data-start=&quot;3374&quot; data-ke-size=&quot;size16&quot;&gt;Airflow는 데이터를 직접 처리하는 분석 도구가 아니라 &lt;b&gt;작업 실행을 관리하는 도구&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-end=&quot;3551&quot; data-start=&quot;3429&quot; data-ke-size=&quot;size16&quot;&gt;따라서 대용량 데이터 연산은 Airflow 내부에서 직접 처리하기보다 Spark, Docker, Kubernetes, 데이터베이스 등의 외부 실행환경에 맡기고 Airflow가 실행 순서를 관리하도록 구성하는 것이 좋다.&lt;/p&gt;
&lt;p data-end=&quot;3633&quot; data-start=&quot;3553&quot; data-ke-size=&quot;size16&quot;&gt;또한 Task 사이에 대용량 데이터를 직접 전달하기보다 파일 저장소나 데이터베이스에 저장한 뒤 다음 Task가 읽도록 설계하는 것이 일반적이다.&lt;/p&gt;
&lt;hr data-end=&quot;3638&quot; data-start=&quot;3635&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3644&quot; data-start=&quot;3640&quot; data-section-id=&quot;yim43j&quot;&gt;정리&lt;/h1&gt;
&lt;p data-end=&quot;3706&quot; data-start=&quot;3646&quot; data-ke-size=&quot;size16&quot;&gt;Apache Airflow는 여러 데이터 작업의 일정과 실행 순서를 관리하는 워크플로 오케스트레이션 도구다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3799&quot; data-start=&quot;3708&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3733&quot; data-start=&quot;3708&quot; data-section-id=&quot;1tbd8qc&quot;&gt;&lt;b&gt;DAG&lt;/b&gt;: 전체 작업 흐름과 의존관계&lt;/li&gt;
&lt;li data-end=&quot;3760&quot; data-start=&quot;3734&quot; data-section-id=&quot;aar2ra&quot;&gt;&lt;b&gt;Task&lt;/b&gt;: 실제로 실행되는 개별 작업&lt;/li&gt;
&lt;li data-end=&quot;3799&quot; data-start=&quot;3761&quot; data-section-id=&quot;17pjln4&quot;&gt;&lt;b&gt;Operator&lt;/b&gt;: Task가 수행할 작업을 정의하는 템플릿&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;Operator로 Task를 만들고
&amp;rarr; 여러 Task를 DAG로 연결하고
&amp;rarr; Airflow가 일정과 실행 상태를 관리한다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3956&quot; data-start=&quot;3883&quot; data-ke-size=&quot;size16&quot;&gt;Airflow를 활용하면 데이터 수집, 전처리, 저장, 분석, 알림으로 이어지는 파이프라인을 자동화하고 안정적으로 관리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Data Analysis/기타</category>
      <author>subinz</author>
      <guid isPermaLink="true">https://subinz.tistory.com/39</guid>
      <comments>https://subinz.tistory.com/39#entry39comment</comments>
      <pubDate>Fri, 31 Jul 2026 18:55:33 +0900</pubDate>
    </item>
    <item>
      <title>Git 브랜치</title>
      <link>https://subinz.tistory.com/38</link>
      <description>&lt;h1 data-end=&quot;26&quot; data-start=&quot;0&quot; data-section-id=&quot;1ccpazu&quot;&gt;Git 브랜치란? 사용하는 이유와 기본 흐름&lt;/h1&gt;
&lt;p data-end=&quot;73&quot; data-start=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;Git은 파일의 변경 이력을 기록하고 관리하는 &lt;b&gt;분산 버전 관리 시스템&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;181&quot; data-start=&quot;75&quot; data-ke-size=&quot;size16&quot;&gt;코드가 언제, 어떻게 변경되었는지 기록할 수 있으며 문제가 발생하면 이전 상태로 되돌릴 수 있다. 여러 사람이 같은 프로젝트를 함께 작업할 때도 각자의 변경 내용을 관리하고 병합할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;186&quot; data-start=&quot;183&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;196&quot; data-start=&quot;188&quot; data-section-id=&quot;1vrhyya&quot; data-ke-size=&quot;size26&quot;&gt;브랜치란?&lt;/h2&gt;
&lt;p data-end=&quot;254&quot; data-start=&quot;198&quot; data-ke-size=&quot;size16&quot;&gt;브랜치(Branch)는 기존 코드에서 독립적으로 작업할 수 있도록 만든 &lt;b&gt;별도의 작업 흐름&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;319&quot; data-start=&quot;256&quot; data-ke-size=&quot;size16&quot;&gt;기본 브랜치인 main을 직접 수정하지 않고 새로운 브랜치를 만들어 기능을 개발하거나 오류를 수정할 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;main
 └─ feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;419&quot; data-start=&quot;357&quot; data-ke-size=&quot;size16&quot;&gt;feature/login 브랜치에서 로그인 기능을 개발하더라도 main 브랜치의 코드는 그대로 유지된다.&lt;/p&gt;
&lt;p data-end=&quot;456&quot; data-start=&quot;421&quot; data-ke-size=&quot;size16&quot;&gt;작업이 완료되면 변경 내용을 검토한 뒤 main에 병합한다.&lt;/p&gt;
&lt;hr data-end=&quot;461&quot; data-start=&quot;458&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;478&quot; data-start=&quot;463&quot; data-section-id=&quot;fv6ur0&quot; data-ke-size=&quot;size26&quot;&gt;브랜치를 사용하는 이유&lt;/h2&gt;
&lt;h3 data-end=&quot;494&quot; data-start=&quot;480&quot; data-section-id=&quot;1tsd8gm&quot; data-ke-size=&quot;size23&quot;&gt;독립적인 작업 가능&lt;/h3&gt;
&lt;p data-end=&quot;526&quot; data-start=&quot;496&quot; data-ke-size=&quot;size16&quot;&gt;여러 사람이 서로 다른 기능을 동시에 개발할 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;main
├─ feature/login
├─ feature/payment
└─ fix/signup-error&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;652&quot; data-start=&quot;602&quot; data-ke-size=&quot;size16&quot;&gt;각 브랜치의 작업은 서로 분리되어 있으므로 다른 기능에 영향을 주지 않고 개발할 수 있다.&lt;/p&gt;
&lt;h3 data-end=&quot;674&quot; data-start=&quot;654&quot; data-section-id=&quot;1gaot9d&quot; data-ke-size=&quot;size23&quot;&gt;안정적인 main 브랜치 유지&lt;/h3&gt;
&lt;p data-end=&quot;722&quot; data-start=&quot;676&quot; data-ke-size=&quot;size16&quot;&gt;완성되지 않은 코드나 오류가 있는 코드를 main에 바로 반영하지 않아도 된다.&lt;/p&gt;
&lt;p data-end=&quot;782&quot; data-start=&quot;724&quot; data-ke-size=&quot;size16&quot;&gt;기능 개발과 테스트가 끝난 코드만 병합하면 main 브랜치를 비교적 안정적인 상태로 유지할 수 있다.&lt;/p&gt;
&lt;h3 data-end=&quot;796&quot; data-start=&quot;784&quot; data-section-id=&quot;cq1xpi&quot; data-ke-size=&quot;size23&quot;&gt;변경 내용 검토&lt;/h3&gt;
&lt;p data-end=&quot;862&quot; data-start=&quot;798&quot; data-ke-size=&quot;size16&quot;&gt;GitHub의 Pull Request를 사용하면 브랜치의 변경 내용을 병합하기 전에 팀원이 코드를 검토할 수 있다.&lt;/p&gt;
&lt;h3 data-end=&quot;882&quot; data-start=&quot;864&quot; data-section-id=&quot;39y7tr&quot; data-ke-size=&quot;size23&quot;&gt;문제 발생 시 관리가 쉬움&lt;/h3&gt;
&lt;p data-end=&quot;933&quot; data-start=&quot;884&quot; data-ke-size=&quot;size16&quot;&gt;기능별로 작업 내용이 분리되므로 어떤 변경으로 문제가 발생했는지 확인하고 수정하기 쉽다.&lt;/p&gt;
&lt;hr data-end=&quot;938&quot; data-start=&quot;935&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;953&quot; data-start=&quot;940&quot; data-section-id=&quot;yhbci5&quot; data-ke-size=&quot;size26&quot;&gt;브랜치 기본 명령어&lt;/h2&gt;
&lt;h3 data-end=&quot;968&quot; data-start=&quot;955&quot; data-section-id=&quot;llwap7&quot; data-ke-size=&quot;size23&quot;&gt;현재 브랜치 확인&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;git branch&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1021&quot; data-start=&quot;994&quot; data-ke-size=&quot;size16&quot;&gt;현재 작업 중인 브랜치 앞에는 *가 표시된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;* main
  feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1071&quot; data-start=&quot;1059&quot; data-section-id=&quot;l37q16&quot; data-ke-size=&quot;size23&quot;&gt;새 브랜치 생성&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;git branch feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1143&quot; data-start=&quot;1111&quot; data-ke-size=&quot;size16&quot;&gt;이 명령어는 브랜치만 생성하며 현재 위치는 바뀌지 않는다.&lt;/p&gt;
&lt;h3 data-end=&quot;1155&quot; data-start=&quot;1145&quot; data-section-id=&quot;keiozn&quot; data-ke-size=&quot;size23&quot;&gt;브랜치 이동&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;git switch feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1216&quot; data-start=&quot;1195&quot; data-ke-size=&quot;size16&quot;&gt;이전에는 다음 명령어도 많이 사용했다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;git checkout feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1280&quot; data-start=&quot;1258&quot; data-section-id=&quot;bywzn7&quot; data-ke-size=&quot;size23&quot;&gt;브랜치 생성과 이동을 동시에 수행&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;llvm&quot;&gt;&lt;code&gt;git switch -c feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1336&quot; data-start=&quot;1323&quot; data-section-id=&quot;1dqp8nr&quot; data-ke-size=&quot;size23&quot;&gt;브랜치 목록 확인&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;git branch&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1393&quot; data-start=&quot;1362&quot; data-ke-size=&quot;size16&quot;&gt;원격 브랜치까지 함께 확인하려면 다음 명령어를 사용한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;git branch -a&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1425&quot; data-start=&quot;1422&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1439&quot; data-start=&quot;1427&quot; data-section-id=&quot;17p7d9p&quot; data-ke-size=&quot;size26&quot;&gt;브랜치 작업 흐름&lt;/h2&gt;
&lt;p data-end=&quot;1460&quot; data-start=&quot;1441&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 협업 흐름은 다음과 같다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;main 최신화
&amp;rarr; 작업 브랜치 생성
&amp;rarr; 코드 수정
&amp;rarr; 커밋
&amp;rarr; 원격 저장소에 푸시
&amp;rarr; Pull Request 생성
&amp;rarr; 검토 후 main에 병합&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1575&quot; data-start=&quot;1556&quot; data-section-id=&quot;12fyyvf&quot; data-ke-size=&quot;size23&quot;&gt;1. main 브랜치로 이동&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;git switch main&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1632&quot; data-start=&quot;1606&quot; data-section-id=&quot;xmst9&quot; data-ke-size=&quot;size23&quot;&gt;2. 원격 main의 최신 내용 가져오기&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;git pull origin main&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1684&quot; data-start=&quot;1668&quot; data-section-id=&quot;1r1c73f&quot; data-ke-size=&quot;size23&quot;&gt;3. 작업 브랜치 생성&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;llvm&quot;&gt;&lt;code&gt;git switch -c feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1742&quot; data-start=&quot;1727&quot; data-section-id=&quot;9l7trl&quot; data-ke-size=&quot;size23&quot;&gt;4. 변경 내용 확인&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1783&quot; data-start=&quot;1768&quot; data-section-id=&quot;e9mch0&quot; data-ke-size=&quot;size23&quot;&gt;5. 변경 파일 추가&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1817&quot; data-start=&quot;1808&quot; data-section-id=&quot;6ib5sh&quot; data-ke-size=&quot;size23&quot;&gt;6. 커밋&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;git commit -m &quot;로그인 기능 추가&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1880&quot; data-start=&quot;1858&quot; data-section-id=&quot;qm7pd3&quot; data-ke-size=&quot;size23&quot;&gt;7. 원격 저장소에 브랜치 올리기&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;git push -u origin feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1972&quot; data-start=&quot;1928&quot; data-ke-size=&quot;size16&quot;&gt;이후 GitHub에서 Pull Request를 생성하고 main에 병합한다.&lt;/p&gt;
&lt;hr data-end=&quot;1977&quot; data-start=&quot;1974&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1989&quot; data-start=&quot;1979&quot; data-section-id=&quot;1vnnxxe&quot; data-ke-size=&quot;size26&quot;&gt;merge란?&lt;/h2&gt;
&lt;p data-end=&quot;2029&quot; data-start=&quot;1991&quot; data-ke-size=&quot;size16&quot;&gt;Merge는 한 브랜치의 변경 내용을 다른 브랜치에 합치는 작업이다.&lt;/p&gt;
&lt;p data-end=&quot;2088&quot; data-start=&quot;2031&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 feature/login의 작업을 main에 합치려면 먼저 main으로 이동한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;git switch main&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2128&quot; data-start=&quot;2119&quot; data-ke-size=&quot;size16&quot;&gt;그다음 병합한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;cos&quot;&gt;&lt;code&gt;git merge feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2230&quot; data-start=&quot;2167&quot; data-ke-size=&quot;size16&quot;&gt;협업에서는 로컬에서 직접 병합하기보다 GitHub의 Pull Request를 통해 검토 후 병합하는 경우가 많다.&lt;/p&gt;
&lt;hr data-end=&quot;2235&quot; data-start=&quot;2232&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2245&quot; data-start=&quot;2237&quot; data-section-id=&quot;1n02siz&quot; data-ke-size=&quot;size26&quot;&gt;충돌이란?&lt;/h2&gt;
&lt;p data-end=&quot;2303&quot; data-start=&quot;2247&quot; data-ke-size=&quot;size16&quot;&gt;충돌(Conflict)은 서로 다른 브랜치에서 같은 파일의 같은 부분을 다르게 수정했을 때 발생한다.&lt;/p&gt;
&lt;p data-end=&quot;2387&quot; data-start=&quot;2305&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 main과 feature/login에서 같은 코드 줄을 각각 다르게 수정하면 Git이 어느 내용을 선택해야 할지 판단할 수 없다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
main 브랜치의 코드
=======
feature 브랜치의 코드
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2520&quot; data-start=&quot;2474&quot; data-ke-size=&quot;size16&quot;&gt;충돌이 발생하면 필요한 코드를 직접 선택하거나 합친 뒤 표시 문자를 제거해야 한다.&lt;/p&gt;
&lt;p data-end=&quot;2538&quot; data-start=&quot;2522&quot; data-ke-size=&quot;size16&quot;&gt;수정이 끝나면 다시 커밋한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;git add .
git commit -m &quot;병합 충돌 해결&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2591&quot; data-start=&quot;2588&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2602&quot; data-start=&quot;2593&quot; data-section-id=&quot;ysfbvg&quot; data-ke-size=&quot;size26&quot;&gt;브랜치 삭제&lt;/h2&gt;
&lt;p data-end=&quot;2637&quot; data-start=&quot;2604&quot; data-ke-size=&quot;size16&quot;&gt;작업이 병합된 뒤 필요 없는 로컬 브랜치를 삭제할 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;git branch -d feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2719&quot; data-start=&quot;2680&quot; data-ke-size=&quot;size16&quot;&gt;아직 병합되지 않은 브랜치를 강제로 삭제하려면 다음 명령어를 사용한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;git branch -D feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2782&quot; data-start=&quot;2762&quot; data-ke-size=&quot;size16&quot;&gt;원격 브랜치는 별도로 삭제해야 한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;git push origin --delete feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2880&quot; data-start=&quot;2836&quot; data-ke-size=&quot;size16&quot;&gt;GitHub에서 원격 브랜치를 삭제해도 로컬 브랜치는 자동으로 삭제되지 않는다.&lt;/p&gt;
&lt;hr data-end=&quot;2885&quot; data-start=&quot;2882&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2899&quot; data-start=&quot;2887&quot; data-section-id=&quot;yq2355&quot; data-ke-size=&quot;size26&quot;&gt;브랜치 이름 예시&lt;/h2&gt;
&lt;p data-end=&quot;2933&quot; data-start=&quot;2901&quot; data-ke-size=&quot;size16&quot;&gt;브랜치 이름은 작업 목적이 드러나도록 작성하는 것이 좋다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;접두어사용 목적예시
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3183&quot; data-start=&quot;2935&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3183&quot; data-start=&quot;2970&quot;&gt;
&lt;tr data-end=&quot;3014&quot; data-start=&quot;2970&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2983&quot; data-start=&quot;2970&quot;&gt;feature/&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2995&quot; data-start=&quot;2983&quot;&gt;새로운 기능 개발&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3014&quot; data-start=&quot;2995&quot;&gt;feature/login&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3055&quot; data-start=&quot;3015&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3024&quot; data-start=&quot;3015&quot;&gt;fix/&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3032&quot; data-start=&quot;3024&quot;&gt;오류 수정&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3055&quot; data-start=&quot;3032&quot;&gt;fix/payment-error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3108&quot; data-start=&quot;3056&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3070&quot; data-start=&quot;3056&quot;&gt;refactor/&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3081&quot; data-start=&quot;3070&quot;&gt;코드 구조 개선&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3108&quot; data-start=&quot;3081&quot;&gt;refactor/user-service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3144&quot; data-start=&quot;3109&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3119&quot; data-start=&quot;3109&quot;&gt;docs/&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3127&quot; data-start=&quot;3119&quot;&gt;문서 수정&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3144&quot; data-start=&quot;3127&quot;&gt;docs/readme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3183&quot; data-start=&quot;3145&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3155&quot; data-start=&quot;3145&quot;&gt;test/&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3167&quot; data-start=&quot;3155&quot;&gt;테스트 코드 작성&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3183&quot; data-start=&quot;3167&quot;&gt;test/login&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3228&quot; data-start=&quot;3185&quot; data-ke-size=&quot;size16&quot;&gt;팀마다 브랜치 이름 규칙은 다를 수 있으므로 협업 규칙을 먼저 확인해야 한다.&lt;/p&gt;
&lt;hr data-end=&quot;3233&quot; data-start=&quot;3230&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3243&quot; data-start=&quot;3235&quot; data-section-id=&quot;17iloc1&quot; data-ke-size=&quot;size26&quot;&gt;주의할 점&lt;/h2&gt;
&lt;p data-end=&quot;3286&quot; data-start=&quot;3245&quot; data-ke-size=&quot;size16&quot;&gt;작업 브랜치를 만들기 전에는 main을 최신 상태로 맞추는 것이 좋다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;llvm&quot;&gt;&lt;code&gt;git switch main
git pull origin main
git switch -c feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3412&quot; data-start=&quot;3366&quot; data-ke-size=&quot;size16&quot;&gt;또한 브랜치를 이동하기 전에 작업 중인 변경 사항을 커밋하거나 임시 저장해야 한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3506&quot; data-start=&quot;3438&quot; data-ke-size=&quot;size16&quot;&gt;커밋하지 않은 변경 사항이 있는 상태에서 브랜치를 이동하면 다른 브랜치에도 변경 내용이 따라가거나 충돌이 발생할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;3511&quot; data-start=&quot;3508&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3518&quot; data-start=&quot;3513&quot; data-section-id=&quot;1melx8&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-end=&quot;3563&quot; data-start=&quot;3520&quot; data-ke-size=&quot;size16&quot;&gt;Git 브랜치는 기존 코드와 분리된 공간에서 안전하게 작업하기 위한 기능이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3686&quot; data-start=&quot;3565&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3596&quot; data-start=&quot;3565&quot; data-section-id=&quot;sdjpiw&quot;&gt;여러 사람이 서로 다른 기능을 동시에 개발할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;3632&quot; data-start=&quot;3597&quot; data-section-id=&quot;10eqr7z&quot;&gt;완성되지 않은 코드가 main에 바로 반영되는 것을 방지&lt;/li&gt;
&lt;li data-end=&quot;3653&quot; data-start=&quot;3633&quot; data-section-id=&quot;11ltkd5&quot;&gt;기능별 변경 이력을 관리하기 쉬움&lt;/li&gt;
&lt;li data-end=&quot;3686&quot; data-start=&quot;3654&quot; data-section-id=&quot;1p2kdqo&quot;&gt;Pull Request를 통해 코드 검토 후 병합 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3704&quot; data-start=&quot;3688&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 흐름은 다음과 같다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;main 최신화
&amp;rarr; 작업 브랜치 생성
&amp;rarr; 수정 및 커밋
&amp;rarr; 원격 브랜치 푸시
&amp;rarr; Pull Request
&amp;rarr; main 병합&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3841&quot; data-start=&quot;3787&quot; data-ke-size=&quot;size16&quot;&gt;브랜치를 적절히 사용하면 협업 과정에서 코드 충돌을 줄이고 안정적으로 프로젝트를 관리할 수 있다.&lt;/p&gt;</description>
      <category>Data Analysis/Git</category>
      <author>subinz</author>
      <guid isPermaLink="true">https://subinz.tistory.com/38</guid>
      <comments>https://subinz.tistory.com/38#entry38comment</comments>
      <pubDate>Fri, 31 Jul 2026 18:52:57 +0900</pubDate>
    </item>
    <item>
      <title>절대 경로와 상대 경로</title>
      <link>https://subinz.tistory.com/37</link>
      <description>&lt;h1 data-end=&quot;18&quot; data-start=&quot;0&quot; data-section-id=&quot;9hxm17&quot;&gt;절대 경로와 상대 경로의 차이&lt;/h1&gt;
&lt;p data-end=&quot;68&quot; data-start=&quot;20&quot; 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-end=&quot;106&quot; data-start=&quot;70&quot; data-ke-size=&quot;size16&quot;&gt;두 방식의 차이는 경로를 어디에서부터 시작해서 표현하는지에 있다.&lt;/p&gt;
&lt;hr data-end=&quot;111&quot; data-start=&quot;108&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;123&quot; data-start=&quot;113&quot; data-section-id=&quot;uv1ggj&quot; data-ke-size=&quot;size26&quot;&gt;절대 경로란?&lt;/h2&gt;
&lt;p data-end=&quot;192&quot; data-start=&quot;125&quot; data-ke-size=&quot;size16&quot;&gt;절대 경로(Absolute Path)는 파일이나 폴더의 위치를 &lt;b&gt;최상위 디렉터리부터 전체 경로로 표현하는 방식&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;224&quot; data-start=&quot;194&quot; data-ke-size=&quot;size16&quot;&gt;현재 작업 위치와 관계없이 항상 같은 파일을 가리킨다.&lt;/p&gt;
&lt;h3 data-end=&quot;240&quot; data-start=&quot;226&quot; data-section-id=&quot;1xgfnpp&quot; data-ke-size=&quot;size23&quot;&gt;Windows 예시&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;C:\Users\user\project\data.csv&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;304&quot; data-start=&quot;286&quot; data-section-id=&quot;1ollz0w&quot; data-ke-size=&quot;size23&quot;&gt;Linux&amp;middot;macOS 예시&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;/home/user/project/data.csv&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;423&quot; data-start=&quot;347&quot; data-ke-size=&quot;size16&quot;&gt;절대 경로는 파일의 위치를 명확하게 지정할 수 있지만, 사용자명이나 폴더 구조가 다른 컴퓨터에서는 그대로 사용할 수 없다는 단점이 있다.&lt;/p&gt;
&lt;hr data-end=&quot;428&quot; data-start=&quot;425&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;440&quot; data-start=&quot;430&quot; data-section-id=&quot;1pc6xm&quot; data-ke-size=&quot;size26&quot;&gt;상대 경로란?&lt;/h2&gt;
&lt;p data-end=&quot;509&quot; data-start=&quot;442&quot; data-ke-size=&quot;size16&quot;&gt;상대 경로(Relative Path)는 &lt;b&gt;현재 작업 중인 폴더를 기준으로&lt;/b&gt; 파일이나 폴더의 위치를 표현하는 방식이다.&lt;/p&gt;
&lt;p data-end=&quot;555&quot; data-start=&quot;511&quot; data-ke-size=&quot;size16&quot;&gt;현재 위치가 프로젝트 폴더라면 같은 폴더의 파일은 파일명만으로 접근할 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;data.csv&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;605&quot; data-start=&quot;579&quot; data-ke-size=&quot;size16&quot;&gt;하위 폴더에 있는 파일은 다음과 같이 표현한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;data/data.csv&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;660&quot; data-start=&quot;634&quot; data-ke-size=&quot;size16&quot;&gt;상위 폴더에 있는 파일은 ../를 사용한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;../data.csv&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;690&quot; data-start=&quot;687&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;707&quot; data-start=&quot;692&quot; data-section-id=&quot;ddp615&quot; data-ke-size=&quot;size26&quot;&gt;경로에서 사용하는 기호&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;표현의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;886&quot; data-start=&quot;709&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;886&quot; data-start=&quot;731&quot;&gt;
&lt;tr data-end=&quot;746&quot; data-start=&quot;731&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;737&quot; data-start=&quot;731&quot;&gt;.&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;746&quot; data-start=&quot;737&quot;&gt;현재 폴더&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;763&quot; data-start=&quot;747&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;754&quot; data-start=&quot;747&quot;&gt;..&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;763&quot; data-start=&quot;754&quot;&gt;상위 폴더&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;800&quot; data-start=&quot;764&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;779&quot; data-start=&quot;764&quot;&gt;./data.csv&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;800&quot; data-start=&quot;779&quot;&gt;현재 폴더의 data.csv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;838&quot; data-start=&quot;801&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;817&quot; data-start=&quot;801&quot;&gt;../data.csv&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;838&quot; data-start=&quot;817&quot;&gt;상위 폴더의 data.csv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;886&quot; data-start=&quot;839&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;857&quot; data-start=&quot;839&quot;&gt;data/data.csv&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;886&quot; data-start=&quot;857&quot;&gt;현재 폴더 안의 data 폴더에 있는 파일&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;949&quot; data-start=&quot;888&quot; data-ke-size=&quot;size16&quot;&gt;./는 생략할 수 있으므로 ./data.csv와 data.csv는 일반적으로 같은 파일을 의미한다.&lt;/p&gt;
&lt;hr data-end=&quot;954&quot; data-start=&quot;951&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;974&quot; data-start=&quot;956&quot; data-section-id=&quot;2mpjh4&quot; data-ke-size=&quot;size26&quot;&gt;절대 경로와 상대 경로 비교&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분절대 경로상대 경로
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1194&quot; data-start=&quot;976&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1194&quot; data-start=&quot;1013&quot;&gt;
&lt;tr data-end=&quot;1041&quot; data-start=&quot;1013&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1018&quot; data-start=&quot;1013&quot;&gt;기준&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1029&quot; data-start=&quot;1018&quot;&gt;최상위 디렉터리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1041&quot; data-start=&quot;1029&quot;&gt;현재 작업 폴더&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1069&quot; data-start=&quot;1042&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1050&quot; data-start=&quot;1042&quot;&gt;경로 길이&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1059&quot; data-start=&quot;1050&quot;&gt;길고 구체적&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1069&quot; data-start=&quot;1059&quot;&gt;짧고 간단함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1099&quot; data-start=&quot;1070&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1081&quot; data-start=&quot;1070&quot;&gt;현재 위치 영향&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1089&quot; data-start=&quot;1081&quot;&gt;받지 않음&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1099&quot; data-start=&quot;1089&quot;&gt;영향을 받음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1149&quot; data-start=&quot;1100&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1113&quot; data-start=&quot;1100&quot;&gt;다른 환경으로 이동&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1127&quot; data-start=&quot;1113&quot;&gt;경로가 깨질 수 있음&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1149&quot; data-start=&quot;1127&quot;&gt;프로젝트 구조가 같으면 유지 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1194&quot; data-start=&quot;1150&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1158&quot; data-start=&quot;1150&quot;&gt;주요 활용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1177&quot; data-start=&quot;1158&quot;&gt;특정 파일 위치를 명확히 지정&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1194&quot; data-start=&quot;1177&quot;&gt;프로젝트 내부 파일 연결&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1199&quot; data-start=&quot;1196&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1217&quot; data-start=&quot;1201&quot; data-section-id=&quot;f4q4up&quot; data-ke-size=&quot;size26&quot;&gt;파이썬에서 경로 사용하기&lt;/h2&gt;
&lt;p data-end=&quot;1261&quot; data-start=&quot;1219&quot; data-ke-size=&quot;size16&quot;&gt;현재 작업 폴더에 data.csv가 있다면 상대 경로로 불러올 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;import pandas as pd

df = pd.read_csv(&quot;data.csv&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1357&quot; data-start=&quot;1328&quot; data-ke-size=&quot;size16&quot;&gt;data 폴더 안에 있다면 다음과 같이 작성한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;df = pd.read_csv(&quot;data/data.csv&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1425&quot; data-start=&quot;1408&quot; data-ke-size=&quot;size16&quot;&gt;절대 경로를 사용할 수도 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;df = pd.read_csv(
    r&quot;C:\Users\user\project\data\data.csv&quot;
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1572&quot; data-start=&quot;1505&quot; data-ke-size=&quot;size16&quot;&gt;Windows 경로에서는 \가 특수문자로 해석될 수 있으므로 문자열 앞에 r을 붙이거나 /를 사용할 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;df = pd.read_csv(
    &quot;C:/Users/user/project/data/data.csv&quot;
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1654&quot; data-start=&quot;1651&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1670&quot; data-start=&quot;1656&quot; data-section-id=&quot;1194vh0&quot; data-ke-size=&quot;size26&quot;&gt;현재 작업 폴더 확인&lt;/h2&gt;
&lt;p data-end=&quot;1734&quot; data-start=&quot;1672&quot; data-ke-size=&quot;size16&quot;&gt;상대 경로는 현재 작업 폴더를 기준으로 해석되므로, 경로 오류가 발생하면 현재 위치를 먼저 확인하는 것이 좋다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;moonscript&quot;&gt;&lt;code&gt;import os

print(os.getcwd())&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1813&quot; data-start=&quot;1781&quot; data-ke-size=&quot;size16&quot;&gt;os.getcwd()는 현재 작업 디렉터리를 반환한다.&lt;/p&gt;
&lt;p data-end=&quot;1835&quot; data-start=&quot;1815&quot; data-ke-size=&quot;size16&quot;&gt;파일이 존재하는지도 확인할 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;import os

print(os.path.exists(&quot;data/data.csv&quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1947&quot; data-start=&quot;1902&quot; data-ke-size=&quot;size16&quot;&gt;결과가 False라면 현재 작업 폴더나 파일 경로가 잘못되었을 가능성이 있다.&lt;/p&gt;
&lt;hr data-end=&quot;1952&quot; data-start=&quot;1949&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1976&quot; data-start=&quot;1954&quot; data-section-id=&quot;1kz9xe2&quot; data-ke-size=&quot;size26&quot;&gt;어떤 경로를 사용하는 것이 좋을까?&lt;/h2&gt;
&lt;p data-end=&quot;2024&quot; data-start=&quot;1978&quot; data-ke-size=&quot;size16&quot;&gt;개인 컴퓨터에서 특정 파일을 한 번 불러오는 경우에는 절대 경로를 사용할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2072&quot; data-start=&quot;2026&quot; data-ke-size=&quot;size16&quot;&gt;하지만 협업 프로젝트나 GitHub에 올릴 코드는 상대 경로를 사용하는 것이 좋다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;project/
├─ data/
│  └─ data.csv
├─ notebook/
│  └─ analysis.ipynb
└─ src/
   └─ main.py&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2241&quot; data-start=&quot;2176&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 내부 구조를 기준으로 상대 경로를 사용하면 다른 사람이 프로젝트를 내려받아도 같은 구조에서 실행할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2315&quot; data-start=&quot;2243&quot; data-ke-size=&quot;size16&quot;&gt;반면 C:\Users\user\...와 같은 절대 경로는 작성자의 컴퓨터에만 존재하기 때문에 다른 환경에서는 오류가 발생한다.&lt;/p&gt;
&lt;hr data-end=&quot;2320&quot; data-start=&quot;2317&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2327&quot; data-start=&quot;2322&quot; data-section-id=&quot;1melx8&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-end=&quot;2395&quot; data-start=&quot;2329&quot; data-ke-size=&quot;size16&quot;&gt;절대 경로는 최상위 디렉터리부터 파일의 전체 위치를 표현하고, 상대 경로는 현재 작업 폴더를 기준으로 위치를 표현한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2484&quot; data-start=&quot;2397&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2439&quot; data-start=&quot;2397&quot; data-section-id=&quot;1864xb7&quot;&gt;&lt;b&gt;절대 경로&lt;/b&gt;: 위치가 명확하지만 환경이 바뀌면 경로가 깨질 수 있음&lt;/li&gt;
&lt;li data-end=&quot;2484&quot; data-start=&quot;2440&quot; data-section-id=&quot;exkghx&quot;&gt;&lt;b&gt;상대 경로&lt;/b&gt;: 현재 위치의 영향을 받지만 프로젝트 이동과 협업에 유리함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2565&quot; data-start=&quot;2486&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 내부 파일을 다룰 때는 상대 경로를 사용하고, 경로 오류가 발생하면 현재 작업 디렉터리와 파일 존재 여부를 먼저 확인하는 것이 좋다.&lt;/p&gt;</description>
      <category>Data Analysis/기타</category>
      <author>subinz</author>
      <guid isPermaLink="true">https://subinz.tistory.com/37</guid>
      <comments>https://subinz.tistory.com/37#entry37comment</comments>
      <pubDate>Fri, 31 Jul 2026 17:47:14 +0900</pubDate>
    </item>
    <item>
      <title>장바구니 분석</title>
      <link>https://subinz.tistory.com/36</link>
      <description>&lt;h1 data-end=&quot;41&quot; data-start=&quot;0&quot; data-section-id=&quot;dwxb3w&quot;&gt;장바구니 분석이란? Support&amp;middot;Confidence&amp;middot;Lift 해석하기&lt;/h1&gt;
&lt;p data-end=&quot;124&quot; data-start=&quot;43&quot; data-ke-size=&quot;size16&quot;&gt;장바구니 분석(Market Basket Analysis)은 고객의 거래 데이터를 바탕으로 &lt;b&gt;어떤 상품이 함께 구매되는지 찾는 분석 방법&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;186&quot; data-start=&quot;126&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 Coffee를 구매한 고객이 Toast도 자주 구매한다면 다음과 같은 연관 규칙을 만들 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;Coffee &amp;rarr; Toast&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;261&quot; data-start=&quot;216&quot; data-ke-size=&quot;size16&quot;&gt;이는 Coffee를 구매했을 때 Toast도 함께 구매하는 경향이 있다는 의미다.&lt;/p&gt;
&lt;p data-end=&quot;326&quot; data-start=&quot;263&quot; data-ke-size=&quot;size16&quot;&gt;장바구니 분석은 상품 추천, 세트 메뉴 구성, 프로모션 기획 등 고객의 추가 구매를 유도하는 데 활용할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;331&quot; data-start=&quot;328&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;350&quot; data-start=&quot;333&quot; data-section-id=&quot;1x0y4vc&quot; data-ke-size=&quot;size26&quot;&gt;장바구니 분석의 활용 사례&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;활용 사례설명비즈니스 활용
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;656&quot; data-start=&quot;352&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;656&quot; data-start=&quot;391&quot;&gt;
&lt;tr data-end=&quot;427&quot; data-start=&quot;391&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;399&quot; data-start=&quot;391&quot;&gt;교차 판매&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;415&quot; data-start=&quot;399&quot;&gt;함께 구매되는 상품 추천&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;427&quot; data-start=&quot;415&quot;&gt;추가 구매 유도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;474&quot; data-start=&quot;428&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;440&quot; data-start=&quot;428&quot;&gt;상품 진열 최적화&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;456&quot; data-start=&quot;440&quot;&gt;연관 상품을 가까이 배치&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;474&quot; data-start=&quot;456&quot;&gt;고객 편의와 충동구매 증가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;516&quot; data-start=&quot;475&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;484&quot; data-start=&quot;475&quot;&gt;추천 시스템&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;503&quot; data-start=&quot;484&quot;&gt;구매 상품과 관련된 상품 노출&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;516&quot; data-start=&quot;503&quot;&gt;구매 전환율 향상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;559&quot; data-start=&quot;517&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;527&quot; data-start=&quot;517&quot;&gt;프로모션 기획&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;542&quot; data-start=&quot;527&quot;&gt;연관 상품을 묶어 할인&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;559&quot; data-start=&quot;542&quot;&gt;효과적인 세트 상품 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;608&quot; data-start=&quot;560&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;568&quot; data-start=&quot;560&quot;&gt;재고 관리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;589&quot; data-start=&quot;568&quot;&gt;함께 판매되는 상품을 동시에 관리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;608&quot; data-start=&quot;589&quot;&gt;연관 상품의 품절 위험 예방&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;656&quot; data-start=&quot;609&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;619&quot; data-start=&quot;609&quot;&gt;신상품 마케팅&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;636&quot; data-start=&quot;619&quot;&gt;신상품을 인기 상품과 연결&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;656&quot; data-start=&quot;636&quot;&gt;신상품 노출과 초기 판매 증가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;661&quot; data-start=&quot;658&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;678&quot; data-start=&quot;663&quot; data-section-id=&quot;thclz0&quot; data-ke-size=&quot;size26&quot;&gt;연관 규칙의 주요 지표&lt;/h2&gt;
&lt;p data-end=&quot;744&quot; data-start=&quot;680&quot; data-ke-size=&quot;size16&quot;&gt;장바구니 분석에서는 규칙의 의미를 판단하기 위해 &lt;b&gt;Support, Confidence, Lift&lt;/b&gt;를 사용한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;지표의미계산 방법
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;981&quot; data-start=&quot;746&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;981&quot; data-start=&quot;780&quot;&gt;
&lt;tr data-end=&quot;843&quot; data-start=&quot;780&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;790&quot; data-start=&quot;780&quot;&gt;Support&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;816&quot; data-start=&quot;790&quot;&gt;전체 거래에서 A와 B가 함께 구매된 비율&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;843&quot; data-start=&quot;816&quot;&gt;A와 B 동시 구매 건수 &amp;divide; 전체 거래 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;911&quot; data-start=&quot;844&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;857&quot; data-start=&quot;844&quot;&gt;Confidence&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;881&quot; data-start=&quot;857&quot;&gt;A를 구매한 거래 중 B도 구매한 비율&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;911&quot; data-start=&quot;881&quot;&gt;Support(A, B) &amp;divide; Support(A)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;981&quot; data-start=&quot;912&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;919&quot; data-start=&quot;912&quot;&gt;Lift&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;949&quot; data-start=&quot;919&quot;&gt;A 구매가 B 구매 가능성을 얼마나 높이는지 측정&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;981&quot; data-start=&quot;949&quot;&gt;Confidence(A&amp;rarr;B) &amp;divide; Support(B)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;986&quot; data-start=&quot;983&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1003&quot; data-start=&quot;988&quot; data-section-id=&quot;hmkegk&quot; data-ke-size=&quot;size26&quot;&gt;Support: 지지도&lt;/h2&gt;
&lt;p data-end=&quot;1051&quot; data-start=&quot;1005&quot; data-ke-size=&quot;size16&quot;&gt;Support는 특정 상품 조합이 전체 거래에서 얼마나 자주 등장하는지를 나타낸다.&lt;/p&gt;
&lt;p data-end=&quot;1109&quot; data-start=&quot;1053&quot; data-ke-size=&quot;size16&quot;&gt;전체 거래 1,000건 중 Coffee와 Toast가 함께 구매된 거래가 150건이라면 다음과 같다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Support(Coffee, Toast) = 150 &amp;divide; 1,000 = 0.15&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1217&quot; data-start=&quot;1168&quot; data-ke-size=&quot;size16&quot;&gt;즉, 전체 거래의 &lt;b&gt;15%에서 Coffee와 Toast가 함께 구매되었다&lt;/b&gt;는 의미다.&lt;/p&gt;
&lt;p data-end=&quot;1274&quot; data-start=&quot;1219&quot; data-ke-size=&quot;size16&quot;&gt;Support가 너무 낮으면 강한 연관성이 있더라도 실제 활용할 수 있는 거래 수가 적을 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;1279&quot; data-start=&quot;1276&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1299&quot; data-start=&quot;1281&quot; data-section-id=&quot;181oyr3&quot; data-ke-size=&quot;size26&quot;&gt;Confidence: 신뢰도&lt;/h2&gt;
&lt;p data-end=&quot;1339&quot; data-start=&quot;1301&quot; data-ke-size=&quot;size16&quot;&gt;Confidence는 A를 구매한 고객이 B도 함께 구매한 비율이다.&lt;/p&gt;
&lt;p data-end=&quot;1407&quot; data-start=&quot;1341&quot; data-ke-size=&quot;size16&quot;&gt;Coffee 구매 거래가 300건이고, 그중 Coffee와 Toast를 함께 구매한 거래가 150건이라면 다음과 같다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Confidence(Coffee &amp;rarr; Toast) = 150 &amp;divide; 300 = 0.5&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1517&quot; data-start=&quot;1467&quot; data-ke-size=&quot;size16&quot;&gt;즉, Coffee를 구매한 거래의 &lt;b&gt;50%에서 Toast도 함께 구매되었다&lt;/b&gt;는 의미다.&lt;/p&gt;
&lt;p data-end=&quot;1593&quot; data-start=&quot;1519&quot; data-ke-size=&quot;size16&quot;&gt;다만 Toast 자체가 원래 매우 인기 있는 상품이라면 Confidence가 높게 나타날 수 있으므로 Lift도 함께 확인해야 한다.&lt;/p&gt;
&lt;hr data-end=&quot;1598&quot; data-start=&quot;1595&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1612&quot; data-start=&quot;1600&quot; data-section-id=&quot;t1p24o&quot; data-ke-size=&quot;size26&quot;&gt;Lift: 향상도&lt;/h2&gt;
&lt;p data-end=&quot;1665&quot; data-start=&quot;1614&quot; data-ke-size=&quot;size16&quot;&gt;Lift는 A를 구매한 고객이 일반 고객보다 B를 구매할 가능성이 얼마나 높은지를 나타낸다.&lt;/p&gt;
&lt;p data-end=&quot;1733&quot; data-start=&quot;1667&quot; data-ke-size=&quot;size16&quot;&gt;Coffee를 구매한 고객의 Toast 구매율이 50%이고, 전체 거래에서 Toast 구매율이 20%라면 다음과 같다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Lift(Coffee &amp;rarr; Toast) = 0.5 &amp;divide; 0.2 = 2.5&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1845&quot; data-start=&quot;1787&quot; data-ke-size=&quot;size16&quot;&gt;즉, Coffee 구매 고객은 전체 고객보다 Toast를 구매할 가능성이 &lt;b&gt;2.5배 높다&lt;/b&gt;는 의미다.&lt;/p&gt;
&lt;hr data-end=&quot;1850&quot; data-start=&quot;1847&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1862&quot; data-start=&quot;1852&quot; data-section-id=&quot;10tpfob&quot; data-ke-size=&quot;size26&quot;&gt;Lift 해석&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;Lift 값의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1998&quot; data-start=&quot;1864&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1998&quot; data-start=&quot;1890&quot;&gt;
&lt;tr data-end=&quot;1931&quot; data-start=&quot;1890&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1901&quot; data-start=&quot;1890&quot;&gt;Lift &amp;lt; 1&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1931&quot; data-start=&quot;1901&quot;&gt;A와 B가 함께 구매될 가능성이 상대적으로 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1960&quot; data-start=&quot;1932&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1943&quot; data-start=&quot;1932&quot;&gt;Lift = 1&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1960&quot; data-start=&quot;1943&quot;&gt;A와 B가 서로 독립적임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1998&quot; data-start=&quot;1961&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1972&quot; data-start=&quot;1961&quot;&gt;Lift &amp;gt; 1&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1998&quot; data-start=&quot;1972&quot;&gt;A 구매가 B 구매와 양의 연관성을 가짐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2033&quot; data-start=&quot;2000&quot; data-ke-size=&quot;size16&quot;&gt;Lift가 클수록 두 상품의 연관성이 강하다고 볼 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2136&quot; data-start=&quot;2035&quot; data-ke-size=&quot;size16&quot;&gt;다만 Lift &amp;gt; 2 또는 Lift &amp;gt; 3을 무조건 강한 규칙으로 판단하는 고정 기준은 없다. 상품 종류, 거래량, Support와 Confidence를 함께 고려해야 한다.&lt;/p&gt;
&lt;hr data-end=&quot;2141&quot; data-start=&quot;2138&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2154&quot; data-start=&quot;2143&quot; data-section-id=&quot;12mq8h0&quot; data-ke-size=&quot;size26&quot;&gt;분석 결과 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;규칙SupportConfidenceLift
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2250&quot; data-start=&quot;2156&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2250&quot; data-start=&quot;2214&quot;&gt;
&lt;tr data-end=&quot;2250&quot; data-start=&quot;2214&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2231&quot; data-start=&quot;2214&quot;&gt;Coffee &amp;rarr; Toast&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2237&quot; data-start=&quot;2231&quot;&gt;15%&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2243&quot; data-start=&quot;2237&quot;&gt;50%&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2250&quot; data-start=&quot;2243&quot;&gt;2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2258&quot; data-start=&quot;2252&quot; data-section-id=&quot;1hrnne7&quot; data-ke-size=&quot;size23&quot;&gt;해석&lt;/h3&gt;
&lt;p data-end=&quot;2297&quot; data-start=&quot;2260&quot; data-ke-size=&quot;size16&quot;&gt;전체 거래의 15%에서 Coffee와 Toast가 함께 구매되었다.&lt;/p&gt;
&lt;p data-end=&quot;2386&quot; data-start=&quot;2299&quot; data-ke-size=&quot;size16&quot;&gt;또한 Coffee를 구매한 거래의 50%에서 Toast도 구매되었으며, Coffee 구매 고객은 전체 고객보다 Toast를 구매할 가능성이 2.5배 높았다.&lt;/p&gt;
&lt;p data-end=&quot;2412&quot; data-start=&quot;2388&quot; data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같은 전략을 고려할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2504&quot; data-start=&quot;2414&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2436&quot; data-start=&quot;2414&quot; data-section-id=&quot;mfimcl&quot;&gt;Coffee 구매 시 Toast 추천&lt;/li&gt;
&lt;li data-end=&quot;2461&quot; data-start=&quot;2437&quot; data-section-id=&quot;mf51qc&quot;&gt;Coffee와 Toast 세트 메뉴 구성&lt;/li&gt;
&lt;li data-end=&quot;2478&quot; data-start=&quot;2462&quot; data-section-id=&quot;biy3ya&quot;&gt;두 상품의 묶음 할인 제공&lt;/li&gt;
&lt;li data-end=&quot;2504&quot; data-start=&quot;2479&quot; data-section-id=&quot;40gr0&quot;&gt;매장 또는 화면에서 두 상품을 가까이 배치&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2509&quot; data-start=&quot;2506&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2526&quot; data-start=&quot;2511&quot; data-section-id=&quot;oki95v&quot; data-ke-size=&quot;size26&quot;&gt;Apriori 알고리즘&lt;/h2&gt;
&lt;p data-end=&quot;2568&quot; data-start=&quot;2528&quot; data-ke-size=&quot;size16&quot;&gt;장바구니 분석에서는 대표적으로 &lt;b&gt;Apriori 알고리즘&lt;/b&gt;을 사용한다.&lt;/p&gt;
&lt;p data-end=&quot;2627&quot; data-start=&quot;2570&quot; data-ke-size=&quot;size16&quot;&gt;Apriori는 자주 등장하는 상품 조합을 먼저 찾고, 이를 바탕으로 의미 있는 연관 규칙을 생성한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;빈번하게 등장하는 상품 조합 탐색
&amp;rarr; 연관 규칙 생성
&amp;rarr; Support&amp;middot;Confidence&amp;middot;Lift로 규칙 평가&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2781&quot; data-start=&quot;2705&quot; data-ke-size=&quot;size16&quot;&gt;상품 종류가 많으면 가능한 조합의 수가 급격히 증가하므로 최소 Support와 Confidence 기준을 설정해 불필요한 규칙을 줄인다.&lt;/p&gt;
&lt;hr data-end=&quot;2786&quot; data-start=&quot;2783&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2801&quot; data-start=&quot;2788&quot; data-section-id=&quot;k6x844&quot; data-ke-size=&quot;size26&quot;&gt;분석 시 주의할 점&lt;/h2&gt;
&lt;p data-end=&quot;2853&quot; data-start=&quot;2803&quot; data-ke-size=&quot;size16&quot;&gt;장바구니 분석의 결과는 상품 간의 &lt;b&gt;연관성&lt;/b&gt;을 보여줄 뿐 인과관계를 증명하지는 않는다.&lt;/p&gt;
&lt;p data-end=&quot;2937&quot; data-start=&quot;2855&quot; data-ke-size=&quot;size16&quot;&gt;Coffee가 Toast 구매를 직접 발생시켰다고 단정할 수는 없다. 아침 시간대, 할인 행사, 세트 메뉴 등 다른 요인이 영향을 주었을 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2994&quot; data-start=&quot;2939&quot; data-ke-size=&quot;size16&quot;&gt;또한 Lift가 높더라도 Support가 지나치게 낮다면 극소수 거래에서만 나타난 규칙일 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;3018&quot; data-start=&quot;2996&quot; data-ke-size=&quot;size16&quot;&gt;따라서 다음 지표를 함께 확인해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3116&quot; data-start=&quot;3020&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3039&quot; data-start=&quot;3020&quot; data-section-id=&quot;tozqea&quot;&gt;규칙이 충분히 자주 발생하는가?&lt;/li&gt;
&lt;li data-end=&quot;3065&quot; data-start=&quot;3040&quot; data-section-id=&quot;a0xm4f&quot;&gt;A 구매자 중 B를 구매한 비율이 높은가?&lt;/li&gt;
&lt;li data-end=&quot;3089&quot; data-start=&quot;3066&quot; data-section-id=&quot;fjl0r2&quot;&gt;일반적인 B 구매율보다 실제로 높은가?&lt;/li&gt;
&lt;li data-end=&quot;3116&quot; data-start=&quot;3090&quot; data-section-id=&quot;1jov48y&quot;&gt;비즈니스에서 활용할 수 있는 상품 조합인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3121&quot; data-start=&quot;3118&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3128&quot; data-start=&quot;3123&quot; data-section-id=&quot;1melx8&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-end=&quot;3172&quot; data-start=&quot;3130&quot; data-ke-size=&quot;size16&quot;&gt;장바구니 분석은 거래 데이터에서 함께 구매되는 상품의 패턴을 찾는 방법이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3303&quot; data-start=&quot;3174&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3220&quot; data-start=&quot;3174&quot; data-section-id=&quot;1tk8scn&quot;&gt;&lt;b&gt;Support&lt;/b&gt;: 해당 상품 조합이 전체 거래에서 얼마나 자주 등장하는가?&lt;/li&gt;
&lt;li data-end=&quot;3265&quot; data-start=&quot;3221&quot; data-section-id=&quot;1rn5rta&quot;&gt;&lt;b&gt;Confidence&lt;/b&gt;: A를 구매했을 때 B도 구매한 비율은 얼마인가?&lt;/li&gt;
&lt;li data-end=&quot;3303&quot; data-start=&quot;3266&quot; data-section-id=&quot;1tajuf&quot;&gt;&lt;b&gt;Lift&lt;/b&gt;: A 구매가 B 구매 가능성을 얼마나 높이는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3374&quot; data-start=&quot;3305&quot; data-ke-size=&quot;size16&quot;&gt;세 지표를 함께 분석하면 단순히 많이 판매되는 상품이 아니라, 실제로 함께 구매되는 경향이 강한 상품 조합을 찾을 수 있다.&lt;/p&gt;</description>
      <category>Data Analysis</category>
      <author>subinz</author>
      <guid isPermaLink="true">https://subinz.tistory.com/36</guid>
      <comments>https://subinz.tistory.com/36#entry36comment</comments>
      <pubDate>Fri, 31 Jul 2026 17:45:41 +0900</pubDate>
    </item>
    <item>
      <title>주성분 분석과 요인 분석</title>
      <link>https://subinz.tistory.com/35</link>
      <description>&lt;h1 data-end=&quot;19&quot; data-start=&quot;0&quot; data-section-id=&quot;1i79q9n&quot;&gt;주성분 분석과 요인 분석의 차이&lt;/h1&gt;
&lt;p data-end=&quot;76&quot; data-start=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;주성분 분석(PCA)과 요인 분석(FA)은 모두 여러 변수를 더 적은 수의 변수로 줄이는 방법이다.&lt;/p&gt;
&lt;p data-end=&quot;90&quot; data-start=&quot;78&quot; data-ke-size=&quot;size16&quot;&gt;하지만 목적은 다르다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;176&quot; data-start=&quot;92&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;133&quot; data-start=&quot;92&quot; data-section-id=&quot;5kvelq&quot;&gt;&lt;b&gt;주성분 분석&lt;/b&gt;: 기존 변수의 정보를 최대한 유지하면서 차원을 축소&lt;/li&gt;
&lt;li data-end=&quot;176&quot; data-start=&quot;134&quot; data-section-id=&quot;1bbuvwu&quot;&gt;&lt;b&gt;요인 분석&lt;/b&gt;: 관측된 변수에 공통으로 영향을 주는 잠재 요인을 발견&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;181&quot; data-start=&quot;178&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;195&quot; data-start=&quot;183&quot; data-section-id=&quot;gwoyny&quot; data-ke-size=&quot;size26&quot;&gt;주성분 분석이란?&lt;/h2&gt;
&lt;p data-end=&quot;282&quot; data-start=&quot;197&quot; data-ke-size=&quot;size16&quot;&gt;주성분 분석(Principal Component Analysis)은 여러 변수의 정보를 서로 독립적인 새로운 변수인 &lt;b&gt;주성분&lt;/b&gt;으로 압축하는 방법이다.&lt;/p&gt;
&lt;p data-end=&quot;366&quot; data-start=&quot;284&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 주성분은 전체 데이터의 변동을 가장 많이 설명하고, 두 번째 주성분은 첫 번째 주성분과 겹치지 않는 범위에서 남은 변동을 최대한 설명한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;기존 변수 여러 개
&amp;rarr; 정보가 많이 담긴 소수의 주성분으로 변환&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;447&quot; data-start=&quot;417&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 고객 데이터에 다음 변수가 있다고 가정한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;489&quot; data-start=&quot;449&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;456&quot; data-start=&quot;449&quot; data-section-id=&quot;hkcl47&quot;&gt;구매 횟수&lt;/li&gt;
&lt;li data-end=&quot;464&quot; data-start=&quot;457&quot; data-section-id=&quot;hkj6qx&quot;&gt;구매 금액&lt;/li&gt;
&lt;li data-end=&quot;472&quot; data-start=&quot;465&quot; data-section-id=&quot;97gbum&quot;&gt;방문 횟수&lt;/li&gt;
&lt;li data-end=&quot;479&quot; data-start=&quot;473&quot; data-section-id=&quot;bzk3h8&quot;&gt;체류시간&lt;/li&gt;
&lt;li data-end=&quot;489&quot; data-start=&quot;480&quot; data-section-id=&quot;12lqszp&quot;&gt;상품 조회 수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;557&quot; data-start=&quot;491&quot; data-ke-size=&quot;size16&quot;&gt;PCA를 적용하면 이러한 변수들을 조합하여 고객 활동성, 구매 규모와 유사한 몇 개의 주성분으로 줄일 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;598&quot; data-start=&quot;559&quot; data-ke-size=&quot;size16&quot;&gt;다만 주성분의 의미는 분석자가 각 변수의 가중치를 보고 해석해야 한다.&lt;/p&gt;
&lt;hr data-end=&quot;603&quot; data-start=&quot;600&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;616&quot; data-start=&quot;605&quot; data-section-id=&quot;1cae07v&quot; data-ke-size=&quot;size26&quot;&gt;요인 분석이란?&lt;/h2&gt;
&lt;p data-end=&quot;685&quot; data-start=&quot;618&quot; data-ke-size=&quot;size16&quot;&gt;요인 분석(Factor Analysis)은 여러 관측 변수 사이의 상관관계를 설명하는 &lt;b&gt;잠재 요인&lt;/b&gt;을 찾는 방법이다.&lt;/p&gt;
&lt;p data-end=&quot;731&quot; data-start=&quot;687&quot; data-ke-size=&quot;size16&quot;&gt;잠재 요인은 직접 측정할 수 없지만 여러 변수에 공통으로 영향을 주는 개념이다.&lt;/p&gt;
&lt;p data-end=&quot;766&quot; data-start=&quot;733&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 고객 만족도 설문에 다음 문항이 있다고 가정한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;836&quot; data-start=&quot;768&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;779&quot; data-start=&quot;768&quot; data-section-id=&quot;5lqgl7&quot;&gt;직원이 친절했다.&lt;/li&gt;
&lt;li data-end=&quot;793&quot; data-start=&quot;780&quot; data-section-id=&quot;1yisqiy&quot;&gt;문의 응답이 빨랐다.&lt;/li&gt;
&lt;li data-end=&quot;808&quot; data-start=&quot;794&quot; data-section-id=&quot;1jbhtrq&quot;&gt;문제 처리가 원활했다.&lt;/li&gt;
&lt;li data-end=&quot;822&quot; data-start=&quot;809&quot; data-section-id=&quot;1uxmtnw&quot;&gt;상품 품질이 좋았다.&lt;/li&gt;
&lt;li data-end=&quot;836&quot; data-start=&quot;823&quot; data-section-id=&quot;asehc7&quot;&gt;가격이 합리적이었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;873&quot; data-start=&quot;838&quot; data-ke-size=&quot;size16&quot;&gt;요인 분석을 적용하면 다음과 같은 잠재 요인을 발견할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;899&quot; data-start=&quot;875&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;887&quot; data-start=&quot;875&quot; data-section-id=&quot;2e2k8g&quot;&gt;고객 서비스 만족도&lt;/li&gt;
&lt;li data-end=&quot;899&quot; data-start=&quot;888&quot; data-section-id=&quot;f4iffk&quot;&gt;상품 가치 만족도&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;955&quot; data-start=&quot;901&quot; data-ke-size=&quot;size16&quot;&gt;즉, 개별 문항을 단순히 압축하기보다 여러 문항 뒤에 존재하는 공통 개념을 찾는 데 초점을 둔다.&lt;/p&gt;
&lt;hr data-end=&quot;960&quot; data-start=&quot;957&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;979&quot; data-start=&quot;962&quot; data-section-id=&quot;1ej0rd2&quot; data-ke-size=&quot;size26&quot;&gt;PCA와 요인 분석의 차이&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분주성분 분석요인 분석
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1260&quot; data-start=&quot;981&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1260&quot; data-start=&quot;1019&quot;&gt;
&lt;tr data-end=&quot;1055&quot; data-start=&quot;1019&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1027&quot; data-start=&quot;1019&quot;&gt;주요 목적&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1043&quot; data-start=&quot;1027&quot;&gt;데이터 압축과 차원 축소&lt;/td&gt;
&lt;td data-end=&quot;1055&quot; data-start=&quot;1043&quot; data-col-size=&quot;sm&quot;&gt;잠재 요인 발견&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1090&quot; data-start=&quot;1056&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1064&quot; data-start=&quot;1056&quot;&gt;분석 대상&lt;/td&gt;
&lt;td data-end=&quot;1076&quot; data-start=&quot;1064&quot; data-col-size=&quot;sm&quot;&gt;변수의 전체 분산&lt;/td&gt;
&lt;td data-end=&quot;1090&quot; data-start=&quot;1076&quot; data-col-size=&quot;sm&quot;&gt;변수 간 공통 분산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1114&quot; data-start=&quot;1091&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1099&quot; data-start=&quot;1091&quot;&gt;생성 결과&lt;/td&gt;
&lt;td data-end=&quot;1105&quot; data-start=&quot;1099&quot; data-col-size=&quot;sm&quot;&gt;주성분&lt;/td&gt;
&lt;td data-end=&quot;1114&quot; data-start=&quot;1105&quot; data-col-size=&quot;sm&quot;&gt;잠재 요인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1163&quot; data-start=&quot;1115&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1128&quot; data-start=&quot;1115&quot;&gt;주성분&amp;middot;요인의 의미&lt;/td&gt;
&lt;td data-end=&quot;1143&quot; data-start=&quot;1128&quot; data-col-size=&quot;sm&quot;&gt;수학적 정보 압축 결과&lt;/td&gt;
&lt;td data-end=&quot;1163&quot; data-start=&quot;1143&quot; data-col-size=&quot;sm&quot;&gt;변수에 영향을 주는 숨은 개념&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1210&quot; data-start=&quot;1164&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1172&quot; data-start=&quot;1164&quot;&gt;주요 활용&lt;/td&gt;
&lt;td data-end=&quot;1190&quot; data-start=&quot;1172&quot; data-col-size=&quot;sm&quot;&gt;시각화, 전처리, 변수 축소&lt;/td&gt;
&lt;td data-end=&quot;1210&quot; data-start=&quot;1190&quot; data-col-size=&quot;sm&quot;&gt;설문 분석, 심리&amp;middot;마케팅 연구&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1260&quot; data-start=&quot;1211&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1219&quot; data-start=&quot;1211&quot;&gt;오차 고려&lt;/td&gt;
&lt;td data-end=&quot;1240&quot; data-start=&quot;1219&quot; data-col-size=&quot;sm&quot;&gt;별도의 측정 오차를 가정하지 않음&lt;/td&gt;
&lt;td data-end=&quot;1260&quot; data-start=&quot;1240&quot; data-col-size=&quot;sm&quot;&gt;고유 요인과 측정 오차를 고려&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1265&quot; data-start=&quot;1262&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1277&quot; data-start=&quot;1267&quot; data-section-id=&quot;bb7lw4&quot; data-ke-size=&quot;size26&quot;&gt;쉽게 구분하기&lt;/h2&gt;
&lt;p data-end=&quot;1296&quot; data-start=&quot;1279&quot; data-ke-size=&quot;size16&quot;&gt;PCA는 다음 질문에 적합하다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1335&quot; data-start=&quot;1298&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1335&quot; data-start=&quot;1300&quot; data-ke-size=&quot;size16&quot;&gt;변수는 많지만 정보 손실을 줄이면서 변수 수를 줄일 수 있을까?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1356&quot; data-start=&quot;1337&quot; data-ke-size=&quot;size16&quot;&gt;요인 분석은 다음 질문에 적합하다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1392&quot; data-start=&quot;1358&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1392&quot; data-start=&quot;1360&quot; data-ke-size=&quot;size16&quot;&gt;여러 변수의 상관관계를 만들어내는 공통된 원인은 무엇일까?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;PCA: 여러 변수를 압축
요인 분석: 변수 뒤에 숨은 원인을 탐색&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1448&quot; data-start=&quot;1445&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1463&quot; data-start=&quot;1450&quot; data-section-id=&quot;1iejoya&quot; data-ke-size=&quot;size26&quot;&gt;PCA의 주요 활용&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1546&quot; data-start=&quot;1465&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1484&quot; data-start=&quot;1465&quot; data-section-id=&quot;1d17l3n&quot;&gt;변수가 많은 데이터의 차원 축소&lt;/li&gt;
&lt;li data-end=&quot;1504&quot; data-start=&quot;1485&quot; data-section-id=&quot;8kh6yw&quot;&gt;머신러닝 모델의 입력 변수 축소&lt;/li&gt;
&lt;li data-end=&quot;1515&quot; data-start=&quot;1505&quot; data-section-id=&quot;8l5n7t&quot;&gt;다중공선성 완화&lt;/li&gt;
&lt;li data-end=&quot;1534&quot; data-start=&quot;1516&quot; data-section-id=&quot;uj6cf&quot;&gt;고차원 데이터의 2차원 시각화&lt;/li&gt;
&lt;li data-end=&quot;1546&quot; data-start=&quot;1535&quot; data-section-id=&quot;1t1pki1&quot;&gt;군집화 전 전처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1614&quot; data-start=&quot;1548&quot; data-ke-size=&quot;size16&quot;&gt;PCA를 사용하면 변수 수와 계산량을 줄일 수 있지만, 새롭게 생성된 주성분은 원래 변수보다 해석하기 어려울 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;1619&quot; data-start=&quot;1616&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1636&quot; data-start=&quot;1621&quot; data-section-id=&quot;l63no5&quot; data-ke-size=&quot;size26&quot;&gt;요인 분석의 주요 활용&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1717&quot; data-start=&quot;1638&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1652&quot; data-start=&quot;1638&quot; data-section-id=&quot;1qr4rqh&quot;&gt;고객 만족도 설문 분석&lt;/li&gt;
&lt;li data-end=&quot;1671&quot; data-start=&quot;1653&quot; data-section-id=&quot;5g0ckk&quot;&gt;브랜드 이미지 구성 요소 파악&lt;/li&gt;
&lt;li data-end=&quot;1687&quot; data-start=&quot;1672&quot; data-section-id=&quot;myxdqp&quot;&gt;심리적 특성과 태도 측정&lt;/li&gt;
&lt;li data-end=&quot;1702&quot; data-start=&quot;1688&quot; data-section-id=&quot;17domia&quot;&gt;비슷한 설문 문항 통합&lt;/li&gt;
&lt;li data-end=&quot;1717&quot; data-start=&quot;1703&quot; data-section-id=&quot;m4avj9&quot;&gt;측정 척도의 구조 검토&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1777&quot; data-start=&quot;1719&quot; data-ke-size=&quot;size16&quot;&gt;요인 분석에서는 각 변수가 특정 요인과 얼마나 관련되어 있는지를 나타내는 &lt;b&gt;요인 적재량&lt;/b&gt;을 확인한다.&lt;/p&gt;
&lt;p data-end=&quot;1827&quot; data-start=&quot;1779&quot; data-ke-size=&quot;size16&quot;&gt;요인 적재량의 절댓값이 클수록 해당 변수가 그 요인과 강하게 관련되어 있다고 해석한다.&lt;/p&gt;
&lt;hr data-end=&quot;1832&quot; data-start=&quot;1829&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1847&quot; data-start=&quot;1834&quot; data-section-id=&quot;k6x844&quot; data-ke-size=&quot;size26&quot;&gt;분석 시 주의할 점&lt;/h2&gt;
&lt;p data-end=&quot;1884&quot; data-start=&quot;1849&quot; data-ke-size=&quot;size16&quot;&gt;PCA와 요인 분석은 변수의 단위 차이에 영향을 받을 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;1991&quot; data-start=&quot;1886&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 구매 횟수는 0~20 범위인데 구매 금액은 수백만 원 단위라면, 구매 금액이 결과에 지나치게 큰 영향을 줄 수 있다. 따라서 단위가 다른 변수는 일반적으로 표준화한 뒤 분석한다.&lt;/p&gt;
&lt;p data-end=&quot;2088&quot; data-start=&quot;1993&quot; data-ke-size=&quot;size16&quot;&gt;또한 두 방법 모두 변수 사이에 일정한 상관관계가 있어야 의미 있는 결과를 얻을 수 있다. 서로 거의 관계없는 변수를 억지로 축소하거나 요인으로 묶는 것은 적절하지 않다.&lt;/p&gt;
&lt;hr data-end=&quot;2093&quot; data-start=&quot;2090&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2100&quot; data-start=&quot;2095&quot; data-section-id=&quot;1melx8&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-end=&quot;2146&quot; data-start=&quot;2102&quot; data-ke-size=&quot;size16&quot;&gt;주성분 분석과 요인 분석은 모두 변수 수를 줄이는 데 활용되지만 목적이 다르다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2236&quot; data-start=&quot;2148&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2191&quot; data-start=&quot;2148&quot; data-section-id=&quot;hcyyob&quot;&gt;&lt;b&gt;주성분 분석&lt;/b&gt;은 전체 정보 손실을 줄이면서 변수를 압축하는 방법이다.&lt;/li&gt;
&lt;li data-end=&quot;2236&quot; data-start=&quot;2192&quot; data-section-id=&quot;j4j2v5&quot;&gt;&lt;b&gt;요인 분석&lt;/b&gt;은 변수들의 상관관계를 설명하는 잠재 요인을 찾는 방법이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2312&quot; data-start=&quot;2238&quot; data-ke-size=&quot;size16&quot;&gt;데이터 전처리와 시각화가 목적이라면 PCA가 적합하고, 설문 문항이나 관측 변수 뒤에 숨은 개념을 찾고 싶다면 요인 분석이 적합하다.&lt;/p&gt;</description>
      <category>Data Analysis/머신러닝</category>
      <author>subinz</author>
      <guid isPermaLink="true">https://subinz.tistory.com/35</guid>
      <comments>https://subinz.tistory.com/35#entry35comment</comments>
      <pubDate>Fri, 31 Jul 2026 17:40:35 +0900</pubDate>
    </item>
    <item>
      <title>부스팅</title>
      <link>https://subinz.tistory.com/34</link>
      <description>&lt;h1 data-end=&quot;8&quot; data-start=&quot;0&quot; data-section-id=&quot;1seevos&quot;&gt;부스팅이란?&lt;/h1&gt;
&lt;p data-end=&quot;96&quot; data-start=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;부스팅(Boosting)은 여러 개의 약한 모델을 &lt;b&gt;순차적으로 학습시키고, 이전 모델의 오류를 다음 모델이 보완하도록 만드는 앙상블 학습 방법&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;151&quot; data-start=&quot;98&quot; data-ke-size=&quot;size16&quot;&gt;하나의 복잡한 모델을 만드는 대신 성능이 낮은 여러 모델을 이어 붙여 강한 예측 모델을 만든다.&lt;/p&gt;
&lt;p data-end=&quot;201&quot; data-start=&quot;153&quot; data-ke-size=&quot;size16&quot;&gt;주로 얕은 결정트리를 기본 모델로 사용하며, 분류와 회귀 문제 모두에 활용할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;206&quot; data-start=&quot;203&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;221&quot; data-start=&quot;208&quot; data-section-id=&quot;39kuuc&quot; data-ke-size=&quot;size26&quot;&gt;부스팅의 학습 방식&lt;/h2&gt;
&lt;p data-end=&quot;257&quot; data-start=&quot;223&quot; data-ke-size=&quot;size16&quot;&gt;부스팅은 모델을 동시에 만드는 것이 아니라 순서대로 학습한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;첫 번째 모델 학습
&amp;rarr; 잘못 예측한 데이터 확인
&amp;rarr; 두 번째 모델이 이전 오류를 보완
&amp;rarr; 다음 모델이 남은 오류를 다시 보완
&amp;rarr; 여러 모델의 결과를 결합&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;431&quot; data-start=&quot;358&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 첫 번째 트리가 결제 고객 일부를 미결제로 잘못 예측했다면, 다음 트리는 해당 데이터를 더 잘 맞히는 방향으로 학습한다.&lt;/p&gt;
&lt;p data-end=&quot;463&quot; data-start=&quot;433&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 반복하면서 전체 모델의 예측 성능을 높인다.&lt;/p&gt;
&lt;hr data-end=&quot;468&quot; data-start=&quot;465&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;484&quot; data-start=&quot;470&quot; data-section-id=&quot;1emt3gp&quot; data-ke-size=&quot;size26&quot;&gt;배깅과 부스팅의 차이&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분배깅부스팅
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;736&quot; data-start=&quot;486&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;736&quot; data-start=&quot;518&quot;&gt;
&lt;tr data-end=&quot;567&quot; data-start=&quot;518&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;526&quot; data-start=&quot;518&quot;&gt;학습 방식&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;544&quot; data-start=&quot;526&quot;&gt;여러 모델을 독립적으로 학습&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;567&quot; data-start=&quot;544&quot;&gt;이전 모델의 오류를 순차적으로 보완&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;605&quot; data-start=&quot;568&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;576&quot; data-start=&quot;568&quot;&gt;모델 관계&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;585&quot; data-start=&quot;576&quot;&gt;서로 독립적&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;605&quot; data-start=&quot;585&quot;&gt;앞 모델의 결과에 영향을 받음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;643&quot; data-start=&quot;606&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;614&quot; data-start=&quot;606&quot;&gt;결과 결합&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;626&quot; data-start=&quot;614&quot;&gt;평균 또는 다수결&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;643&quot; data-start=&quot;626&quot;&gt;모델별 예측을 가중 결합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;677&quot; data-start=&quot;644&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;652&quot; data-start=&quot;644&quot;&gt;주요 목적&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;660&quot; data-start=&quot;652&quot;&gt;분산 감소&lt;/td&gt;
&lt;td data-end=&quot;677&quot; data-start=&quot;660&quot; data-col-size=&quot;sm&quot;&gt;편향 감소 및 성능 향상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;736&quot; data-start=&quot;678&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;686&quot; data-start=&quot;678&quot;&gt;대표 모델&lt;/td&gt;
&lt;td data-end=&quot;696&quot; data-start=&quot;686&quot; data-col-size=&quot;sm&quot;&gt;랜덤 포레스트&lt;/td&gt;
&lt;td data-end=&quot;736&quot; data-start=&quot;696&quot; data-col-size=&quot;sm&quot;&gt;AdaBoost, Gradient Boosting, XGBoost&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;803&quot; data-start=&quot;738&quot; data-ke-size=&quot;size16&quot;&gt;배깅은 여러 모델을 병렬로 학습할 수 있지만, 부스팅은 이전 모델의 결과가 필요하므로 기본적으로 순차적으로 학습한다.&lt;/p&gt;
&lt;hr data-end=&quot;808&quot; data-start=&quot;805&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;826&quot; data-start=&quot;810&quot; data-section-id=&quot;1bv2w8p&quot; data-ke-size=&quot;size26&quot;&gt;대표적인 부스팅 알고리즘&lt;/h2&gt;
&lt;h3 data-end=&quot;840&quot; data-start=&quot;828&quot; data-section-id=&quot;gmspl3&quot; data-ke-size=&quot;size23&quot;&gt;AdaBoost&lt;/h3&gt;
&lt;p data-end=&quot;886&quot; data-start=&quot;842&quot; data-ke-size=&quot;size16&quot;&gt;AdaBoost는 이전 모델이 잘못 예측한 데이터에 더 높은 가중치를 부여한다.&lt;/p&gt;
&lt;p data-end=&quot;921&quot; data-start=&quot;888&quot; data-ke-size=&quot;size16&quot;&gt;다음 모델은 가중치가 높아진 데이터를 더 중요하게 학습한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;971&quot; data-start=&quot;923&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;936&quot; data-start=&quot;923&quot; data-section-id=&quot;185g1p0&quot;&gt;오분류 데이터에 집중&lt;/li&gt;
&lt;li data-end=&quot;950&quot; data-start=&quot;937&quot; data-section-id=&quot;1dsqu0t&quot;&gt;구조가 비교적 단순함&lt;/li&gt;
&lt;li data-end=&quot;971&quot; data-start=&quot;951&quot; data-section-id=&quot;1eplbsx&quot;&gt;이상치와 노이즈에 민감할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;994&quot; data-start=&quot;973&quot; data-section-id=&quot;eotzxh&quot; data-ke-size=&quot;size23&quot;&gt;Gradient Boosting&lt;/h3&gt;
&lt;p data-end=&quot;1047&quot; data-start=&quot;996&quot; data-ke-size=&quot;size16&quot;&gt;Gradient Boosting은 이전 모델의 실제 오차를 다음 모델이 예측하도록 학습한다.&lt;/p&gt;
&lt;p data-end=&quot;1079&quot; data-start=&quot;1049&quot; data-ke-size=&quot;size16&quot;&gt;각 모델이 남아 있는 잔차를 줄이는 방향으로 추가된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1140&quot; data-start=&quot;1081&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1097&quot; data-start=&quot;1081&quot; data-section-id=&quot;5d6t7p&quot;&gt;다양한 손실함수 사용 가능&lt;/li&gt;
&lt;li data-end=&quot;1108&quot; data-start=&quot;1098&quot; data-section-id=&quot;8tr347&quot;&gt;높은 예측 성능&lt;/li&gt;
&lt;li data-end=&quot;1125&quot; data-start=&quot;1109&quot; data-section-id=&quot;18pvrv9&quot;&gt;학습 속도가 느릴 수 있음&lt;/li&gt;
&lt;li data-end=&quot;1140&quot; data-start=&quot;1126&quot; data-section-id=&quot;1rgw0id&quot;&gt;파라미터 설정에 민감함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1153&quot; data-start=&quot;1142&quot; data-section-id=&quot;1fj62nw&quot; data-ke-size=&quot;size23&quot;&gt;XGBoost&lt;/h3&gt;
&lt;p data-end=&quot;1206&quot; data-start=&quot;1155&quot; data-ke-size=&quot;size16&quot;&gt;XGBoost는 Gradient Boosting을 성능과 속도 측면에서 개선한 알고리즘이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1258&quot; data-start=&quot;1208&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1224&quot; data-start=&quot;1208&quot; data-section-id=&quot;14ux724&quot;&gt;정규화를 통한 과적합 제어&lt;/li&gt;
&lt;li data-end=&quot;1236&quot; data-start=&quot;1225&quot; data-section-id=&quot;1wa3bvu&quot;&gt;결측값 처리 기능&lt;/li&gt;
&lt;li data-end=&quot;1247&quot; data-start=&quot;1237&quot; data-section-id=&quot;bz9esl&quot;&gt;병렬 연산 지원&lt;/li&gt;
&lt;li data-end=&quot;1258&quot; data-start=&quot;1248&quot; data-section-id=&quot;8tr347&quot;&gt;높은 예측 성능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1288&quot; data-start=&quot;1260&quot; data-ke-size=&quot;size16&quot;&gt;정형 데이터 기반 머신러닝 문제에서 자주 활용된다.&lt;/p&gt;
&lt;h3 data-end=&quot;1302&quot; data-start=&quot;1290&quot; data-section-id=&quot;1izcub4&quot; data-ke-size=&quot;size23&quot;&gt;LightGBM&lt;/h3&gt;
&lt;p data-end=&quot;1352&quot; data-start=&quot;1304&quot; data-ke-size=&quot;size16&quot;&gt;LightGBM은 대용량 데이터를 빠르게 학습할 수 있도록 설계된 부스팅 알고리즘이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1404&quot; data-start=&quot;1354&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1365&quot; data-start=&quot;1354&quot; data-section-id=&quot;1mfh2w9&quot;&gt;학습 속도가 빠름&lt;/li&gt;
&lt;li data-end=&quot;1383&quot; data-start=&quot;1366&quot; data-section-id=&quot;p4n5w8&quot;&gt;메모리 사용량이 비교적 적음&lt;/li&gt;
&lt;li data-end=&quot;1404&quot; data-start=&quot;1384&quot; data-section-id=&quot;1ezok7x&quot;&gt;데이터가 적으면 과적합될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1418&quot; data-start=&quot;1406&quot; data-section-id=&quot;xa43g5&quot; data-ke-size=&quot;size23&quot;&gt;CatBoost&lt;/h3&gt;
&lt;p data-end=&quot;1460&quot; data-start=&quot;1420&quot; data-ke-size=&quot;size16&quot;&gt;CatBoost는 범주형 변수를 효율적으로 처리하는 부스팅 알고리즘이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1529&quot; data-start=&quot;1462&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1478&quot; data-start=&quot;1462&quot; data-section-id=&quot;1r6alc&quot;&gt;범주형 데이터 처리에 강점&lt;/li&gt;
&lt;li data-end=&quot;1498&quot; data-start=&quot;1479&quot; data-section-id=&quot;1cip48b&quot;&gt;별도의 원-핫 인코딩 부담 감소&lt;/li&gt;
&lt;li data-end=&quot;1529&quot; data-start=&quot;1499&quot; data-section-id=&quot;1rlzzq2&quot;&gt;기본 설정으로도 안정적인 성능을 보이는 경우가 많음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1534&quot; data-start=&quot;1531&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1546&quot; data-start=&quot;1536&quot; data-section-id=&quot;15jke2x&quot; data-ke-size=&quot;size26&quot;&gt;부스팅의 장점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1666&quot; data-start=&quot;1548&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1576&quot; data-start=&quot;1548&quot; data-section-id=&quot;varq3t&quot;&gt;단일 결정트리보다 예측 성능이 높은 경우가 많음&lt;/li&gt;
&lt;li data-end=&quot;1606&quot; data-start=&quot;1577&quot; data-section-id=&quot;1fb8uhg&quot;&gt;비선형 관계와 변수 간 상호작용을 학습할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;1624&quot; data-start=&quot;1607&quot; data-section-id=&quot;1it003k&quot;&gt;분류와 회귀 모두 사용 가능&lt;/li&gt;
&lt;li data-end=&quot;1647&quot; data-start=&quot;1625&quot; data-section-id=&quot;1i0gq63&quot;&gt;별도의 스케일링이 거의 필요하지 않음&lt;/li&gt;
&lt;li data-end=&quot;1666&quot; data-start=&quot;1648&quot; data-section-id=&quot;313xdo&quot;&gt;변수 중요도를 확인할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1671&quot; data-start=&quot;1668&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1683&quot; data-start=&quot;1673&quot; data-section-id=&quot;15j3zz8&quot; data-ke-size=&quot;size26&quot;&gt;부스팅의 단점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1810&quot; data-start=&quot;1685&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1711&quot; data-start=&quot;1685&quot; data-section-id=&quot;1cdvhr9&quot;&gt;순차적으로 학습해 시간이 오래 걸릴 수 있음&lt;/li&gt;
&lt;li data-end=&quot;1735&quot; data-start=&quot;1712&quot; data-section-id=&quot;3zkklx&quot;&gt;파라미터 설정에 따라 과적합될 수 있음&lt;/li&gt;
&lt;li data-end=&quot;1758&quot; data-start=&quot;1736&quot; data-section-id=&quot;9mwra4&quot;&gt;단일 결정트리보다 결과 해석이 어려움&lt;/li&gt;
&lt;li data-end=&quot;1788&quot; data-start=&quot;1759&quot; data-section-id=&quot;r9jse8&quot;&gt;노이즈와 이상치까지 반복해서 학습할 가능성이 있음&lt;/li&gt;
&lt;li data-end=&quot;1810&quot; data-start=&quot;1789&quot; data-section-id=&quot;v5tam1&quot;&gt;학습률과 트리 개수의 조정이 필요함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1815&quot; data-start=&quot;1812&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1830&quot; data-start=&quot;1817&quot; data-section-id=&quot;njthz9&quot; data-ke-size=&quot;size26&quot;&gt;주요 하이퍼파라미터&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;파라미터의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2049&quot; data-start=&quot;1832&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2049&quot; data-start=&quot;1856&quot;&gt;
&lt;tr data-end=&quot;1892&quot; data-start=&quot;1856&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1873&quot; data-start=&quot;1856&quot;&gt;n_estimators&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1892&quot; data-start=&quot;1873&quot;&gt;순차적으로 생성할 트리 개수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1935&quot; data-start=&quot;1893&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1911&quot; data-start=&quot;1893&quot;&gt;learning_rate&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1935&quot; data-start=&quot;1911&quot;&gt;각 트리가 최종 예측에 반영되는 정도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1966&quot; data-start=&quot;1936&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1950&quot; data-start=&quot;1936&quot;&gt;max_depth&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1966&quot; data-start=&quot;1950&quot;&gt;개별 트리의 최대 깊이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2011&quot; data-start=&quot;1967&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1988&quot; data-start=&quot;1967&quot;&gt;min_samples_leaf&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2011&quot; data-start=&quot;1988&quot;&gt;리프 노드에 필요한 최소 데이터 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2049&quot; data-start=&quot;2012&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2026&quot; data-start=&quot;2012&quot;&gt;subsample&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2049&quot; data-start=&quot;2026&quot;&gt;각 트리 학습에 사용할 데이터 비율&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2097&quot; data-start=&quot;2051&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로 학습률을 낮추면 각 트리의 영향력이 작아지므로 더 많은 트리가 필요하다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;낮은 학습률 + 많은 트리
높은 학습률 + 적은 트리&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2194&quot; data-start=&quot;2142&quot; data-ke-size=&quot;size16&quot;&gt;학습률이 너무 높으면 빠르게 학습하지만 과적합될 수 있고, 너무 낮으면 학습 시간이 길어진다.&lt;/p&gt;
&lt;hr data-end=&quot;2199&quot; data-start=&quot;2196&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2210&quot; data-start=&quot;2201&quot; data-section-id=&quot;1mtzjut&quot; data-ke-size=&quot;size26&quot;&gt;파이썬 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report

model = GradientBoostingClassifier(
    n_estimators=100,
    learning_rate=0.05,
    max_depth=3,
    random_state=42
)

model.fit(X_train, y_train)

y_pred = model.predict(X_test)

print(classification_report(y_test, y_pred))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2565&quot; data-start=&quot;2562&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2580&quot; data-start=&quot;2567&quot; data-section-id=&quot;1gzug17&quot; data-ke-size=&quot;size26&quot;&gt;XGBoost 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from xgboost import XGBClassifier
from sklearn.metrics import classification_report

model = XGBClassifier(
    n_estimators=300,
    learning_rate=0.05,
    max_depth=4,
    subsample=0.8,
    colsample_bytree=0.8,
    random_state=42,
    eval_metric=&quot;logloss&quot;
)

model.fit(X_train, y_train)

y_pred = model.predict(X_test)

print(classification_report(y_test, y_pred))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2972&quot; data-start=&quot;2969&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2988&quot; data-start=&quot;2974&quot; data-section-id=&quot;ss04p9&quot; data-ke-size=&quot;size26&quot;&gt;과적합을 줄이는 방법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3109&quot; data-start=&quot;2990&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3008&quot; data-start=&quot;2990&quot; data-section-id=&quot;1p4qr9k&quot;&gt;개별 트리의 깊이를 제한한다.&lt;/li&gt;
&lt;li data-end=&quot;3020&quot; data-start=&quot;3009&quot; data-section-id=&quot;1p3bxng&quot;&gt;학습률을 낮춘다.&lt;/li&gt;
&lt;li data-end=&quot;3041&quot; data-start=&quot;3021&quot; data-section-id=&quot;132ss5b&quot;&gt;데이터와 변수의 일부만 사용한다.&lt;/li&gt;
&lt;li data-end=&quot;3063&quot; data-start=&quot;3042&quot; data-section-id=&quot;913i42&quot;&gt;트리 개수를 교차검증으로 결정한다.&lt;/li&gt;
&lt;li data-end=&quot;3081&quot; data-start=&quot;3064&quot; data-section-id=&quot;b56oki&quot;&gt;정규화 파라미터를 조정한다.&lt;/li&gt;
&lt;li data-end=&quot;3109&quot; data-start=&quot;3082&quot; data-section-id=&quot;a87p84&quot;&gt;검증 성능이 개선되지 않으면 학습을 중단한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3191&quot; data-start=&quot;3111&quot; data-ke-size=&quot;size16&quot;&gt;XGBoost나 LightGBM에서는 &lt;b&gt;Early Stopping&lt;/b&gt;을 활용하여 검증 성능이 더 이상 좋아지지 않을 때 학습을 멈출 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;3196&quot; data-start=&quot;3193&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3203&quot; data-start=&quot;3198&quot; data-section-id=&quot;1melx8&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-end=&quot;3270&quot; data-start=&quot;3205&quot; data-ke-size=&quot;size16&quot;&gt;부스팅은 여러 약한 모델을 순차적으로 학습시키며, 이전 모델의 오류를 다음 모델이 보완하도록 만드는 앙상블 방식이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3442&quot; data-start=&quot;3272&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3293&quot; data-start=&quot;3272&quot; data-section-id=&quot;17hyyb4&quot;&gt;주로 얕은 결정트리를 반복해서 사용&lt;/li&gt;
&lt;li data-end=&quot;3322&quot; data-start=&quot;3294&quot; data-section-id=&quot;1klh6bj&quot;&gt;단일 트리보다 높은 예측 성능을 기대할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;3390&quot; data-start=&quot;3323&quot; data-section-id=&quot;xci1qp&quot;&gt;대표 알고리즘은 AdaBoost, Gradient Boosting, XGBoost, LightGBM, CatBoost&lt;/li&gt;
&lt;li data-end=&quot;3411&quot; data-start=&quot;3391&quot; data-section-id=&quot;1v50kyc&quot;&gt;학습률과 트리 개수의 균형이 중요&lt;/li&gt;
&lt;li data-end=&quot;3442&quot; data-start=&quot;3412&quot; data-section-id=&quot;1rtnksa&quot;&gt;성능은 높지만 과적합과 해석 난도가 증가할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3513&quot; data-start=&quot;3444&quot; data-ke-size=&quot;size16&quot;&gt;부스팅은 특히 정형 데이터에서 강력한 성능을 보이지만, 좋은 결과를 얻기 위해서는 교차검증과 하이퍼파라미터 조정이 필요하다.&lt;/p&gt;</description>
      <category>Data Analysis/머신러닝</category>
      <author>subinz</author>
      <guid isPermaLink="true">https://subinz.tistory.com/34</guid>
      <comments>https://subinz.tistory.com/34#entry34comment</comments>
      <pubDate>Fri, 31 Jul 2026 17:27:34 +0900</pubDate>
    </item>
    <item>
      <title>결정트리</title>
      <link>https://subinz.tistory.com/33</link>
      <description>&lt;h1 data-end=&quot;8&quot; data-start=&quot;0&quot; data-section-id=&quot;qrwlrc&quot;&gt;결정트리란?&lt;/h1&gt;
&lt;p data-end=&quot;74&quot; data-start=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;결정트리(Decision Tree)는 데이터를 여러 조건으로 반복해서 나누며 결과를 예측하는 머신러닝 알고리즘이다.&lt;/p&gt;
&lt;p data-end=&quot;147&quot; data-start=&quot;76&quot; data-ke-size=&quot;size16&quot;&gt;사람이 의사결정을 내리는 방식처럼 &lt;b&gt;&amp;ldquo;이 조건을 만족하는가?&amp;rdquo;&lt;/b&gt;를 순서대로 판단하기 때문에 결과를 이해하고 설명하기 쉽다.&lt;/p&gt;
&lt;p data-end=&quot;172&quot; data-start=&quot;149&quot; data-ke-size=&quot;size16&quot;&gt;분류와 회귀 문제에 모두 사용할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;240&quot; data-start=&quot;174&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;206&quot; data-start=&quot;174&quot; data-section-id=&quot;1oc4ybe&quot;&gt;&lt;b&gt;분류&lt;/b&gt;: 결제 여부, 이탈 여부, 불량 여부 예측&lt;/li&gt;
&lt;li data-end=&quot;240&quot; data-start=&quot;207&quot; data-section-id=&quot;ricokk&quot;&gt;&lt;b&gt;회귀&lt;/b&gt;: 매출, 가격, 수요량 등 연속적인 값 예측&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;245&quot; data-start=&quot;242&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;258&quot; data-start=&quot;247&quot; data-section-id=&quot;1s57i0g&quot; data-ke-size=&quot;size26&quot;&gt;결정트리의 구조&lt;/h2&gt;
&lt;p data-end=&quot;283&quot; data-start=&quot;260&quot; data-ke-size=&quot;size16&quot;&gt;결정트리는 다음 세 가지 요소로 구성된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;구성 요소의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;405&quot; data-start=&quot;285&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;405&quot; data-start=&quot;310&quot;&gt;
&lt;tr data-end=&quot;340&quot; data-start=&quot;310&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;318&quot; data-start=&quot;310&quot;&gt;루트 노드&lt;/td&gt;
&lt;td data-end=&quot;340&quot; data-start=&quot;318&quot; data-col-size=&quot;sm&quot;&gt;가장 먼저 데이터를 나누는 시작점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;375&quot; data-start=&quot;341&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;349&quot; data-start=&quot;341&quot;&gt;내부 노드&lt;/td&gt;
&lt;td data-end=&quot;375&quot; data-start=&quot;349&quot; data-col-size=&quot;sm&quot;&gt;특정 조건에 따라 데이터를 분할하는 지점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;405&quot; data-start=&quot;376&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;384&quot; data-start=&quot;376&quot;&gt;리프 노드&lt;/td&gt;
&lt;td data-end=&quot;405&quot; data-start=&quot;384&quot; data-col-size=&quot;sm&quot;&gt;최종 예측 결과가 결정되는 지점&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;449&quot; data-start=&quot;407&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 고객의 결제 여부를 예측한다면 다음과 같은 구조를 만들 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;방문 횟수 &amp;ge; 3회?
├─ 아니오 &amp;rarr; 미결제
└─ 예
   └─ 평균 체류시간 &amp;ge; 2시간?
      ├─ 아니오 &amp;rarr; 미결제
      └─ 예 &amp;rarr; 결제&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;595&quot; data-start=&quot;592&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;619&quot; data-start=&quot;597&quot; data-section-id=&quot;pvyz5l&quot; data-ke-size=&quot;size26&quot;&gt;결정트리는 어떻게 기준을 선택할까?&lt;/h2&gt;
&lt;p data-end=&quot;660&quot; data-start=&quot;621&quot; data-ke-size=&quot;size16&quot;&gt;결정트리는 데이터를 가장 잘 구분할 수 있는 변수와 기준값을 선택한다.&lt;/p&gt;
&lt;p data-end=&quot;701&quot; data-start=&quot;662&quot; 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-end=&quot;744&quot; data-start=&quot;703&quot; data-ke-size=&quot;size16&quot;&gt;불순도는 하나의 노드에 서로 다른 클래스가 얼마나 섞여 있는지를 나타낸다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;792&quot; data-start=&quot;746&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;767&quot; data-start=&quot;746&quot; data-section-id=&quot;gejhme&quot;&gt;한 클래스만 존재하면 불순도가 낮음&lt;/li&gt;
&lt;li data-end=&quot;792&quot; data-start=&quot;768&quot; data-section-id=&quot;1ss87p8&quot;&gt;여러 클래스가 섞여 있으면 불순도가 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;830&quot; data-start=&quot;794&quot; data-ke-size=&quot;size16&quot;&gt;결정트리는 분할 후 불순도가 가장 크게 감소하는 조건을 선택한다.&lt;/p&gt;
&lt;hr data-end=&quot;835&quot; data-start=&quot;832&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;848&quot; data-start=&quot;837&quot; data-section-id=&quot;1s53gc9&quot; data-ke-size=&quot;size26&quot;&gt;결정트리의 장점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;956&quot; data-start=&quot;850&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;869&quot; data-start=&quot;850&quot; data-section-id=&quot;10cu3o&quot;&gt;결과를 시각화하고 해석하기 쉬움&lt;/li&gt;
&lt;li data-end=&quot;893&quot; data-start=&quot;870&quot; data-section-id=&quot;a5sz71&quot;&gt;변수 간 비선형 관계를 학습할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;912&quot; data-start=&quot;894&quot; data-section-id=&quot;1f7c3yb&quot;&gt;스케일링이 거의 필요하지 않음&lt;/li&gt;
&lt;li data-end=&quot;937&quot; data-start=&quot;913&quot; data-section-id=&quot;1r6tgsd&quot;&gt;수치형과 범주형 데이터를 활용할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;956&quot; data-start=&quot;938&quot; data-section-id=&quot;313xdo&quot;&gt;변수 중요도를 확인할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;961&quot; data-start=&quot;958&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;974&quot; data-start=&quot;963&quot; data-section-id=&quot;1s5b5as&quot; data-ke-size=&quot;size26&quot;&gt;결정트리의 단점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1098&quot; data-start=&quot;976&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;999&quot; data-start=&quot;976&quot; data-section-id=&quot;1p437df&quot;&gt;트리가 깊어지면 과적합이 발생하기 쉬움&lt;/li&gt;
&lt;li data-end=&quot;1034&quot; data-start=&quot;1000&quot; data-section-id=&quot;3aipf0&quot;&gt;데이터가 조금만 바뀌어도 트리 구조가 크게 달라질 수 있음&lt;/li&gt;
&lt;li data-end=&quot;1078&quot; data-start=&quot;1035&quot; data-section-id=&quot;gvug8t&quot;&gt;하나의 트리는 랜덤 포레스트나 XGBoost보다 예측 성능이 낮을 수 있음&lt;/li&gt;
&lt;li data-end=&quot;1098&quot; data-start=&quot;1079&quot; data-section-id=&quot;1imvfgt&quot;&gt;복잡한 트리는 해석하기 어려워짐&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1103&quot; data-start=&quot;1100&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1122&quot; data-start=&quot;1105&quot; data-section-id=&quot;u5owy0&quot; data-ke-size=&quot;size26&quot;&gt;과적합을 줄이는 주요 설정&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;파라미터의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1345&quot; data-start=&quot;1124&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1345&quot; data-start=&quot;1148&quot;&gt;
&lt;tr data-end=&quot;1178&quot; data-start=&quot;1148&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1162&quot; data-start=&quot;1148&quot;&gt;max_depth&lt;/td&gt;
&lt;td data-end=&quot;1178&quot; data-start=&quot;1162&quot; data-col-size=&quot;sm&quot;&gt;트리의 최대 깊이 제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1224&quot; data-start=&quot;1179&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1201&quot; data-start=&quot;1179&quot;&gt;min_samples_split&lt;/td&gt;
&lt;td data-end=&quot;1224&quot; data-start=&quot;1201&quot; data-col-size=&quot;sm&quot;&gt;노드를 나누기 위한 최소 데이터 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1269&quot; data-start=&quot;1225&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1246&quot; data-start=&quot;1225&quot;&gt;min_samples_leaf&lt;/td&gt;
&lt;td data-end=&quot;1269&quot; data-start=&quot;1246&quot; data-col-size=&quot;sm&quot;&gt;리프 노드에 필요한 최소 데이터 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1305&quot; data-start=&quot;1270&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1289&quot; data-start=&quot;1270&quot;&gt;max_leaf_nodes&lt;/td&gt;
&lt;td data-end=&quot;1305&quot; data-start=&quot;1289&quot; data-col-size=&quot;sm&quot;&gt;리프 노드의 최대 개수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1345&quot; data-start=&quot;1306&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1320&quot; data-start=&quot;1306&quot;&gt;ccp_alpha&lt;/td&gt;
&lt;td data-end=&quot;1345&quot; data-start=&quot;1320&quot; data-col-size=&quot;sm&quot;&gt;불필요한 가지를 제거하는 가지치기 강도&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1399&quot; data-start=&quot;1347&quot; data-ke-size=&quot;size16&quot;&gt;트리의 깊이를 무제한으로 두면 학습 데이터를 지나치게 세밀하게 나누어 과적합될 가능성이 높다.&lt;/p&gt;
&lt;hr data-end=&quot;1404&quot; data-start=&quot;1401&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1415&quot; data-start=&quot;1406&quot; data-section-id=&quot;1mtzjut&quot; data-ke-size=&quot;size26&quot;&gt;파이썬 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report

model = DecisionTreeClassifier(
    max_depth=4,
    min_samples_leaf=10,
    random_state=42
)

model.fit(X_train, y_train)

y_pred = model.predict(X_test)

print(classification_report(y_test, y_pred))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1752&quot; data-start=&quot;1734&quot; data-ke-size=&quot;size16&quot;&gt;트리 구조를 시각화할 수도 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

plt.figure(figsize=(16, 8))

plot_tree(
    model,
    feature_names=X_train.columns,
    class_names=[&quot;미결제&quot;, &quot;결제&quot;],
    filled=True,
    rounded=True
)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2005&quot; data-start=&quot;2002&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2016&quot; data-start=&quot;2007&quot; data-section-id=&quot;1g41qsc&quot; data-ke-size=&quot;size26&quot;&gt;변수 중요도&lt;/h2&gt;
&lt;p data-end=&quot;2076&quot; data-start=&quot;2018&quot; data-ke-size=&quot;size16&quot;&gt;결정트리는 각 변수가 데이터를 분할하면서 불순도를 얼마나 감소시켰는지를 기준으로 변수 중요도를 계산한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;import pandas as pd

importance = pd.Series(
    model.feature_importances_,
    index=X_train.columns
).sort_values(ascending=False)

print(importance)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2302&quot; data-start=&quot;2246&quot; data-ke-size=&quot;size16&quot;&gt;변수 중요도가 높다는 것은 해당 변수가 예측 과정에서 자주 사용되거나 불순도를 크게 줄였다는 의미다.&lt;/p&gt;
&lt;p data-end=&quot;2333&quot; data-start=&quot;2304&quot; data-ke-size=&quot;size16&quot;&gt;다만 변수 중요도만으로 인과관계를 판단할 수는 없다.&lt;/p&gt;
&lt;hr data-end=&quot;2338&quot; data-start=&quot;2335&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2345&quot; data-start=&quot;2340&quot; data-section-id=&quot;1melx8&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-end=&quot;2389&quot; data-start=&quot;2347&quot; data-ke-size=&quot;size16&quot;&gt;결정트리는 조건문을 반복하여 데이터를 나누고 최종 결과를 예측하는 모델이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2477&quot; data-start=&quot;2391&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2408&quot; data-start=&quot;2391&quot; data-section-id=&quot;1it003k&quot;&gt;분류와 회귀 모두 사용 가능&lt;/li&gt;
&lt;li data-end=&quot;2428&quot; data-start=&quot;2409&quot; data-section-id=&quot;1h91cwd&quot;&gt;구조가 직관적이고 해석하기 쉬움&lt;/li&gt;
&lt;li data-end=&quot;2451&quot; data-start=&quot;2429&quot; data-section-id=&quot;1i0gq63&quot;&gt;별도의 스케일링이 거의 필요하지 않음&lt;/li&gt;
&lt;li data-end=&quot;2477&quot; data-start=&quot;2452&quot; data-section-id=&quot;2di3pc&quot;&gt;트리가 너무 깊어지면 과적합 가능성이 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2546&quot; data-start=&quot;2479&quot; data-ke-size=&quot;size16&quot;&gt;따라서 결정트리는 단독 예측 모델뿐 아니라 데이터의 주요 분기 기준과 변수의 영향력을 파악하는 해석용 모델로도 유용하다.&lt;/p&gt;</description>
      <category>Data Analysis/머신러닝</category>
      <author>subinz</author>
      <guid isPermaLink="true">https://subinz.tistory.com/33</guid>
      <comments>https://subinz.tistory.com/33#entry33comment</comments>
      <pubDate>Fri, 31 Jul 2026 17:23:36 +0900</pubDate>
    </item>
    <item>
      <title>K-폴드 교차</title>
      <link>https://subinz.tistory.com/32</link>
      <description>&lt;h1 data-end=&quot;15&quot; data-start=&quot;0&quot; data-section-id=&quot;7w1pja&quot;&gt;K-폴드 교차 검증이란?&lt;/h1&gt;
&lt;p data-end=&quot;104&quot; data-start=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;K-폴드 교차 검증(K-Fold Cross Validation)은 데이터를 K개의 구간으로 나누고, 학습과 검증을 반복하여 모델의 성능을 평가하는 방법이다.&lt;/p&gt;
&lt;p data-end=&quot;180&quot; data-start=&quot;106&quot; data-ke-size=&quot;size16&quot;&gt;한 번만 학습&amp;middot;검증 데이터를 나누는 방식보다 데이터 분할에 따른 우연을 줄이고, 모델의 일반화 성능을 더 안정적으로 확인할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;185&quot; data-start=&quot;182&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;200&quot; data-start=&quot;187&quot; data-section-id=&quot;357kc2&quot; data-ke-size=&quot;size26&quot;&gt;K-폴드 진행 방식&lt;/h2&gt;
&lt;p data-end=&quot;240&quot; data-start=&quot;202&quot; data-ke-size=&quot;size16&quot;&gt;데이터를 5개 구간으로 나누는 5-Fold를 예로 들면 다음과 같다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1회차: 1번 검증 / 나머지 학습
2회차: 2번 검증 / 나머지 학습
3회차: 3번 검증 / 나머지 학습
4회차: 4번 검증 / 나머지 학습
5회차: 5번 검증 / 나머지 학습&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;416&quot; data-start=&quot;355&quot; data-ke-size=&quot;size16&quot;&gt;각 구간이 한 번씩 검증 데이터로 사용되며, 마지막에는 5번의 평가 점수를 평균 내어 최종 성능으로 사용한다.&lt;/p&gt;
&lt;hr data-end=&quot;421&quot; data-start=&quot;418&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;428&quot; data-start=&quot;423&quot; data-section-id=&quot;1mbdrk&quot; data-ke-size=&quot;size26&quot;&gt;장점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;514&quot; data-start=&quot;430&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;456&quot; data-start=&quot;430&quot; data-section-id=&quot;1yszt5o&quot;&gt;모든 데이터를 학습과 검증에 활용할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;484&quot; data-start=&quot;457&quot; data-section-id=&quot;1hd21vg&quot;&gt;데이터 분할에 따른 성능 편차를 줄일 수 있음&lt;/li&gt;
&lt;li data-end=&quot;514&quot; data-start=&quot;485&quot; data-section-id=&quot;u9r70k&quot;&gt;모델 간 성능 비교와 하이퍼파라미터 튜닝에 유용함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;519&quot; data-start=&quot;516&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;526&quot; data-start=&quot;521&quot; data-section-id=&quot;1m25lp&quot; data-ke-size=&quot;size26&quot;&gt;단점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;611&quot; data-start=&quot;528&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;555&quot; data-start=&quot;528&quot; data-section-id=&quot;1l1772m&quot;&gt;모델을 K번 반복 학습하므로 시간이 오래 걸림&lt;/li&gt;
&lt;li data-end=&quot;575&quot; data-start=&quot;556&quot; data-section-id=&quot;u5nze8&quot;&gt;K값이 커질수록 계산량이 증가함&lt;/li&gt;
&lt;li data-end=&quot;611&quot; data-start=&quot;576&quot; data-section-id=&quot;18zmfde&quot;&gt;시계열 데이터에는 일반 K-Fold를 그대로 사용하기 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;616&quot; data-start=&quot;613&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;647&quot; data-start=&quot;618&quot; data-section-id=&quot;1canurp&quot; data-ke-size=&quot;size26&quot;&gt;분류 문제에서는 Stratified K-Fold&lt;/h2&gt;
&lt;p data-end=&quot;718&quot; data-start=&quot;649&quot; data-ke-size=&quot;size16&quot;&gt;분류 데이터의 클래스 비율이 불균형하다면 일반 K-Fold보다 &lt;b&gt;Stratified K-Fold&lt;/b&gt;를 사용하는 것이 좋다.&lt;/p&gt;
&lt;p data-end=&quot;782&quot; data-start=&quot;720&quot; data-ke-size=&quot;size16&quot;&gt;Stratified K-Fold는 각 폴드에서 타깃 클래스의 비율이 원본 데이터와 비슷하게 유지되도록 분할한다.&lt;/p&gt;
&lt;p data-end=&quot;848&quot; data-start=&quot;784&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 전체 데이터의 결제 고객 비율이 10%라면, 각 폴드에서도 결제 고객 비율이 약 10%가 되도록 나눈다.&lt;/p&gt;
&lt;hr data-end=&quot;853&quot; data-start=&quot;850&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;864&quot; data-start=&quot;855&quot; data-section-id=&quot;1mtzjut&quot; data-ke-size=&quot;size26&quot;&gt;파이썬 예시&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(
    random_state=42
)

scores = cross_val_score(
    model,
    X,
    y,
    cv=5,
    scoring=&quot;f1&quot;
)

print(&quot;각 폴드 점수:&quot;, scores)
print(&quot;평균 점수:&quot;, scores.mean())&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-start=&quot;1368&quot; data-end=&quot;1371&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-section-id=&quot;1vda0mw&quot; data-start=&quot;0&quot; data-end=&quot;15&quot; data-ke-size=&quot;size26&quot;&gt;K값 선택 시 고려사항&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;17&quot; data-end=&quot;48&quot; data-ke-size=&quot;size16&quot;&gt;K값은 일반적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;5 또는 10&lt;/b&gt;을 많이 사용한다.&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;K값특징
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-start=&quot;50&quot; data-end=&quot;173&quot;&gt;
&lt;tbody data-start=&quot;72&quot; data-end=&quot;173&quot;&gt;
&lt;tr data-start=&quot;72&quot; data-end=&quot;120&quot;&gt;
&lt;td data-start=&quot;72&quot; data-end=&quot;80&quot; data-col-size=&quot;sm&quot;&gt;K가 작음&lt;/td&gt;
&lt;td data-start=&quot;80&quot; data-end=&quot;120&quot; data-col-size=&quot;md&quot;&gt;학습 데이터가 줄어 평가 편향이 커질 수 있지만 계산 속도가 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-start=&quot;121&quot; data-end=&quot;173&quot;&gt;
&lt;td data-start=&quot;121&quot; data-end=&quot;128&quot; data-col-size=&quot;sm&quot;&gt;K가 큼&lt;/td&gt;
&lt;td data-start=&quot;128&quot; data-end=&quot;173&quot; data-col-size=&quot;md&quot;&gt;더 많은 데이터를 학습에 사용해 안정적인 평가가 가능하지만 계산량이 증가함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;175&quot; data-end=&quot;250&quot; data-ke-size=&quot;size16&quot;&gt;데이터가 충분히 많다면 보통 K=5를 사용하고, 데이터가 비교적 적고 더 안정적인 평가가 필요하다면 K=10을 고려할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;252&quot; data-end=&quot;375&quot; data-ke-size=&quot;size16&quot;&gt;다만 K가 너무 크면 각 폴드의 검증 데이터가 지나치게 적어지고 학습 시간이 길어질 수 있다. 특히 데이터 수만큼 폴드를 나누는 Leave-One-Out 방식은 계산 비용이 매우 크고 평가 결과의 변동성도 커질 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;377&quot; data-end=&quot;505&quot; data-is-last-node=&quot;&quot; data-is-only-node=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;분류 문제에서는 K값뿐 아니라 각 폴드에 모든 클래스가 충분히 포함되는지도 확인해야 한다. 예를 들어 소수 클래스 데이터가 5개뿐이라면 K=10은 사용할 수 없으며, K는 소수 클래스의 데이터 수보다 크지 않게 설정해야 한다.&lt;/p&gt;
&lt;hr data-start=&quot;1179&quot; data-end=&quot;1182&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-section-id=&quot;17iloc1&quot; data-start=&quot;1184&quot; data-end=&quot;1192&quot; data-ke-size=&quot;size26&quot;&gt;주의할 점&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1194&quot; data-end=&quot;1251&quot; data-ke-size=&quot;size16&quot;&gt;교차 검증 과정에서도 결측치 대체, 스케일링, 인코딩 같은 전처리는 각 학습 폴드에서만 학습해야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1253&quot; data-end=&quot;1315&quot; data-ke-size=&quot;size16&quot;&gt;전체 데이터를 먼저 전처리하면 검증 데이터의 정보가 학습 과정에 포함되는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;데이터 누수&lt;/b&gt;가 발생할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1317&quot; data-end=&quot;1366&quot; data-ke-size=&quot;size16&quot;&gt;이 문제를 방지하려면 Scikit-learn의 Pipeline을 사용하는 것이 좋다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;1317&quot; data-end=&quot;1366&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-start=&quot;1368&quot; data-end=&quot;1371&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1378&quot; data-start=&quot;1373&quot; data-section-id=&quot;1melx8&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-end=&quot;1455&quot; data-start=&quot;1380&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;K-폴드 교차 검증은 데이터를 K개로 나누어 학습과 검증을 반복하고, 여러 평가 점수의 평균으로 모델 성능을 판단하는 방법이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1511&quot; data-start=&quot;1457&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 분류 문제에서는 클래스 비율을 유지하는 Stratified K-Fold를 자주 사용한다.&lt;/p&gt;</description>
      <category>Data Analysis/머신러닝</category>
      <author>subinz</author>
      <guid isPermaLink="true">https://subinz.tistory.com/32</guid>
      <comments>https://subinz.tistory.com/32#entry32comment</comments>
      <pubDate>Fri, 31 Jul 2026 17:19:38 +0900</pubDate>
    </item>
  </channel>
</rss>