<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>stand_hyo.log</title>
        <link>https://velog.io/</link>
        <description>Data Analyst</description>
        <lastBuildDate>Thu, 02 Mar 2023 01:55:24 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>stand_hyo.log</title>
            <url>https://velog.velcdn.com/images/stand_hyo/profile/6c38c637-88cd-403b-8453-d2924f6d6798/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. stand_hyo.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/stand_hyo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[통계학] - 통계 분석방법 총정리 & 사용순서]]></title>
            <link>https://velog.io/@stand_hyo/%ED%86%B5%EA%B3%84%ED%95%99-%ED%86%B5%EA%B3%84-%EB%B6%84%EC%84%9D%EB%B0%A9%EB%B2%95-%EC%B4%9D%EC%A0%95%EB%A6%AC-%EC%82%AC%EC%9A%A9%EC%88%9C%EC%84%9C</link>
            <guid>https://velog.io/@stand_hyo/%ED%86%B5%EA%B3%84%ED%95%99-%ED%86%B5%EA%B3%84-%EB%B6%84%EC%84%9D%EB%B0%A9%EB%B2%95-%EC%B4%9D%EC%A0%95%EB%A6%AC-%EC%82%AC%EC%9A%A9%EC%88%9C%EC%84%9C</guid>
            <pubDate>Thu, 02 Mar 2023 01:55:24 GMT</pubDate>
            <description><![CDATA[<h3 id="🔎-통계학의-이해도를-높여주는-도표">🔎 통계학의 이해도를 높여주는 도표</h3>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/464d66f1-5cd7-4472-b700-82f00d1e6bde/image.png" alt=""></p>
<ul>
<li><p>설명변수가 질적이라면, 기준 카테고리를 정해놓고 이항으로 분류</p>
<ul>
<li>수백 건 이상의 데이터가 있으므로 실용측면에서는 z검정</li>
<li>더 확실히 검정한다는 의미로 <u>평균값의 차이</u>에 관해선 t검정</li>
<li>비율 차이는 데이터 수가 적더라도 문제 없으므로 z검정이나 카이제곱검정</li>
</ul>
</li>
<li><p>t검정 / z검정, 카이제곱검정과 동일한 결과</p>
<ul>
<li>t검정 : &#39;두 값의 설명변수를 하나만 사용한 다중회귀분석(단순회귀분석)</li>
<li>z검정, 카이제곱검정 : &#39;두 값의 설명변수를 하나만 사용한 로지스틱 회귀분석</li>
</ul>
</li>
</ul>
<br>


<h3 id="🔎-비즈니스에서-활용하는-경우-분석-순서">🔎 비즈니스에서 활용하는 경우 분석 순서</h3>
<h4 id="1--다중회귀분석--로지스틱-회귀분석으로-관련성-분석">1.  다중회귀분석 / 로지스틱 회귀분석으로 관련성 분석</h4>
<p>1) 대략적인 데이터 정리와 확인
2) 최대화 혹은 최소화해야 할 아웃컴이 무엇인지 정함
3) 그 이외의 모든 항목을 설명변수의 후보로 놓고 다중회귀분석 or 로지스틱 회귀분석 (설명변수가 지나치게 많은 상황 방지를 위해 변수 선택법 사용)</p>
<h4 id="2-결과-해석">2. 결과 해석</h4>
<p>1) &#39;이익을 올려주는 아이디어&#39;를 한번에 발견! &gt; GOOD
2) &#39;여러 설명변수와 아웃컴의 관련성이 나타나지만 석연치 않음&#39; &gt; 설명변수의 선별 선택</p>
<p>💡 <strong>[ 설명변수의 선별 선택 ]</strong></p>
<ul>
<li><p><u>아웃컴과의 관련성이 너무 당연한 듯 보이는 설명변수</u>는 p-값이 아무리 작아도 제외 (ex. 구매상품이 증가할 때마다 구매금액이 증가)</p>
</li>
<li><p>당연한 설명변수가 포함되어 있을 땐, 다른 설명변수에 관한 회귀계수를 해당 설명변수의 회귀계수와 비교하는 것을 유의</p>
</li>
<li><p><u>특정한 회귀계수의 해석을 어렵게 만드는 설명변수</u>는 제외 
(ex. &#39;다른 설명변수의 값이 동일하다는 가정하에서&#39;)</p>
</li>
<li><p>설명변수의 <u>취급방법을 바꾸는 것</u>이 나을 때도 존재
(ex. 양적변수 : 나이 &gt; 질적변수 : 세대)</p>
</li>
<li><p>꼭 포함되어야 하는 설명변수가 자동 변수선택 과정에서 삭제되었을 경우에는, 강제로라도 그 설명변수를 포함</p>
</li>
</ul>
<blockquote>
<p>설명변수 선별선택과 결과 해석 과정에서 &#39;인자분석&#39;과 &#39;군집분석&#39; 사용하면 결과에 도움이 됨</p>
</blockquote>
<br>


<p>💡 <strong>[ 분석결과에서 아이디어를 찾아내는 방법 ]</strong></p>
<blockquote>
<p>이익창출을 위한 아이디어</p>
</blockquote>
<p>1) 아웃컴과 관련된 설명변수가 광고나 상품생산, 연수 등에 의해 &#39;조정&#39;이 가능하다면 그 설명변수를 조정하는 것이 이익을 낳는 아이디어</p>
<p>2) 현시점에서 &#39;신뢰할 수 있다&#39;고 생각할 만한 목표로 설정한 시장의 고객은 몇사람이나 되는지 파악하고 설명변수를 조정</p>
<ul>
<li>&#39;조정&#39;할 수 없는 설명변수와 아웃컴 사이의 관련성은 &#39;재배치&#39; 진행</li>
</ul>
<p>3) &#39;조정&#39;도 &#39;재배치&#39;도 불가능한 설명변수는 다른 관점 활용</p>
<ul>
<li>ex. 계절과 날씨에 따른 제품 판매량 변화 : 계절이나 날씨에 맞춰 사전에 필요한 물품의 구입이나 생산, 재고 상태를 예측하여 최적화<br>


</li>
</ul>
<h4 id="3-임의화-비교실험이나-ab-테스트로-검정">3. 임의화 비교실험이나 A/B 테스트로 검정</h4>
<pre><code>&#39;신뢰할 수 있으므로 상품을 많이 샀다&#39;인지 
&#39;상품을 많이 샀기 때문에 신뢰가 생겨난 것&#39;인지는
 회귀계수나 p값을 봐도 알 수 없음!</code></pre><blockquote>
<p>💥&#39;상관&#39;과 &#39;인과&#39;를 혼동해서는 안됨</p>
</blockquote>
<ul>
<li>이익이 될 것 같은 아이디어를 찾았으면, 적절한 임의화 비교실험 또는 A/B 테스트를 통해 검정하자!</li>
</ul>
<p>** [ A/B 테스트 ] **</p>
<p>1) <u>일정한 인원수 이상</u>을 모아 반반씩 나눔</p>
<ul>
<li><p>일정한 인원수 이상을 구하는 법</p>
<ul>
<li>평균값의 차이든 비율 차이든 검정력에 따라 &#39;표준오차의 몇 배 차이가 예상되는가&#39;라는 관점에서 추측</li>
</ul>
</li>
</ul>
<p>2) 나눈 그룹에 다른 방법 시행</p>
<ul>
<li>A그룹 (실험군) : 새로운 방법을 시험하는 그룹, </li>
<li>B그룹 (대조군) : 기존의 방법을 실행하는 그룹
※ &#39;충분히 많은 수의 대상&#39;</li>
</ul>
<p>3) A그룹과 B그룹 아웃컴 비교 </p>
<ul>
<li>A그룹의 아웃컴이 B그룹에 비해 우연한 오차라고 생각할 수 없을 정도로 높다면, 통계적 가설검정에 의해 인과관계가 나타나는 것으로 생각해도 무방<br>▶️ 이때, t검정이나 z검정 사용</li>
</ul>
<br>


<h3 id="🔎-한걸음-나아간-통계학-공부">🔎 한걸음 나아간 통계학 공부</h3>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/c6d9babd-aba0-4eb8-8506-475f7e180b93/image.png" alt=""></p>
<h4 id="1-새로운-아이디어-탐색-분석">1. 새로운 아이디어 탐색 분석</h4>
<ul>
<li>회귀모형에 의한 아이디어 탐색 단계에서 &#39;시간적인 요소&#39;를 분석할 수 있게 됨<br>

</li>
</ul>
<p>1) 생존분석</p>
<ul>
<li><p>&#39;언제 탈퇴했는가&#39; 와 같은 생존시간을 분석</p>
</li>
<li><p>콕스회귀분석</p>
<ul>
<li>분석환자의 생존시간을 분석하기 위해 생긴 방법</li>
<li>오즈비가 아닌 하자드비(hazard ratio)라는 지표를 활용</li>
<li>&#39;일정 시간당 몇 배의 확률로 일어나기 쉬운가/어려운가&#39;라는 결과<br>

</li>
</ul>
</li>
</ul>
<p>2) 시계열 분석</p>
<ul>
<li><p>같은 사람이나 물건을 대상으로 여러 차례 얻어낸 데이터를 &#39;시계열 데이터&#39;</p>
</li>
<li><p>&#39;과거의 정보와 다음 주 매출의 관계성은 어떠한가&#39;를 생각하는 것</p>
</li>
<li><p>자기상관</p>
<ul>
<li>&#39;같은 매장의 데이터는 시점이 달라도 상관하여 일치한다&#39;</li>
<li>&#39;시간적 변동&#39;을 포착
  ex. 바로 직전의 값뿐만 아니라 몇 시점 전 값의 크기와 관련성이라든가 시점을 불문하고 공통되는 평균값과 분산을 가진 변동 요인이 배후에 있는가</li>
</ul>
</li>
</ul>
<br>

<p>3) 경시데이터 분석</p>
<ul>
<li><p>다른 설명변수와의 관계성을 분석하는 방법</p>
</li>
<li><p>&#39;사람마다 제각각&#39;이라는 요인을 일반적인 회귀계수로 표현
▶ 1명을 기준으로 &#39;인원수-1&#39;개분의 더미변수 필요</p>
</li>
<li><p>혼합효과모형 사용</p>
<br>


</li>
</ul>
<h4 id="2-새로운-축소">2. 새로운 축소</h4>
<ul>
<li><p>잠재적 인자 간의 관계성이 중요</p>
</li>
<li><p>구조방정식 모형</p>
<ul>
<li>축소를 할 뿐만 아니라, 직간접적으로 변수 사이의 다양한 관계성을 명백히 하는 분석방법</li>
</ul>
</li>
<li><p>항목반응이론</p>
<ul>
<li>사실을 바탕으로 그 배후에 있는 잠재적 능력을 추정하고 사안별로 &#39;잠재적인 능력&#39;을 어떻게 식별할지를 명백히 규정하는 것</li>
</ul>
</li>
<li><p>커널 k-means 방법</p>
<ul>
<li>커널함수를 이용하여 k-means 방법으로는 판별이 불가능한 형상의 군집으로 분류 가능한 방법 </li>
</ul>
</li>
</ul>
<br>

<h4 id="3-임의화-비교실험-검정">3. 임의화 비교실험 검정</h4>
<ul>
<li><p>통계적 인과추론</p>
<ul>
<li><p>&#39;임의화 비교실험이 불가능한 상황에서 어떻게 착오없이 검정하는가&#39;</p>
</li>
<li><p>DM 발송여부에 따른 매출 차이 확인</p>
<ul>
<li>편중 존재</li>
<li>&#39;발송의 결과로 매출이 오른것인지&#39;, &#39;매출에 영향이 미칠 만한 사람에게 발송했기 때문에 매출이 오른 것인지&#39; 구별 어려움</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[통계학] 인자분석과 군집분석]]></title>
            <link>https://velog.io/@stand_hyo/%ED%86%B5%EA%B3%84%ED%95%99-%EC%9D%B8%EC%9E%90%EB%B6%84%EC%84%9D%EA%B3%BC-%EA%B5%B0%EC%A7%91%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@stand_hyo/%ED%86%B5%EA%B3%84%ED%95%99-%EC%9D%B8%EC%9E%90%EB%B6%84%EC%84%9D%EA%B3%BC-%EA%B5%B0%EC%A7%91%EB%B6%84%EC%84%9D</guid>
            <pubDate>Wed, 15 Feb 2023 17:14:48 GMT</pubDate>
            <description><![CDATA[<h4 id="다중공선성-문제">다중공선성 문제</h4>
<p>: 서로 강한 상관관계에 있는 변수들을 모두 설명변수로 채택하고 &#39;다른 변수들의 항목의 점수가 같을 때~&#39;의 관련성을 보면 본질을 외면한 결과가 얻어질 위험성 존재</p>
<h4 id="대응방법">대응방법</h4>
<ol>
<li>상관이 강한 다수의 항목에서 대표적인 일부 항목만 골라 설명변수로 채택    </li>
</ol>
<ul>
<li><p>서로 상관이 있는 것 같은 설명변수에 대해서 회귀계수에 관한 p-값이 가장 작은 것만을 설명변수로 채택</p>
</li>
<li><p>단계별변수선택법을 적용하여 설명변수 채택</p>
<br>
</li>
</ul>
<ol start="2">
<li>상관이 강한 항목끼리 합산하여 하나의 설명변수도 대체</li>
</ol>
<ul>
<li><p>서로 상관하는 설명변수를 모두 더하는 것</p>
</li>
<li><p>다수의 변수를 적은 수의 변수로 줄이는 것 (=축소한다)</p>
</li>
</ul>
<ul>
<li>&#39;축소&#39;의 문제점
1) 항목들이 진정으로 상관하고 있는지의 문제 (직감에 의존)
2) 항목들이 상관이 있더라도 그 강도가 동일하지 않는다<blockquote>
<p>이러한 문제를 해결하는 분석방법이 <strong>&#39;인자분석&#39;</strong></p>
</blockquote>
</li>
</ul>
<h3 id="💡-인자분석-factor-analysis">💡 인자분석 (factor analysis)</h3>
<ul>
<li><p>인자 : 현실적으로 측정할 수 있는 값을 좌우하는, 보지도 만지지도 못하는 무언가 (ex. 지능, 리더십, 라이프스타일, 행복감)</p>
</li>
<li><p>인자분석 : 인자를 수학적으로 명백히 밝히는 일</p>
</li>
<li><p>비즈니스 관련 설문조사 결과나 행동 로그 데이터에 활용하면 좋음</p>
<ul>
<li>&#39;이 업계에서 브랜드 이미지는 어떤 인자에서 포착할 수 있는가?&#39;</li>
<li>&#39;이 매장의 상품을 구매함으로써 알 수 있는 라이프스타일에는 어떤 인자가 있는가&#39;</li>
</ul>
</li>
</ul>
<h3 id="💡-인자분석-방법">💡 인자분석 방법</h3>
<ul>
<li><p>두 가지 종류의 변수 산포도에서 <U>산포도에 놓인 점의 정중앙을 긋는 직선</U> 구하기</p>
<ul>
<li>직선을 구하는 방법 (인자의 추정방법) : 최소제곱법(뉴턴-라프슨법 활용), 최고가능도법, 주인자법, 주성분법, 알파인자법, 이미지 인자법</li>
</ul>
</li>
<li><p>산포도의 점의 중심을 통하는 직선을 기준으로 <u>그 직선과 수직인 점선들을 그어 비교</u></p>
<ul>
<li><strong>인자점수</strong> : 인자분석에 의해 얻어진 눈금으로 판단한 값</li>
<li>가급적 본래의 변수와 강하게 상관관계에 있는 지표로 추정되는 것</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/f90c0c0e-e73d-487c-925f-f4075c25fbe1/image.png" alt=""> [출처: 빅데이터를 지배하는 통계의 힘]</p>
<ul>
<li>2개 이상의 여러가지 변수를 가지는 경우, 인자분석에 의해 인자점수를 정의할 수만 있다면 다수의 변수 전체를 살펴볼 필요 없이 인자점수 크기만으로 판단할 수 있다.</li>
</ul>
<br>
<br>



<h3 id="💡-인자분석---인자수-결정-회전-과정">💡 인자분석 - 인자수 결정, 회전 과정</h3>
<h4 id="인자수-결정-방법">인자수 결정 방법</h4>
<ul>
<li><p>적절한 몇 개의 인자수를 결정하고 각각의 인자수로 분석한 결과를 비교 확인한 다음 자신있게 최선이라 생각하는 것을 선택</p>
<ul>
<li><p>수리적 타당성도 필요</p>
</li>
<li><p>ex. 일반지능 / 문과지능, 이과지능 / 언어지능, 계산지능, 암기지능</p>
</li>
</ul>
</li>
</ul>
<h4 id="회전-과정">회전 과정</h4>
<ul>
<li><p>회전 과정 동안 본래의 각 변수가 가능한 적은 수의 인자하고만 관련되도록 자동적으로 계산 </p>
<ul>
<li><p>본래의 인자축과는 별도로, 똑같은 중심을 지나면서 &#39;일부의 변수하고만 상관하는 새로운 축&#39; 생성하고 회전시키는 것</p>
</li>
<li><p>직각회전</p>
<ul>
<li>인자끼리 서로 <u>직각</u>, 즉 설명이 독립적으로 &#39;서로 상관하지 않도록&#39; 회전 과정 진행<ul>
<li>가로축과 세로축이 &#39;인자 간 상관의 강도&#39;</li>
<li>다중회귀분석 등에 사용할 때 다중공선성을 고려</li>
</ul>
</li>
</ul>
</li>
<li><p>사각회전</p>
<ul>
<li>&#39;서로 상관하든 안 하든&#39; 별도로 움직이게 하는 회전 과정 진행<ul>
<li>현실에서 존재하는 인자가 &#39;반드시 서로 상관하지 않는다&#39;는 가정의 비합리성을 반영 </li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>


