<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Dada_data.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Fri, 14 Feb 2025 05:06:33 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. Dada_data.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dayeon_data" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[NRU의 유입 경로]]></title>
            <link>https://velog.io/@dayeon_data/NRU%EC%9D%98-%EC%9C%A0%EC%9E%85-%EA%B2%BD%EB%A1%9C</link>
            <guid>https://velog.io/@dayeon_data/NRU%EC%9D%98-%EC%9C%A0%EC%9E%85-%EA%B2%BD%EB%A1%9C</guid>
            <pubDate>Fri, 14 Feb 2025 05:06:33 GMT</pubDate>
            <description><![CDATA[<h4 id="nru-new-register-user">NRU (New Register User)</h4>
<ul>
<li>게임을 처음으로 설치하고 실행했을 때 유입된 신규 유저</li>
<li>UA 진행 시 투입 비용 대비 얼마나 많은 유저가 유입되었는가를 측정할 때 가장 초기에 확인하는 지표</li>
</ul>
<h4 id="1-자연-유입-organic-user">1) 자연 유입 (Organic user)</h4>
<ul>
<li>주로 광고나 마케팅 캠페인 이외의 경로를 통해 유입된 유저</li>
<li>유저의 필요에 의해 들어왔기 때문에 리텐션율의 지표가 Paid User 대비 높은 경향</li>
<li>Organic 유저의 유입 채널로는 대표적으로 스토어를 통한 탐색/검색이 있음</li>
</ul>
<h4 id="2-paid-user-non-organic-user">2) Paid user, Non-Organic User</h4>
<ul>
<li>Paid 유저는 광고 또는 마케팅 캠페인을 통해 유입된 유저를 의미함 </li>
</ul>
<p>참고자료 링크: <a href="https://blog.aloha-corp.com/article/d6f5f757469e4a89af3e93105c1bbf1b">https://blog.aloha-corp.com/article/d6f5f757469e4a89af3e93105c1bbf1b</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[게임 데이터 지표]]></title>
            <link>https://velog.io/@dayeon_data/%EA%B2%8C%EC%9E%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A7%80%ED%91%9C</link>
            <guid>https://velog.io/@dayeon_data/%EA%B2%8C%EC%9E%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A7%80%ED%91%9C</guid>
            <pubDate>Fri, 14 Feb 2025 04:56:05 GMT</pubDate>
            <description><![CDATA[<h4 id="자주-사용되는-게임-데이터-지표">자주 사용되는 게임 데이터 지표</h4>
<ul>
<li>DAU(Daily Active Users) : 일일 활성 사용자수 </li>
<li>MAU(Montly Active Users) : 월간 활성 사용자 수</li>
<li><strong>DNU(Day New Users) : 당일 신규 사용자 수</strong></li>
<li>ACU(Average Concurrent Users) : 평균 동시 온라인 사용자수</li>
<li>CCU(Concurrent Users) : 동시 온라인 사용자수</li>
<li>PCU(Peak Concurrent Users) : 최고 동시 온라인 사용자 수</li>
<li>CPM(Cost Per Mile) : 천 번의 광고 노출당 비용</li>
<li>eCPM(Effect Cost Per Mile) : 실질적인 천 번 노출당 비용 (실제로 발생한 광고 수익)</li>
<li><strong>PUR(Paid Users Rate) : 유료 사용자 비율</strong></li>
<li><strong>ARPU(Average Revenue Per User) : 사용자당 평균 수익</strong></li>
<li><strong>ARPPU(Average Revenue Per User) : 유료 사용자당 평균 수익</strong></li>
<li>LTV(Life Time Value) : <a href="https://blog.thebackend.io/lifetime-value-ltv/">사용자 생애 가치</a></li>
<li>ROI(Return On Investment) : 투자 수익률</li>
<li>ROAS(Return On Advertising Spend) : 광고 지출대비 수익률</li>
</ul>
<h4 id="자주-사용되는-복합-지표와-계산-방법">자주 사용되는 복합 지표와 계산 방법</h4>
<ul>
<li><strong>활성화율 : 활성 사용자수 / 설치 사용자수</strong></li>
<li><strong>결제율 : 결제 사용자수 / 활성 사용자수</strong></li>
<li>다음 날 유지율 : 첫 날 신규 사용자 중 둘째 날 로그인한 사용자수 / 첫 날 신규 사용자수</li>
<li>7일 유지율 : 첫 날 신규 사용자 중 7일째에 로그인한 사용자수 / 첫 날 신규 사용자수</li>
<li><strong>ARPU : 총수익 / 활성 사용자수</strong></li>
<li><strong>ARPPU : 총수익 / 결제 사용자수</strong></li>
<li>LTV : 사용자당 평균 수익 / 수명주기</li>
<li>ROI : (총수익 - 투자비용) / 투자비용</li>
<li>ROAS : 총수익 / 광고지출</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[✏️ 2025. 02. 11 TIL]]></title>
            <link>https://velog.io/@dayeon_data/2025.-02.-11-TIL</link>
            <guid>https://velog.io/@dayeon_data/2025.-02.-11-TIL</guid>
            <pubDate>Tue, 11 Feb 2025 11:18:40 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-tableau-라이브세션-1-2회차">▶ Tableau 라이브세션 1, 2회차</h3>
<h4 id="1-lod-level-of-detail">1. LOD (Level of Detail)</h4>
<blockquote>
<ul>
<li>기본적으로 태블로는 차원에 따라 데이터를 자동 집계</li>
</ul>
</blockquote>
<ul>
<li><p>LOD 활용 시 사용자가 원하는 수준에서 데이터 집계 가능</p>
</li>
<li><p>*<em>LOD 3가지 유형 *</em></p>
<ul>
<li><code>FIXED</code> : 특정 차원에 대해 집계 고정</li>
<li><code>INCLUDE</code> : 현재 뷰의 차원 + 추가 차원을 포함하여 집계</li>
<li><code>EXCLUDE</code> : 특정 차원을 제거한 상태에서 집계</li>
</ul>
</li>
</ul>
<h4 id="2-aarrr-프레임워크">2. AARRR 프레임워크</h4>
<ul>
<li>Acquisition (획득) : 사용자가 제품을 처음 접하는 단계</li>
<li>Activation (활성화) : 첫 경험에서 가치를 느끼는 단계</li>
<li>Retention (유지) : 지속적으로 재방문 하는 단계</li>
<li>Revenue (수익) : 실제로 결제를 발생시키는 단계</li>
<li>Referral (추천) : 기존 사용자가 신규 사용자를 초대하는 단계</li>
</ul>
<h4 id="1-acquisition-획득">1. Acquisition (획득)</h4>
<ul>
<li>사용자가 제품을 처음 접하는 과정 측정</li>
<li>마케팅 채널별 유입 효과를 분석하는 것이 핵심</li>
</ul>
<h4 id="2-activation-활성화">2. Activation (활성화)</h4>
<ul>
<li>제품을 사용하며 가치를 느낀 사용자를 측정하는 단계</li>
<li>가입 후 첫 경험(Onboarding)의 성공 여부가 중요</li>
</ul>
<h4 id="3-retention-유지">3. Retention (유지)</h4>
<ul>
<li>사용자가 한 번만 사용하고 이탈하는지, 계속해서 재방문하는지 분석하는 단계</li>
<li>리텐션율(Retention Rate)이 가장 중요한 지표</li>
</ul>
<h4 id="4-revenue-수익">4. Revenue (수익)</h4>
<ul>
<li><p>사용자가 제품을 구매하거나 결제하는 과정을 분석하는 단계</p>
</li>
<li><p>*<em>주요 지표 *</em></p>
<ul>
<li>ARPU (Average Revenue Per User): 활성 유저당 평균 매출</li>
<li>ARPPU (Average Revenu Per Paying User): 유료 유저 1인당 결제 금액</li>
</ul>
</li>
</ul>
<h4 id="5-referral-추천">5. Referral (추천)</h4>
<ul>
<li>사용자들이 자발적으로 제품을 공유하는지 측정하는 단계</li>
<li>바이럴 효과를 통한 성장 가능성 평가</li>
</ul>
<h4 id="6-프로덕트-분석-방법론">6. 프로덕트 분석 방법론</h4>
<ul>
<li><strong>퍼널 분석</strong> : 각 퍼널 단계 별로 사용자가 얼마나 유입 되었는지, 어떤 구간에서 이탈했는지 알아보는 분석</li>
<li><strong>코호트 분석</strong> : 특정 기간 동안 공통된 특성을 경험한 사용자 행동을 그룹으로 나눠 지표 별로 수치화해서 분석하는 기법</li>
<li><strong>세그먼트 분석</strong> : 고객을 공통된 특성을 가진 다양한 그룹으로 나누는 분석 기법</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[✏️ 2025. 02. 10 TIL]]></title>
            <link>https://velog.io/@dayeon_data/2025.-02.-10-TIL</link>
            <guid>https://velog.io/@dayeon_data/2025.-02.-10-TIL</guid>
            <pubDate>Mon, 10 Feb 2025 11:25:58 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-tableau-vod-강의--4강">▶ Tableau VOD 강의 : 4강</h3>
<h4 id="1-필터별-작동-원리">1. 필터별 작동 원리</h4>
<ul>
<li><strong>추출 필터</strong>: 데이터 소스에서 추출된 데이터 필터링 (데이터 연결을 추출로 선택했을 때만 사용 가능)</li>
<li>데이터 원본 필터: 데이터 원본 소스에서 일부 데이터만 필터링</li>
<li><strong>컨텍스트 필터</strong>: 특정 값에 대한 데이터만 필터링</li>
<li><strong>차원 필터</strong>: 차원을 기준으로 데이터 필터링</li>
<li><strong>측정값 필터</strong>: 측정값을 기준으로 데이터 필터링</li>
<li><strong>테이블 계산 필터</strong>: 특정 계산 결과를 기준으로 데이터 필터링</li>
</ul>
<h4 id="2-필터">2. 필터</h4>
<ul>
<li><strong>컨텍스트 필터</strong><ul>
<li>상위 필터, 집합, Fixed 식과 차원 필터의 문제들이 발생하는 경우, 컨텍스트 필터를 활용해서 적동 순서 변경 가능</li>
</ul>
</li>
<li><strong>측정값과 차원 필터</strong><ul>
<li>측정값 / 차원 우클릭 → 필터 표시</li>
</ul>
</li>
<li><strong>날짜 필터</strong><ul>
<li>날짜에 필터 적용 가능</li>
</ul>
</li>
<li><strong>정렬</strong><ul>
<li>특정 열, 행, 값 기준으로 오름차순, 내림차순 정렬 가능</li>
</ul>
</li>
</ul>
<h4 id="3-기본-계산식-활용">3. 기본 계산식 활용</h4>
<ul>
<li><strong>계층과 드릴 다운</strong><ul>
<li>계층 → 위계 질서가 있는 차원을 말함</li>
<li>계층이 있는 경우 : +/- 아이콘을 클릭해서 드릴 다운 가능</li>
<li>날짜 형식의 필드 : 계층(년, 분기, 월 등)이 태블로에서 자동으로 생성 </li>
</ul>
</li>
<li><strong>퀵테이블 계산</strong><ul>
<li>전주/월/연 대비 함수<ul>
<li>YTD : 연초 대비 증감률</li>
<li>YoY : 전년 대비 증감률</li>
<li>MoM : 전월 대비 증감률</li>
<li>WoW : 전주 대비 증감률</li>
</ul>
</li>
</ul>
</li>
<li><strong>태블로 함수</strong><ul>
<li>논리 함수 : IF, Case When, zn ...</li>
<li>날짜 함수 : DATEDIFF, DATEADD ...</li>
</ul>
</li>
</ul>
<h4 id="4-lod식-활용하기">4. LOD식 활용하기</h4>
<ul>
<li><strong>LOD식(세부 수준식)이란?</strong><ul>
<li>현재 화면에 영향을 받지 않고 원하는 세부 수준에서 값 계산 가능</li>
<li>LOD 식을 활용하면 계산할 세부 수준 제어 가능</li>
<li>LOD 식은 세분화된 기준(INCLUDE), 덜 세분화된 기준(EXCLUDE), 완전히 독립적인 수준(FIXED) 크게 3가지로 나누어짐</li>
</ul>
</li>
<li><strong>LOD식 기본 문법 구조</strong> : 전체 LOD식은 <code>{}(중괄호)</code>로 묶어줌<pre><code class="language-SQL">{[FIXED | INCLUDE | EXCLUDE] [차원1], [차원2] : AVG([측정값])}</code></pre>
</li>
<li>FIXED : 뷰에 있는 차원과 상관없이 계산된 필드에서 FIXED 계산식을 고정시켜 지정된 차원을 계산</li>
<li>INCLUDE : 뷰에 지정된 차원 뿐만 아니라 모든 차원을 포함해서 계산</li>
<li>EXCLUDE : 차원을 제거해서 계산 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[✏️ 2025. 02. 07 TIL]]></title>
            <link>https://velog.io/@dayeon_data/2025.-02.-07-TIL</link>
            <guid>https://velog.io/@dayeon_data/2025.-02.-07-TIL</guid>
            <pubDate>Fri, 07 Feb 2025 10:58:33 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-tableau-vod-강의--1강">▶ Tableau VOD 강의 : 1강</h3>
