<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>soo_32.log</title>
        <link>https://velog.io/</link>
        <description>화이팅구리</description>
        <lastBuildDate>Wed, 19 Nov 2025 03:24:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>soo_32.log</title>
            <url>https://velog.velcdn.com/images/soo_32/profile/c789ce41-bc16-4134-b365-4d707f9fbc4c/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. soo_32.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/soo_32" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[SQL 코드카타_09]]></title>
            <link>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8009</link>
            <guid>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8009</guid>
            <pubDate>Wed, 19 Nov 2025 03:24:36 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style="font-size:25px;"><strong>SQL 코드카타_Human Traffic of Stadium</strong>
</span></p>
</blockquote>
<h2 id="human-traffic-of-stadium">Human Traffic of Stadium</h2>
<h3 id="문제--human-traffic-of-stadium">문제 : <a href="https://leetcode.com/problems/human-traffic-of-stadium/description/">Human Traffic of Stadium</a></h3>
<p><span style="font-size:20px;"># 목적, 목표 : 연속된 id가 3개 이상 있는 행과 각 행의 사람 수가 100명 이상인 레코드를 표시</span>
<span style="font-size:20px;"># 필요한 컬럼 : id, visit_date, people, flag</span>
<span style="font-size:20px;"># 컬럼 조건 : flag = 1</span>
<span style="font-size:20px;"># 사용할 테이블 : Stadium</span>
<span style="font-size:20px;"># join key : 없음</span>
<span style="font-size:20px;"># 테이블 조건 : people &gt;= 100</span>
<span style="font-size:20px;"># 필요한 그룹 : 없음</span>
<span style="font-size:20px;"># 필요한 그룹 조건 : 없음</span>
<span style="font-size:20px;"># 정렬 기준 : visit_date 오름차순</span>
<span style="font-size:20px;"># 주의사항 : 연속된 id가 3개 이상이어야 함</span></p>
<h3 id="로직">로직</h3>
<ul>
<li>people &gt;= 100만 추출</li>
<li>id - 2 ~ id + 2 까지 flag 입력용 컬럼 생성<ul>
<li>id - 2, id - 1이 id에 있다면, flag = 1</li>
<li>id - 1, id + 1이 id에 있다면, flag = 1</li>
<li>id + 1, id + 2이 id에 있다면, flag = 1</li>
<li>이외에는 flag = 0</li>
</ul>
</li>
<li>flag = 1인 경우만 추출하여 visit_date 기준 정렬</li>
</ul>
<h3 id="코드-뜯어보기">코드 뜯어보기</h3>
<pre><code class="language-sql"># people &gt;= 100만 추출
with A as (
    SELECT *
    FROM Stadium
    WHERE people &gt;= 100
),</code></pre>
<pre><code class="language-sql"># flag 입력용 컬럼 생성
B as (
    SELECT id, id-2 as id_2, id-1 as id_1, id+1 as id1, id+2 as id2,
    visit_date, people
    FROM A
),</code></pre>
<pre><code class="language-sql"># flag 입력
C as (
    SELECT id,
        case when id_2 in (select id from B) and id_1 in (select id from B) then 1
            when id_1 in (select id from B) and id1 in (select id from B) then 1
            when id1 in (select id from B) and id2 in (select id from B) then 1
        else 0 end as flag,
        visit_date, people
    FROM B
)</code></pre>
<pre><code class="language-sql"># flag = 1인 경우만 추출하여 visit_date 기준 정렬
SELECT id, visit_date, people
FROM C
WHERE flag = 1
ORDER BY visit_date</code></pre>
<h3 id="새로-알게된-점">새로 알게된 점</h3>
<ul>
<li>하나의 컬럼 값이 테이블 안의 다른 컬럼 안에 존재하는지 확인하는 방법<ul>
<li>컬럼A in (컬럼B) : X<ul>
<li>&quot;컬럼A가 컬럼B라는 컬럼 값 1개와 비교된다&quot;</li>
</ul>
</li>
<li>컬럼A in (SELECT 컬럼B FROM 테이블) : O</li>
<li>IN()에는 <strong>값 목록 또는 서브쿼리만</strong> 넣을 수 있음</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 코드카타_08]]></title>
            <link>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8008</link>
            <guid>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8008</guid>
            <pubDate>Tue, 18 Nov 2025 04:48:16 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style="font-size:25px;"><strong>SQL 코드카타_Find Category Recommendation Pairs</strong></span></p>
</blockquote>
<h2 id="find-category-recommendation-pairs">Find Category Recommendation Pairs</h2>
<h3 id="문제--find-category-recommendation-pairs">문제 : <a href="https://leetcode.com/problems/find-category-recommendation-pairs/description/">Find Category Recommendation Pairs</a></h3>
<p><span style="font-size:20px;"># 목적, 목표 : 모든 카테고리 쌍 중에 최소한 서로 다른 고객이 두 카테고리 모두에서 제품을 구매한 경우에 카테고리 쌍과 고유 구매고객 수 추출</span>
<span style="font-size:20px;"># 필요한 컬럼 : category1, category2, customer_count</span>
<span style="font-size:20px;"># 컬럼 조건 : category1 &lt;&gt; category2, customer_count = count(distinct user_id)</span>
<span style="font-size:20px;"># 사용할 테이블 : ProductPurchases, ProductInfo</span>
<span style="font-size:20px;"># join key : product_id</span>
<span style="font-size:20px;"># 테이블 조건 : customer_count &gt; 2</span>
<span style="font-size:20px;"># 필요한 그룹 : category1, category2</span>
<span style="font-size:20px;"># 필요한 그룹 조건 : 없음</span>
<span style="font-size:20px;"># 정렬 기준 : customer_count desc, category1, category2</span>
<span style="font-size:20px;"># 주의사항 : 한명의 고유한 고객이 두 카테고리를 모두 구매한 경우에만 count에 포함되어야 함</span></p>
<h3 id="로직">로직</h3>
<ul>
<li>ProductPurchases, ProductInfo 테이블 결합 (INNER JOIN)</li>
<li>카테고리 쌍 생성<ul>
<li>자기 자신 CROSS JOIN으로 가능한 모든 카테고리 쌍 생성</li>
<li>단, (A, A) 제외 AND (A, B) = (B, A) 이므로 제외</li>
<li>각 카테고리별로 구매한 user_id 추출<ul>
<li>customer_count 계산을 위해</li>
</ul>
</li>
</ul>
</li>
<li>customer_count 계산<ul>
<li>category1, category2 기준 그룹화</li>
<li>category1을 구매한 고객 = category2를 구매한 고객만 count</li>
</ul>
</li>
<li>조건에 맞춰 최종 정리<ul>
<li>customer_count &gt; 2만 추출</li>
<li>customer_count desc, category1, category2 정렬</li>
</ul>
</li>
</ul>
<h3 id="코드-뜯어보기">코드 뜯어보기</h3>
<pre><code class="language-sql"># 테이블 결합
with A as (
    select p.user_id, p.product_id, i.category, p.quantity, i.price
    from ProductPurchases p inner join ProductInfo i on p.product_id = i.product_id
),</code></pre>
<pre><code class="language-sql"># 카테고리 쌍 생성
B as (
    select distinct least(aa.category, a.category) as category1, -- 둘 중 작은 값만 반환
            greatest(aa.category, a.category) as category2, -- 둘 중 큰 값만 반환
            a.user_id as auser, aa.user_id as aauser  -- 각 카테고리별 구매 고객 id 별도 추출
    from A a cross join A aa
    where least(aa.category, a.category) &lt;&gt; greatest(aa.category, a.category)
),</code></pre>
<pre><code class="language-sql"># customer_count 계산
C as (
    select category1, category2, count(distinct auser) as customer_count
    from B
    where auser = aauser  -- 두 카테고리 모두 구매한 고객만 필터링
    group by category1, category2
    order by count(distinct auser) desc, category1, category2
)</code></pre>
<pre><code class="language-sql"># 조건에 맞춰 최종 정리
select *
from C
where customer_count &gt; 2
order by customer_count desc, category1, category2</code></pre>
<h3 id="새로-알게된-점">새로 알게된 점</h3>
<ul>
<li>(A, B) = (B, A)이므로 제외하기 위해 아래 방식 필요함<ul>
<li>least(A, B) : 두 값 중 작은 값을 반환</li>
<li>greatest(A, B) : 두 값 중 큰 값을 반환</li>
<li>distinct로 중복 제거하면, (B, A) 제거됨</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 코드카타_07]]></title>
            <link>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8007</link>
            <guid>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8007</guid>
            <pubDate>Mon, 17 Nov 2025 03:20:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style='font-size:25px;'><strong>SQL 코드카타_Analyze Organization Hierarchy</strong></span></p>
</blockquote>
<h2 id="analyze-organization-hierarchy">Analyze Organization Hierarchy</h2>
<h3 id="문제--analyze-organization-hierarchy">문제 : <a href="https://leetcode.com/problems/analyze-organization-hierarchy/description/">Analyze Organization Hierarchy</a></h3>
<p><span style='font-size:20px;'># 목적, 목표 : 조직 계층을 분석하여 계급 레벨과 하위 직원 수, 하위 직원의 임금 예산 (본인 포함) 추출</span>
<span style='font-size:20px;'># 필요한 컬럼 : level, team_size, budget</span>
<span style='font-size:20px;'># 컬럼 조건 : manager_id = employee_id 인 경우</span>
<span style='font-size:20px;'># 사용할 테이블 : Employees</span>
<span style='font-size:20px;'># join key : 없음</span>
<span style='font-size:20px;'># 테이블 조건 : 없음</span>
<span style='font-size:20px;'># 필요한 그룹 : 없음</span>
<span style='font-size:20px;'># 필요한 그룹 조건 : 없음</span>
<span style='font-size:20px;'># 정렬 기준 : level, budget DESC, employee_name</span>
<span style='font-size:20px;'># 주의사항 : 재귀함수 사용</span></p>
<h3 id="로직">로직</h3>
<ul>
<li>manager_id = employee_id를 기준으로 level 계산<ul>
<li>manager_id is null → level = 1</li>
<li>manager_id is not null → level + 1</li>
</ul>
</li>
<li>직속 부하의 직속 부하 계산<ul>
<li>manager_id = a.employee_id 일 때<ul>
<li>manager_id = c.employee_id 로 직속 부하의 직속 부하까지 추출</li>
</ul>
</li>
<li>count(*) = team_size</li>
<li>sum(salary) + 본인 salary = budget</li>
</ul>
</li>
</ul>
<h3 id="코드-뜯어보기">코드 뜯어보기</h3>
<pre><code class="language-sql"># 직속 부하 기준 level 계산
with recursive A as (
    select employee_id, employee_name, salary, 1 as level
    from Employees
    where manager_id is null
    union all
    select e.employee_id, e.employee_name, e.salary, a.level + 1
    from A a left join Employees e on a.employee_id = e.manager_id
    where e.manager_id is not null
),</code></pre>
<pre><code class="language-sql"># 직속 부하의 직속 부하까지 추출하여 team_size, budget 계산
B AS (
    SELECT 
        a.employee_id, 
        a.employee_name, 
        a.level,
        (
            WITH RECURSIVE C AS (
                SELECT e.employee_id, e.employee_name, e.salary
                FROM Employees e
                WHERE e.manager_id = a.employee_id -- 직속 부하 추출

                UNION ALL

                SELECT e2.employee_id, e2.employee_name, e2.salary
                FROM C c
                JOIN Employees e2 ON e2.manager_id = c.employee_id -- 직속 부하 추출한 것에 대한 직속 부하 추가로 join
            )
            SELECT COUNT(*)
            FROM C
        ) AS team_size,
        (
            WITH RECURSIVE C AS (
                SELECT e.employee_id, e.employee_name, e.salary
                FROM Employees e
                WHERE e.manager_id = a.employee_id

                UNION ALL

                SELECT e2.employee_id, e2.employee_name, e2.salary
                FROM C c
                JOIN Employees e2 ON e2.manager_id = c.employee_id
            )
            SELECT coalesce(SUM(salary),0)  -- 직속 부하가 없는 경우 값이 null로 찍히기 때문
            FROM C
        ) + a.salary AS budget
    FROM A a
)</code></pre>
<pre><code class="language-sql"># 정렬 조건에 따라 정렬하기
select *
from B
order by level, budget DESC, employee_name;</code></pre>
<h3 id="새로-알게된-점">새로 알게된 점</h3>
<ul>
<li>재귀 CTE에서 a.employee_id = e.manager_id를 기준으로 JOIN한 경우,<ul>
<li>a.employee_id를 기준으로 +1이 되어 level이 산정됨</li>
</ul>
</li>
<li>재귀 CTE에서 JOIN으로 직속 부하의 직속 부하 추출이 가능하다는 점</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[이커머스 마케팅 용어]]></title>
            <link>https://velog.io/@soo_32/%EC%9D%B4%EC%BB%A4%EB%A8%B8%EC%8A%A4-%EB%A7%88%EC%BC%80%ED%8C%85-%EC%9A%A9%EC%96%B4</link>
            <guid>https://velog.io/@soo_32/%EC%9D%B4%EC%BB%A4%EB%A8%B8%EC%8A%A4-%EB%A7%88%EC%BC%80%ED%8C%85-%EC%9A%A9%EC%96%B4</guid>
            <pubDate>Mon, 27 Oct 2025 15:05:23 GMT</pubDate>
            <description><![CDATA[<h1 id="주의--저도-모름-저도-감자일-뿐">주의 : 저도 모름, 저도 감자일 뿐</h1>
<h2 id="마케팅-종류">마케팅 종류</h2>
<h3 id="콘텐츠-마케팅">콘텐츠 마케팅</h3>
<blockquote>
<p>이커머스 플랫폼 내 콘텐츠(쿠팡의 &quot;오늘의 발견&quot; 등) + sns, 블로그 콘텐츠</p>
</blockquote>
<p><strong>[ 인지도 ]</strong></p>
<ul>
<li>핵심 목표 : 브랜드 인지도 강화와 구매 유도</li>
<li>핵심 지표 : PV, UV, 체류시간, 저장/공유 수 등</li>
<li>핵심 업무 : 브랜드 톤앤매너에 맞는 콘텐츠 기획·제작, 인플루언서 협업 / 바이럴 기획 등</li>
</ul>
<h3 id="퍼포먼스-마케팅">퍼포먼스 마케팅</h3>
<blockquote>
<p>이커머스 플랫폼 내에서 진행되는 광고 + 구글/네이버/카카오/메타 등의 SA, DA</p>
</blockquote>
<p><strong>[ 전환 ]</strong></p>
<ul>
<li>핵심 목표 : 광고 효율을 극대화하는 것</li>
<li>핵심 지표 : ROAS, CVR, CPA, CTR 등</li>
<li>핵심 업무 : 캠페인별 성과 분석 및 최적화, A/B 테스트 통한 효율 개선 등</li>
</ul>
<h3 id="crm-마케팅">CRM 마케팅</h3>
<blockquote>
<p>멤버십 시스템, 포인트/쿠폰, 리뷰 리워드 + 이메일, 카카오톡 알림톡, 앱 푸시, 문자 등</p>
</blockquote>
<p><strong>[ 유지 ]</strong></p>
<ul>
<li>핵심 목표 : 기존 고객 유지 및 재구매율 향상</li>
<li>핵심 지표 : LTV, ARPU, 재구매율(RPR), 이탈률 등</li>
<li>핵심 업무 : 고객 세그먼트별 타겟 캠페인 설계, CRM 데이터 분석(이탈률, AOV 등), A/B 테스트 및 리텐션 캠페인 운영 등</li>
</ul>
<blockquote>
<p><strong>이커머스는 지속적 성과를 만들어내는 CRM 마케팅이 중요</strong></p>
</blockquote>
<h2 id="마케팅-용어">마케팅 용어</h2>
<h3 id="콘텐츠-마케팅-용어">콘텐츠 마케팅 용어</h3>
<h4 id="1-트래픽--관심도-관련-지표">1) 트래픽 / 관심도 관련 지표</h4>
<p>어떤 콘텐츠가 유입과 체류를 끌어내는지 확인
인기/관심 콘텐츠를 기반으로 콘텐츠 전략 설계</p>
<ul>
<li><strong>PV (Page View)</strong> : 페이지가 조회된 횟수<ul>
<li>콘텐츠별 트래픽 파악 → 인기 콘텐츠 판단</li>
</ul>
</li>
<li><strong>UV (Unique Visitor)</strong> : 고유 방문자 수<ul>
<li>방문자 규모 및 신규 유입 판단</li>
<li>UV 높아짐 = 신규 고객 유입 확인</li>
</ul>
</li>
<li><strong>DT (Dwell Time, 체류시간)</strong> : 페이지에 머문 시간<ul>
<li>콘텐츠 흡인력/관심도 평가</li>
<li>DT 높음 = 구매 전환 가능성 높음</li>
</ul>
</li>
<li><strong>Bounce Rate (이탈률)</strong> : 페이지 도착 후 바로 이탈한 비율<ul>
<li>콘텐츠/페이지 개선 필요 판단</li>
</ul>
</li>
</ul>
<h4 id="2-전환--객단가-관련-지표">2) 전환 / 객단가 관련 지표</h4>
<p>콘텐츠가 전환과 객단가에 미치는 영향을 수치화
고가 상품/프리미엄 고객 집중 콘텐츠 제작</p>
<ul>
<li><strong>CT (Customer Transaction, 객단가)</strong> : 고객 1회 결제 평균 금액<ul>
<li>콘텐츠별 전환 금액 확인, 업셀링·크로스셀링 전략</li>
<li>업셀링 : 고객이 이미 구매하려는 상품보다 더 높은 가격대 상품으로 구매를 유도하는 전략</li>
<li>크로스셀링 : 고객이 구매하려는 상품과 관련된 다른 상품을 함께 구매하도록 제안하는 전략</li>
</ul>
</li>
<li><strong>AOV (Average Order Value)</strong> : 평균 주문 금액<ul>
<li>콘텐츠가 구매 단가에 미치는 영향 평가</li>
</ul>
</li>
<li><strong>ASP (Average Selling Price, 평균 판매가)</strong> : 판매 상품 평균 가격<ul>
<li>콘텐츠 전략과 고가 상품 홍보 효율 분석, 상품 기준</li>
</ul>
</li>
<li><strong>ARPPU (Average Revenue Per Paying User)</strong> : 결제 고객 1인당 평균 매출<ul>
<li>VIP/프리미엄 고객 대상 콘텐츠 전략</li>
</ul>
</li>
</ul>
<h4 id="3-장기-가치--반복-구매-관련-지표">3) 장기 가치 / 반복 구매 관련 지표</h4>
<p>콘텐츠가 장기적 매출과 반복 구매에 얼마나 기여하는지 평가
장기 가치 높은 콘텐츠를 확대 제작</p>
<ul>
<li><strong>MRR (Monthly Recurring Revenue)</strong> : 월 반복 매출<ul>
<li>구독형 상품/정기배송 상품 콘텐츠 효과 측정</li>
</ul>
</li>
<li><strong>LTV (Lifetime Value)</strong> : 고객 생애 가치<ul>
<li>콘텐츠별 장기 수익/재구매 영향 평가</li>
</ul>
</li>
<li><strong>RPR (Repeat Purchase Rate, 재구매율)</strong> : 일정 기간 내 재구매 비율<ul>
<li>콘텐츠가 반복 구매를 유도하는지 평가</li>
</ul>
</li>
</ul>
<h4 id="4-추가-콘텐츠-관련-지표">4) 추가 콘텐츠 관련 지표</h4>
<p>단순 방문만 확인하지 않고 행동/참여까지 연결하여 콘텐츠 성과 측정
SNS 콘텐츠→웹 랜딩→구매 전환까지 흐름 최적화</p>
<ul>
<li><strong>Engagement Rate (참여율)</strong> : 좋아요, 댓글, 공유 등 상호작용<ul>
<li>SNS/블로그 콘텐츠 관심도 판단, 바이럴 가능성 확인</li>
</ul>
</li>
<li><strong>CTR (Click-Through Rate)</strong> : 콘텐츠 내 CTA 클릭률<ul>
<li>구매 페이지, 상세페이지 전환 유도 측정</li>
</ul>
</li>
<li><strong>Conversion Rate (CVR)</strong> : 방문 대비 실제 구매 전환율<ul>
<li>콘텐츠별 전환 효율 평가</li>
</ul>
</li>
</ul>
<h4 id="5-콘텐츠-마케팅-실무-흐름-예시">5) 콘텐츠 마케팅 실무 흐름 예시</h4>
<ul>
<li>유입 &amp; 관심도 확인<ul>
<li>리뷰 콘텐츠 PV 10,000 / UV 8,000 / DT 2분
→ 방문자 관심 확인</li>
</ul>
</li>
<li>전환 &amp; 객단가 유도<ul>
<li>해당 콘텐츠 시청 고객 CT 3만 원 / AOV 5만 원
→ 업셀링/프리미엄 상품 추천</li>
</ul>
</li>
<li>장기 가치 &amp; 반복 구매<ul>
<li>재구매율 25%, 구독형 상품 MRR 3000만 원
→ 장기 고객 확보</li>
</ul>
</li>
</ul>
<h3 id="퍼포먼스-마케팅-용어">퍼포먼스 마케팅 용어</h3>
<h4 id="1-유입트래픽-단계-지표">1) 유입(트래픽) 단계 지표</h4>
<p>광고의 노출 대비 클릭 효율(CTR, CPC)을 최적화
소재·타깃·채널별 퍼포먼스 차이를 수치로 비교</p>
<ul>
<li><strong>노출 (Impression)</strong> : 광고가 사용자에게 노출된 횟수<ul>
<li>광고 범위 및 브랜드 인지도 측정</li>
</ul>
</li>
<li><strong>도달 (Reach)</strong> : 광고를 실제로 본 고유 사용자 수<ul>
<li>중복 노출 제거한 실제 타깃 도달 범위 확인</li>
</ul>
</li>
<li><strong>클릭 (Click)</strong> : 광고 클릭 횟수<ul>
<li>트래픽 유입, 랜딩페이지 유효성 분석</li>
<li>클릭 5,000건 중 이탈률 70% → 랜딩 개선 필요</li>
</ul>
</li>
<li><strong>CTR (Click-Through Rate)</strong> : 클릭률<ul>
<li>= (클릭수 ÷ 노출수)</li>
<li>광고 소재/카피 효율성 판단</li>
<li>CTR 0.8% → 이미지 변경 후 CTR 2% 개선</li>
</ul>
</li>
<li><strong>CPC (Cost Per Click)</strong> : 클릭당 비용<ul>
<li>예산 효율성 판단, 최적 입찰가 산정</li>
</ul>
</li>
</ul>
<h4 id="2-전환-단계-지표">2) 전환 단계 지표</h4>
<p>광고의 전환 효율을 수치화 (CVR, CPA, ROAS 중심)
성과 낮은 캠페인은 입찰가/소재/타깃 조정으로 즉시 개선</p>
<ul>
<li><strong>CVR (Conversion Rate)</strong> : 전환율<ul>
<li>= (구매 수 ÷ 클릭 수)</li>
</ul>
</li>
<li><strong>CPA (Cost Per Acquisition)</strong> : 전환당 비용<ul>
<li>전환 1건당 광고비 효율 판단</li>
</ul>
</li>
<li><strong>CPS / CPP / CPT / CPM / CPV</strong><ul>
<li>CPS (Cost Per Sale) : 판매 1건당 광고비<ul>
<li>광고비 ÷ 판매건수</li>
</ul>
</li>
<li>CPP (Cost Per Purchase) : 구매 1건당 광고비<ul>
<li>광고비 ÷ 구매건수</li>
</ul>
</li>
<li>CPT (Cost Per Time) : 특정 시간 동안 노출되는 광고비<ul>
<li>광고비 ÷ 노출기간</li>
</ul>
</li>
<li>CPM (Cost Per Mille) : 1,000회 노출당 광고비</li>
<li>CPV (Cost Per View) : 동영상 1회 재생당 광고비<ul>
<li>광고비 ÷ 재생수</li>
</ul>
</li>
</ul>
</li>
<li><strong>ROAS (Return on Ad Spend)</strong><ul>
<li>광고 매출 ÷ 광고비</li>
<li>채널 효율 판단, 예산 재분배</li>
</ul>
</li>
<li><strong>AOV (Average Order Value)</strong> : 평균 주문 금액<ul>
<li>전환당 수익성 판단</li>
<li>AOV 변화율로 프로모션 효과 분석</li>
</ul>
</li>
</ul>
<h4 id="3-효율--유지-단계-지표">3) 효율 / 유지 단계 지표</h4>
<p>ROI/ROAS/KPI로 캠페인 효율 관리
WoW, DAU/MAU로 성장 및 충성 고객 흐름 추적</p>
<ul>
<li><strong>ROI (Return on Investment)</strong> : 투자 수익률<ul>
<li>= (순이익 ÷ 투자비용) × 100</li>
<li>전체 마케팅 ROI 관리</li>
</ul>
</li>
<li><strong>ROAS (Return on Ad Spend)</strong> : 광고 투자 대비 매출<ul>
<li>= (매출 ÷ 광고비) × 100</li>
<li>채널별 광고 성과 측정</li>
</ul>
</li>
<li><strong>KPI (핵심성과지표)</strong> : 목표 지표 (ROAS, CTR 등)<ul>
<li>캠페인 성과 추적</li>
<li>KPI: ROAS 400%, CTR 2% 목표 설정 등</li>
</ul>
</li>
<li><strong>WoW (Week over Week)</strong> : 주간 성장률 비교<ul>
<li>{(이번 주 수치 - 지난 주 수치) / 지난 주 수치} × 100</li>
<li>성과 추이 확인, 개선 방향 도출</li>
<li>MoM (Month), QoQ (Quarter), YoY (Year) 등</li>
</ul>
</li>
<li><strong>DAU / MAU (활성 사용자)</strong> : 앱 사용자 유지율<ul>
<li>DAU(Daily Active Users) : 하루 동안 앱(또는 웹)에 로그인·활동한 ‘고유 사용자’ 수</li>
<li>MAU (Monthly Active Users) : 한 달 동안 한 번 이상 활동한 ‘고유 사용자’ 수</li>
<li>= DAU ÷ MAU × 100</li>
<li>사용자가 얼마나 ‘자주 돌아오는지’ 나타냄
→ 리텐션·충성도 지표</li>
</ul>
</li>
</ul>
<h4 id="4-퍼널-기반-활용-예시-실무-흐름">4) 퍼널 기반 활용 예시 (실무 흐름)</h4>
<ul>
<li>인지 (Awareness) : 노출, 도달, CPM<ul>
<li>브랜드 인지도 확보 → CPM 낮은 채널 우선 집행</li>
</ul>
</li>
<li>관심 (Consideration) : 클릭, CTR, CPC, PV, UV, DT<ul>
<li>관심 유입 확인 → CTR 낮은 소재 교체</li>
</ul>
</li>
<li>전환 (Conversion) : CVR, CPA, CPS, AOV<ul>
<li>랜딩 최적화, CTA 강화로 전환율 상승</li>
</ul>
</li>
<li>성과 (Performance) : ROI, ROAS, KPI, WoW<ul>
<li>채널별 수익성 분석, 효율 캠페인 예산 확대</li>
</ul>
</li>
<li>유지 (Retention) : DAU/MAU<ul>
<li>앱 푸시, 리마케팅으로 재방문 유도</li>
</ul>
</li>
</ul>
<h3 id="crm-마케팅-용어">CRM 마케팅 용어</h3>
<h4 id="1-유입-후-유지-단계-지표">1) 유입 후 유지 단계 지표</h4>
<p>고객이 유입된 후 앱/웹에서 얼마나 자주 접점을 갖는지 추적
유지 비용 대비 효율(CRC)로 CRM 캠페인 예산 조정
DAU/MAU·앱 의존성으로 충성 고객층 형성 여부 확인</p>
<ul>
<li><strong>CRC (Customer Retention Cost)</strong> : 고객 1명을 유지하기 위해 투입된 비용<ul>
<li>CRM 캠페인별 효율 측정, CAC 대비 유지 비용 확인</li>
<li>CAC (Customer Acquisition Cost) : 고객 1명을 획득하는 데 소요된 총 비용</li>
</ul>
</li>
<li><strong>DAU / MAU</strong> : 앱 활성 사용자 비율<ul>
<li>앱 충성도 및 재방문율 평가</li>
</ul>
</li>
<li><strong>앱 의존성</strong> : 전체 트래픽 중 앱 비율<ul>
<li>앱 기반 리텐션 전략 우선순위 판단</li>
</ul>
</li>
</ul>
<h4 id="2-재구매-및-전환-단계-지표">2) 재구매 및 전환 단계 지표</h4>
<p>재구매율(RPR)과 잔존율로 CRM 성과 확인
이탈률이 높은 세그먼트에 맞춤형 캠페인 집중
멤버십·리마인드 메시지·쿠폰 전략으로 재구매 유도</p>
<ul>
<li><strong>RPR (Repeat Purchase Rate)</strong> : 일정 기간 내 재구매 고객 비율<ul>
<li>캠페인별 재구매 효과 측정, 전략 최적화</li>
</ul>
</li>
<li><strong>Retention Rate (잔존율)</strong> : 일정 기간 후 남아 있는 고객 비율<ul>
<li>장기 고객 관리, 멤버십·포인트 전략 평가</li>
</ul>
</li>
<li><strong>Churn Rate (이탈률)</strong> : 일정 기간 내 고객 이탈 비율<ul>
<li>휴면 고객 복귀 전략, 재구매 캠페인 필요 여부 판단</li>
</ul>
</li>
</ul>
<h4 id="3-장기-가치-및-매출-단계-지표">3) 장기 가치 및 매출 단계 지표</h4>
<p>LTV 중심 CRM 전략 설계 → 유지·업셀링·멤버십
MRR 추적 → 반복 매출 안정화
ARPPU 개선 → VIP·고액 고객 집중 관리</p>
<ul>
<li><strong>LTV (Lifetime Value)</strong> : 고객 1명이 평생 창출하는 매출<ul>
<li>세그먼트별 장기 가치 측정, CAC 대비 수익성 판단</li>
<li>LTV/CAC &gt; 1 = 이익, LTV/CAC &lt; 1 = 손실</li>
</ul>
</li>
<li><strong>MRR (Monthly Recurring Revenue)</strong> : 월 반복 매출<ul>
<li>구독형, 멤버십 기반 CRM 전략 성과 측정</li>
</ul>
</li>
<li><strong>ARPPU (Average Revenue Per Paying User)</strong> : 결제 고객 1인당 평균 매출<ul>
<li>결제 고객 집중 전략</li>
<li>VIP 고객 관리, 업셀링 전략 평가</li>
<li>ARPU(Average Revenue Per User) : 사용자 1인당 평균 매출<ul>
<li>일반 고객 매출 평가</li>
</ul>
</li>
</ul>
</li>
<li><strong>CSI(Customer Satisfaction Index)</strong> : 고객 만족 지수<ul>
<li>VOC, 리뷰, CS 분석 통한 품질 개선</li>
<li>VOC(Voice of Customer) : 고객 불만/요청 데이터<ul>
<li>고객 경험 개선, 서비스 개선 포인트</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="4-crm-마케팅-통합-활용-전략">4) CRM 마케팅 통합 활용 전략</h4>
<ul>
<li>유입 → 유지 → 재구매 → 장기 가치 흐름을 CRM 지표로 추적</li>
<li>CAC 대비 CRC 효율 측정 → 유지 중심 예산 최적화</li>
<li>RPR, Retention, DAU/MAU로 충성 고객 관리</li>
<li>LTV·ARPPU·MRR로 장기 매출 예측 및 VIP 전략 강화</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 코드카타_06]]></title>
            <link>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8006</link>
            <guid>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8006</guid>
            <pubDate>Mon, 27 Oct 2025 04:01:54 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style='font-size:35px;'><strong>SQL 코드카타_Find Invalid IP Addresses</strong></span></p>