<h3 id="📑-군집분석">📑 군집분석</h3>
<ul>
<li><p>군집 : 질적으로 다른 그룹</p>
</li>
<li><p>군집분석 : 여러 변수에서 군집을 나누는 분석방법</p>
</li>
</ul>
<h3 id="📑-군집분석-계산방법">📑 군집분석 계산방법</h3>
<h4 id="1-계층적-군집분석">1. 계층적 군집분석</h4>
<ul>
<li><p>계층적 군집분석의 종류</p>
<ul>
<li>응집형 : 수형도의 가지에서 &#39;유사한 것끼리 모아가는&#39; 방법</li>
<li>분기형 : &#39;가장 분명한 차이를 보이는 것들을 찾아 분할을 반복하는&#39; 방법</li>
</ul>
</li>
<li><p>군집분류 방법</p>
<ul>
<li><p>유사성</p>
<p>: 각 변수의 차이를 제곱하여 모두 더하고 √를 씌우는 방식으로 변수들간의 거리(유사성)을 구한다</p>
</li>
<li><p>표준화</p>
<ul>
<li>세로축과 가로축의 단위를 맞추고, &#39;세로축 차이&#39;와 &#39;가로축 차이&#39;가 본래의 값의 크기에 관계없이 동일하게 취급되게 하기 위한 방법</li>
<li>표준편차(SD)의 활용하여 각 변수 축에서의 차이를 &#39;그 변수의 표준편차가 얼마인지&#39;로 축의 규모를 보정한다</li>
</ul>
</li>
</ul>
</li>
<li><p>계층적 군집분석은 계산량이 많기 때문에 오늘날 많이 사용되지 않는다</p>
<br>


</li>
</ul>
<h4 id="2-비계층적-군집분석">2. 비계층적 군집분석</h4>
<ul>
<li><p>K-means</p>
<ul>
<li>k-means : &#39;k개의 평균값&#39;이라는 데이터의 중심점에서 떨어진 거리를 생각함으로써 분류 대상이 어떤 군집에 속하는지 밝혀내는 분석방법</li>
<li>k : 최종적으로 분류하고 싶은 군집의 수 (분석가가 설정)</li>
<li>중심점 : 모든 축에서 평균값이 되는 점</li>
</ul>
</li>
<li><p>K-means 군집분석 방법</p>
<ol>
<li>임의로 모든 점을 k개의 군집으로 분류하고 중심점을 구함</li>
<li>k개의 중심점 중에서 어디부터의 거리가 가장 짧은가 하는 기준으로 모든 점을 새롭게 재분류</li>
<li>군집 분류에 기초하여 다시 평균값을 계산하고 중심점을 구함</li>
<li>2와 3을 반복</li>
<li>중심도, 분류도 변하지 않게 되면 &#39;좋은 군집 결과&#39;</li>
</ol>
</li>
<li><p>분류한 군집 해석 ★★★</p>
<ul>
<li><p>분류한 군집의 이름을 설정하는 작업이 중요</p>
<pre><code>  이미지를 떠올리지 못하면 각각의 군집에 어떠한 방법을 쓰면 
 좋은지 의사결정하는 데도 도움이 되지 않음</code></pre></li>
<li><p>평균값 자체가 아닌, 평균값이 다른 군집에 비해 큰지 작은지 상대적인 비교가 중요</p>
</li>
<li><p>군집간의 차이를 파악할 때, 분산분석이나 카이제곱검정 등을 사용하여 &#39;군집 간 평균값의 차이가 우연한 범위라고 할 수 있는가&#39;라는 판단도 함</p>
<p>✨ Tip : &#39;특징이 있는 듯 없는 듯한 군집&#39;은 해당 인원수가 많은 경우에는 &#39;일반&#39;, 반대로 적은 경우에는 &#39;기타&#39;라는 이름을 붙일 때가 많다</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>k-means의 한계</p>
<ul>
<li>군집수의 설정을 바꾸기만 해도 다른 결과</li>
<li>변수의 표준화를 할지말지, 어떤 방법으로 표준화를 할지에 따라서도 달라지는 결과</li>
<li>중심에서 가장 가까운 거리의 군집으로 분류한다는 것은 암묵적으로 모든 군집이 같은 반지름의 원형이라는 것을 가정하는 점</li>
</ul>
</li>
</ul>
<br>