<ol>
<li><p><strong>BI(Business Intelligence)</strong></p>
<ul>
<li>조직이 데이터 기반 의사결정을 좀 더 빠르게 할 수 있도록 서포트하는 비즈니스 분석, 데이터 마이닝, 데이터 시각화, 데이터 도구를 의미</li>
</ul>
</li>
<li><p><strong>BI  워크 플로우</strong></p>
<ul>
<li>데이터 인프라 : 데이터 레이크 → 데이터 웨어하우스 → 데이터 마트  → BI툴<blockquote>
<p><strong>데이터 레이크</strong> : 모든 Raw data(정형 데이터, 로그 데이터, 테이블 등)를 저장할 수 있는 스토리지</p>
</blockquote>
</li>
</ul>
</li>
</ol>
<p>*<em>데이터 웨어하우스(DW) *</em>: 데이터를 장기적인 보존용으로 통합, 정제, 분석하여 정리한 저장소
*<em>데이터 마트(DM) *</em>: 부서별, 목적별 분석용으로 만든 데이터 웨어하우스의 데이터 일부분</p>
<h3 id="▶-tableau-vod-강의--2강">▶ Tableau VOD 강의 : 2강</h3>
<h4 id="1-tableau-구조">1. Tableau 구조</h4>
<ul>
<li><p><strong>Tableau Prep</strong> : Tableau Desktop에 필요한 전처리 역할</p>
</li>
<li><p><strong>Tableau Desktop</strong> : 데이터를 시각화 하는 역할</p>
</li>
<li><p><strong>Tableau Cloud(Tableau Online)</strong> : Tableau Server가 SaaS 버전으로 제공되는 형태</p>
</li>
<li><p><strong>Tableau Server</strong> : Tableau Server를 통해 게시 및 배포</p>
<h4 id="2-데이터-원본-연결-형태">2. 데이터 원본 연결 형태</h4>
<blockquote>
<p>** [ TIP ]**
커넥터 연동 시 특히 SQL 쿼리를 사용할 경우 라이브 연결 대신 추출 연결을 선택하여 태블로 대시보드 생성 시간을 줄일 수 있음</p>
</blockquote>
</li>
<li><p><strong>라이브</strong></p>
<ul>
<li>데이터 원본 파일의 변경 사항이 연동됨</li>
<li>새로고침 버튼을 클릭하면 실시간으로 데이터 업데이트</li>
</ul>
</li>
<li><p><strong>추출</strong></p>
<ul>
<li>라이브 연결을 끊고 현재 데이터만 로컬로 가져오는 형태</li>
<li>원본 데이터가 클 때 사용<h4 id="3-테이블-병합-방식">3. 테이블 병합 방식</h4>
<blockquote>
<p>총 4가지 종류 (관계, 유니온, 조인, 블렌딩)의 병합 방식 존재</p>
</blockquote>
</li>
</ul>
</li>
<li><p>관계 : 하나의 테이블로 병합하지 않고, 테이블 간 관계를 설정</p>
</li>
<li><p>유니온 : (SQL UNION과 비슷한 개념) 테이블 구조가 같은 형태인 경우, 유니온으로 테이블 병합 가능</p>
</li>
<li><p>조인 : (SQL의 JOIN과 비슷한 개념) 2개 이상의 테이블을 하나의 테이블로 연결하도록 병합</p>
</li>
<li><p>블렌딩 : 물리적으로 테이블을 병합하지 않고, 워크시트 화면에 두 테이블이 같이 있는 형태
→ 서로 다른 데이터 베이스에서 데이터를 불러오고 임시로 분석할 때 사용</p>
</li>
</ul>
<h4 id="4-tableau-구성">4. Tableau 구성</h4>
<ul>
<li>워크시트 : 기본 작업 공간</li>
<li>대시보드 : 여러 개의 워크시트를 통합하여 하나의 대시보드로 생성</li>
<li>스토리 : 여러 개의 워크시트와 대시보드를 합쳐서 하나의 인포그래픽 형태의 스토리로 만듦</li>
</ul>
<h4 id="5-tableau-기능과-용어">5. Tableau 기능과 용어</h4>
<ul>
<li><strong>차원(dimension) vs 측정값(metric)</strong><ul>
<li>차원(dimension) : 측정 기준 또는 분석의 기준 (예- 유저 아이디, 지역, 상품명 등)</li>
<li>측정값(metric) : 측정하는 값 또는 항목 (예 - 매출, 리텐션, 전환율 등)</li>
</ul>
</li>
<li><strong>연속형과 불연속형</strong><ul>
<li>연속형 : 하나로 연결되어 이어진 데이터 (녹색 측정 값과 차원)</li>
<li>불연속형 : 이어지지 않고 각각 구분되는 개별적인 데이터 (파란색 측정 값과 차원)</li>
</ul>
</li>
<li><strong>계산된 필드</strong><ul>
<li>기존 컬럼을 계산하여 새로운 컬럼 생성 </li>
<li><code>상단 분석 &gt; 계산된 필드 만들기</code></li>
</ul>
</li>
<li><strong>매개 변수</strong><ul>
<li>사용자가 대시보드와 워크시트의 데이터를 필터링하거나 조정할 수 있는 기능</li>
<li>계산된 필드에 추가하여 사용</li>
<li>예시 - 날짜 범위를 선택하거나 상위 고객을 필터링하여 작업</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[✏️ 2025. 01. 20 TIL]]></title>
            <link>https://velog.io/@dayeon_data/2025.-01.-20-TIL</link>
            <guid>https://velog.io/@dayeon_data/2025.-01.-20-TIL</guid>
            <pubDate>Mon, 20 Jan 2025 11:45:54 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-python-챌린지-개인-과제">▶ Python 챌린지 개인 과제</h3>
<p><strong>1. API를 활용하여 데이터 불러오기</strong></p>
<p>Steam 플랫폼에서 출시된 게임들의 데이터를 조회해보고 싶어서 관련 API를 찾아봤다. </p>
<p>우선, Steam 공식 API인 <a href="https://steamcommunity.com/dev">Steam Web API</a>를 살펴보았다. 
<img src="https://velog.velcdn.com/images/dayeon_data/post/906074fe-8291-4f75-9416-a3e03bd2fc7c/image.png" alt=""></p>
<p>하지만.. 요 데이터만 가지고는 인사이트를 도출해내기 어려울 듯 싶어서 다른 API들을 추가로 찾아보았다.</p>
<p>다음으로 찾아본 API는 <a href="https://steamspy.com/">SteamSPY</a>에서 제공하는 API.</p>
<p>데이터 조회를 위한 파라미터는 다음과 같다.</p>
<blockquote>
<ul>
<li><strong><code>request</code> - 요청 타입 지정</strong></li>
</ul>
</blockquote>
<ul>
<li><code>top100in2weeks</code> : 지난 2주간 가장 인기 있는 게임의 상위 100개 목록</li>
<li><code>top100forever</code> : 역대 가장 인기 있는 게임의 상위 100개 목록</li>
<li><code>all</code> : 모든 Steam 게임의 데이터</li>
<li><code>appdetails</code> : 특정 게임의 세부 정보<ul>
<li><strong><code>appid</code> - 특정 게임의 ID (Steam의 App ID)</strong></li>
</ul>
</li>
</ul>
<p>아래는 데이터 조회를 위해 작성한 코드.</p>
<pre><code class="language-python"># API URL
url = &quot;https://steamspy.com/api.php&quot;

# 요청 파라미터
params = {&quot;request&quot;: &quot;top100in2weeks&quot;}

# API 호출
response = requests.get(url, params=params)

# 데이터 처리
data = response.json()
df = pd.DataFrame(data).T  # 전치(transpose)
df = df.reset_index(drop=True)  # 인덱스 재설정

# 데이터 프레임으로 저장
data = pd.DataFrame(df)</code></pre>
<p><img src="https://velog.velcdn.com/images/dayeon_data/post/c2ad74b9-be39-4b7d-8469-2064ab5469fb/image.png" alt="">
결과적으로 요런 테이블이 나왔다.</p>
<p>*<em>2. GitHub, Google 빅쿼리 활용 *</em>
위에서 작성한 코드를 <code>.py</code> 파일로 변환하여 Github에 업로드 한 후, Colab에서 GitHub에 등록한 코드를 클론했다.</p>
<pre><code class="language-python">!git clone 복사한 repository 주소</code></pre>
<p><img src="https://velog.velcdn.com/images/dayeon_data/post/9975c74e-c188-4427-872d-f75ae042d448/image.png" alt=""></p>
<p>클론된 파일에서 코드를 긁어와서 데이터 프레임 생성</p>
<pre><code class="language-python">import requests
import pandas as pd

# API URL
url = &quot;https://steamspy.com/api.php&quot;

# 요청 파라미터
params = {&quot;request&quot;: &quot;top100in2weeks&quot;}

# API 호출
response = requests.get(url, params=params)

# 데이터 처리
data = response.json()
df = pd.DataFrame(data).T  # 전치(transpose)
df = df.reset_index(drop=True)  # 인덱스 재설정

# 데이터프레임 출력
data = pd.DataFrame(df)</code></pre>
<p>그리고 생성한 테이블을 BigQuery와 연동했다.</p>
<ul>
<li>연동 전에 BigQuery에서 해야 하는 것<ul>
<li><code>서비스계정</code> &gt; <code>키 관리</code>에서 키 발급 받아 두기</li>
<li>연결할 데이터 세트 생성<pre><code class="language-python">from google.colab import files
from google.oauth2 import service_account
</code></pre>
</li>
</ul>
</li>
</ul>
<h1 id="빅쿼리에서-생성한-계정-키-파일-입력">빅쿼리에서 생성한 계정 키 파일 입력</h1>
<p>uploaded = files.upload() </p>
<h1 id="서비스-계정-키-파일-경로-설정">서비스 계정 키 파일 경로 설정</h1>
<p>key_path = list(uploaded.keys())[0]
credentials = service_account.Credentials.from_service_account_file(key_path)</p>
<p>from google.cloud import bigquery</p>
<h1 id="bigquery-클라이언트-생성">BigQuery 클라이언트 생성</h1>
<p>client = bigquery.Client(credentials=credentials, project=credentials.project_id)</p>
<h1 id="데이터-프레임-업로드">데이터 프레임 업로드</h1>
<p>job = client.load_table_from_dataframe(data, &quot;데이터 세트 ID&quot;)</p>
<h1 id="작업-완료-대기">작업 완료 대기</h1>
<p>job.result()</p>
<h1 id="결과-확인">결과 확인</h1>
<p>print(f&quot;Uploaded {job.output_rows} rows to &#39;데이터 세트 ID&quot;&#39;&quot;)</p>
<pre><code>![](https://velog.velcdn.com/images/dayeon_data/post/72ffae07-d1b5-4879-ae25-aa5b2f0d7f84/image.png)
이렇게 해서 빅쿼리 연동까지 완료!

### ▶ 머신러닝 심화
**1. 데이터 분석 프로세스**
* 데이터 수집에 따른 프로세스
![](https://velog.velcdn.com/images/dayeon_data/post/9fca011f-c732-4d8c-9fb1-f09ab77e7172/image.png)
  - Data Source 
    - OLTP Database(OnLine Transaction Processing): 온라인 뱅킹, 쇼핑, 주문 입력 등 동시에 발생하는 다수의 트랜잭션 처리 유형
    - Enterprise Applications: 회사 내 데이터 (ex. 고객 관계 데이터, 제품 마케팅 세일즈)
    - Third - Party : Google Analytics와 같은 외부소스에서 수집되는 데이터
    - Web/Log: 사용자의 로그데이터
  - Data Lake: 원시 형태의 다양한 유형의 데이터 저장
  - Data Warehouse : 회사의 금융, 마케팅, 영업 부서와 같이 특정 조직의 목적을 위해 가공된 데이터
   - BI/Analytics: Business Intelligence(BI)는 의사결정에 사용된 데이터를 수집하고 분석하는 프로세스

**2. 탐색적 데이터 분석 (EDA)**
- **탐색적 데이터 분석(Exploratory Data Analysis, EDA)**: 데이터 시각화, 기술통계 등의 방법을 통해 데이터를 이해하고 탐구하는 과정
- **시각화를 이용한 EDA 예시**
  - `countplot` : 범주형 자료의 빈도 수 시각화
  - `barplot` : 범주형 자료의 시각화
  - `boxplot` : 수치형 &amp; 범주형 자료의 시각화
  - `histogram` : 수치형 자료 빈도 시각화
  - `scatterplot` : 수치형 자료끼리의 관계 시각화
  - `pairplot` : 전체 변수에 대한 시각화</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[MySQL] 문자열 일부 잘라내기]]></title>
            <link>https://velog.io/@dayeon_data/MySQL-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%9D%BC%EB%B6%80-%EC%9E%98%EB%9D%BC%EB%82%B4%EA%B8%B0</link>
            <guid>https://velog.io/@dayeon_data/MySQL-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%9D%BC%EB%B6%80-%EC%9E%98%EB%9D%BC%EB%82%B4%EA%B8%B0</guid>
            <pubDate>Wed, 15 Jan 2025 00:30:00 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-substring-or-substr">▶ SUBSTRING() or SUBSTR()</h3>
<ul>
<li>문자열의 일부를 잘라내기로 추출하는 함수<pre><code class="language-sql">SUBSTR(문자열, 시작위치, 길이)</code></pre>
</li>
</ul>
<h3 id="▶-left">▶ LEFT()</h3>
<ul>
<li>문자열 일부를 왼쪽부터 잘라내어 반환하는 함수<pre><code class="language-sql">LEFT(문자열, 길이)</code></pre>
</li>
</ul>
<h3 id="▶-right">▶ RIGHT()</h3>
<ul>
<li>문자열 일부를 오른쪽부터 잘라내어 반환하는 함수<pre><code class="language-sql">RIGHT(문자열, 길이)</code></pre>
</li>
</ul>
<h3 id="▶-substring_index">▶ SUBSTRING_INDEX()</h3>
<ul>
<li>구분자와 구분자의 숫자만큼 잘라내어 반환하는 함수<pre><code class="language-sql">SUBSTRING_INDEX(문자열, 구분자, 구분자 Index)</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MySQL] 그룹화된 데이터를 하나로 문자열로 결합
]]></title>
            <link>https://velog.io/@dayeon_data/SQL-%EA%B7%B8%EB%A3%B9%ED%99%94%EB%90%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%95%98%EB%82%98%EB%A1%9C-%EB%AC%B8%EC%9E%90%EC%97%B4%EB%A1%9C-%EA%B2%B0%ED%95%A9</link>
            <guid>https://velog.io/@dayeon_data/SQL-%EA%B7%B8%EB%A3%B9%ED%99%94%EB%90%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%95%98%EB%82%98%EB%A1%9C-%EB%AC%B8%EC%9E%90%EC%97%B4%EB%A1%9C-%EA%B2%B0%ED%95%A9</guid>
            <pubDate>Tue, 14 Jan 2025 01:17:34 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-group_concat">▶ GROUP_CONCAT</h3>