</blockquote>
<h2 id="find-invalid-ip-addresses">Find Invalid IP Addresses</h2>
<h3 id="문제--find-invalid-ip-addresses">문제 : <a href="https://leetcode.com/problems/find-invalid-ip-addresses/description/">Find Invalid IP Addresses</a></h3>
<p><span style='font-size:20px;'># 목적, 목표 : 유효하지 않은 ip 모두 추출</span>
<span style='font-size:20px;'># 필요한 컬럼 : log_id, ip, invalid_count</span>
<span style='font-size:20px;'># 컬럼 조건 : invalid_count = count(ip)</span>
<span style='font-size:20px;'># 사용할 테이블 : logs</span>
<span style='font-size:20px;'># join key : 없음</span>
<span style='font-size:20px;'># 테이블 조건 : 없음</span>
<span style='font-size:20px;'># 필요한 그룹 : ip</span>
<span style='font-size:20px;'># 필요한 그룹 조건 : 없음</span>
<span style='font-size:20px;'># 정렬 기준 : invalid_count desc, ip desc</span>
<span style='background-color: #FFFACD; font-size:20px;'># 주의사항 : 유효하지 않은 ip 조건</span></p>
<ul>
<li><span style='font-size:20px;'>각 octet &gt; 255</span></li>
<li><span style='font-size:20px;'>각 octet 0으로 시작</span></li>
<li><span style='font-size:20px;'>octet 개수 != 4</span></li>
</ul>
<h3 id="로직">로직</h3>
<ul>
<li><span style='font-size:20px;'>&#39; . &#39; 기준으로 octet 분리 및 octet 개수 count</span></li>
<li><span style='font-size:20px;'>각 조건별로 테이블 생성</span></li>
<li><span style='font-size:20px;'>UNION ALL</span></li>
<li><span style='font-size:20px;'>distinct log_id, count(ip)</span></li>
</ul>
<h3 id="코드-뜯어보기">[코드 뜯어보기]</h3>
<pre><code class="language-sql">WITH A AS (  # &#39;.&#39; 기준으로 octet 분리 및 octet 개수 count
SELECT log_id, ip, substring_index(ip, &#39;.&#39;, 1) as one,
    substring_index(substring_index(ip, &#39;.&#39;, 2), &#39;.&#39;, -1) as two,
    substring_index(substring_index(ip, &#39;.&#39;, 3), &#39;.&#39;, -1) as three,
    substring_index(substring_index(ip, &#39;.&#39;, 4), &#39;.&#39;, -1) as four,
    LENGTH(ip) - LENGTH(REPLACE(ip, &#39;.&#39;, &#39;&#39;)) as cnt_octet
FROM logs),</code></pre>
<pre><code class="language-sql">B AS (  # 1번 조건
SELECT log_id, ip
FROM A
WHERE one &gt; 255 or two &gt; 255 or three &gt; 255 or four &gt; 255),</code></pre>
<pre><code class="language-sql">C AS (  # 2번 조건
SELECT log_id, ip
FROM A
WHERE one like &#39;0%&#39; or two like &#39;0%&#39; or three like &#39;0%&#39; or four like &#39;0%&#39;),</code></pre>
<pre><code class="language-sql">D AS (  # 3번 조건
SELECT log_id, ip
FROM A
WHERE cnt_octet &lt; 3 or cnt_octet &gt; 3),</code></pre>
<pre><code class="language-sql">E AS (  # 각 조건별 유효하지 않은 ip UNION
SELECT log_id, ip
FROM B
UNION ALL
SELECT log_id, ip
FROM C
UNION ALL
SELECT log_id, ip
FROM D),</code></pre>
<pre><code class="language-sql">F AS (  # distinct log_id로 중복 제거
SELECT distinct log_id, ip
FROM E)</code></pre>
<pre><code class="language-sql"># 유효하지 않은 ip와 invalid_count 추출 및 내림차순 정렬
SELECT ip, count(ip) as invalid_count
FROM F
GROUP BY ip
ORDER BY invalid_count desc, ip desc</code></pre>
<h3 id="새로-알게된-점">[새로 알게된 점]</h3>
<ul>
<li><span style='background-color: #FFFACD; font-size:20px;'>SUBSTRING_INDEX(string, delimiter, number)</span><ul>
<li><span style='font-size:20px;'>string: 자르려는 원본 문자열</span></li>
<li><span style='font-size:20px;'>delimiter: 문자열을 나눌 기준이 되는 구분자</span></li>
<li><span style='font-size:20px;'>number: 구분자를 기준으로 가져올 문자열의 개수</span></li>
</ul>
</li>
<li><span style='font-size:20px;'>SUBSTRING_INDEX로  2번째 문자열만 추출하기</span><ul>
<li><span style='font-size:20px;'>SUBSTRING_INDEX(SUBSTRING_INDEX(string, delimiter, 2), delimiter, -1)</span></li>
</ul>
</li>
<li><span style='background-color: #FFFACD; font-size:20px;'>특정 문자의 개수 세기</span><ul>
<li><span style='font-size:20px;'>전체 문자열 길이 - 특정 문자 제거한 문자열 길이</span></li>
<li><span style='font-size:20px;'>LENGTH(ip) - LENGTH(REPLACE(ip, &#39; . &#39;, &#39;&#39;))</span></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[QCC 오답노트]]></title>
            <link>https://velog.io/@soo_32/QCC-%EC%98%A4%EB%8B%B5%EB%85%B8%ED%8A%B8</link>
            <guid>https://velog.io/@soo_32/QCC-%EC%98%A4%EB%8B%B5%EB%85%B8%ED%8A%B8</guid>
            <pubDate>Fri, 24 Oct 2025 10:59:18 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style='font-size: 35px;'><strong>문제</strong></span></p>
</blockquote>
<p>1번. 전년도 대비 GNP가 감소한 국가 중 인구 수가 1,000만명 이상인 국가만 추출</p>
<ul>
<li><p>내가 한 코드</p>
<pre><code class="language-sql">with a as (
select *
from country
where GNPOld != 0 or GNPOld is not null
),
b as (
select Code, Name, GNP, GNPOld, Population
from a
where GNP &lt; GNPOld  and Population &gt;= 1000)</code></pre>
</li>
<li><p>오답 이유</p>
<ul>
<li><p>1,000만명인데... 조건에 1,000명으로 함..</p>
</li>
<li><p>레전드 바보짓.. 정신 차립시다</p>
</li>
</ul>
</li>
</ul>
<p>2번. 도시가 3개 이상 존재하는 행정구역의 평균 인구수 추출</p>
<ul>
<li>내가 한 코드 (정답)<pre><code class="language-sql">select District, round(sum(Population)/count(distinct ID)) as AVERAGE_POPULATION
from city
group by District
having count(distinct ID) &gt;= 3
order by round(sum(Population)/count(distinct ID)) desc</code></pre>
</li>
</ul>
<p>3번. 각 대륙에서 인구가 가장 많은 도시 추출</p>
<ul>
<li>내가 한 코드 (오답)<pre><code class="language-sql">with a as (
select c1.Name as CITY_NAME, c2.Name as COUNTRY_NAME, c2.Continent, c1.Population, row_number() over(partition by c2.Continent, c1.Name order by c1.Population desc) as rn
from country c2 inner join city c1 on c2.Code = c1.CountryCode)
</code></pre>
</li>
</ul>
<p>select CITY_NAME, COUNTRY_NAME, Continent, Population
from a
where rn =1
order by Population desc</p>
<pre><code>
- 오답 이유

   - 대륙별, 도시별 인구 수로 구해야한다고 생각해서 partition by c2.Continent, c1.Name을 함

   - rn=1이 여러 개 추출됨
   - 각 “대륙–도시명” 조합마다 rn을 1부터 다시 세기 때문에, 대륙이 다르면 같은 도시명이라도 다시 rn=1이 됨

- 다시 푼 코드
```sql
with a as (
select c1.Name as CITY_NAME, c2.Name as COUNTRY_NAME, c2.Continent, c1.Population
from country c2 inner join city c1 on c2.Code = c1.CountryCode),
b as (
select Continent, max(Population) as max_p
from a
group by Continent)

select CITY_NAME, COUNTRY_NAME, Continent, Population
from a
where Population = (select max_p from b where a.Continent = b.Continent)
order by Population desc</code></pre><pre><code class="language-sql">with a as (
select c1.Name as CITY_NAME, c2.Name as COUNTRY_NAME, c2.Continent, c1.Population, row_number() over(partition by c2.Continent order by c1.Population desc) as rn
from city c1 inner join country c2 on c1.CountryCode = c2.Code)

select CITY_NAME, COUNTRY_NAME, Continent, Population
from a
where rn =1
order by Population desc</code></pre>
<blockquote>
<p>TMI..</p>
</blockquote>
<p>QCC 해설을 듣다가 튜터님이 &quot;머피&quot;를 닮았다길래 검색해보았다...<img src="https://velog.velcdn.com/images/soo_32/post/76562c30-6078-49e6-9bb4-653520f165d7/image.png" alt=""></p>
<p>그렇다.. 그녀도 정상은 아니었다..
우리가 친한 데에는 이유가 있지 후후</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 코드카타_05]]></title>
            <link>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8005</link>
            <guid>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8005</guid>
            <pubDate>Fri, 10 Oct 2025 02:22:30 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style="font-size:35px;"><strong>SQL 코드카타_Department Top Three Salaries</strong></span></p>
</blockquote>
<h2 id="department-top-three-salaries">Department Top Three Salaries</h2>
<h3 id="문제--department-top-three-salaries">문제 : <a href="https://leetcode.com/problems/department-top-three-salaries/description/">Department Top Three Salaries</a></h3>
<p><span style="font-size:20px;"># 목적, 목표 : 부서별 top 3 연봉받는 직원의 부서명, 이름, 연봉 추출</span>
<span style="font-size:20px;"># 필요한 컬럼 : e.name, d.name, e.salary</span>
<span style="font-size:20px;"># 컬럼 조건 : 없음</span>
<span style="font-size:20px;"># 사용할 테이블 : Employee, Department</span>
<span style="font-size:20px;"># join key : e.departmentId = d.id</span>
<span style="font-size:20px;"># 테이블 조건 : DR &lt;= 3</span>
<span style="font-size:20px;"># 필요한 그룹 : d.id</span>
<span style="font-size:20px;"># 필요한 그룹 조건 : order by Salary desc</span>
<span style="font-size:20px;"># 정렬 기준 : in any order</span>
<span style="background-color: #FAFAD2; font-size:20px;"># 주의사항 : dense_rank</span></p>
<h3 id="로직">로직</h3>
<ul>
<li><span style="font-size:20px;">부서별 연봉 내림차순으로 dense_rank 구하기</span></li>
<li><span style="font-size:20px;">dense_rank &lt;=3만 추출하기</span></li>
</ul>
<pre><code class="language-sql">WITH A AS (  # 부서별 연봉 내림차순 dense_rank
SELECT d.name as Department, e.name as Employee, e.salary as Salary, DENSE_RANK() OVER(partition by d.id order by e.salary desc) as DR
FROM Employee e inner join Department d on e.departmentId = d.id)

SELECT Department, Employee, Salary
FROM A
WHERE DR &lt;= 3 ;</code></pre>
<h3 id="새로-알게된-점">새로 알게된 점</h3>
<ul>
<li><span style="font-size:20px;">dense_rank() over</span><ul>
<li><span style="font-size:20px;">rank() over 처럼 같은 값을 가진 행들은 동일한 순위를 받음</span></li>
<li><span style="background-color: #FAFAD2; font-size:20px;">rank() over와 달리, <strong>다음 순위를 건너뛰지 않고 바로 이어짐</strong></span></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 코드카타_04]]></title>
            <link>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8004</link>
            <guid>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8004</guid>
            <pubDate>Thu, 02 Oct 2025 11:06:48 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style='font-size: 35px;'><strong>SQL 코드카타_Employee Salaries</strong></span></p>
</blockquote>
<p>힐링을 위해 쉬운 코드카타를 풀어보았습네다...행벅</p>
<h2 id="employee-salaries">Employee Salaries</h2>
<h3 id="문제--employee-salaries">문제 : <a href="https://www.hackerrank.com/challenges/salary-of-employees/problem?isFullScreen=true">Employee Salaries</a></h3>
<p><span style='background-color: #FAFAD2; font-size: 20px;'># 목적, 목표 : 근속기간 10개월 미만의 직원들 중 월급이 2000달러 초과인 직원의 이름 추출</span>
<span style='font-size: 20px;'># 필요한 컬럼 : name</span>
<span style='font-size: 20px;'># 컬럼 조건 : 없음</span>
<span style='font-size: 20px;'># 사용할 테이블 : Employee</span>
<span style='font-size: 20px;'># join key : 없음</span>
<span style='background-color: #FAFAD2; font-size: 20px;'># 테이블 조건 : months &lt; 10, salary &gt; 2000</span>
<span style='font-size: 20px;'># 필요한 그룹 : 없음</span>
<span style='font-size: 20px;'># 필요한 그룹 조건 : 없음</span>
<span style='font-size: 20px;'># 정렬 기준 : employee_id</span>
<span style='font-size: 20px;'># 주의사항 : 없음</span></p>
<h3 id="로직">로직</h3>
<ul>
<li><span style='font-size: 20px;'>months &lt; 10, salary &gt; 2000인 name 추출</span></li>
<li><span style='font-size: 20px;'>employee_id 기준 오름차순 정렬</span></li>
</ul>
<pre><code class="language-sql">SELECT name
FROM Employee
WHERE months &lt; 10 and salary &gt; 2000
ORDER BY employee_id</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[통계 뿌시기 - 라이브세션5]]></title>
            <link>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%84%B8%EC%85%985</link>
            <guid>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%84%B8%EC%85%985</guid>
            <pubDate>Wed, 01 Oct 2025 12:01:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 상관관계 &quot;</strong></span></p>
</blockquote>
<h2 id="상관관계">상관관계</h2>
<h3 id="상관관계-1">상관관계</h3>
<p><span style='font-size: 20px;'>두 변수 간에 함께 변하는 정도의 강도와 방향을 나타내는 개념</span></p>
<ul>
<li><span style='font-size: 20px;'>두 변수가 서로 어떤 관계를 가지는지를 <strong>수치적</strong>으로 표현</span></li>
<li><span style='font-size: 20px;'>일반적으로 <strong>상관계수(correlation coefficient)</strong>로 표현</span><ul>
<li><span style='font-size: 20px;'>양적 변수끼리만 계산 가능</span></li>
<li><span style='font-size: 20px;'>범주형 변수에는 적용 불가능</span><ul>
<li><span style='font-size: 20px;'>해결 : 교차표, 카이제곱 검정, 평균 차이 검정 등</span></li>
</ul>
</li>
</ul>
</li>
<li><span style='font-size: 20px;'>상관관계는 <strong>인과관계를 의미하지는 않음</strong></span></li>
</ul>
<h3 id="상관계수">상관계수</h3>
<ul>
<li><span style='font-size: 20px;'>관계의 방향(+ / -)과 강도(약 / 중 / 강)를 알려줌</li>
<li><span style='font-size: 20px;'>필요성 : 산점도의 패턴을 숫자 하나로 요약하여 해석이 용이함</span><ul>
<li><span style='font-size: 20px;'>산점도는 사람마다 해석이 다를 수 있고 데이터 수가 많으면 해석이 어려움</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>값의 범위 : -1 ~ +1</span></li>
<li><span style='font-size: 20px;'>+1 : 완벽한 양(+)의 상관관계</span><ul>
<li><span style='font-size: 20px;'>한 변수가 증가하면 다른 변수도 일정하게 증가</span></li>
<li><span style='font-size: 20px;'>ex ) 공부한 시간 ↑ :: 시험 점수 ↑</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>0 : 상관관계 없음</span><ul>
<li><span style='font-size: 20px;'>두 변수는 선형적 관계가 없음</span></li>
<li><span style='font-size: 20px;'>ex ) 신발 사이즈 :: 국어 시험 점수</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>-1 : 완벽한 음(-)의 상관관계</span><ul>
<li><span style='font-size: 20px;'>한 변수가 증가하면 다른 변수는 일정하게 감소</span></li>
<li><span style='font-size: 20px;'>ex ) 운동량 ↑ :: 체지방률 ↓</span></li>
</ul>
</li>
</ul>
<pre><code class="language-python">fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
sns.heatmap(corr_numeric, annot=True, cmap=&quot;Blues&quot;)
ax.tick_params(colors=&#39;w&#39;)
ax.spines[&#39;bottom&#39;].set_color(&#39;w&#39;)
ax.spines[&#39;left&#39;].set_color(&#39;w&#39;)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_32/post/cc5f71bc-0bdf-4f91-8450-1620b87844bc/image.png" alt=""></p>
<h3 id="산점도">산점도</h3>
<ul>
<li><span style='font-size: 20px;'>두 변수의 값을 각각 x축과 y축에 점으로 표시한 그래프</span></li>
<li><span style='font-size: 20px;'>필요성 : 숫자는 왜곡될 수 있지만, 그림은 직관적으로 관계를 보여줌</span><ul>
<li><span style='font-size: 20px;'>양의 상관관계</span><ul>
<li><span style='font-size: 20px;'>점들이 ↗️ 오른쪽 위 방향으로 퍼져 있음</span>
<span style='font-size: 20px;'>→ x 값이 커질수록 y 값도 커지는 경향</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>상관관계 없음</span><ul>
<li><span style='font-size: 20px;'>점들이 흩뿌려져 특정한 패턴이 없음</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>음의 상관관계</span><ul>
<li><span style='font-size: 20px;'>점들이 ↘️ 오른쪽 아래 방향으로 퍼져 있음</span>
<span style='font-size: 20px;'>→ x 값이 커질수록 y 값은 작아지는 경향</span></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="상관계수와-산점도-모두-표현-필요">상관계수와 산점도 모두 표현 필요</h3>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 상관계수 &quot;</strong></span></p>
</blockquote>
<h2 id="피어슨-상관계수">피어슨 상관계수</h2>
<h3 id="공분산">공분산</h3>
<ul>
<li><span style='font-size: 20px;'>두 확률변수가 함께 변하는 정도를 나타내는 값</span></li>
<li><span style='font-size: 20px;'>하나의 변수가 평균보다 클 때 다른 변수도 평균보다 큰 경향이 있는지, 아니면 반대인지를 수치로 표현</span></li>
<li><span style='font-size: 20px;'>계산</span><img src="https://velog.velcdn.com/images/soo_32/post/c5b6f82e-cc20-46ab-9faa-cb1a1e5fdfc6/image.png" alt=""></li>
<li><span style='font-size: 20px;'>해석</span><ul>
<li><span style='font-size: 20px;'>Cov(X, Y) &gt; 0 → 양의 공분산</span><ul>
<li><span style='font-size: 20px;'>X가 평균보다 클 때 Y도 평균보다 큰 경향 (같이 움직임)</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>Cov(X, Y) ≈ 0 → 두 변수 사이에 선형적 관계가 거의 없음</span></li>
<li><span style='font-size: 20px;'>Cov(X, Y) &lt; 0 → 음의 공분산</span><ul>
<li><span style='font-size: 20px;'>X가 평균보다 클 때 Y는 평균보다 작은 경향 (반대로 움직임)</span></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="피어슨-상관계수-1">피어슨 상관계수</h3>
<ul>
<li><span style='font-size: 20px;'>공분산은 단위의 영향을 받아 값의 크기만으로 비교가 어려움</span><ul>
<li><span style='font-size: 20px;'>공분산을 표준화한 값이 바로 <strong>상관계수(r)</strong></span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>계산</span><img src="https://velog.velcdn.com/images/soo_32/post/c8736593-5d43-45c9-916c-9f0ad4a9c3cd/image.png" alt=""></li>
<li><span style='font-size: 20px;'>해석</span><ul>
<li><span style='font-size: 20px;'>| r | &lt; 0.3 → 약한 상관관계</span></li>
<li><span style='font-size: 20px;'>0.3 ≤ | r | &lt; 0.7 → 중간 상관관계</span></li>
<li><span style='font-size: 20px;'>| r | ≥ 0.7 → 강한 상관관계</span></li>
<li><span style='font-size: 20px;'>r = 0 → 두 변수는 관계가 전혀 없음 X</span><ul>
<li><span style='font-size: 20px;'>선형관계가 없을 뿐, 곡선 관계는 가능</span></li>
</ul>
</li>
</ul>
</li>
<li><span style='font-size: 20px;'>이상치에 민감</span><ul>
<li><span style='font-size: 20px;'>평균과 분산 기반으로 계산하기 때문</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>실제 값 기반 → 선형 관계 측정</span></li>
</ul>
<h2 id="스피어만-상관계수">스피어만 상관계수</h2>
<h3 id="스피어만-상관계수-1">스피어만 상관계수</h3>
<ul>
<li><span style='font-size: 20px;'>순위 기반 → 값이 아니라 순서만 반영</span></li>
<li><span style='font-size: 20px;'>계산</span><img src="https://velog.velcdn.com/images/soo_32/post/94ec172c-505a-4025-b475-1934c80aafd3/image.png" alt=""></li>
<li><span style='font-size: 20px;'>해석</span><ul>
<li><span style='font-size: 20px;'>p = +1 : 순위가 완벽히 일치 (X ↑ → Y ↑)</span></li>
<li><span style='font-size: 20px;'>p = 0 : 순위 간에 특별한 패턴 없음</span></li>
<li><span style='font-size: 20px;'>p = -1 : 순위가 완벽히 반대 (X ↑ → Y ↓)</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>이상치에 덜 민감</span></li>
<li><span style='font-size: 20px;'>곡선(비선형)관계도 잡아낼 수 있음</span></li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 상관계수와 가설검정 &quot;</strong></span></p>
</blockquote>
<h2 id="가설검정의-이유">가설검정의 이유</h2>
<ul>
<li><span style='font-size: 20px;'>상관계수 값이 단순히 우연(표본의 무작위성) 때문인지 아닌지를 확인하기 위해</span></li>
</ul>
<h2 id="가설-설정">가설 설정</h2>
<ul>
<li><span style='font-size: 20px;'>귀무가설(H0) : 모집단에서 상관이 없다 (상관계수=0)</span></li>
<li><span style='font-size: 20px;'>귀무가설(H1) : 모집단에서 상관이 있다 (상관계수!=0)</span></li>
</ul>
<h2 id="판정-기준">판정 기준</h2>
<ul>
<li><span style='font-size: 20px;'>p &lt; α : 우연이라고 보기 어려움 → 유의한 상관</span></li>
<li><span style='font-size: 20px;'>p ≥ α : 우연일 수 있음 → 단정할 수 없음</span></li>
</ul>
<h2 id="신뢰구간이-0-포함">신뢰구간이 0 포함</h2>
<ul>
<li><span style='font-size: 20px;'>상관계수의 신뢰구간(CI)은 모집단의 상관계수가 있을 수 있는 값의 범위를 제시</span></li>
<li><span style='font-size: 20px;'>신뢰구간이 0을 포함<ul>
<li><span style='font-size: 20px;'><strong>항상 p-value ≥ α</strong></span></li>
<li><span style='font-size: 20px;'>“모집단에서 실제 상관계수가 0일 가능성도 배제할 수 없다”</span></li>
<li><span style='font-size: 20px;'>통계적으로 유의한 상관관계가 있다고 말할 수 없다</span></li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 데이터 분석에서의 상관관계 &quot;</strong></span></p>
</blockquote>
<h2 id="주의할-점">주의할 점</h2>
<h3 id="eda-도구">EDA 도구</h3>
<ul>
<li><span style='font-size: 20px;'>데이터 분석에서 상관관계는 EDA 도구일 뿐</span><ul>
<li><span style='font-size: 20px;'>예측, 인과 추론을 위한 단독 근거로는 부적절함</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>보고서에는 반드시 산점도 + 상관계수 + 해석 포함</span><ul>
<li><span style='font-size: 20px;'>산점도 → 상관계수 → 해석</span></li>
<li><span style='font-size: 20px;'>ex ) 광고비와 매출은 r=0.65로 중간 정도 양의 상관관계를 보이며 이것이 인과관계를 의미하지는 않음</span></li>
</ul>
</li>
</ul>
<h3 id="적절한-상관계수-활용">적절한 상관계수 활용</h3>
<ul>
<li><span style='font-size: 20px;'>피어슨 상관계수 : 연속형 변수만 가능, 선형 관계</span></li>
<li><span style='font-size: 20px;'>스피어만 상관계수 : 순위형 변수도 가능, 단조 관계</span><ul>
<li><span style='font-size: 20px;'>비선형 관계(곡선)도 가능</span></li>
</ul>
</li>
</ul>
<h3 id="상관계수-해석-기준">상관계수 해석 기준</h3>
<ul>
<li><span style='font-size: 20px;'>연구 분야 &amp; 데이터 특성에 따라 해석이 달라짐</span></li>
<li><span style='font-size: 20px;'>분석에 따른 맥락 해석 필요</span><ul>
<li><span style='font-size: 20px;'>의학/생명과학 : 복잡한 요인들이 많아 r = 0.2~0.3도 중요한 상관으로 해석될 수 있음</span></li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 인과관계 &quot;</strong></span></p>
</blockquote>
<h2 id="인과관계">인과관계</h2>
<p><span style='font-size: 20px;'>변수 A의 변화가 변수 B의 변화를 직접적으로 일으킨다는 관계</span></p>
<ul>
<li><span style='font-size: 20px;'>즉 A가 원인, B가 결과</span></li>
</ul>
<h2 id="상관관계--인과관계">상관관계 != 인과관계</h2>
<ul>
<li><span style='font-size: 20px;'>상관이 있다고 해서 원인이라 단정하지 않는다</span><ul>
<li><span style='font-size: 20px;'>ex ) 아이스크림 판매량 ↑ &lt;-&gt; 익사 사고 ↑</span><ul>
<li><span style='font-size: 20px;'>원인은 아이스크림이 아니라 여름 더위</span></li>
</ul>
</li>
</ul>
</li>
<li><span style='font-size: 20px;'>항상 우연 or 교란 변수 존재 가능성을 의심해야 함</span><ul>
<li><span style='font-size: 20px;'>광고비와 매출 사이의 상관 발견</span><ul>
<li><span style='font-size: 20px;'>프로모션, 계절 요인, 경제 상황 같은 교란 변수 가능</span></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="교란변수">교란변수</h2>
<ul>
<li><span style='font-size: 20px;'>A와 B 모두에 영향을 주면서, 실제 인과관계를 왜곡시키는 숨은 변수</span><ul>
<li><span style='font-size: 20px;'>A와 B 사이의 경로에 개입해 <strong>“마치 인과처럼 보이게” 만드는 요인</strong></span></li>
</ul>
</li>
</ul>
<h2 id="교란변수의-문제점">교란변수의 문제점</h2>
<ul>
<li><span style='font-size: 20px;'>가짜 상관(spurious correlation) 발생</span></li>
<li><span style='font-size: 20px;'>실제 효과를 과대평가하거나 과소평가할 수 있음</span></li>
<li><span style='font-size: 20px;'>잘못된 의사결정을 유도할 수 있음</span></li>
<li><span style='font-size: 20px;'>ex ) &quot;커피를 마시는 사람일수록 폐암 위험이 높다”</span><ul>
<li><span style='font-size: 20px;'>사실은 흡연자가 커피를 더 많이 마시기 때문에 발생한 교란</span></li>
</ul>
</li>
</ul>
<h2 id="교란변수-다루는-법">교란변수 다루는 법</h2>
<ul>
<li><span style='font-size: 20px;'>실험적 접근 (가장 확실)</span><ul>
<li><span style='font-size: 20px;'>무작위 통제 실험(RCT)으로 교란변수를 무작위화</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>통계적 접근</span><ul>
<li><span style='font-size: 20px;'>회귀분석에서 교란변수를 <strong>통제 변수(control variable)</strong>로 포함</span></li>
</ul>
</li>
</ul>
<h2 id="무작위-통제-실험rct">무작위 통제 실험(RCT)</h2>
<ul>
<li><span style='font-size: 20px;'>두 집단을 비교할 때 필요한 조건</span><ul>
<li><span style='font-size: 20px;'><strong>원인만 다르고 나머지는 똑같아야 한다</strong></span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>구조</span><ul>
<li><span style='font-size: 20px;'><strong>무작위 배정(Randomization)</strong></span><ul>
<li><span style='font-size: 20px;'>교란변수가 두 집단에 골고루 분배되도록 하여 편향 최소화</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>처치(Treatment)</span><ul>
<li><span style='font-size: 20px;'><strong>실험군</strong> : 신약, 새로운 광고, 특정 교육 프로그램 등</span></li>
<li><span style='font-size: 20px;'><strong>대조군</strong> : 위약(placebo), 기존 광고, 교육 없음 등</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'><strong>비교(Comparison)</strong></span><ul>
<li><span style='font-size: 20px;'>두 집단의 결과 차이를 통계적으로 분석</span></li>
<li><span style='font-size: 20px;'>유의한 차이가 있으면, 그 차이를 처치 효과로 해석</span></li>
</ul>
</li>
</ul>
</li>
<li><span style='font-size: 20px;'>주요 방법</span><ul>
<li><span style='font-size: 20px;'>매칭 (Matching)</span><ul>
<li><span style='font-size: 20px;'>비슷한 특성을 가진 집단끼리 짝지어 비교</span></li>
<li><span style='font-size: 20px;'>ex ) 연령/성별/소득이 같은 사람 → 적용군 vs 미적용군</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>자연실험 (Natural Experiment)</span><ul>
<li><span style='font-size: 20px;'>외부 환경 덕분에 “우연히 발생한 상황”을 실험처럼 활용</span></li>
<li><span style='font-size: 20px;'>ex ) 특정 지역만 우연히 규제를 먼저 적용</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>차분의 차분 (Difference-in-Differences, DiD)</span><ul>
<li><span style='font-size: 20px;'>정책 / 처치 전후의 변화를 처리군과 대조군의 차이로 비교해서 인과효과 추정</span></li>
<li><span style='font-size: 20px;'>ex ) 최저임금 인상 지역 vs 비인상 지역의 고용률 변화</span></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="사례">사례</h3>
<h4 id="span-stylefont-size-20px광고-효과-검증-ab-테스트span"><span style='font-size: 20px;'>광고 효과 검증 (A/B 테스트)</span></h4>
<ul>
<li><span style='font-size: 20px;'>&quot;광고비가 매출을 끌어올릴까?&quot;</span><ul>
<li><span style='font-size: 20px;'>고객을 무작위로 두 집단으로 나눔</span><ul>
<li><span style='font-size: 20px;'>광고 노출군 vs 비노출군</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>두 그룹 매출 차이 → 광고 효과 확인 가능</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>&quot;A/B 테스트 결과, 광고 노출군의 매출은 비노출군보다 평균 12% 높았다 (p&lt;α). 이는 광고 효과일 가능성을 시사한다.&quot;</span></li>
</ul>
<h4 id="span-stylefont-size-20px신약-임상시험span"><span style='font-size: 20px;'>신약 임상시험</span></h4>
<ul>
<li><span style='font-size: 20px;'>한 그룹 : 신약 투여</span></li>
<li><span style='font-size: 20px;'>다른 그룹 : 위약(가짜 약) 투여</span></li>
<li><span style='font-size: 20px;'>무작위 배정으로 두 그룹 조건을 동일하게</span></li>
<li><span style='font-size: 20px;'>&quot;임상시험에서 신약 투여군의 증상 개선률은 대조군보다 유의하게 높았다. 무작위 배정으로 다른 요인을 배제했으므로 이는 약효로 해석할 수 있다.&quot;</span></li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 다중공선성 &quot;</strong></span></p>
</blockquote>
<h2 id="다중공선성">다중공선성</h2>
<p><span style='font-size: 20px;'>설명변수(독립변수)들끼리 강하게 상관관계를 가지는 상황</span></p>
<ul>
<li><span style='font-size: 20px;'>인과관계 X, 상관관계 O</span></li>
</ul>
<h3 id="문제">문제</h3>
<ul>
<li><span style='font-size: 20px;'><strong>회귀계수(β) 추정 불안정</strong></span><ul>
<li><span style='font-size: 20px;'>변수들이 서로 겹치면, <strong>모델이 어떤 변수의 효과인지 구분하기 어려움</strong></span>
<span style='font-size: 20px;'>→ 계수 추정치가 크게 흔들리거나(불안정), <strong>해석이 모호해짐</strong></span></li>
</ul>
</li>
<li><span style='font-size: 20px;'><strong>표준오차 증가 → p-value 커짐</strong></span><ul>
<li><span style='font-size: 20px;'>회귀계수 유의성이 떨어져서 “중요한 변수인데도 불구하고 통계적으로 의미 없음”으로 나올 수 있음</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'><strong>과적합 위험 증가</strong></span><ul>
<li><span style='font-size: 20px;'>변수가 많고 중복된 정보가 많을수록 모델이 <strong>일반화 성능이 떨어질 수 있음</strong></span></li>
</ul>
</li>
</ul>
<h3 id="확인-방법">확인 방법</h3>
<ul>
<li><span style='font-size: 20px;'>상관계수 행렬</span><ul>
<li><span style='font-size: 20px;'>독립변수끼리의 상관계수가 0.8~0.9 이상이면 의심</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'><strong>VIF (Variance Inflation Factor, 분산팽창계수)</strong></span><ul>
<li><span style='font-size: 20px;'>VIF &lt; 5 : 문제 없음</span></li>
<li><span style='font-size: 20px;'>VIF 5~10 : 다소 문제</span></li>
<li><span style='font-size: 20px;'>VIF ≥ 10 : 심각한 다중공선성</span></li>
</ul>
</li>
</ul>
<pre><code class="language-python"># 다중회귀에 쓴 변수들
X = df[[&quot;weight&quot;, &quot;displacement&quot;, &quot;cylinders&quot;]]

# 상수항 추가
X = sm.add_constant(X)

# VIF 계산
vif_df = pd.DataFrame()
vif_df[&quot;variable&quot;] = X.columns
vif_df[&quot;VIF&quot;] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]

print(vif_df)</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_32/post/0871b7cb-a98a-429f-9cad-ea1c01472161/image.png" alt=""></p>
<h3 id="해결-방법">해결 방법</h3>
<ul>
<li><span style='font-size: 20px;'><strong>변수 제거</strong></span><ul>
<li><span style='font-size: 20px;'>높은 상관관계를 가진 변수 중 하나를 빼기</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'><strong>변수 결합</strong></span><ul>
<li><span style='font-size: 20px;'>비슷한 변수를 묶어 합산/평균/주성분으로 변환</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'><strong>차원 축소</strong></span><ul>
<li><span style='font-size: 20px;'>PCA(주성분분석) 등으로 상관된 변수를 새로운 축으로 요약</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'><strong>규제 회귀 사용</strong></span><ul>
<li><span style='font-size: 20px;'>Lasso 회귀(L1 정규화) → 중요하지 않은 변수 계수 = 0으로 만들어 변수 선택 효과</span></li>
<li><span style='font-size: 20px;'>Ridge 회귀(L2 정규화) → 계수 크기를 줄여 안정화</span></li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 회귀분석 &quot;</strong></span></p>
</blockquote>
<h2 id="회귀분석">회귀분석</h2>
<h3 id="회귀">회귀</h3>
<p><span style='font-size: 20px;'>하나의 변수(Y)가 다른 변수(X들)와 어떤 규칙적인 관계를 가지는지를 수학적 함수(모델)로 표현하는 방법</span></p>
<ul>
<li><span style='font-size: 20px;'><strong>X가 변할 때 Y가 어떻게 변하는가?</strong></span></li>
</ul>
<h3 id="회귀분석-1">회귀분석</h3>
<p><span style='font-size: 20px;'>종속변수 Y가 독립변수 X들에 어떻게(얼마만큼) 영향을 받는지 추정하고 예측하는 것</span></p>
<h3 id="종류">종류</h3>
<h4 id="span-stylefont-size-20px단순-선형-회귀span"><span style='font-size: 20px;'>단순 선형 회귀</span></h4>
<ul>
<li><span style='font-size: 20px;'>X → Y 관계를 단 하나의 직선으로 설명하는 모델</span><ul>
<li><span style='font-size: 20px;'>독립변수 1개</span></li>
<li><span style='font-size: 20px;'>종속변수 Y가 연속형</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>Y = β0 + β1X + ε</span><ul>
<li><span style='font-size: 20px;'>β0 : 절편 (X=0일 때 Y값)</span></li>
<li><span style='font-size: 20px;'>β1 : 기울기 (X가 1 증가할 때 Y가 얼마나 변하는지)</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>현실은 여러 변수가 얽혀있기 때문에 확장 필요</span></li>
</ul>
<h4 id="span-stylefont-size-20px다중-선형-회귀span"><span style='font-size: 20px;'>다중 선형 회귀</span></h4>
<ul>
<li><span style='font-size: 20px;'>Y에 영향을 주는 X가 여러 개일 때</span><ul>
<li><span style='font-size: 20px;'>독립변수가 여러 개</span></li>
<li><span style='font-size: 20px;'>종속변수 Y가 연속형</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>Y = β0 + β1X1 + β2X2 + ... + βkXk + ε</span><ul>
<li><span style='font-size: 20px;'>장점 : 다양한 요인을 통제 가능</span></li>
<li><span style='font-size: 20px;'>단점 : 다중공선성(multicollinearity) 문제</span><ul>
<li><span style='font-size: 20px;'>변수들이 서로 강한 상관관계 → 해석 어려움</span></li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="span-stylefont-size-20px다항-회귀span"><span style='font-size: 20px;'>다항 회귀</span></h4>
<ul>
<li><span style='font-size: 20px;'>직선으로는 설명이 안 될 때, 곡선 형태를 반영</span></li>
<li><span style='font-size: 20px;'>Y = β0 + β1X + β2X² + β3X³ + ... + ε</span></li>
<li><span style='font-size: 20px;'>선형 회귀의 확장 → 독립변수의 제곱, 세제곱 같은 항 추가</span></li>
</ul>
<h4 id="span-stylefont-size-20px로지스틱-회귀span"><span style='font-size: 20px;'>로지스틱 회귀</span></h4>
<ul>
<li><span style='font-size: 20px;'><strong>종속변수 Y가 이진형(0/1)</strong>일 때 사용</span></li>
<li><span style='font-size: 20px;'>단순 직선 대신 <strong>시그모이드 함수(확률로 변환)</strong>로 모델링</span></li>
<li><span style='font-size: 20px;'>해석 : 특정 조건에서 사건이 발생할 확률 추정</span><ul>
<li><span style='font-size: 20px;'>ex )  고객이 이탈할까(Yes=1 / No=0)?</span></li>
</ul>
</li>
</ul>
<h4 id="span-stylefont-size-20px규제-회귀span"><span style='font-size: 20px;'>규제 회귀</span></h4>
<ul>
<li><span style='font-size: 20px;'><strong>독립변수 많거나 다중공선성 심할 때 사용</strong></span><ul>
<li><span style='font-size: 20px;'>다중 회귀에서 변수가 많으면 과적합(overfitting) 문제 발생</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>이를 방지하고 예측 안정성을 위해 패널티 부여</span><ul>
<li><span style='font-size: 20px;'>릿지(Ridge) : 계수를 작게 만들어 안정화 (L2 규제)</span></li>
<li><span style='font-size: 20px;'>라쏘(Lasso) : 불필요한 계수를 아예 0으로 만들어 변수 선택 효과 (L1 규제)</span></li>
<li><span style='font-size: 20px;'>Elastic Net : L1 + L2 혼합</span></li>
</ul>
</li>
</ul>
<h3 id="가정">가정</h3>
<h4 id="span-stylefont-size-20px선형-회귀span"><span style='font-size: 20px;'>선형 회귀</span></h4>
<ul>
<li><span style='font-size: 20px;'>선형성</span><ul>
<li><span style='font-size: 20px;'>X가 변할 때 Y는 일정한 비율로 변해야 한다</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>독립성</span><ul>
<li><span style='font-size: 20px;'>관측치들끼리 서로 독립적이어야 한다</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>등분산성</span><ul>
<li><span style='font-size: 20px;'>독립변수의 값에 상관없이 오차의 분산이 일정해야 한다</span><ul>
<li><span style='font-size: 20px;'>만약 X가 클수록 오차가 점점 커진다면 → <strong>이분산성(Heteroscedasticity) 문제 발생</strong></span></li>
<li><span style='font-size: 20px;'>표준오차가 왜곡되어 p-value, 신뢰구간이 잘못됨</span></li>
</ul>
</li>
</ul>
</li>
<li><span style='font-size: 20px;'>정규성</span><ul>
<li><span style='font-size: 20px;'>오차항(ε)이 정규분포를 따른다고 가정</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>다중공선성 없음</span><ul>
<li><span style='font-size: 20px;'>독립변수끼리 강한 상관관계가 없어야 한다</span></li>
<li><span style='font-size: 20px;'>VIF(Variance Inflation Factor)로 확인</span></li>
</ul>
</li>
</ul>
<h4 id="span-stylefont-size-20px다항-회귀span-1"><span style='font-size: 20px;'>다항 회귀</span></h4>
<ul>
<li><span style='font-size: 20px;'>등분산성, 독립성</span></li>
<li><span style='font-size: 20px;'>X와 Y의 관계가 비선형 함수로 표현된다는 차이</span></li>
</ul>
<h4 id="span-stylefont-size-20px로지스틱-회귀span-1"><span style='font-size: 20px;'>로지스틱 회귀</span></h4>
<ul>
<li><span style='font-size: 20px;'>등분산성, 독립성, 다중공선성 없음, 큰 표본에서 근사적 정규성 (중심극한정리)</span></li>
<li><span style='font-size: 20px;'>선형성은 로짓(logit) 공간에서 성립해야 함 → X와 logit(p)의 관계가 선형</span></li>
</ul>
<h4 id="span-stylefont-size-20px규제-회귀span-1"><span style='font-size: 20px;'>규제 회귀</span></h4>
<ul>
<li><span style='font-size: 20px;'>선형성, 독립성, 등분산성</span><ul>
<li><span style='font-size: 20px;'>다중공선성 문제를 완화하기 위해 쓰는 게 특징</span></li>
</ul>
</li>
</ul>
<h2 id="회귀분석에서의-가설검정">회귀분석에서의 가설검정</h2>
<h3 id="r²-결정계수-coefficient-of-determination">R² (결정계수, Coefficient of Determination)</h3>
<ul>
<li><span style='font-size: 20px;'>회귀분석에서 모델이 데이터를 얼마나 잘 설명하는가를 나타내는 지표</span></li>
<li><span style='font-size: 20px;'>값의 범위 : 0 ~ 1 </span><ul>
<li><span style='font-size: 20px;'>높을수록 설명력 좋음</span><ul>
<li><span style='font-size: 20px;'>예측 정확도가 높다는 보장은 아님</span><ul>
<li><span style='font-size: 20px;'>비선형 관계라면 단순 선형회귀 R²은 낮게 나올 수 있음</span></li>
</ul>
</li>
</ul>
</li>
<li><span style='font-size: 20px;'>가끔 음수가 나올 수도 있음 → 모델이 오히려 평균보다 못함</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>계산</span>
<img src="https://velog.velcdn.com/images/soo_32/post/46aedab4-ee9c-425d-81e6-7a3138794ad5/image.png" alt=""><ul>
<li><span style='font-size: 20px;'>모델의 오차가 데이터의 총 변동에 비해 얼마나 작은가</span></li>
</ul>
</li>
</ul>
<h3 id="수정된-r²-adjusted-r²">수정된 R² (Adjusted R²)</h3>
<ul>
<li><span style='font-size: 20px;'>변수가 많아질수록 R²는 무조건 증가</span><ul>
<li><span style='font-size: 20px;'>쓸데없는 변수 넣어도 R²는 커짐</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'><strong>수정된 R² : 불필요한 변수가 들어가면 패널티 → 진짜 설명력만 반영</strong></span></li>
<li><span style='font-size: 20px;'>계산</span>
<img src="https://velog.velcdn.com/images/soo_32/post/6cde00eb-5e7b-4f96-9f51-52a92a8f1327/image.png" alt=""></li>
</ul>
<h3 id="회귀계수">회귀계수</h3>
<ul>
<li><span style='font-size: 20px;'>독립변수가 종속변수에 주는 영향력의 크기와 방향을 나타내는 값</span><ul>
<li><span style='font-size: 20px;'>얼마나(크기) 영향을 주는지</span></li>
<li><span style='font-size: 20px;'>어느 방향(+) 또는 (-)으로 영향을 주는지</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>다중 회귀에서는 “다른 변수들을 통제한 조건에서의 효과” → 인과처럼 해석하면 위험</span></li>
</ul>
<h3 id="회귀모형-전체에-대한-검정-f-검정">회귀모형 전체에 대한 검정 (F-검정)</h3>
<ul>
<li><span style='font-size: 20px;'>귀무가설(H₀) : β₁ = β₂ = … = βk = 0</span><ul>
<li><span style='font-size: 20px;'>즉, 모델 자체가 의미 없다. (X들이 Y를 전혀 설명 못한다)</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>대립가설(H₁) : 적어도 하나의 계수는 0이 아니다</span><ul>
<li><span style='font-size: 20px;'>즉, 모델이 Y를 어느 정도 설명한다.</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>검정 방법 : F-통계량</span><ul>
<li><span style='font-size: 20px;'>F값이 크고, p-value &lt; 유의수준 → 모델이 전체적으로 유의</span></li>
</ul>
</li>
</ul>
<h3 id="개별-회귀계수에-대한-검정-t-검정">개별 회귀계수에 대한 검정 (t-검정)</h3>
<ul>
<li><span style='font-size: 20px;'>각 독립변수 Xj가 종속변수 Y에 영향을 주는지 확인</span><ul>
<li><span style='font-size: 20px;'>귀무가설(H₀) : βj = 0</span></li>
<li><span style='font-size: 20px;'>대립가설(H₁) : βj != 0</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>검정 방법 : t-통계량</span><ul>
<li><span style='font-size: 20px;'>(추정량 - 가설값) / 표준오차</span></li>
<li><span style='font-size: 20px;'>t값이 크고 p-value &lt; α → 해당 변수는 Y에 유의한 영향</span></li>
</ul>
</li>
</ul>
<h3 id="단순-선형-회귀">단순 선형 회귀</h3>
<pre><code class="language-python">import statsmodels.api as sm

X = df[&quot;weight&quot;]
y = df[&quot;mpg&quot;]
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()
print(model.summary())</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_32/post/90837539-8372-4dd5-a076-cf258da69571/image.png" alt=""></p>
<p><span style='font-size: 20px;'>R-squared = 0.693</span></p>
<ul>
<li><span style='font-size: 20px;'>차량 무게(weight) 하나만으로 연비(mpg) 변동의 약 69.2%를 설명할 수 있음</span></li>
<li><span style='font-size: 20px;'>단일 독립변수치고는 상당히 높은 설명력</span></li>
</ul>
<p><span style='font-size: 20px;'>F-statistic (878.8, p &lt; 0.000)</span></p>
<ul>
<li><span style='font-size: 20px;'>p-value &lt; α → 모델이 통계적으로 유의함</span></li>
</ul>
<p><span style='font-size: 20px;'>회귀계수</span></p>
<ul>
<li><span style='font-size: 20px;'>const(절편) = 46.2165</span><ul>
<li><span style='font-size: 20px;'>이론적으로 차량 무게가 0일 때 예상 연비는 약 46.2 mpg</span></li>
<li><span style='font-size: 20px;'>실제 의미는 없고 기준선 역할</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>weight = -0.0076</span><ul>
<li><span style='font-size: 20px;'>차량 무게가 1 파운드 늘어날 때마다 연비는 평균적으로 0.0076 mpg 감소</span></li>
</ul>
</li>
</ul>
<p><span style='font-size: 20px;'>통계적 유의성</span></p>
<ul>
<li><span style='font-size: 20px;'>weight의 p-value = 0.000</span><ul>
<li><span style='font-size: 20px;'>p-value &lt; α → 무게가 연비에 유의미한 영향을 준다고 볼 수 있음</span></li>
</ul>
</li>
</ul>
<p><span style='font-size: 20px;'>신뢰구간</span></p>
<ul>
<li><span style='font-size: 20px;'>weight의 95% 신뢰구간: [-0.008, -0.007]</span></li>
<li><span style='font-size: 20px;'>계수가 음수임이 확실하다 : 무게 증가 → 연비 감소</span></li>
</ul>
<pre><code class="language-python">fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
sns.regplot(x=&quot;weight&quot;, y=&quot;mpg&quot;, data=df, scatter_kws={&quot;alpha&quot;:0.3, &quot;color&quot;:&quot;#7FFFD4&quot;}, color=&quot;#4169E1&quot;)
ax.set_title(&quot;weight &amp; mpg&quot;, color=&#39;w&#39;)
ax.set_xlabel(&quot;weight&quot;, color=&#39;w&#39;)
ax.set_ylabel(&quot;mpg&quot;, color=&#39;w&#39;)
ax.tick_params(colors=&#39;w&#39;)
ax.spines[&#39;bottom&#39;].set_color(&#39;w&#39;)
ax.spines[&#39;left&#39;].set_color(&#39;w&#39;)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_32/post/8e1456a3-0586-46bf-b61c-602a4a77dcb7/image.png" alt=""></p>
<h3 id="다중-회귀">다중 회귀</h3>
<pre><code class="language-python">X = df[[&quot;weight&quot;, &quot;displacement&quot;, &quot;cylinders&quot;]]
y = df[&quot;mpg&quot;]
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()
print(model.summary())</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_32/post/0b7babda-6ada-4b1a-8578-4139b1112f73/image.png" alt=""></p>
<p><span style='font-size: 20px;'>R-squared = 0.699, Adj. R-squared = 0.697</span>     </p>
<ul>
<li><span style='font-size: 20px;'>세 변수를 함께 쓰면 연비 변동의 약 69.8%를 설명</span></li>
<li><span style='font-size: 20px;'>이전 단순회귀(weight만)와 비교하면 Adj. R-squared = 0.692 → 0.697로 거의 차이가 없음</span></li>
<li><span style='font-size: 20px;'>추가 변수들이 설명력 개선에 별로 기여하지 못했음</span></li>
</ul>
<p><span style='font-size: 20px;'>F-statistic (300.8, p &lt; 0.000)</span></p>
<ul>
<li><span style='font-size: 20px;'>p-value &lt; α → 모델이 통계적으로 유의함</span></li>
</ul>
<p><span style='font-size: 20px;'>회귀계수 &amp; 유의성</span>     </p>
<ul>
<li><span style='font-size: 20px;'>weight = -0.0057 (p = 0.000)</span><ul>
<li><span style='font-size: 20px;'>무게가 1 파운드 증가할 때 연비가 약 0.0058 mpg 감소 (유의미)</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>displacement = -0.0127 (p = 0.125)</span><ul>
<li><span style='font-size: 20px;'>p-value &gt; α → 연비에 유의한 영향 못 줌</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>cylinders = -0.2678 (p = 0.517)</span><ul>
<li><span style='font-size: 20px;'>p-value &gt; α → 연비에 유의한 영향 못 줌</span></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 코드카타_03]]></title>
            <link>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8003</link>
            <guid>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8003</guid>
            <pubDate>Tue, 30 Sep 2025 10:48:44 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style='font-size: 35px;'><strong>SQL 코드카타_Weather Observation Station 20</strong></span></p>
</blockquote>
<h2 id="weather-observation-station-20">Weather Observation Station 20</h2>
<h3 id="문제--weather-observation-station-20">문제 : <a href="https://www.hackerrank.com/challenges/weather-observation-station-20/problem?isFullScreen=true">Weather Observation Station 20</a></h3>
<p><span style='font-size: 20px;'># 목적, 목표 : 북위도 ( LAT_N ) 의 중앙값, 소수점 4자리에서 반올림 적용</span>
<span style='font-size: 20px;'># 필요한 컬럼 : LAT_N</span>
<span style='font-size: 20px;'># 컬럼 조건 : ROW_NUMBER, COUNT, AVG</span>
<span style='font-size: 20px;'># 사용할 테이블 : STATION</span>
<span style='font-size: 20px;'># join key : 없음</span>
<span style='font-size: 20px;'># 테이블 조건 : ROW_NUMBER = 중앙</span>
<span style='font-size: 20px;'># 필요한 그룹 : 없음</span>
<span style='font-size: 20px;'># 필요한 그룹 조건 : 없음</span>
<span style='font-size: 20px;'># 정렬 기준 : 없음</span>
<span style='background-color: #FAFAD2; font-size: 20px;'># 주의사항 : 중앙값 = 데이터 개수가 홀수일 때, 짝수일 때 구하는 방법이 다름</span></p>
<ul>
<li><span style='font-size: 20px;'>홀수일 때, 데이터 정렬해서 n/2 위치에 있는 값</span></li>
<li><span style='font-size: 20px;'>짝수일 때, 데이터 정렬해서 n/2, n/2+1 위치에 있는 값들의 평균</span></li>
</ul>
<h3 id="내가-짠-쿼리">내가 짠 쿼리</h3>
<pre><code class="language-sql">WITH A AS (  # ROW_NUMBER 매기기
SELECT LAT_N, ROW_NUMBER() OVER(order by LAT_N) AS ROW_NUMBER
FROM STATION),
B AS (  # 행 개수 구하기
SELECT COUNT(*) AS cnt
FROM STATION),
C AS (  # 홀수일 때
SELECT ROUND(LAT_N, 4) as ans1
FROM A
WHERE ROW_NUMBER = ROUND((SELECT cnt FROM B)/2, 0)),
D AS (  # 짝수일 때
SELECT ROUND(AVG(LAT_N), 4) as ans2
FROM A
WHERE ROW_NUMBER in ((SELECT cnt FROM B)/2, (SELECT cnt FROM B)/2 + 1)

SELECT CASE WHEN (SELECT cnt FROM B) %2 != 0 THEN (SELECT ans1 FROM C)  # 홀수면 C에서 가져옴
        ELSE (SELECT ans2 FROM D) END AS answer  # 짝수면 D에서 가져옴
FROM STATION</code></pre>
<h3 id="-문제-">[ 문제 ]</h3>
<ul>
<li><span style='font-size: 20px;'>코드가 너무 길어짐</span></li>
</ul>
<h3 id="어려웠던-점">[어려웠던 점]</h3>
<ul>
<li><span style='font-size: 20px;'>홀수일 때, 짝수일 때 중앙값 계산 방법이 달라서 로직 구상에 어려움이 있었음</span></li>
<li><span style='font-size: 20px;'>with 구문으로 각각의 테이블을 생성한 후, case when 구문으로 홀수일 때, 짝수일 때의 조건문으로 로직을 구성함</span></li>
</ul>
<h3 id="chat-gpt-쿼리-로직-">[Chat GPT 쿼리 로직 ]</h3>
<ul>
<li><span style='font-size: 20px;'>ROW_NUMBER 매기기</span></li>
<li><span style='font-size: 20px;'>행 개수 구하기</span></li>
<li><span style='font-size: 20px;'>중앙값 구하기 및 소수점 4자리에서 반올림 적용</span><ul>
<li><span style='font-size: 20px;'>AVG, FLOOR, CEIL 활용</span><ul>
<li><span style='font-size: 20px;'>홀수일 때 : FLOOR((7+1)/2) = 4, CEIL((7+1)/2) = 4</span><ul>
<li><span style='font-size: 20px;'>중앙값 = 4번째 위치 값의 평균</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>짝수일 때 : FLOOR((6+1)/2) = 3, CEIL((6+1)/2) = 4</span><ul>
<li><span style='font-size: 20px;'>중앙값 = 3, 4번째 값의 평균</span></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">WITH A AS (
SELECT LAT_N, ROW_NUMBER() OVER (ORDER BY LAT_N) AS rn
FROM STATION),
B AS (
SELECT COUNT(*) AS cnt
FROM STATION)

SELECT ROUND(AVG(LAT_N), 4) AS median
FROM A, B
WHERE rn IN (FLOOR((cnt + 1) / 2), CEIL((cnt + 1) / 2));</code></pre>
<h3 id="코드-뜯어보기">[코드 뜯어보기]</h3>
<pre><code class="language-sql"># A 테이블 : ROW_NUMBER 매기기
WITH A AS (
SELECT LAT_N, ROW_NUMBER() OVER (ORDER BY LAT_N) AS rn
FROM STATION),</code></pre>
<pre><code class="language-sql"># B 테이블 : 행 개수 구하기
B AS (
SELECT COUNT(*) AS cnt
FROM STATION)</code></pre>
<pre><code class="language-sql"># 중앙값 구하기 및 소수점 4자리에서 반올림
SELECT ROUND(AVG(LAT_N), 4) AS median
FROM A, B
WHERE rn IN (FLOOR((cnt + 1) / 2), CEIL((cnt + 1) / 2));</code></pre>
<h3 id="새로-알게된-점">[새로 알게된 점]</h3>
<ul>
<li><span style='font-size: 20px;'>FLOOR와 CEIL을 활용하여 같은 실수값에 대해 +1의 범위를 생성할 수 있음을 알게 됨</span><ul>
<li><span style='font-size: 20px;'>FLOOR : 주어진 숫자보다 작거나 같은 가장 큰 정수를 반환</span><ul>
<li><span style='font-size: 20px;'>FLOOR(3.1) = 3</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>CEIL : 주어진 숫자보다 크거나 같은 가장 작은 정수를 반환</span><ul>
<li><span style='font-size: 20px;'>CEIL(3.1) = 4</span></li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[통계 뿌시기 - 라이브세션 4]]></title>
            <link>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%84%B8%EC%85%98-4</link>
            <guid>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%84%B8%EC%85%98-4</guid>
            <pubDate>Mon, 29 Sep 2025 23:55:18 GMT</pubDate>
            <description><![CDATA[<p>계정이 저주받아 무슨 수를 써도 전체공개로 전환이 안되어서... ૮₍´›̥̥̥ ᜊ ‹̥̥̥ `₎ა
<img src="https://velog.velcdn.com/images/soo_32/post/bc81c036-50ff-4b49-8eae-41061296a786/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 코드카타_02]]></title>
            <link>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8002</link>
            <guid>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8002</guid>
            <pubDate>Mon, 29 Sep 2025 13:55:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style='font-size: 35px;'><strong>SQL 코드카타_Symmetric Pairs</strong></span></p>
</blockquote>
<h2 id="sql-코드카타_symmetric-pairs">SQL 코드카타_Symmetric Pairs</h2>
<h3 id="문제--symmetric-pairs">문제 : <a href="https://www.hackerrank.com/challenges/symmetric-pairs/problem?isFullScreen=true">Symmetric Pairs</a></h3>
<p><span style='background-color: #FAFAD2; font-size: 20px;'># 목적, 목표 : 모든 대칭 쌍을 오름차순으로 출력</span>
<span style='font-size: 20px;'># 필요한 컬럼 : X , Y</span>
<span style='font-size: 20px;'># 컬럼 조건 : 없음</span>
<span style='font-size: 20px;'># 사용할 테이블 : Functions</span>
<span style='font-size: 20px;'># join key : 없음</span>
<span style='background-color: #FAFAD2; font-size: 20px;'># 테이블 조건 : 두 쌍 (X1 , Y1 )과 (X2 , Y2 )는 X1 = Y2 이고 X2 = Y1 일 때 대칭 쌍, X1 ≤ Y1 </span>
<span style='font-size: 20px;'># 필요한 그룹 : 없음</span>
<span style='font-size: 20px;'># 필요한 그룹 조건 : 없음</span>
<span style='background-color: #FAFAD2; font-size: 20px;'># 정렬 기준 : X 기준 오름차순</span>
<span style='font-size: 20px;'># 주의사항 : 결과 값은 중복 제거</span></p>
<h3 id="로직">로직</h3>
<ul>
<li><span style='font-size: 20px;'>X = Y 제외한 대칭 쌍 추출</span><ul>
<li><span style='font-size: 20px;'>X = Y가 아닌 경우 → X != Y</span></li>
<li><span style='font-size: 20px;'>대칭 쌍 → (X, Y) = (Y, X)</span></li>
<li><span style='font-size: 20px;'>X1 ≤ Y1 필터링 조건 → X1 ≤ Y1</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>X = Y인 대칭 쌍 추출</span><ul>
<li><span style='font-size: 20px;'>X = Y인 개수가 2개 이상이어야 함</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>두 테이블 결합 및 X 기준 정렬</span></li>
</ul>
<pre><code class="language-sql">WITH A AS (
SELECT X, Y
FROM Functions
WHERE (X, Y) in (SELECT Y, X FROM Functions) and X != Y and X &lt;= Y),
B AS (
SELECT X, Y
FROM Functions
WHERE X = Y
GROUP BY X
HAVING count(X) &gt; 1)

SELECT X, Y
FROM A
UNION
SELECT X, Y
FROM B
ORDER BY X</code></pre>
<h3 id="쿼리-뜯어보기">[쿼리 뜯어보기]</h3>
<pre><code class="language-sql"># A 테이블 : X = Y 제외한 대칭 쌍 추출
WITH A AS (
SELECT X, Y
FROM Functions
WHERE (X, Y) in (SELECT Y, X FROM Functions) and X != Y and X &lt;= Y),</code></pre>
<pre><code class="language-sql"># B 테이블 : X = Y인 대칭 쌍 추출
B AS (
SELECT X, Y
FROM Functions
WHERE X = Y
GROUP BY X
HAVING count(X) &gt; 1)</code></pre>
<pre><code class="language-sql"># A와 B 결합 및 X 기준 오름차순 정렬
SELECT X, Y
FROM A
UNION
SELECT X, Y
FROM B
ORDER BY X</code></pre>
<h3 id="어려웠던-점">[어려웠던 점]</h3>
<ul>
<li><span style='font-size: 20px;'>로직을 구성하는 데에 어려움이 있었음</span><ul>
<li><span style='font-size: 20px;'>LAG를 사용해서 이전 &quot;X = Y의 이전 행(LAG(Y)) and Y = X의 이전 행(LAG(X))&quot;을 생각했음</span></li>
<li><span style='font-size: 20px;'>수많은 시도 끝에.. 대칭 쌍이란 단순히 (X, Y) = (Y, X) 임을 깨닫게 됨</span></li>
</ul>
</li>
</ul>
<h3 id="새로-알게된-점">[새로 알게된 점]</h3>
<ul>
<li><span style='font-size: 20px;'>대칭 쌍이란 (X, Y) = (Y, X)</span></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 코드카타_01]]></title>
            <link>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8001</link>
            <guid>https://velog.io/@soo_32/SQL-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%8001</guid>
            <pubDate>Tue, 23 Sep 2025 08:22:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style='font-size: 35px;'><strong>SQL 코드카타_SQL Project Planning</strong></span></p>
</blockquote>
<h2 id="sql-project-planning">SQL Project Planning</h2>
<p><span style='font-size: 20px;'><strong>문제 : **</span><span style='font-size: 20px;'></strong><a href="https://www.hackerrank.com/challenges/sql-projects/problem?isFullScreen=true">SQL Project Planning</a>**</span></p>
<p><span style='background-color: #FAFAD2; font-size: 20px;'># 목적, 목표 : 프로젝트 완료 기간 기준 오름차순으로 시작일과 종료일 출력</span>
<span style='font-size: 20px;'># 필요한 컬럼 : Start_Date, End_Date</span>
<span style='background-color: #FAFAD2; font-size: 20px;'># 컬럼 조건 : 이전 행과 비교 (LAG)</span>
<span style='font-size: 20px;'># 사용할 테이블 : Projects</span>
<span style='font-size: 20px;'># join key : 없음</span>
<span style='background-color: #FAFAD2; font-size: 20px;'># 테이블 조건 : 시작일 = 이전 행의 종료일 → 동일한 프로젝트, 시작일 != 이전 행의 종료일 → 개별 프로젝트</span>
<span style='font-size: 20px;'># 필요한 그룹 : 없음</span>
<span style='font-size: 20px;'># 필요한 그룹 조건 : 없음</span>
<span style='font-size: 20px;'># 정렬 기준 : 프로젝트 완료 기간 기준 오름차순, 시작일을 기준 오름차순</span>
<span style='background-color: #FAFAD2; font-size: 20px;'># 주의사항 : 동일한 프로젝트라면, 시작일 = 첫 작업의 시작일, 종료일 = 끝 작업의 종료일이어야 함
</span></p>
<p><span style='font-size: 20px;'><strong>로직</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>Start_Date와 이전 행의 End_Date를 비교</span><ul>
<li><span style='font-size: 20px;'>이전 행의 End_Date를 LAG_End로 칭함</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>개별 프로젝트만 추출</span><ul>
<li><span style='font-size: 20px;'>Start_Date != LAG_End 이거나 LAG_End가 null인 경우</span></li>
<li><span style='font-size: 20px;'>동일한 프로젝트의 시작일과 종료일 사이의 기간을 제거하기 위함</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>동일 프로젝트 종료일 끌어오기</span><ul>
<li><span style='font-size: 20px;'>LEAD(LAG_End)로 끌어오기</span></li>
<li><span style='font-size: 20px;'>LEAD(LAG_End)를 LEAD_End로 칭함</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>동일 프로젝트 종료일 알맞게 배치하기</span><ul>
<li><span style='font-size: 20px;'>LEAD_End가 null이면 End_Date를 끌어오고 다른 경우는 LEAD_End를 끌어오기</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>프로젝트 기간 산정하기</span><ul>
<li><span style='font-size: 20px;'>DATEDIFF(End_Date, Start_Date)+1, Days로 칭함</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>프로젝트 기간 및 시작일 기준으로 정렬하기</span><ul>
<li><span style='font-size: 20px;'>ORDER BY Days, Start_Date</span></li>
</ul>
</li>
</ul>
<blockquote>
<pre><code class="language-sql">WITH A as(
SELECT Start_Date, LAG(End_Date) OVER (ORDER BY Start_Date) AS LAG_End, End_Date
FROM Projects),
B as (
SELECT Start_Date, LAG_End, End_Date
FROM A
WHERE Start_Date != LAG_End OR LAG_End is null),
C as (
SELECT Start_Date, LAG_End, End_Date, LEAD(LAG_End) OVER (ORDER BY Start_Date) AS LEAD_End
FROM B),
D as (
SELECT Start_Date, 
    CASE WHEN LEAD_End is null THEN End_Date
        ELSE LEAD_End END AS End_Date
FROM C),
E as (
SELECT Start_Date, End_Date, DATEDIFF(End_Date, Start_Date)+1 AS Days
FROM D)
SELECT Start_Date, End_Date
FROM E
ORDER BY Days, Start_Date</code></pre>
</blockquote>
<pre><code>

&lt;span style=&#39;font-size: 20px;&#39;&gt;**[ 쿼리 뜯어보기 ]**&lt;/span&gt;

```sql
# A 테이블 : Start_Date와 이전 행의 End_Date를 비교하기 위해 LAG_End 컬럼 생성
WITH A as(
SELECT Start_Date, LAG(End_Date) OVER (ORDER BY Start_Date) AS LAG_End, End_Date
FROM basic.Projects),</code></pre><pre><code class="language-sql"># B 테이블 : 개별 프로젝트만 추출
B as (
SELECT Start_Date, LAG_End, End_Date
FROM A
WHERE Start_Date != LAG_End OR LAG_End is null),</code></pre>
<pre><code class="language-sql"># C 테이블 : 동일 프로젝트 종료일을 알맞게 배치하기 위해 LEAD_End 컬럼 생성
C as (
SELECT Start_Date, LAG_End, End_Date, LEAD(LAG_End) OVER (ORDER BY Start_Date) AS LEAD_End
FROM B),</code></pre>
<pre><code class="language-sql"># D 테이블 : 동일 프로젝트 종료일을 알맞게 배치하기
D as (
SELECT Start_Date, 
    CASE WHEN LEAD_End is null THEN End_Date
        ELSE LEAD_End END AS End_Date
FROM C),</code></pre>
<pre><code class="language-sql"># E 테이블 : 프로젝트 기간 산정하기
E as (
SELECT Start_Date, End_Date, DATEDIFF(End_Date, Start_Date)+1 AS Days
FROM D)</code></pre>
<pre><code class="language-sql"># 프로젝트 기간, 시작일 기준 오름차순 정렬하기
SELECT Start_Date, End_Date
FROM E
ORDER BY Days, Start_Date</code></pre>
<p><span style='font-size: 20px;'><strong>[ 어려웠던 점 ]</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>로직을 구성하는 데에 어려움이 있었음</span></li>
<li><span style='font-size: 20px;'>노트에 데이터를 하나하나 적고 머리를 굴리며 한참을 생각했다...</span></li>
</ul>
<p><span style='font-size: 20px;'><strong>[ 새로 알게된 점 ]</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>서로 다른 행의 종료일과 시작일이 같을 때, 이를 연속된 기간으로 두고 시작일과 종료일을 맞추는 방법을 알게됨</span></li>
<li><span style='font-size: 20px;'>이전 종료일을 끌어와서 시작일과 같은 경우 제거하고 남은 데이터들의 이전 종료일을 다시 종료일로 끌어오면 짜잔 ! 되더라</span></li>
<li><span style='font-size: 20px;'>노가다로 알아내느라 힘들었지만.. 그래도 뿌듯</span></li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>SQL 코드카타_SQL Placements</strong></span></p>
</blockquote>
<h2 id="placements">Placements</h2>
<p><span style='font-size: 20px;'><strong>문제 : **</span><span style='font-size: 20px;'></strong><a href="https://www.hackerrank.com/challenges/placements/problem?isFullScreen=true">Placements</a>**</span></p>
<p><span style='background-color: #FAFAD2; font-size: 20px;'># 목적, 목표 : 가장 친한 친구가 자신보다 더 높은 급여를 제안받은 학생들의 이름을 출력</span>
<span style='font-size: 20px;'># 필요한 컬럼 : ID, Friend_ID, Salary, Name</span>
<span style='background-color: #FAFAD2; font-size: 20px;'># 컬럼 조건 : </span>
<span style='font-size: 20px;'># 사용할 테이블 : Packages, Friends, Salary</span>
<span style='font-size: 20px;'># join key : ID, Friend_ID</span>
<span style='background-color: #FAFAD2; font-size: 20px;'># 테이블 조건 : 가장 친한 친구가 자신보다 더 높은 급여</span>
<span style='font-size: 20px;'># 필요한 그룹 : 없음</span>
<span style='font-size: 20px;'># 필요한 그룹 조건 : 없음</span>
<span style='font-size: 20px;'># 정렬 기준 : 가장 친한 친구에게 제안된 급여를 기준으로 정렬</span></p>
<p><span style='font-size: 20px;'><strong>로직</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>ID, Friend_ID 기준으로 Packages와 Friends JOIN</span></li>
<li><span style='font-size: 20px;'>가장 친한 친구가 자신보다 더 높은 급여를 제안받은 ID만 추출</span><ul>
<li><span style='font-size: 20px;'>Friend_ID 기준 Salary &gt; ID 기준 Salary만 추출</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>ID 기준으로 Name JOIN하여 Name 추출</span></li>
<li><span style='font-size: 20px;'>급여 기준으로 오름차순 정렬</span><ul>
<li><span style='font-size: 20px;'>ORDER BY a.Salary</span></li>
</ul>
</li>
</ul>
<pre><code class="language-sql">WITH A AS (
SELECT f1.ID, p2.Salary
FROM Packages p1 inner join Friends f1 on p1.ID = f1.ID inner join Packages p2 on f1.Friend_ID = p2.ID
WHERE p2.Salary &gt; p1.Salary)

SELECT s.Name
FROM A a inner join Students s on a.ID = s.ID
ORDER BY a.Salary</code></pre>
<p><span style='font-size: 20px;'><strong>[ 쿼리 뜯어보기 ]</strong></span></p>
<pre><code class="language-sql"># A 테이블 : 가장 친한 친구가 자신보다 더 높은 급여를 제안받은 ID만 추출
WITH A AS (
SELECT f1.ID, p2.Salary
FROM Packages p1 inner join Friends f1 on p1.ID = f1.ID inner join Packages p2 on f1.Friend_ID = p2.ID
WHERE p2.Salary &gt; p1.Salary)</code></pre>
<pre><code class="language-sql"># Name 추출 및 급여 오름차순으로 정렬
SELECT s.Name
FROM A a inner join Students s on a.ID = s.ID
ORDER BY a.Salary</code></pre>
<p><span style='font-size: 20px;'><strong>[ 어려웠던 점 ]</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>로직을 구성하는 데에 어려움이 있었음</span></li>
<li><span style='font-size: 20px;'>FROM Friends f1 inner join Packages p1 on f1.ID = p1.ID inner join Friends f2 on p1.ID = f2.Friend_ID로 함</span><ul>
<li><span style='font-size: 20px;'>JOIN한 Packages 테이블은 1개라서 WHERE 절에서 ID와 Friend_ID별 Salary 비교 불가 </span></li>
</ul>
</li>
</ul>
<p><span style='font-size: 20px;'><strong>[ 새로 알게된 점 ]</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>Packages 테이블을 별칭을 달리하여 2번 JOIN시킴으로써 WHERE절에서 p2.Salary &gt; p1.Salary로 조건 비교 가능해짐</span></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[통계 뿌시기 - 라이브세션3]]></title>
            <link>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%84%B8%EC%85%983</link>
            <guid>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%84%B8%EC%85%983</guid>
            <pubDate>Mon, 22 Sep 2025 14:42:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 결과 ⊂ 사건 ⊂ 표본공간 &quot;</strong></span></p>
</blockquote>
<h2 id="결과outcome-결과값">결과(Outcome, 결과값)</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>한 번의 시행에서 실제로 관측되는 값</span></li>
<li><span style='font-size: 20px;'>ex) 주사위를 던져서 3이 나온 것</span></li>
</ul>
<h2 id="사건-event">사건 (Event)</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>결과들의 집합</span></li>
<li><span style='font-size: 20px;'>사건은 결과 여러 개를 묶어서 정의할 수 있고, <strong>우리가 확률을 구하고 싶은 대상</strong></span></li>
<li><span style='font-size: 20px;'>ex) 주사위를 던져서 홀수가 나오는 사건 = {1,3,5}</span></li>
</ul>
<h2 id="표본공간-sample-space-ω">표본공간 (Sample Space, Ω)</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>가능한 모든 결과들의 집합</span></li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>사건은 항상 표본공간의 부분집합</span></li>
<li><span style='font-size: 20px;'>주사위 던지기 → Ω = {1,2,3,4,5,6}</span></li>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>표본공간을 잘못 설정하면 결과가 왜곡됨</span><ul>
<li><span style='font-size: 20px;'>조건부확률, 독립성, 추론 등 전부 틀어짐</span></li>
<li><span style='font-size: 20px;'>ex) 구매고객만 포함하면 미구매 고객은 무시됨</span></li>
</ul>
</li>
</ul>
<p><span style='font-size: 20px;'><strong>관계 정리</strong></span></p>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>결과 ⊂ 사건 ⊂ 표본공간</strong></span></li>
<li><span style='font-size: 20px;'>결과 : 표본공간 속의 하나의 원소</span></li>
<li><span style='font-size: 20px;'>사건 : 표본공간의 부분집합</span></li>
<li><span style='font-size: 20px;'>표본공간 : 가능한 모든 결과들의 전체 집합</span></li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 확률 &quot;</strong></span></p>
</blockquote>
<h2 id="확률">확률</h2>
<ul>
<li><span style='font-size: 20px;'>어떤 사건이 일어날 가능성을 수치로 나타낸 것</span></li>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>미래의 불확실성을 수치로 표현한 것</strong></span></li>
<li><span style='font-size: 20px;'>값의 범위 : 0 ~ 1</span><ul>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>확률 0  : 가능성 없음이 아니라, 일어날 가능성이 매우 희박한 것</span></li>
<li><span style='font-size: 20px;'>확률 0  : 너무 희박해서 특정 값 하나로 잡히지 않음</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>데이터 분석가에겐 전략 제안을 위한 근거로서 필요</span></li>
</ul>
<p><span style='font-size: 20px;'><strong>계산</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>확률은 원하는 사건의 경우의 수 ÷ 전체 경우의 수로 계산할 수 있음</span></li>
</ul>
<p><span style='font-size: 20px;'><strong>특징</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>항상 0 ≤ P ≤ 1</span></li>
<li><span style='font-size: 20px;'>전체 사건의 합은 1</span></li>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>확률이 클수록 그 사건이 일어날 가능성이 높음</span></li>
</ul>
<h2 id="확률변수">확률변수</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>사건을 숫자로 표현한 변수</strong></span><ul>
<li><span style='font-size: 20px;'>수학적으로 다루기 편리</span></li>
</ul>
</li>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>실현값(Realization)</span><ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>확률변수의 실제 관측된 값</span></li>
<li><span style='font-size: 20px;'>ex) X = { 빨강, 흰색 }</span><ul>
<li><span style='font-size: 20px;'>확률변수 X를 “빨강=1, 흰색=0”으로 정의</span></li>
<li><span style='font-size: 20px;'>P(X=1) = 0.8, P(X=0) = 0.2</span><ul>
<li><span style='font-size: 20px;'>확률변수 X = 1,0 (구슬의 색을 숫자로 정의한 것)</span></li>
<li><span style='font-size: 20px;'>실현값 = 실제로 뽑힌 색 (빨강, 흰색)</span></li>
<li><span style='font-size: 20px;'>확률 값 = 사건이 일어날 가능성을 나타내는 수치 (0.8, 0.2)</span></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><span style='font-size: 20px;'><strong>유형</strong></span></p>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>이산형 확률변수(Discrete)</span><ul>
<li><span style='font-size: 20px;'>값이 뚝뚝 끊겨 있음, 세어지는 값</span><ul>
<li><span style='font-size: 20px;'>ex) 주사위 눈 (1~6), 동전 (앞=1, 뒤=0), 하루 방문자 수 등</span></li>
</ul>
</li>
</ul>
</li>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>연속형 확률변수(Discrete)</span><ul>
<li><span style='font-size: 20px;'>값이 무한히 이어짐, 줄자로 재는 값</span><ul>
<li><span style='font-size: 20px;'>ex) 키(161.1cm), 몸무게 (48.5kg) 등</span></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="확률분포">확률분포</h2>
<ul>
<li><span style='font-size: 20px;'>확률변수가 어떤 값을 얼마나 자주 가지는지</span><ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>확률변수가 어떻게 퍼져 있는지</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>확률변수 X와 확률 P(X)의 매칭</span></li>
<li><span style='font-size: 20px;'>이산형 확률분포</span><ul>
<li><span style='font-size: 20px;'>값이 뚝뚝 끊겨 있음, 막대 그래프</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>연속형 확률분포</span><ul>
<li><span style='font-size: 20px;'>값이 무한히 이어짐, 곡선(PDF, 확률밀도함수)+면적(곡선 아래 면적 = 확률)</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>분포를 통해 데이터의 특징, 안정성, 이상치 판단 가능</span></li>
</ul>
<p><span style='font-size: 20px;'><strong>실무 사례</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>품질 관리 : 부품 길이 평균 10cm, 분산이 작음 → 공정 안정</span></li>
<li><span style='font-size: 20px;'>서비스 운영 : 고객 체류시간 평균 5분, 꼬리가 길음 → 일부는 오래 머무름</span></li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 기댓값 &quot;</strong></span></p>
</blockquote>
<h2 id="기댓값">기댓값</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>확률분포에 따라 장기적으로 기대되는 평균값</strong></span><ul>
<li><span style='font-size: 20px;'>확률변수의 평균적인 값</span></li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>오랫동안 반복했을 때 수렴하는 값</span></li>
<li><span style='font-size: 20px;'>단기 불확실성은 따로 고려 필요 : 분산, 표준편차로 보완</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>계산방법 : 확률변수가 가질 수 있는 값에 확률을 곱함</span><ul>
<li><span style='font-size: 20px;'>이산형 확률변수의 기댓값</span><img src="https://velog.velcdn.com/images/soo_32/post/26df70e4-29b3-4b50-882d-3b5bef2b4a20/image.png" alt=""></li>
<li><span style='font-size: 20px;'>연속형 확률변수의 기댓값</span><img src="https://velog.velcdn.com/images/soo_32/post/cdc22cc5-b92a-4313-80c5-78ece967ef3c/image.png" alt=""></li>
</ul>
</li>
<li><span style='font-size: 20px;'>기댓값 ≠ 실제로 항상 나오는 값</span></li>
<li><span style='font-size: 20px;'>기댓값 ≠ 미래를 정확히 예언</span></li>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>기댓값 = 많은 시도(큰 수의 법칙)의 평균</span></li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 조건부 확률 &quot;</strong></span></p>
</blockquote>
<h2 id="조건부-확률">조건부 확률</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>P(A|B) = 어떤 사건 B가 일어났다는 조건 하에서 사건 A가 일어날 확률</span>
<span style='font-size: 20px;'>ex) 비가 올 때, 우산을 쓸 확률 등</span></li>
<li><span style='font-size: 20px;'>계산식</span><img src="https://velog.velcdn.com/images/soo_32/post/d9fc091e-ba76-4656-a6af-c9dbe10af223/image.png" alt=""></li>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>조건 하나로 확률이 달라짐</span><ul>
<li><span style='font-size: 20px;'>조건 없음 → 우산을 쓸 확률 = 30%</span></li>
<li><span style='font-size: 20px;'>조건 : 비 오는 날 → 우산을 쓸 확률 = 90%</span></li>
</ul>
</li>
</ul>
<h2 id="독립">독립</h2>
<ul>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>독립 사건은 조건이 있어도 확률이 변하지 않음</span><ul>
<li><span style='font-size: 20px;'>독립 = 한 사건이 일어난 것이 다른 사건에 영향을 주지 않는 것</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>계산식</span><img src="https://velog.velcdn.com/images/soo_32/post/a7c42f82-aabf-4805-8c42-e5622cc7aecb/image.png" alt=""><img src="https://velog.velcdn.com/images/soo_32/post/d562cb21-e606-4f3d-920c-cf797fd1b420/image.png" alt=""></li>
</ul>
<p><span style='font-size: 20px;'><strong>실무 사례</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>조건부 확률 : 30대 여성 고객이 쿠폰을 클릭할 확률 등</span></li>
<li><span style='font-size: 20px;'>독립 : 이번주 로또 당첨 확률은 지난주 결과와 무관</span></li>
</ul>
<h2 id="정말-독립인가">&quot;정말 독립인가?&quot;</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>데이터 분석가는 &quot;정말 독립인가?&quot;를 항상 확인해야 함</strong></span></li>
<li><span style='font-size: 20px;'>독립 여부에 따라 분석/검정 방법이 달라짐</span></li>
<li><span style='font-size: 20px;'>독립이 기본 전제이지만, 환경이 바뀌면 쉽게 깨질 수 있음</span></li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>독립이라는 가정 하에 분석했으나 독립이 아니라면? 결과가 왜곡되기 때문</span></li>
</ul>
<p><span style='font-size: 20px;'><strong>사례</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>가위바위보 : 완전 무작위라면, 내가 뭘 내든 무관하게 상대가 뭘 낼 확률은 1/3 → 독립</span><ul>
<li><span style='font-size: 20px;'>만약 항상 첫 판은 가위를 내는 습관이 있다면? 조건 생성, 독립 깨짐</span></li>
</ul>
</li>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>현실 데이터는 대부분 독립이 아님</strong></span></li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 이론적 확률분포 &quot;</strong></span></p>
</blockquote>
<h2 id="이론적-확률분포">이론적 확률분포</h2>
<ul>
<li><span style='font-size: 20px;'>실험이나 관찰을 기반으로 하지 않고, </span><span style='background-color: #FAFAD2; font-size: 20px;'>수학적 모델이나 규칙을 이용해 정의된 확률분포</span><ul>
<li><span style='font-size: 20px;'>즉, “이런 확률이 나올 것이다”라는 수학적 가정을 기반으로 만든 분포</span></li>
</ul>
</li>
</ul>
<p><span style='font-size: 20px;'><strong>종류</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>데이터 성격에 따라 분포 달라짐</span></li>
<li><span style='font-size: 20px;'>이산형 분포</span><ul>
<li><span style='font-size: 20px;'>베르누이 분포: 성공/실패(0/1) 확률</span></li>
<li><span style='font-size: 20px;'>이항분포: 여러 번의 베르누이 시행에서 성공 횟수</span></li>
<li><span style='font-size: 20px;'>포아송 분포: 단위 시간/공간 내 사건 발생 횟수</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>연속형 분포</span><ul>
<li><span style='font-size: 20px;'>정규분포: 평균 근처에 값이 몰림, 종 모양</span></li>
<li><span style='font-size: 20px;'>균등분포: 모든 값이 균등하게 나올 확률</span></li>
<li><span style='font-size: 20px;'>지수분포: 사건 간 간격 모델링</span></li>
</ul>
</li>
</ul>
<p><span style='font-size: 20px;'><strong>특징</strong></span></p>
<ul>
<li><span style='background-color: #CFE4FE; font-size: 20px;'><strong>모양을 결정하는 숫자(파라미터, parameter) 존재</strong></span><ul>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>정규분포 → 평균 μ, 표준편차 σ</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>수학적으로 정의되어 있음 → 공식으로 확률 계산 가능</span></li>
<li><span style='font-size: 20px;'>데이터 분석·통계 검정·시뮬레이션에서 활용</span></li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 정규분포 &quot;</strong></span></p>
</blockquote>
<h2 id="정규분포">정규분포</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>통계에서 가장 중요한 분포</span><ul>
<li><span style='font-size: 20px;'>세상의 많은 데이터가 정규분포로 근사 가능하기 때문</span></li>
</ul>
</li>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>평균과 표준편차로 모양이 정해짐</span><ul>
<li><span style='font-size: 20px;'>평균 : μ → 종 모양의 가운데 위치</span></li>
<li><span style='font-size: 20px;'>표준편차 : δ → 종 모양의 너비(흩어짐)</span></li>
</ul>
</li>
</ul>
<p><span style='font-size: 20px;'><strong>역할</strong></span></p>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>실제 데이터를 표현</strong>하는 데 쓰임</span></li>
<li><span style='font-size: 20px;'>데이터가 어떻게 퍼져 있는지(흩어짐, 중심 위치)를 직관적으로 이해 가능</span></li>
</ul>
<p><span style='font-size: 20px;'><strong>서로 다른 스케일의 데이터를 정규분포에서 비교 시</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>ex) 남녀 키 분포에서 각 키를 비교</span><ul>
<li><span style='font-size: 20px;'>x축이 실제 키 cm</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'><strong>장점</strong></span><ul>
<li><span style='background-color: #CFE4FE; font-size: 20px;'><strong>실제 값이 분포에서 어디에 위치</strong>하는지 직관적으로 확인 가능</span></li>
<li><span style='font-size: 20px;'>ex) 180cm 남성은 평균보다 약간 큰 키라는 걸 바로 알 수 있음</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'><strong>단점</strong></span><ul>
<li><span style='font-size: 20px;'>남성과 여성의 평균, 표준편차가 달라서 </span><span style='background-color: #FFDAB9; font-size: 20px;'><strong>“어느 쪽이 더 극단적인 값인지” 비교가 직관적이지 않음</strong></span></li>
</ul>
</li>
</ul>
<h2 id="표준정규분포">표준정규분포</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>평균이 0, 표준편차가 1인 정규분포</span></li>
<li><span style='font-size: 20px;'>단위가 사라짐 → <strong>상대적 위치</strong>만 남음</span></li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>단위가 달라도, 분포가 달라도 비교 가능</span></li>
</ul>
<p><span style='font-size: 20px;'><strong>역할</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>서로 다른 정규분포 간 비교 가능</span><ul>
<li><span style='font-size: 20px;'>ex) 수학 점수와 국어 점수 비교</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>확률 계산이 쉬워짐</span></li>
</ul>
<p><span style='font-size: 20px;'><strong>서로 다른 스케일의 데이터를 표준정규분포에서 비교 시</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>ex) 남녀 키 분포에서 각 키를 비교</span><ul>
<li><span style='font-size: 20px;'>x축이 z = (x - 평균) / 표준편차</span></li>
<li><span style='font-size: 20px;'>평균이 0, 표준편차가 1로 표준화됨</span></li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>각 값이 평균으로부터 몇 표준편차 떨어져 있는지 확인 가능</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'><strong>장점</strong></span><ul>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>서로 다른 분포를 비교할 수 있음</span><ul>
<li><span style='font-size: 20px;'>ex) 남자 180cm → z ≈ (180-175)/7 ≈ 0.71, 여자 161cm → z ≈ (161-162)/6 ≈ -0.17</span></li>
<li><span style='font-size: 20px;'>남성 180cm는 남성 평균보다 약간 높고, 여성 161cm는 여성 평균보다 거의 평균 수준임</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>극단값 판정, 백분위 비교, 확률 계산 등에 바로 활용 가능</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'><strong>단점</strong></span><ul>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>실제 단위(cm) 정보가 사라져 직관성이 떨어질 수 있음</span></li>
</ul>
</li>
</ul>
<pre><code class="language-python">import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# 모집단 평균과 표준편차 가정 (예시)
mean_m, std_m = 175, 7  # 남성 평균, 표준편차
mean_f, std_f = 162, 6  # 여성 평균, 표준편차

# 키값 예시
heights_m = [180]
heights_f = [161]

# x축 범위
x_m = np.linspace(mean_m - 4*std_m, mean_m + 4*std_m, 500)
x_f = np.linspace(mean_f - 4*std_f, mean_f + 4*std_f, 500)

# 정규분포 확률밀도
pdf_m = norm.pdf(x_m, mean_m, std_m)
pdf_f = norm.pdf(x_f, mean_f, std_f)

# 시각화
fig=plt.figure(figsize=(12,8), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
plt.plot(x_m, pdf_m, label=&quot;남성 분포&quot;, color=&#39;skyblue&#39;)
plt.plot(x_f, pdf_f, label=&quot;여성 분포&quot;, color=&#39;pink&#39;)

# z-score 계산 및 표시
for h in heights_m:
    z = (h - mean_m) / std_m
    plt.scatter(h, norm.pdf(h, mean_m, std_m), color=&#39;purple&#39;)
    plt.text(h, norm.pdf(h, mean_m, std_m)+0.002, f&#39;{h}cm\n(z={z:.2f})&#39;, ha=&#39;center&#39;, color=&#39;w&#39;)

for h in heights_f:
    z = (h - mean_f) / std_f
    plt.scatter(h, norm.pdf(h, mean_f, std_f), color=&#39;cyan&#39;)
    plt.text(h, norm.pdf(h, mean_f, std_f)+0.002, f&#39;{h}cm\n(z={z:.2f})&#39;, ha=&#39;center&#39;, color=&#39;w&#39;)

ax.set_title(&#39;남성과 여성 키 분포와 z값 비교&#39;, color=&#39;w&#39;)
ax.set_xlabel(&#39;키 (cm)&#39;, color=&#39;w&#39;)
ax.set_ylabel(&#39;확률밀도&#39;, color=&#39;w&#39;)
plt.legend()
ax.tick_params(colors=&#39;w&#39;)
ax.spines[&#39;bottom&#39;].set_color(&#39;w&#39;)
ax.spines[&#39;left&#39;].set_color(&#39;w&#39;)
plt.gca().set_axisbelow(True)
plt.grid(axis=&#39;x&#39;, alpha=0.3, color=&#39;lightgray&#39;)
plt.show()

# --- 표준정규분포 ---
# z = (x - mean) / std
z_m = (x_m - mean_m) / std_m
z_f = (x_f - mean_f) / std_f

fig=plt.figure(figsize=(12,8), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
plt.plot(z_m, pdf_m, label=&quot;남성 표준정규분포&quot;, color=&#39;skyblue&#39;)
plt.plot(z_f, pdf_f, label=&quot;여성 표준정규분포&quot;, color=&#39;pink&#39;)

# z-score 표시
for h in heights_m:
    z = (h - mean_m) / std_m
    plt.scatter(z, norm.pdf(h, mean_m, std_m), color=&#39;pink&#39;)
    plt.text(z, norm.pdf(h, mean_m, std_m)+0.002, f&#39;{h}cm\n(z={z:.2f})&#39;, ha=&#39;center&#39;, color=&#39;w&#39;)

for h in heights_f:
    z = (h - mean_f) / std_f
    plt.scatter(z, norm.pdf(h, mean_f, std_f), color=&#39;cyan&#39;)
    plt.text(z, norm.pdf(h, mean_f, std_f)+0.002, f&#39;{h}cm\n(z={z:.2f})&#39;, ha=&#39;center&#39;, color=&#39;w&#39;)

ax.set_title(&#39;남성과 여성 키 표준정규분포와 z값 비교&#39;, color=&#39;w&#39;)
ax.set_xlabel(&#39;z-score&#39;, color=&#39;w&#39;)
ax.set_ylabel(&#39;확률밀도&#39;, color=&#39;w&#39;)
plt.legend()
ax.tick_params(colors=&#39;w&#39;)
ax.spines[&#39;bottom&#39;].set_color(&#39;w&#39;)
ax.spines[&#39;left&#39;].set_color(&#39;w&#39;)
plt.gca().set_axisbelow(True)
plt.grid(axis=&#39;x&#39;, alpha=0.3, color=&#39;lightgray&#39;)
plt.show()</code></pre>
<table align="center">
  <tr>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/124409d4-50dc-4478-8fe4-6b9fbe5e0057/image.png"></td>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/94eda778-e2fa-407e-b525-4eea723a9b41/image.png"></td>
  </tr>
</table>

<h2 id="정규화-normalization">정규화 (Normalization)</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>데이터의 <strong>최솟값과 최댓값을 이용해 0~1 범위로</strong> 스케일 조정</span></li>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>핵심 : <strong>&quot;범위를 맞춘다&quot;</strong></span></li>
<li><span style='font-size: 20px;'>목적 : <span style='background-color: #CFE4FE; font-size: 20px;'>단위가 다른 데이터</span>를 같은 스케일에서 <span style='background-color: #CFE4FE; font-size: 20px;'>비교하기 위함</span>
<img src="https://velog.velcdn.com/images/soo_32/post/f2b276b6-5e86-4481-b573-34d2b7d98ecd/image.png" alt=""></li>
</ul>
<p><span style='font-size: 20px;'><strong>특징</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>변환 후 값의 범위 : 0 ~ 1</span></li>
<li><span style='font-size: 20px;'>데이터의 분포 모양은 변하지 않음</span></li>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>이상치에 민감</span><span style='font-size: 20px;'> → 한 개의 극단값 때문에 전체 스케일이 왜곡될 수 있음</span></li>
<li><span style='font-size: 20px;'>단위가 달라도 비교 가능 (cm vs 원 vs km)</span></li>
</ul>
<h2 id="표준화-standardization">표준화 (Standardization)</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>데이터의 평균을 0, 표준편차를 1로 변환</span></li>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>핵심 : <strong>&quot;분포를 바꾼다&quot;</strong></span></li>
<li><span style='font-size: 20px;'>목적: 단위 차이를 없애고, </span><span style='background-color: #CFE4FE; font-size: 20px;'><strong>상대적 위치(몇 σ만큼 떨어져 있는지)</strong>를 해석하기 위함</span></li>
<li><span style='font-size: 20px;'>Z-점수(Z-score)</span><ul>
<li><span style='font-size: 20px;'>분포를 표준정규분포로 환산할 수 있음</span>
<img src="https://velog.velcdn.com/images/soo_32/post/06d8b4fe-70dd-48b1-8e66-91786ea9cd2c/image.png" alt=""></li>
</ul>
</li>
<li><span style='font-size: 20px;'>ex) 시험 점수가 90점일 때, 평균 70점, 표준편차 10점이면</span><ul>
<li><span style='font-size: 20px;'>z = (90 - 70) / 10 = 2</span></li>
<li><span style='font-size: 20px;'>“평균보다 2표준편차 높은 점수”라는 의미</span></li>
<li><span style='font-size: 20px;'>상대적 지표, 절대적 우열은 아님</span></li>
</ul>
</li>
</ul>
<p><span style='font-size: 20px;'><strong>특징</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>변환 후 데이터의 평균 = 0, 표준편차 = 1</span></li>
<li><span style='font-size: 20px;'>데이터의 단위를 없애고, 상대적 위치를 표현</span></li>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>이상치에 덜 민감</span></li>
<li><span style='font-size: 20px;'>표준정규분포 기반 해석(68-95-99.7 법칙 적용 가능)</span></li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 68-95-99.7 법칙 &quot;</strong></span></p>
</blockquote>
<h2 id="68-95-997-법칙">68-95-99.7 법칙</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>정규분포</strong>에서 평균(μ)과 표준편차(σ)를 기준으로, 데이터가 평균을 기준으로 얼마나 퍼져 있는지를 나타내는 경험적 규칙</span></li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>특정 값이 <strong>흔한지 드문지</strong> 빠르게 판단하는 기준</span></li>
<li><span style='font-size: 20px;'>정규분포 : x&#39;의 절대값이 클수록 더 드문 값</span><ul>
<li><span style='font-size: 20px;'>평균 ± 1σ ≈ 68%
: 68%의 데이터가 평균 ± 1σ 범위에 존재</span></li>
<li><span style='font-size: 20px;'>평균 ± 2σ ≈ 95%</span></li>
<li><span style='font-size: 20px;'>평균 ± 3σ ≈ 99.7%</span></li>
<li><span style='font-size: 20px;'>ex) 평균=100, 표준편차=15인 정규분포에서 70~130점의 비율은?</span><ul>
<li><span style='font-size: 20px;'>70=100-2x15, 130=100+2x15 → 약 95%(±2σ)</span></li>
</ul>
</li>
</ul>
</li>
<li><span style='font-size: 20px;'>표준정규분포 : z의 절대값이 클수록 더 드문 값</span><ul>
<li><span style='font-size: 20px;'>± 1 ≈ 68%
: 68%의 데이터가 ± 1 범위에 존재</span></li>
<li><span style='font-size: 20px;'>± 2 ≈ 95%</span></li>
<li><span style='font-size: 20px;'>± 3 ≈ 99.7%</span></li>
</ul>
</li>
</ul>
<pre><code class="language-python">import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# 일반 정규분포 평균과 표준편차
mu, sigma = 175, 7

# x 범위
x = np.linspace(mu - 4*sigma, mu + 4*sigma, 1000)

# 정규분포 pdf
pdf = norm.pdf(x, mu, sigma)

fig=plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
plt.plot(x, pdf, color=&#39;w&#39;, label=&#39;남성 키 분포&#39;)

# 영역 색칠: ±1σ, ±2σ, ±3σ
colors = [&#39;#7FFFD4&#39;, &#39;#87CEFA&#39;, &#39;#00BFFF&#39;]

# 68-95-99.7 범위 색칠
plt.fill_between(x, pdf, 0, where=(x &gt; mu - sigma) &amp; (x &lt; mu + sigma), color=colors[0], alpha=0.7, label=&#39;68% 영역&#39;)
plt.fill_between(x, pdf, 0, where=(x &gt; mu - 2*sigma) &amp; (x &lt; mu + 2*sigma), color=colors[1], alpha=0.5, label=&#39;95% 영역&#39;)
plt.fill_between(x, pdf, 0, where=(x &gt; mu - 3*sigma) &amp; (x &lt; mu + 3*sigma), color=colors[2], alpha=0.3, label=&#39;99.7% 영역&#39;)

ax.set_title(&#39;남성 키 분포와 68-95-99.7 법칙&#39;, color=&#39;w&#39;)
ax.set_xlabel(&#39;키 (cm)&#39;, color=&#39;w&#39;)
ax.set_ylabel(&#39;확률밀도&#39;, color=&#39;w&#39;)
plt.legend()
ax.tick_params(colors=&#39;w&#39;)
ax.spines[&#39;bottom&#39;].set_color(&#39;w&#39;)
ax.spines[&#39;left&#39;].set_color(&#39;w&#39;)
plt.gca().set_axisbelow(True)
plt.grid(axis=&#39;x&#39;, alpha=0.3, color=&#39;lightgray&#39;)
plt.show()

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import scipy.stats as stats

# 한글 폰트 설정 (Mac용)
plt.rcParams[&#39;font.family&#39;] = &#39;AppleGothic&#39;

# 마이너스 기호 깨짐 방지
mpl.rcParams[&#39;axes.unicode_minus&#39;] = False

# 표준정규분포 정의 (평균=0, 표준편차=1)
x = np.linspace(-4, 4, 1000)
y = stats.norm.pdf(x, 0, 1)

# 그래프 그리기
fig=plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
plt.plot(x, y, color=&#39;w&#39;)

# 영역 색칠: ±1σ, ±2σ, ±3σ
colors = [&#39;#7FFFD4&#39;, &#39;#87CEFA&#39;, &#39;#00BFFF&#39;]

# ±1σ 영역
plt.fill_between(x, y, where=(x &gt;= -1) &amp; (x &lt;= 1),
                 color=colors[0], alpha=0.7, label=&#39;±1σ ≈ 68%&#39;)
# ±2σ 영역
plt.fill_between(x, y, where=(x &gt;= -2) &amp; (x &lt;= 2),
                 color=colors[1], alpha=0.5, label=&#39;±2σ ≈ 95%&#39;)
# ±3σ 영역
plt.fill_between(x, y, where=(x &gt;= -3) &amp; (x &lt;= 3),
                 color=colors[2], alpha=0.3, label=&#39;±3σ ≈ 99.7%&#39;)

# 그래프 꾸미기
ax.set_title(&#39;표준정규분포와 68-95-99.7 법칙&#39;, color=&#39;w&#39;)
ax.set_xlabel(&#39;z 값 (표준화 점수)&#39;, color=&#39;w&#39;)
ax.set_ylabel(&#39;확률밀도&#39;, color=&#39;w&#39;)
plt.legend()
ax.tick_params(colors=&#39;w&#39;)
ax.spines[&#39;bottom&#39;].set_color(&#39;w&#39;)
ax.spines[&#39;left&#39;].set_color(&#39;w&#39;)
plt.gca().set_axisbelow(True)
plt.grid(axis=&#39;x&#39;, alpha=0.3, color=&#39;lightgray&#39;)
plt.show()</code></pre>
<table align="center">
  <tr>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/f665109a-6118-4ee2-8b71-3b37397667fa/image.png"></td>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/93bc7056-b52e-4273-9119-0a022dfc55f4/image.png"></td>
  </tr>
</table>

<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 정규 근사,  정규 경계 &quot;</strong></span></p>
</blockquote>
<h2 id="정규-근사">정규 근사</h2>
<ul>
<li><span style='font-size: 20px;'>키, 몸무게 : 유전, 환경, 영양 등 작은 요인들이 합쳐져 평균 근처에 몰림</span></li>
<li><span style='font-size: 20px;'>시험 점수(대규모) : 여러 요인이 겹쳐 평균 중심으로 몰림, 양극단은 드묾</span></li>
<li><span style='font-size: 20px;'>측정 오차 : 수많은 작은 오차가 더해져 평균값 근처에 모임 → 이런 데이터는 정규 가정을 해도 큰 문제 없음</span></li>
</ul>
<h2 id="정규-경계">정규 경계</h2>
<ul>
<li><span style='font-size: 20px;'>소득, 매출 : 대부분 적고 소수만 매우 큼 → 오른쪽 꼬리 긴 분포 (로그정규, 파레토)</span></li>
<li><span style='font-size: 20px;'>주식 수익률, 트래픽 : 가끔 발생하는 극단적 큰 변동 → heavy-tail 분포</span></li>
<li><span style='font-size: 20px;'>이탈률, 성공/실패 : 결과가 0 / 1 → 이항분포</span></li>
</ul>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 예언구간, 신뢰구간 &quot;</strong></span></p>
</blockquote>
<h2 id="예언구간예측구간prediction-interval-pi">예언구간(예측구간)(Prediction Interval, PI)</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>새로운 단일 관측값 또는 미래 데이터가 들어올 범위</span><ul>
<li><span style='font-size: 20px;'>범위를 넓히면 적중률 ↑, 의미 ↓</span></li>
</ul>
</li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>개별 값의 불확실성</span></li>
</ul>
<p><span style='font-size: 20px;'><strong>특징</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>데이터의 변동성을 포함</span><ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>평균 추정 불확실성 + 데이터 개별 관측값의 변동성 포함</span></li>
</ul>
</li>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>폭이 항상 신뢰구간보다 넓음</span><ul>
<li><span style='font-size: 20px;'>개별 관측값은 평균 주변에서 더 넓게 퍼질 수 있으므로</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>신뢰수준 적용 가능</span><ul>
<li><span style='font-size: 20px;'>ex) 95% PI = “새로 뽑은 데이터가 95% 확률로 이 구간 안에 들어간다”</span></li>
</ul>
</li>
</ul>
<p><span style='font-size: 20px;'><strong>계산</strong></span>
<img src="https://velog.velcdn.com/images/soo_32/post/ca8858cb-728c-4258-8782-01e66fe397a7/image.png" alt=""></p>
<ul>
<li><span style='font-size: 20px;'>√(1+1/n) 때문에 CI보다 항상 폭이 넓음</span></li>
<li><span style='font-size: 20px;'>모집단 δ를 아는 경우에는 s대신 δ를 사용</span><ul>
<li><span style='font-size: 20px;'>다만, 현실에서는 δ를 모를 때가 많아 표본 기반으로 구함</span></li>
</ul>
</li>
</ul>
<h2 id="신뢰구간confidence-interval-ci">신뢰구간(Confidence Interval, CI)</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>모집단의 평균(μ) 또는 모수(parameter) <strong>즉, 우리가 알고 싶은 것을 추정하기 위한 구간</strong></span><ul>
<li><span style='font-size: 20px;'>표본을 하나만 뽑으면 모평균을 정확히 알 수 없으므로, 추정값 주변에 범위를 만든 것</span></li>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>정확성을 높이기 위해 구간으로 추정</span></li>
</ul>
</li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>평균 추정의 불확실성</span></li>
</ul>
<p><span style='font-size: 20px;'><strong>특징</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>모평균을 포함하는 범위</span><ul>
<li><span style='font-size: 20px;'>신뢰구간은 개별 데이터가 아니라 모평균(μ)에 대한 불확실성을 표현</span></li>
</ul>
</li>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>표본 크기(n)가 커질수록 좁아짐</span><ul>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>좁아짐 = 추정이 정밀해짐</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>신뢰수준(Confidence Level, 1-α)</span><ul>
<li><span style='font-size: 20px;'>95% CI = <span style='background-color: #FAFAD2; font-size: 20px;'>“같은 방식으로 표본을 여러 번 뽑으면 95%의 신뢰구간이 실제 모평균을 포함한다&quot;</span></li>
</ul>
</li>
</ul>
<p><span style='font-size: 20px;'>*<em>계산
*</em></span><img src="https://velog.velcdn.com/images/soo_32/post/236e38e5-e3fd-4ad1-ab89-18efc5010152/image.png" alt=""></p>
<ul>
<li><span style='font-size: 20px;'>표본 평균 ± 표준오차(SE) × 신뢰계수(z 또는 t)</span></li>
</ul>
<p><span style='font-size: 20px;'>*<em>예시
*</em></span></p>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>하한 단측</strong></span><ul>
<li><span style='font-size: 20px;'>상황 : 배터리 제조사가 &quot;최소 500시간 이상 작동&quot;을 보장하려 함</span></li>
<li><span style='font-size: 20px;'>10개 배터리 테스트 결과 : 502, 495, 510, 508, 497, 505, 498, 512, 503, 499시간</span></li>
<li><span style='font-size: 20px;'>평균 수명 : 502.9시간, 표준편차 : 5.8시간</span></li>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>95% 하한 신뢰구간: [498.6시간, +∞]</strong></span><ul>
<li><span style='font-size: 20px;'>&quot;95% 신뢰수준으로 평균 배터리 수명이 최소 498.6시간 이상이지만, 500시간을 보장하기는 어려움&quot;</span></li>
</ul>
</li>
</ul>
</li>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>상한 단측</strong></span><ul>
<li><span style='font-size: 20px;'>상황 : 품질관리팀이 &quot;불량률이 최대 5% 이하&quot;임을 확인하려 함</span></li>
<li><span style='font-size: 20px;'>10회 검사에서 100개당 불량 개수 : 3, 2, 4, 3, 5, 2, 3, 4, 2, 3개</span></li>
<li><span style='font-size: 20px;'>평균 불량률 : 3.1%, 표준편차 : 0.99%</span></li>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>95% 상한 신뢰구간: [-∞, 3.7%]</strong></span><ul>
<li><span style='font-size: 20px;'>&quot;95%의 신뢰수준으로 평균 불량률이 최대 3.7% 이하이므로, 5% 품질 기준을 충족함&quot;</span></li>
</ul>
</li>
</ul>
</li>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>양측 검정</strong></span><ul>
<li><span style='font-size: 20px;'>상황 : 신약이 혈압을 평균적으로 얼마나 낮추는지 확인</span></li>
<li><span style='font-size: 20px;'>30명 환자의 혈압 감소량 측정</span></li>
<li><span style='font-size: 20px;'>평균 감소 : 12.5 mmHg, 표준오차 : 2.3 mmHg</span></li>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>95% 양측 신뢰구간: [7.8, 17.2] mmHg</strong></span><ul>
<li><span style='font-size: 20px;'>&quot;95% 신뢰수준으로 이 약은 평균적으로 7.8~17.2 mmHg 혈압을 낮춤&quot;</span></li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code class="language-python">def coverage_experiment(series, n=25, reps=400, alpha=0.05, seed=7):
    # n = 표본 크기(개수)
    # reps = 실험을 몇번 반복할지?
    # alpha = 유의수준 (0.5면 95% 신뢰구간)
    rng = np.random.default_rng(seed) # PCG64 라는 알고리즘을 쓰는 난수 생성기, 최근 더 안정적이고 빠르다고 인정받는 최신 알고리즘
    mu_true = series.mean()
    intervals = []
    hits = 0
    for i in range(reps):
        idx = rng.integers(0, len(series), size=n)
        smp = series.to_numpy()[idx]
        lo, hi, *_ = ci_for_mean_t(smp, alpha=alpha)
        intervals.append((lo, hi))
        hits += int(lo &lt;= mu_true &lt;= hi)
    return mu_true, intervals, hits / reps

mu_true, intervals, cov = coverage_experiment(df[&quot;target&quot;], n=25, reps=400, alpha=0.05, seed=11)
fig = plt.figure(figsize=(12,8), facecolor=&#39;k&#39;)
ax = fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
k = 40
for i, (lo_i, hi_i) in enumerate(intervals[:k]):
    if lo_i &lt;= mu_true &lt;= hi_i:
        color = &#39;skyblue&#39;  # 포함되는 경우 파란색
    else:
        color = &#39;#CD5C5C&#39;           # 포함되지 않는 경우 빨간색
    plt.plot([lo_i, hi_i], [i, i], marker=&quot;|&quot;, color=color, markersize=10)

plt.axvline(mu_true, linestyle=&quot;--&quot;, color=&#39;lightgreen&#39;, alpha=0.7)
ax.set_title(f&quot;Coverage experiment (first {k} CIs), estimated coverage≈{cov:.3f}&quot;, color=&#39;w&#39;)
ax.set_xlabel(&#39;target&#39;, color=&#39;w&#39;)
ax.set_ylabel(&#39;sample index&#39;, color=&#39;w&#39;)
ax.tick_params(colors=&#39;w&#39;)
ax.spines[&#39;bottom&#39;].set_color(&#39;w&#39;)
ax.spines[&#39;left&#39;].set_color(&#39;w&#39;)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_32/post/7fba6152-80e8-4631-bdce-304474ff9cbd/image.png" alt=""></p>
<p><span style='background-color: #FAFAD2; font-size: 25px;'><strong>표본의 무작위성, 대표성, 독립성이 보장되지 않으면 추정은 왜곡된다</strong></span></p>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 표본오차, 표준오차 &quot;</strong></span></p>
</blockquote>
<h2 id="표본오차sampling-error">표본오차(Sampling Error)</h2>
<ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'>표본 통계량과 모집단 모수 사이의 차이</span></li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>자연스러운 현상</span><ul>
<li><span style='font-size: 20px;'>모집단 전체를 조사할 수 없어서 무작위로 표본을 추출하여 조사함</span></li>
<li><span style='font-size: 20px;'>뽑힌 사람/데이터가 매번 다르기 때문에 통계량도 매번 달라짐</span></li>
</ul>
</li>
</ul>
<h2 id="큰-수의-법칙">큰 수의 법칙</h2>
<ul>
<li><span style='font-size: 20px;'>표본의 크기가 커질수록 표본평균은 모집단 평균에 수렴</span><ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>표본의 크기가 커질수록 표본오차는 줄어들음</strong></span></li>
</ul>
</li>
</ul>
<h2 id="표준오차standard-error-se">표준오차(Standard Error, SE)</h2>
<ul>
<li><span style='font-size: 20px;'>표본 평균들의 모평균에 대한 변동성(표준편차)</span></li>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>통계량의 불확실성</strong>을 나타냄</span></li>
</ul>
<p><span style='font-size: 20px;'><strong>계산</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>SE = s√n</span><ul>
<li><span style='background-color: #FAFAD2; font-size: 20px;'><strong>표본의 크기가 커질수록 표준오차는 줄어들음</strong></span></li>
</ul>
</li>
</ul>
<p><span style='font-size: 25px;'><strong>표본이 크면 표본오차는 줄고, 표준오차는 작아지고, 신뢰구간이 좁아짐</strong></span></p>
<pre><code class="language-python">def avg_ci_width_vs_n(series, ns=(10, 20, 30, 50, 100, 200), reps=300, seed=2024):
    rng = np.random.default_rng(seed)
    widths = []
    for n in ns:
        ws = []
        for _ in range(reps):
            idx = rng.integers(0, len(series), size=n) # 0부터 len(series)-1까지 정수 중에서 n개를 복원 추출 -&gt; 즉 series에서 n개의 임의 표본을 뽑음
            smp = series.to_numpy()[idx]
            lo, hi, *_ = ci_for_mean_t(smp)
            ws.append(hi - lo)
        widths.append(np.mean(ws))
    return np.array(ns), np.array(widths)

ns, widths = avg_ci_width_vs_n(df[&quot;target&quot;], ns=(10, 20, 30, 50, 100, 200), reps=200)


fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax = fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
plt.plot(ns, widths, marker=&quot;o&quot;, color=&#39;#7FFFD4&#39;, markerfacecolor=&#39;#87CEFA&#39;)
ax.set_title(&quot;CI width vs n (real data resampling)&quot;, color=&#39;w&#39;)
ax.set_xlabel(&#39;sample size n&#39;, color=&#39;w&#39;)
ax.set_ylabel(&#39;Average 95% CI width&#39;, color=&#39;w&#39;)
ax.tick_params(colors=&#39;w&#39;)
ax.spines[&#39;bottom&#39;].set_color(&#39;w&#39;)
ax.spines[&#39;left&#39;].set_color(&#39;w&#39;)
plt.gca().set_axisbelow(True)
plt.grid(axis=&#39;y&#39;, color = &#39;lightgray&#39;, linewidth = 0.3)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_32/post/e4e136d1-7268-4e7c-8bf0-f92bdf545b76/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[통계 뿌시기 - 라이브세션2]]></title>
            <link>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%84%B8%EC%85%982</link>
            <guid>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%84%B8%EC%85%982</guid>
            <pubDate>Fri, 19 Sep 2025 18:39:16 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 대푯값 &quot;</strong></span></p>
</blockquote>
<h2 id="대푯값">대푯값</h2>
<ul>
<li><span style='font-size: 20px;'>데이터의 중심이나 전형적인 값을 나타내는 수치</span></li>
<li><span style='background-color: #FFFACD; font-size: 20px;'>데이터 전체를 하나의 값으로 요약하여 분포의 중심을 파악하는 데 사용</span></li>
<li><span style='font-size: 20px;'>대표적 : <strong>평균, 중앙값, 최빈값</strong></span></li>
</ul>
<h3 id="평균-mean">평균 (Mean)</h3>
<ul>
<li><span style='font-size: 20px;'>모든 데이터를 합한 후, 데이터 개수로 나눈 값</span></li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>지렛대의 균형점, 데이터의 <strong>중심 위치</strong> 알려줌</span></li>
<li><span style='font-size: 20px;'>장점</span><ul>
<li><span style='font-size: 20px;'>계산이 쉽고 대부분 통계 분석에서 기본 값으로 사용</span></li>
<li><span style='font-size: 20px;'>다른 통계 수치(분산, 표준편차) 계산에 활용 가능</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>단점</span><ul>
<li><span style='background-color: #FFDAB9; font-size: 20px;'><strong>극단값(Outlier)에 민감</strong> → 평균이 왜곡될 수 있음</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>예시</span><ul>
<li><span style='font-size: 20px;'>데이터 : 2, 3, 4, 5, 100</span></li>
<li><span style='font-size: 20px;'>평균 = (2+3+4+5+100) / 5 = 22.8 → 극단값 100 때문에 대표성을 잃음</span></li>
</ul>
</li>
</ul>
<h3 id="중앙값-median">중앙값 (Median)</h3>
<ul>
<li><span style='font-size: 20px;'>데이터를 크기 순서대로 </span><span style='background-color: #CFE4FE; font-size: 20px;'>정렬했을 때 <strong>가운데 위치</strong>한 값</span></li>
<li><span style='font-size: 20px;'><strong>짝수 개</strong>일 경우 : <strong>가운데 두 값의 평균</strong>을 중앙값으로 사용</span></li>
<li><span style='font-size: 20px;'>장점</span><ul>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>극단값이나 비대칭 분포에 <strong>영향을 받지 않음 → 대표성이 안정적</strong></span><ul>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>평균의 왜곡을 막고 <strong>일반적인 수준</strong>을 잘 보여줌</span></li>
</ul>
</li>
</ul>
</li>
<li><span style='font-size: 20px;'>단점</span><ul>
<li><span style='font-size: 20px;'>데이터 <strong>전체의 변동이나 분포를 반영하지 않음</strong></span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>예시</span><ul>
<li><span style='font-size: 20px;'>데이터 : 2, 3, 4, 5, 100</span></li>
<li><span style='font-size: 20px;'>정렬 후 가운데 값 = 4 → 극단값 영향 없음</span></li>
</ul>
</li>
</ul>
<h3 id="최빈값-mode">최빈값 (Mode)</h3>
<ul>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>데이터에서 가장 <strong>많이</strong> 나타나는 값</span></li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>실제 <strong>행동/선호</strong>를 보여줌,</span><span style='font-size: 20px;'> 소비자 선호 분석에 특히 유용</span></li>
<li><span style='font-size: 20px;'>장점</span><ul>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>범주형 데이터에서 중심 경향 파악에 유용</span></li>
<li><span style='font-size: 20px;'>빈도 분석과 결합 가능</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>단점</span><ul>
<li><span style='font-size: 20px;'>데이터가 고르게 분포되어 있으면 </span><span style='background-color: #CFE4FE; font-size: 20px;'>최빈값이 없거나 여러 개일 수 있음</span></li>
</ul>
</li>
</ul>
<p><span style='background-color: #FFFACD; font-size: 25px;'><strong>어떤 대푯값을 보느냐에 따라 해석이 달라진다</strong></span></p>
<p><span style='font-size: 20px;'><strong>사례</strong></span>
<span style='font-size: 20px;'>평균 = 30만원, 중앙값 = 5만원, 최빈값 = 9,900원일 때, 각 대푯값 활용 방안</span></p>
<ul>
<li><span style='font-size: 20px;'>평균 : VIP 관리, 평균 이상인 고객들 대상으로 관리 등</span></li>
<li><span style='font-size: 20px;'>중앙값 : 가격대별 프로모션, 일반적인 수준을 파악하여 활용 등</span></li>
<li><span style='font-size: 20px;'>최빈값 : 일반 고객 전략, 소비자 선호 분석해서 활용</span></li>
</ul>
<p><span style='background-color: #FFFACD; font-size: 25px;'><strong>왜곡을 없애려면 평균 + 중앙값 + 최빈값 세트로 봐야 함</strong></span></p>
<p><span style='font-size: 20px;'>보고서에는 평균, 중앙값, 최빈값 모두 명시해야 함</span></p>
<pre><code class="language-python">df[&#39;height_cm&#39;].mean()  # 평균
df[&#39;height_cm&#39;].median()  # 중앙값
df[&#39;height_cm&#39;].mode()  # 최빈값

# 데이터 로드 (CSV 파일 경로 수정 필요)
df = pd.read_excel(&quot;Online Retail.xlsx&quot;)  # UCI 데이터는 xlsx 형식

# 결측치/이상치 제거
df = df.dropna(subset=[&quot;CustomerID&quot;])
df = df[df[&quot;Quantity&quot;] &gt; 0]
df[&quot;Sales&quot;] = df[&quot;Quantity&quot;] * df[&quot;UnitPrice&quot;]

# 고객별 결제 금액 집계
customer_sales = df.groupby(&quot;CustomerID&quot;)[&quot;Sales&quot;].sum()

# 대표값 계산
mean_val = customer_sales.mean()
median_val = customer_sales.median()
mode_val = customer_sales.mode().iloc[0]
std_val = customer_sales.std()

print(f&quot;평균: {mean_val:.2f}&quot;)
print(f&quot;중앙값: {median_val:.2f}&quot;)
print(f&quot;최빈값: {mode_val:.2f}&quot;)
print(f&quot;표준편차: {std_val:.2f}&quot;)

# 히스토그램 (로그 스케일)
fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
plt.hist(customer_sales, bins=50, color=&quot;#7FFFD4&quot;)
plt.xscale(&quot;log&quot;)
plt.axvline(mean_val, color=&quot;#8A2BE2&quot;, linestyle=&quot;--&quot;, label=f&quot;Mean={mean_val:.0f}&quot;)
plt.axvline(median_val, color=&quot;#FFD700&quot;, linestyle=&quot;:&quot;, label=f&quot;Median={median_val:.0f}&quot;)
plt.axvline(mode_val, color=&quot;#FF4500&quot;, linestyle=&quot;-.&quot;, label=f&quot;Mode={mode_val:.0f}&quot;)
plt.legend()
ax.set_title(&#39;Online Retail - Customer Purchase Distribution&#39;, color=&#39;w&#39;)
ax.set_xlabel(&#39;Customer Total Sales (log scale)&#39;, color=&#39;w&#39;)
ax.set_ylabel(&#39;Count&#39;, color=&#39;w&#39;)
ax.tick_params(colors=&#39;w&#39;)
ax.spines[&#39;bottom&#39;].set_color(&#39;w&#39;)
ax.spines[&#39;left&#39;].set_color(&#39;w&#39;)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_32/post/37c6cfd4-242d-4b1d-93b1-d1f035cbfadd/image.png" alt=""></p>
<hr>
<blockquote>
<p><span style='font-size: 35px;'><strong>&quot; 데이터의 흩어짐 &quot;</strong></span></p>
</blockquote>
<h2 id="편차">편차</h2>
<ul>
<li><span style='background-color: #FFFACD; font-size: 20px;'>데이터가 평균에서 얼마나 떨어져 있는지 나타낸 값</span><ul>
<li><span style='font-size: 20px;'>예시 데이터 : [20,15, 17, 22, 21]</span></li>
<li><span style='font-size: 20px;'>평균 = 19, 편차 = [+1, -4, -2, +3, +2]</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>편차의 한계</span><ul>
<li><span style='background-color: #FFDAB9; font-size: 20px;'><strong>편차의 합은 0</strong></span></li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>음수 편차와 양수 편차가 서로 상쇄됨</span><ul>
<li><span style='font-size: 20px;'>평균은 데이터의 중심 위치이고 그런 평균으로부터의 ± 거리니까</span></li>
</ul>
</li>
<li><span style='font-size: 20px;'>개별 데이터의 흩어짐은 알 수 있으나 <span style='background-color: #CFE4FE; font-size: 20px;'>전체의 산포도 <strong>요약값으로는 쓸 수 없음</strong></span></li>
</ul>
</li>
</ul>
<h2 id="분산">분산</h2>
<ul>
<li><span style='background-color: #FFFACD; font-size: 20px;'>편차의 제곱의 평균</span></li>
<li><span style='font-size: 20px;'>분산의 한계</span><ul>
<li><span style='font-size: 20px;'>편차를 제곱하여 계산해서 </span><span style='background-color: #CFE4FE; font-size: 20px;'>원래 데이터 단위와 달라짐</span></li>
<li><span style='font-size: 20px;'>큰 편차일수록 크게 반영되어 크기가 왜곡됨</span></li>
</ul>
</li>
</ul>
<p><span style='font-size: 20px;'><strong>분산을 제곱으로 계산하는 이유</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>수학적으로 다루기 쉬움</span><ul>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>절대값은 미분이 불가능한 지점이 있으나 제곱은 가능함</span><ul>
<li><span style='font-size: 20px;'>큰 편차를 더 강하게 반영</span></li>
</ul>
</li>
</ul>
</li>
<li><span style='background-color: #FFDAB9; font-size: 20px;'>이상치를 훨씬 크게 평가하기 위해</span></li>
<li><span style='font-size: 20px;'>평균에서 멀리 떨어진 값 ≓ 이상치, 이상치는 데이터 전체에 큰 영향을 미치므로 그 영향을 반영시키기 위함</span><ul>
<li><span style='font-size: 20px;'>이론적 성질이 좋음</span></li>
</ul>
</li>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>중심극한정리, 가우스분포(=정규분포) 등과 연관됨</span></li>
</ul>
<h2 id="표준편차">표준편차</h2>
<ul>
<li><p><span style='background-color: #FAFAD2; font-size: 20px;'>분산의 양의 제곱근</span></p>
<ul>
<li><span style='background-color: #CFE4FE; font-size: 20px;'>원래 단위로 복원</span><ul>
<li><span style='font-size: 20px;'>직관적 해석 가능, 비교 용이성</span></li>
</ul>
</li>
</ul>
</li>
<li><p><span style='background-color: #FFDAB9; font-size: 20px;'>안정성과 위험을 보여주는 언어</span></p>
</li>
<li><p><span style='background-color: #FAFAD2; font-size: 20px;'><strong>평균은 분포의 위치</strong>를, <strong>표준편차는 분포의 퍼짐</strong>을 결정함</span></p>
</li>
<li><p><span style='font-size: 20px;'>데이터 값에 <strong>2씩 더하면?</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>평균은 변해도 </span><span style='background-color: #CFE4FE; font-size: 20px;'>표준편차는 동일</span></li>
</ul>
</li>
<li><p><span style='font-size: 20px;'>데이터 값에 <strong>2씩 곱하면?</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>평균도 </span><span style='background-color: #CFE4FE; font-size: 20px;'>표준편차도 2배 up</span></li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/soo_32/post/7fdca745-dcac-4885-8c68-fa4861b0f441/image.png" alt=""></p>
<pre><code class="language-python">df[&#39;height_cm&#39;].var()  # 분산
df[&#39;height_cm&#39;].std()  # 표준편차

# 데이터 만든 부분
x = np.array([2, 4, 6, 8, 10], dtype=float)
plus_a = x + 10
times_k = x * 2

std_base = float(np.std(x, ddof=1))
std_plus_a = float(np.std(plus_a, ddof=1))
std_times_k = float(np.std(times_k, ddof=1))
df_transform = pd.DataFrame({
    &quot;dataset&quot;: [&quot;base&quot;, &quot;+a (a=10)&quot;, &quot;×k (k=2)&quot;],
    &quot;std&quot;: [std_base, std_plus_a, std_times_k],
    &quot;mean&quot;: [float(np.mean(x)), float(np.mean(plus_a)), float(np.mean(times_k))]
})

# Bar chart
fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
plt.bar(df_transform[&quot;dataset&quot;], df_transform[&quot;std&quot;], color = [&#39;#7FFFD4&#39;, &#39;#87CEFA&#39;, &#39;#00BFFF&#39;])
ax.set_title(&#39;Effect of transformations on standard deviation&#39;, color=&#39;w&#39;)
ax.set_ylabel(&#39;Standard deviation&#39;, color=&#39;w&#39;)
ax.tick_params(colors=&#39;w&#39;)
ax.spines[&#39;bottom&#39;].set_color(&#39;w&#39;)
ax.spines[&#39;left&#39;].set_color(&#39;w&#39;)
savefig(&quot;transform_std&quot;)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/soo_32/post/7d1b1bcc-c9d1-47c3-ba16-3df03a6f34ca/image.png" alt=""></p>
<p><span style='font-size: 20px;'><strong>히스토그램 비교</strong></span></p>
<ul>
<li><span style='font-size: 20px;'>팀 A </span><span style='background-color: #CFE4FE; font-size: 20px;'>(σ≈3) : 좁고 뾰족 → 안정적</span></li>
<li><span style='font-size: 20px;'>팀 B (σ≈12) : 넓고 납작 → 변동성 큼</span></li>
</ul>
<p><img src="https://velog.velcdn.com/images/soo_32/post/3a77b0e4-6d9f-49c1-9fd8-33d887d14aef/image.png" alt=""></p>
<p><span style='background-color: #FAFAD2; font-size: 25px;'>같은 평균이어도 <strong>표준편차가 다르면 안정성 / 해석 / 의사결정이 완전히 달라짐</strong></span></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[통계 뿌시기 - 라이브세션 1]]></title>
            <link>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%84%B8%EC%85%98-1</link>
            <guid>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%84%B8%EC%85%98-1</guid>
            <pubDate>Fri, 19 Sep 2025 11:58:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 기술통계와 추론통계란 &quot;</strong></span></p>
</blockquote>
<h2 id="기술통계">기술통계</h2>
<p><span style="background-color: #FFFACD; font-size:20px;">수집한 데이터를 하나의 값으로 정리 / 요약 / 해석 / 표현,</span><span style="font-size:16px;"> 
ex) 평균, 중앙값, 분산, 표준편차 등
<span style="background-color: #FFFACD; font-size:20px;">한 눈에 파악할 수 있어</span><span style="font-size:20px;"> 흐름을 빠르게 이해하고 결정할 수 있음</span></p>
<h2 id="추론통계">추론통계</h2>
<p><span style="background-color: #FFFACD; font-size:20px;">표본으로 전체를 &quot;추정&quot;</span></p>
<ul>
<li><span style="font-size:20px;">장점 : 전체를 조사하지 않아도 됨</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">단점 : 항상 불확실성이 존재 (표본 오류 등)</span></li>
</ul>
<p><span style="font-size:20px;"><strong>모집단</strong> : 내가 알고 싶은 전체 대상</span></p>
<p><span style="font-size:20px;"><strong>전수조사</strong> : 모집단을 전부 다 조사</span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">현실적으로 불가능, 시간/비용/노력의 한계</span></li>
</ul>
<p><span style="font-size:20px;"><strong>표본</strong> : 모집단의 일부</span></p>
<p><span style="font-size:20px;"><strong>표본조사</strong> : 모집단에서 일부만 추출하여 조사, 모집단을 추정</span></p>
<p><span style="background-color: #FFDAB9; font-size:20px;">표본을 잘 뽑는 것이 중요 !</span></p>
<ul>
<li><span style="font-size:20px;">표본이 모집단을 대표할 수 있어야 함</span></li>
<li><span style="font-size:20px;">분석의 정확성과 결과의 신뢰성에 영향을 미침</span></li>
</ul>
<hr>
<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 데이터 분석의 3가지 목적 &quot;</strong></span></p>
</blockquote>
<h2 id="요약">&quot; 요약 &quot;</h2>
<p><span style="font-size:20px;">많은 데이터를 하나로 요약하여 </span><span style="background-color: #CFE4FE; font-size:20px;">한 번에 파악하기 위함</span></p>
<p><span style="font-size:20px;"><strong>방법</strong></span></p>
<ul>
<li><span style="font-size:20px;">숫자 : 평균, 중앙값, 최빈값 등</span></li>
<li><span style="font-size:20px;">그림 : 막대그래프, 히스토그램 등</span><ul>
<li><span style="font-size:20px;">모양과 패턴 즉시 확인 가능</span></li>
</ul>
</li>
</ul>
<h2 id="설명">&quot; 설명 &quot;</h2>
<p><span style="font-size:20px;">&quot;무슨 일이 일어났는지&quot; 보다는 </span><span style="background-color: #CFE4FE; font-size:20px;">&quot;왜 그런 일이 일어났는지 찾는 것&quot;</span></p>
<ul>
<li><span style="font-size:20px;">내부요인과 외부요인 모두 탐색 필요</span></li>
</ul>
<h2 id="예측">&quot; 예측 &quot;</h2>
<p><span style="font-size:20px;">기존(과거) 데이터를 기준으로 예측, </span><span style="background-color: #CFE4FE; font-size:20px;">확률적 패턴 기반 추정</span></p>
<ul>
<li><span style="font-size:20px;">100% 확실하지는 않음</span></li>
</ul>
<hr>
<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 도수분포표 &quot;</strong></span></p>
</blockquote>
<h2 id="요약-도구">요약 도구</h2>
<ul>
<li><span style="font-size:20px;">패턴 확인 : 도수분포표</span></li>
<li><span style="font-size:20px;">모양 확인 : 시각화</span></li>
<li><span style="font-size:20px;">대표값 : 평균, 중앙값, 최빈값</span></li>
</ul>
<h2 id="도수분포표">도수분포표</h2>
<ul>
<li><span style="font-size:20px;">숫자 더미를 </span><span style="background-color: #FFDAB9; font-size:20px;">구간(계급)별 표로 바꿔</span><span style="font-size:20px;"> 패턴을 드러냄</span></li>
</ul>
<p><span style="font-size:20px;"><strong>단계</strong></span></p>
<ul>
<li><span style="font-size:20px;">min &amp; max 찾기 : <span style="background-color: #CFE4FE; font-size:20px;">범위(range) 확인</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">구간(bins, 계급)나누기</span><span style="font-size:20px;"> : 5cm, 10점 등 일정 간격</span></li>
<li><span style="font-size:20px;">계급값 정하기 : </span><span style="background-color: #CFE4FE; font-size:20px;">구간의 대표값</span><span style="font-size:20px;"> (ex. 145 ~ 150 → 147)</span></li>
<li><span style="font-size:20px;">도수 세기 : <span style="background-color: #CFE4FE; font-size:20px;">각 구간의 개수</span><span style="font-size:20px;"> (=각 구간에 속하는 data 개수)</span><ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">합산 = 전체 data 개수</span></li>
</ul>
</li>
<li><span style="background-color: #CFE4FE; font-size:20px;">상대도수 : 구간 비율 (= 도수 / 전체)</span></li>
<li><span style="font-size:20px;">누적도수 : 아래에서 위로 누적된 비율</span><ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">마지막 값이 1이어야 함</span></li>
</ul>
</li>
</ul>
<pre><code class="language-python">data = {
    &#39;계급&#39; : [&#39;145~150&#39;, &#39;150~155&#39;, &#39;155~160&#39;, &#39;160~165&#39;, &#39;165~170&#39;, &#39;170~175&#39;],
    &#39;도수&#39; : [1, 15, 54, 85, 39, 6]
}
df = pd.DataFrame(data)
df[&#39;상대도수&#39;] = df[&#39;도수&#39;]/(df[&#39;도수&#39;].sum())
df[&#39;누적도수&#39;] = df[&#39;상대도수&#39;].cumsum()  # cumsum() = 누적합 함수</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/bf441125-6b07-47cc-a217-1fb3132cb799/image.png" />

<h2 id="도수분포표를-히스토그램으로-변환">도수분포표를 히스토그램으로 변환</h2>
<ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">도수분포표 : &#39;숫자&#39; → &#39;표&#39;, 히스토그램 : &#39;표&#39; → &#39;그림&#39;</span></li>
<li><span style="font-size:20px;">도수분포표의 각 행 = 히스토그램 막대 1개</span></li>
<li><span style="font-size:20px;">구간(가로축)과 도수(세로축)만 있으면 즉시 시각화 가능</span> </li>
</ul>
<pre><code class="language-python">fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
plt.bar(df[&#39;계급&#39;], df[&#39;도수&#39;], color = &#39;#7FFFD4&#39;)
plt.title(&#39;중학생 키 도수분포표&#39;, color = &#39;white&#39;)
plt.xlabel(&#39;키 구간 (cm)&#39;, color = &#39;white&#39;)
plt.xticks(color=&#39;white&#39;)
plt.ylabel(&#39;학생 수&#39;, color = &#39;white&#39;)
plt.yticks(color = &#39;white&#39;)
plt.gca().set_axisbelow(True)
plt.grid(axis=&#39;y&#39;, color = &#39;lightgray&#39;, linewidth = 0.3)
plt.show()</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/02a1e41d-0916-4dac-a05b-fb3478576c91/image.png">

<h2 id="인사이트">인사이트</h2>
<ul>
<li><span style="font-size:20px;">최빈 구간 : 160~165, 약 42.2%</span></li>
<li><span style="font-size:20px;">중앙값 : 가장 많은 구간 → 160~165 구간에 위치</span></li>
<li><span style="font-size:20px;">약 97%가 170cm 미만 (누적도수 0.9698)</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">패턴 : 가운데가 두툼한 종 모양 (정규분포형)</span></li>
</ul>
<hr>
<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 시각화 조건 &quot;</strong></span></p>
</blockquote>
<h2 id="데이터-및-변수의-유형에-따라-그래프-종류가-달라짐">데이터 및 변수의 유형에 따라 그래프 종류가 달라짐</h2>
<p><span style="background-color: #FAFAD2; font-size:20px;"><strong>범주형(문자형) 변수(Categorical)</strong></span></p>
<ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">범주(종류, 카테고리)로만 구분</span><span style="font-size:16px;">되는 데이터</span></li>
<li><span style="font-size:20px;">예 : 성별 (남/여), 혈액형 (A/B/O/AB), 결제수단(카드/현금) 등</span></li>
<li><span style="font-size:20px;">숫자 계산 불가, </span><span style="background-color: #CFE4FE; font-size:20px;">비율과 빈도로만 요약</span></li>
</ul>
<p><span style="background-color: #FAFAD2; font-size:20px;"><strong>연속형(수치형) 변수(Continuous)</strong></span></p>
<ul>
<li><span style="font-size:20px;">숫자로 표현, </span><span style="background-color: #FFDAB9; font-size:20px;">중간값이 무한히 존재하는 데이터</span></li>
<li><span style="font-size:20px;">예 : 키 (161.1cm), 몸무게 (48.5kg) 등</span></li>
<li><span style="font-size:20px;">숫자 계산 가능, </span><span style="background-color: #CFE4FE; font-size:20px;">평균, 중앙값, 표준편차 등으로 요약</span></li>
</ul>
<p><span style="background-color: #FAFAD2; font-size:20px;"><strong>이산형(수치형) 변수(Discrete)</strong></span></p>
<ul>
<li><span style="font-size:20px;">숫자지만 </span><span style="background-color: #FFDAB9; font-size:20px;">딱딱 떨어지는 값, 소수점 없음, 세어지는 값</span></li>
<li><span style="font-size:20px;">예 : 주사위 (1,2,3,4,5,6), 하루 방문자 수 (10명, 20명) 등</span></li>
</ul>
<p><span style="font-size:20px;"><strong>변수의 개수에 따라 그래프 종류가 달라짐</strong></span></p>
<ul>
<li><span style="font-size:20px;">일변량 : 분포와 비율</span></li>
<li><span style="font-size:20px;">이변량 : 관계</span></li>
<li><span style="font-size:20px;">다변량 : 추가 시각화</span></li>
</ul>
<img src="https://velog.velcdn.com/images/soo_32/post/233b7674-37ca-4c47-b028-fd23d52ce4d1/image.png">
<img src="https://velog.velcdn.com/images/soo_32/post/18d09b4d-aeb2-4e8a-a943-301181cb0f5a/image.png">

<hr>
<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 막대 그래프 &quot;</strong></span></p>
</blockquote>
<h2 id="막대-그래프">막대 그래프</h2>
<ul>
<li><span style="background-color: #FAFAD2; font-size:20px;">범주형 데이터의 빈도, 비율, 수치를 막대의 길이나 높이로 표현한 그래프</span></li>
<li><span style="font-size:20px;">각 막대는 하나의 범주(category)를 나타냄</span></li>
</ul>
<p><span style="font-size:20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="font-size:20px;">데이터 유형</span><ul>
<li><span style="font-size:20px;">x축 : 범주형 데이터 (예: 과일 종류, 지역, 성별 등)</span></li>
<li><span style="font-size:20px;">y축 : 수치형 데이터(예: 개수, 매출액, 비율 등)</span></li>
</ul>
</li>
<li><span style="font-size:20px;">막대 방향</span><ul>
<li><span style="font-size:20px;">세로형 : 가장 일반적, </span><span style="background-color: #CFE4FE; font-size:20px;">x축 = 범주, y축 = 값</span></li>
<li><span style="font-size:20px;">가로형 : 범주 이름이 길 때 사용</span></li>
</ul>
</li>
<li><span style="background-color: #FFDAB9; font-size:20px;">막대 간 간격 : 막대끼리 간격이 있음 (연속형 → 히스토그램)</span></li>
</ul>
<p><span style="font-size:20px;"><strong>종류</strong></span></p>
<ul>
<li><span style="font-size:20px;">단일 막대 그래프</span></li>
<li><span style="font-size:20px;">그룹형(Clustered) 막대 그래프</span><ul>
<li><span style="font-size:20px;">한 범주 내에서 여러 값을 비교 (지역별 남/녀 인구 비교)</span></li>
</ul>
</li>
<li><span style="font-size:20px;">누적(Staked) 막대 그래프</span><ul>
<li><span style="font-size:20px;">한 막대를 여러 부분으로 나눠 구성 비율 비교</span></li>
<li><span style="font-size:20px;">한 막대의 전체 길이는 실제 값의 총합</span></li>
</ul>
</li>
<li><span style="font-size:20px;">100% 누적 막대 그래프</span><ul>
<li><span style="font-size:20px;">데이터를 비율로 환산해서 반영</span></li>
<li><span style="font-size:20px;">각 막대의 전체 길이는 항상 동일(=100%)</span></li>
</ul>
</li>
</ul>
<p><span style="font-size:20px;"><strong>장점</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">해석이 쉽고 직관적, 범주별 비교에 적합</span></li>
<li><span style="font-size:20px;">항목별 크기 차이, 우세한 카테고리, 상대적 순위 한눈에 파악</span></li>
</ul>
<p><span style="font-size:20px;"><strong>단점</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">너무 많은 범주가 있으면 복잡해짐</span><ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">해결 : 상위 몇개만 보여주거나, 필요한 항목만 보여줌</span></li>
</ul>
</li>
<li><span style="font-size:20px;">시간 흐름(추세) 분석에는 선그래프(line chart)가 더 적합</span></li>
</ul>
<pre><code class="language-python"># 누적 막대 그래프
fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
pay_counts = df[&#39;pay_method&#39;].value_counts()
plt.bar(pay_counts.index, pay_counts.values, width = 0.4, edgecolor = &#39;black&#39;, color = &#39;#7FFFD4&#39;)
plt.bar(pay_counts.index, pay_counts.values * 0.5,  width = 0.4, edgecolor = &#39;black&#39;, color = &#39;#00BFFF&#39;)
plt.title(&#39;Payment Method Distribution&#39;, color=&#39;w&#39;)
plt.xlabel(&#39;Method&#39;, color=&#39;w&#39;)
plt.xticks(color=&#39;w&#39;)
plt.ylabel(&#39;Count&#39;, color=&#39;w&#39;)
plt.yticks(color=&#39;w&#39;)
plt.gca().set_axisbelow(True)
plt.grid(axis=&#39;y&#39;, color = &#39;lightgray&#39;, linewidth = 0.3)
plt.show() 

# 그룹형 막대 그래프
fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
sns.countplot(data=df, x=&#39;pay_method&#39;, hue = &#39;gender&#39;, order = [&#39;QuickPay&#39;, &#39;Cash&#39;, &#39;Card&#39;], dodge=True, palette={&#39;Male&#39;:&#39;#7FFFD4&#39;, &#39;Female&#39;:&#39;#00BFFF&#39;})
plt.title(&#39;Payment Method Distribution&#39;, color=&#39;w&#39;)
plt.xlabel(&#39;Method&#39;, color=&#39;w&#39;)
plt.xticks(color=&#39;w&#39;)
plt.ylabel(&#39;Count&#39;, color=&#39;w&#39;)
plt.yticks(color=&#39;w&#39;)
plt.gca().set_axisbelow(True)
plt.grid(axis=&#39;y&#39;, color = &#39;lightgray&#39;, linewidth = 0.3)
plt.show()</code></pre>
<table align="center">
  <tr>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/47685497-3b5b-4c03-9a7c-f6b1e4e70638/image.png"></td>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/8d2a0560-7cf0-4947-9543-eb831fe87bcb/image.png"></td>
  </tr>
</table>


<hr>
<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 원 그래프 &quot;</strong></span></p>
</blockquote>
<h2 id="원-그래프">원 그래프</h2>
<ul>
<li><span style="background-color: #FAFAD2; font-size:20px;">파이 차트, 주로 범주형 데이터의 구성 비율 비교에 활용</span></li>
<li><span style="font-size:20px;">원 전체를 100%로 보고, 각 범주의 비율을 원의 조각으로 나타낸 그래프</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">각 조각의 크기가 해당 범주의 비율(%)을 의미</span></li>
</ul>
<p><span style="font-size:20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="font-size:20px;">모든 조각의 데이터 값의 합 = 데이터 값 전체의 합</span></li>
<li><span style="font-size:20px;">모든 조각의 데이터 비율의 합 = 100%</span></li>
</ul>
<p><span style="font-size:20px;"><strong>종류</strong></span></p>
<ul>
<li><span style="font-size:20px;">도넛 차트</span><ul>
<li><span style="font-size:20px;">파이 차트 가운데를 뚫어서 강조, 여러 개 겹쳐 쓰기도 함</span></li>
</ul>
</li>
<li><span style="font-size:20px;">3D 파이차트</span><ul>
<li><span style="font-size:20px;">입체 효과 (하지만 시각적 왜곡 때문에 권장되지 않음)</span></li>
</ul>
</li>
<li><span style="font-size:20px;">폭발형 파이차트</span><ul>
<li><span style="font-size:20px;">특정 조각을 원에서 띄워 강조</span></li>
</ul>
</li>
</ul>
<p><span style="font-size:20px;"><strong>장점</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">직관적 : 전체 중 각 항목이 얼마나 차지하는지 한눈에 보임</span></li>
<li><span style="background-color: #FFDAB9; font-size:20px;">강조 효과 : 특정 부분을 강조할 때 효과적 (예: 점유율 1위 기업)</span></li>
<li><span style="font-size:20px;">단순함: 항목이 적을 때 비율 표현에 적합</span></li>
</ul>
<p><span style="font-size:20px;"><strong>단점</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">항목이 많을 때 해석 불가</span><ul>
<li><span style="font-size:20px;">조각이 많으면 글씨 겹치고 비교 어려움</span></li>
</ul>
</li>
<li><span style="font-size:20px;">비슷한 값 비교 어려움</span><ul>
<li><span style="font-size:20px;">21% vs 23% 같은 차이는 거의 안 보임</span></li>
</ul>
</li>
<li><span style="background-color: #CFE4FE; font-size:20px;">정확한 수치 파악에 부적합</span><ul>
<li><span style="font-size:20px;">&quot;얼마나 차지한다&quot;는 감만, 정확한 수치는 막대 그래프</span></li>
</ul>
</li>
</ul>
<p><span style="background-color: #FAFAD2; font-size:20px;"><strong>사용하기 적절한 경우</strong></span></p>
<ul>
<li><span style="font-size:20px;">항목 개수가 </span><span style="background-color: #FFDAB9; font-size:20px;">3~6개</span><span style="font-size:20px;"> 정도일 때</span></li>
<li><span style="font-size:20px;">“부분/전체” 관계를 보여주고 싶을 때 (시장 점유율, 예산 비율)</span></li>
<li><span style="background-color: #FFDAB9; font-size:20px;">강조하려는 항목이 확실히 클 때</span></li>
</ul>
<pre><code class="language-python">fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
colors = [&#39;#7FFFD4&#39;, &#39;#87CEFA&#39;, &#39;#00BFFF&#39;]
wedges, texts, autotexts = plt.pie(pay_counts.values, labels=pay_counts.index, autopct=&#39;%1.1f%%&#39;, startangle=90, colors=colors, textprops={&#39;color&#39;: &#39;w&#39;, &#39;fontsize&#39;: 12})
plt.title(&#39;Payment Method Share&#39;, color=&#39;w&#39;)
# autopct 텍스트의 색상 변경
for text in autotexts:
    text.set_color(&#39;k&#39;)
plt.show()

# 폭발형
fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
colors = [&#39;#7FFFD4&#39;, &#39;#87CEFA&#39;, &#39;#00BFFF&#39;]
wedges, texts, autotexts = plt.pie(pay_counts.values, labels=pay_counts.index, autopct=&#39;%1.1f%%&#39;, startangle=90, colors=colors, textprops={&#39;color&#39;: &#39;w&#39;, &#39;fontsize&#39;: 12}, explode = [0, 0.2, 0.3])
plt.title(&#39;Payment Method Share&#39;, color=&#39;w&#39;)
# autopct 텍스트의 색상 변경
for text in autotexts:
    text.set_color(&#39;k&#39;)
plt.show()</code></pre>
<table align="center">
  <tr>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/a193d8d8-c70b-4e4b-8d09-63a622cc7476/image.png"></td>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/c44f4742-0be3-44e6-826d-272a4757f63f/image.png"></td>
  </tr>
</table>

<hr>
<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 기타 범주형 그래프 &quot;</strong></span></p>
</blockquote>
<h2 id="트리맵">트리맵</h2>
<ul>
<li><span style="background-color: #FAFAD2; font-size:20px;">범주형 데이터의 계층 구조와 비율을 사각형 면적으로 나타냄</span></li>
<li><span style="font-size:20px;">전체 영역 = 전체 데이터</span></li>
<li><span style="font-size:20px;">각 사각형 = 하나의 항목 또는 하위 항목</span></li>
<li><span style="font-size:20px;">면적 크기 = 값 또는 비율</span></li>
</ul>
<p><span style="font-size:20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">계층 구조 표현 가능 → 범주 안의 하위 범주까지 표현 가능</span></li>
<li><span style="font-size:20px;">비율 비교 직관적 → 큰 항목은 큰 사각형, 작은 항목은 작은 사각형</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">항목 수가 많아도 표현 가능 → 파이 차트보다 효율적</span><img src="https://velog.velcdn.com/images/soo_32/post/f82bb3da-6daa-4a4e-bef7-0e89bb32f0f0/image.png">

</li>
</ul>
<h2 id="모자이크-플롯">모자이크 플롯</h2>
<ul>
<li><span style="background-color: #FAFAD2; font-size:20px;">범주형 데이터의 교차 분포(Cross-tab)를 시각화하는 그래프</span></li>
<li><span style="font-size:20px;">각 사각형의 너비와 높이가 범주별 빈도(또는 비율)를 나타냄</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">두 개 이상의 범주 간 관계를 한눈에 볼 수 있음</span></li>
</ul>
<p><span style="font-size:20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="font-size:20px;">가로축, 세로축 모두 범주형 데이터</span></li>
<li><span style="font-size:20px;">면적 = 관측치 개수 또는 비율</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">범주 간 상호작용, 비율 차이 확인에 유용</span></li>
</ul>
<pre><code class="language-python">from statsmodels.graphics.mosaicplot import mosaic
import matplotlib.pyplot as plt

# 데이터
data_dict = {(&#39;남자&#39;,&#39;예&#39;): 30,
             (&#39;남자&#39;,&#39;아니오&#39;): 70,
             (&#39;여자&#39;,&#39;예&#39;): 20,
             (&#39;여자&#39;,&#39;아니오&#39;): 80}

# 색상 매핑
colors = {
    (&#39;남자&#39;,&#39;예&#39;): &#39;#B2F7EF&#39;,
    (&#39;남자&#39;,&#39;아니오&#39;): &#39;#7FFFD4&#39;,
    (&#39;여자&#39;,&#39;예&#39;): &#39;#66CDAA&#39;,
    (&#39;여자&#39;,&#39;아니오&#39;): &#39;#00CED1&#39;
}

# Figure 생성 (배경 검정)
fig = plt.figure(figsize=(8,6), facecolor=&#39;black&#39;)
ax = fig.add_subplot(111)
ax.set_facecolor(&#39;black&#39;)

# 모자이크 플롯
mosaic(data_dict, gap=0, ax=ax,
       properties=lambda key: {&#39;facecolor&#39;: colors[key], &#39;edgecolor&#39;: None})

# 제목
plt.title(&quot;성별과 흡연 여부 모자이크 플롯 (Mint~Blue)&quot;, color=&#39;white&#39;, fontsize=16)

# 축 제거 + 텍스트 색상 흰색으로 변경
ax.tick_params(colors=&#39;white&#39;, which=&#39;both&#39;)  # 눈금, 숫자 색상 흰색
ax.xaxis.label.set_color(&#39;white&#39;)
ax.yaxis.label.set_color(&#39;white&#39;)
plt.axis(&#39;off&#39;)

plt.show()</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/64204660-7adb-421a-aa2b-4219b7f2a28d/image.png">

<table style="border-collapse: collapse; width: 100%; text-align: center;">
  <tr style="background-color: #f2f2f2; font-weight: bold;">
    <th style="border: 1px solid #ddd; padding: 8px;">특징</th>
    <th style="border: 1px solid #ddd; padding: 8px;">모자이크 플롯</th>
    <th style="border: 1px solid #ddd; padding: 8px;">트리맵</th>
  </tr>
  <tr>
    <td style="border: 1px solid #ddd; padding: 8px;">용도</td>
    <td style="border: 1px solid #ddd; padding: 8px;">범주형 데이터의 교차 관계/빈도</td>
    <td style="border: 1px solid #ddd; padding: 8px;">계층적 데이터의 크기/비율 비교</td>
  </tr>
  <tr>
    <td style="border: 1px solid #ddd; padding: 8px;">변수</td>
    <td style="border: 1px solid #ddd; padding: 8px;">주로 범주형 값 (빈도)</td>
    <td style="border: 1px solid #ddd; padding: 8px;">주로 수치형 값 (크기)</td>
  </tr>
  <tr>
    <td style="border: 1px solid #ddd; padding: 8px;">계층</td>
    <td style="border: 1px solid #ddd; padding: 8px;">분할된 사각형</td>
    <td style="border: 1px solid #ddd; padding: 8px;">내포된 사각형</td>
  </tr>
  <tr>
    <td style="border: 1px solid #ddd; padding: 8px;">예시</td>
    <td style="border: 1px solid #ddd; padding: 8px;">하드 드라이브 폴더 크기</td>
    <td style="border: 1px solid #ddd; padding: 8px;">성별에 따른 타이타닉 생존율</td>
  </tr>
</table>

<hr>
<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 히스토그램 &quot;</strong></span></p>
</blockquote>
<h2 id="히스토그램">히스토그램</h2>
<ul>
<li><span style="font-size:20px;">연속형 데이터의 분포를 시각화하는 그래프</span></li>
<li><span style="font-size:20px;">데이터를 </span><span style="background-color: #FFDAB9; font-size:20px;">구간(bin, 구획)으로 나누고</span><span style="font-size:20px;">, 각 구간에 속하는 데이터의 </span><span style="background-color: #CFE4FE; font-size:20px;">빈도(횟수) 또는 비율을 막대의 높이로 표현</span></li>
<li><span style="background-color: #FAFAD2; font-size:20px;">연속형 데이터의 분포(모양, 중심, 퍼짐, 왜도) 직관적으로 확인</span></li>
</ul>
<p><span style="font-size:20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="font-size:20px;">막대그래프와의 차이점</span><ul>
<li><span style="font-size:20px;">막대그래프: 범주형 데이터(카테고리) 빈도를 표현</span></li>
<li><span style="font-size:20px;">히스토그램: 연속형 데이터를 구간으로 나눠서 표현</span><ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">막대가 서로 붙어 있음 (연속적이기 때문)</span></li>
</ul>
</li>
</ul>
</li>
<li><span style="font-size:20px;">빈도 vs 상대도수</span><ul>
<li><span style="font-size:20px;">y축 = 단순 빈도 or 전체 데이터 대비 비율(%)</span></li>
</ul>
</li>
<li><span style="background-color: #FFDAB9; font-size:20px;">구간(bin)의 크기 중요</span><ul>
<li><span style="font-size:20px;">너무 크면 → 분포가 뭉뚱그려짐, 세부적인 특성이 안 보임</span></li>
<li><span style="font-size:20px;">너무 작으면 → 분포가 지나치게 세분화, 노이즈처럼 보임</span></li>
<li><span style="font-size:20px;">구간 개수 k = (1 + 3.322 * log10(n)), 스터지스 공식</span></li>
</ul>
</li>
<li><span style="background-color: #CFE4FE; font-size:20px;">평균 / 중앙값 / 표준편차와 함께 봐야 강력함</span></li>
</ul>
<p><span style="font-size:20px;"><strong>해석</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">대칭형</span><span style="font-size:20px;"> → 평균 근처에 몰려 있고 <span style="background-color: #CFE4FE; font-size:20px;">정규분포</span><span style="font-size:20px;"> 형태일 수 있음</span></li>
<li><span style="font-size:20px;">왼쪽으로 치우침</span><span style="background-color: #CFE4FE; font-size:20px;">(왼쪽 꼬리 김) → 왜도 &lt; 0</span></li>
<li><span style="font-size:20px;">오른쪽으로 치우침</span><span style="background-color: #CFE4FE; font-size:20px;">(오른쪽 꼬리 김) → 왜도 &gt; 0</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">여러 봉우리</span><span style="font-size:20px;"> → 다봉형 분포 </span><span style="background-color: #CFE4FE; font-size:20px;">(여러 집단이 섞여 있을 가능성)</span></li>
</ul>
<pre><code class="language-python">fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
plt.hist(df[&#39;height_cm&#39;], bins=15,range = (160, 180), density = True, histtype = &#39;bar&#39;, edgecolor=&#39;#00BFFF&#39;, color = &#39;#7FFFD4&#39;, linewidth = 0.7)
plt.title(&#39;Histogram of Height (cm)&#39;, color=&#39;w&#39;)
plt.xlabel(&#39;Height (cm)&#39;, color=&#39;w&#39;)
plt.xticks(color=&#39;w&#39;)
plt.ylabel(&#39;Count&#39;, color=&#39;w&#39;)
plt.yticks(color=&#39;w&#39;)
plt.gca().set_axisbelow(True)
plt.grid(axis=&#39;y&#39;, color = &#39;lightgray&#39;, linewidth = 0.3)
plt.show()

# hue로 그룹 구분 및 밀도 곡선 추가한 계단식
fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
sns.histplot(data = df, x=&#39;height_cm&#39;, bins=15, hue = &#39;gender&#39;, kde=True, stat=&#39;count&#39;, multiple = &#39;dodge&#39;, element = &#39;step&#39;, palette={&#39;Male&#39;:&#39;#7FFFD4&#39;, &#39;Female&#39;:&#39;#00BFFF&#39;})
plt.title(&#39;남/여 키 분포&#39;, color=&#39;w&#39;)
plt.xlabel(&#39;키&#39;, color=&#39;w&#39;)
plt.xticks(color=&#39;w&#39;)
plt.ylabel(&#39;빈도&#39;, color=&#39;w&#39;)
plt.yticks(color=&#39;w&#39;)
plt.gca().set_axisbelow(True)
plt.grid(axis=&#39;y&#39;, color = &#39;lightgray&#39;, linewidth = 0.3)
plt.show()</code></pre>
<table align="center">
  <tr>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/5ccc2bf2-e26c-417a-ad7a-1ca535cb91fc/image.png"></td>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/14507c96-849c-4253-a639-5ef232d25697/image.png"></td>
  </tr>
</table>

<hr>
<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 박스플롯 &quot;</strong></span></p>
</blockquote>
<h2 id="박스플롯">박스플롯</h2>
<ul>
<li><span style="background-color: #FAFAD2; font-size:20px;">연속형 데이터의 분포(흩어짐)와 중심, 이상치(outlier), 대칭성을 한눈에 볼 수 있는 그래프</span><ul>
<li><span style="font-size:20px;">데이터의 안정성을 직관적으로 보여줌</span></li>
</ul>
</li>
<li><span style="font-size:20px;">데이터를 사분위수(quartile)로 나누어 상자와 수염 형태로 표현</span></li>
</ul>
<p><span style="font-size:20px;"><strong>구성요소</strong></span></p>
<ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">Lower Whisker (최솟값 역할)</span><ul>
<li><span style="font-size:20px;">Q1 − 1.5 × IQR 보다 크거나 같은 값 중에서 가장 작은 값</span></li>
<li><span style="font-size:20px;">&quot;극단적인 이상치&quot; 제외 최솟값</span></li>
</ul>
</li>
<li><span style="background-color: #CFE4FE; font-size:20px;">제1사분위수(Q1, 25%)</span></li>
<li><span style="background-color: #FFDAB9; font-size:20px;">상자(Box), 사분위수범위(IQR)</span><ul>
<li><span style="font-size:20px;">Q1 ~ Q3 범위 → Q3 - Q1, 데이터의 중간 50%</span></li>
<li><span style="font-size:20px;">상자가 길수록 데이터가 흩어져 있다는 의미</span></li>
</ul>
</li>
<li><span style="background-color: #CFE4FE; font-size:20px;">중앙값(Median, Q2)</span><ul>
<li><span style="font-size:20px;">데이터의 가운데 값 (50%)</span></li>
<li><span style="font-size:20px;">상자 안쪽에 굵은 선으로 표시</span></li>
<li><span style="font-size:20px;">notch(노치, 홈) : 중앙값의 신뢰구간(보통 95%)</span></li>
</ul>
</li>
<li><span style="background-color: #CFE4FE; font-size:20px;">제3사분위수(Q3, 75%)</span></li>
<li><span style="background-color: #FFDAB9; font-size:20px;">Upper Whisker (최댓값 역할)</span><ul>
<li><span style="font-size:20px;">Q3 + 1.5 × IQR 보다 작거나 같은 값 중에서 가장 큰 값</span></li>
<li><span style="font-size:20px;">&quot;극단적인 이상치&quot; 제외 최댓값</span></li>
</ul>
</li>
<li><span style="background-color: #FFDAB9; font-size:20px;">이상치(Outlier)</span><ul>
<li><span style="font-size:20px;">수염 바깥에 있는 점들 → 특이값</span></li>
</ul>
</li>
</ul>
<p><span style="font-size:20px;"><strong>해석</strong></span></p>
<ul>
<li><span style="font-size:20px;">박스가 작고 수염이 짧음 → 평균 근처에 몰림 (안정적)</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">박스가 크고 수염이 길음 → 들쭉날쭉 (변동성이 큼)</span></li>
<li><span style="font-size:20px;">중앙값이 가운데 → 대칭적 분포</span></li>
<li><span style="font-size:20px;">중앙값이 아래쪽 → 오른쪽 꼬리 (왜도 &gt; 0)</span></li>
<li><span style="font-size:20px;">중앙값이 위쪽 → 왼쪽 꼬리 (왜도 &lt; 0)</span></li>
</ul>
<pre><code class="language-python">fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
colors = [&#39;#7FFFD4&#39;, &#39;#00BFFF&#39;]
grouped = [df.loc[df[&#39;gender&#39;]==&#39;Male&#39;,&#39;spend_10k&#39;],
           df.loc[df[&#39;gender&#39;]==&#39;Female&#39;,&#39;spend_10k&#39;]]
bplot = plt.boxplot(grouped, labels=[&#39;Male&#39;,&#39;Female&#39;], showfliers=True, patch_artist=True, whiskerprops=dict(linewidth=0.7), capprops=dict(linewidth=0.7), medianprops={&#39;color&#39;: &#39;w&#39;, &#39;linewidth&#39;:0.7}, notch = True)
for patch, color in zip(bplot[&#39;boxes&#39;], colors):
    patch.set_facecolor(color)
for whisker, color in zip(bplot[&#39;whiskers&#39;], [colors[0], colors[0], colors[1], colors[1]]):
    whisker.set(color=color, linewidth=1.2)
for cap, color in zip(bplot[&#39;caps&#39;], [colors[0], colors[0], colors[1], colors[1]]):
    cap.set(color=color, linewidth=1.2)
for flier, color in zip(bplot[&#39;fliers&#39;], colors):
    flier.set(marker=&#39;o&#39;, markeredgecolor=color, markersize=3)
plt.title(&#39;Spend (10k KRW) by Gender&#39;, color=&#39;w&#39;)
plt.xlabel(&#39;Gender&#39;, color=&#39;w&#39;)
plt.xticks(color=&#39;w&#39;)
plt.ylabel(&#39;Spend (10k KRW)&#39;, color=&#39;w&#39;)
plt.yticks(color=&#39;w&#39;)
plt.gca().set_axisbelow(True)
plt.grid(axis=&#39;y&#39;, color = &#39;lightgray&#39;, linewidth = 0.3)
plt.show()

# 결제수단별 박스플롯
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib
import matplotlib.collections as mcoll

fig, ax = plt.subplots(figsize=(8,6), facecolor=&#39;k&#39;)
ax.set_facecolor(&#39;k&#39;)
ax.patch.set_facecolor(&#39;k&#39;)
colors = [&#39;#7FFFD4&#39;, &#39;#87CEFA&#39;, &#39;#00BFFF&#39;]

flierprops = dict(
    marker=&#39;o&#39;,
    markerfacecolor=&#39;none&#39;,  # 내부 채우기 없애기
    markeredgewidth=0.7,
    markersize=3,
    markeredgecolor=&#39;#AFEEEE&#39;    # 원하는 색
)

sns.boxplot(
    data=df, x=&#39;gender&#39;, y=&#39;spend_10k&#39;, 
    showfliers=True, hue = &#39;pay_method&#39;,
    dodge = True, palette=colors, medianprops={&#39;color&#39;: &#39;w&#39;, &#39;linewidth&#39;:0.7}, 
    boxprops={&#39;edgecolor&#39;:&#39;none&#39;}, notch = True, flierprops=flierprops, ax=ax)

line_colors = [&#39;#7FFFD4&#39;, &#39;#7FFFD4&#39;,&#39;#7FFFD4&#39;, &#39;#7FFFD4&#39;,&#39;w&#39;,&#39;k&#39;,&#39;#7FFFD4&#39;, &#39;#7FFFD4&#39;,&#39;#7FFFD4&#39;, &#39;#7FFFD4&#39;,&#39;w&#39;,&#39;k&#39;,
               &#39;#87CEFA&#39;, &#39;#87CEFA&#39;, &#39;#87CEFA&#39;, &#39;#87CEFA&#39;,&#39;w&#39;,&#39;k&#39;,&#39;#87CEFA&#39;, &#39;#87CEFA&#39;, &#39;#87CEFA&#39;, &#39;#87CEFA&#39;,&#39;w&#39;,&#39;k&#39;,
               &#39;#00BFFF&#39;, &#39;#00BFFF&#39;, &#39;#00BFFF&#39;, &#39;#00BFFF&#39;,&#39;w&#39;,&#39;k&#39;,&#39;#00BFFF&#39;, &#39;#00BFFF&#39;, &#39;#00BFFF&#39;, &#39;#00BFFF&#39;,&#39;w&#39;,&#39;k&#39;]

for i, line in enumerate(ax.lines):
    line.set_color(line_colors[i])
    line.set_linewidth(0.7)

# 스타일 정리
ax.set_title(&#39;Spend (10k KRW) by Gender&#39;, color=&#39;w&#39;)
ax.set_xlabel(&#39;Gender&#39;, color=&#39;w&#39;)
ax.set_ylabel(&#39;Spend (10k KRW)&#39;, color=&#39;w&#39;)
ax.tick_params(colors=&#39;w&#39;)
ax.grid(axis=&#39;y&#39;, color=&#39;lightgray&#39;, linewidth=0.3)
plt.show()</code></pre>
<table align="center">
  <tr>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/33281538-4d21-4aaa-a794-f8da98256e05/image.png"></td>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/5d1eb5f1-0f13-4d00-b6c0-37b57aeffd21/image.png"></td>
  </tr>
</table>

<hr>
<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 산점도 &quot;</strong></span></p>
</blockquote>
<h2 id="산점도">산점도</h2>
<ul>
<li><span style="background-color: #FAFAD2; font-size:20px;">두 연속형 변수 간의 관계를 시각화하는 데 사용되는 그래프</span></li>
<li><span style="font-size:20px;">두 변수를 좌표평면 위에 점(dot)으로 표시하여 관계와 분포를 한눈에 파악</span></li>
</ul>
<p><span style="font-size:20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">상관 관계 파악 : 인과 관계는 파악할 수 없음</span><ul>
<li><span style="font-size:20px;">양의 상관 관계 : 우상향</span></li>
<li><span style="font-size:20px;">음의 상관 관계 : 우하향</span></li>
<li><span style="font-size:20px;">상관 관계가 없음 : 무작위로 흩어져있음</span></li>
</ul>
</li>
<li><span style="font-size:20px;">패턴 확인</span><ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">선형 / 비선형 관계, 군집(Cluster) 등</span></li>
</ul>
</li>
<li><span style="background-color: #FFDAB9; font-size:20px;">이상치(Outliers) 식별</span><ul>
<li><span style="font-size:20px;">다른 점들과 확연히 떨어져 있는 점들을 쉽게 발견</span></li>
</ul>
</li>
</ul>
<p><span style="font-size:20px;"><strong>장점</strong></span></p>
<ul>
<li><span style="font-size:20px;">직관적이고 이해하기 쉬움</span></li>
<li><span style="font-size:20px;">개별 데이터 포인트 확인 가능</span></li>
<li><span style="font-size:20px;">색상·크기·모양으로 </span><span style="background-color: #CFE4FE; font-size:20px;">다차원 정보 표현 가능</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">이상치 탐지 용이</span></li>
</ul>
<p><span style="font-size:20px;"><strong>단점</strong></span></p>
<ul>
<li><span style="font-size:20px;">데이터가 많으면 점이 겹쳐 혼잡</span></li>
<li><span style="font-size:20px;">정량적 분석 한계 → 통계적 수치 필요</span><ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">실제로 상관계수를 계산해보기 전에는 얼마나 강한 관계인지 알 수 없음, 추정만 가능</span></li>
</ul>
</li>
<li><span style="font-size:20px;">범주형 변수 2개 이상 표현에는 제한적</span></li>
</ul>
<pre><code class="language-python"># 산점도
fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)

colors = [&#39;#7FFFD4&#39;, &#39;#00BFFF&#39;]

sns.scatterplot(data=df, x=&#39;height_cm&#39;, y=&#39;weight_kg&#39;, hue=&#39;gender&#39;, palette=colors, style=&#39;pay_method&#39;)

ax.set_title(&#39;Height vs Weight&#39;, color=&#39;w&#39;)
ax.set_xlabel(&#39;Height (cm)&#39;, color=&#39;w&#39;)
ax.set_ylabel(&#39;Weight (kg)&#39;, color=&#39;w&#39;)
ax.spines[&#39;bottom&#39;].set_color(&#39;w&#39;)
ax.spines[&#39;left&#39;].set_color(&#39;w&#39;)
ax.tick_params(colors=&#39;w&#39;)

# 산점도 행렬
colors = [&#39;#7FFFD4&#39;, &#39;#87CEFA&#39;, &#39;#00BFFF&#39;]
hue_colors = [&#39;#DDA0DD&#39;, &#39;#FFFFE0&#39;]
vars_list = [&#39;height_cm&#39;, &#39;weight_kg&#39;, &#39;spend_10k&#39;]

g = sns.pairplot(df, vars=vars_list, diag_kind=&#39;kde&#39;, hue=&#39;gender&#39;, palette=hue_colors)

g.fig.set_facecolor(&#39;k&#39;)

for ax in g.axes.flatten():
    ax.set_facecolor(&#39;k&#39;)      # subplot 배경
    ax.tick_params(colors=&#39;w&#39;)       # 눈금 색상
    ax.set_xlabel(ax.get_xlabel(), color=&#39;w&#39;)
    ax.set_ylabel(ax.get_ylabel(), color=&#39;w&#39;)
    for spine in ax.spines.values():
        spine.set_color(&#39;w&#39;)

for i in range(len(vars_list)):
    for j in range(len(vars_list)):
        ax = g.axes[i,j]
        color = colors[j] if i!=j else colors[i]  # 대각선과 비대각선 구분
        # 대각선 KDE 선 색상
        if i==j:
            for line in ax.lines:
                line.set_color(color)
            for poly in ax.collections:
                poly.set_facecolor(&#39;none&#39;)  # fill 제거
                poly.set_edgecolor(color)
        else:
            # 산점도 점 색상
            for pathcoll in ax.collections:
                pathcoll.set_edgecolor(color)
                pathcoll.set_facecolor(&#39;none&#39;)
                pathcoll.set_sizes([40])
g.fig.suptitle(&#39;Height vs Weight vs Spend&#39;, color=&#39;w&#39;)</code></pre>
<table align="center">
  <tr>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/801e584a-6e6a-4585-8997-660e76586b57/image.png"></td>
    <td><img src="https://velog.velcdn.com/images/soo_32/post/50df6042-fa8a-4017-8c2a-da656dd899c1/image.png"></td>
  </tr>
</table>

<hr>
<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 선 그래프 &quot;</strong></span></p>
</blockquote>
<h2 id="선-그래프">선 그래프</h2>
<ul>
<li><span style="font-size:20px;">x축 = 시간, y축 = 값, 추세와 패턴을 나타냄</span></li>
<li><span style="background-color: #FAFAD2; font-size:20px;">주로 시간 데이터(시계열)에서 사용</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">트렌드 파악, 계절성/주기성 식별, 이상치 (튀는 날) 탐지</span><ul>
<li><span style="font-size:20px;">일/주/월별 매출 추이, 월별 기온 변화, 일간 트래픽/방문자 수 변화 등</span></li>
</ul>
</li>
</ul>
<p><span style="font-size:20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">변화, 추세 강조</span><ul>
<li><span style="font-size:20px;">시간, 거리, 순서 등에 따라 변화하는 패턴을 보여줌</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">증감 추세선, 패턴(계절성, 주말 효과), 특정 일자 이상치 (갑작스러운 급증/급감)</span></li>
</ul>
</li>
<li><span style="font-size:20px;">여러 변수 비교 가능</span><ul>
<li><span style="font-size:20px;">한 그래프에 여러 선을 그려 서로 다른 변수 또는 그룹 비교</span></li>
</ul>
</li>
<li><span style="background-color: #FFDAB9; font-size:20px;">예측 가능</span><ul>
<li><span style="font-size:20px;">누락된 값 연결, 장기 추세 분석, 단순 예측 가능</span></li>
</ul>
</li>
</ul>
<p><span style="font-size:20px;"><strong>해석</strong></span></p>
<ul>
<li><span style="font-size:20px;">기울기 분석</span><ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">선이 가파르게 상승/하강 → 값이 빠르게 증가/감소</span></li>
<li><span style="font-size:20px;">완만한 상승/하강 → 값이 천천히 증가/감소</span></li>
<li><span style="font-size:20px;">수평 → 변화 없음</span></li>
</ul>
</li>
<li><span style="background-color: #FFDAB9; font-size:20px;">변곡점 확인</span><ul>
<li><span style="font-size:20px;">상승에서 하락으로 전환, 하락에서 상승으로 전환되는 지점</span></li>
<li><span style="font-size:20px;">변화가 발생한 시점 등을 알 수 있음</span></li>
</ul>
</li>
<li><span style="font-size:20px;">패턴 비교</span><ul>
<li><span style="font-size:20px;">여러 선 비교 → 동반 상승/하락, 상관 관계 추정 가능</span></li>
<li><span style="font-size:20px;">계절적 변동(Seasonality) 확인 가능</span></li>
</ul>
</li>
</ul>
<p><span style="font-size:20px;"><strong>장점</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">추세 파악에 최적 : 시간에 따른 변화나 추세 확인</span></li>
<li><span style="font-size:20px;">여러 데이터 비교 용이 : 다중 선으로 그룹 간 비교 가능</span></li>
<li><span style="font-size:20px;">누적·비율 표현 가능 : 누적 선 그래프로 전체 변화와 구성 확인</span></li>
</ul>
<p><span style="font-size:20px;"><strong>단점</strong></span></p>
<ul>
<li><span style="font-size:20px;">데이터가 많으면 선이 복잡해지고 읽기 어려움</span></li>
<li><span style="font-size:20px;">개별 값보다 추세에 초점 → </span><span style="background-color: #FFDAB9; font-size:20px;">세부 관찰에는 한계</span></li>
<li><span style="font-size:20px;">급격한 변화나 이상치 시각화는 산점도보다 직관적이지 않음</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">범주형 데이터에는 적합하지 않음 (순서 있는 연속형에 최적)</span></li>
</ul>
<pre><code class="language-python">import matplotlib.dates as mdates

fig = plt.figure(figsize=(8,6), facecolor=&#39;k&#39;)
ax= fig.add_subplot()
ax.patch.set_facecolor(&#39;k&#39;)
colors = [&#39;#7FFFD4&#39;, &#39;#00BFFF&#39;]

plt.plot(ts.index, ts[&#39;visitors&#39;], color=&#39;#7FFFD4&#39;)
ax.set_title(&#39;Daily Visitors Trend&#39;, color=&#39;w&#39;)
ax.set_xlabel(&#39;Date&#39;, color=&#39;w&#39;)
ax.set_ylabel(&#39;Visitors&#39;, color=&#39;w&#39;)
ax.tick_params(colors=&#39;w&#39;)
ax.spines[&#39;bottom&#39;].set_color(&#39;w&#39;)
ax.spines[&#39;left&#39;].set_color(&#39;w&#39;)

# 날짜 포맷 지정 (예: &#39;2025-06-01&#39;, &#39;2025-07-01&#39; …)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter(&#39;%Y-%m-%d&#39;))

# 눈금 간격 (예: 한 달 단위)
plt.gca().xaxis.set_major_locator(mdates.MonthLocator())

plt.tight_layout()
plt.show()  </code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/a548d740-1cf6-4550-b0be-0ea1ed56e1a5/image.png">

<hr>
<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 히트맵 &quot;</strong></span></p>
</blockquote>
<h2 id="히트맵">히트맵</h2>
<ul>
<li><span style="background-color: #FAFAD2; font-size:20px;">데이터를 색상으로 시각화한 2차원 그래프</span></li>
<li><span style="font-size:20px;">색의 농도나 색상으로 값의 크기를 표현</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">주로 값의 크기 비교, 패턴, 상관관계 시각화에 활용</span></li>
</ul>
<p><span style="font-size:20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">수치의 크기에 따라 색이 변하며, 시각적으로 빠르게 비교 가능</span></li>
<li><span style="font-size:20px;">행과 열로 구성된 2차원 그래프</span></li>
<li><span style="font-size:20px;">특정 구간에서 값이 집중되거나 패턴이 반복되는지 쉽게 확인</span></li>
</ul>
<p><span style="font-size:20px;"><strong>해석</strong></span></p>
<ul>
<li><span style="font-size:20px;">색상 농도 비교</span><ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">진한 색 → 값이 크거나 강함, 연한 색 → 값이 작거나 약함</span></li>
</ul>
</li>
<li><span style="font-size:20px;">패턴 확인</span><ul>
<li><span style="font-size:20px;">반복적인 색 배열 → 주기성, 군집 등 패턴 발견 가능</span></li>
</ul>
</li>
<li><span style="font-size:20px;">이상치 탐지</span><ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">주변 색과 크게 다른 색 → 극단값 또는 특이점</span></li>
</ul>
</li>
</ul>
<p><span style="font-size:20px;"><strong>장점</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">패턴과 관계 직관적 확인 가능</span></li>
<li><span style="font-size:20px;">값 비교 용이 : 숫자를 확인하지 않아도 색으로 크기 파악 가능</span></li>
<li><span style="font-size:20px;">상관관계, 빈도, 집중 구간 등 다양한 분석 활용</span></li>
</ul>
<p><span style="font-size:20px;"><strong>단점</strong></span></p>
<ul>
<li><span style="font-size:20px;">정확한 값 확인 어려움 : 색상만으로는 숫자 값 파악 제한</span></li>
<li><span style="font-size:20px;">색상 선택 민감: 색 대비가 부족하면 해석 어려움</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">범주형 변수보다는 수치형 데이터에 최적화</span></li>
</ul>
<pre><code class="language-python">import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
import numpy as np
import pandas as pd

# 예시 데이터
np.random.seed(0)
data = np.random.rand(3,3)
df = pd.DataFrame(data, columns=[&#39;height_cm&#39;, &#39;weight_kg&#39;, &#39;spend_10k&#39;])

# 상관행렬 계산
corr = df.corr()

# 사용자 색상
colors = [&#39;#7FFFD4&#39;, &#39;#87CEFA&#39;, &#39;#00BFFF&#39;]
cmap = LinearSegmentedColormap.from_list(&quot;custom_cmap&quot;, colors)

# 히트맵
fig, ax = plt.subplots(figsize=(8,6))
sns.heatmap(corr, annot=True, fmt=&quot;.2f&quot;, vmin=-0.15, vmax=0.1, center=0,
            cmap=cmap, ax=ax, cbar_kws={&quot;label&quot;: &quot;Correlation&quot;})

# dark theme
fig.set_facecolor(&#39;k&#39;)
ax.set_facecolor(&#39;k&#39;)

# x/y tick label (변수명) 흰색
ax.set_xticklabels(ax.get_xticklabels(), color=&#39;w&#39;)
ax.set_yticklabels(ax.get_yticklabels(), color=&#39;w&#39;)

# tick, spine
ax.tick_params(colors=&#39;w&#39;, which=&#39;both&#39;)
for spine in ax.spines.values():
    spine.set_color(&#39;w&#39;)

# 컬러바
cbar = ax.collections[0].colorbar
cbar.ax.yaxis.set_tick_params(color=&#39;w&#39;)
plt.setp(cbar.ax.yaxis.get_ticklabels(), color=&#39;w&#39;)
cbar.outline.set_edgecolor(&#39;w&#39;)

# title
ax.set_title(&#39;Height vs Weight vs Spend&#39;, color=&#39;w&#39;, fontsize=14)

plt.show()</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/27d70434-10ba-49a1-b7b4-7b762b5ffad3/image.png">

<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[통계 뿌시기 - 헷갈리는 개념 (중심극한정리, 표본/표준오차)]]></title>
            <link>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%ED%97%B7%EA%B0%88%EB%A6%AC%EB%8A%94-%EA%B0%9C%EB%85%90-%EC%A4%91%EC%8B%AC%EA%B7%B9%ED%95%9C%EC%A0%95%EB%A6%AC-%ED%91%9C%EB%B3%B8%ED%91%9C%EC%A4%80%EC%98%A4%EC%B0%A8</link>
            <guid>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%ED%97%B7%EA%B0%88%EB%A6%AC%EB%8A%94-%EA%B0%9C%EB%85%90-%EC%A4%91%EC%8B%AC%EA%B7%B9%ED%95%9C%EC%A0%95%EB%A6%AC-%ED%91%9C%EB%B3%B8%ED%91%9C%EC%A4%80%EC%98%A4%EC%B0%A8</guid>
            <pubDate>Wed, 17 Sep 2025 22:09:44 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 중심극한정리 &quot;</strong></span></p>
</blockquote>
<h2 id="중심극한정리">중심극한정리</h2>
<p><span style="font-size:20px;">모집단에서 표본을 추출하여 평균을 구하는 과정을 반복하다보면, <span style="background-color: #FAFAD2; font-size:20px;"><strong>표본의 크기가 충분히 클 때 표본평균들의 분포는 정규분포에 가까워짐</strong></span></p>
<p><span style="font-size:20px;"><strong>중요성</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">모집단의 분포와 상관없이 모집단의 평균에 대한 추론이 가능</span></li>
</ul>
<p><span style="font-size:20px;"><strong>유의할 점</strong></span></p>
<ul>
<li><span style="background-color: #FFDAB9; font-size:20px;"><strong>표본 ≉ 정규분포, 표본평균들 ≈ 정규분포</strong></span></li>
</ul>
<p><span style="font-size:20px;"><strong>필수 조건</strong></span></p>
<ul>
<li><span style="font-size:20px;">표본들이 서로 독립이어야 함</span></li>
<li><span style="font-size:20px;">모집단의 평균과 분산이 유한해야 함</span></li>
<li><span style="font-size:20px;">표본 크기가 충분히 커야 함</span></li>
</ul>
<p><span style="font-size:20px;"><strong>예시</strong></span></p>
<ul>
<li><span style="font-size:20px;">주사위 던지기</span><ul>
<li><span style="font-size:20px;">주사위 1개 : 1,2,3,4,5,6 균등하게 나옴 → 정규분포 아님</span></li>
<li><span style="font-size:20px;">주사위 30개 : 대부분 3~4에 몰림 → 정규분포에 가까움</span></li>
<li><span style="font-size:20px;">주사위 100개 : 거의 항상 3~5 근처 → 더욱 정규분포에 가까움</span></li>
</ul>
</li>
</ul>
<p><span style="font-size:20px;"><strong>오해할 만한 사항</strong></span></p>
<ul>
<li><span style="font-size:20px;">오해 1: 표본이 정규분포를 따른다</span><ul>
<li><span style="background-color: #FFDAB9; font-size:20px;"><strong>표본은 그대로, 표본평균의 분포가 정규분포를 따름</strong></span></li>
</ul>
</li>
<li><span style="font-size:20px;">오해 2: 많이 반복하면 정규분포가 된다</span><ul>
<li><span style="font-size:20px;">표본의 크기가 클수록 정규분포에 가까워짐</span></li>
<li><span style="background-color: #CFE4FE; font-size:20px;">반복 횟수는 분포 모양에 영향을 주지 않음</span></li>
</ul>
</li>
<li><span style="font-size:20px;">오해 3: 표본의 모든 통계량이 정규분포를 따른다</span><ul>
<li><span style="font-size:20px;">표본의 평균 또는 합계에만 적용됨</span></li>
</ul>
</li>
<li><span style="font-size:20px;">오해 4: 표본의 크기가 30개면 무조건 충분하다</span><ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">30은 경험적 기준일 뿐, <strong>개별 데이터의 분포에 따라 충분한 표본의 크기는 달라짐</strong></span><ul>
<li><span style="font-size:20px;">대칭 분포 : 2~30개도 충분히 큼</span></li>
<li><span style="font-size:20px;">심하게 치우친 분포 : 100개 이상 필요</span></li>
<li><span style="font-size:20px;">이상치가 많은 분포 : 수백 개 필요할 수도 있음</span></li>
</ul>
</li>
</ul>
</li>
</ul>
<p><span style="font-size:20px;"><strong>활용</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">신뢰구간 계산, 가설검정 등</span></li>
</ul>
<hr>
<blockquote>
<p><span style="font-size:35px;"><strong>&quot; 표본오차와 표준오차 &quot;</strong></span></p>
</blockquote>
<h2 id="표본오차sampling-error">표본오차(Sampling Error)</h2>
<p><span style="background-color: #CFE4FE; font-size:20px;">특정 표본의 통계량과 모집단의 모수 간의 실제 차이</span></p>
<p><span style="font-size:20px;"><strong>예시</strong></span></p>
<ul>
<li><span style="font-size:20px;">모집단 평균 키 : 170cm</span></li>
<li><span style="font-size:20px;">표본 평균 키 : 168cm</span></li>
<li><span style="font-size:20px;">표본 오차 : -2cm</span></li>
</ul>
<p><span style="font-size:20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">모집단의 모수를 알아야만 계산 가능 (현실적으로 불가능)</span></li>
<li><span style="font-size:20px;">표본마다 다른 값을 가짐</span></li>
<li><span style="font-size:20px;">우연에 의해 발생하는 실제 오차</span></li>
</ul>
<h2 id="표준오차standard-error-se">표준오차(Standard Error, SE)</h2>
<p><span style="background-color: #CFE4FE; font-size:20px;">표본 통계량(주로 표본평균)들의 모평균에 대한 표준편차</span></p>
<p><span style="font-size:20px;">동일한 크기의 표본을 무한히 추출했을 때, 그 표본평균들이 얼마나 퍼져있는지를 나타냄</span></p>
<p><span style="font-size:20px;"><strong>계산방법</strong></span></p>
<ul>
<li><span style="font-size:20px;">문제 : 실제로는 표본을 한 번만 뽑기 때문에 일일히 계산 불가능</span></li>
<li><span style="font-size:20px;">해결 : </span><span style="background-color: #CFE4FE; font-size:20px;">중심극한정리에 의해 증명된 공식 사용</span><ul>
<li><span style="background-color: #FFDAB9; font-size:20px;">SE = σ/√n</span><span style="font-size:20px;"> (σ: 모집단 표준편차, n: 표본 크기)</span></li>
<li><span style="background-color: #FFDAB9; font-size:20px;">SE = s/√n</span><span style="font-size:20px;"> (s: 표본 표준편차, n: 표본 크기)</span><ul>
<li><span style="font-size:20px;">모집단의 표준편차를 모를 때</span></li>
</ul>
</li>
</ul>
</li>
<li><span style="font-size:20px;">계산식</span>
<img src="https://velog.velcdn.com/images/soo_32/post/1094b096-8dcb-442c-b1b9-1ce7bf068634/image.png" alt=""><ul>
<li><span style="font-size:20px;">독립인 이유 : 표본이 무작위랜덤추출이기 때문</span></li>
</ul>
</li>
</ul>
<p><span style="font-size:20px;"><strong>활용 (신뢰구간 계산)</strong></span></p>
<ul>
<li><span style="font-size:20px;">1,000명의 학생 중 100명의 표본 조사</span><ul>
<li><span style="font-size:20px;">표본 평균 : 73점</span></li>
<li><span style="font-size:20px;">표본 표준편차 : 10점</span></li>
<li><span style="font-size:20px;">표준 오차 = 10/√100 = 1점</span></li>
</ul>
</li>
<li><span style="font-size:20px;">해석</span><ul>
<li><span style="font-size:20px;">만약 100명씩 여러 번 추출한다면, 그 평균들의 표준편차가 약 1점</span></li>
<li><span style="font-size:20px;">95% 신뢰구간 : 73 ± Z * SE = 73 ± Z = 약 71~75점</span></li>
<li><span style="font-size:20px;">실제 모집단 평균이 71~75점 구간에 있을 확률이 95%</span></li>
</ul>
</li>
</ul>
<h2 id="표본-오차와-표준-오차의-핵심-차이점">표본 오차와 표준 오차의 핵심 차이점</h2>
<ul>
<li><span style="font-size:20px;">표본 오차는 실제 발생한 오차</span><ul>
<li><span style="font-size:20px;">표준 오차는 오차의 기대되는 변동성</span></li>
</ul>
</li>
<li><span style="font-size:20px;">표본 오차의 값은 표본마다 다름</span><ul>
<li><span style="background-color: #FFDAB9; font-size:20px;"><strong>표준 오차의 값은 표본의 개수가 동일하면 고정된 값</strong></span></li>
</ul>
</li>
<li><span style="font-size:20px;">표본 오차를 구하기 위해서는 모집단의 모수가 필요</span><ul>
<li><span style="background-color: #CFE4FE; font-size:20px;">표준 오차는 표본만으로 추정 가능</span></li>
</ul>
</li>
<li><span style="font-size:20px;">표본 오차는 실제 통계에서 활용되지 않음 (모수를 알아야만 구할 수 있기 때문)</span><ul>
<li><span style="font-size:20px;">표준 오차는 신뢰구간, 가설검정 등에 활용됨</span></li>
</ul>
</li>
</ul>
<p><span style="font-size:20px;"><strong>요약</strong></span></p>
<ul>
<li><span style="font-size:20px;">표본 오차 : &quot;이번에 뽑은 표본이 실제와 얼마나 빗나갔나&quot;</span></li>
<li><span style="font-size:20px;">표준 오차 : &quot;표본을 여러 번 뽑는다면 평균적으로 얼마나 빗나갈 것으로 예상되는가&quot;</span></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[통계 뿌시기 - 상관관계]]></title>
            <link>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EC%83%81%EA%B4%80%EA%B4%80%EA%B3%84</link>
            <guid>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EC%83%81%EA%B4%80%EA%B4%80%EA%B3%84</guid>
            <pubDate>Wed, 17 Sep 2025 14:22:02 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 상관관계 &quot;</strong></span></p>
</blockquote>
<h2 id="상관관계correlation">상관관계(Correlation)</h2>
<p><span style="background-color: #FFFACD; font-size: 20px;">두 변수 간에 어느 한 변수가 변하면 다른 변수가 함께 변하는 경향이 있는 관계</span></p>
<p><span style="background-color: #FFDAB9; font-size: 20px;"><strong>상관관계 ≠ 인과관계</strong></span></p>
<p><span style="font-size: 20px;">&quot;관련이 있다&quot;는 의미, 반드시 &quot;원인-결과(인과관계)&quot;를 의미하지 않음</span></p>
<p><span style="font-size: 20px;"><strong>종류</strong></span></p>
<ul>
<li><span style="font-size: 20px;">양의 상관관계 : X가 증가하면 Y도 증가하는 관계</span><ul>
<li><span style="font-size: 20px;">공부 시간 ↑ → 시험 점수 ↑</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">음의 상관관계 : X가 증가하면 Y는 감소하는 관계</span><ul>
<li><span style="font-size: 20px;">운동 시간 ↑ → 체지방률 ↓</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">무상관 : 두 변수 간 변화가 관련 없음</span><ul>
<li><span style="font-size: 20px;">신발 사이즈 ↔ IQ</span></li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 상관계수 &quot;</strong></span></p>
</blockquote>
<h2 id="상관계수correlation-coefficient">상관계수(Correlation Coefficient)</h2>
<p><span style="background-color: #FAFAD2; font-size: 20px;">두 변수 간 <strong>선형적 관계의 강도와 방향을 수치</strong>로 나타낸 값</span></p>
<p><span style="font-size: 20px;"><strong>해석</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;">r = 1 : 완벽한 양의 선형 관계</span><ul>
<li><span style="font-size: 20px;">X가 증가하면 Y도 정확히 일정 비율로 증가</span></li>
</ul>
</li>
<li><span style="background-color: #CFE4FE; font-size: 20px;">r = -1 : 완벽한 음의 선형 관계</span><ul>
<li><span style="font-size: 20px;">X가 증가하면 Y는 정확히 일정 비율로 감소</span></li>
</ul>
</li>
<li><span style="background-color: #CFE4FE; font-size: 20px;">r = 0 : 선형적 관계 없음</span><ul>
<li><span style="font-size: 20px;">비선형 관계는 존재할 수 있음</span></li>
</ul>
</li>
</ul>
<p><span style="font-size: 20px;"><strong>종류</strong></span></p>
<ul>
<li><span style="font-size: 20px;">피어슨 상관계수 : 두 변수의 선형 관계 측정</span><ul>
<li><span style="font-size: 20px;">연속형 변수, 정규성 가정 필요</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">스피어만 상관계수 : 두 변수의 순위 일관성 측정</span><ul>
<li><span style="font-size: 20px;">비모수적, 이상치에 강함</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">켄달의 타우 : 두 변수 간 순위 일치 쌍 및 불일치 쌍 측정</span><ul>
<li><span style="font-size: 20px;">비모수적, 순위형 변수에 자주 사용</span></li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 피어슨 상관계수 &quot;</strong></span></p>
</blockquote>
<h2 id="피어슨-상관계수pearson-correlation">피어슨 상관계수(Pearson correlation)</h2>
<p><span style="background-color: #CFE4FE; font-size: 20px;">두 연속형 변수 간 <strong>선형(직선) 관계</strong></span><span style="font-size: 20px;">의 강도와 방향을 측정</span></p>
<p><span style="font-size: 20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="font-size: 20px;">측정 대상 : 연속형, 등간/비율 척도</span></li>
<li><span style="font-size: 20px;">관계 형태 : 선형 관계</span></li>
<li><span style="font-size: 20px;">분포 가정 : <span style="background-color: #FFDAB9; font-size: 20px;">정규성 필요 (추론 시)</span></li>
<li><span style="background-color: #FFDAB9; font-size: 20px;"><strong>이상치 영향 : 민감</strong></span></li>
<li><span style="font-size: 20px;">장점: 해석 직관적(−1~1), 표준화되어 비교 쉬움</span></li>
<li><span style="font-size: 20px;">단점: 비선형 관계·순위 관계는 못 잡음, 이상치에 취약</span></li>
</ul>
<pre><code class="language-python"># 예시 데이터 생성
np.random.seed(0)
study_hours = np.random.rand(100) * 10
exam_scores = 3 * study_hours + np.random.randn(100) * 5

# 데이터프레임 생성
df = pd.DataFrame({&#39;Study Hours&#39;: study_hours, &#39;Exam Scores&#39;: exam_scores})

# 피어슨 상관계수 계산
pearson_corr, _ = pearsonr(df[&#39;Study Hours&#39;], df[&#39;Exam Scores&#39;])
print(f&quot;피어슨 상관계수: {pearson_corr}&quot;)

# 상관관계 히트맵 시각화
sns.heatmap(df.corr(), annot=True, cmap=&#39;coolwarm&#39;, vmin=-1, vmax=1)
plt.title(&#39;pearson coefficient heatmap&#39;)
plt.show()</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/579948a4-c194-484f-bb65-b80121465e70/image.png" />

<hr>
<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 비모수 상관계수 &quot;</strong></span></p>
</blockquote>
<h2 id="비모수-상관계수">비모수 상관계수</h2>
<p><span style="background-color: #FAFAD2; font-size: 20px;">데이터 <strong>분포에 대한 가정이 필요 없는</strong> 상관계수,</span><span style="font-size: 20px;"> 스피어만, 켄달 타우 등</span></p>
<p><span style="font-size: 20px;"><strong>활용</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;">데이터가 정규성을 따르지 않을 때</span></li>
<li><span style="font-size: 20px;">변수 간 관계가 </span><span style="background-color: #CFE4FE; font-size: 20px;">곡선 / 단조 관계일 때</span></li>
<li><span style="font-size: 20px;"><span style="background-color: #CFE4FE; font-size: 20px;">순위형 / 서열형 자료</span><span style="font-size: 20px;">를 분석할 때</span></li>
<li><span style="font-size: 20px;">이상치가 존재하거나 </span><span style="background-color: #CFE4FE; font-size: 20px;">극단값이 많을 때</span></li>
</ul>
<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 스피어만 상관계수 &quot;</strong></span></p>
</blockquote>
<h2 id="스피어만-상관계수spearman-correlation">스피어만 상관계수(Spearman correlation)</h2>
<p><span style="font-size: 20px;">관측치를 순위로 바꾸어 </span><span style="background-color: #FAFAD2; font-size: 20px;">두 변수의 <strong>순위 간의 일관성</strong> 측정</span><span style="font-size: 20px;">, 단조(monotonic) 관계 감지에 적합</span></p>
<p><span style="font-size: 20px;">단조 관계 : 한 변수가 증가할 때 다른 변수도 계속 증가하거나 계속 감소하는 관계</span></p>
<p><span style="font-size: 20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="font-size: 20px;">측정 대상 : 순위형, 연속형도 가능</span></li>
<li><span style="font-size: 20px;">관계 형태 : 단조 관계</span></li>
<li><span style="font-size: 20px;">분포 가정 : 비모수, 분포 자유</span></li>
<li><span style="font-size: 20px;">이상치 영향 : 덜 민감</span></li>
<li><span style="font-size: 20px;">장점: 비모수적(정규성 불필요), 비선형 단조 관계에도 의미 있음</span></li>
<li><span style="font-size: 20px;">단점: 순위 변환으로 정보 일부 손실 가능, </span><span style="background-color: #CFE4FE; font-size: 20px;">켄달 타우보다 데이터 내 편차와 에러에 민감</span></li>
</ul>
<pre><code class="language-python"># 예시 데이터 생성
np.random.seed(0)
customer_satisfaction = np.random.rand(100)
repurchase_intent = 3 * customer_satisfaction + np.random.randn(100) * 0.5

# 데이터프레임 생성
df = pd.DataFrame({&#39;Customer Satisfaction&#39;: customer_satisfaction, &#39;Repurchase Intent&#39;: repurchase_intent})

# 스피어만 상관계수 계산
spearman_corr, _ = spearmanr(df[&#39;Customer Satisfaction&#39;], df[&#39;Repurchase Intent&#39;])
print(f&quot;스피어만 상관계수: {spearman_corr}&quot;)

# 상관관계 히트맵 시각화
sns.heatmap(df.corr(method=&#39;spearman&#39;), annot=True, cmap=&#39;coolwarm&#39;, vmin=-1, vmax=1)
plt.title(&#39;spearman coefficient heatmap&#39;)
plt.show()</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/7e585679-bdee-4c03-898c-5d7ceb2e5c92/image.png" />

<hr>
<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 켄달 타우 상관계수 &quot;</strong></span></p>
</blockquote>
<h2 id="켄달-타우-상관계수kendalls-tau">켄달 타우 상관계수(Kendall’s Tau)</h2>
<p><span style="background-color: #FAFAD2; font-size: 20px;">관측치 <strong>쌍들 간 비율</strong>로 정의되는 순위상관 계수</span></p>
<p><span style="font-size: 20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="font-size: 20px;">측정 대상 : 순위형, 연속형도 가능</span></li>
<li><span style="font-size: 20px;">관계 형태 : 단조 관계</span></li>
<li><span style="font-size: 20px;">분포 가정 : 비모수, 분포 자유</span></li>
<li><span style="font-size: 20px;">이상치 영향 : 거의 영향 없음</span></li>
<li><span style="background-color: #CFE4FE; font-size: 20px;">장점 : 해석이 직관적(쌍들의 일치·불일치 비율), 표본 작을 때 더 신뢰 가능</span></li>
<li><span style="font-size: 20px;">단점 : 계산 비용(쌍 비교)·동점 처리 복잡</span></li>
</ul>
<pre><code class="language-python"># 예시 데이터 생성
np.random.seed(0)
customer_satisfaction = np.random.rand(100)
repurchase_intent = 3 * customer_satisfaction + np.random.randn(100) * 0.5

# 데이터프레임 생성
df = pd.DataFrame({&#39;Customer Satisfaction&#39;: customer_satisfaction, &#39;Repurchase Intent&#39;: repurchase_intent})

# 켄달의 타우 상관계수 계산
kendall_corr, _ = kendalltau(df[&#39;Customer Satisfaction&#39;], df[&#39;Repurchase Intent&#39;])
print(f&quot;켄달의 타우 상관계수: {kendall_corr}&quot;)

# 상관관계 히트맵 시각화
sns.heatmap(df.corr(method=&#39;kendall&#39;), annot=True, cmap=&#39;coolwarm&#39;, vmin=-1, vmax=1)
plt.title(&#39;kendall coefficient heatmap&#39;)
plt.show()</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/bef41c96-aca2-4558-bac8-8da4979836d1/image.png" />

<hr>
<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 상호정보량 &quot;</strong></span></p>
</blockquote>
<h2 id="상호정보량mutual-information">상호정보량(Mutual Information)</h2>
<p><span style="font-size: 20px;">상관의 비선형 일반화, </span><span style="background-color: #FAFAD2; font-size: 20px;">두 변수 X, Y가 서로 <strong>얼마나 정보를 공유</strong>하는지</span><span style="font-size: 20px;">를 수치로 나타낸 것</span></p>
<p><span style="font-size: 20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="font-size: 20px;">선형/비선형 관계 모두 측정 가능</span></li>
<li><span style="font-size: 20px;">범주형 데이터에 대해서도 적용 가능</span></li>
<li><span style="font-size: 20px;">값 해석: 절대 값으로 해석하기보다는 상대적 크기 비교에 적합</span></li>
<li><span style="font-size: 20px;">독립성 판정: MI = 0이면 X와 Y는 독립</span></li>
<li><span style="background-color: #CFE4FE; font-size: 20px;">장점 : 비선형 관계 / 단조 관계 / 복잡한 의존성까지 포착 가능, 연속형/범주형 모두 적용 가능</span></li>
<li><span style="background-color: #CFE4FE; font-size: 20px;">단점 : 수치가 직관적이지 않아 해석이 어렵다,</span><span style="font-size: 20px;"> 확률분포를 추정해야 하므로 표본 수가 적으면 불안정</span></li>
</ul>
<pre><code class="language-python"># 범주형 예제 데이터
X = np.array([&#39;cat&#39;, &#39;dog&#39;, &#39;cat&#39;, &#39;cat&#39;, &#39;dog&#39;, &#39;dog&#39;, &#39;cat&#39;, &#39;dog&#39;, &#39;dog&#39;, &#39;cat&#39;])
Y = np.array([&#39;high&#39;, &#39;low&#39;, &#39;high&#39;, &#39;high&#39;, &#39;low&#39;, &#39;low&#39;, &#39;high&#39;, &#39;low&#39;, &#39;low&#39;, &#39;high&#39;])

# 상호 정보량 계산
mi = mutual_info_score(X, Y)
print(f&quot;Mutual Information (categorical): {mi:.3f}&quot;)</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/2b5602bf-6bc9-4ad3-b196-8abd9393ee44/image.png" />]]></description>
        </item>
        <item>
            <title><![CDATA[통계 뿌시기 - 회귀]]></title>
            <link>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%ED%9A%8C%EA%B7%80</link>
            <guid>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%ED%9A%8C%EA%B7%80</guid>
            <pubDate>Wed, 17 Sep 2025 13:11:59 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 회귀 &quot;</strong></span></p>
</blockquote>
<h2 id="회귀regression">회귀(Regression)</h2>
<p><span style="background-color: #FAFAD2; font-size: 20px;"><strong>독립 변수(X)가 종속 변수(Y)에 미치는 영향</strong>을 모델링하고, 이를 통해 예측하거나 관계를 이해하는 통계 기법</span></p>
<p><span style="font-size: 20px;"><strong>목표</strong></span></p>
<ul>
<li><span style="font-size: 20px;">데이터 분포를 가장 잘 설명하는 </span><span style="background-color: #FFDAB9; font-size: 20px;"><strong>&#39;최적의 선(Best-fit line)&#39;</strong>을 찾는 것</span><ul>
<li><span style="font-size: 20px;">독립 변수(원인)의 변화에 따라 종속 변수(결과)가 어떻게 변화하는지를 나타냄</span></li>
</ul>
</li>
</ul>
<p><span style="font-size: 20px;"><strong>변수</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;"><strong>독립변수 : X, 원인</strong></span><span style="font-size: 20px;"> → 결과에 영향을 미치는 변수</span></li>
<li><span style="background-color: #CFE4FE; font-size: 20px;"><strong>종속변수 : Y, 결과</strong></span><span style="font-size: 20px;"> → 독립변수의 영향을 받는 변수, 예측하려는 값</span></li>
</ul>
<p><span style="font-size: 20px;"><strong>종류</strong></span></p>
<ul>
<li><span style="font-size: 20px;">선형 회귀</span><ul>
<li><span style="font-size: 20px;">단순 선형 회귀 : 하나의 독립변수, 하나의 종속변수</span></li>
<li><span style="font-size: 20px;">다중 선형 회귀 : 2개 이상의 독립변수, 하나의 종속변수</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">로지스틱 회귀</span><ul>
<li><span style="font-size: 20px;">종속 변수가 범주형 데이터</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">비선형 회귀</span><ul>
<li><span style="font-size: 20px;">다항 회귀 : 데이터의 관계가 직선이 아닌 곡선 형태</span></li>
<li><span style="font-size: 20px;">스플라인 회귀 : 구간별 다항식을 적용하여 지그재그 형태</span></li>
</ul>
</li>
</ul>
<hr>
<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 선형 회귀 &quot;</strong></span></p>
</blockquote>
<h2 id="선형-회귀">선형 회귀</h2>
<p><span style="font-size: 20px;">독립 변수(X)가 종속 변수(Y)에 미치는 영향을 <span style="background-color: #FFDAB9; font-size: 20px;"><strong>직선(선형)으로 모델링</strong>하는 방법</span></p>
<p><span style="font-size: 20px;"><strong>가정(공통 전제 조건)</strong></span></p>
<ul>
<li><span style="font-size: 20px;"><strong>선형성</strong></span><span style="font-size: 20px;"> : X와 Y 관계가 선형적</span></li>
<li><span style="font-size: 20px;"><strong>독립성</strong></span><span style="font-size: 16px;"> : 오차들이 서로 독립</span></li>
<li><span style="font-size: 20px;"><strong>등분산성</strong></span><span style="font-size: 16px;"> : 오차 분산이 일정</span></li>
<li><span style="font-size: 20px;"><strong>정규성</strong></span><span style="font-size: 16px;"> : 오차가 정규분포를 따름</span></li>
<li><span style="font-size: 20px;"><strong>다중공선성 없음(다중회귀 전용)</strong></span><span style="font-size: 20px;"> : 독립 변수들끼리 강하게 상관되지 않아야 함</span></li>
</ul>
<h2 id="단순-선형-회귀">단순 선형 회귀</h2>
<p><span style="font-size: 20px;"><strong>회귀식</strong></span></p>
<ul>
<li><span style="font-size: 20px;">Y = β0 + β1X + ϵ</span></li>
<li><span style="font-size: 20px;">β0 = 절편, β1 = 기울기, ϵ = 오차항</span></li>
</ul>
<p><span style="font-size: 20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;"><strong>한 가지 요인이 결과에 얼마나 영향을 주는지</strong></span></li>
<li><span style="font-size: 20px;">데이터가 직선적 경향을 따를 때 사용</span></li>
<li><span style="font-size: 20px;">간단하고 해석이 용이함</span></li>
</ul>
<p><span style="font-size: 20px;"><strong>사례</strong></span></p>
<ul>
<li><span style="font-size: 20px;">광고비와 매출 간의 관계 분석</span><ul>
<li><span style="font-size: 20px;">현재의 광고비를 바탕으로 예상되는 매출을 예측 가능</span><pre><code class="language-python"># 예시 데이터 생성
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
</code></pre>
</li>
</ul>
</li>
</ul>
<h1 id="데이터-분할">데이터 분할</h1>
<p>X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)</p>
<h1 id="단순선형회귀-모델-생성-및-훈련">단순선형회귀 모델 생성 및 훈련</h1>
<p>model = LinearRegression()
model.fit(X_train, y_train)</p>
<h1 id="예측">예측</h1>
<p>y_pred = model.predict(X_test)</p>
<h1 id="회귀-계수-및-절편-출력">회귀 계수 및 절편 출력</h1>
<p>print(f&quot;회귀 계수: {model.coef_[0,0]:.3f}&quot;)
print(f&quot;절편: {model.intercept_[0]:.3f}&quot;)</p>
<h1 id="모델-평가">모델 평가</h1>
<p>mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f&quot;평균 제곱 오차(MSE): {mse:.3f}&quot;)
print(f&quot;결정 계수(R2): {r2:.3f}&quot;)</p>
<h1 id="시각화">시각화</h1>
<p>plt.scatter(X, y, color=&#39;blue&#39;)
plt.plot(X_test, y_pred, color=&#39;red&#39;, linewidth=2)
plt.title(&#39;linear regeression&#39;)
plt.xlabel(&#39;X : cost&#39;)
plt.ylabel(&#39;Y : sales&#39;)
plt.show()</p>
<pre><code>&lt;img src=&quot;https://velog.velcdn.com/images/soo_32/post/7a9ceb59-41c4-4609-ab32-5ac33652be0d/image.png&quot;&gt;

***

## 다중 선형 회귀

&lt;span style=&quot;font-size: 20px;&quot;&gt;**회귀식**&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;Y = β0 + β1X1 + β2X2 + ⋯ + βpXp + ϵ&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;β0 = 절편, β1 = 기울기&lt;/span&gt;

&lt;span style=&quot;font-size: 20px;&quot;&gt;**특징**&lt;/span&gt;
- &lt;span style=&quot;background-color: #CFE4FE; font-size: 20px;&quot;&gt;**여러 요인이 동시에 결과에 어떻게 영향을 주는지**&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;독립변수가 여러개일 때 사용&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;여러 변수의 영향을 동시에 분석할 수 있음&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;변수들 간 다중공선성 문제가 발생할 수 있음&lt;/span&gt;

## 다중공선성
- &lt;span style=&quot;background-color: #FFDAB9; font-size: 20px;&quot;&gt;독립변수들 간에 높은 상관관계가 있는 경우&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;모델의 성능과 해석에 문제를 일으킬 수 있음&lt;/span&gt;
  - &lt;span style=&quot;background-color: #CFE4FE; font-size: 20px;&quot;&gt;각 변수의 개별적인 효과를 분리하기 어려워&lt;/span&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt; 해석이 어려워짐&lt;/span&gt;
  - &lt;span style=&quot;font-size: 20px;&quot;&gt;실제로 중요한 변수가 통계적으로 유의하지 않게 나타날 수 있음&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;진단 방법&lt;/span&gt;
  - &lt;span style=&quot;font-size: 20px;&quot;&gt;변수 간 상관계수 계산&lt;/span&gt;
  - &lt;span style=&quot;background-color: #CFE4FE; font-size: 20px;&quot;&gt;분산팽창지수(VIF) ≥ 10 : 심각한 다중공선성 문제&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;해결 방법&lt;/span&gt;
  - &lt;span style=&quot;font-size: 20px;&quot;&gt;높은 상관계수를 가진 변수 중 하나를 제거&lt;/span&gt;
  - &lt;span style=&quot;font-size: 20px;&quot;&gt;주성분분석(PCA) 등의 차원 축소 방법 적용 등&lt;/span&gt;


&lt;span style=&quot;font-size: 20px;&quot;&gt;**사례**&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;다양한 광고비(TV, Radio, Newspaper)와 매출 간의 관계 분석&lt;/span&gt;
  - &lt;span style=&quot;font-size: 20px;&quot;&gt;현재의 광고비(TV, Radio, Newspaper)를 바탕으로 예상되는 매출을 예측 가능&lt;/span&gt;

```python
# 예시 데이터 생성
data = {&#39;TV&#39;: np.random.rand(100) * 100,
        &#39;Radio&#39;: np.random.rand(100) * 50,
        &#39;Newspaper&#39;: np.random.rand(100) * 30,
        &#39;Sales&#39;: np.random.rand(100) * 100}
df = pd.DataFrame(data)

# 독립 변수(X)와 종속 변수(Y) 설정
X = df[[&#39;TV&#39;, &#39;Radio&#39;, &#39;Newspaper&#39;]]
y = df[&#39;Sales&#39;]

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 다중선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

# 회귀 계수 및 절편 출력
print(f&quot;회귀 계수: {model.coef_[0]:.3f}&quot;)
print(f&quot;절편: {model.intercept_:.3f}&quot;)

# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f&quot;평균 제곱 오차(MSE): {mse:.3f}&quot;)
print(f&quot;결정 계수(R2): {r2:.3f}&quot;)</code></pre><img src="https://velog.velcdn.com/images/soo_32/post/50bdfcc6-ed30-487c-aa4a-2b73bec8a92b/image.png">

<hr>
<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 범주형 회귀 &quot;</strong></span></p>
</blockquote>
<h2 id="범주형-데이터는-인코딩하여-사용">범주형 데이터는 인코딩하여 사용</h2>
<p><span style="font-size: 20px;">순서가 있는 경우 : XL → 3, L → 2, M → 1, S → 0</span>
<span style="font-size: 20px;">순서가 없는 경우 : 부산 = [1,0,0], 대전 = [0,1,0], 서울 = [0,0,1]</span></p>
<pre><code class="language-python"># 예시 데이터 생성
data = {&#39;Gender&#39;: [&#39;Male&#39;, &#39;Female&#39;, &#39;Female&#39;, &#39;Male&#39;, &#39;Male&#39;],
        &#39;Experience&#39;: [5, 7, 10, 3, 8],
        &#39;Salary&#39;: [50, 60, 65, 40, 55]}
df = pd.DataFrame(data)

# 범주형 변수 더미 변수로 변환
df = pd.get_dummies(df, drop_first=True)  # drop_first=True : 범주형 변수 중 1개를 빼는 것 -&gt; male컬럼의 false = female 이므로 female 컬럼이 따로 필요 x, 오히려 있으면 다중공선성 문제 발생할 수 있음

# 독립 변수(X)와 종속 변수(Y) 설정
X = df[[&#39;Experience&#39;, &#39;Gender_Male&#39;]]
y = df[&#39;Salary&#39;]

# 단순선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X, y)

# 예측
y_pred = model.predict(X)

# 회귀 계수 및 절편 출력
print(f&quot;회귀 계수: {model.coef_[0]:.3f}&quot;)
print(f&quot;절편: {model.intercept_:.3f}&quot;)

# 모델 평가
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print(f&quot;평균 제곱 오차(MSE): {mse:.3f}&quot;)
print(f&quot;결정 계수(R2): {r2:.3f}&quot;)</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/a339ae93-fa11-4bb2-be1a-c65c88207eea/image.png">

<h2 id="로지스틱-회귀">로지스틱 회귀</h2>
<p><span style="background-color: #FAFAD2; font-size: 20px;"><strong>종속 변수 Y가 범주형(특히 이항, 0 / 1)일 때</strong> 사용, 분류 모델</span></p>
<p><span style="font-size: 20px;">선형회귀처럼 단순히 직선으로 예측하지 않고, 시그모이드 함수(로짓 함수)를 통해 0~1 사이의 확률로 변환</span></p>
<p><span style="font-size: 20px;"><strong>회귀식</strong></span></p>
<ul>
<li><span style="font-size: 20px;">P(Y=1 ∣ X) = 1 / (1 + e −(β0 + β1X))</span></li>
<li><span style="font-size: 20px;">회귀계수(β) : X가 한 단위 증가할 때 log-odds가 얼마나 변하는지</span></li>
<li><span style="font-size: 20px;">오즈비(Odds Ratio, OR)</span><ul>
<li><span style="font-size: 20px;">OR &gt; 1 : X 증가 시, Y=1일 확률이 커짐</span></li>
<li><span style="font-size: 20px;">OR &lt; 1 → X 증가 시, Y=1일 확률이 줄어듦</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">p-값 : X가 종속 변수에 유의미한 영향을 미치는지 판단</span></li>
<li><span style="background-color: #CFE4FE; font-size: 20px;">적합도 지표 : 정확도, ROC-AUC, 로그우도 등</span></li>
</ul>
<p><span style="font-size: 20px;"><strong>종류</strong></span></p>
<ul>
<li><span style="font-size: 20px;">이항 로지스틱 회귀</span><ul>
<li><span style="font-size: 20px;">Y가 0 / 1</span></li>
<li><span style="font-size: 20px;">합격(1) / 불합격(0), 스팸(1) / 정상(0)</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">다항 로지스틱 회귀</span><ul>
<li><span style="font-size: 20px;">Y가 3개 이상 범주</span></li>
<li><span style="font-size: 20px;">브랜드 선호(A, B, C)</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">순서형 로지스틱 회귀</span><ul>
<li><span style="font-size: 20px;">Y가 순서형 범주</span></li>
<li><span style="font-size: 20px;">고객 만족도 (불만족 &lt; 보통 &lt; 만족)</span></li>
</ul>
</li>
</ul>
<p><span style="font-size: 20px;"><strong>사례</strong></span></p>
<ul>
<li><span style="font-size: 20px;">의학 : 환자가 질병(1) vs 정상(0)</span></li>
<li><span style="font-size: 20px;">마케팅 : 고객이 상품을 구매(1) vs 미구매(0)</span></li>
<li><span style="font-size: 20px;">금융 : 대출 상환(1) vs 연체(0)</span></li>
<li><span style="font-size: 20px;">머신러닝 : 분류 문제(스팸메일 탐지, 고객 이탈 예측 등)</span></li>
</ul>
<pre><code class="language-python">import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 데이터 생성 (공부 시간에 따른 합격 여부)
np.random.seed(0)
X = np.random.randint(1, 10, size=(50, 1))  # 공부 시간
y = (X.flatten() + np.random.randn(50) &gt; 5).astype(int)  # 1=합격, 0=불합격

# 모델 학습
model = LogisticRegression()
model.fit(X, y)

# 예측
y_pred = model.predict(X)

print(&quot;정확도:&quot;, accuracy_score(y, y_pred))
print(f&quot;회귀계수: {model.coef_[0,0]:.3f}&quot;)
print(f&quot;절편: {model.intercept_[0]:.3f}&quot;)</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/5b174671-f18e-4425-bd3c-5cc2ea457a37/image.png" style="display:block; margin:0 auto;" />

<hr>
<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 비선형 회귀 &quot;</strong></span></p>
</blockquote>
<h2 id="비선형-회귀">비선형 회귀</h2>
<p><span style="background-color: #FAFAD2; font-size: 20px;">종속변수 Y와 독립변수 X의 관계가 직선이 아닌 <strong>곡선일 때</strong> 사용</span></p>
<p><span style="font-size: 20px;"><strong>장점</strong> : 현실 데이터를 더 잘 설명해서 </span><span style="background-color: #CFE4FE; font-size: 20px;">선형 모델보다 예측 정확도를 높일 수 있음</span></p>
<p><span style="font-size: 20px;"><strong>단점</strong> : 해석이 어렵고 계산이 복잡하며 과적합의 위험이 있음</span></p>
<h2 id="다항-회귀">다항 회귀</h2>
<p><span style="font-size: 20px;">데이터가 </span><span style="background-color: #FFDAB9; font-size: 20px;"><strong>곡선적 경향</strong></span><span style="font-size: 20px;">을 보일 때 사용</span></p>
<p><span style="font-size: 20px;"><strong>회귀식</strong></span></p>
<ul>
<li><span style="font-size: 20px;">Y=β0 + β1X + β2X2 + β3X3 + ⋯ + βpXp + ϵ</span></li>
</ul>
<p><span style="font-size: 20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;">곡선 관계를 표현할 수 있음</span></li>
<li><span style="font-size: 20px;">구현이 간단 (선형회귀와 동일한 방식, 변수만 X2, X3 등 추가)</span></li>
<li><span style="font-size: 20px;">차수가 커지면 모델이 지나치게 출렁임 </span><span style="background-color: #FFDAB9; font-size: 20px;"><strong>(과적합 위험)</strong></span></li>
<li><span style="font-size: 20px;">데이터 범위 밖에서는 예측이 불안정</span></li>
</ul>
<pre><code class="language-python"># 예시 데이터 생성
np.random.seed(0)
X = 2 - 3 * np.random.normal(0, 1, 100)
y = X - 2 * (X ** 2) + np.random.normal(-3, 3, 100)
X = X[:, np.newaxis]

# 다항 회귀 (2차)
polynomial_features = PolynomialFeatures(degree=2)
X_poly = polynomial_features.fit_transform(X)

model = LinearRegression()
model.fit(X_poly, y)
y_poly_pred = model.predict(X_poly)

# 모델 평가
mse = mean_squared_error(y, y_poly_pred)
r2 = r2_score(y, y_poly_pred)
print(f&quot;평균 제곱 오차(MSE): {mse:.3f}&quot;)
print(f&quot;결정 계수(R2): {r2:.3f}&quot;)

# 시각화
plt.scatter(X, y, s=10)
# 정렬된 X 값에 따른 y 값 예측
sorted_zip = sorted(zip(X, y_poly_pred))
X, y_poly_pred = zip(*sorted_zip)
plt.plot(X, y_poly_pred, color=&#39;m&#39;)
plt.title(&#39;polynomial regerssion&#39;)
plt.xlabel(&#39;area&#39;)
plt.ylabel(&#39;price&#39;)
plt.show()</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/2d7529f8-0557-4af0-8bb5-4b25ba38dafe/image.png" style="display:block; margin:0 auto;" />
<img src="https://velog.velcdn.com/images/soo_32/post/8ab88391-96e0-4660-82a6-53eb0fa33f0f/image.png">


<h2 id="스플라인-회귀">스플라인 회귀</h2>
<p><span style="font-size: 20px;">데이터가 </span><span style="background-color: #FFDAB9; font-size: 20px;"><strong>국부적으로 다른 패턴을 보일 때</strong></span><span style="font-size: 20px;"> 사용</span></p>
<p><span style="font-size: 20px;"><strong>회귀식</strong></span></p>
<ul>
<li><span style="font-size: 20px;">Y = β0 + β1X + β2(X−k)+ + ϵ</span></li>
<li><span style="font-size: 20px;">((X − k)+ : X &gt; k일 때만 값이 있는 함수</span><ul>
<li><span style="font-size: 20px;">즉, X가 특정 구간을 넘어가면 새로운 다항식을 추가</span></li>
</ul>
</li>
</ul>
<p><span style="font-size: 20px;"><strong>특징</strong></span></p>
<ul>
<li><span style="font-size: 20px;">국소적인(curve 부분별) 곡선 적용이 가능</span></li>
<li><span style="font-size: 20px;">데이터의 곡선 구조를 유연하게 반영 가능</span></li>
<li><span style="font-size: 20px;">과적합 위험을 줄이면서도 복잡한 패턴 설명 가능</span></li>
<li><span style="background-color: #CFE4FE; font-size: 20px;"><strong>매듭(knot) 위치를 어떻게 설정하느냐</strong>가 성능에 큰 영향을 줌</span></li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[통계 뿌시기 - 검정]]></title>
            <link>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EA%B2%80%EC%A0%95</link>
            <guid>https://velog.io/@soo_32/%ED%86%B5%EA%B3%84-%EB%BF%8C%EC%8B%9C%EA%B8%B0-%EA%B2%80%EC%A0%95</guid>
            <pubDate>Wed, 17 Sep 2025 03:27:25 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; A / B 검정 &quot;</strong></span></p>
</blockquote>
<h2 id="a--b-검정">A / B 검정</h2>
<p><span style="background-color: #FAFAD2; font-size: 20px;"><strong>A와 B 중 어느 것이 더 효과적인지</strong> 평가하기 위해 사용되는 검정 방법</span></p>
<p><span style="font-size: 20px;"><strong>방법</strong> : 사용자들을 두 그룹으로 나누고 각 그룹에 다른 버전을 제공한 후 반응을 비교</span></p>
<p><span style="font-size: 20px;"><strong>목적</strong> : 두 그룹 간의 변화가 우연이 아니라 </span><span style="background-color: #CFE4FE; font-size: 20px;">통계적으로 유의미한지 확인</span></p>
<p><span style="font-size: 20px;"><strong>사례</strong> : 마케팅, 웹사이트 디자인 등</span></p>
<ul>
<li><span style="font-size: 20px;">전환율, 클릭률, 구매수, 방문 기간, 방문 페이지 수, 특정 페이지 방문 여부, 매출 등의 지표를 비교</span></li>
<li><span style="font-size: 20px;">온라인 쇼핑몰에서 2가지 디자인에 대한 랜딩 페이지를 테스트하여 어떤 디자인이 더 높은 구매 전환율을 가져오는지 평가</span></li>
</ul>
<pre><code class="language-python"># 원칙적으로 Z-검정 or 피셔 정확검정을 사용해야 하나, 간단하게 보여주기 위해 t-test로 진행
# 표본 크기가 크고 전환율이 극단적이지 않다는 가정 -&gt; 이런 경우 t-test 결과는 z-검정 결과와 거의 같음

# 가정된 전환율 데이터
group_a = np.random.binomial(1, 0.30, 100)  # 30% 전환율
group_b = np.random.binomial(1, 0.45, 100)  # 45% 전환율

# t-test를 이용한 비교
t_stat, p_val = stats.ttest_ind(group_a, group_b)
print(f&quot;T-Statistic: {t_stat}, P-value: {p_val}&quot;)</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/0a7defae-a63e-4f53-86a7-4bb81f924d08/image.png">

<hr>
<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 가설 검정 &quot;</strong></span></p>
</blockquote>
<h2 id="가설-검정">가설 검정</h2>
<p><span style="background-color: #FAFAD2; font-size: 20px;">표본 데이터를 통해 모집단의 가설을 검증,</span><span style="font-size: 20px;"> 데이터가 특정 가설을 지지하는지 평가하는 과정</span></p>
<p><span style="font-size: 20px;">귀무가설(H0)과 대립가설(H1)을 설정하고 귀무가설을 기각할지를 결정</span></p>
<ul>
<li><span style="background-color: #FAFAD2; font-size: 20px;"><strong>귀무가설(H0) : 기존에 알고 있는 것</strong></span></li>
<li><span style="background-color: #FAFAD2; font-size: 20px;"><strong>대립가설(H1) : 알고 싶은 것, 알려고 하는 것</strong></span></li>
</ul>
<p><span style="font-size: 20px;">검정을 왜 할까?</span></p>
<ul>
<li><span style="background-color: #FFDAB9; font-size: 20px;"><strong>모수에 대해 어떤 주장(가설)을 세우고, 추정한 값으로 그것이 타당한지 검정하는 것</strong></span><ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;">추정한 값을 이용해서, 모집단에 대한 특정 가설이 표본 데이터와 일치하는지 통계적으로 판단</span></li>
<li><span style="font-size: 20px;">통계량 : 표본의 함수, 표본의 식</span></li>
<li><span style="font-size: 20px;">표본의 추정량 : 특정 모수를 추정하기 위해 사용하는 통계량</span><ul>
<li><span style="font-size: 20px;">불편추정량 : 표본의 기댓값 = 모수</span></li>
<li><span style="font-size: 20px;">일치추정량 : 표본의 크기가 커질수록 추정량이 모수에 수렴</span></li>
<li><span style="font-size: 20px;">유효추정량 : 추정량 중에 분산이 가장 작은 것</span></li>
<li><span style="font-size: 20px;">충분추정량 : 모수에 대한 정보를 가장 많이 담고 있는 추정량</span></li>
</ul>
</li>
</ul>
</li>
</ul>
<p><span style="font-size: 20px;"><strong>방법</strong></span></p>
<ul>
<li><span style="font-size: 20px;">확증적 자료분석</span><span style="font-size: 20px;"> : </span><span style="background-color: #CFE4FE; font-size: 20px;">미리 가설을 세운</span> 다음 검증해 나가는 분석</span></li>
<li><span style="font-size: 20px;">탐색적 자료분석</span><span style="font-size: 20px;"> : </span><span style="background-color: #CFE4FE; font-size: 20px;">미리 가설을 세우지 않고</span><span style="font-size: 20px;"> 데이터를 탐색해보며 가설 후보를 찾고 데이터의 특징을 찾는 것</span></li>
</ul>
<p><span style="font-size: 20px;"><strong>단계</strong></span></p>
<ul>
<li><span style="font-size: 20px;">귀무가설(H0)과 대립가설(H1) 설정</span></li>
<li><span style="font-size: 20px;"><strong>유의수준(ɑ)</strong> 결정</span><ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;">“얼마나 엄격하게 H0을 기각할지”</span><span style="font-size:20px;"> 결정하는 기준값</span></li>
<li><span style="font-size:20px;">H0이 참인데도 잘못 기각할 확률의 최대 허용치</span></li>
<li><span style="font-size:20px;">α = 0.05 → H0이 참이어도, 극단적인 결과로 기각할 확률이 5%다</span></li>
<li><span style="background-color: #CFE4FE; font-size: 20px;">검정의 신뢰 수준(confidence level) : 1 − α</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">검정통계량 계산</span><ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;">검정통계량 : 검정을 위한 표본의 식</span><ul>
<li><span style="font-size: 20px;">귀무가설에서 검정하고자 하는 것에 따라 달라짐</span><ul>
<li><span style="font-size: 20px;">ex) H0 : 두 집단 평균 차이가 없다 → t검정 사용</span></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><span style="font-size: 20px;">p-값과 유의수준(ɑ) 비교</span><ul>
<li><span style="background-color: #FFDAB9; font-size: 20px;">p-값 ≤ ɑ : 귀무가설(H0) 기각, 대립가설(H1) 채택</span></li>
<li><span style="font-size: 20px;">p-값 &gt; ɑ : 귀무가설(H0) 채택, 대립가설(H1) 기각</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">결론 도출</span></li>
</ul>
<h2 id="통계적-유의성">통계적 유의성</h2>
<p><span style="font-size: 20px;">결과가 우연히 발생한 것이 아니라 </span><span style="background-color: #CFE4FE; font-size: 20px;">어떤 효과가 실제로 존재함을 나타내는 지표</span></p>
<h2 id="p-값">p-값</h2>
<ul>
<li><span style="background-color: #FFDAB9; font-size: 20px;"><strong>H0이 참일 때, 현재 관측값(= 검정통계량 값)보다 극단적인 결과가 나올 확률</strong></span><ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;">왜 H0이 참일 때? 우리가 알고 있는 것에 기반해서 확인해야 하니까</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">왜 p-값 ≤ ɑ : 귀무가설(H0) 기각, 대립가설(H1) 채택할까 ?</span><ul>
<li><span style="background-color: #FAFAD2; font-size: 20px;">p-값이 작다는 것은 검정통계량 값이 오른쪽(혹은 왼쪽) 끝에 위치함을 의미 = 귀무가설을 참이라고 하기 어려움</span></li>
</ul>
</li>
<li><span style="font-size: 20px;">p-값이 0.03이라면, 3%의 확률로 우연히 이러한 결과가 나올 수 있음을 의미</span></li>
</ul>
<h2 id="제-1종-오류와-제-2종-오류">제 1종 오류와 제 2종 오류</h2>
<img src="https://velog.velcdn.com/images/soo_32/post/1aa16d4a-29a8-450b-83fb-b9f0e2e3e358/image.png" style="display:block; margin:0 auto;">

<ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;"><strong>제 1종 오류 : 귀무가설이 참인데 기각하는 오류</strong></span><ul>
<li><span style="font-size: 20px;">아무런 영향이 없는데 영향이 있다는 결론 도출</span></li>
<li><span style="font-size: 20px;">잘못된 긍정, 위양성</span></li>
<li><span style="font-size: 20px;">ɑ를 경계로 귀무가설을 기각하므로, 제 1종 오류는 ɑ만큼 발생</span><ul>
<li><span style="background-color: #FFDAB9; font-size: 20px;">ɑ를 정함으로써 제 1종 오류 제어 가능</span></li>
</ul>
</li>
</ul>
</li>
<li><span style="background-color: #CFE4FE; font-size: 20px;"><strong>제 2종 오류 : 귀무가설이 거짓인데 채택하는 오류</strong></span><ul>
<li><span style="font-size: 20px;">영향이 있는데 영향이 없다는 결론 도출</span></li>
<li><span style="font-size: 20px;">잘못된 부정, 위음성</span></li>
<li><span style="font-size: 20px;">β = 제 2종 오류가 일어날 확률</span><ul>
<li><span style="font-size: 20px;">β를 통제할 수 없음</span></li>
<li><span style="background-color: #FFDAB9; font-size: 20px;">표본의 크기가 커질수록 β가 작아짐</span></li>
<li><span style="font-size: 20px;">ɑ와 β는 상충관계, </span><span style="background-color: #FFDAB9; font-size: 20px;">ɑ가 너무 작으면 β가 커짐</span></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="신뢰구간과-가설검정">신뢰구간과 가설검정</h2>
<p><span style="font-size: 20px;">둘 다 데이터의 모수에 대한 정보를 구하고자 하는 것이지만 접근 방식이 다름</span></p>
<ul>
<li><span style="font-size: 20px;">신뢰구간 : 특정 </span><span style="background-color: #CFE4FE; font-size: 20px;">모수가 포함될 범위</span><span style="font-size: 20px;">를 제공</span></li>
<li><span style="font-size: 20px;">가설검정 : 모수가 </span><span style="background-color: #CFE4FE; font-size: 20px;">특정 값과 같은지 다른지</span><span style="font-size: 20px;"> 테스트</span></li>
</ul>
<p><span style="font-size: 20px;"><strong>사례</strong> : 새로운 약물이 기존 약물보다 효과 있는지 검정</span></p>
<ul>
<li><span style="font-size: 20px;">귀무가설(H0) : 새로운 약물은 기존 약물과 큰 차이가 없다</span></li>
<li><span style="font-size: 20px;">대립가설(H1) : 새로운 약물이 기존 약물과 대비해 효과가 있다</span></li>
</ul>
<pre><code class="language-python"># 기존 약물(A)와 새로운 약물(B) 효과 데이터 생성
A = np.random.normal(50, 10, 100)
B = np.random.normal(55, 10, 100)

# 평균 효과 계산
mean_A = np.mean(A)
mean_B = np.mean(B)

# t-검정 수행
t_stat, p_value = stats.ttest_ind(A, B)

print(f&quot;A 평균 효과: {mean_A}&quot;)
print(f&quot;B 평균 효과: {mean_B}&quot;)
print(f&quot;t-검정 통계량: {t_stat}&quot;)
print(f&quot;p-값: {p_value}&quot;)

# t-검정의 p-값 확인 (위 예시에서 계산된 p-값 사용)
print(f&quot;p-값: {p_value}&quot;)
if p_value &lt; 0.05:
    print(&quot;귀무가설을 기각합니다. 통계적으로 유의미한 차이가 있습니다.&quot;)
else:
    print(&quot;귀무가설을 기각하지 않습니다. 통계적으로 유의미한 차이가 없습니다.&quot;)</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/d74b70ff-d242-4a95-9aa4-418b1617eb2d/image.png">

<hr>
<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; t 검정 &quot;</strong></span></p>
</blockquote>
<h2 id="t-검정">t 검정</h2>
<p><span style="background-color: #FAFAD2; font-size: 20px;">작은 표본에서 두 집단 간의 평균 차이가 통계적으로 유의미한지 검정</span></p>
<p><span style="font-size: 20px;">표본 수가 적거나 모집단 분산을 모를 때 t-분포를 이용</span></p>
<p><span style="font-size: 20px;"><strong>방법</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;">단일표본 t-검정</span><span style="font-size: 20px;"> : 한 집단의 평균과 특정 값 비교</span><ul>
<li><span style="font-size: 20px;">“우리 학급 학생 평균 키가 170cm와 같은가?”</span></li>
</ul>
</li>
<li><span style="background-color: #CFE4FE; font-size: 20px;">독립표본 t-검정</span><span style="font-size: 20px;"> : 서로 다른 두 집단의 평균 비교</span><ul>
<li><span style="font-size: 20px;">“남학생과 여학생의 평균 키 차이 검정”</span></li>
</ul>
</li>
<li><span style="background-color: #CFE4FE; font-size: 20px;">대응표본 t-검정</span><span style="font-size: 20px;"> : 같은 집단에서 전후 평균 비교</span><ul>
<li><span style="font-size: 20px;">“다이어트 전후 체중 변화 검정”</span></li>
</ul>
</li>
</ul>
<p><span style="font-size: 20px;"><strong>사례</strong></span></p>
<ul>
<li><span style="font-size: 20px;">단일표본 t 검정 : 학생 평균 점수가 70점과 같은가?</span></li>
<li><span style="font-size: 20px;">독립표본 t 검정 : 두 클래스의 시험 성적 비교</span></li>
<li><span style="font-size: 20px;">대응표본 t 검정 : 같은 학생의 시험 전후 평균 차이 비교</span><pre><code class="language-python"># 학생 점수 데이터
scores = np.random.normal(72, 8, 25)  # 평균 72, 표준편차 8, 표본 25개
</code></pre>
</li>
</ul>
<h1 id="단일표본-t검정-평균-70과-비교">단일표본 t검정 (평균 70과 비교)</h1>
<p>t_stat, p_val = stats.ttest_1samp(scores, 70)
print(f&quot;단일표본 t검정, T-Statistic: {round(t_stat, 2)}, P-value: {round(p_val, 3)}&quot;)</p>
<h1 id="학생-점수-데이터">학생 점수 데이터</h1>
<p>scores_method1 = np.random.normal(70, 10, 30)
scores_method2 = np.random.normal(75, 10, 30)</p>
<h1 id="독립표본-t검정">독립표본 t검정</h1>
<p>t_stat, p_val = stats.ttest_ind(scores_method1, scores_method2)
print(f&quot;독립표본 t검정, T-Statistic: {round(t_stat, 2)}, P-value: {round(p_val, 3)}&quot;)</p>
<h1 id="같은-학생의-시험-전후-점수">같은 학생의 시험 전후 점수</h1>
<p>scores_before = np.random.normal(68, 7, 20)
scores_after  = scores_before + np.random.normal(5, 3, 20)  # 평균 +5 점 상승</p>
<h1 id="대응표본-t검정">대응표본 t검정</h1>
<p>t_stat, p_val = stats.ttest_rel(scores_before, scores_after)
print(f&quot;대응표본 t검정, T-Statistic: {round(t_stat, 2)}, P-value: {round(p_val, 3)}&quot;)</p>
<pre><code>&lt;img src=&quot;https://velog.velcdn.com/images/soo_32/post/f3b1dde8-73dd-44d0-a659-04152e4efd8b/image.png&quot;&gt;
&lt;img src=&quot;https://velog.velcdn.com/images/soo_32/post/f75a91e3-a40e-49bb-9575-289e60d9d2dd/image.png&quot;&gt;
&lt;img src=&quot;https://velog.velcdn.com/images/soo_32/post/d0302cf0-6520-4ad5-a0e9-1dfada2f981b/image.png&quot;&gt;

***

&gt; &lt;span style=&quot;font-size: 35px;&quot;&gt;**&quot; 다중 검정 &quot;**&lt;/span&gt;

## 다중 검정

&lt;span style=&quot;background-color: #FAFAD2; font-size: 20px;&quot;&gt;여러 가설을 동시에 검정, 1종 오류 증가 문제&lt;/span&gt;

&lt;span style=&quot;font-size: 20px;&quot;&gt;**문제**&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;단일 검정에서 유의수준 α = 0.05 → 5% 확률로 1종 오류&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;20번 검정 → 평균적으로 1종 오류가 1회 발생할 가능성&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;1,000번 검정 → 50회 정도 1종 오류 발생 예상&lt;/span&gt;

&lt;span style=&quot;background-color: #FFDAB9; font-size: 20px;&quot;&gt;즉, 다중 검정을 그냥 하면 **거짓 양성(false positive)**이 많아짐&lt;/span&gt;

&lt;span style=&quot;font-size: 20px;&quot;&gt;**해결방법**&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;본페로니 보정 : α를 검정 수 m으로 나눠 사용
  - α_corrected = α / m&lt;/span&gt;
- &lt;span style=&quot;font-size: 20px;&quot;&gt;튜키 보정, 던넷 보정, 윌리엄스 보정 등

&lt;span style=&quot;font-size: 20px;&quot;&gt;**사례** : 세 그룹 간 평균 차이 검정&lt;/span&gt;

```python
# 세 그룹의 데이터 생성
np.random.seed(42)
group_A = np.random.normal(10, 2, 30)
group_B = np.random.normal(12, 2, 30)
group_C = np.random.normal(11, 2, 30)

# 세 그룹 간 평균 차이에 대한 t검정 수행
p_values = []
p_values.append(stats.ttest_ind(group_A, group_B).pvalue)
p_values.append(stats.ttest_ind(group_A, group_C).pvalue)
p_values.append(stats.ttest_ind(group_B, group_C).pvalue)

# 본페로니 보정 적용
alpha = 0.05
adjusted_alpha = alpha / len(p_values)  # 3개(p_value 개수)로 나눔

# 결과 출력
print(f&quot;본페로니 보정된 유의 수준: {adjusted_alpha:.4f}&quot;)
for i, p in enumerate(p_values):
    if p &lt; adjusted_alpha:
        print(f&quot;검정 {i+1}: 유의미한 차이 발견 (p = {p:.4f})&quot;)
    else:
        print(f&quot;검정 {i+1}: 유의미한 차이 없음 (p = {p:.4f})&quot;)</code></pre><img src="https://velog.velcdn.com/images/soo_32/post/c23c851f-551d-4810-b9cb-54a62e20e239/image.png">

<hr>
<blockquote>
<p><span style="font-size: 35px;"><strong>&quot; 카이제곱 검정 &quot;</strong></span></p>
</blockquote>
<h2 id="카이제곱-검정">카이제곱 검정</h2>
<p><span style="background-color: #FAFAD2; font-size: 20px;">범주형 데이터의 적합도 검정, 독립성 검정, 동질성 검정</span></p>
<p><span style="font-size: 20px;"><strong>적합도 검정</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;">범주형 데이터의 관찰 빈도 vs 기대 빈도 일치 여부 비교</span></li>
<li><span style="font-size: 20px;">데이터 형태 : 단일 범주형 변수</span></li>
<li><span style="font-size: 20px;">주사위가 공정한가? (1~6 면 동일 확률인가)</span><ul>
<li><span style="font-size: 20px;">p-값 ≤ α : 주사위가 공정하지 않을 가능성 있음</span></li>
<li><span style="font-size: 20px;">p-값 &gt; α : 주사위가 공정하다고 볼 수 있음</span></li>
</ul>
</li>
</ul>
<p><span style="font-size: 20px;"><strong>독립성 검정</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;">두 범주형 변수 간 연관성 검정</span></li>
<li><span style="font-size: 20px;">데이터 형태 : 교차표(cross-tab)</span></li>
<li><span style="font-size: 20px;">성별과 흡연 여부 관련성 검정</span><ul>
<li><span style="font-size: 20px;">p-값 ≤ α : 성별과 흡연 여부 연관 있음</span></li>
<li><span style="font-size: 20px;">p-값 &gt; α : 성별과 흡연 여부는 독립 관계임</span></li>
</ul>
</li>
</ul>
<p><span style="font-size: 20px;"><strong>동질성 검정</strong></span></p>
<ul>
<li><span style="background-color: #CFE4FE; font-size: 20px;">여러 집단의 범주형 분포가 동일한지 비교</span></li>
<li><span style="font-size: 20px;">데이터 형태 : 교차표(cross-tab)</span></li>
<li><span style="font-size: 20px;">지역별 선호 브랜드 분포 비교</span><ul>
<li><span style="font-size: 20px;">p-값 ≤ α : 지역별 선호 브랜드 차이가 있음</span></li>
<li><span style="font-size: 20px;">p-값 &gt; α : 지역별 선호 브랜드 차이가 통계적으로 유의하지 않음</span></li>
</ul>
</li>
</ul>
<p><span style="font-size: 20px;"><strong>사례</strong></span></p>
<ul>
<li><span style="font-size: 20px;">적합도 검정 : 주사위가 공정한가? (1~6 면 동일 확률인가)</span></li>
<li><span style="font-size: 20px;">독립성 검정 : 성별과 흡연 여부 관련성 검정</span></li>
<li><span style="font-size: 20px;">동질성 검정 : 지역별 선호 브랜드 분포 비교</span></li>
</ul>
<pre><code class="language-python"># 적합도 검정
observed = [20, 30, 25, 25]
expected = [25, 25, 25, 25]
chi2_stat, p_value = stats.chisquare(observed, f_exp=expected)
print(f&quot;적합도 검정 카이제곱 통계량: {chi2_stat:.2f}, p-값: {p_value:.3f}&quot;)

# 성별과 흡연 여부 독립성 검정
observed = np.array([[30, 10], [20, 40]])
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f&quot;독립성 검정 카이제곱 통계량: {chi2_stat:.2f}, p-값: {p_value:.3f}&quot;)

# 예시 데이터: 지역별 선호 브랜드 (A, B, C)
# 행 = 지역 (서울, 부산, 대구), 열 = 브랜드 (A, B, C)
observed = np.array([
    [30, 50, 20],  # 서울
    [25, 35, 40],  # 부산
    [20, 40, 40]   # 대구
])

# 동질성 검정 (카이제곱 독립성 검정 사용 가능)
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f&quot;동질성 검정 카이제곱 통계량: {chi2_stat:.2f}, p-값: {p_value:.3f}&quot;)</code></pre>
<img src="https://velog.velcdn.com/images/soo_32/post/96e93168-0d42-4e52-81bf-b332affb6e53/image.png">



]]></description>
        </item>
    </channel>
</rss>