<h3 id="👩🏻💻-최종적으로-해야-하는-분석">👩🏻‍💻 최종적으로 해야 하는 분석</h3>
<ul>
<li><p>군집분석 : 서로 상관하는 여러 변수가 축소되고 알기 쉬운 질적변수를 얻음</p>
</li>
<li><p>회귀분석 : 군집분석으로 얻은 질적변수를 설명변수로 사용하여 다중회귀분석이나 로지스틱 회귀분석</p>
<p>  ⏩ 군집분석에 사용한 축소 전의 (서로 상관이 있는) 변수를 그대로 전부 설명변수로 삼을 때보다도 알기 쉬운 분석 결과를 얻을 수 있다!</p>
</li>
</ul>
<blockquote>
<p>군집분석을 통해 변수들을 축소하고 분류하고 이름을 붙인 뒤, 그것을 바탕으로 다중회귀분석이나 로지스틱 회귀분석 등을 사용하여 아웃컴과 설명변수의 관련성을 어떻게 발견할 것인지를 고민해야 함 !!! </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Postgresql] truncate(), date_trunc() 함수]]></title>
            <link>https://velog.io/@stand_hyo/Postgresql-truncate-datetrunc-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@stand_hyo/Postgresql-truncate-datetrunc-%ED%95%A8%EC%88%98</guid>
            <pubDate>Sun, 05 Feb 2023 06:25:32 GMT</pubDate>
            <description><![CDATA[<pre><code>Mode 사이트에서 yammaer tutorial을 활용하는 분석 프로젝트 진행 중 
date_trunc 함수가 계속 보이는 것 같아서 정리해보자!!</code></pre><h3 id="💡-truncate-함수">💡 truncate() 함수</h3>
<p> : 소수점 이하 숫자를 버릴 때 사용하는 함수</p>
<blockquote>
<p> <strong>truncate(숫자, 버림할 자릿수)</strong></p>
</blockquote>
<pre><code class="language-sql">
SELECT TRUNCATE(1234.56789 ,1) FROM DUAL;
-- 1234.5

SELECT TRUNCATE(1234.56789 ,4) FROM DUAL;
-- 1234.5678

SELECT TRUNCATE(1234.56789 ,-1) FROM DUAL;
-- 1230

SELECT TRUNCATE(1234.56789 ,-2) FROM DUAL;
-- 1200</code></pre>
<br>


<h3 id="💡-date_trunc-함수">💡 date_trunc() 함수</h3>
<blockquote>
<p><strong>date_trunc(text, timestamp)</strong></p>
</blockquote>
<ul>
<li><p>첫번째 인자 
: [year,month,day,hour,minute,second,millisecond] 와 같은 날짜 키워드</p>
</li>
<li><p>두번째 인자 
: timestamp 데이터, 그 시점의 text 키워드까지의 값을 0(default 처리)</p>
</li>
</ul>
<pre><code class="language-sql">
SELECT DATE_TRUNC(&#39;month&#39;, &#39;2019-04-01 12:12:12::timestamp&#39;)   
--  2019-04-01 00:00:00

SELECT DATE_TRUNC(&#39;month&#39;, &#39;2019-04-05 12:12:12::timestamp&#39;)  
--  2019-04-01 00:00:00

SELECT DATE_TRUNC(&#39;year&#39;, &#39;2019-04-01 12:12:12::timestamp&#39;)   
--  2019-01-01 00:00:00 
--  두번째 인자로 들어온 날짜의 year까지만을 유효하게 취하고 이하는 default 값

SELECT DATE_TRUNC(&#39;minute&#39;, &#39;2019-04-01 12:12:12::timestamp&#39;)
--  2019-04-01 12:12:00</code></pre>
<br>

<h3 id="💡-mode--yammer-cohort-analysis-code">💡 Mode : yammer Cohort Analysis Code</h3>
<pre><code class="language-sql">-- Cohort Analysis Code

SELECT DATE_TRUNC(&#39;week&#39;,z.occurred_at) AS &quot;week&quot;,
       AVG(z.age_at_event) AS &quot;Average age during week&quot;,
       COUNT(DISTINCT CASE WHEN z.user_age &gt; 70 THEN z.user_id ELSE NULL END) AS &quot;10+ weeks&quot;,
       COUNT(DISTINCT CASE WHEN z.user_age &lt; 70 AND z.user_age &gt;= 63 THEN z.user_id ELSE NULL END) AS &quot;9 weeks&quot;,
       COUNT(DISTINCT CASE WHEN z.user_age &lt; 63 AND z.user_age &gt;= 56 THEN z.user_id ELSE NULL END) AS &quot;8 weeks&quot;,
       COUNT(DISTINCT CASE WHEN z.user_age &lt; 56 AND z.user_age &gt;= 49 THEN z.user_id ELSE NULL END) AS &quot;7 weeks&quot;,
       COUNT(DISTINCT CASE WHEN z.user_age &lt; 49 AND z.user_age &gt;= 42 THEN z.user_id ELSE NULL END) AS &quot;6 weeks&quot;,
       COUNT(DISTINCT CASE WHEN z.user_age &lt; 42 AND z.user_age &gt;= 35 THEN z.user_id ELSE NULL END) AS &quot;5 weeks&quot;,
       COUNT(DISTINCT CASE WHEN z.user_age &lt; 35 AND z.user_age &gt;= 28 THEN z.user_id ELSE NULL END) AS &quot;4 weeks&quot;,
       COUNT(DISTINCT CASE WHEN z.user_age &lt; 28 AND z.user_age &gt;= 21 THEN z.user_id ELSE NULL END) AS &quot;3 weeks&quot;,
       COUNT(DISTINCT CASE WHEN z.user_age &lt; 21 AND z.user_age &gt;= 14 THEN z.user_id ELSE NULL END) AS &quot;2 weeks&quot;,
       COUNT(DISTINCT CASE WHEN z.user_age &lt; 14 AND z.user_age &gt;= 7 THEN z.user_id ELSE NULL END) AS &quot;1 week&quot;,
       COUNT(DISTINCT CASE WHEN z.user_age &lt; 7 THEN z.user_id ELSE NULL END) AS &quot;Less than a week&quot;
  FROM (
        SELECT e.occurred_at,
               u.user_id,
               DATE_TRUNC(&#39;week&#39;,u.activated_at) AS activation_week,
               EXTRACT(&#39;day&#39; FROM e.occurred_at - u.activated_at) AS age_at_event,
               EXTRACT(&#39;day&#39; FROM &#39;2014-09-01&#39;::TIMESTAMP - u.activated_at) AS user_age
          FROM tutorial.yammer_users u
          JOIN tutorial.yammer_events e
            ON e.user_id = u.user_id
           AND e.event_type = &#39;engagement&#39;
           AND e.event_name = &#39;login&#39;
           AND e.occurred_at &gt;= &#39;2014-05-01&#39;
           AND e.occurred_at &lt; &#39;2014-09-01&#39;
         WHERE u.activated_at IS NOT NULL
       ) z

 GROUP BY 1
 ORDER BY 1
 LIMIT 100</code></pre>
<br>

<p><del>Mysql에서도 똑같이 활용할 수 있는 문법인지는 모르겠담</del></p>
<p><a href="https://app.mode.com/modeanalytics/reports/b87dc5c175a7/details/queries/e67df96c336f">출처</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[통계학] 다중회귀분석과 로지스틱 회귀분석]]></title>
            <link>https://velog.io/@stand_hyo/%ED%86%B5%EA%B3%84%ED%95%99-%EB%8B%A4%EC%A4%91%ED%9A%8C%EA%B7%80%EB%B6%84%EC%84%9D%EA%B3%BC-%EB%A1%9C%EC%A7%80%EC%8A%A4%ED%8B%B1-%ED%9A%8C%EA%B7%80%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@stand_hyo/%ED%86%B5%EA%B3%84%ED%95%99-%EB%8B%A4%EC%A4%91%ED%9A%8C%EA%B7%80%EB%B6%84%EC%84%9D%EA%B3%BC-%EB%A1%9C%EC%A7%80%EC%8A%A4%ED%8B%B1-%ED%9A%8C%EA%B7%80%EB%B6%84%EC%84%9D</guid>
            <pubDate>Thu, 02 Feb 2023 07:27:38 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/stand_hyo/post/02c16078-77cc-4724-ab19-e0dee1343c30/image.png" alt=""></p>
<pre><code>       양적변수 분석을 위해서는 &#39;양적 설명변수가 늘 때마다 평균적으로 얼마만큼 
       아웃컴이 느는가/주는가&#39;라는 경향성을 나타내는 분석방법을 사용하고
       이것이 바로 &#39;회귀분석&#39;이다.</code></pre><h3 id="📒-회귀분석">📒 회귀분석</h3>
<ul>
<li><p>산포도와 회귀직선으로 &#39;경향&#39; 파악</p>
<ul>
<li>산포도 : 가로, 세로축에 양적 항목을 잡고 점을 그려넣은 그래프</li>
<li>경향성 : &#39;경향성을 나타내는 직선과 실제 데이터 값을 벗어난 값의 제곱합&#39;을 최소로 만드는 직선 (최소제곱법)</li>
<li>평균값으로 회귀 : 예언된 변인에서 극단적인 값을 가져야 될 사람이 덜 극단적인 예언된 특성을 지니는 경향성</li>
</ul>
</li>
</ul>
<br>

<h3 id="📒-회귀직선과-회귀식">📒 회귀직선과 회귀식</h3>
<ul>
<li><p>회귀직선의 구성 (단순회귀)</p>
<ul>
<li><p>회귀계수(β1) : 설명변수(X)가 증가할 때 아웃컴(Y)가 몇 단위로 늘어나고 줄어드는지를 나타내는 &#39;기울기&#39;</p>
</li>
<li><p>절편(β0) : 설명변수(X)가 0인 경우, 아웃컴(Y)의 값이 몇이 되는지를 나타낸 값</p>
</li>
</ul>
</li>
<li><p>최소제곱법의 활용</p>
<ul>
<li><p>최소제곱법을 사용하여 회귀직선을 구할 때는, 각각의 점에 대해 <strong><em>&#39;실제의 아웃컴(Y)의 값&#39;</em></strong>과 _<strong>&#39;X값과 회귀식에서 구해지는 아웃컴(Y)의 예측값&#39;</strong>_의 세로축 방향 차이의 제곱합을 최소화</p>
</li>
<li><p>잔차제곱합 : 회귀직선에서 벗어난 값들의 차이 제곱의 합 (ε1+ε2+ε3+...+εn)을 의미하며 이 값이 가장 작아질 때 최량의 회귀직선으로 생각 </p>
</li>
</ul>
</li>
<li><p>회귀분석 결과</p>
<ul>
<li><p>회귀계수와 절편의 값을 모를 때 임의로 a, b로 설정한 후, <u>아웃컴의 회귀직선에 의한 예측값과 실제값 차이의 제곱합을 최소화하는 a, b 조합이 무엇인지</u>를 찾는 것이 회귀분석의 결과</p>
</li>
<li><p>a, b에 대한 편미분으로 잔차제곱합이 최소가 되는 a, b값 계산 가능</p>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/1c722cb4-9f4d-48b6-a600-5b8b8435a7f8/image.png" alt=""></p>
<ul>
<li><p>회귀계수의 표준오차 (기울기의 표준오차) ★★★</p>
<ul>
<li><p>우연에서 발생한 경향성을 고려하기 위해 회귀분석에서는 <strong>회귀계수의 표준오차(SE)</strong>를 생각한다</p>
</li>
<li><p>회귀계수의 표준오차 : 많은 양의 데이터를 모으기만 하면 알 수 있는 &#39;진정한 회귀계수&#39;가 존재한다고 할 때, <u>얼마만큼의 건수</u>, 그리고 <u>어떤 불규칙성이 있는 데이터에 의해 그것을 추정하려 든다면 어느 정도의 불규칙성이 나타나겠는가</u>를 의미한다.</p>
</li>
<li><p>회귀계수도 중심극한정리가 성립한다</p>
<ul>
<li><p>수많은 데이터로 회귀분석 시행시, 100회의 데이터 수집과 분석을 통해 산출되는 회귀계수의 95회 정도는 &#39;진정한 회귀계수±2SE&#39; 의 범위에 수용</p>
<ul>
<li>&#39;실제 얻어진 회귀계수±2SE&#39;의 범위 밖에 진정한 회귀계수가 존재하는 귀무가설은 양쪽 5%의 유의수준에서 있을 수 없다로 판명</li>
<li>데이터의 양이 적을 경우 t분포의 사용이 낫다는 것 또한 동일</li>
<li>평균값의 표준오차와의 차이점</li>
</ul>
</li>
<li><p>평균값의 표준오차</p>
<ol>
<li>편차제곱합(평균값에서 벗어난 값의 제곱합) 사용</li>
<li>분산 = 편차제곱합 / 데이터의 수</li>
</ol>
</li>
<li><p>회귀계수의 표준오차</p>
<ol>
<li>잔차제곱합(아웃컴의 예측값과 실제 값의 차이를 제곱한 합을 데이터수로 나눈 것) 사용</li>
<li>평균제곱잔차 = 잔차제곱합 / 데이터의 수</li>
</ol>
</li>
</ul>
<ul>
<li><p>회귀계수의 표준오차 계산에 추가로 필요한 것</p>
<ul>
<li><strong><em>&#39;아웃컴(Y)의 예측값과 실제 값이 평균적으로 어느 정도 벗어나 있는가&#39;</em></strong>라는 크기를, _<strong>설명변수(X)가 어느 정도 불규칙한지의 크기에 대한 비율</strong>_로 상대적 판단을 해야한다 </li>
<li>회귀계수의 표준오차 
= √(잔차제곱합)/(설명변수의 편차제곱합 * 데이터수)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="📒-다중회귀분석">📒 다중회귀분석</h3>
<ul>
<li><p>단순회귀분석 : 하나의 설명변수와 아웃컴의 관련성을 보기 위한 회귀분석</p>
<ul>
<li><p>설명변수와 아웃컴의 관계성에 대해 산포도에는 나타내지 못한 간과한 사실들이 있음</p>
</li>
<li><p>서브그룹 해석 : 이를 해결하기 위해 데이터를 각각의 설명변수들로 나눠 분할된 그룹(서브그룹)과 아웃컴과의 관계성을 분석하는 것</p>
<ul>
<li>but 데이터의 크기가 커지면 한계 존재 (서브그룹내의 평균 인원이 적어져 오차가 커짐)</li>
</ul>
</li>
</ul>
</li>
<li><p>다중회귀분석 : 복수의 설명변수와 아웃컴의 관련성을 &#39;한번에 분석&#39;</p>
<ul>
<li><p>최소제곱법 사용</p>
</li>
<li><p>설명변수가 질적변수인 경우</p>
<ul>
<li>0과 1로 표현되는 &#39;이항변수&#39;의 형태로 변경 → <strong>더미변수</strong></li>
</ul>
</li>
</ul>
</li>
<li><p>회귀분석, z검정, t검정의 결과가 일치하는 이유 ★★</p>
<ul>
<li><p>최소제곱법에 근거하여 그려진 회귀직선은 두 질적변수 집단들의 양적변수의 평균값을 나타내는 점을 지난다.</p>
</li>
<li><p>두 값의 설명변수에서 <u>회귀계수는 z검정이나 t검정에서 생각했던 &#39;그룹 간 평균값 차이&#39;와 완전히 동일</u></p>
<blockquote>
<ul>
<li><strong>평균값 차이의 표준오차</strong> 
&#39;각 그룹 값의 분산&#39; : 그룹 각각의 값과 평균값의 차이에서 벗어난 값의 제곱의 평균값 </li>
</ul>
</blockquote>
<blockquote>
<ul>
<li><strong>회귀계수의 표준오차</strong> 
&#39;평균제곱잔차&#39; : 회귀직선에서 벗어난 값의 제곱의 평균값인데, 회귀직선이 그룹별 평균값을 지나기 때문에 이역시 &#39;평균값에서 벗어난 값의 제곱의 평균값&#39;이라고 할 수 있음</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/5858a161-ee06-4c99-b2b2-4d930ea0d4f3/image.png" alt=""></p>
<pre><code>        1) 여성더미의 회귀계수는 -5 
          : 방문횟수가 같으면 남성은 여성에 비해 평균적으로 계약건수가 5건 적다

        2) 방문횟수 회귀계수는 1.50
          : 성별의 조건이 같다면 방문횟수가 1회 늘 때마다 평균 1.5회씩 계약건수가 
            많아지는 경향을 보인다.

        3) 성별과 계약건수의 p-value는 0.031
          : 이 정도의 데이터만 가지고도 우연이라고 말하기 어렵다

        4) 방문횟수와 계약건수의 p-value는 0.058
          : 5%를 믿도는 수준이 아니므로 인원수를 조금 더 늘려서 분석하면 우연이라고 
            말하기 어렵다는 결과가 나올 수 있다.</code></pre><ul>
<li>실무에서는 모든 설명변수를 다중회귀분석에 적용하여 p값이 작고 회귀계수가 큰 것을 탐색하는 방식을 압도적으로 선호함!</li>
</ul>
<br>

<h3 id="📒-로지스틱-회귀분석과-로그오즈비">📒 로지스틱 회귀분석과 로그오즈비</h3>
<ul>
<li><p>로지스틱 회귀분석 : 이항논리에 관한 아웃컴을 분석하는 회귀분석
<img src="https://velog.velcdn.com/images/stand_hyo/post/5740f7f6-557d-490f-8d29-6298787c0d63/image.png" alt=""> </p>
<ul>
<li>질적인 아웃컴에 대해 단순회귀분석인지 다중회귀분석인지 구분하지 않는다.</li>
</ul>
</li>
<li><p>오즈 (odds) : 어떤 상황을 취하는 확률에 대해 &#39;확률 / (1-확률)&#39;</p>
<ul>
<li><p>해당자의 비율이 낮은 질적 아웃컴에 대해 그 확률을 좌우할 가능성이 있는 요인을 조사할 때 중요한 의미
<img src="https://velog.velcdn.com/images/stand_hyo/post/03f37e3c-4be2-48a3-8957-a01079d49b72/image.png" alt=""></p>
</li>
<li><p>귀무가설 아래서 모든 칸에 5~10명이 해당이라는 z검정이나 카이제곱검정의 조건 만족 불가능</p>
</li>
<li><p>케이스 컨트롤 (case control) 조사 필요</p>
<ul>
<li><p>케이스 : 질병의 사례 (발병한 사람들의 그룹)</p>
</li>
<li><p>컨트롤 : 비교 대조 (조건이 동일한데도 발병하지 않은 그룹)</p>
</li>
<li><p>조건이 동일한데도 병에 걸린 사람과 걸리지 않은 사람 사이에 어떤 차이가 있는지 살펴보는 것 → 오즈비 필요</p>
</li>
<li><p>오즈비는 VIP 고객률이 그룹간에 약 몇 배 다른지를 잘 나타내는 지표     </p>
</li>
<li><p>오즈비를 활용하면 임의추출법이든 케이스 컨트롤이든 결과가 일치</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>    ![](https://velog.velcdn.com/images/stand_hyo/post/2900244b-7438-40fc-8056-16e671877120/image.png) 

        - 쇼핑몰에 호의적인 사람의 &#39;VIP 고객 오즈&#39; = 50/70÷(1-50/70) = 2.5
         - 쇼핑몰에 비호의적인 사람의 &#39;VIP 고객 오즈&#39; = 50/130÷(1-50/130) = 0.625
         - 쇼핑몰에 호의적인 오즈비는 4.00배(=2.5÷0.625)로 &#39;VIP 고객의 확률이 높다&#39;

   ![](https://velog.velcdn.com/images/stand_hyo/post/7439a3f1-a22a-4ad8-9bcf-604e1bbd5bbb/image.png)

       - 쇼핑몰에 호의적인 사람의 &#39;VIP 고객 오즈&#39; = 50/90÷(1-50/90) = 1.25
        - 쇼핑몰에 비호의적인 사람의 &#39;VIP 고객 오즈&#39; = 50/210÷(1-50/210) = 0.3125
        - 쇼핑몰에 호의적인 오즈비는 4.00배(=1.25÷0.3125)로 &#39;VIP 고객의 확률이 높다&#39;</code></pre>   <br>

<ul>
<li>오즈비 (odds ratio) : 그룹간의 오즈의 비율</li>
</ul>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/4aea8bf3-da9c-45d6-82bb-255c38ae2edd/image.png" alt=""><img src="https://velog.velcdn.com/images/stand_hyo/post/02ef7f35-980d-4fcd-9c56-927d2dee9457/image.png" alt=""></p>
<ul>
<li><p>로그오즈비 : 오즈비에 로그를 취한 값</p>
</li>
<li><p>로짓변환 : 오즈비에 로그를 취해 값을 변환하는 것</p>
<ul>
<li>로그오즈비를 사용하면 0과 1의 값만 취하는 이항의 아웃컴이 다중회귀 분석의 양적인 아웃컴과 마찬가지로 -∞부터 +∞까지의 값을 나타내도록 변환할 수 있다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/55f46907-7b5c-4a8c-9336-60351a9773bc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/66e49458-134b-4958-b655-27c339048394/image.png" alt=""></p>
<ul>
<li><p>회귀계수 변환</p>
<ul>
<li><p>대응하는 설명변수에 회귀계수의 &#39;로그&#39; 부분 제외</p>
</li>
<li><p>네이피어수 ^ 회귀계수 
: 설명변수가 1 증가할 때마다 아웃컴이 1이 되는 비율이 약 몇배인가에 관한 값</p>
<p>  ex. VIP고객인가(1) VIP고객이 아닌가(0) 아웃컴에 관한 로지스틱 회귀분석</p>
<pre><code>  - 남성더미의 회귀계수 = 2.00
  - 오즈비 = 2.718(네이피어수)^2 = 7.39
  - 남성이 여성에 비해 약 7.39배 아웃컴이 1이 되기 쉽다</code></pre></li>
</ul>
</li>
</ul>
<h3 id="📒-회귀모형-정리">📒 회귀모형 정리</h3>
<p> <img src="https://velog.velcdn.com/images/stand_hyo/post/b675d1cc-155b-47bc-916c-5bc91ec536ba/image.png" alt=""></p>
<br>  



<h3 id="📒-다중회귀분석-vs-로지스틱-분석">📒 다중회귀분석 vs 로지스틱 분석</h3>
<ul>
<li><p>아웃컴이 셋 이상의 카테고리로 나뉘는 경우</p>
<p> <strong>1. 다중회귀분석</strong></p>
<ul>
<li>각 카테고리의 차이가 모두 동일하다고 판단한 경우</li>
</ul>
</li>
<li><p><em>2. 로지스틱 회귀분석*</em></p>
<p>  1) 이항변수화 (목적에 따라 아웃컴 설정)</p>
<ul>
<li>&#39;매우불만&#39; 응답고객을 줄이고 이탈방지와 클레임 대책 반영<pre><code> : 전혀 만족하지 않는다(1), 만족하지 않는다(0)</code></pre></li>
<li>&#39;매우만족&#39; 응답고객을 늘리고 브랜드 파워나 SNS 활용 입소문
  : 매우 만족한다(1), 만족한다(0)</li>
<li>둘다 중요한 경우<pre><code> : 둘다 분석하고 회귀계수(오즈비) 중 어디가 같고 다른지 고찰</code></pre></li>
</ul>
</li>
</ul>
<pre><code>2) 순서형 로지스틱 회귀분석 (이유없이 사용 권장 x)
- 이항변수와 하지 않고 &#39;0~3&#39;점 만족도 점수채로 분석
- 이 또한 다중회귀와 마찬가지로 차이가 모두 동일하다는 가정</code></pre> <br>       
- 설명변수와 아웃컴의 관계성이 직선이 아닌 경우

<p> 1) 물리학 or 계량경제학</p>
<pre><code>- 회귀곡선으로 계산
- &#39;제곱항&#39; (본래의 설명변수를 제곱한 새로운 설명변수)의 회귀계수
- 본래의 설명변수와 제곱항을 모두 설명변수로 갖는 다중회귀분석 </code></pre><p> 2) 의학연구나 비즈니스</p>
<pre><code>- 기준 카테고리를 정하고 더미변수 설정 </code></pre><br>


<h3 id="📒-회귀모형의-실제-활용법">📒 회귀모형의 실제 활용법</h3>
<ul>
<li>과적합 </li>
</ul>
<pre><code>: 설명변수가 증가할수록 예측값에서 벗어난 잔차가 작아지게 되어 잔차가 관계가 없어야 하는 설명변수의 불규칙성과 닮아있게 되는 경우</code></pre><ul>
<li><p>과적합 문제</p>
<p>  : 새롭게 적용하는 데이터를 회귀식에 적용시키면 적합도가 나빠진다</p>
</li>
<li><p>과적합 해결방법</p>
<ul>
<li><p>변수선택법 : 의미있는 설명변수만 회귀식에 포함</p>
<ul>
<li>전진선택법</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>       1) 후보가 되는 설명변수 모두에 대해 단순회귀분석
        2) 회귀계수의 p값이 가장 작은 설명변수를 첫번째 설명변수로 채택
        3) 이외의 설명변수를 하나씩 조합하여 2개의 설명변수를 
           포함하는 다중회귀모형들을 분석
        4) 다중회귀모형들 중 두번째로 추가되는 설명변수의 회귀계수에 
        대응하는 p값이 가장 작은 설명변수 채택하고 이 변수를 두번째 회귀모형에 추가
        5) p값이 0.05 이내라면 계속 반복하며 최종 회귀식 도출

  - 후진제거법</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[통계학] 표준오차와 가설검정]]></title>
            <link>https://velog.io/@stand_hyo/%ED%86%B5%EA%B3%84%ED%95%99-%ED%91%9C%EC%A4%80%EC%98%A4%EC%B0%A8%EC%99%80-%EA%B0%80%EC%84%A4%EA%B2%80%EC%A0%95</link>
            <guid>https://velog.io/@stand_hyo/%ED%86%B5%EA%B3%84%ED%95%99-%ED%91%9C%EC%A4%80%EC%98%A4%EC%B0%A8%EC%99%80-%EA%B0%80%EC%84%A4%EA%B2%80%EC%A0%95</guid>
            <pubDate>Wed, 25 Jan 2023 17:08:30 GMT</pubDate>
            <description><![CDATA[<pre><code>그룹 간 평균값에 **표준편차 2배(±2SD) 이상의 차이**가 생긴 경우,
한쪽 그룹의 데이터가 존재하는 범위에 다른 그룹의 데이터가 존재하는 것은
&#39;당연한 것이 아니다&#39;</code></pre><h3 id="📘유의차와-검정에-대한-기본개념">📘유의차와 검정에 대한 기본개념</h3>
<h4 id="-유의차와-검정-">[ 유의차와 검정 ]</h4>
<ul>
<li>*<em>유의한 차이 (유의차) : *</em> 우연한 불규칙성 때문에 생겼다고는 생각하기 어려운 차이</li>
<li>*<em>검정 (통계적 가설검정) : *</em> 가설이 올바르다고 생각할 수 있는지 없는지 판단하기 위한 분석 방법 </li>
<li>*<em>검정력 : *</em> 어떤 차이가 존재하고 있다는 가설이 올바를 때 정확히 유의차라고 말할 수 있는 확률</li>
<li>*<em>최강력검정 : *</em> 설정된 유의수준에서 가장 검정력이 높은 분석방법</li>
</ul>
<blockquote>
<p>&#39;표준편차 2배 보다는 적지만 현실적인 의미가 있고, 통계학적으로 유의한 차이를 최소한의 데이터 안에서 어떻게 찾아낼 수 있는가, 즉 검정력을 크게 높일 수 있는가&#39;가 중요한 포인트</p>
</blockquote>
<h4 id="-제1종-오류와-제2종-오류-">[ 제1종 오류와 제2종 오류 ]</h4>
<ul>
<li>*<em>제 1종(α) 오류 : *</em>  아무 차이가 없는데도 차이가 있는 것으로 인식시키는 실수</li>
<li>*<em>제 2종(β) 오류 : *</em> 본래 차이가 존재하는데도 그것을 못 보고 놓쳐버리는 실수</li>
<li>*<em>유의수준 : *</em> 제 1종 오류 허용 수준 (관례적으로 5%, 엄밀하게 1% or 0.1</li>
</ul>
<br>


<h3 id="📘오차범위와-유의미한-통찰을-위한-표본크기-설계">📘&#39;오차범위&#39;와 유의미한 통찰을 위한 표본크기 설계</h3>
<h4 id="-통계학적-의미의-오차-">[ 통계학적 의미의 오차 ]</h4>
<p><strong>오차 :</strong> 한정된 데이터를 통해 얻어진 평균 또는 비율이 &#39;참값&#39;으로부터 <U>어떤 확률과 정도로</U> 벗어나 있는지를 나타내는 것 
→ 데이터의 수 + 원시 데이터의 불규칙성 크기와 관계</p>
<h4 id="-데이터의-불규칙성과-평균-">[ 데이터의 불규칙성과 평균 ]</h4>
<p>원시 데이터의 불규칙성이 크면 클수록 동일한 건수의 데이터로부터 얻어지는 평균값이라도 대단한 차이를 보인다</p>
<pre><code>[예시] 

A_data = [4,000원, 4,000원, 3,500원, 4,500원]
A&#39;_data = [4,000원, 4,500원, 3,500원, 4,500원]
→ 4명의 평균값에 미치는 영향 : 500/4 = 125
→ 변심고려 평균값 : 3,875원 ~ 4,125원

B_data = [4,000원, 4,000원, 1,000원, 7,000원]
B&#39;_data = [4,000원, 7,000원, 1,000원, 7,000원]
→ 4명의 평균값에 미치는 영향 : 3000/4 = 750
→ 변심고려 평균값 : 3,250원 ~ 4,750원</code></pre><h4 id="-평균의-표준오차-">[ 평균의 표준오차 ]</h4>
<p> <strong>표준오차 (Standard Error: SE)</strong>
 <img src="https://velog.velcdn.com/images/stand_hyo/post/a81ce232-c901-47e7-b2f9-e7fb7c0eb86e/image.png" alt="">
 평균의 표준오차 = (원시 데이터의 표준편차) / (√평균값 계산에 사용한 데이터 수)</p>
<ul>
<li><u><strong>&#39;4명(표본크기)의 데이터로부터 얻어진 평균값&#39;의 표준편차</u></strong></li>
<li>평균의 표준오차, 비율의 표준오차, 표준편차의 표준오차 모두 존재</li>
<li>원시데이터 그 자체의 불규칙성을 나타내는 지표</li>
<li>다수의 데이터에서 얻어진 평균값의 불규칙성 &lt; 원시 데이터의 불규칙성</li>
<li>표본크기가 클수록 표준오차가 작아진다 
  → 데이터 수가 많아질수록 원시 데이터 가운데서 진정한 평균값보다 큰 거나 작은 것만이 표본으로 포함될 확률보다, <U>진정한 평균값보다 큰 값과 작은 값이 혼계하게 될 확률이 커지기 때문</U></li>
</ul>
<br>

<h4 id="-표본크기-설계-">[ 표본크기 설계 ]</h4>
<p>*<em>표본크기 설계 : *</em> 평균과 표준편차를 사용해서 &#39;다음 조사에서 어느 정도의 표준오차로 하기 위해 어느 정도의 데이터 수(표본크기)가 필요한가&#39;를 예측하는 것</p>
<h4 id="-비율의-표준오차-">[ 비율의 표준오차 ]</h4>
<p>비율의 표준오차 = √(비율 * (1-비율)) / √(표본크기)</p>
<br>


<h3 id="📘-통계적-가설검정">📘 통계적 가설검정</h3>
<blockquote>
<p>통계적 가설검정은 <U>손익이 걸린 상황</U>에서 더 최선인 쪽을 선택하는 경우에 위력을 발휘한다</p>
</blockquote>
<p>*<em>귀무가설 : *</em> 자신의 주장을 완전히 뒤집어엎는 가설</p>
<pre><code>ex. 까마귀가 검은지 어떤지는 반반이다

- &#39;존재할 수 없는 귀무가설&#39;과 &#39;부정할 수 없는 귀무가설&#39;의 경계선이 어디부터 어디까지라는 범위를 나타낸 것이 신뢰구간

&lt;br&gt;</code></pre><p>*<em>p-value : *</em> 귀무가설이 성립한다는 가정 아래 실제 데이터 또는 그 이상으로 귀무가설에 반하는 데이터가 얻어지는 확률</p>
<pre><code>ex. &#39;까마귀가 검은지 하얀지가 반반인 경우, 100번 연속으로 검은 까마귀가 발견되었다&#39;는 
     관찰결과가 얻어지는 확률이 1조분의 1보다 작다는 것</code></pre><ul>
<li><U>이 값이 작으면</U> &#39;그 귀무가설은 존재할 수 없다&#39;</li>
<li>대략 5% 미만일 때</li>
</ul>
<p>*<em>95% 신뢰구간 : *</em> 평균값 ± 2SE라는 가장 자주 사용되는 신뢰구간으로 유의수준은 5%이며 부정할 수 없는 가설 범위</p>
<br>



<h3 id="📘-z-검정">📘 Z 검정</h3>
<p>*<em>단측검정 : *</em> 크든 작든 한쪽 5%만 기각하는 방식</p>
<blockquote>
<p>어떤 불규칙성을 지닌 데이터에서 뭔가의 값을 산출하는 한 거기에는 반드시 표준오차가 존재한다</p>
</blockquote>
<p>*<em>Z 검정 : *</em> 비율이나 평균, 그것들의 차이는 표본크기가 큰 경우 정규분포를 따른다는 점을 이용하고, 우연한 데이터의 불규칙성에 의해 생기는 것인지 아닌지 생각하기 위한 방법</p>
<br>



<h3 id="📘-t분포와-카이제곱분포">📘 t분포와 카이제곱분포</h3>
<p><strong>t 검정 :</strong> 정규분포가 아니라 소수의 데이터를 검정하기 위해 활용하는 검정 방법</p>
<ul>
<li>현재 평균값 차이가 의미가 있는지 아닌지 생각하는 경우에는 일반적으로 z 검정이 아닌 t 검정을 사용</li>
<li>&#39;소(小)&#39;를 위한 분석방법은 &#39;대(大)&#39;를 위한 분석방법을 포용한다</li>
<li><U>&#39;평균값의 차이&#39;가 &#39;평균값 차이의 표준오차&#39;의 몇 배인가</U>를 생각하고 그것이 어느 정도 존재하기 어려운지를 밝히기 위해 p값을 구함 </li>
</ul>
<blockquote>
<p><strong>[ z 검정과 t 검정의 공통점 ]</strong>
z 검정과 t 검정 모두 &#39;평균값 차이&#39;가 &#39;평균값 차이의 표준오차&#39;의 몇 배가 되는가 하는 값이 확률적으로 얼마만큼 존재할 수 없는지를 나타내는 p-값을 구할 수 있다</p>
</blockquote>
<blockquote>
<p><strong>[ 데이터의 적은 표본 문제 ]</strong>
but <u>데이터가 적으면 적을수록 &#39;데이터의 평균값&#39;은 &#39;진정한 평균값&#39;에서 벗어나기 쉽다</U> (표본의 분산과 표준오차 모두 &#39;진정한 분산&#39;과 &#39;진정한 표준오차&#39;보다 적은 값이 된다)</p>
</blockquote>
<p>💡 고셋 &amp; 피셔</p>
<p>데이터를 통해 얻어진 분산과 그 데이터 수 사이에 어떠한 관계가 있는지 수학적으로 정리 </p>
<blockquote>
<p>카이제곱분포를 사용하면 계산에 <U>사용된 데이터의 수마다 다르고 데이터로부터 구해진 분산이 진정한 분산과 어느 정도 달라지는지의 분포</U>를 계산할 수 있음</p>
</blockquote>
 <br>

<p><strong>카이제곱분포 :</strong> 평균값이 0, 분산이 1(표준편차도 1)의 정규 분포를 따르는 x라는 변수를 생각했을 때 이 변수의 제곱을 전부 더한 것의 분포 (모두 더한 x의 제곱수는 자유도)</p>
<pre><code>1) 자유도가 무한대인 경우: 정규분포와 완전히 일치
2) 수백 수천만큼 자유도가 큰 경우: 정규분포라고 불러도 아무런 문제 없음</code></pre><p><img src="https://velog.velcdn.com/images/stand_hyo/post/6e9ef463-68f7-4fa0-a3b3-0816b6d54499/image.png" alt=""></p>
<p>*<em>t 분포 : *</em> 데이터 수에 의해 혹은 카이제곱분포의 자유도별로 &#39;평균값 차이&#39;가 &#39;평균값 차이의 표준오차&#39;의 몇 배 이내로 수용될 확률이 몇 %인지 계산하기 위한 분포</p>
<pre><code>- 한정된 데이터로부터 산출한 표준오차는 데이터를 대량으로 모으면
   구해지는 진정한 표준오차보다 작기 때문에 신뢰구간이 넓어짐</code></pre><p><img src="https://velog.velcdn.com/images/stand_hyo/post/d936fb12-bc19-4055-a2cb-bde84108877b/image.png" alt=""></p>
<br>


<h3 id="📘-피셔의-정확검정-직접확률검정">📘 피셔의 정확검정 (직접확률검정)</h3>
<p><strong>정확(직접확률) :</strong> 정규분포로의 수렴이 아니라 정확한 확률 계산을 사용하여 p값을 산출한다는 의미</p>
<ul>
<li>&#39;조합의 수&#39;를 사용하여 수십 건 정도의 데이터로도 정확하게 비율의 차이에 의미가 있는지를 알기 위해 p값을 구함</li>
</ul>
<br>

<h3 id="📘-다중검정과-한계">📘 다중검정과 한계</h3>
<p><strong>피셔의 분산분석</strong> </p>
<ul>
<li>세 그룹 이상의 평균값 차이에 대해 분석</li>
<li>다른 그룹 간 평균값의 불규칙성을 나타내는 분산과 그룹 안에서 얻어진 값의 불규칙성을 나타내는 분산의 비교 
→ 그룹 간의 평균값의 차이가 어느 정도인지 p값 산출 가능</li>
</ul>
<p><strong>카이제곱검정</strong> : 세 그룹 이상의 비율 차이에 대해 분석</p>
<blockquote>
<p><strong>[ 분산분석과 카이제곱검정의 한계 ]</strong>
분산분석과 카이제곱검정 모두 <u>&#39;p값이 작아졌다는 것은 평균값이 혹은 비율이 모두 동일하다고 한정지을 수 없다&#39;</u> 정도의 결론만 도출가능하기 때문에 비즈니스에서 많이 사용하지 않음</p>
</blockquote>
<p><strong>t검정/카이제곱검정 여러번 수행</strong> : 비교 그룹이 많아질수록 복잡</p>
<br>

<h3 id="📘-다중검정과-처방">📘 다중검정과 처방</h3>
<p><strong>1. 본페로니 방법</strong></p>
<p>여러 가설 검정을 한 다음 최종적으로 제 1종 오류 리스크를 5%로 유지하기 위해 상응하는 <u>통계 분석방법</u>을 사용하는 접근법</p>
<ul>
<li>단순히 다수의 검정만 반복하면 제 1종 오류 리스크가 증가함 (검정의 다중성)</li>
<li>p값별로 &#39;유의인가 아닌가&#39;의 판단기준으로 &#39;5%라는 유의수준을 검정한 횟수로 나눈 값&#39;을 사용</li>
<li>무제한 검정을 진행하면 제 2종 오류를 범할 위험이 커짐<blockquote>
<p>ex. 100회 검정을 하면 p값 0.05% 미만이라는 것만 &#39;유의차&#39;로 인정받음</p>
</blockquote>
</li>
</ul>
<p><strong>2. 기준 카테고리를 정한 다음 비교</strong></p>
<p>모든 경우의 수로 비교하면 그룹 수가 늘어남에 따라 p값의 수가 증가함. 이를 해결하기 위해 기준이 되는 그룹(카테고리)를 정한 후 비교</p>
<ul>
<li>기준 카테고리 선정
  1) 수학적으로 어느 것을 선택해도 무방
  2) 전체 차지 비율이 높고 누구에게나 이미지가 떠오르기 쉬운 집단인 &#39;보통그룹&#39;으로 선택하는 것이 결과를 알기 쉬움
  3) 해당 인원수나 건수가 어느 정도 확보 되어 있어야 표준오차도 적어지고 유의한 p값을 찾아내기 좋음</li>