<pre><code class="language-sql">GROUP_CONCAT([DISTINCT] column_name [ORDER BY column_name ASC|DESC] [SEPARATOR &#39;string&#39;])</code></pre>
<ul>
<li><code>GROUP_CONCAT</code> : 여러 행의 데이터를 그룹화하여 하나의 행에 문자열로 통합 가능<ul>
<li><code>DISCINCT</code> : 중복된 값을 제거하고 연결</li>
<li><code>column_name</code> : 연결할 컬럼 이름 지정</li>
<li><code>ORDER BY</code> : 연결된 값 순서 지정</li>
<li><code>SEPARATOR</code> : 각 값 사이에 삽입할 구분자 지정, 기본값은 <code>,</code></li>
</ul>
</li>
</ul>
<h4 id="기본-사용">기본 사용</h4>
<pre><code class="language-sql">SELECT category_id, GROUP_CONCAT(product_name) AS product_list
FROM products
GROUP BY category_id;</code></pre>
<ul>
<li>결과</li>
</ul>
<table>
<thead>
<tr>
<th align="center">category_id</th>
<th align="center">product_list</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1</td>
<td align="center">Chair,Table,Lamp</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">Laptop,Monitor,Keyboard</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[✏️ 2025. 01. 13 TIL]]></title>
            <link>https://velog.io/@dayeon_data/2025.-01.-13-TIL</link>
            <guid>https://velog.io/@dayeon_data/2025.-01.-13-TIL</guid>
            <pubDate>Mon, 13 Jan 2025 11:31:13 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-통계학-기초--4-회귀">▶ 통계학 기초 : 4. 회귀</h3>
<ul>
<li>단순선형회귀: 하나의 독립변수와 하나의 종속변수 간의 관계를 직선으로 모델링하는 방법</li>
<li>다중선형회귀: 두 개 이상의 독립변수와 하나의 종속변수 간의 관계를 모델링</li>
<li>범주형 변수: 수치형 데이터가 아닌 주로 문자형 데이터로 이루어져 있는 변수<ul>
<li>(예시) 순서가 있는 범주형 변수: 옷의 사이즈, 수능 등급 등</li>
<li>(예시) 순서가 없는 범주형 변수: 성별, 지역 등</li>
</ul>
</li>
<li>다항회귀:<ul>
<li>독립 변수의 다항식을 사용하여 종속 변수를 예측</li>
<li>데이터가 곡선적 경향을 따를 때 사용</li>
</ul>
</li>
<li>스플라인 회귀:<ul>
<li>독립 변수의 구간별로 다른 회귀식을 적용하여 복잡한 관계를 모델링</li>
<li>구간마다 다른 다항식을 사용하여 전체적으로 매끄러운 곡선 생성</li>
</ul>
</li>
</ul>
<h3 id="▶-통계학-기초--5-상관관계">▶ 통계학 기초 : 5. 상관관계</h3>
<ul>
<li>피어슨 상관계수: 두 연속형 변수 간의 선형 관계를 측정하는 지표<ul>
<li>비선형 관계에서는 사용할 수 없음</li>
</ul>
</li>
<li>비모수 상관계수: 데이터가 정규분포를 따르지 않거나 변수들이 순서형 데이터일 때 사용하는 상관계수<ul>
<li>예시 : 스피어만 상관계수, 켄달의 타우 상관계수 등..</li>
</ul>
</li>
<li>상호정보 상관계수: 두 변수 간의 정보의존성을 바탕으로 비선형 관계를 탐지<ul>
<li>두 변수가 범주형 변수일 때, 비선형적이고 복잡한 관계를 탐지하고자 할 때 사용</li>
</ul>
</li>
</ul>
<h3 id="▶-통계학-기초--6-가설검정의-주의점">▶ 통계학 기초 : 6. 가설검정의 주의점</h3>
<ul>
<li>재현 가능성 : 우연히 결과가 나오는 것이 아닌, 항상 일관된 결과가 나오는지 확인해야함</li>
<li>p-해킹: 데이터 분석을 반복하여 p-값을 인위적으로 낮추는 행위 (데이터 분석 결과의 신뢰성을 저하시킴)</li>
<li>선택적 보고: 유의미한 결과만을 보고하고 유의미하지 않은 결과는 보고하지 않는 행위 (마찬가지로 데이터 분석의 결과를 왜곡하고 신뢰성을 저하시킴)</li>
<li>자료 수집 중단 시점 결정: 데이터 수집을 시작하기 전에 언제 수집을 중단할지 명확하게 결정해야함. (원하는 결과가 나올 때 까지 데이터를 계속 수집할 가능성 존재)</li>
<li>데이터 탐색과 검증 분리: 데이터 탐색을 통해 가설을 설정하고, 이를 검증하기 위해 독립적인 데이터셋 사용 → 데이터 과적합을 방지하고 결과의 신뢰성을 높임</li>
</ul>
<h3 id="▶-머신러닝-기초--1-머신러닝의-기초">▶ 머신러닝 기초 : 1. 머신러닝의 기초</h3>
<ul>
<li>머신러닝 관련 용어 정의<ul>
<li>AI: 인간의 지능을 요구하는 업무를 수행하기 위한 시스템</li>
<li>Machine Learning: 관측된 패턴을 기반으로 의사결정을 하기 위한 알고리즘</li>
<li>Deep Learning: AI를 포괄하여 통계학과 컴퓨터 공학을 바탕으로 발전한 융합학문</li>
<li>Data Analysis : 데이터 집계, 통계 분석, 머신러닝을 포함한 행위</li>
</ul>
</li>
<li>머신러닝의 종류<ul>
<li>지도 학습 ( Supervised Learning )<ul>
<li>문제와 정답을 모두 알려주고 학습시키는 방법 &gt; 예측, 분류</li>
</ul>
</li>
<li>비지도 학습 ( Unsupervised Learning )<ul>
<li>답을 가르쳐주지 않고 학습시키는 방법 &gt; 연관 규칙, 군집</li>
</ul>
</li>
<li>강화학습 (Reinforcement Learning)<ul>
<li>보상을 통해 상은 최대화, 벌은 최소화하는 방향으로 강화하는 학습 &gt; 보상</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MySQL] 시간 사이의 간격 계산]]></title>
            <link>https://velog.io/@dayeon_data/SQL-%EC%8B%9C%EA%B0%84-%EC%82%AC%EC%9D%B4%EC%9D%98-%EA%B0%84%EA%B2%A9-%EA%B3%84%EC%82%B0</link>
            <guid>https://velog.io/@dayeon_data/SQL-%EC%8B%9C%EA%B0%84-%EC%82%AC%EC%9D%B4%EC%9D%98-%EA%B0%84%EA%B2%A9-%EA%B3%84%EC%82%B0</guid>
            <pubDate>Mon, 13 Jan 2025 00:56:52 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-timestampdiff">▶ <code>TIMESTAMPDIFF</code></h3>