</ul>
<p><strong>3. 탐색적 p값과 검정적 p값을 적절히 사용</strong> ★★★
p값을 기준삼아 이익으로 연결될 만한 새로운 아이디어를 탐색하려는 목적과 그 결과로 얻어진 아이디어는 진정 이익을 창출할 수 있는지 검정</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[통계학] 평균과 비율]]></title>
            <link>https://velog.io/@stand_hyo/%ED%86%B5%EA%B3%84%ED%95%99-%ED%8F%89%EA%B7%A0%EA%B3%BC-%EB%B9%84%EC%9C%A8</link>
            <guid>https://velog.io/@stand_hyo/%ED%86%B5%EA%B3%84%ED%95%99-%ED%8F%89%EA%B7%A0%EA%B3%BC-%EB%B9%84%EC%9C%A8</guid>
            <pubDate>Wed, 18 Jan 2023 18:15:36 GMT</pubDate>
            <description><![CDATA[<h3 id="📗통찰의-통계학을-위한-3가지-지식">📗&#39;통찰&#39;의 통계학을 위한 3가지 지식</h3>
<p><strong>1) 평균과 비율의 본질적 이해</strong></p>
<p>&#39;평균&#39;과 &#39;비율&#39;은 기본적으로는 완전히 동일한 개념</p>
<blockquote>
<p><strong>WHY?</strong></p>
</blockquote>
<ul>
<li>비율과 평균은 다른 계산방법이 존재하는 것이 아님</li>
<li>수의 형태로 표현할 수 없는 질적변수에 대해서 각 분류마다 1이나 0이라는 형태로 &#39;해당하는 정도&#39;라는 양적변수를 생각하여 평균을 계산하는 것</li>
</ul>
<p><strong>평균</strong>: 양적변수(나이, 수입, 구매금액과 같이 숫자로 표현되는 정보)
<strong>비율</strong>: 질적변수(성별, 직업, 상품 분류와 같이 문자로 표현되는 정보)
※ 1과 0같은 형태로 표현할 수 있는 변수 중 양적변수와 질적변수의 특징을 모두 가지는 변수는 이항변수</p>
<p>→ 동일한 개념이긴 하지만, 변수의 형태에 따라 쓰임이 차이가 나는 것!</p>
<br>

<p><strong>2) 데이터가 존재하는 &#39;구간&#39;</strong></p>
<ul>
<li>통계학에선&#39;데이터는 대체로 어디에서 어디까지의 범위에 속해있는가?&#39;하는 식의 구간으로 파악하는 방법을 고안함</li>
<li>데이터를 평균이나 비율과 같은 &#39;점&#39;이 아닌 &#39;구간&#39;으로 이해하는 지혜가 - 중요<br>

</li>
</ul>
<p><strong>3) &#39;결과&#39;와 &#39;원인&#39;의 압축</strong></p>
<blockquote>
<p>&quot;무슨 값을 어떻게 정리해야 하는가?&quot;</p>
</blockquote>
<ul>
<li><strong>인과관계</strong>: 어떤 원인에 의해 결과가 어떻게 변하는지 알아내는 것</li>
<li><strong>outcome(성과지표)</strong> : 최종적으로 조절하고 싶은 결과 (결과변수, 목적변수, 종속변수, 외적기준 등으로 불림)</li>
<li><strong>설명변수</strong>: outcome에 영향을 달리 미칠 수 있거나 차이를 설명할 수 있을지 모르는 요인</li>
<li><strong>output</strong>: outcome과는 다른 뜻으로, 의미있는 결과가 아닌 단순한 결과와 관련한 표현 (ex. 광고인식률, SNS 입소문 건수는 단지 과정일 뿐, 업종이나 상품에 따라서는 이익과 전혀 관계가 없을 수 있음)</li>
</ul>
<p>💡비즈니스에서 가치있는 분석은 &#39;최대화하거나 최소화해야 하는 항목&#39;이 무엇인지 알아내는 것 (=outcome을 정하고 그와 관련된 데이터를 분석)</p>
<br>

<p>** &lt; 설명변수의 우선순위 설정 &gt; **</p>
<p>: 아웃컴과 연관된 설명변수들이 많다고 생각하는 경우 우선순위를 중심으로 데이터를 분석하면 효율적</p>
<ol>
<li>너무나도 당연한 인과관계이면 안될 것</li>
<li>아웃컴에 명백한 영향을 미치는 변수더라도 조절 가능한 것이어야 할 것</li>
<li>이제까지 주목 받지 않고 분석된 적이 별로 없어야 할 것</li>
</ol>
<br>


<h3 id="📗평균의-본질">📗&#39;평균&#39;의 본질</h3>
<p>&#39;통찰&#39;을 위한 통계학에서는 중앙값과 최빈값에 신경쓰는 일이 거의 없다</p>
<blockquote>
<p>WHY?
중앙값은 참값에서 벗어난 값(차이, 절댓값)의 총합을 최소로 만드는 신뢰할 수 있는 추측값이지만 계산의 불편함이 매우 크다</p>
</blockquote>
<p>이를 해결하기 위해 고안한 방법이 최소제곱법!</p>
<ul>
<li>** 최소제곱법** : &#39;차이의 제곱&#39;을 모두 더했을 때 가장 작은 값을 &#39;참값&#39;으로 추정한다 (평균은 최소제곱법에 기초하여 측정값에 포함되어 있는 차이를 가장 적게 만드는 추정값)</li>
</ul>
<br>

<h3 id="📗평균으로-진실을-포착할-수-있는-이유">📗평균으로 진실을 포착할 수 있는 이유</h3>
<p>1) 인과관계의 통찰 관점에서 볼때, 평균이 중앙값보다 관심이 있는 것에 대한 직접적인 대답이 되는 경우가 많다</p>
<ul>
<li>전체적인 매출이 얼마나 변했는가 하는 증감을 알기 위해선 평균이 적합</li>
</ul>
<p>2) 데이터의 불규칙성이 정규분포를 따르고 있으면, 최소제곱법이 가장 좋은 추정 방법이고 그 결과 평균값이 가장 좋은 추정값이 된다</p>
<br>

<h4 id="-정규분포-">[ 정규분포 ]</h4>
<p>좌우대칭인 매끄러운 곡선으로 표현되는 데이터의 불규칙성</p>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/0314acf9-32cd-4529-aba4-99854aa5feae/image.png" alt=""></p>
<h4 id="-중심극한정리-">[ 중심극한정리 ]</h4>
<p>&#39;대다수 데이터가 정규분포를 따른다&#39;는 사실을 넘어 어떤 데이터가 정규분포를 따르지 않는다고 해도 &#39;데이터 값을 거듭 추가할수록&#39; 정규분포에 수렴하게 된다는 것
<img src="https://velog.velcdn.com/images/stand_hyo/post/c2c436e7-e421-46e6-bd94-b044d7b8bef0/image.png" alt=""></p>
<h3 id="📗표준편차로-데이터의-대략적-범위-파악">📗표준편차로 &#39;데이터의 대략적 범위&#39; 파악</h3>
<h4 id="현상파악-시-사용하는-방법">현상파악 시 사용하는 방법</h4>
<p>1) 최댓값 &amp; 최솟값</p>
<ul>
<li>1건에 데이터에 의해 대푯값이 정해지는 단점</li>
</ul>
<p>2) 사분위수 : 25%, 중위값, 75%</p>
<ul>
<li>데이터 정렬이나 수식을 전개하기 어렵고, 총량의 차이를 계산하기 쉽지 않음</li>
</ul>
<p>3) 분산 : 데이터의 펼쳐진 정도</p>
<ul>
<li>&#39;참값에서 벗어난 값의 제곱합&#39;은 데이터가 늘수록 커질 수 밖에 없으므로, 데이터가 늘수록 불규칙성이 커지게 되는 현상 발생</li>
<li>이를 해결하기 위해, &#39;벗어난 값의 제곱합&#39; 대신 <strong>&#39;벗어난 값의 제곱 평균&#39;</strong>을 사용하여 내포된 불규칙성 표현</li>
<li>불편성 갖는 분산인지에 대한 여부는 신경쓸 필요 없음</li>
</ul>
<p>4) 표준편차: 분산에 제곱근을 씌운 값</p>
<ul>
<li>분산은 벗어난 값을 제곱한 상태 그대로를 생각하는 지표이기 때문에 이미지를 더 잘 잡고 싶다면 제곱 처리 필요<br>

</li>
</ul>
<h4 id="평균과-표준편차의-현상분석">평균과 표준편차의 현상분석</h4>
<blockquote>
<p>데이터의 불규칙성이 어떠하든, <strong>&lt; 평균값-2SD ~ 평균값+2SD &gt;</strong>까지의 범위에 반드시 전체의 <strong>4분의 3이상의 데이터</strong>가 존재한다</p>
</blockquote>
<h4 id="평균과-표준편차를-통찰에-사용">평균과 표준편차를 &#39;통찰&#39;에 사용</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data] 웹 크롤링 기법 정리]]></title>
            <link>https://velog.io/@stand_hyo/Data-%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%A7%81-%EA%B8%B0%EB%B2%95-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@stand_hyo/Data-%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%A7%81-%EA%B8%B0%EB%B2%95-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 04 Dec 2022 07:11:39 GMT</pubDate>
            <description><![CDATA[<h4 id="📖-api-용어-정리">📖 API 용어 정리</h4>
<ul>
<li><p>API (Application Programming Interface) : 특정 프로그램을 만들기 위해 제공되는 모듈</p>
</li>
<li><p>Open API : 누구나 사용할 수 있도록 공개된 API</p>
</li>
<li><p>Rest API (Representational State Transfer) : HTTP 프로토콜을 통해 서버 제공 기능을 사용할 수 있는 함수</p>
</li>
</ul>
<br>

<h4 id="📖-json-용어-정리">📖 JSON 용어 정리</h4>
<ul>
<li><p>JSON (JavaScript Object Notation)</p>
</li>
<li><p>서버와 클라이언트, 혹은 컴퓨터와 프로그램 사이에 데이터를 주고받을 때 사용하는 데이터 포맷</p>
</li>
<li><p>키와 값을 괄호나 세미콜론을 활용하여 간단하게 표현할 수 있으며, 언어나 운영체제에 구애받지 않기 때문에 널리 활용됨</p>
</li>
<li><p>{&quot;id&quot; : &quot;01&quot;, &quot;language&quot; : &quot;Java&quot;, &quot;edition&quot; : &quot;third&quot;}</p>
</li>
</ul>
<br>


<h4 id="📖-open-api-크롤링-기법-정리">📖 Open API 크롤링 기법 정리</h4>
<h4 id="1-1-urllib-라이브러리">1-1. urllib 라이브러리</h4>
<ul>
<li><p>urllib.request는 URL(Uniform Resource Locator)을 가져오기 위한 파이썬 모듈</p>
</li>
<li><p>urllib.request는 관련 네트워크 프로토콜을 사용하여 많은 URL 스킴(scheme)에 대해 URL을 가져오는 것을 지원합니다.</p>
</li>
</ul>
<pre><code>    - 네트워크 프로토콜 : ex. FTP, HTTP
    - URL 스킴 : URL에서 &quot;:&quot; 앞의 문자열 
      ex. &quot;ftp&quot;는 &quot;ftp://python.org/&quot;의 URL 스킴</code></pre><h4 id="1-2-urllib-라이브러리-크롤링-코드-네이버-open-api-예제">1-2. urllib 라이브러리 크롤링 코드 (네이버 open API 예제)</h4>
<pre><code class="language-python"># 블로그 검색
import os
import sys
import urllib.request
client_id = &quot;YOUR_CLIENT_ID&quot;
client_secret = &quot;YOUR_CLIENT_SECRET&quot;
encText = urllib.parse.quote(&quot;검색할 단어&quot;)
url = &quot;https://openapi.naver.com/v1/search/blog?query=&quot; + encText # json 결과
# url = &quot;https://openapi.naver.com/v1/search/blog.xml?query=&quot; + encText # xml 결과
request = urllib.request.Request(url)
request.add_header(&quot;X-Naver-Client-Id&quot;,client_id)
request.add_header(&quot;X-Naver-Client-Secret&quot;,client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode(&#39;utf-8&#39;))
else:
    print(&quot;Error Code:&quot; + rescode)</code></pre>
<ul>
<li>urllib 라이브러리 <a href="https://docs.python.org/3/library/urllib.html">참고문서</a></li>
</ul>
<br>


<h4 id="2-1-requests-라이브러리">2-1. requests 라이브러리</h4>
<ul>
<li><p>파이썬으로 HTTP 통신이 필요한 프로그램을 작성할 때 가장 많이 사용되는 라이브러리로, 원격에 있는 API를 호출할 때 유용하게 사용할 수 있음</p>
</li>
<li><p>HTTP 요청 방식(method)</p>
<ul>
<li>GET 방식: requests.get()</li>
<li>POST 방식: requests.post()</li>
<li>PUT 방식: requests.put()</li>
<li>DELETE 방식: requests.delete()</li>
</ul>
</li>
<li><p>응답상태</p>
<ul>
<li>response.status_code를 사용해서 확인 가능<ul>
<li>다양한 응답상태 참고 <a href="https://sanghaklee.tistory.com/61">블로그</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code class="language-python">&gt;&gt;&gt; response = requests.get(&quot;https://jsonplaceholder.typicode.com/users/1&quot;)
&gt;&gt;&gt; response.status_code
200 # 클라이언트의 요청을 서버가 정상적으로 처리했다.
&gt;&gt;&gt; response = requests.get(&quot;https://jsonplaceholder.typicode.com/users/100&quot;)
&gt;&gt;&gt; response.status_code
404 # 클라이언트가 요청한 자원이 존재하지 않다.
&gt;&gt;&gt; response = requests.post(&quot;https://jsonplaceholder.typicode.com/users&quot;)
&gt;&gt;&gt; response.status_code
201 # 클라이언트의 요청을 서버가 정상적으로 처리했고 새로운 리소스가 생겼다.</code></pre>
<ul>
<li>응답전문<ul>
<li>요청이 정상적으로 처리가 된 경우, 응답 전문(response - body/payload)에 요청한 데이터가 담겨져 옴</li>
<li>응답 전문은 크게 3가지 방식으로 읽어올 수 있음<pre><code class="language-python">&gt;&gt;&gt; response = requests.get(&quot;https://jsonplaceholder.typicode.com/users/1&quot;)</code></pre>
1) content 속성을 통해 바이너리 원문을 얻기</li>
</ul>
</li>
</ul>
<pre><code class="language-python">&gt;&gt;&gt; response.contentb&#39;{\n  &quot;id&quot;: 1,\n  &quot;name&quot;: &quot;Leanne Graham&quot;,\n  &quot;username&quot;: &quot;Bret&quot;,\n  &quot;email&quot;: &quot;Sincere@april.biz&quot;,\n  &quot;address&quot;: {\n    &quot;street&quot;: &quot;Kulas Light&quot;,\n    &quot;suite&quot;: &quot;Apt. 556&quot;,\n    &quot;city&quot;: &quot;Gwenborough&quot;,\n    &quot;zipcode&quot;: &quot;92998-3874&quot;,\n    &quot;geo&quot;: {\n      &quot;lat&quot;: &quot;-37.3159&quot;,\n      &quot;lng&quot;: &quot;81.1496&quot;\n    }\n  },\n  &quot;phone&quot;: &quot;1-770-736-8031 x56442&quot;,\n  &quot;website&quot;: &quot;hildegard.org&quot;,\n  &quot;company&quot;: {\n    &quot;name&quot;: &quot;Romaguera-Crona&quot;,\n    &quot;catchPhrase&quot;: &quot;Multi-layered client-server neural-net&quot;,\n    &quot;bs&quot;: &quot;harness real-time e-markets&quot;\n  }\n}&#39;</code></pre>
<pre><code>1) text 속성을 통해 UTF-8로 인코딩된 문자열을 얻기</code></pre><pre><code class="language-python">&gt;&gt;&gt; response.text
&#39;{\n  &quot;id&quot;: 1,\n  &quot;name&quot;: &quot;Leanne Graham&quot;,\n  &quot;username&quot;: &quot;Bret&quot;,\n  &quot;email&quot;: &quot;Sincere@april.biz&quot;,\n  &quot;address&quot;: {\n    &quot;street&quot;: &quot;Kulas Light&quot;,\n    &quot;suite&quot;: &quot;Apt. 556&quot;,\n    &quot;city&quot;: &quot;Gwenborough&quot;,\n    &quot;zipcode&quot;: &quot;92998-3874&quot;,\n    &quot;geo&quot;: {\n      &quot;lat&quot;: &quot;-37.3159&quot;,\n      &quot;lng&quot;: &quot;81.1496&quot;\n    }\n  },\n  &quot;phone&quot;: &quot;1-770-736-8031 x56442&quot;,\n  &quot;website&quot;: &quot;hildegard.org&quot;,\n  &quot;company&quot;: {\n    &quot;name&quot;: &quot;Romaguera-Crona&quot;,\n    &quot;catchPhrase&quot;: &quot;Multi-layered client-server neural-net&quot;,\n    &quot;bs&quot;: &quot;harness real-time e-markets&quot;\n  }\n}&#39;</code></pre>
<pre><code>3) json() 함수를 통해 사전(dictionary) 객체 얻기</code></pre><pre><code class="language-python">&gt;&gt;&gt; response.json()
{&#39;id&#39;: 1, &#39;name&#39;: &#39;Leanne Graham&#39;, &#39;username&#39;: &#39;Bret&#39;, &#39;email&#39;: &#39;Sincere@april.biz&#39;, &#39;address&#39;: {&#39;street&#39;: &#39;Kulas Light&#39;, &#39;suite&#39;: &#39;Apt. 556&#39;, &#39;city&#39;: &#39;Gwenborough&#39;, &#39;zipcode&#39;: &#39;92998-3874&#39;, &#39;geo&#39;: {&#39;lat&#39;: &#39;-37.3159&#39;, &#39;lng&#39;: &#39;81.1496&#39;}}, &#39;phone&#39;: &#39;1-770-736-8031 x56442&#39;, &#39;website&#39;: &#39;hildegard.org&#39;, &#39;company&#39;: {&#39;name&#39;: &#39;Romaguera-Crona&#39;, &#39;catchPhrase&#39;: &#39;Multi-layered client-server neural-net&#39;, &#39;bs&#39;: &#39;harness real-time e-markets&#39;}}</code></pre>
<ul>
<li><p>응답헤더</p>
<ul>
<li>응답에 대한 메타 데이터를 담고 있음</li>
<li>headers 속성을 통해 사전의 형태로 얻을 수 있음<pre><code class="language-python">&gt;&gt;&gt; response = requests.get(&quot;https://jsonplaceholder.typicode.com/users/1&quot;)
&gt;&gt;&gt; response.headers
{&#39;Date&#39;: &#39;Sat, 12 Dec 2020 21:10:49 GMT&#39;, &#39;Content-Type&#39;: &#39;application/json; charset=utf-8&#39;, &#39;Transfer-Encoding&#39;: &#39;chunked&#39;, &#39;Connection&#39;: &#39;keep-alive&#39;, &#39;Set-Cookie&#39;: &#39;__cfduid=d92df672c0d58b06b245dd0b8d317e2141607807449; expires=Mon, 11-Jan-21 21:10:49 GMT; path=/; domain=.typicode.com; HttpOnly; SameSite=Lax&#39;, &#39;X-Powered-By&#39;: &#39;Express&#39;, &#39;X-Ratelimit-Limit&#39;: &#39;1000&#39;, &#39;X-Ratelimit-Remaining&#39;: &#39;999&#39;, &#39;X-Ratelimit-Reset&#39;: &#39;1607798104&#39;, &#39;Vary&#39;: &#39;Origin, Accept-Encoding&#39;, &#39;Access-Control-Allow-Credentials&#39;: &#39;true&#39;, &#39;Cache-Control&#39;: &#39;max-age=43200&#39;, &#39;Pragma&#39;: &#39;no-cache&#39;, &#39;Expires&#39;: &#39;-1&#39;, &#39;X-Content-Type-Options&#39;: &#39;nosniff&#39;, &#39;Etag&#39;: &#39;W/&quot;1fd-+2Y3G3w049iSZtw5t1mzSnunngE&quot;&#39;, &#39;Via&#39;: &#39;1.1 vegur&#39;, &#39;CF-Cache-Status&#39;: &#39;HIT&#39;, &#39;Age&#39;: &#39;9352&#39;, &#39;cf-request-id&#39;: &#39;06fa63d142000038668b9a7000000001&#39;, &#39;Expect-CT&#39;: &#39;max-age=604800, report-uri=&quot;https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct&quot;&#39;, &#39;Report-To&#39;: &#39;{&quot;endpoints&quot;:[{&quot;url&quot;:&quot;https:\\/\\/a.nel.cloudflare.com\\/report?s=Vk2e8Q%2FBK4wOSQc12Cgs0nqvZHpyUb4c0o%2BWCgLzwdqPLQM2HJ5hNHW%2Fmc8fNr73wqQ2LrzEdScfv5bejTYVrXRlUfAyPcGnv1me%2BHlZKc7IKKOi%2BO%2ButGVrdkWS&quot;}],&quot;group&quot;:&quot;cf-nel&quot;,&quot;max_age&quot;:604800}&#39;, &#39;NEL&#39;: &#39;{&quot;report_to&quot;:&quot;cf-nel&quot;,&quot;max_age&quot;:604800}&#39;, &#39;Server&#39;: &#39;cloudflare&#39;, &#39;CF-RAY&#39;: &#39;600a6f2edfe23866-IAD&#39;, &#39;Content-Encoding&#39;: &#39;gzip&#39;}
&gt;&gt;&gt; response.headers[&#39;Content-Type&#39;]
&#39;application/json; charset=utf-8&#39;</code></pre>
</li>
</ul>
</li>
<li><p>요청쿼리</p>
<ul>
<li>GET 방식으로 HTTP 요청을 할 때는 쿼리 스트링(query string)을 통해 응답받을 데이터를 필터링하는 경우가 많음</li>
<li>params 옵션을 사용하면 쿼리 스크링을 사전의 형태로 넘길 수 있음<pre><code class="language-python"># https://jsonplaceholder.typicode.com/posts?userId=1
&gt;&gt;&gt; response = requests.get(&quot;https://jsonplaceholder.typicode.com/posts&quot;, params={&quot;userId&quot;: &quot;1&quot;})
&gt;&gt;&gt; [post[&quot;id&quot;] for post in response.json()]
  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]</code></pre>
</li>
</ul>
</li>
<li><p>요청전문</p>
<ul>
<li><p>POST나 PUT 방식으로 HTTP 요청을 할 때는 보통 요청 전문(request body/payload)에 데이터를 담아서 보냄</p>
<p>1) data 옵션 사용
: HTML 양식(form) 포멧의 데이터를 전송할 수 있으며, 이 때 Content-Type 요청 헤더는 application/x-www-form-urlencoded로 자동 설정됨</p>
<pre><code class="language-python">&gt;&gt;&gt; requests.post(&quot;https://jsonplaceholder.typicode.com/users&quot;, data={&#39;name&#39;: &#39;Test User&#39;})
&lt;Response [201]&gt;</code></pre>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data] GridSearchCV - 하이퍼 파라미터 학습과 최적화]]></title>
            <link>https://velog.io/@stand_hyo/Data-GridSearchCV-%ED%95%98%EC%9D%B4%ED%8D%BC-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-%ED%95%99%EC%8A%B5%EA%B3%BC-%EC%B5%9C%EC%A0%81%ED%99%94</link>
            <guid>https://velog.io/@stand_hyo/Data-GridSearchCV-%ED%95%98%EC%9D%B4%ED%8D%BC-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-%ED%95%99%EC%8A%B5%EA%B3%BC-%EC%B5%9C%EC%A0%81%ED%99%94</guid>
            <pubDate>Sat, 03 Dec 2022 07:23:58 GMT</pubDate>
            <description><![CDATA[<h3 id="🍀-gridsearchcv">🍀 GridSearchCV</h3>
<p>사이킷런에서는 분류 알고리즘이나 회귀 알고리즘에 사용되는 하이퍼파라미터를 순차적으로 입력해 학습을 하고 측정을 하면서 가장 좋은 파라미터를 알려준다. GridSearchCV를 활용하면 일일이 파라미터를 수정하면서 최적값을 계산하지 않아도 되며, grid 파라미터 안에서 집합을 만들고 적용하면 최적화된 파라미터를 뽑아낼 수 있다.</p>
<ul>
<li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html">GridSearchCV 사이킷런 공식문서</a></li>
</ul>
<br>

<h3 id="🍀-gridsearchcv-클래스-생성자">🍀 GridSearchCV 클래스 생성자</h3>
<ul>
<li><p>estimator : classifier, regressor, pipeline 등 가능</p>
</li>
<li><p>param_grid : 튜닝을 위해 파라미터, 사용될 파라미터를 dictionary 형태로 만들어서 넣는다.</p>
</li>
<li><p>scoring : 예측 성능을 측정할 평가 방법을 넣는다. 보통 accuracy 로 지정하여서 정확도로 성능 평가를 한다.</p>
</li>
<li><p>cv : 교차 검증에서 몇개로 분할되는지 지정한다.</p>
</li>
<li><p>refit : True가 디폴트로 True로 하면 최적의 하이퍼 파라미터를 찾아서 재학습 시킨다.</p>
</li>
</ul>
<pre><code class="language-python">import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import accuracy_score

iris_data = load_iris()
label = iris_data.target
data = iris_data.data

X_train, X_val, y_train, y_val = train_test_split(data, label, test_size=0.2)


# GridSearchCV의 param_grid 설정
params = {
    &#39;max_depth&#39;: [2, 3],
    &#39;min_samples_split&#39;: [2, 3]
}

dtc = DecisionTreeClassifier()

grid_tree = GridSearchCV(dtc, param_grid=params, cv=3, refit=True)
grid_tree.fit(X_train, y_train)

print(&#39;best parameters : &#39;, grid_tree.best_params_)
print(&#39;best score : &#39;, grid_tree.best_score_)
em = grid_tree.best_estimator_
pred = em.predict(X_val)
accuracy_score(y_val, pred)</code></pre>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/87be38c2-bde2-427f-8ca7-0c4ca271ae89/image.png" alt=""></p>
<p><a href="https://rudolf-2434.tistory.com/10">참고 블로그</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data] 나이브 베이즈 분류와 모델링]]></title>
            <link>https://velog.io/@stand_hyo/Data-%EB%82%98%EC%9D%B4%EB%B8%8C-%EB%B2%A0%EC%9D%B4%EC%A6%88-%EB%B6%84%EB%A5%98%EC%99%80-%EB%AA%A8%EB%8D%B8%EB%A7%81</link>
            <guid>https://velog.io/@stand_hyo/Data-%EB%82%98%EC%9D%B4%EB%B8%8C-%EB%B2%A0%EC%9D%B4%EC%A6%88-%EB%B6%84%EB%A5%98%EC%99%80-%EB%AA%A8%EB%8D%B8%EB%A7%81</guid>
            <pubDate>Sat, 03 Dec 2022 06:49:59 GMT</pubDate>
            <description><![CDATA[<h3 id="🔎-나이브-베이즈-분류-naive-bayes-classification">🔎 나이브 베이즈 분류 (Naive Bayes classification)</h3>
<ul>
<li>데이터를 분류할 때 데이터 셋의 모든 특징들이 독립적이고 동등하다고 가정하고 데이터를 분류한다.</li>
<li>자료에 대한 가정을 하지 않고 대용량 데이터 자료에서 동작이 가능하다.</li>
<li>스팸필터 및 키워드 검색을 활용한 문서 분류에 사용된다.</li>
<li>베이즈 정리를 적용하여 데이터를 구성하고 각 변수는 독립적으로 가정해서 입력벡터를 분류하는 확률 모형이다</li>
<li>서포트 벡터 머신과 함께 우수한 분류 성능을 보이고 있다</li>
<li>범주형 예측자료만 가능 (수치형 자료의 경우, 범주형으로 변환해야 함)</li>
</ul>
<br>

<h3 id="🔎-나이브-베이즈-알고리즘">🔎 나이브 베이즈 알고리즘</h3>
<blockquote>
<p>P(A|B) = P(B|A)P(A)/P(B)</p>
</blockquote>
<pre><code>P(A|B) : 사건 B가 발생한 상태에서 사건 A가 발생할 조건부 확률
P(B|A) : 사건 A가 발생한 상태에서 사건 B가 발생할 조건부 확률
P(A) : 사건 A가 발생할 확률
P(B) : 사건 B가 발생할 확률</code></pre><h3 id="🔎-나이브-베이즈-장점">🔎 나이브 베이즈 장점</h3>
<ul>
<li>매우 단순하고 결측 데이터가 있어도 우수하다.</li>
<li>적은 학습 데이터로도 잘 수행된다.</li>
<li>메모리 사용량이 적다.</li>
<li>우수한 분류성능을 발휘한다.</li>
<li>계산과정의 복잡성이 낮기 때문에 성능이 빠르다.</li>
<li>예측에 대한 추정된 확률을 얻기가 쉽다</li>
</ul>
<h3 id="🔎-나이브-베이즈-단점">🔎 나이브 베이즈 단점</h3>
<ul>
<li>모든 속성을 독립적이고 동등하다는 가정에 의존한다.</li>
<li>변수들이 확률적이고 독립되지 않은 경우에 오류가 발생한다.</li>
<li>수치속성으로 구성된 데이터 셋에서는 우수하지 않다.</li>
<li>추정된 확률은 예측된 범주보다 신뢰가 떨어진다.<br>


</li>
</ul>
<h3 id="🔎-나이브-베이즈-모형-scikit-learn">🔎 나이브 베이즈 모형 (scikit-learn)</h3>
<p>사이킷런의 naive_bayes 서브패키지에서 제공하는 나이브베이즈 모형 클래스
<br></p>
<p>&lt; 사전 확률과 관련된 속성 &gt; </p>
<pre><code>- classes_ : 종속변수 Y의 클래스(라벨)

- class_count_ : 종속변수 Y의 값이 특정한 클래스인 표본 데이터의 수

- class_prior_ : 종속변수 Y의 무조건부 확률분포 P(Y) (정규분포의 경우에만)

- class_log_prior_ : 종속변수 Y의 무조건부 확률분포의 로그 logP(Y) 
  (베르누이분포나 다항분포의 경우에만)</code></pre><h4 id="1-gaussiannb-정규분포-나이브베이즈">1. GaussianNB: 정규분포 나이브베이즈</h4>
<pre><code>가우시안 나이브베이즈 모형 GaussianNB은 가능도 추정과 관련하여
다음과 같은 속성을 가진다.

- theta_: 정규분포의 기댓값 μ
- sigma_: 정규분포의 분산 σ2</code></pre><h4 id="2-bernoullinb-베르누이분포-나이브베이즈">2. BernoulliNB: 베르누이분포 나이브베이즈</h4>
<h4 id="3-multinomialnb-다항분포-나이브베이즈">3. MultinomialNB: 다항분포 나이브베이즈</h4>
<p>자세한 내용은 <a href="https://datascienceschool.net/03%20machine%20learning/11.02%20%EB%82%98%EC%9D%B4%EB%B8%8C%EB%B2%A0%EC%9D%B4%EC%A6%88%20%EB%B6%84%EB%A5%98%EB%AA%A8%ED%98%95.html">해당 글 </a>참고</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] numpy에서 reshape(-1,1)가 무엇일까?]]></title>
            <link>https://velog.io/@stand_hyo/Python-numpy%EC%97%90%EC%84%9C-reshape-11%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C</link>
            <guid>https://velog.io/@stand_hyo/Python-numpy%EC%97%90%EC%84%9C-reshape-11%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C</guid>
            <pubDate>Fri, 02 Dec 2022 15:01:44 GMT</pubDate>
            <description><![CDATA[<h3 id="📒-reshape함수">📒 reshape함수</h3>
<pre><code>: 배열과 차원을 변형해주는 함수


-  np.reshape(변경할 배열, 차원)

-  배열.reshape(차원)</code></pre><pre><code class="language-python">import numpy as np
a = [1,2,3,4,5,6,7,8]
b = np.reshape(a,(2,4))
c = np.reshape(a,(4,2))
print(b)
print(&#39;\n&#39;)
print(c)

&gt;&gt;&gt;[[1 2 3 4]
     [5 6 7 8]]

    [[1 2]
    [3 4]
    [5 6]
    [7 8]]</code></pre>
<br>

<h3 id="📒-reshape에서--1의-의미">📒 reshape에서 -1의 의미</h3>
<pre><code>:  변경된 배열의 ‘-1’ 위치의 차원은 
   “원래 배열의 길이와 남은 차원으로 부터 추정”이 된다는 뜻</code></pre><pre><code class="language-python">x = np.arange(12)
x = x.reshape(3,4)
x
&gt;&gt;&gt; array([[ 0,  1,  2,  3],
              [ 4,  5,  6,  7],
              [ 8,  9, 10, 11]])</code></pre>
<br>
<br>

<h4 id="💡-reshape-1정수--행의-위치에--1인-경우">💡 <strong>reshape(-1,정수)</strong> : 행의 위치에 -1인 경우</h4>
<pre><code class="language-python">x.reshape(-1,1)
&gt;&gt;&gt; array([[ 0],
              [ 1],
              [ 2],
           [ 3],
           [ 4],
           [ 5],
           [ 6],
           [ 7],
           [ 8],
           [ 9],
           [10],
           [11]])</code></pre>
<pre><code class="language-python">x.reshape(-1,2)
&gt;&gt;&gt; array([[ 0,  1],
           [ 2,  3],
           [ 4,  5],
           [ 6,  7],
           [ 8,  9],
           [10, 11]])</code></pre>
<pre><code class="language-python">x.reshape(-1,3)
&gt;&gt;&gt; array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 6,  7,  8],
           [ 9, 10, 11]])</code></pre>
<p>즉, 행(row)의 위치에 -1을 넣고 열의 값을 지정해주면 변환될 배열의 행의 수는 알아서 지정이 된다는 뜻</p>
<br>

<h4 id="💡-reshape정수-1--열의-위치에--1인-경우">💡 <strong>reshape(정수,-1)</strong> : 열의 위치에 -1인 경우</h4>
<pre><code class="language-python">x.reshape(1,-1)
&gt;&gt;&gt; array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]])</code></pre>
<pre><code class="language-python">x.reshape(2,-1)
&gt;&gt;&gt; array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])</code></pre>
<pre><code class="language-python">x.reshape(3,-1)
&gt;&gt;&gt; array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])</code></pre>
<p>행(row)의 수를 지정해주면 열은 알아서 자동으로 재배열을 해주는 것</p>
<h4 id="💡-reshape-1">💡 <strong>reshape(-1)</strong></h4>
<pre><code class="language-python">x.reshape(-1)
&gt;&gt;&gt; array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])</code></pre>
<pre><code class="language-python">x.reshape(1, -1)
&gt;&gt;&gt; array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]])</code></pre>
<p>-1만 들어가면 1차원 배열을 반환한다
모양상은 x.reshape(1,-1)과 같으나 차원수가 다름</p>
<br>
<br>
<br>
<br>
<br>
<br>