<pre><code class="language-sql">TIMESTAMPDIFF(unit, datetime1, datetime2)</code></pre>
<ul>
<li><code>TIMESTAMPDIFF</code> : 두 날짜 또는 시간 간의 특정 단위로 간격 반환<ul>
<li><code>unit</code> : 반환할 간격의 단위 지정 (예: <code>SECOND</code>, <code>MINUTE</code>, <code>HOUR</code>, <code>DAY</code>, <code>WEEK</code>, <code>MONTH</code>, <code>YEAR</code>)</li>
<li><code>datetime1</code> : 시작 시간</li>
<li><code>datetime2</code> : 끝 시간</li>
<li>결과 : <code>datetime2 - datetime1</code>에 해당하는 간격</li>
</ul>
</li>
<li>예시
```sql</li>
<li><ul>
<li>두 시간 사이의 간격을 분 단위로 계산
SELECT TIMESTAMPDIFF(MINUTE, &#39;2025-01-01 12:00:00&#39;, &#39;2025-01-01 13:30:00&#39;);</li>
</ul>
</li>
<li><ul>
<li>결과 : 90</li>
</ul>
</li>
</ul>
<p>-- 두 날짜 사이의 간격을 일 단위로 계산
SELECT TIMESTAMPDIFF(DAY, &#39;2025-01-01&#39;, &#39;2025-01-10&#39;);
-- 결과: 9</p>
<pre><code>
### ▶ `TIMEDIFF`
```sql
TIMEDIFF(time1, time2)</code></pre><ul>
<li><code>TIMEDIFF(time1, time2)</code> : 두 시간의 차이를 <code>HH:MM:SS</code> 형식으로 반환<ul>
<li><code>time1</code>, <code>time2</code>: 비교할 두 시간 값 (DATETIME 또는 TIME 형식 가능)</li>
<li>결과: <code>time2-time1</code>에 해당하는 차이를 <code>HH:MM:SS</code> 형식으로 반환
```sql</li>
</ul>
</li>
<li><ul>
<li>두 시간의 차이 계산
SELECT TIMEDIFF(&#39;13:30:00&#39;, &#39;12:00:00&#39;);</li>
</ul>
</li>
<li><ul>
<li>결과 : &#39;01:30:00&#39;</li>
</ul>
</li>
</ul>
<p>-- 두 DATETIME의 시간 차이 계산
SELECT TIMEDIFF(&#39;2025-01-01 13:30:00&#39;, &#39;2025-01-01 12:00:00&#39;);
-- 결과: &#39;01:30:00&#39;</p>
<pre><code>### ▶ `UNIX_TIMESTAMP`를 활용한 직접 계산
```python
-- 두 시간 간의 차이를 초 단위로 계산
SELECT UNIX_TIMESTAMP(&#39;2025-01-01 13:30:00&#39;) - UNIX_TIMESTAMP(&#39;2025-01-01 12:00:00&#39;) AS seconds_diff;
-- 결과: 5400 (1시간 30분 = 5400초)

-- 초 단위 차이를 분 단위로 변환
SELECT (UNIX_TIMESTAMP(&#39;2025-01-01 13:30:00&#39;) - UNIX_TIMESTAMP(&#39;2025-01-01 12:00:00&#39;)) / 60 AS minutes_diff;
-- 결과: 90</code></pre><ul>
<li>직접 계산 : 시간 간격을 초, 분, 시간 등으로 계산하려면 <code>UNIX_TIMESTAMP</code>와 산술 연산 사용</li>
</ul>
<h3 id="▶-단위-요약">▶ 단위 요약</h3>
<table>
<thead>
<tr>
<th align="center">단위 이름 (unit)</th>
<th align="center">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">SECOND</td>
<td align="center">초</td>
</tr>
<tr>
<td align="center">MINUTE</td>
<td align="center">분</td>
</tr>
<tr>
<td align="center">HOUR</td>
<td align="center">시간</td>
</tr>
<tr>
<td align="center">DAY</td>
<td align="center">일</td>
</tr>
<tr>
<td align="center">WEEK</td>
<td align="center">주</td>
</tr>
<tr>
<td align="center">MONTH</td>
<td align="center">월</td>
</tr>
<tr>
<td align="center">YEAR</td>
<td align="center">년</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[✏️ 2025. 01. 08 TIL]]></title>
            <link>https://velog.io/@dayeon_data/2025.-01.-08-TIL</link>
            <guid>https://velog.io/@dayeon_data/2025.-01.-08-TIL</guid>
            <pubDate>Wed, 08 Jan 2025 11:50:43 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-통계학-라이브세션--1회차">▶ 통계학 라이브세션 : 1회차</h3>
<h4 id="1-모집단---표본-관련-함수">1. 모집단 - 표본 관련 함수</h4>
<ul>
<li><strong><code>numpy.random.normal</code> : 정규분포를 따르는 난수 생성</strong><pre><code class="language-python">numpy.random.normal(loc=0.0, scale=1.0, size=None)</code></pre>
<ul>
<li><code>loc</code> : <code>float</code> <ul>
<li>정규분포의 평균 </li>
<li>기본값 : 0.0</li>
</ul>
</li>
<li><code>scale</code> : <code>float</code> <ul>
<li>정규분포의 표준편차 </li>
<li>기본값: 1.0 </li>
</ul>
</li>
<li><code>size</code> : <code>int</code> / <code>tuple of ints</code> <ul>
<li>출력 배열의 크기 = 데이터 개수</li>
<li>기본값: None → 스칼라 값 반환</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><strong><code>numpy.random.choice</code> : 지정된 배열에서 무작위로 선택된 요소를 반환하는 기능 제공</strong><pre><code class="language-python">numpy.random.choice(a, size=None, replace=True, p=None)</code></pre>
</li>
<li><code>a</code> : <code>1-D array-like</code> / <code>int</code><ul>
<li>샘플링한 원본 배열</li>
<li>정수인 경우 <code>np.arange(a)</code>와 동일하게 간주</li>
</ul>
</li>
<li><code>size</code> : <code>int</code> / <code>tuple of ints</code><ul>
<li>출력 배열의 크기</li>
<li>기본값 : None, 단일 값 반환</li>
</ul>
</li>
<li><code>replace</code> : <code>boolean</code><ul>
<li>복원 추출 여부</li>
<li><code>True</code>면 동일한 요소 여러 번 선택 가능</li>
<li>기본값 : True</li>
</ul>
</li>
<li><code>p</code> : <code>1-D array-like</code> (optional)<ul>
<li>각 요소가 선택될 확률</li>
<li>배열의 합은 1이어야 함</li>
</ul>
</li>
</ul>
<ul>
<li><code>plt.hist</code> : Matplotlib 라이브러리에서 히스토그램을 그리는 함수<pre><code class="language-python">plt.hist(population, bins=50, alpha=0.5, label=&#39;population&#39;, color = &#39;blue&#39;)
plt.hist(sample, bins=50, alpha=0.5, label=&#39;sample&#39;, color=&#39;red&#39;)</code></pre>
<ul>
<li><code>bins</code> <ul>
<li>히스토그램 빈(bins)의 개수 또는 경계</li>
</ul>
</li>
<li><code>alpha</code><ul>
<li>히스토그램 막대의 투명도</li>
<li><code>0</code>(투명) - <code>1</code> (반투명)  사이의 값</li>
</ul>
</li>
<li><code>label</code><ul>
<li>히스토그램의 레이블 지정</li>
<li>범례 추가 시 사용</li>
</ul>
</li>
<li><code>color</code><ul>
<li>히스토그램 막대의 색상 지정</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2-표본오차---신뢰구간">2. 표본오차 - 신뢰구간</h4>
<ul>
<li><p>표본오차 (Sampling Error)</p>
<ul>
<li>표본에서 계산된 통계량과 모집단의 진짜 값 간의 차이</li>
<li>표본의 크기가 클수록 표본 오차는 작아짐</li>
<li>무작위 추출 방법을 사용할 경우 표본오차를 줄일 수 있음 (모든 모집단 요소가 선택될 동등한 기회를 가지게 해야함)</li>
</ul>
</li>
<li><p>신뢰구간 (Confidence Interval)</p>
<ul>
<li>모집단의 특정 파라미터(예: 평균, 비율)에 대해 추정된 값이 포함될 것으로 기대되는 범위</li>
<li>신뢰구간 = 표본평균 ± z × 표준오차<ul>
<li>z = 신뢰 수준에 해당하는 z-값</li>
</ul>
</li>
</ul>
</li>
<li><p><code>stats.t.interval</code> : 주어진 신뢰수준에서 t-분포를 사용하여 신뢰구간 계산</p>
<pre><code class="language-python">scipy.stats.t.interval(alpha, df, loc=0, scale=1)</code></pre>
</li>
<li><p><code>alpha</code></p>
<ul>
<li>신뢰수준(confidence level)을 의미</li>
<li>신뢰수준 95% &gt; <code>alpha</code> 0.95로 설정</li>
</ul>
</li>
<li><p><code>df</code></p>
<ul>
<li>자유도(degrees of freedom)을 나타냄</li>
<li>일반적으로 표본 크기에서 1을 뺀 값으로 설정</li>
</ul>
</li>
<li><p><code>loc</code></p>
<ul>
<li>위치 (parameter of location)</li>
<li>일반적으로 표본 평균을 설정</li>
</ul>
</li>
<li><p><code>scale</code></p>
<ul>
<li>스케일 (parameter of scale)</li>
<li>일반적으로 표본 표준오차를 설정</li>
<li>표본 표준오차 : 표본 표준편차를 표본 크기의 제곱근으로 나눈 값<ul>
<li><code>scale = sample_std / sqrt(n)</code></li>
</ul>
</li>
</ul>
</li>
<li><p><strong>표준오차와 표준편차의 차이?</strong></p>
<ul>
<li>표준편차: 표본 조사로 얻은 각 관측값과 표본 평균의 차이</li>
<li>표준오차: 표준편차를 표본크기의 제곱근으로 나눈 값<ul>
<li>표본평균 추정값의 변동성을 의미</li>
<li>표준오차가 작을수록 신뢰구간이 좁아지고, 커질수록 신뢰구간이 넓어짐</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="3-정규분포">3. 정규분포</h4>
<ul>
<li><p><strong>정규분포</strong>
<img src="https://velog.velcdn.com/images/dayeon_data/post/e9329163-9de9-4cdf-bcae-ceff6bc83d64/image.png" alt=""></p>
<ul>
<li>대부분의 데이터가 평균 주위에 몰려있는 종 모양의 대칭 분포</li>
<li>평균을 중심으로 좌우대칭, 평균에서 멀어질수록 데이터의 빈도가 감소</li>
<li>표준편차 = 분포의 퍼짐 정도를 나타냄</li>
</ul>
</li>
<li><p><strong>정규분포 그래프 그리기</strong>
<img src="https://velog.velcdn.com/images/dayeon_data/post/c77622d0-fc39-45ad-8d0b-cc0edfd3c218/image.png" alt=""></p>
</li>
</ul>
<pre><code class="language-python"># 정규분포 생성
normal_dist = np.random.normal(170, 10, 1000)

# 히스토그램으로 시각화
plt.hist(normal_dist, bins=30, density=True, alpha=0.6, color=&#39;g&#39;)

# 정규분포 곡선 추가
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = stats.norm.pdf(x, 170, 10)
plt.plot(x, p, &#39;k&#39;, linewidth=2)
plt.title(&#39;normal distribution histogram&#39;)
plt.show()</code></pre>
<h4 id="4-긴-꼬리-분포">4. 긴 꼬리 분포</h4>
<ul>
<li><p><strong>긴 꼬리 분포 (Long-Tailed Distribution)</strong></p>
<ul>
<li>대부분의 데이터가 분포의 한쪽 끝에 몰려있고, 반대쪽으로 긴 꼬리가 이어지는 형태의 분포</li>
<li>특정한 하나의 분포를 의미하지 않으며 여러 종류의 분포를 포함
→ 파레토 분포, 지프의 법칙, 멱함수..</li>
<li>데이터 수가 아무리 많아져도 정규분포가 되지 않음</li>
</ul>
</li>
<li><p>*<em>긴 꼬리 분포 그래프 그리기 *</em>
<img src="https://velog.velcdn.com/images/dayeon_data/post/d2cdca28-d9f2-45b1-b0e7-ed9fa7c303df/image.png" alt=""></p>
</li>
</ul>
<pre><code class="language-python"># 긴 꼬리 분포 생성 (예: 소득 데이터)
long_tail = np.random.exponential(1, 1000)

# 히스토그램으로 시각화
plt.hist(long_tail, bins=30, density=True, alpha=0.6, color=&#39;b&#39;)
plt.title(&#39;long tail distribution histogram&#39;)
plt.show()</code></pre>
<h4 id="5-스튜던트-t-분포">5. 스튜던트 t 분포</h4>
<ul>
<li><p><strong>스튜던트 t 분포</strong></p>
<ul>
<li>모집단의 표준편차를 알 수 없고, 표본의 크기가 작은 경우(일반적으로 30 미만)에 사용되는 분포</li>
<li>정규분포와 유사하지만, 표본의 크기가 작을수록 꼬리가 두꺼워지는 특징</li>
</ul>
</li>
<li><p>*<em>스튜던트 t 분포 그래프 그리기 *</em>
<img src="https://velog.velcdn.com/images/dayeon_data/post/2494b231-0485-4eaf-81a9-4a7ecfacf48e/image.png" alt=""></p>
<pre><code class="language-python"># 스튜던트 t 분포 생성
t_dist = np.random.standard_t(df=10, size=1000)
</code></pre>
</li>
</ul>
<h1 id="히스토그램으로-시각화">히스토그램으로 시각화</h1>
<p>plt.hist(t_dist, bins=30, density=True, alpha=0.6, color=&#39;r&#39;)</p>
<h1 id="스튜던트-t-분포-곡선-추가">스튜던트 t 분포 곡선 추가</h1>
<p>x = np.linspace(-4, 4, 100)
p = stats.t.pdf(x, df=10)
plt.plot(x, p, &#39;k&#39;, linewidth=2)
plt.title(&#39;student t distribution histogram&#39;)
plt.show()</p>
<pre><code>
#### 6. 카이제곱 분포
- 카이제곱 분포
  - 범주형 데이터의 독립성 검정이나 적합도 검정에 사용되는 분포
  - 자유도에 따라 모양이 달라짐
  - 상관관계나 인과관계를 판별하고자 하는 원인의 독립변수가 완벽하게 서로 다른 질적 자료일 때 활용 
  → 예 : 성별이나 나이에 따른 선거 후보 지지율

- **카이제곱 분포의 실사용례**
  - 독립성 검정 : 두 범주형 변수가 관계가 있는지 확인할 때 사용
    - 예시 1 - 성별과 직업 선택 간의 독립성 검토
    - 예시 2 - 성별이 후보 지지율에 끼치는 영향 검토
  - 적합도 검정 : 관측한 값들이 특정 분포에 해당하는지 검정할 때 사용
     - 예시 1 - 주사위의 각 면이 동일한 확률으로 나오는지 검토
     - 예시 2 - 노란 완두, 녹색 완두가 3:1 비율 발생 → 실험 데이터가 그렇게 나오는지 검토

- **카이제곱 그래프 그리기**
![](https://velog.velcdn.com/images/dayeon_data/post/8eca1079-0364-4f1d-958d-91c2a7e0b6fe/image.png)

```python
# 카이제곱분포 생성
chi2_dist = np.random.chisquare(df=2, size=1000)

# 히스토그램으로 시각화
plt.hist(chi2_dist, bins=30, density=True, alpha=0.6, color=&#39;m&#39;)

# 카이제곱분포 곡선 추가
x = np.linspace(0, 10, 100)
p = stats.chi2.pdf(x, df=2)
plt.plot(x, p, &#39;k&#39;, linewidth=2)
plt.title(&#39;chi2 distribution histogram&#39;)
plt.show()</code></pre><h4 id="7-이항분포">7. 이항분포</h4>
<ul>
<li><p><strong>이항분포</strong></p>
<ul>
<li>성공 / 실패와 같은 두 가지 결과를 가지는 실험을 여러 번 반복했을 때 성공 횟수의 분포</li>
<li>성공확률을 p라고 할 때, 성공의 횟수를 확률적으로 나타냄</li>
<li>실험횟수(<code>n</code>)과 성공확률(<code>p</code>)로 정의됨</li>
</ul>
<ul>
<li><strong>이항분포 그래프 그리기</strong>
<img src="https://velog.velcdn.com/images/dayeon_data/post/76a3a32c-5819-4ce4-a642-a3a3ab72e73f/image.png" alt=""><pre><code class="language-python"># 이항분포 생성 
binom_dist = np.random.binomial(n=10, p=0.5, size=1000)
</code></pre>
</li>
</ul>
</li>
</ul>
<h1 id="히스토그램으로-시각화-1">히스토그램으로 시각화</h1>
<p>plt.hist(binom_dist, bins=10, density=True, alpha=0.6, color=&#39;y&#39;)
plt.title(&#39;binomial distribution histogram&#39;)
plt.show()</p>
<pre><code>
#### 8. 푸아송 분포 
- **푸아송 분포**
   - 단위 시간 또는 단위 면적 당 발생하는 사건의 수를 모델링 할 때 사용하는 분포
   - 평균 발생률 ` λ`를 가진 사건이 주어진 시간 또는 공간 내에서 몇 번 발생하는지를 나타냄

- **푸아송 분포 그래프 그리기**
![](https://velog.velcdn.com/images/dayeon_data/post/1915c449-5f2d-4d7d-9396-a42e13d40f0b/image.png)

```python
from scipy.stats import poisson

# 푸아송 분포 파라미터 설정
lambda_value = 4 # 평균 발생률
x = np.arange(0, 15) # 사건 발생 횟수 범위

# 푸아송 분포 확률 질량 함수 계산
poisson_pmf = poisson.pmf(x, lambda_value)

# 그래프 그리기
plt.figure(figsize=(10,6))
plt.bar(x, poisson_pmf, alpha = 0.6, color = &#39;b&#39;, label = f&#39;Poisson PMF (lambda={lambda_value})&#39;)
plt.xlabel(&#39;Number of Events&#39;)
plt.ylabel(&#39;Probability&#39;)
plt.title(&#39;Poisson Distribution&#39;)
plt.legend()
plt.grid(True)
plt.show()</code></pre><h4 id="9-분포-정리하기">9. 분포 정리하기</h4>
<ul>
<li><p><strong>분포들 간의 관계</strong>
<img src="blob:https://velog.io/cc0bbd95-2cd9-4bdf-9db1-99e3f0195a8c" alt="업로드중.."></p>
<ul>
<li>중심극한정리 : 대부분의 경우 데이터 수가 많아지면 정규분포에 수렴
→ 긴 꼬리 분포는 데이터가 많아도 정규분포가 되지 않음</li>
<li>데이터가 적을 경우에는 각 상황에 맞는 분포 선택</li>
</ul>
</li>
<li><p><strong>분포 고르기 팁!</strong></p>
<ul>
<li>데이터 수가 충분하다 
→ 정규분포</li>
<li>데이터 수가 작다 
→ 스튜던트 t 분포</li>
<li>일부 데이터가 전체적으로 큰 영향을 미친다 
→ 롱 테일 분포</li>
<li>범주형 데이터의 독립성 검정이나 적합도 검정 
→ 카이 제곱 분포</li>
<li>결과가 두 개(성공, 실패)만 나오는 상황
→ 이항 분포</li>
<li>특정 시간, 공간에서 발생하는 사건 
→ 푸아송 분포</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[✏️ 2025. 01. 07 TIL]]></title>
            <link>https://velog.io/@dayeon_data/2025.-01.-07-TIL</link>
            <guid>https://velog.io/@dayeon_data/2025.-01.-07-TIL</guid>
            <pubDate>Tue, 07 Jan 2025 10:51:20 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-통계학-라이브세션--1회차">▶ 통계학 라이브세션 : 1회차</h3>
<h4 id="1-통계학-수식">1. 통계학 수식</h4>
<ul>
<li>$X$ : 확률 변수</li>
<li>$x$ : 확률 변수의 실제 값</li>
<li>$\sum$ : 데이터의 합</li>
<li>$\mu$ : 모집단의 평균<h4 id="2-자료형의-종류">2. 자료형의 종류</h4>
</li>
<li><strong>범주형 자료</strong><ul>
<li>명목형 자료 : 순서가 의미없는 자료 </li>
<li>순서형 자료 : 순서가 의미있는 자료 </li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>수치형 자료</strong></p>
<ul>
<li>이산형 자료: 두 데이터 구간이 유한한 자료</li>
<li>연속형 자료: 두 데이터 구간이 무한한 자료<h4 id="3-중심-경향치">3. 중심 경향치</h4>
</li>
</ul>
</li>
<li><p>범주형 요약 : 최빈값(Mode) 사용</p>
</li>
<li><p>수치형 요약 : 평균(Mean), 중앙값(Median) 사용</p>
<h4 id="4-산포도-데이터의-퍼짐-정도를-나타내는-방법">4. 산포도: 데이터의 퍼짐 정도를 나타내는 방법</h4>
</li>
<li><p>IQR (Inter Quantile Range): 백분위 기준 75%(Q3)와 백분위 기준 25%(Q1)의 차이</p>
</li>
<li><p>분산 : 평균 기준으로 데이터가 퍼진 정도
$Var = \sigma^2 = \frac{1}{n} \displaystyle\sum_{i=1}^{n}{(x_i-\mu)}^2$</p>
<ul>
<li>표준 편차: 분산의 제곱근
$\sigma = \sqrt{Var}$</li>
<li>변동계수: 값 스케일에 따라 분산이 달라지는 것을 보정하기 위한 방법
$CV=\frac{표준편차}{평균}$<h4 id="5-numpy-자주-쓰는-함수">5. Numpy 자주 쓰는 함수</h4>
</li>
</ul>
</li>
<li><p><strong>기본 통계 함수</strong></p>
<ul>
<li><code>mean()</code> : 데이터의 평균값 계산</li>
<li><code>median()</code> : 데이터의 중앙값 계산</li>
<li><code>std()</code> : 데이터의 표준편차 계산</li>
<li><code>var()</code> : 데이터의 분산 계산</li>
<li><code>sum()</code> : 데이터의 합계 계산</li>
<li><code>prod()</code> : 데이터의 곱 계산</li>
</ul>
</li>
<li><p><strong>퍼센타일 및 백분위 함수</strong></p>
<ul>
<li><code>percentile()</code> : 데이터의 특정 퍼센타일 값 계산</li>
<li><code>quantile()</code> : 데이터의 특정 분위 값 계산</li>
</ul>
</li>
<li><p><strong>최소값 / 최대값 관련 함수</strong></p>
<ul>
<li><code>min()</code> : 데이터의 최소값 반환</li>
<li><code>max()</code> : 데이터의 최대값 반환</li>
<li><code>argmin()</code> : 최소값의 인덱스 반환</li>
<li><code>argmax()</code> : 최대값의 인덱스 반환</li>
</ul>
</li>
<li><p><strong>데이터 생성 및 처리 함수</strong></p>
<ul>
<li><code>histogram()</code> : 데이터에서 히스토그램 계산</li>
<li><code>unique()</code> : 데이터에서 고유값 반환</li>
<li><code>bincount()</code> : 정수 배열의 값의 빈도 계산</li>
</ul>
</li>
<li><p><strong>랜덤 데이터 생성</strong></p>
<ul>
<li><code>np.random.seed()</code><ul>
<li>난수 생성의 초기값 설정으로 재현 가능성 보장</li>
<li>예시: <code>np.seed(42)</code></li>
</ul>
</li>
<li><code>np.random.rand()</code><ul>
<li>0~1 사이 균등분포에서 난수 생성</li>
<li>예시: <code>np.random.rand(3,2)</code></li>
</ul>
</li>
<li><code>np.random.randn()</code><ul>
<li>표준정규분포에서 난수 생성</li>
<li>예시: <code>np.random.randn(4)</code></li>
</ul>
</li>
<li><code>np.random.randint()</code><ul>
<li>정수 난수 생성</li>
<li>예시: <code>np.random.randint(1,10,size=5)</code></li>
</ul>
</li>
<li><code>np.random.uniform()</code><ul>
<li>균등 분포에서 난수 생성</li>
<li>예시: <code>np.random.uniform(0,10, size=5)</code></li>
</ul>
</li>
<li><code>np.random.normal()</code> <ul>
<li>정해진 평균과 표준편차에서 난수 생성</li>
<li>예시: <code>np.random.normal(0,1,size=10</code></li>
</ul>
</li>
<li><code>np.random.choice()</code><ul>
<li>주어진 배열에서 임의의 값을 샘플링</li>
<li>예시: <code>np.random.choice([1,2,3], sice=2, replace=False)</code></li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="▶-통계학-라이브세션--2회차">▶ 통계학 라이브세션 : 2회차</h3>
<blockquote>
<p>■ 추가 참고 자료 - <a href="https://wikidocs.net/198620">https://wikidocs.net/198620</a></p>
</blockquote>
<h4 id="1-모집단과-표본집단">1. 모집단과 표본집단</h4>
<ul>
<li><p><strong>모집단(Population)</strong></p>
<ul>
<li>표본의 전체가 되는 집단 (궁극적으로 관심있는 집단)</li>
<li>모수(Parameter) : 모집단의 특징</li>
</ul>
</li>
<li><p><strong>표본집단(Sample)</strong></p>
<ul>
<li><p>모집단에서 특정한 방법(sampling method)를 이용하여 뽑아낸 임의의 집단</p>
</li>
<li><p>특징들을 통계량(Statistic)이라고 함</p>
<h4 id="2-샘플링-편향">2. 샘플링 편향</h4>
</li>
<li><p>모집단의 특정 개인이나 그룹이 다른 개인이나 그룹보다 표본에 포함될 가능성이 높아 표본이 편향되거나 대표성을 갖지 못하는 상황</p>
<h4 id="3-기술통계-vs-추론통계">3. 기술통계 vs 추론통계</h4>
</li>
<li><p>기술통계: 데이터의 특징을 이리저리 살펴보는 과정</p>
</li>
<li><p>추론통계: 표본으로부터 모집단을 추정(Estimation)하는 과정</p>
<h4 id="4-분포distribution">4. 분포(Distribution)</h4>
</li>
<li><p>데이터가 특정 값 중심으로 흩어진 형태를 나타내는 통계적 개념</p>
</li>
<li><p><strong>이산형 vs 연속형</strong></p>
</li>
<li><p>이산형 - 데이터 사이에 끊어짐이 있는 경우. 즉, 소수점 형태로 표현되지 못하는 데이터.</p>
</li>
<li><p>연속형 - 데이터와 데이터 사이에 끊어짐이 없이 연속적으로 이어진 경우. 즉, 소수점 형태로 표현할 수 있는 데이터</p>
</li>
<li><p><strong>이산 확률 분포 vs 연속 확률 분포</strong></p>
</li>
<li><p>이산확률분포 - 확률질량함수(PMF)를 사용하여 각 값에 대한 확률 나타냄</p>
</li>
<li><p>연속확률분포 - 확률밀도함수(PDF)를 사용하여 특정 구간에 대한 확률 계산</p>
</li>
<li><p><strong>장점</strong></p>
</li>
<li><p>데이터의 요약(중앙값, 평균, 분산) 등에 대한 수식 표현 가능</p>
</li>
<li><p>모집단을 추정하는 가설의 기반</p>
<h4 id="5-베르누이-분포-bernoulli-distribution">5. 베르누이 분포 (Bernoulli Distribution)</h4>
</li>
<li><p>확률 변수가 취할 수 있는 경우가 2가지인 경우 (예 - 동전 던지기, 클릭 등)</p>
</li>
<li><p>확률 질량 함수: 특정 값이 발생할 확률을 나타내는 함수</p>
</li>
<li><p><strong>베르누이 확률 질량 함수 수식</strong></p>
</li>
</ul>
<p>$P(X=x) = p^x(1-p)^{1-x},$ $x \in {{0,1}}$</p>
<ul>
<li>$P$ : 확률</li>
<li>$X$ : 확률 변수
→ $X=1$은 성공, $X=0$은 실패를 나타냄</li>
<li>$x$ : 확률 변수의 실제 값</li>
<li>$p$ : 확률 실제값<h4 id="6-이항-분포bionomial-distribution">6. 이항 분포(Bionomial Distribution)</h4>
</li>
<li>베르누이 시행을 독립적으로 반복하여 결과를 관찰하는 경우 사용</li>
<li>이진(binary) 결과를 가지는 시행에서 성공 횟수의 확률분포를 나타내는데 사용</li>
</ul>
</li>
</ul>
<ul>
<li><strong>이항 분포의 조건</strong><ul>
<li>각 시행은 두 가지 가능한 결과 중 하나인 &#39;성공&#39;과 &#39;실패&#39;로 나뉨</li>
<li>각 시행은 독립적. 이전 시행의 결과는 현재 시행에 영향을 주지 않음.</li>
<li>각 시행에서의 성공 확률은 고정. 동일한 성공 확률로 시행이 반복됨.</li>
</ul>
</li>
</ul>
<ul>
<li><strong>이항 분포 표현식</strong>
$B(n,p)$<ul>
<li>$n$ : 시행횟수</li>
<li>$p$ : 성공확률</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>이항 분포의 확률 질량 함수 수식</strong> </p>
<p>$P=(X=k) = {n}C_{k}p^k(1-p)^{n-k}$</p>
<ul>
<li><p>$P=(X=k)$ : 확률 변수 $X$가 $k$라는 값을 가질 확률</p>
</li>
<li><p>$n$ : 독립 시행의 총 횟수</p>
</li>
<li><p>$k$ : 성공한 횟수 (예: 동전을 10번 던져 3번 앞면이 나온다면 $k=3$</p>
</li>
<li><p>${n}C_{k}$ : 조합, 즉, $n$번 시행 중에서 $k$번 성공하는 경우의 수</p>
<ul>
<li>계산식 
$nC_k = \binom{n}{k} = \frac{n!}{k!(n-k)!}$</li>
</ul>
</li>
<li><p>$p$ : 성공 확률 (각각의 시행에서 성공할 확률)</p>
<ul>
<li>예를 들어, 동전을 던질 때 앞면이 나올 확률은 $p=0.5$</li>
</ul>
</li>
<li><p>$p^k$: 성공 확률 $p$가 $k$번 발생할 확률</p>
<ul>
<li>예: $p=0.5$, $k=3$이라면 $p^k = (0.5)^3 =0.125$</li>
</ul>
</li>
<li><p>$(1-p)$ : 실패 확률 (각각의 시행에서 실패할 확률)</p>
<ul>
<li>예: 성공 확률이 $p=0.3$이라면 실패 확률은 $1-p=0.7$</li>
</ul>
</li>
<li><p>$(1-p)^{n-k}$</p>
<ul>
<li><p>실패 확률 $(1-p)$가 $n-k$번 발생할 확률을 나타냄</p>
<ul>
<li>예: $n=5$, $k=2$, $1-p=0.7$이라면 $(1-p)^{n-k}=(0.7)^{5-2}=(0.7)^3=0.343$</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>*<em>이항 분포의 정규 근사 *</em></p>
<p>$B(n, p) \approx N\left(np, \sqrt{np(1-p)}\right)$</p>
<ul>
<li><p>좌변 : $B(n, p)$ </p>
<ul>
<li>이항 분포 : $n$번의 독립적인 시행에서 성공 확률이 $p$인 분포</li>
</ul>
</li>
<li><p>우변 : $N(\mu, \sigma^2)$</p>
<ul>
<li>정규 분포로 근사된 표현<ul>
<li>$\mu = np$ : 평균적으로 성공할 횟수</li>
<li>$\sigma = \sqrt{np(1-p)}$: 이항 분포의 표준편차</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>정규 근사 조건</strong></p>
<ul>
<li>$n$이 충분히 크고 $p$가 0이나 1에 너무 치우치지 않은 경우, 해당 데이터를 정규분포로 간주할 수 있음</li>
<li>$n\cdot p\geq5$</li>
<li>$n\cdot (1-p) \geq5$</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="7-균등-분포uniform-distribution">7. 균등 분포(Uniform Distribution)</h4>
<ul>
<li>모든 값이나 구간이 동일한 확률을 가지는 분포<ul>
<li>이산 균등 분포: 특정한 정수 값들이 동일한 확률을 가짐</li>
<li>연속 균등 분포: 특정 구간 내에서 모든 값이 동일한 확률 밀도를 가짐</li>
</ul>
</li>
</ul>
<h4 id="8-정규분포normal-distribution">8. 정규분포(Normal Distribution)</h4>
<ul>
<li>평균을 기준으로 좌우대칭</li>
<li>종모양으로 봉우리가 1개인 연속 확률 분포</li>
<li>자연 현상의 경우, 대부분 이 분포를 따름 
<img src="https://velog.velcdn.com/images/dayeon_data/post/cedb5e4d-9fc7-426e-ae4a-3a895922a790/image.png" alt=""></li>
</ul>
<ul>
<li><p><strong>정규 분포의 장점</strong></p>
<ul>
<li>평균과 표준편차를 알고 있으면 전체 데이터의 몇 %에 포함되는지 알 수 있음</li>
</ul>
</li>
<li><p><strong>정규 분포 표현식</strong></p>
<p>$N\sim(\mu, \sigma^2)$</p>
<ul>
<li>확률 변수 $N$이 평균 $\mu$, 분산 $\sigma^2$를 가지는 정규분포를 따른다는 의미</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dayeon_data/post/7c362879-0ccb-4c2a-96f1-31c4cec1cfc4/image.png" alt=""></p>
<h4 id="9-왜도와-첨도">9. 왜도와 첨도</h4>
<ul>
<li><p>왜도(skewness): 확률의 비대칭 정도를 나타내는 측도</p>
<ul>
<li>긴꼬리 분포라고도 하며 보통 결제 금액, 월급과 같은 수치가 right skewness 특성을 띈다.</li>
</ul>
</li>
<li><p>첨도(kurtosis) : 종모양의 뾰족한 정도를 나타내는 측도</p>
<ul>
<li>첨도가 정규분포보다 낮으면 뭉툭한 모양으로 이상치가 적음</li>
<li>첨도가 정규분포보다 높으면 꼬리(tail)가 길고 이상치가 많음</li>
</ul>
</li>
</ul>
<h4 id="10-표준정규분포">10. 표준정규분포</h4>
<ul>
<li>$\mu = 0,\sigma = 1$인 정규 분포 
( 평균이 0이고 표준편차가 1인 정규 분포)</li>
<li>달성하기 위하여 모든 데이터에 대해 &#39;정규화&#39; 수행<ul>
<li>정규화(Nomalization) : 어떤 대상을 규칙이나 기준에 따른 상태로 만드는 방법</li>
<li>추론 통계에서는 &#39;모든 데이터에서 평균을 빼고 표준편차를 나누는 방법&#39;을 말함</li>
<li>또한 모든 Z값에 대해서 계산해 놓은 표가 있는데 이를 표준정규분포표라고 함</li>
<li>아래의 표는 Z값의 왼쪽 끝부터 해당하는 X값 까지 누적된 확률값을 제공
<img src="blob:https://velog.io/8633721b-2baa-4834-8598-65b03bb02d4c" alt="업로드중.."></li>
</ul>
</li>
</ul>
<h4 id="11-scipy--모듈">11. Scipy  모듈</h4>
<ul>
<li>공학, 사회과학 등에 자주 사용하는 기초통계 모듈과 함수를 모아놓은 라이브러리</li>
</ul>
<ul>
<li><p><strong>Scipy 자주 쓰는 라이브러리</strong></p>
<ul>
<li><code>stats</code> : 통계 분석과 확률 분포 관련 함수 제공</li>
<li><code>norm</code> : 정규 분포 관련 함수 (PDF, CDF, 랜덤 샘플링 등)</li>
<li><code>uniform</code> : 균등 분포</li>
<li><code>bernoulli</code> : 베르누이 분포</li>
<li><code>binom</code> : 이항분포</li>
<li><code>ttest_ind</code> : 독립 두 표본에 대한 t-검정</li>
<li><code>ttest_rel</code> : 대응표본 t-검정</li>
<li><code>mannwhiteneyu</code> : Mann-Whitney U 비모수 검정</li>
<li><code>chi2_contingency</code> : 카이제곱 독립성 검정</li>
<li><code>shapiro</code> : Shapiro-Wilk 정규성 검정</li>
<li><code>kstest</code> : Kolmogorov-Smirnov 검정 (분포 적합성 검정)</li>
<li><code>probplot</code> : Q-Q plot 생성 (정규성 시각화)</li>
<li><code>pearsonr</code> : Pearson 상관계수 계산</li>
<li><code>spearmanr</code> : Spearman 순위 상관계수 계산</li>
<li><code>describe</code> : 기술 통계량 제공 (평균, 표준편차 등)</li>
</ul>
</li>
<li><p><strong>scipy.stats 메소드</strong>
<a href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html">▶ scipy.stats 메뉴얼</a></p>
<ul>
<li><p><strong><code>rvs</code> : 난수 생성</strong></p>
<ul>
<li>Numpy의 Random 모듈에 대응</li>
<li><code>scipy.stats.norm.rvs(loc= 1150, scale = 150, size = 1, random_state= None)</code></li>
<li><code>loc</code> : 평균</li>
<li><code>scale</code> : 표준편차</li>
<li><code>size</code> : 생성할 데이터 갯수</li>
<li><code>random_state</code> : 시드 설정</li>
</ul>
</li>
<li><p><strong><code>pdf</code> : 특정 위치의 확률 구하기</strong></p>
<ul>
<li>pdf ⇒ Probability density function(확률밀도함수)</li>
<li><code>scipy.stats.norm.pdf(x = 1380, loc = 1150, scale = 150)</code></li>
<li><code>x</code> : 구할 x축 값</li>
<li><code>loc</code> : 평균</li>
<li><code>scale</code> : 표준편차</li>
</ul>
</li>
<li><p><strong><code>cdf</code> : 누적확률 분포 구하기</strong></p>
<ul>
<li>cdf ⇒ cumulative density function(누적밀도함수, pdf의 적분값)</li>
<li>pdf와 전달인자는 같으나 누적된 확률(밑변 넓이)를 구함</li>
<li><code>scipy.stats.norm.cdf(x = 1380, loc = 1150, scale = 150)</code></li>
<li><code>x</code> : 구할 x축 값</li>
<li><code>loc</code> : 평균</li>
<li><code>scale</code> : 표준편차</li>
</ul>
</li>
<li><p><strong><code>ppf</code> : 백분율을 알때 거꾸로 x 값 구하기</strong></p>
<ul>
<li>ppf: percent point function</li>
<li>cdf의 역함수</li>
<li><code>scipy.stats.norm.ppf(q = 0.937, loc = 1150, scale = 150)</code><ul>
<li><code>q</code> : 백분율</li>
<li><code>loc</code> : 평균</li>
<li><code>scale</code> : 표준편차</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="▶-통계학-기초-1주차">▶ 통계학 기초 1주차</h3>
<h4 id="1-기술-통계">1. 기술 통계</h4>
<ul>
<li>데이터를 요약하고 설명하는 통계 방법<ul>
<li>주로 평균, 중앙값, 분산, 표준편차 등을 사용 → 데이터를 특정 대표 값으로 요약<h4 id="2-추론-통계">2. 추론 통계</h4>
</li>
<li>표본 데이터를 통해 모집단의 특성을 추정하고 가설을 검정하는 통계 방법<ul>
<li>주로 <strong>신뢰구간, 가설검정</strong> 등을 사용</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><strong>신뢰 구간 (Confidence Interval)</strong><ul>
<li>모집단의 평균이 특정 범위 내에 있을 것이라는 확률을 나타냄</li>
<li>일반적으로 95%의 신뢰 구간 사용</li>
</ul>
</li>
</ul>
<ul>
<li><strong>가설 검정 (Hypothesis Testing)</strong><ul>
<li>가설검정은 모집단에 대한 가설을 검증하기 위해 사용</li>
<li>귀무가설(H0) : 검증하고자 하는 가설이 틀렸음을 나타내는 기본 가설</li>
<li>대립가설(H1) : 그 반대 가설로 주장하는 바를 나타냄</li>
<li>p-value를 통해 귀무가설을 기각할지 여부를 결정</li>
</ul>
</li>
</ul>
<h4 id="3-다양한-분석-방법">3. 다양한 분석 방법</h4>
<ul>
<li><p><strong>위치 추정: 데이터의 중심을 확인하는 방법</strong>
 → 대표적으로 평균, 중앙값 확인</p>
</li>
<li><p><strong>변이추정: 데이터들이 서로 얼마나 다른지 확인하는 방법</strong>
→ 분산, 표준편차, 범위(range) 등을 사용</p>
<ul>
<li><strong>데이터 분포 탐색: 데이터의 값들이 어떻게 이루어져 있는지 확인</strong>
→ 히스토그램, 박스 플롯: 데이터의 분포를 시각적으로 표현하는 대표적인 방식</li>
<li><strong>이진 데이터와 범주 데이터 탐색: 데이터들이 서로 얼마나 다른지 확인</strong>
→ 최빈값(개수가 가장 많은 값)을 주로 사용
→ 파이 차트, 바 그래프: 이진 데이터와 범주 데이터의 분포를 표현하는 대표적인 방법</li>
<li><strong>상관관계: 데이터끼리 서로 관련이 있는지 확인하는 방법</strong>
→ 상관계수 : 두 변수 간의 관계 측정</li>
<li><strong>인과관계와 상관관계의 차이</strong><ul>
<li>상관관계: 두 변수 간의 관계를 나타냄</li>
<li>인과관계: 한 변수가 다른 변수에 미치는 영향을 나타냄</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>두 개 이상의 변수 탐색 : 여러 데이터들끼리 서로 관련이 있는지 확인</strong>
→ 다변량 분석 : 여러 변수 간의 관계를 분석하는 방법</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] np.arange]]></title>
            <link>https://velog.io/@dayeon_data/Python-np.arange</link>
            <guid>https://velog.io/@dayeon_data/Python-np.arange</guid>
            <pubDate>Tue, 07 Jan 2025 07:40:19 GMT</pubDate>
            <description><![CDATA[<h4 id="▶-nparange">▶ <code>np.arange</code></h4>
<ul>
<li>Numpy 라이브러리에서 제공하는 함수</li>
<li>지정된 범위 내에서 일정 간격으로 배열을 생성하는 데 사용</li>
<li>Python의 <code>range</code>와 비슷하지만, 정수 뿐만 아니라 부동소수점 간격도 지원한다는 점에서 더 유용함</li>
</ul>
<h4 id="1-사용법">1. 사용법</h4>
<pre><code class="language-python">numpy.arange([start, ]stop, [step, ]dtype=None, *, like=None)</code></pre>
<ul>
<li><code>start</code> (optional)<ul>
<li>생성할 배열의 시작 값 지정</li>
<li>기본값 = 0</li>
</ul>
</li>
<li><code>stop</code> <ul>
<li>배열 생성이 멈출 값을 지정</li>
<li><code>stop</code>은 포함되지 않음</li>
</ul>
</li>
<li><code>step</code> (optional)<ul>
<li>값들 간의 간격 지정</li>
<li>기본값 = 1</li>
</ul>
</li>
<li><code>dtype</code> (optional)<ul>
<li>생성된 배열의 데이터 타입 지정</li>
<li>지정하지 않으면 입력값에 따라 자동 추론</li>
</ul>
</li>
<li><code>like</code> (optional)<ul>
<li>배열 생성 시 참조할 객체 지정</li>
<li>주로 Numpy API 호환성을 위해 사용<h4 id="2-반환값">2. 반환값</h4>
</li>
</ul>
</li>
<li>지정된 범위와 간격에 따라 생성된 Numpy 배열 반환<h4 id="3-예제">3. 예제</h4>
</li>
<li>정수 간격으로 배열 생성<pre><code class="language-python">import numpy as np
arr = np.arange(5)
print(arr)  # 출력: [0 1 2 3 4]</code></pre>
</li>
<li><code>start</code>와 <code>stop</code> 지정<pre><code class="language-python">arr = np.arange(2, 8)
print(arr)  # 출력: [2 3 4 5 6 7]</code></pre>
</li>
<li>소수점 간격<pre><code class="language-python">arr = np.arange(0, 2, 0.5)
print(arr)  # 출력: [0.  0.5  1.  1.5]</code></pre>
</li>
<li><code>dtype</code> 지정<pre><code class="language-python">arr = np.arange(1, 5, dtype=float)
print(arr)  # 출력: [1. 2. 3. 4.]</code></pre>
<h4 id="4-주의사항">4. 주의사항</h4>
</li>
<li>소수점 간격 사용 시, 부동소수점 오차로 인해 예상과 약간 다른 결과가 나올 수 있음
→ 필요 시 <code>np.linspace</code>를 사용하는 것이 더 나을 수도 있음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] f-string 소수점 포맷팅]]></title>
            <link>https://velog.io/@dayeon_data/Python-f-string-%EC%86%8C%EC%88%98%EC%A0%90-%ED%8F%AC%EB%A7%B7%ED%8C%85</link>
            <guid>https://velog.io/@dayeon_data/Python-f-string-%EC%86%8C%EC%88%98%EC%A0%90-%ED%8F%AC%EB%A7%B7%ED%8C%85</guid>
            <pubDate>Tue, 07 Jan 2025 07:30:18 GMT</pubDate>
            <description><![CDATA[<p>*<em>▶ 기본 형식 *</em></p>
<pre><code class="language-python">print(f&#39;변수: {변수: 타입 지시자}&#39;</code></pre>
<p>*<em>▶ 예시 *</em></p>
<ul>
<li><strong>소수점 자리수 포맷팅</strong><ul>
<li><code>print(f&#39;변수: {변수명: .nf}&#39;)</code>
: 변수를 소수점 n번째 자리까지 반올림하여 표시<pre><code class="language-python">a = 10
print(f&quot;a: {a:.2f}&quot;)
</code></pre>
</li>
</ul>
</li>
</ul>
<p>&#39;&#39;&#39;
[출력]
a: 10.00
&#39;&#39;&#39;</p>
<pre><code>- **백분율**
  - `print(f&#39;변수: {변수명: .n%}&#39;)`
    - 소수점 2자리까지 % 형태로 출력
```python
percent = 0.8299
print(f&#39;퍼센트: {percent:.2%}&#39;)

&#39;&#39;&#39;
[출력]
퍼센트: 82.99%
&#39;&#39;&#39;</code></pre><ul>
<li><strong>부동 소수점 출력</strong><ul>
<li><code>print(f&#39;변수: {변수명: g}&#39;)</code></li>
<li>소수점이 있을 때만 float 형태로 출력<pre><code class="language-python">_list = [2.0, 1.3, 1.0]
</code></pre>
</li>
</ul>
</li>
</ul>
<p>for _ in <em>list:
    print(f&quot;{</em>:g}&quot;)</p>
<p> &#39;&#39;&#39;
[출력]
2
1.3
1
&#39;&#39;&#39;<br>```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[😎 부트캠프 6주차 WIL]]></title>
            <link>https://velog.io/@dayeon_data/%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-5%EC%A3%BC%EC%B0%A8-WIL</link>
            <guid>https://velog.io/@dayeon_data/%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-5%EC%A3%BC%EC%B0%A8-WIL</guid>
            <pubDate>Fri, 03 Jan 2025 10:29:32 GMT</pubDate>
            <description><![CDATA[<p>팀 프로젝트 때문에 정신 없었던 한 주 였다...</p>
<p>분석 작업 하느라 기록하는 걸 뒷전으로 했었는데, 
다음부터는 효율적으로 작업해서 꼭 중간 과정을 기록할 수 있도록 해야겠다.</p>
<h4 id="1-잘한-점">1. 잘한 점</h4>
<hr>
<ul>
<li>주어진 데이터에 대해 계속 고민하고 논리적인 오류가 없는지 점검한 점. 앞으로 계속 유지해야 하는 태도라고 생각한다.</li>
</ul>
<h4 id="2-문제점">2. 문제점</h4>
<hr>
<ul>
<li>첫 번째 프로젝트를 진행했을 때랑 같은 문제인 것 같은데, 이번에도 잘 안됐다. 데이터셋에 대한 명확한 이해가 되지 않은 상태에서 먼저 작업을 진행해서 비효율적으로 작업한 점이 아쉬웠다.</li>
<li>컬럼 하나 하나가 의미하는 바가 뭔지 정확하게 파악하고 싶어서 처음에 컬럼 네이밍이랑 일부 값들만 주구장창 들여다 봤는데, 전체적인 추이를 분석해보는게 더 효율적인 것 같다. 일부 값만 봐서는 백날 들여다봐도 별 인사이트를 얻어낼 수 없다는 점을 깨달았다.. </li>
</ul>
<h4 id="3-해결-방안">3. 해결 방안</h4>
<hr>
<ul>
<li>이 부분은 아직 내공이 부족해서 그런 것 같기도 하다. 공개되어 있는 다양한 데이터셋들로 데이터를 뜯어보는 연습을 하면 좋을 것 같다. </li>
<li>추가적으로 데이터가 뭘 말하고 있는 건지 이 데이터를 통해 어떤 의미를 도출해낼 수 있는지 생각해보는 연습이 필요하다는 생각이 들었다. </li>
<li>데이터 자체랑 친해지기..!! 그리고 컬럼의 의미를 파악하는 것만 중요한 게 아니라, 컬럼 내부의 값들이 어떤 양상을 띄고 있는지 파악하는 것도 중요하다. 앞으로 분석 작업을 할 때는 이러한 점을 반영해서 작업 효율을 높여야겠다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[✏️ 2024. 12. 30 TIL]]></title>
            <link>https://velog.io/@dayeon_data/2024.-12.-30-TIL</link>
            <guid>https://velog.io/@dayeon_data/2024.-12.-30-TIL</guid>
            <pubDate>Mon, 30 Dec 2024 11:52:33 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-기초-프로젝트-데이터-분석">▶ 기초 프로젝트 데이터 분석</h3>
<p><strong>1. 고객별 지출 비용 환산</strong></p>
<ul>
<li><code>customer_id</code>의 유니크 값 기준으로 총 지출 <code>group</code><pre><code class="language-python"># 고객당 총 지출 비용 환산
customer_amount = transcript.groupby(&#39;customer_id&#39;)[&#39;amount&#39;].sum().reset_index()
</code></pre>
</li>
</ul>
<h1 id="hisoplot-활용하여-값-분포-조회">hisoplot 활용하여 값 분포 조회</h1>
<p>sns.histplot(data = customer_amount, x = &#39;amount&#39;, bins = 50, kde=True)</p>
<pre><code>- 결과 테이블
![](https://velog.velcdn.com/images/dayeon_data/post/f5959c40-0d18-417d-9988-903a58130c90/image.png)
- 값 분포 그래프
![](https://velog.velcdn.com/images/dayeon_data/post/58541bb8-574d-4520-b0cd-3276c42fdf36/image.png)

**2. 지출 구간 Group화 진행**
- 100달러 단위로 구간을 나누고 총 매출 대비 매출 비율 계산
&gt; 특정 구간의 고객들이 전체 매출에서 얼마나 많은 비중의 매출을 내고 있는지 확인하는 작업 진행
```python
# 지출 금액 구간 컬럼 생성
customer_amount[&#39;지출 금액 구간&#39;] = pd.cut(customer_amount[&#39;amount&#39;], bins=range(0, int(customer_amount[&#39;amount&#39;].max())+ 100, 100), right=False)

# 각 구간별 매출 비중 집계
total_amount = customer_amount[&#39;amount&#39;].sum()
bins_amount = customer_amount.groupby(&#39;지출 금액 구간&#39;).sum(&#39;amount&#39;)
bins_amount[&#39;percent&#39;] = round(bins_amount/total_amount * 100,2)

bins_amount</code></pre><ul>
<li>총 지출 100~200 달러 미만에 해당하는 고객들이 전체 매출의 35% 가량 발생 시키고 있음</li>
<li>총 지출 0 ~ 300 미만에 해당하는 고객 → 전체 매출의  78.41%</li>
<li>결과 테이블
<img src="https://velog.velcdn.com/images/dayeon_data/post/18de0776-979f-40f9-90d8-31250343fdc1/image.png" alt=""></li>
</ul>
<p><strong>3. 지출 금액 0 ~ 300 달러 구간 프로모션 데이터 분석</strong></p>
<pre><code class="language-python"># 총 지출 금액 300달러 미만인 고객 필터링
filt_amount = customer_amount[customer_amount[&#39;amount&#39;] &lt; 300]

# 필터링 고객 id 기준으로 transcript 테이블 머지
trans_filt_amount = pd.merge(filt_amount, transcript, how = &#39;left&#39;, on = &#39;customer_id&#39;)

# amount_x 컬럼명 수정
trans_filt_amount = trans_filt_amount.rename(columns={&#39;amount_x&#39;:&#39;total_amount&#39;})

# event type이 view인 행만 조회
trans_filt_view = trans_filt_amount.loc[trans_filt_amount[&#39;event&#39;] == &#39;offer viewed&#39;]

# event type이 completed인 행만 조회
trans_filt_completed = trans_filt_amount.loc[trans_filt_amount[&#39;event&#39;] == &#39;offer completed&#39;]

# 프로모션 정보 테이블과 view 테이블 머지
promotion_view = pd.merge(trans_filt_view, portfolio, how=&#39;left&#39;, on=&#39;offer_id&#39;)

# offer type의 고유값 개수 조회
print(promotion_view[&#39;channels&#39;].value_counts(), promotion_view[&#39;offer_type&#39;].value_counts())

# 프로모션 정보 테이블과 completed 테이블 머지
promotion_completed = pd.merge(trans_filt_completed, portfolio, how=&#39;left&#39;, on=&#39;offer_id&#39;)

# offer type의 고유값 개수 조회
print(promotion_completed[&#39;channels&#39;].value_counts(), promotion_completed[&#39;offer_type&#39;].value_counts())</code></pre>
<ul>
<li>조회 수 연산
<img src="https://velog.velcdn.com/images/dayeon_data/post/ea49d4de-68a3-4b24-8a77-12a379262012/image.png" alt=""><ul>
<li><code>web, email, mobile, social 채널</code>의 프로모션의 조회수가 가장 높음</li>
<li><code>BOGO 타입</code>의 프로모션 조회수가 가장 높음</li>
</ul>
</li>
<li>완료 수 연산
<img src="https://velog.velcdn.com/images/dayeon_data/post/f79d7f2e-f5d8-4c53-8bd3-7bc14f1c712a/image.png" alt=""><ul>
<li><code>web, email, mobile, social 채널</code> 의 프로모션의 완료 수가 가장 많음</li>
<li><code>Discouunt 타입</code>의 프로모션 완료 수가 가장 많음</li>
</ul>
</li>
</ul>
<p><strong>4. 지출 금액 100 ~ 200 달러 구간 프로모션 데이터 분석</strong></p>
<pre><code class="language-python"># 총 지출 금액 100-200달러 미만인 고객 필터링
filt_amount = customer_amount[(customer_amount[&#39;amount&#39;] &gt;=100)&amp;(customer_amount[&#39;amount&#39;] &lt; 200)]

# 필터링 고객 id 기준으로 transcript 테이블 머지
trans_filt_amount = pd.merge(filt_amount, transcript, how = &#39;left&#39;, on = &#39;customer_id&#39;)

# amount_x 컬럼명 수정
trans_filt_amount = trans_filt_amount.rename(columns={&#39;amount_x&#39;:&#39;total_amount&#39;})

# event type이 view인 행만 조회
trans_filt_view = trans_filt_amount.loc[trans_filt_amount[&#39;event&#39;] == &#39;offer viewed&#39;]

# event type이 completed인 행만 조회
trans_filt_completed = trans_filt_amount.loc[trans_filt_amount[&#39;event&#39;] == &#39;offer completed&#39;]

# 프로모션 정보 테이블과 view 테이블 머지
promotion_view = pd.merge(trans_filt_view, portfolio, how=&#39;left&#39;, on=&#39;offer_id&#39;)

# offer type의 고유값 개수 조회
print(promotion_view[&#39;channels&#39;].value_counts(), promotion_view[&#39;offer_type&#39;].value_counts())</code></pre>
<ul>
<li>조회 수 계산<ul>
<li><code>web, email, mobile, social 채널</code>의 프로모션의 조회수가 가장 높음</li>
<li><code>BOGO 타입</code>의 프로모션 조회수가 가장 높음
<img src="https://velog.velcdn.com/images/dayeon_data/post/4fd5ae14-1e8e-42cc-a33a-5a940000e9f7/image.png" alt=""></li>
</ul>
</li>
<li>완료 수 계산<ul>
<li><code>web, email, mobile, social 채널</code> 의 프로모션의 완료 수가 가장 많음</li>
<li><code>Discouunt 타입</code>의 프로모션 완료 수가 가장 많음
<img src="https://velog.velcdn.com/images/dayeon_data/post/fdd55318-146b-461c-b7a1-2e9a92476814/image.png" alt=""></li>
</ul>
</li>
</ul>
<p><strong>5. 결제 횟수, 객단가, 총 결제 금액 간 상관관계 분석</strong></p>
<ul>
<li>구매 빈도 + 객단가 계산 코드<pre><code class="language-python"># 고객당 총 지출 비용 환산 (전체 기간 기준)
customer_amount = transcript.groupby(&#39;customer_id&#39;)[&#39;amount&#39;].sum().reset_index()
</code></pre>
</li>
</ul>
<h1 id="고객당-총-결제-횟수-계산">고객당 총 결제 횟수 계산</h1>
<p>customer_trans_count= transcript[transcript[&#39;event&#39;]==&#39;transaction&#39;].groupby(&#39;customer_id&#39;)[&#39;event&#39;].count().reset_index()</p>
<h1 id="테이블-머지">테이블 머지</h1>
<p>merge_table = pd.merge(customer_amount, customer_trans_count, on=&#39;customer_id&#39;)</p>
<h1 id="객단가-계산---구매-기록-없는-고객-제외">객단가 계산 - 구매 기록 없는 고객 제외</h1>
<p>merge_table[&#39;객단가&#39;] = merge_table[&#39;amount&#39;] / merge_table[&#39;event&#39;]</p>
<p>merge_table</p>
<pre><code>- 구매 횟수 + 객단가 계산 테이블
![](https://velog.velcdn.com/images/dayeon_data/post/90076779-89a2-49e0-8940-9badca7a25f9/image.png)
- Heatmap 시각화
![](https://velog.velcdn.com/images/dayeon_data/post/8369c899-f460-465d-b772-e0c32170ea57/image.png)

- 상관관계 분석 코드
```python
columns = merge_table[[&#39;amount&#39;, &#39;event&#39;, &#39;객단가&#39;]]

corr_matrix = columns.corr()
corr_matrix

sns.heatmap(corr_matrix, annot = True, cmap=&#39;coolwarm&#39;)</code></pre><blockquote>
<p><strong>[ 객단가 - 총 결제 금액 간의 상관 계수 ]</strong> 
⇒ <code>0.77</code> 강한 양적 상관 관계</p>
</blockquote>
<p><strong>6. 총 지출 금액 상위 N% 고객의 지출 조회</strong></p>
<pre><code class="language-python"># 상위 10% 기준 계산 - 구매 기록 없는 고객 제외
threshold_10 = merge_table[&#39;amount&#39;].quantile(0.90)

# 상위 20% 기준 계산 - 구매 기록 없는 고객 제외
threshold_20 = merge_table[&#39;amount&#39;].quantile(0.80)

# 상위 10% 고객 필터링 - 1,622명
top_10_percent = merge_table[merge_table[&#39;amount&#39;] &gt;= threshold_10]

# 상위 10% 고객 지출 / 전체 매출 - 35%
(top_10_percent[&#39;amount&#39;].sum()/transcript[&#39;amount&#39;].sum()) * 100

# 상위 20% 고객 필터링 - 3,240명
top_20_percent = merge_table[merge_table[&#39;amount&#39;] &gt;= threshold_20]

# 상위 20% 고객 지출 / 전체 매출 - 53%
(top_20_percent[&#39;amount&#39;].sum()/transcript[&#39;amount&#39;].sum()) * 100</code></pre>
<ul>
<li>상위 10% 고객의 매출이 <strong>전체 매출의 35%</strong> 차지
→ <code>min</code> : 229.37 / <code>max</code> : 1608.69</li>
<li>상위 20% 고객의 매출이 <strong>전체 매출의 53%</strong> 차지
→ <code>min</code>: 170.66 / <code>max</code> : 1608.69</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] max()]]></title>
            <link>https://velog.io/@dayeon_data/Python-max</link>
            <guid>https://velog.io/@dayeon_data/Python-max</guid>
            <pubDate>Mon, 30 Dec 2024 01:14:11 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-max">▶ max()</h3>
<ul>
<li>주어진 반복 가능한 객체나 인자들 중에서 가장 큰 값을 반환하는 파이썬 내장함수<pre><code class="language-python">max(iterable, *[, key, default])
max(arg1, arg2, *args[, key])</code></pre>
</li>
<li><em>1. 첫 번째 사용법(iterable)*</em></li>
<li><code>max()</code>는 반복 가능한 객체(<code>iterable</code>)에서 가장 큰 값 반환</li>
<li>선택적으로 <code>key</code> 매개변수를 사용하여 사용자 정의 기준에 따라 비교 가능</li>
<li>비어있는 iterable한 객체를 처리하려면 <code>default</code> 인수를 제공해야 함<pre><code class="language-python">numbers = [1, 3, 2, 5, 4]
print(max(numbers))  # 출력: 5</code></pre>
<pre><code class="language-python">strings = [&quot;apple&quot;, &quot;banana&quot;, &quot;cherry&quot;]
print(max(strings, key=len))  # 출력: &quot;banana&quot; (길이를 기준으로 비교)</code></pre>
<pre><code class="language-python">empty_list = []
print(max(empty_list, default=&quot;No elements&quot;))  # 출력: &quot;No elements&quot;</code></pre>
</li>
<li><em>2. 두 번째 사용법 (arg1, arg2, <em>args)</em></em></li>
<li>두 개 이상의 인자를 개별적으로 전달 가능</li>
<li>이 경우 큰 인자를 반환</li>
<li>선택적으로 <code>key</code> 매개변수 사용 가능<pre><code class="language-python">print(max(1, 3, 2, 5, 4))  # 출력: 5</code></pre>
<pre><code class="language-python">print(max(&quot;apple&quot;, &quot;banana&quot;, &quot;cherry&quot;, key=len))  # 출력: &quot;banana&quot;</code></pre>
</li>
<li><em>3. 매개변수*</em></li>
<li><code>iterable</code> : 반복 가능한 객체 (리스트, 튜플, 문자열 등)</li>
<li><code>arg1</code>, <code>arg2</code>, <code>*args</code> : 개별 인자들</li>
<li><code>key</code>: 비교를 위한 사용자 정의 기준을 제공하는 함수</li>
<li><code>default</code> : 빈 반복 가능한 객체에서 반환할 기본값<ul>
<li>iterable이 비어 있으면 default가 없을 경우 예외(ValueError)가 발생</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[✏️ 2024. 12. 26 TIL]]></title>
            <link>https://velog.io/@dayeon_data/2024.-12.-26-TIL</link>
            <guid>https://velog.io/@dayeon_data/2024.-12.-26-TIL</guid>
            <pubDate>Thu, 26 Dec 2024 11:08:27 GMT</pubDate>
            <description><![CDATA[<h3 id="▶-기초-프로젝트-데이터셋-분석">▶ 기초 프로젝트 데이터셋 분석</h3>
<h4 id="선정-데이터-스타벅스-마케팅-데이터">선정 데이터: 스타벅스 마케팅 데이터</h4>
<p><a href="https://www.kaggle.com/datasets/ihormuliar/starbucks-customer-data?select=transcript.csv"><img src="https://velog.velcdn.com/images/dayeon_data/post/88de4e64-b61c-4692-a8ac-5e694132ea50/image.png" alt=""></a></p>
<ul>
<li>스타벅스 프로모션 제안 관련 고객 데이터 </li>
<li>총 3개의 테이블로 프로모션 정보를 담은 <code>portfolio</code> 테이블, 고객 행동 기록 데이터를 담은 <code>transcript</code> 테이블, 고객 정보를 담은 <code>profile</code> 테이블로 구성</li>
</ul>
<h4 id="raw-data-구조">Raw Data 구조</h4>
<p><img src="https://velog.velcdn.com/images/dayeon_data/post/1a996c00-7ddf-4880-ac29-aa203645567a/image.png" alt=""></p>
<h4 id="1-portfolio-테이블">1. Portfolio 테이블</h4>
<p><img src="https://velog.velcdn.com/images/dayeon_data/post/dd814ea5-cb67-46d6-9942-c6d1ff504330/image.png" alt=""></p>
<blockquote>
<p><strong>✅ Portfolio 테이블 설명 → 프로모션 정보 테이블</strong>
수신 가능한 프로모션 제안에 대한 정보와 각 프로모션의 유형, 프로모션 기간, 보상 그리고 해당 프로모션이 고객에게 어떻게 배포 되었는지에 대한 기본 정보</p>
</blockquote>
<p><strong>1-1) reward</strong></p>
<ul>
<li>제안을 완료했을 때 제공되는 보상 
( → 단위 확인되면 좋을 것 같은데.. )</li>
</ul>
<p><strong>1-2) channels</strong></p>
<ul>
<li>마케팅 채널 → 문자열 리스트로 구성</li>
<li>리스트 포함 요소 : web / email / mobile / social</li>
</ul>
<p><strong>1-3) difficulty</strong></p>
<ul>
<li>오퍼를 완료하기 위해 필요한 최소 지출액
( → 얘도 단위 확인되면 좋을 것 같다..ㅜㅜ )</li>
</ul>
<p>*<em>1-4) duration *</em></p>
<ul>
<li>기간 
( → 컬럼 설명에 UNKNOWN으로 되어 있어서 어떻게 처리할지 더 생각해봐야 할 것 같다. )</li>
</ul>
<p>*<em>1-5) offer_type *</em></p>
<ul>
<li>프로모션 제안 유형 : 1+1(BOGO), 할인, 정보 제공</li>
<li>고유값 : Bogo, infomational, discount</li>
</ul>
<p><strong>1-6) id</strong></p>
<ul>
<li>오퍼 id </li>
<li>portfolio 테이블과 연결할 때 사용</li>
</ul>
<hr>
<h4 id="2-profile-테이블">2. Profile 테이블</h4>
<p><img src="https://velog.velcdn.com/images/dayeon_data/post/78472483-41e1-4649-abfd-7553c8864061/image.png" alt=""></p>
<blockquote>
<p>*<em>✅ profile 테이블 설명 → 고객 정보 테이블 *</em></p>
</blockquote>
<ul>
<li>각 사람에 대한 연령, 급여, 성별과 같은 차원 데이터를 포함</li>
<li>각 기록에는 하나의 고유한 고객이 포함되어 있음</li>
</ul>
<p><strong>2-1) gender</strong></p>
<ul>
<li><ul>
<li>고객의 성별 (일부 항목에는 M 또는 F 대신 &#39;O&#39;(기타)를 포함하고 있음)</li>
</ul>
</li>
<li>결측치 : 2,175</li>
<li>성별 데이터 기준으로 분류 시 <code>O</code>, <code>Nan</code>은 데이터에서 제거<ul>
<li>총 17,000건의 데이터 중 2,387 건이 <code>O</code> , <code>Nan</code> 에 해당<pre><code class="language-python"># gender 컬럼의 Value_count
profile[&#39;gender&#39;].value_counts(dropna=False)
</code></pre>
</li>
</ul>
</li>
</ul>
<p>&#39;&#39;&#39;
gender
M      8484
F      6129
NaN    2175
O       212
&#39;&#39;&#39;</p>
<pre><code>
**2-2) age**
- 고객의 나이
- 결측치 : 0 / min 값 : 118 / max 값: 18
```python
# age 컬럼 결측치 조회
null_cnt = profile[&#39;age&#39;].isna().sum()

# min, max 값 조회
max_age = max(profile[&#39;age&#39;])
min_age = min(profile[&#39;age&#39;])


print(f&#39;결측치: {null_cnt}&#39;)
print(f&#39;max: {max_age}, min: {min_age}&#39;)</code></pre><p><strong>2-3) id</strong></p>
<ul>
<li>고객 id</li>
<li><code>transcript</code> 테이블의 <code>person</code>과 연결</li>
<li>결측치 : 0 / 중복값 : 0<pre><code class="language-python"># id 컬럼 null값 조회
profile[&#39;id&#39;].isna().sum()
</code></pre>
</li>
</ul>
<h1 id="중복값-개수-조회">중복값 개수 조회</h1>
<p>profile[&#39;id&#39;].duplicated().sum()</p>
<pre><code>
**2-4) became_member_on**
- 고객이 앱 계정을 생성한 날짜
- 결측치 : 0 , min: 20230729, max: 20180726
-  dtype ⇒ int (형 변환 작업 필요)
```python
# became_member_on 결측치 조회
profile[&#39;became_member_on&#39;].isna().sum()

# dtype 조회
profile[&#39;became_member_on&#39;].dtypes

# min, max 값 조회
max(profile[&#39;became_member_on&#39;]) 
min(profile[&#39;became_member_on&#39;])</code></pre><p><strong>2-5) income</strong></p>
<ul>
<li>고객의 수입</li>
<li>결측치: 2,175 , max: 120,000, min: 30,000<pre><code class="language-python"># income 결측치 조회
profile[&#39;income&#39;].isna().sum()
</code></pre>
</li>
</ul>
<h1 id="min-max-값-조회">min, max 값 조회</h1>
<p>max(profile[&#39;income&#39;].dropna())
min(profile[&#39;income&#39;].dropna())</p>
<pre><code>→ max 연산자 사용 했더니 결과값이 `nan`으로 나왔다 .. ⇒ 결측값 제거 후 다시 연산해서 해결!

---
#### 3. transcript 테이블
![](https://velog.velcdn.com/images/dayeon_data/post/a25b1b22-e043-4705-99be-7e75ad013874/image.png)

&gt; **✅ transcript 테이블 설명 ⇒** 프로모션 수신 기록 테이블
- 기록에는 고객이 받은 프로모션 오퍼의 여러 단계가 표시
- 프로모션 수신의 고유 값은 수신, 보기, 완료 
- 고객이 고객이 된 이후 시간 동안 수행한 다양한 거래도 확인 가능
- 모든 기록을 통해 스타벅스와 상호작용한 날짜와 금액도 확인 가능

**3-1) person**
- 고객 id 
- `profile` 테이블의 `id` 와 연결

**3-2) event**
- record의 유형
- 고유 값 : offer received / offer viewed / transction / offer 
completed
* value_count 그래프
![](https://velog.velcdn.com/images/dayeon_data/post/b03f7a5b-0231-4789-a62d-2586174185ad/image.png)
```python
# event 컬럼의 Value Count
event_value_cnt = transcript[&#39;event&#39;].value_counts(dropna=False)
event_value_cnt = pd.DataFrame(event_value_cnt).reset_index()
event_value_cnt

bar = plt.bar(event_value_cnt[&#39;event&#39;], event_value_cnt[&#39;count&#39;])

for rect in bar:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width()/2.0, height, &#39;%.1f&#39; % height, ha=&#39;center&#39;, va=&#39;bottom&#39;, size = 9)</code></pre><p><strong>3-3) value</strong></p>
<ul>
<li>record 유형에 따른 프로모션 ID or 거래 금액을 나타냄 </li>
<li>문자열 Dictionary → 전처리 작업 필요</li>
</ul>
<p><strong>3-4) time</strong></p>
<ul>
<li>시간 (시간 단위) 
→ 정확한 의미는 알지 못하겠으나.. 가입 후 해당 행동까지 소요된 시간을 의미하는 건가..?
→ 더 탐구해봐야 할 필요성..!</li>
<li>Data는 t=0에서 시작</li>
</ul>
<hr>
<h3 id="간단한-전처리-작업">간단한 전처리 작업</h3>
<h4 id="1-profile-테이블">1. Profile 테이블</h4>
<ul>
<li>became_member_on 컬럼<ul>
<li>dtype → int ⇒ datetime 형태로 변환<pre><code class="language-python">profile[&#39;became_member_on&#39;] = pd.to_datetime(profile[&#39;became_member_on&#39;])</code></pre>
</li>
<li>age 컬럼<ul>
<li>이상치 판별에 대한 기준이 필요할 듯..</li>
<li>age가 80 이상인 행 수 = 3,277</li>
<li>age가 90 이상인 행 수 = 2,446</li>
<li>전체 행 수 = 17,000<pre><code class="language-python"># df.shape = (행 개수, 열 개수) 튜플 반환
</code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="80세-이상-데이터-수">80세 이상 데이터 수</h1>
<p>profile[profile[&#39;age&#39;] &gt;= 80].shape[0]</p>
<h1 id="90세-이상-데이터-수">90세 이상 데이터 수</h1>
<p>profile[profile[&#39;age&#39;] &gt;= 90].shape[0]  </p>
<pre><code>
#### 2. transcript 테이블
- value 컬럼
  - transcript의 value 컬럼 = 문자열 Dictionary 형태로 구성
  - `json` 형태의 데이터를 꺼내 개별 컬럼에 추가해주는 작업 진행
![](https://velog.velcdn.com/images/dayeon_data/post/e0dd5b39-3a70-497e-98e4-88b3dbccacb8/image.png)

**[ 세부 작업 내용 ]**
- transcript의 value 컬럼 정규화
  - `pd.json_normalize()` 바로 적용하려 했는데 에러 발생
  - value 컬럼의 첫번째 값을 뽑아봤더니 string 형태
![](https://velog.velcdn.com/images/dayeon_data/post/a867e4a4-460b-4aa7-b535-75c48945c02d/image.png)
  -  `ast` 모듈의 `literal_eval` 사용하여 Dict 타입으로 변환
- 정상적으로 데이터 변환되는 것 확인
![](https://velog.velcdn.com/images/dayeon_data/post/d1568cf6-da95-4790-a5bc-1feb8822e37f/image.png)
- 리스트 컴프리헨션 사용하여 value 컬럼의 데이터 타입 교체
- `json_normalize` 활용하여 별도의 테이블로 추출
```python
# value 컬럼 데이터 형 변환
transcript[&#39;value&#39;] = [literal_eval(x) for x in transcript[&#39;value&#39;]]

# json_normalize() : 딕셔너리 =&gt; 테이블로 변환
value_df = pd.json_normalize(transcript[&#39;value&#39;])

value_df</code></pre><p><img src="https://velog.velcdn.com/images/dayeon_data/post/613e9c27-059e-4be2-8a51-a189832b502a/image.png" alt=""></p>
<ul>
<li>offer id를 표시하는 컬럼이 두 개로 나눠짐 (<code>offer_id</code> , <code>offer id</code>)
  → <code>offer_id</code>의 결측 값을 <code>offer id</code> 의 값으로 대체<pre><code class="language-python"># offer_id 컬럼의 결측값에 offer id 컬럼값 입력
value_df[&#39;offer_id&#39;] = value_df[&#39;offer_id&#39;].fillna(value_df[&#39;offer id&#39;])</code></pre>
</li>
<li>기존 테이블에 value 테이블의 값 집어넣기<pre><code class="language-python"># 기존 테이블(transcript)에 value 값 합치기
transcript[&#39;value_offer_id&#39;] = value_df[&#39;offer_id&#39;]
transcript[&#39;value_amount&#39;] = value_df[&#39;amount&#39;]
transcript[&#39;value_reward&#39;] = value_df[&#39;reward&#39;]</code></pre>
</li>
</ul>
<h4 id="수정-데이터-구조">수정 데이터 구조</h4>
<p><img src="https://velog.velcdn.com/images/dayeon_data/post/f735ad27-2f7f-4425-aaf2-1a4df46655fd/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 코드카타 문제 풀이]]></title>
            <link>https://velog.io/@dayeon_data/24.12.20-TIL</link>
            <guid>https://velog.io/@dayeon_data/24.12.20-TIL</guid>
            <pubDate>Thu, 26 Dec 2024 01:23:08 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>문제</strong> <a href="https://school.programmers.co.kr/learn/courses/30/lessons/70128">▶ 프로그래머스 링크</a>
길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 <a href="https://en.wikipedia.org/wiki/Dot_product">내적</a>을 return 하도록 solution 함수를 완성해주세요.
이때, a와 b의 내적은 <code>a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1]</code> 입니다. (n은 a, b의 길이) </p>
</blockquote>
<pre><code class="language-python"># 오답 코드
def solution(a,b):
    answer = 0
    for num_a in a:
        for num_b in b:
            answer += num_a * num_b 
    return answer</code></pre>
<ul>
<li>오답: 이중 for문을 돌렸는데 정답이 이상하게 나왔다!
→ for문 2개를 하나씩 돌리면 결과값이 나오지 않을까? = 멍청한 생각이었음.. 
→ 아래 코드에서는 첫 번째 for문이 한 번 돌 때마다 두 번째 for문은 list의 원소를 다 출력해 버린다.
→ 즉, <code>a[0]*b[0] + a[0]*b[1] + … + a[0]*b[-1]</code>  ⇒ 이딴 식으로 결과 값이 나오는 것!</li>
</ul>
<ul>
<li><p>해결 방안 1: <code>for i in range (0, len(list))</code>로 숫자를 뽑아 인덱스 번호를 할당해서 계산하기</p>
<pre><code class="language-python">def solution(a, b):
  answer = 0
  for i in range(0,len(a)):
      answer += a[i] * b[i]
  return answer</code></pre>
</li>
<li><p>해결 방안 2: <code>zip()</code> 사용하기
→ 사실 이 방법을 몰라서 이중 for문을 돌리는 우매한 선택을 해버렸던 것..</p>
<pre><code class="language-python">def solution(a, b):
  answer = 0
  for n1, n2 in zip(a, b):
      answer += n1 * n2
  return answer</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 코드카타 문제 풀이]]></title>
            <link>https://velog.io/@dayeon_data/Python-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80</link>
            <guid>https://velog.io/@dayeon_data/Python-%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80</guid>
            <pubDate>Thu, 26 Dec 2024 01:15:53 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>[문제] 문자열 내림차순으로 배치하기</strong>
문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.</p>
</blockquote>
<pre><code class="language-python"># 정답 코드
def solution(s):
    answer = &#39;&#39;
    s = sorted(list(s), reverse = True)   
    answer = &#39;&#39;.join(s)
    return answer</code></pre>
<ul>
<li>입력된 문자열 <code>s</code>를 <code>list()</code>로 형 변환 해준 뒤, <code>sorted()</code> 함수를 사용하여 순서 뒤집기</li>
<li><code>join()</code> 사용하여 리스트 내부의 요소들 문자열 형태로 재정렬</li>
</ul>
<hr>
<p><strong>[▶ TIP] <code>sorted()</code> 함수의 문자열 정렬</strong></p>
<p>** 1. 정렬 기준**</p>
<ul>
<li>유니코드 코드 포인트 순서<ul>
<li>각 문자의 유니코드 값에 따라 정렬</li>
<li>유니코드 값은 <code>ord()</code> 함수를 사용하여 확인</li>
</ul>
</li>
<li>대소문자 구분<ul>
<li>소문자의 유니코드 값은 대문자보다 큼</li>
<li>따라서 기본 정렬에서는 대문자가 소문자보다 앞에 위치</li>
</ul>
</li>
<li>사전 순서<ul>
<li>같은 문자를 여러 개 포함하는 경우, 입력된 문자열에서 나타난 순서를 기준으로 정렬</li>
</ul>
</li>
</ul>
<p><strong>2. 사용 예제</strong></p>
<ul>
<li>문자열 정렬<pre><code class="language-python">text = &quot;HelloWorld&quot;
sorted_text = sorted(text)
print(sorted_text)  # 출력: [&#39;H&#39;, &#39;W&#39;, &#39;d&#39;, &#39;e&#39;, &#39;l&#39;, &#39;l&#39;, &#39;l&#39;, &#39;o&#39;, &#39;o&#39;, &#39;r&#39;]</code></pre>
</li>
<li>대소문자 혼합 문자열 정렬<pre><code class="language-python">text = &quot;aAbBcC&quot;
sorted_text = sorted(text)
print(sorted_text)  # 출력: [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;a&#39;, &#39;b&#39;, &#39;c&#39;]</code></pre>
</li>
<li>역순 정렬<pre><code class="language-python">text = &quot;HelloWorld&quot;
sorted_text = sorted(text, reverse=True)
print(sorted_text)  # 출력: [&#39;r&#39;, &#39;o&#39;, &#39;o&#39;, &#39;l&#39;, &#39;l&#39;, &#39;l&#39;, &#39;e&#39;, &#39;d&#39;, &#39;W&#39;, &#39;H&#39;]</code></pre>
</li>
</ul>
<p><strong>3. 정렬 기준 커스터마이징</strong></p>
<ul>
<li>대소문자를 무시한 정렬<ul>
<li>key=str.lower를 사용하여 대소문자 구분 없이 정렬</li>
</ul>
</li>
</ul>
<pre><code class="language-python">text = &quot;aAbBcC&quot;
sorted_text = &#39;&#39;.join(sorted(text, key=str.lower))
print(sorted_text)  # 출력: aAbBcC</code></pre>
<ul>
<li>유니코드 역순 정렬<pre><code class="language-python">text = &quot;HelloWorld&quot;
sorted_text = &#39;&#39;.join(sorted(text, key=ord, reverse=True))
print(sorted_text)  # 출력: rllloWdHeo</code></pre>
</li>
</ul>
<hr>
]]></description>
        </item>
    </channel>
</rss>