<p><a href="https://yganalyst.github.io/data_handling/memo_5/">다음</a>의 블로그를 참고했습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data] 데이터 전처리 - '이상치(Outlier)와 결측치(Missing Value) 처리하기]]></title>
            <link>https://velog.io/@stand_hyo/Data-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EC%9D%B4%EC%83%81%EC%B9%98Outlier%EC%99%80-%EA%B2%B0%EC%B8%A1%EC%B9%98Missing-Value-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@stand_hyo/Data-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-%EC%9D%B4%EC%83%81%EC%B9%98Outlier%EC%99%80-%EA%B2%B0%EC%B8%A1%EC%B9%98Missing-Value-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 02 Dec 2022 08:01:16 GMT</pubDate>
            <description><![CDATA[<p>데이터 분석을 진행하다보면 전처리 과정이 제일 중요하다는 것을 깨닫게 될 때가 많다. 다양한 데이터를 접하면서 가장 고민이 되는 부분이 해당 데이터의 &#39;이상치&#39;와 &#39;결측치&#39;를 어떻게 처리하는지이기 때문에 이제부터 다양한 처리 방법에 대해 알아보자!</p>
<h2 id="📝-이상치와-결측치">📝 이상치와 결측치</h2>
<ul>
<li><p>이상치(Outlier) : 보통 관측된 데이터의 범위에서 많이 벗어난 아주 작은 값이나 큰 값을 말한다. </p>
</li>
<li><p>결측치(Missing Value) : 데이터 수집 과정에서 측정되지 않거나 누락된 데이터를 말한다.</p>
<p>  이상치와 결측치는 모두 데이터 전처리 과정에서 처리를 진행해주지 않으면
  데이터 분석에 큰 영향을 끼치게 되기 때문에 알맞은 처리를 진행해주어야 한다!</p>
<br>

</li>
</ul>
<h2 id="📝-이상치outlier-탐지방법">📝 이상치(Outlier) 탐지방법</h2>
<h3 id="1-standard-deviation-정규분포">1. Standard Deviation (정규분포)</h3>
<p> 데이터의 분포가 정규 분포를 이룰 때, 데이터의 표준 편차를 이용해 이상치를 탐지하는 방법이다.</p>
<p>  <img src="https://velog.velcdn.com/images/stand_hyo/post/b20846fa-6ed8-4f44-a3f9-62f2ba9475de/image.png" alt=""></p>
<p>💡 <strong>68-95-99.7 규칙 (3시그마 규칙)</strong></p>
<ul>
<li><p>1표준편차 : 약 68%의 값들이 평균에서 양쪽으로 1 표준편차 범위(μ±σ)에 존재한다.</p>
</li>
<li><p>2표준편차: 약 95%의 값들이 평균에서 양쪽으로 2 표준편차 범위(μ±2σ)에 존재한다.  </p>
</li>
<li><p>3표준편차: 거의 모든 값들(실제로는 99.7%)이 평균에서 양쪽으로 3표준편차 범위(μ±3σ)에 존재한다.  </p>
</li>
</ul>
<blockquote>
<p>즉, 그래프의 정해진 표준편차마다 각각 파란 부분을 넘어서는 부분에 해당하는 값들을 이상치로 보는 방법이다.</p>
</blockquote>
   <br>
   <br>


<p><strong>💡 Z-score 공식</strong></p>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/7c3ecce8-c5f1-4d1a-88bb-302fdf79c519/image.png" alt=""></p>
<ul>
<li>Z-score: 해당 데이터가 평균으로부터 얼마의 표준 편차만큼 벗어나 있는지를 의미한다. </li>
<li>3 표준 편차 만큼을 벗어나는 데이터를 이상치로 처리하는 것은 Z-score 가 3 보다 크고 -3 보다 작은 데이터를 이상치로 처리하는 것과 같은 작업이다.<br>
<br>
### 2. IQR (Interquartile Range) with Box plots

</li>
</ul>
<p>데이터의 분포가 정규 분포를 이루지 않거나 한 쪽으로 skewed 한 경우, 데이터의 IQR 값을 이용해 이상치를 탐지하는 방법이다.</p>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/cd77416c-3811-459f-a552-9440766eb8b6/image.png" alt=""></p>
<ul>
<li><p>최솟값 : 제 1사분위(Q1)에서 1.5 IQR을 뺀 위치이다.</p>
</li>
<li><p>제 1사분위(Q1) : 25%의 위치를 의미한다.</p>
</li>
<li><p>제 2사분위(Q2) : 50%의 위치로 중앙값(median)을 의미한다.</p>
</li>
<li><p>제 3사분위(Q3) : 75%의 위치를 의미한다.</p>
</li>
<li><p>최댓값 : 제 3사분위에서 1.5 IQR을 더한 위치이다.</p>
</li>
<li><p>IQR : (제 3사분위 값) - (제 1사분위 값)</p>
</li>
</ul>
<blockquote>
<p>즉, (Q1 – 1.5 * IQR) 보다 작거나 (Q3 + 1.5 * IQR) 보다 큰 데이터는 이상치로 처리하며, 1.5 보다 큰 3 혹은 그 이상의 값을 곱하기도 하며 값이 클수록 더욱 최극단의 이상치를 처리함을 알 수 있다.</p>
</blockquote>
<br>

<h3 id="3-isolation-forest">3. Isolation Forest</h3>
<p>결정 트리 계열의 비지도 학습 알고리즘으로 High dimensional 데이터셋에서 이상치를 탐지할 때 효과적인 방법이다.</p>
<pre><code>* High dimensional 데이터셋: 변수(혹은 피처)의 수가 매우 큰 데이터</code></pre><p><img src="https://velog.velcdn.com/images/stand_hyo/post/208a0193-a9d2-4982-9c29-1a35c74c641e/image.png" alt=""></p>
<ul>
<li>데이터셋을 결정 트리 형태로 표현해 정상 데이터를 분리하기 위해서는 트리의 깊이가 깊어지고 반대로 이상치는 트리의 상단에서 분리할 수 있다는 개념을 이용한다. </li>
<li>즉, 데이터에서 이상치를 분리하는 것이 더 쉽다는 것이다.</li>
</ul>
<br>

<pre><code>&lt;이상치가 아닌 데이터&gt;</code></pre><p><img src="https://velog.velcdn.com/images/stand_hyo/post/17185126-2585-45c5-acd5-6b72be2a5217/image.png" alt=""></p>
<pre><code>&lt;이상치 데이터&gt;</code></pre><p><img src="https://velog.velcdn.com/images/stand_hyo/post/61aef669-e802-469d-98a7-8fab42b16c2f/image.png" alt=""></p>
<ul>
<li>이상치 판단 방법</li>
</ul>
<pre><code>- 특정 데이터를 데이터셋에서 분리하기 위해선 트리에서 몇 번을 분리해야 하는지 (데이터까지의 경로 길이)를 기준으로 데이터가 이상치인지 아닌지를 판단한다. 
- 이상치는 다른 관측치에 비해 **짧은 경로 길이**를 가진 데이터일 것이다.

- 이러한 개념을 기반으로 각 데이터에 대해 이상치 점수를 부여할 수 있으며 공식은 다음과 같다.


![](https://velog.velcdn.com/images/stand_hyo/post/feb47382-f1a4-4a89-9098-f1bd5bf5ce27/image.png)</code></pre><blockquote>
<p>h(x)는 경로 길이로 점수는 0 에서 1 사이로 산출된다. 결과가 1 에 가까울수록 이상치로 간주된다.</p>
</blockquote>
<br>

<h3 id="4-dbscan-density-based-spatial-clustering-of-applications-with-noise">4. DBScan (Density Based Spatial Clustering of Applications with Noise)</h3>
<p>밀도 기반의 클러스터링 알고리즘으로 어떠한 클러스터에도 포함되지 않는 데이터를 이상치로 탐지하는 방법이다.</p>
<p>💡 DBScan 알고리즘의 2가지의 하이퍼파라미터</p>
<ul>
<li>eps : 두 데이터 사이의 거리가 eps 보다 작거나 같을 때 이들은 같은 클러스터 내에 있는 것으로 간주한다.</li>
<li>MinPts : 한 클러스터 내에 존재해야 하는 데이터의 최소 개수. 최소 3 이상의 값을 가져야 하며 보통은 데이터의 차원에 1을 더한 값 이상으로 설정한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/531afbf8-5ce2-4ff1-9bee-4b697d747a5e/image.png" alt=""></p>
<blockquote>
<p>eps 거리 내에 MinPts 이상의 데이터를 이웃하는 데이터는 Core Point 가 되고 반대로 eps 거리 내에 MinPts 미만의 데이터를 이웃하는 데이터는 Border Point 가 된다. 그리고 이들을 제외한 데이터가 바로 이상치(Noise)가 된다.</p>
</blockquote>
<br>
<br>

<h2 id="📝-이상치outlier-처리-방법">📝 이상치(Outlier) 처리 방법</h2>
<h4 id="1-상한값과-하한값">1. 상한값과 하한값</h4>
<ul>
<li>하한값과 상한값을 결정한 후 하한값보다 적으면 하한값으로 대체, 상한값보다 크면 상한값으로 대체함</li>
</ul>
<h4 id="2-평균의-표준편차">2. 평균의 표준편차</h4>
<ul>
<li>하한값 = 평균 - n*표준편차</li>
<li>상한값 = 평균 + n*표준편차  </li>
<li>일반적으로 3시그마 (99.7% 이상 혹은 이하값을 이상치로 제거하거나 대체)</li>
</ul>
<h4 id="3-평균-절대-편차">3. 평균 절대 편차</h4>
<ul>
<li>중위수로부터 n편차 큰 값을 대체</li>
</ul>
<h4 id="4-극-백분위수">4. 극 백분위수</h4>
<ul>
<li>상위 p번째 백분위수보다 큰 값을 대체</li>
</ul>
<br>
<br>

<h2 id="📝-결측치missing-value-처리방법">📝 결측치(Missing Value) 처리방법</h2>
<h4 id="1-행-또는-열-삭제">1. 행 또는 열 삭제</h4>
<ul>
<li>결측치가 존재하는 행 또는 열(feature)을 삭제</li>
</ul>
<h4 id="2-중앙값-평균값으로-대체">2. 중앙값, 평균값으로 대체</h4>
<ul>
<li>빈 결측치에 해당하는 Feature의 평균값이나 중앙값으로 대체</li>
</ul>
<h4 id="3-최빈값으로-대체">3. 최빈값으로 대체</h4>
<ul>
<li>주로 Nominal feature(범주형 feature)일 때 유용한 방법</li>
</ul>
<h4 id="4-xgboost-lightgbm-사용">4. XGboost, LightGBM 사용</h4>
<ul>
<li>use_missing=False 인자를 첨가하면 알고리즘이 알아서 Training loss에 기반해 결측치를 채우게 된다. </li>
</ul>
<h4 id="5-k-nn알고리즘을-사용">5. K-NN알고리즘을 사용</h4>
<ul>
<li>결측치의 값을 가장 가까운 즉, feature similarity를 적용하면서 대체</li>
<li>이상치(outlier)에 민감하다는 단점이 존재한다.</li>
</ul>
<h4 id="6-micemultivariate-imputation-by-chained-equation">6. MICE(Multivariate Imputation by Chained Equation)</h4>
<ul>
<li>결측치를 한 번 대체하는 게 아니라 여러번(multi) 대체해보면서 결측치의 불확실성(uncertainty)을 체크하면서 결측치를 대체</li>
<li>이산, 연속 변수에도 flexible하게 사용되는 장점이 있다.</li>
</ul>
<h4 id="7-딥러닝">7. 딥러닝</h4>
<ul>
<li>딥러닝을 적용해 학습시켜 알아서 최적의 결측치를 찾는 것</li>
<li>주로 Categorical feature에 유용하며 다른 방법들에 비해 꽤 정확하다. </li>
<li>대용량의 데이터에는 속도가 느리다. </li>
<li>만약 결측치가 존재하는 feature가 여러개라면 여러개를 동시에 딥러닝에 적용은 못하고 하나의 feature씩만 impute할 수 있다. </li>
<li>또한 결측치가 존재하는 칼럼들의 정보를 갖고 있는 다른 칼럼들을 사용자가 직접 지정해주어야 한다는 단점이 있다. (즉, 하이퍼파라미터 튜닝이 필요하다.)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data] A/B test]]></title>
            <link>https://velog.io/@stand_hyo/Data-AB-test</link>
            <guid>https://velog.io/@stand_hyo/Data-AB-test</guid>
            <pubDate>Thu, 01 Dec 2022 18:35:24 GMT</pubDate>
            <description><![CDATA[<h3 id="📖-ab-test의-정의">📖 A/B test의 정의</h3>
<blockquote>
<p>두 가지 콘텐츠를 비교하여 방문자 또는 뷰어가 더 높은 관심을 보이는 버전을 확인하기 위한 테스트를 의미하며, 주요 측정지표를 기반으로 가장 성공적인 버전을 측정하기 위해 변형(B) 버전과 비교하여 컨트롤(A) 버전을 검증한다.</p>
</blockquote>
<ul>
<li><p>웹 사이트 A/B 테스트 </p>
<ul>
<li>텍스트, 이미지, 색상 설계, CTA(call to action)</li>
<li>A와 B 두 버전 사이의 트래픽을 분리</li>
<li>전환한 숫자, 원하는 작업을 수행한 방문자의 숫자</li>
</ul>
<ul>
<li><p>이메일 마케팅의 A/B 테스트</p>
<ul>
<li>이메일 제목, 이미지, CTA</li>
<li>수신자를 두 세그먼트로 세분화</li>
<li>높은 오픈율(open rate)</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<h3 id="📖-ab-test-필요한-시기와-이유">📖 A/B test 필요한 시기와 이유</h3>
<ul>
<li>지속적으로 운영할 때 가장 효과적이다.  <ul>
<li>정기적인 테스트는 미세한 성능 조정 방법을 위한 권장 사항을 지속적으로 제공</li>
<li>테스트에 사용할 수 있는 옵션이 거의 무제한</li>
</ul>
</li>
</ul>
<br>

<h3 id="📖-ab-test-수행방법">📖 A/B test 수행방법</h3>
<ol>
<li>성과 기준 측정 및 검토</li>
<li>성과 기준을 사용하여 테스트 목표 결정</li>
<li>테스트에서 성과를 개선할 수 있는 방법에 대한 가설을 개발</li>
<li>테스트 대상 또는 위치 식별</li>
<li>테스트할 A, B 버전 생성</li>
<li>QA 도구를 활용하여 설정 검증</li>
<li>테스트 실행</li>
<li>웹 및 테스트 분석을 사용하여 결과 추적 및 평가</li>
<li>결론을 적용하여 고객 경험 개선</li>
</ol>
<br>

<h3 id="📖-ab-test-수행이유">📖 A/B test 수행이유</h3>
<blockquote>
<p>더욱 많은 고객이 참여할 수 있는 고객 경험(CX)을 설계 가능하게 하며, 더 설득력 있는 텍스트와 매력적인 비주얼을 구성하는 데 도움이 될 수 있다.</p>
</blockquote>
<br>


<h3 id="📖-웹-사이트-ab-테스트에서-분석의-역할">📖 웹 사이트 A/B 테스트에서 분석의 역할</h3>
<blockquote>
<p>A/B 테스트의 수명 주기 전반에서 분석은 <strong>계획, 실행, 추천 성과</strong>의 핵심 요소</p>
</blockquote>
<p><strong>[ 계획단계 ]</strong> </p>
<p>💡 해당 시점의 성과와 트래픽 수준을 이해해야 한다. </p>
<pre><code>ex. 웹분석 (주요 데이터 포인트)
   - 테스트 시나리오를 위해 검토 중인 페이지, 구성요소 또는 기타 요소의 트래픽(페이지 뷰, 고유 방문자)
   - 참여(방문당 체류 시간, 방문당 페이지 수, 이탈률)
   - 전환(클릭, 등록, 포기)
   - 시간 경과에 따른 성과 추이</code></pre><p><strong>[ 실행단계 ]</strong> </p>
<p>💡 대시보드의 사용</p>
<pre><code>   - 성능 측정지표를 실시간으로 모니터
   - 테스트가 예상대로 작동하는지 검증
   - 이례적 또는 예기치 않은 결과에 대응 
     (테스트 중지, 조정 및 재시작, 변경 사항의 성능 데이터 반영 여부와 변경 시점의 보장) 
   - 테스트 수행 기간을 확인하고 통계적 유의도를 보장하는 데 도움</code></pre><p><strong>[ 성과단계 ]</strong> </p>
<p>💡 다음 단계를 결정하는데 분석을 사용</p>
<pre><code>   - 테스트에서 성공할 경우 이를 웹 페이지에 기준으로 제시하는가의 여부
   - 이를 표준으로 지속하는가의 여부를 결정하는 데 사용</code></pre><br>
<br>
참고:[ Oracle 사이트](https://www.oracle.com/kr/cx/marketing/what-is-ab-testing/#:~:text=%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94%3F-,A%2FB%20%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9D%98%20%EC%A0%95%EC%9D%98,A)%20%EB%B2%84%EC%A0%84%EC%9D%84%20%EA%B2%80%EC%A6%9D%ED%95%A9%EB%8B%88%EB%8B%A4.)]]></description>
        </item>
        <item>
            <title><![CDATA[[Solved] Jupyter notebook 실행 오류]]></title>
            <link>https://velog.io/@stand_hyo/Solved-Jupyter-notebook-%EC%8B%A4%ED%96%89-%EC%98%A4%EB%A5%98</link>
            <guid>https://velog.io/@stand_hyo/Solved-Jupyter-notebook-%EC%8B%A4%ED%96%89-%EC%98%A4%EB%A5%98</guid>
            <pubDate>Fri, 11 Nov 2022 08:44:07 GMT</pubDate>
            <description><![CDATA[<p>항상 주피터 노트북을 잘 쓰고 있다가 갑자기 실행 자체가 안되어버렸다. 지난 번에도 이랬던 적이 있었는데 주피터를 지우고 다시 깔아서 해결했던 것 같다. 하지만 프로그램을 깔았다 지워서 문제를 해결하는 건 그렇게 좋은 해결책이 아니라는 얘기를 듣고 구글링을 열심히 해보았다. 극적으로 해결!</p>
<h4 id="오류코드">오류코드</h4>
<pre><code>ImportError: cannot import name &#39;soft_unicode&#39; from &#39;markupsafe&#39; (C:\Users\hyojj\anaconda3\lib\site-packages\markupsafe\__init__.py)</code></pre><h4 id="해결코드">해결코드</h4>
<pre><code>pip install markupsafe==2.0.1</code></pre><h4 id="오류원인">오류원인</h4>
<p>markupsafe 2.0.1 버전 패키지에 soft_unicode 메서드가 더 이상 사용되지 않기 때문에 발생 &gt; markupsafe 2.0.1 패키지 설치로 해결</p>
<p><a href="https://bobbyhadz.com/blog/python-importerror-cannot-import-name-soft-unicode-from-markupsafe">도움받은 블로그</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[자료구조] 힙자료구조 - heapq모듈 활용]]></title>
            <link>https://velog.io/@stand_hyo/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%9E%99%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-heapq%EB%AA%A8%EB%93%88-%ED%99%9C%EC%9A%A9</link>
            <guid>https://velog.io/@stand_hyo/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%9E%99%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-heapq%EB%AA%A8%EB%93%88-%ED%99%9C%EC%9A%A9</guid>
            <pubDate>Sat, 05 Nov 2022 13:56:30 GMT</pubDate>
            <description><![CDATA[<h3 id="heap이란">heap이란?</h3>
<blockquote>
<p>우선순위의 개념을 큐에 도입한 자료구조로 우선순위가 높은 데이터가 먼저 나가게 된다. 이진 트리(binary tree) 기반으로 최소 힙(min heap) 자료구조를 제공한다.</p>
</blockquote>
<h3 id="heap의-종류">heap의 종류</h3>
<ul>
<li><p>최대 힙(max heap)
부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진 트리</p>
</li>
<li><p>최소 힙(min heap)
부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진 트리</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/1776b7c7-fd4f-4265-bace-24793b08f879/image.png" alt=""></p>
<h3 id="heapq-모듈-활용-소스코드">heapq 모듈 활용 소스코드</h3>
<blockquote>
<h4 id="heapq-모듈-import">heapq 모듈 import</h4>
</blockquote>
<pre><code>from heapq import heappush, heappop</code></pre><blockquote>
<h4 id="최소-힙-생성">최소 힙 생성</h4>
</blockquote>
<pre><code>heap = []</code></pre><blockquote>
<h4 id="힙에-원소-추가">힙에 원소 추가</h4>
</blockquote>
<pre><code>from heapq import heappush
heappush(heap, 4)
heappush(heap, 1)
heappush(heap, 7)
heappush(heap, 3)
print(heap)</code></pre><blockquote>
<h4 id="힙에서-원소-삭제">힙에서 원소 삭제</h4>
</blockquote>
<pre><code>from heapq import heappop
print(heappop(heap))
print(heap)</code></pre><blockquote>
<h4 id="최소값-삭제하지-않고-얻기">최소값 삭제하지 않고 얻기</h4>
</blockquote>
<pre><code>print(heap[0])</code></pre><blockquote>
<h4 id="기존-리스트를-힙으로-변환">기존 리스트를 힙으로 변환</h4>
</blockquote>
<pre><code>from heapq import heapify
heap = [4, 1, 7, 3, 8, 5]
heapify(heap)
print(heap)</code></pre><pre><code>nums = [4, 1, 7, 3, 8, 5]
heap = nums[:]
heapify(heap)
print(nums)
print(heap)</code></pre><blockquote>
<h4 id="최대-힙">최대 힙</h4>
</blockquote>
<ul>
<li>힙에 튜플(tuple)를 원소로 추가하거나 삭제하면, 튜플 내에서 맨 앞에 있는 값을 기준으로 최소 힙이 구성되는 원리를 이용</li>
<li>각 값에 대한 우선 순위를 구한 후, <strong>(우선 순위, 값)</strong> 구조의 튜플을 힙에 추가하거나 삭제!</li>
<li>힙에서 값을 읽어올 때는 각 튜플에서 인덱스 1에 있는 값을 취하자 
(우선 순위에는 관심이 없으므로 )<pre><code>from heapq import heappush, heappop
nums = [4, 1, 7, 3, 8, 5]
heap = []
for num in nums:
heappush(heap, (-num, num))  # (우선 순위, 값)
while heap:
print(heappop(heap)[1])  # index 1</code></pre></li>
</ul>
<blockquote>
<h4 id="n번째-최소값최대값">n번째 최소값/최대값</h4>
</blockquote>
<ul>
<li>최소 힙이나 최대 힙을 사용하면 n 번째로 작은 값이나 n 번째로 큰 값을 효과적으로 구할 수 있다</li>
<li>n 번째 최소값을 구하기 위해서는 주어진 배열로 힙을 만든 후, heappop() 함수를 n 번 호출<pre><code>from heapq import heappush, heappop
def nth_smallest(nums, n):
  heap = []
  for num in nums:
      heappush(heap, num)
  nth_min = None
  for _ in range(n):
      nth_min = heappop(heap)
  return nth_min
print(nth_smallest([4, 1, 7, 3, 8, 5], 3))</code></pre><pre><code># heapify 사용해서 반복문 줄이기
def nth_smallest(nums, n):
  heapify(nums)
  nth_min = None
  for _ in range(n):
      nth_min = heappop(nums)
  return nth_min
print(nth_smallest([4, 1, 7, 3, 8, 5], 3))</code></pre></li>
<li>nsmallest(), nlargest() : 주어진 리스트에서 가장 작은/큰 n개의 값을 담은 리스트를 반환 (리스트의 마지막 값이 n 번째 작은/큰 값)<pre><code>from heapq import nsmallest
nsmallest(3, [4, 1, 7, 3, 8, 5])[-1]</code></pre><pre><code>from heapq import nlargest
nlargest(3, [4, 1, 7, 3, 8, 5])[-1]</code></pre></li>
</ul>
<blockquote>
<h4 id="힙-정렬">힙 정렬</h4>
</blockquote>
<pre><code>from heapq import heappush, heappop
def heap_sort(nums):
  heap = []
  for num in nums:
    heappush(heap, num)
  sorted_nums = []
  while heap:
    sorted_nums.append(heappop(heap))
  return sorted_nums
print(heap_sort([4, 1, 7, 3, 8, 5]))</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[RNN(순환신경망)]]></title>
            <link>https://velog.io/@stand_hyo/RNN%EC%88%9C%ED%99%98%EC%8B%A0%EA%B2%BD%EB%A7%9D</link>
            <guid>https://velog.io/@stand_hyo/RNN%EC%88%9C%ED%99%98%EC%8B%A0%EA%B2%BD%EB%A7%9D</guid>
            <pubDate>Fri, 22 Jul 2022 05:35:18 GMT</pubDate>
            <description><![CDATA[<h3 id="rnnrecurrent-neural-network">RNN(Recurrent Neural Network)</h3>
<p>RNN은 입력과 출력을 시퀀스 단위로 처리하는 시퀀스(Sequence) 모델로 유닛간의 연결이 순환적 구조를 갖는 특징을 가지고 있다. <br/><br/></p>
<h3 id="rnn-등장배경">RNN 등장배경</h3>
<p>기존 모델의 한계점</p>
<ul>
<li>전부 은닉층에서 활성화 함수를 지난 값은 오직 출력층 방향으로만 향함(한 방향)</li>
<li>시퀀스 데이터 처리 성능이 낮음</li>
<li>가중치가 데이처의 처리되는 순서와 상관없이 업데이트 되어 이전 샘플을 기억하지 못함</li>
<li>피드 포워드 신경망은 입력의 길이가 고정되어 있음</li>
</ul>
<p>RNN의 기존 모델과의 차이점</p>
<ul>
<li>결과값을 출력층 방향으로도 보내면서, 다시 은닉층 노드의 다음 계산의 입력으로 보낸다</li>
<li>다양한 길이의 입력 시퀀스를 처리할 수 있다</li>
<li>자연어 처리에 대표적으로 사용되는 인공 신경망</li>
<li>타임스텝: 입력 시퀀스의 길이(input_length)
<img src="https://velog.velcdn.com/images/stand_hyo/post/41f517b3-2c56-4d9e-b04a-371a014012cf/image.png" alt="">
<br/><br/></li>
</ul>
<h3 id="rnn의-유형">RNN의 유형</h3>
<ul>
<li>One to one(SimpleRNN): 가장 기본적인 모델</li>
<li>One to many: 하나의 이미지를 문장으로 표현</li>
<li>Many to one: 단어 시퀀스에 대해서 하나의 출력을 하는 구조 ex. 감정분류, 주가등락을 통한 회사 파산 여부 분류</li>
<li>Many to many<ul>
<li>여러 개의 단어를 입력받아 여러 개의 단어로 구성된 문장을 명사, 동사, 형용사 등으로 구분 반환</li>
<li>입력 시퀀스가 다른 시간 단계에서 비디오의 각 프레임의 기능 표현인 비디오 분류에도 사용</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/stand_hyo/post/82d53984-5d2d-4ad3-81af-9feed139a5a9/image.png" alt=""><br/><br/></p>
<h3 id="rnn의-용어">RNN의 용어</h3>
<p>셀(cell): RNN의 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드(RNN의 반복 단위, 개별)
메모리셀(memory_cell): 이전의 값을 기억하는 일종의 메모리 역할을 수행하는 셀(RNNcell, 전체)
은닉상태(hidden_state): 은닉층의 메모리셀에서 나온 값이 출력층 방향 또는 다음 시점의 자신(다음 메모리셀)에게 보내는 상태
<img src="https://velog.velcdn.com/images/stand_hyo/post/2554b920-b830-491d-a06e-7cba18575978/image.png" width="20%" height="20"><br/><br/></p>
<h3 id="rnn의-역전파-backpropagation-through-time-bptt">RNN의 역전파: BackPropagation Through Time (BPTT)</h3>
<ul>
<li>모델에 맞는 역전파 방법으로 기울기(오차의 변화에 대한 가중치의 변화)를 찾아 성능을 높임, 경사하강법과 오차 역전파를 이용해 학습</li>
<li>RNN은 기존 신경망의 역전파롸 달리 타임 스텝별로 네트워크를 펼친 다음 역전파 알고리즘 사용</li>
<li>타임스텝의 역방향으로 역전파를 통해 가중치 비율을 조정하여 오차 감소 진행</li>
<li>오차 값들을 합한 값을 역전파함으로써 현재시간의 오차를 과거시간의 상태까지 역전파<br/><br/><br/></li>
</ul>
<h3 id="rnn의-학습과정">RNN의 학습과정</h3>
<ul>
<li><p><strong>벡터화(Vectorization)</strong>
입력값을 영어로, 출력값을 한국어로 번역할 때
문자열 데이터를 벡터 형태 변환하여 입력<br/></p>
<ul>
<li><p>매개변수</p>
<ul>
<li><p>num_words : 단어 빈도에 따라 유지할 최대 단어 수입니다. 가장 일반적인 단어 만 유지됩니다.</p>
</li>
<li><p>filters : 각 요소가 텍스트에서 필터링될 문자인 문자열입니다. 기본값은 문자를 제외한 모든 구두점과 탭 및 줄 바꿈 &#39;입니다.</p>
</li>
<li><p>lower : 부울. 텍스트를 소문자로 변환할지 여부입니다.</p>
</li>
<li><p>split : str. 단어 분할을 위한 구분 기호입니다.</p>
</li>
<li><p>char_level : True이면 모든 문자가 토큰으로 처리됩니다.</p>
</li>
<li><p>oov_token : 주어진 경우, 그것은 word_index에 추가되고 text_to_sequence 호출 중에 어휘 밖의 단어를 대체하는 데 사용됩니다.</p>
<br/>
</li>
<li><p>벡터화 과정
1) Tokenizer 인스턴스를 생성
2) fit_on_texts와 word_index를 사용하여 key value로 이루어진 딕셔너리를 생성
3) texts_to_sequences를 이용하여 text 문장을 숫자로 이루어진 리스트로 변경
4) pad_sequences를 이용하여 리스트의 길이를 통일화</p>
<br/></li>
</ul>
</li>
</ul>
</li>
<li><p><strong>활성화함수</strong>
입력값으로 영어를, 출력값으로 한국어를 번역할 때
출력층의 활성함수로 &#39;softmax&#39; 사용하며 각 확률로 나타난 점수는 데이터가 해당 품사 중 하나에 속할 확률을 의미 (총합은 1)<br/><br/><br/></p>
</li>
</ul>
<h3 id="rnn의-한계점">RNN의 한계점</h3>
<ul>
<li>기울기 소실/폭발 문제
복잡한 연산으로 인한 기울기 문제 발생
시간을 통한 역전파는 일반 역전파보다 훨씬 많은 곱셈과 연산 도입
해결방법: Truncated-Backpropagation Through Time</li>
<li>장기 의존성
RNN은 비교적 짧은 시퀀스에 대해서만 효과를 보임
시점이 길어질수록 앞의 정보가 뒤로 충분히 전달되지 못하는 현상
해결방법: Long Short Term Memory Network(LSTM)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[더운날에도 필요한 패딩(Padding)]]></title>
            <link>https://velog.io/@stand_hyo/%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@stand_hyo/%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98</guid>
            <pubDate>Fri, 22 Jul 2022 01:36:26 GMT</pubDate>
            <description><![CDATA[<h3 id="패딩padding이란">패딩(Padding)이란?</h3>
<p>padding: 자연어처리 시, 각 문장의 길이나 단어의 길이를 임의로 동일하게 맞추어 주는 작업 (신경망 주입 전 텍스트 &gt; 텐서)</p>
<ul>
<li>원핫인코딩<ul>
<li>정수배열을 0과 1로 이루어진 벡터로 변환</li>
<li>실수 벡터 데이터를 다룰 수 있는 Dense층을 신경망 첫번째 층으로 설정</li>
<li>num_words * num_reviews 크기의 행렬 필요 (메모리 사용량 ↑)</li>
</ul>
</li>
<li>패딩<ul>
<li>정수배열의 길이가 모두 같도록 패딩 추가하여 max_length * num_reviews 크기의 정수 텐서 만들기</li>
<li>텍스트 길이는 pad_sequences 함수를 이용해 맞춤<br/><br/><br/></li>
</ul>
</li>
</ul>
<h3 id="pad_sequences-함수-매개변수-정리">pad_sequences 함수 매개변수 정리</h3>
<pre><code class="language-python">tf.keras.preprocessing.sequences.pad_sequences(
sequences, maxlen=None, dtype=&#39;int32&#39;, padding=&#39;pre&#39;,
truncating=&#39;pre&#39;, value=0.0)
)</code></pre>
<p>sequences: 시퀀스 목록 (각 시퀀스는 정수목록)
maxlen: 모든 시퀀스의 최대 길이
dtype: 출력 시퀀스의 유형 (기본값은 int32)
padding: &#39;pre&#39; 앖에 빈공간을 0으로 채움, &#39;post&#39; 뒤에 빈공간을 0으로 채움 (기본값은 &#39;pre&#39;)
truncating: 시퀀스 maxlen의 시작이나 끝에서 보다 큰 시퀀스에서 값을 제거
value: 부동 소수점 또는 문자열, 패딩값 (기본값은 0)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[텍스트 분석과 자연어 처리]]></title>
            <link>https://velog.io/@stand_hyo/%ED%85%8D%EC%8A%A4%ED%8A%B8-%EB%B6%84%EC%84%9D%EA%B3%BC-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@stand_hyo/%ED%85%8D%EC%8A%A4%ED%8A%B8-%EB%B6%84%EC%84%9D%EA%B3%BC-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Thu, 21 Jul 2022 06:48:17 GMT</pubDate>
            <description><![CDATA[<h3 id="자연어-처리nlp">자연어 처리(NLP)</h3>
<p>자연어의 의미를 분석하여 컴퓨터가 처리할 수 있도록 하는 일
기계에게 인간의 언어를 이해시키는 인공지능의 한 분야</p>
<h3 id="자연어-처리를-활용한-일">자연어 처리를 활용한 일</h3>
<p>음성인식, 내용요약, 번역
사용자의 감정분석, 질의 응답 시스템</p>
<h3 id="머신러닝-활용-자연어-분류-과정">머신러닝 활용 자연어 분류 과정</h3>
<p><strong>1. 데이터 정제 및 전처리</strong>
  텍스트를 정제하여 신호와 소음 구분, 이상치로 인한 오버피팅 방지</p>
<p><strong>2. 텍스트 데이터 전처리</strong></p>
<p><strong>3. 데이터 나누기</strong>
train_test_split</p>
<p><strong>4. 텍스트 데이터 벡터화</strong>
BOW, TF-IDF
학습세트 X_train, y_train &gt; 학습 fit(X_train, y_train)
예측세트 X_test, y_test &gt; 예측 predict(X_test)
평가 evaluate(y_test, y_predict)</p>
<h3 id="데이터-전처리-과정">데이터 전처리 과정</h3>
<p><strong>정규표현식(Regular Expression: re)</strong>
: 특정한 규칙을 가진 문자열의 집합
<a href="https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D">&lt;정규표현식 참고&gt;</a></p>
<p><strong>토큰화(Tokenization)</strong>
: 문자열을 토큰으로 나누는 것</p>
<ul>
<li>토큰: 문자열 분석을 위한 문자열 단위</li>
<li>nltk 모듈</li>
</ul>
<p><strong>정제(Cleaning), 정규화(Normalization)</strong></p>
<ul>
<li>정제: corpus로부터 노이즈 제거</li>
<li>정규화: 단어들의 표현방법을 통일시킴 (ex. 대소문자 변경)</li>
</ul>
<p><strong>어간추출(Stemming), 표제어표기법(Lemmatization)</strong></p>
<ul>
<li>어간추출:단어 형식을 의미가 있거나 무의미한 줄기로 축소 (원형잃음)
  ex) &#39;보다&#39;, &#39;보았다&#39;, &#39;볼까&#39;, &#39;봤었다&#39; =&gt; &#39;보다&#39; 로 처리</li>
<li>표제어표기법: 단어 형식을 언어학적으로 유효한 의미로 축소 (원형보존)</li>
</ul>
<p><strong>불용어(Stopword)</strong>
: 전처리 기준을 빈도수 기준으로 하면 조사, 접미사와 같이 의미가 없지만 빈도수는 높은 단어들을 일컫는 말</p>
<ul>
<li>NLTK, SpaCy, Gensim 라이브러리</li>
</ul>
<h3 id="한국어-자연어처리-라이브러리">한국어 자연어처리 라이브러리</h3>
<p><strong>KoNLPy</strong></p>
<ul>
<li>형태소 토큰화</li>
<li>Hannanum, Kkmam Komoran, Mecab, Open Korean Text</li>
</ul>
<p><strong>soynlp</strong></p>
<ul>
<li>단어추출, 토크나이저, 품사판별, 전처리</li>
</ul>
<h3 id="워드-임베딩">워드 임베딩</h3>
<p><strong>원핫인코딩(One-Hot Encoding)</strong></p>
<ul>
<li>텍스트 데이터, 범주형 데이터 &gt; 수치형 데이터</li>
<li>해당하는 데이터는 1로, 나머지는 0으로 처리</li>
</ul>
<p><strong>BOW(Bag of Words)</strong></p>
<ul>
<li>단어의 순서고려 X</li>
<li>단어들의 출연빈도에 따른 텍스트 데이터 수치화</li>
</ul>
<p>** N-gram 언어모델(N-gram Language Model)**</p>
<ul>
<li>모든 단어가 아닌 일부 단어만 고려</li>
<li>n: 단어의 수</li>
</ul>
<p><strong>문서 단어 행렬(DTM: Document-Term Matrix)</strong></p>
<ul>
<li>다수의 문서에 등장하는 각 단어들의 빈도를 행렬로 표현</li>
</ul>
<p><strong>TF(단어빈도, Term Frequency)</strong></p>
<ul>
<li>TF : 특정 단어가 문서 내에 등장하는 빈도, <strong><em>높을수록 중요</em></strong></li>
<li>DF : 특정 단어가 등장한 문서의 수</li>
<li>IDF : 역문서 빈도 (DF의 역수)</li>
<li>TF-IDF : TF * IDF, 
여러문서로 이루어진 문서군에서 어떤 단어가 특정문서 내에서 얼마나 중요한 것인지 나타내는 통계적 수치
<strong><em>높을수록 중요</em></strong></li>
</ul>
<h3 id="scikit-learn-feature_extraction">scikit-learn feature_extraction</h3>
<p><strong>feature_extraction.DictVectorizer()</strong>
: 특성-값 매핑 목록 벡터로 변환
<strong>feature_extraction.CountVectorizer()</strong>
: 텍스트 문서 모음 토큰 수의 행렬로 변환
<strong>feature_extraction.HashingVectorizer()</strong>
: 텍스트 문서 모음 토큰 발생 매트릭스로 변환
<strong>feature_extraction.TfidfTransformer()</strong>
: 카운트 행렬 정규화된 tf/tf-idf 표현으로 변환
<strong>feature_extraction.TfidfVectorizer()</strong>
: 문서 모음 TF-IDF 매트릭스로 변환</p>
]]></description>
        </item>
    </channel>
</rss>