<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dalbong.log</title>
        <link>https://velog.io/</link>
        <description>이상한사람</description>
        <lastBuildDate>Sun, 11 Jun 2023 05:25:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dalbong.log</title>
            <url>https://velog.velcdn.com/images/dalbong_97/profile/30155392-b619-4dd7-94eb-a4cec1d7283d/social_profile.gif</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dalbong.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dalbong_97" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[IT 인프라 이해]]></title>
            <link>https://velog.io/@dalbong_97/IT-%EC%9D%B8%ED%94%84%EB%9D%BC-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@dalbong_97/IT-%EC%9D%B8%ED%94%84%EB%9D%BC-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Sun, 11 Jun 2023 05:25:55 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dalbong_97/post/f1d0e4ce-b5c4-4e1a-917f-be6deec009d9/image.png" alt=""></p>
<p><a href="https://coconut-emoji.tistory.com/">이미지출처</a>
본 포스팅은 KT 에이블스쿨 교육내용을 제 나름대로 정리하여 작성하였습니다.</p>
<hr>
<h1 id="it-인프라란">IT 인프라란?</h1>
<p>아니그전에 인프라가 뭐지? -&gt; 기반시설
한마디로 IT 기반시설이라고 보면 된다.</p>
<blockquote>
<p> 네트워크, 서버, 데이터베이스, 정보보안. 시스템 소프트웨어 및 기반시설 등 IT 서비스의 기반이 되는 시스템 및 구조</p>
</blockquote>
<hr>
<h1 id="it-인프라의-주요-구성요소">IT 인프라의 주요 구성요소</h1>
<p>IT 인프라의 주요한 구성요소로는 3가지가 있다.</p>
<blockquote>
<p> 하드웨어 - 눈에 보이는 물리적인 장비
소프트웨어 - 눈에 보이지 않는 프로그램
네트워크 - 컴퓨터 같은 여러 장비들이 그물망처럼 연결된 &#39;형태&#39; or &#39;장비&#39;</p>
</blockquote>
<hr>
<h1 id="it-인프라의-유형">IT 인프라의 유형</h1>
<p>IT 인프라의 유형에는 크게 2가지로 구분할 수 있다.</p>
<blockquote>
<p> 온 프레미스(On-Premise)
클라우드</p>
</blockquote>
<p>교안에는 이렇게 나와있는데 명확히 구분되는건 아닌 것 같다. 왜 그런지는 클라우드에 대해 설명할때 말하겠다.</p>
<h2 id="온-프레미스on-premise">온 프레미스(On-Premise)</h2>
<p>- 기업이 인프라를 자체 보유 및 운영하는 시스템.
- 클라우드 컴퓨팅 발전 이전 사용되던 일반적이고 전통적인 IT인프라 유형.</p>
<h2 id="클라우드">클라우드</h2>
<p>- 인프라를 구성하는 컴퓨터 리소스가 인터넷에 연결되어 있는 형태.
- 마치 구름처럼 어디에나 존재하며, 접근이 가능하다는 것을 은유한 표현이다.
- 4가지로 나뉜다.</p>
<ul>
<li><p>퍼블릭 클라우드(public cloud)
CSP(Cloud, Cloud Service Provider)에게 인프라에 필요한 자원들을 대여</p>
</li>
<li><p>프라이빗 클라우드(private cloud)
기업이 직접 클라우드 환경을 구성하여 사용하는 것. 컴퓨팅 리소스를 다른 서드파티 기업이 아니라 자체적으로 구성한다면 <span style="color:aqua">사실상 온 프레미스랑 차이가 없다.</span></p>
</li>
<li><p>하이브리드 클라우드(hybrid cloud)
온 프레미스와 클라우드를 혼용하여 사용하는 방식,프라이빗과 퍼블릭을 같이 쓰는 경우도 포함한다.</p>
</li>
<li><p>멀티 클라우드(multi cloud)
2개 이상의 다른 CSP를 사용하는 방식, 하나에 종속되지 않기 위해 사용한다.</p>
</li>
</ul>
<hr>
<h1 id="it-인프라-구성도">IT 인프라 구성도</h1>
<blockquote>
<p>IT 인프라 구성을 한눈에 알아 볼 수 있게 하기 위해 시스템 배치 연결관계를 <span style="color:aqua">아이콘 + 선으로 구조화</span> 한 것
= <span style="color:aqua">다이어그램</span></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[제안전략]]></title>
            <link>https://velog.io/@dalbong_97/%EC%A0%9C%EC%95%88%EC%A0%84%EB%9E%B5</link>
            <guid>https://velog.io/@dalbong_97/%EC%A0%9C%EC%95%88%EC%A0%84%EB%9E%B5</guid>
            <pubDate>Tue, 30 May 2023 03:58:18 GMT</pubDate>
            <description><![CDATA[<h1 id="개요">개요</h1>
<blockquote>
<p><del>gpt야 고맙다</del></p>
</blockquote>
<ul>
<li>현대 비즈니스 환경은 끊임없이 변화하고, 경쟁이 치열해지는 동시에 기업들은 지속적으로 혁신과 성장을 추구해야 합니다. 이러한 도전에 직면한 기업들은 종종 외부 전문가의 도움을 받아 경영과 전략에 대한 통찰력과 방향성을 얻으려 합니다. 그리고 그 해결책 중 하나로 많은 기업들이 기업 컨설팅 서비스를 이용하고 있습니다.</li>
<li>기업 컨설팅은 기업의 경영 전반에 걸친 다양한 문제와 과제에 대해 조언과 전략을 제시해 주는 서비스입니다. 그러나 단순히 문제 해결을 위한 조언을 제공하는 것 이상으로, 기업 컨설팅은 성공적인 비즈니스 운영을 위한 효과적인 제안 전략을 개발하고 실행하는 데 큰 역할을 합니다. 이 글에서는 기업 컨설팅을 위한 효과적인 제안 전략에 대해 알아보고, 기업들이 성공을 거두기 위한 첫걸음을 제공하고자 합니다.</li>
<li>이제 우리는 기업 컨설팅을 위한 효과적인 제안 전략을 개발하는 데 필요한 핵심 원칙과 실제적인 접근 방법에 대해 알아볼 것입니다. 성공을 위한 첫걸음은 올바른 전략을 수립하는 것이며, 이를 위해서는 다양한 요소들을 고려하고 명확한 방향을 제시해야 합니다. 또한 기업 내부와 외부의 다양한 이해 관계자들과의 소통과 협력이 필수적입니다.</li>
</ul>
<p>제안 컨설팅을 위한 사업화 프로세스는 다음과 같다.</p>
<blockquote>
<p>사업의 이해 -&gt; 문제정의 -&gt; 환경분석 -&gt; 표본고객분석 -&gt; 전략수립 -&gt; 가치제안</p>
</blockquote>
<p>다음 프로세스를  순서로 제안전략을 정리하고자 한다.</p>
<hr>
<h1 id="사업의-이해">사업의 이해</h1>
<h2 id="고객중심-비즈니스와-관리중심-비즈니스">고객중심 비즈니스와 관리중심 비즈니스</h2>
<p>기업의 경영 철학(주요관심사)에 따라 두가지의 접근방식으로 나뉜다.</p>
<ul>
<li>고객중심</li>
<li>기업중심</li>
</ul>
<p>-&gt; 고객가치를 중심으로 균형있게 고려하여 경영전략을 수립
자세한건 <a href="https://velog.io/@dalbong_97/%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4%EC%9D%98-%EC%A2%85%EB%A5%98">포스팅</a> 참고</p>
<hr>
<h1 id="문제정의">문제정의</h1>
<h2 id="문제">문제?</h2>
<p>기대(to-be)와 현상(as-is) 간의 차이
주요원인이랑 결합되어 발생한다.
주요원인화 문제를 혼동하면 편협한 문제정의가 될 수 있다.</p>
<h2 id="to-be">to-be</h2>
<p>바람직한 상태(기대)를 의미한다.</p>
<ul>
<li><p>바람직한 to-be 설정</p>
<ul>
<li>상상력 발휘</li>
<li>솔루션 제안 지양(마치 솔루션이 해결책인듯이)</li>
<li>이상적인 모습 보여주기</li>
</ul>
</li>
<li><p><a href="https://velog.io/@dalbong_97/To-be-%EC%84%A4%EC%A0%95%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%B0%A9%EB%B2%95%EB%A1%A0">to-be 설정을 위한 방법론</a></p>
<ul>
<li>forecasting 사고법</li>
<li>backcasting 사고법 -&gt; 더 적합함</li>
</ul>
<p>Backcasting 방법론의 과정에 대해 간단히 요약하자면</p>
<blockquote>
<p>output추정 -&gt; output실현을위한 조건과 가정 정의 -&gt; 조건과 가정을 구현하기 위한 방법 정의</p>
</blockquote>
<h2 id="문제의-종류">문제의 종류</h2>
<p>비즈니스 상황에서 문제의 종류는 3가지가 있다.</p>
<ul>
<li>발생형</li>
<li>탐색형</li>
<li>설정형</li>
</ul>
</li>
</ul>
<p>표로 나타내면 이렇다.
<img src="https://velog.velcdn.com/images/dalbong_97/post/2370d66a-5c34-4268-b79b-f5bba6b76c50/image.png" alt=""></p>
<p>추가내용</p>
<table>
<thead>
<tr>
<th>문제 유형</th>
<th>특징</th>
<th>난이도</th>
</tr>
</thead>
<tbody><tr>
<td>발생형</td>
<td>실무자 위주</td>
<td></td>
</tr>
<tr>
<td>탐색형</td>
<td>기업 컨설팅 시 가장 많이보는 유형</td>
<td>높음(기업에 대해 속속들이 알아야함)</td>
</tr>
<tr>
<td>설정형</td>
<td>최근 대기업을 중심으로 부각, 새로운 to-be 설정</td>
<td>탐색형보단 낮음(현실성 고려, 제안리스크 큼)</td>
</tr>
</tbody></table>
<p>일반적으로 탐색형 문제와 설정형 문제의 <span style="color:aqua">결합</span>을 추천한다.</p>
<hr>
<h1 id="환경분석">환경분석</h1>
<hr>
<h1 id="표본고객분석">표본고객분석</h1>
<hr>
<h1 id="전략수립">전략수립</h1>
<hr>
<h1 id="가치제안">가치제안</h1>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[To-be 설정을 위한 방법론]]></title>
            <link>https://velog.io/@dalbong_97/To-be-%EC%84%A4%EC%A0%95%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%B0%A9%EB%B2%95%EB%A1%A0</link>
            <guid>https://velog.io/@dalbong_97/To-be-%EC%84%A4%EC%A0%95%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%B0%A9%EB%B2%95%EB%A1%A0</guid>
            <pubDate>Tue, 23 May 2023 15:03:49 GMT</pubDate>
            <description><![CDATA[<h1 id="forecasting-과-backcasting">Forecasting 과 Backcasting</h1>
<blockquote>
<p>Forecasting 사고법과 Backcasting 사고법은 미래를 예측하고 그에 따른 행동 계획을 세우는 방법론으로, 기업 전략 수립과 비즈니스 개발에서 사용됩니다. 이 두 가지 방법론은 미래에 대한 접근 방식과 목표 설정 방법에서 차이가 있습니다.</p>
</blockquote>
<blockquote>
<ol>
<li>Forecasting 사고법:
Forecasting 사고법은 현재의 데이터, 트렌드, 통계 등을 기반으로 <span style="color:aqua">미래를 예측하고 예측된 결과에 따라 전략을 수립하는 방법</span>입니다. 이 방법론은 주로 경제, 시장, 기술 등의 예측에 사용되며, 다양한 예측 모델과 분석 기법을 활용합니다. Forecasting 사고법은 주로 다음과 같은 단계로 진행됩니다:</li>
</ol>
</blockquote>
<ul>
<li>데이터 수집 및 분석: 과거 데이터와 현재의 상황을 수집하고 분석하여 트렌드와 패턴을 파악합니다.</li>
<li>모델 개발: 수집한 데이터를 기반으로 예측 모델을 개발하고, 다양한 시나리오를 고려하여 미래 예측을 수행합니다.</li>
<li>결과 해석 및 전략 수립: 예측된 결과를 해석하고, 이를 기반으로 비즈니스 전략을 수립하거나 의사 결정을 내립니다.</li>
</ul>
<blockquote>
<ol start="2">
<li>Backcasting 사고법:
Backcasting 사고법은 <span style="color:aqua">원하는 미래의 상태나 목표를 설정하고, 그에 따라 현재의 조건과 동작을 평가하여 원하는 상태에 도달하기 위한 전략과 행동 계획을 개발하는 방법</span>원입니다. 이 방법론은 현재의 제약 사항이나 문제점을 고려하여 미래에 대한 비전과 목표를 설정합니다. Backcasting 사고법은 주로 다음과 같은 단계로 진행됩니다:</li>
</ol>
</blockquote>
<ul>
<li>비전 및 목표 설정: 원하는 미래의 비전과 목표를 설정하고, 이를 구체화하여 명확한 목표를 세웁니다.</li>
<li>현재 상태 평가: 현재의 조건과 동작을 분석하고, 현재 상태에서 목표 달성에 필요한 변화를 파악합니다.</li>
<li>전략 및 행동 계획 개발: 현재 상태에서 목표 달성을 위한 전략과 구체적인 행동 계획을 개발하고 실행합니다.</li>
</ul>
<p>Forecasting 사고법은 주로 미래를 예측하여 그에 맞게 대응하는 방식으로, 현재 데이터와 트렌드를 기반으로 전략을 수립합니다. 반면에 Backcasting 사고법은 원하는 미래를 설정하고 현재의 조건과 동작을 평가하여 그에 맞는 전략을 수립하는 방식으로, 목표 중심적인 접근을 취합니다.
-&gt; To-be 설정을 위한 방법론으론 backcasting 사고가 적합하다.</p>
<h1 id="backcasting사고를-위한-방법론">Backcasting사고를 위한 방법론</h1>
<p>역 가치사슬 분석과 SIC (Success Image Canvas)는 두 가지 서로 다른 방법론으로서, 미래의 목표를 달성하기 위해 역으로 생각하고 계획하는 것을 중점으로 합니다.</p>
<blockquote>
<ol>
<li>역 가치사슬 분석:
역 가치사슬 분석은 일반적으로 전략 개발과 기업 성과 향상을 위해 사용되는 방법론입니다. 이 방법론은 기업의 가치사슬을 분석하고 현재의 경쟁력을 이해한 뒤, 미래의 목표를 설정하기 위해 거꾸로 생각합니다.</li>
</ol>
</blockquote>
<ul>
<li>일반적인 가치사슬 분석은 기업의 주요 활동을 기능적으로 분류하고, 이를 통해 가치를 창출하는 과정을 이해합니다. 역 가치사슬 분석은 이 과정을 거꾸로 따라가며 목표를 달성하기 위해 필요한 활동을 도출합니다. 즉, &quot;목표를 달성하기 위해 우리가 어떤 활동을 수행해야 하는가?&quot;라는 질문에 대한 답을 찾기 위해 역으로 생각합니다.</li>
<li>이 방법론은 목표를 설정한 다음, 그 목표를 달성하기 위해 필요한 활동과 리소스를 식별하고 우선순위를 정하는 데 도움이 됩니다. 또한, 현재의 경쟁력과 동향을 고려하여 적절한 전략을 개발하는 데 도움이 됩니다.</li>
</ul>
<blockquote>
<ol start="2">
<li>SIC (Success Image Canvas) 접근법:
SIC (Success Image Canvas) 접근법은 팀이나 조직이 특정한 목표를 달성하기 위해 필요한 상상력을 도출하는 데 사용되는 방법론입니다. 이 방법론은 비전과 목표 설정을 위해 역으로 사고하는 데 초점을 맞추고 있습니다.</li>
</ol>
</blockquote>
<ul>
<li>SIC는 목표를 달성한 이상적인 상황, 즉 &quot;성공적인 이미지&quot;를 상상합니다. 팀은 이 이미지를 구체화하고 시각화하기 위해 다양한 방법을 사용합니다. 이 과정에서 팀은 목표를 달성하는 데 필요한 요소들을 고려하고 그에 따른 액션 플랜을 수립합니다.</li>
<li>SIC는 상상력을 통해 현재의 제약사항을 넘어서며 새로운 아이디어를 도출하는 데 도움이 됩니다. 이 방법론은 팀의 창의적인 사고를 촉진하고 목표를 달성하기 위한 효과적인 전략을 개발하는 데 도움이 됩니다.</li>
</ul>
<p>요약하자면, 역 가치사슬 분석과 SIC 접근법은 모두 미래의 목표를 달성하기 위해 거꾸로 사고하고 계획하는 방법론입니다. 역 가치사슬 분석은 기업의 가치사슬을 분석하고 목표를 달성하기 위한 활동을 도출하는 데 사용되며, SIC는 비전과 목표를 상상하여 필요한 요소와 액션 플랜을 도출하는 데 사용됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[비즈니스의 종류]]></title>
            <link>https://velog.io/@dalbong_97/%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4%EC%9D%98-%EC%A2%85%EB%A5%98</link>
            <guid>https://velog.io/@dalbong_97/%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4%EC%9D%98-%EC%A2%85%EB%A5%98</guid>
            <pubDate>Tue, 23 May 2023 14:28:20 GMT</pubDate>
            <description><![CDATA[<p>고객중심 사업과 관리중심 사업은 기업의 경영 철학과 전략에 대한 두 가지 다른 접근 방식을 나타냅니다. 이 두 가지 접근 방식은 기업이 자원과 노력을 어디에 집중하느냐에 따라 차이가 있으며, 각각의 장단점과 특징을 가지고 있습니다.</p>
<ol>
<li>고객중심 사업(Customer-centric Business):
고객중심 사업은 기업의 가장 중요한 관심사가 고객과 고객의 만족에 있다는 원칙에 기반을 두고 있습니다. 이러한 사업은 고객의 니즈와 요구를 이해하고 그에 맞는 제품 또는 서비스를 개발하고 제공함으로써 고객의 만족과 충성도를 높이려고 노력합니다. 이는 기업이 고객과의 긴밀한 관계를 구축하고 고객의 관점에서 가치를 창출하는 것을 의미합니다.</li>
</ol>
<p>고객중심 사업은 다음과 같은 특징을 가지고 있습니다:</p>
<ul>
<li>고객을 중심으로 한 마케팅 및 판매 전략의 수립</li>
<li>고객 니즈와 요구를 파악하고 그에 맞춰 제품/서비스 개발</li>
<li>고객 경험과 만족도를 개선하기 위한 지속적인 노력</li>
<li>고객과의 긴밀한 관계 구축과 유지</li>
</ul>
<ol start="2">
<li>관리중심 사업(Management-centric Business):
관리중심 사업은 기업의 주요 관심사가 조직의 내부 운영과 효율성에 있다는 원칙에 기반을 두고 있습니다. 이러한 사업은 경영자나 조직의 의사결정자가 자원과 프로세스를 효율적으로 관리하고, 생산성과 이익을 극대화하는 데 초점을 맞춥니다. 이는 기업 내부의 운영 체계와 프로세스 개선, 비용 관리, 효율적인 리소스 배분 등을 중시하는 것을 의미합니다.</li>
</ol>
<p>관리중심 사업은 다음과 같은 특징을 가지고 있습니다:</p>
<ul>
<li>조직의 내부 프로세스 및 운영 체계에 대한 지속적인 개선과 효율성 강화</li>
<li>비용 절감 및 자</li>
</ul>
<p>원 관리를 중요시하는 경영 전략 수립</p>
<ul>
<li>생산성 향상과 이익 극대화를 위한 조직적인 노력</li>
<li>조직 간 협업과 의사소통 강화</li>
</ul>
<p>고객중심 사업과 관리중심 사업은 서로 대립되는 것이 아니라 상호보완적인 요소를 가지고 있습니다. 고객중심 사업은 고객의 만족과 충성도를 통해 기업의 성장과 이익을 도모하고, 관리중심 사업은 조직의 효율성과 생산성을 향상시켜 지속적인 경쟁력을 확보합니다. 따라서 기업은 이 두 가지 요소를 균형 있게 고려하여 종합적인 경영 전략을 수립하고 실행해야 합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[딥러닝]]></title>
            <link>https://velog.io/@dalbong_97/%EB%94%A5%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@dalbong_97/%EB%94%A5%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Mon, 20 Mar 2023 15:42:14 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dalbong_97/post/d48608f9-5971-4bd5-a675-abfab359e4ef/image.png" alt=""></p>
<p><a href="https://coconut-emoji.tistory.com/">이미지출처</a>
<a href="https://velog.io/@dalbong_97/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EC%99%80-%EC%A0%84%EB%8B%AC%EC%9D%B8%EC%9E%90-syntax-%EC%95%BD%EC%86%8D">syntax 약속</a>
본 포스팅은 KT 에이블스쿨 교육내용을 제 나름대로 정리하여 작성하였습니다.</p>
<hr>
<h1 id="머신러닝-vs-딥러닝">머신러닝 vs 딥러닝</h1>
<p>머신러닝이건 딥러닝이건 간에, 데이터를 이용해 예측을 하려 한다는 공통된 목적을 가지고 있다.</p>
<p>데이터를 통해 예측을 하기 위해서는 어떠한 요소가 예측하고 싶은 값에 얼마나 영향을 끼치는지 알아야 한다. 다양한 말로 부르지만 이 요소를 우리는 <code>Feature</code> 라고 한다.</p>
<p>데이터의 <code>Feature</code> 가 예측값에 끼치는 영향을 컴퓨터를 이용해 계산하는 행위가 <span style="color:aqua">머신러닝</span>과 <span style="color:rgb(255, 0, 255)">딥러닝</span>이다.</p>
<p><span style="color:aqua">머신러닝</span>과 <span style="color:rgb(255, 0, 255)">딥러닝</span>은 <code>Feature</code>를 추출하는 행위에서 차이가 발생한다. </p>
<p><span style="color:aqua">머신러닝</span>은 예측을 용이하기 하기 위해 사람이 직접 Feature를 추출하는 행위를 한다. 이를 Feature engineering 이라고 한다.</p>
<p><span style="color:rgb(255, 0, 255)">딥러닝</span>은 Feature를 추출하는 행위도 컴퓨터가 알아서 한다.</p>
<p>&#39;와그럼 알아서 다 해주는 딥러닝이 머신러닝의 상위호환 아님? 개꿀 ㅋㅋ&#39; 이라는 생각이 들 수도 있다.
하지만 아직은 컴퓨터의 <code>Feature</code> 추출이 인간의 통찰을 넘진 못했기에, 사람이 다룰 수 있을 정도의 숫자를 가진 <code>Feature</code> 들은 머신러닝으로 하는 것이 높은 정확도를 보이고 있다.
딥러닝은 자연어 처리, 객체인식 등 사람의 힘으로 <code>Feature</code> 의 특징을 다루기 힘든 분야에서 강점을 발휘하고 있다.</p>
<hr>
<h1 id="keras란">Keras란?</h1>
<p>파이썬으로 작성되는 고급 신경망 API, 딥러닝에 이용됨. 본 포스팅은 Keras 를 이용하여 다룰 것이다.</p>
<hr>
<h1 id="딥러닝-과정">딥러닝 과정</h1>
<h2 id="딥러닝-학습-절차">딥러닝 학습 절차</h2>
<ul>
<li>데이터 수집 및 전처리</li>
<li>모델 아키텍쳐 설계(dense, convolutional, 뉴런 수)</li>
<li>모델 컴파일 : 손실함수계산을 위한 평가메트릭, 옵티마이저 종류 설정</li>
<li>모델 학습<ul>
<li>가중치 초기값 할당</li>
<li>예측</li>
<li>오차계산</li>
<li>가중치 조절(오차를 줄이는 방향으로, optimizer, 얼마만큼? learning_rate)</li>
<li>반복(epoch)</li>
<li>학습곡선</li>
</ul>
</li>
<li>모델 평가</li>
<li>예측 밎 검증<h2 id="머신러닝-프로세스와-딥러닝-프로세스-비교">머신러닝 프로세스와 딥러닝 프로세스 비교</h2>
</li>
</ul>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">머신러닝</th>
<th align="center">딥러닝</th>
</tr>
</thead>
<tbody><tr>
<td align="center">데이터 전처리</td>
<td align="center">결측치 처리 <br> 가변수화 <br> 스케일링 (선택)</td>
<td align="center">결측치 처리 <br> 가변수화 <br> 스케일링 (필수)</td>
</tr>
<tr>
<td align="center">모델링</td>
<td align="center">모델 선언 <br> 학습 <br> 예측 및 검증</td>
<td align="center">모델구조 선언 및 컴파일 <br> 학습과 학습곡선 plot <br> 예측 및 검증</td>
</tr>
</tbody></table>
<p>모델선언부분에서 딥러닝은 신경망 구조 설계와 컴파일을 한다는 점과, 학습시 학습곡선을 이용해 모델의 학습을 관찰할 수 있다는 차이가 있다.</p>
<h1 id="1-환경준비">1. 환경준비</h1>
<p>머신러닝에 필요한 각종 모듈을 import 해준다. 어떤 모듈인지는 주석참고</p>
<pre><code class="language-python"># 판다스와 넘파이 + 각종시각화
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 사이킷런, 데이터 전처리와 평가에 사용
from sklearn.model_selection import train_test_split
from sklearn.metrics import *
from sklearn.preprocessing import MinMaxScaler

# 케라스
from keras.models import Sequential
from keras.layers import Dense
from keras.backend import clear_session
from keras.optimizers import Adam</code></pre>
<hr>
<h1 id="2-데이터준비">2. 데이터준비</h1>
<p>머신러닝과 데이터 전처리과정이 같다. 딥러닝에서는 스케일링이 필수라는 것 정도?
<a href="https://velog.io/@dalbong_97/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D#2-2-2-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A4%80%EB%B9%84">링크참고</a></p>
<hr>
<h1 id="3-모델설계">3. 모델설계</h1>
<p>딥러닝 모델의 구조를 키워드만 나타내면 다음과 같다.</p>
<ul>
<li><p>입력층 (Input Layer)</p>
<ul>
<li>데이터 입력</li>
<li>특성 차원 정의</li>
</ul>
</li>
<li><p>은닉층 (Hidden Layers)</p>
<ul>
<li><p>완전 연결층 (Dense Layer)</p>
<ul>
<li>뉴런 수 설정</li>
<li>활성화 함수 설정 (ReLU, Sigmoid 등)</li>
</ul>
</li>
<li><p>합성곱층 (Convolutional Layer)</p>
<ul>
<li>필터 수, 커널 크기 설정</li>
<li>패딩, 스트라이드 설정</li>
<li>활성화 함수 설정 (ReLU, Sigmoid 등)</li>
</ul>
</li>
<li><p>순환층 (Recurrent Layer)</p>
<ul>
<li>뉴런 수 설정</li>
<li>게이트 구조 설정 (LSTM, GRU 등)</li>
</ul>
</li>
<li><p>드롭아웃층 (Dropout Layer)</p>
<ul>
<li>드롭아웃 비율 설정</li>
</ul>
</li>
</ul>
</li>
<li><p>출력층 (Output Layer)</p>
<ul>
<li>출력 뉴런 수 설정 (예측 클래스 수 또는 회귀 출력 수)</li>
<li>활성화 함수 설정 (Softmax, Sigmoid, Linear 등)</li>
</ul>
</li>
</ul>
<p><span style="color:aqua">입력층</span>과 <span style="color:rgb(255, 178, 0)">은닉층</span>과  <span style="color:rgb(255, 0, 255)">출력층</span>층만 기억하면 된다. 
은닉층에서는 아마도 Dense Layer 만 다룰 예정이다.
도식화된 그림으로 나타내면 다음과 같다.</p>
<p>단일 레이어일 경우<img src="https://velog.velcdn.com/images/dalbong_97/post/0896a46c-5995-43b2-a3ac-697a03bffde0/image.jpeg" alt=""></p>
<p>다중 레이어일 경우<img src="https://www.thewindowsclub.com/wp-content/uploads/2017/11/Neural-Network.jpg?ezimgfmt=ng:webp/ngcb193" alt=""></p>
<hr>
<h2 id="3-1-feature-개수-추출">3. 1. feature 개수 추출</h2>
<p><code>shape</code> 속성을 이용한다. row 갯수와 column 갯수를 튜플로 반환시켜주므로, 1번 인덱스(2번째 값)을 적으면 column, 즉 feature 갯수를 추출할 수 있다.</p>
<pre><code class="language-python">nfeatures = x_train.shape[1]</code></pre>
<hr>
<h2 id="3-2-메모리정리-및-모델-선언">3. 2. 메모리정리 및 모델 선언</h2>
<p><code>clear_session()</code> 을 이용하여 메모리를 정리할 수 있다.
필수는 아니긴한데 안하면 summary할때마다 dense 번호가 계속 늘어남 ㄷㄷ;</p>
<p>시퀀셜타입으로 선언, 다른 타입은 나중에 다른 포스팅으로 정리할까 함</p>
<pre><code class="language-python"># 회귀, input output 만 있는 경우
model = Seaquential( Dense(1, input_shape=(nfeatures,)) )

# 회귀, hidden layer 있는 경우
model = Seaquential([Dense(1, input_shape=(nfeatures,), activation = &#39;relu&#39;),
                     Dense(n, activation = &#39;relu&#39;),
                     Dense(1)])

# 이진분류, input output 만 있는 경우
model = Sequential([ Dense(1, input_shape = (nfeatures,), activation = &#39;sigmoid&#39;) ])

# 이진분류, hidden layer 있는 경우
model = Sequential( [Dense(n, input_shape=(nfeatures,), activation=&#39;relu&#39;),
                     Dense(n, activation=&#39;relu&#39;),
                     Dense(n, activation=&#39;relu&#39;),
                     Dense(1, activation=&#39;sigmoid&#39;)] )

 # 다중분류, input ouput 만 있는 경우
 model = Sequential([Dense( classnum_y, input_shape = (nfeatures,), activation = &#39;softmax&#39;),])

 # 다중분류, hidden layer 있는 경우
 model = Sequential([Dense( n, input_shape = (nfeatures,), activation = &#39;relu&#39;),
                    Dense( n, activation = &#39;relu&#39; ),
                    Dense( classnum_y, activation = &#39;softmax&#39;)
])</code></pre>
<p>Dense Layer 를 구성하기 위해 사용되는 <code>Dense()</code> 에는 3가지의 매개변수가 들어갈 수 있다. hidden layer가 있는 경우 위의 경우처럼 <code>list</code> 로 나타낸다.</p>
<p><code>n</code> : 출력으로 나오는 노드의 갯수, output layer의 갯수는 모델마다 다르다.
<code>input_shape</code> : input으로 들어가는 node(feature)의 수, 위의 예시는 1차원의 데이터이기 때문에 (n, ) 형식임을 유의하자.
<code>activation</code> : 활성함수 지정, 회귀인지 분류인지에 따라, input인지 output인지에 따라 활성함수가 다르며, 위 코드를 참고하자.</p>
<h3 id="3-3-1-활성함수">3. 3. 1. 활성함수</h3>
<hr>
<h2 id="3-3-선언한-모델의-요약">3. 3. 선언한 모델의 요약</h2>
<p><code>model.summary()</code> 로 모델의 요약을 볼 수 있다.
레이어와 다음 레이어의 아웃풋의 모양 그리고 파라미터 갯수로 구성되어 있다.
파라미터 갯수는 <code>(input 레이어의 노드 수+1) * output 레이어의 노드 수</code> 이다.
+1을 하는 이유는 bias(편향) 때문이다!
밑의 Summary 를 예시로 들어보자
12개의 node(feature)를 가진 데이터를 input layer으로 넣었고, output 노드의 갯수는 8개 이므로 13x8 = 104 개이다.
그다음, 아웃풋노드의 개수인 8개가 input 으로 들어가고 4개가 output 으로 나오므로 9x4 = 36 개 이다.</p>
<pre><code>Model: &quot;sequential&quot;
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 8)                 104       

 dense_1 (Dense)             (None, 4)                 36        

 dense_2 (Dense)             (None, 1)                 5         

=================================================================
Total params: 145
Trainable params: 145
Non-trainable params: 0
_________________________________________________________________</code></pre><hr>
<h2 id="4-컴파일">4. 컴파일</h2>
<p>optimizer 에는 다양한 것들이 있지만 Adam 을 쓰는게 국룰이라나 뭐라나... 깊게 들어가지 않으려 한다.</p>
<pre><code class="language-python">#1
model.compile(optimizer=&#39;adam&#39;, loss=&#39;&#39;)

#2
model.compile(optimizer=Adam(learning_rate=0.1), loss=&#39;&#39;)</code></pre>
<p>두 가지 방식으로 표현할 수 있는데, <code>#1</code> 은 learning_rate가 0.001로 고정되어있는 상태이다.
<code>loss</code> : 오차함수를 설정하는 매개변수 
회귀모델은 보통 &#39;mse&#39;로 하고
이진분류모델은 &#39;binary_crossentropy&#39; 를 사용한다.
<code>learning_rate</code> : 학습률을 설정할 수 있는 매개변수, <code>lr</code>로도 쓸 수 있지만 풀네임이 권장된다.</p>
<hr>
<h3 id="4-1-학습률learning_rate">4. 1. 학습률(learning_rate)</h3>
<p>모델 가중치의 업데이트 속도.
너무 크면 값에 수렴하기가 힘들고, 너무 작으면 수렴하기도 전에 학습이 끝나기도 한다.(많은 학습횟수를 요함) 맨날 같은 말해서 입이 아프지만... 적절한 값을 찾는 게 중요하다.
<img src="https://www.jeremyjordan.me/content/images/2018/02/Screen-Shot-2018-02-24-at-11.47.09-AM.png" alt=""></p>
<hr>
<h2 id="5-학습">5. 학습</h2>
<pre><code class="language-python">history = model.fit(x_train, y_train,epochs=20,validation_split=0.2).history</code></pre>
<p><code>epochs</code> : 전체 데이터에 대한 학습 횟수를 의미한다. 원가 엄밀하게 말하면 좀 다른가 본데, 나중가면 좀 더 자세히 다루지 싶다.
<code>validation_split</code> : tain에서 검증용 데이터를 분리할 수 있는 비율이다. 미리 검증용으로 분리한 데이터 말고 따로 검증을 할 수 있는 샘이다.
<code>history</code> : 가중치가 업데이터 될 때 마다(epoch)가 늘어날 때 마다 오차를 기록한다.</p>
<p>다음과 같은 함수를 작성하여 학습곡선을 plot 할 수 있다.</p>
<pre><code class="language-python">def dl_history_plot(history):
    plt.figure(figsize=(10,6))
    plt.plot(history[&#39;loss&#39;], label=&#39;train_err&#39;, marker = &#39;.&#39;)
    plt.plot(history[&#39;val_loss&#39;], label=&#39;val_err&#39;, marker = &#39;.&#39;)

    plt.ylabel(&#39;Loss&#39;)
    plt.xlabel(&#39;Epoch&#39;)
    plt.legend()
    plt.grid()
    plt.show()

 dl_history_plot(history)</code></pre>
<hr>
<h2 id="5-1-학습-곡선learning-curve">5. 1. 학습 곡선(learning curve)</h2>
<p>바람직한 학습 곡선의 특징(지피티야 고맙다~)</p>
<ol>
<li><p>수렴: 훈련 및 검증 손실은 시간이 지남에 따라 감소하여 결국 안정적인 값에 도달하거나 수렴해야 합니다. 이는 모델이 데이터에서 학습하고 손실 함수를 최소화하고 있음을 나타냅니다.</p>
</li>
<li><p>과적합 없음: 훈련 손실과 검증 손실 사이의 간격이 상대적으로 작아야 합니다. 훈련 손실이 검증 손실보다 훨씬 작은 경우 모델이 훈련 데이터에 과적합되어 있음을 나타냅니다. 즉, 훈련 세트의 노이즈 또는 특정 패턴을 학습했지만 보이지 않는 데이터에 잘 일반화되지 않는다는 의미입니다.</p>
</li>
<li><p>과소적합 없음: 교육 및 검증 손실이 모두 합리적으로 낮아야 합니다. 손실이 높으면 모델이 데이터를 잘 맞추지 못하고 데이터의 기본 패턴을 캡처할 수 없어 성능이 저하됨을 나타냅니다.</p>
</li>
<li><p>꾸준한 개선: 이상적으로 학습 곡선은 시간이 지남에 따라, 특히 초기 에포크 동안 꾸준한 성능 향상(손실 감소)을 보여야 합니다. 이는 모델이 데이터에서 효과적으로 학습하고 있음을 나타냅니다.</p>
</li>
<li><p>Plateau: 특정 수의 에포크 후에 유효성 검사 손실이 정체되어 더 이상 크게 개선되지 않을 수 있습니다. 이는 모델이 데이터에서 가능한 한 많은 것을 배웠다는 표시일 수 있으며 추가 교육으로 인해 상당한 개선이 이루어지지 않을 수 있습니다.</p>
</li>
</ol>
<hr>
<h1 id="6-예측및검증">6. 예측및검증</h1>
<p>회귀모델</p>
<pre><code class="language-python">pred2 = model2.predict(x_val)
print(f&#39;RMSE : {mean_squared_error(y_val, pred2, squared=False)}&#39;)
print(f&#39;MAE  : {mean_absolute_error(y_val, pred2)}&#39;)
print(f&#39;MAPE : {mean_absolute_percentage_error(y_val, pred2)}&#39;)</code></pre>
<p><a href="https://velog.io/@dalbong_97/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D#2-5-%EC%98%88%EC%B8%A1-%EB%B0%8F-%ED%8F%89%EA%B0%80">머신러닝포스트 참고</a></p>
<p>이진분류 모델 예측 및 검증</p>
<pre><code class="language-python">pred = model.predict(x_val)
pred = np.where(pred&gt;= 0.5, 1, 0)
print(confusion_matrix(y_val, pred))
print(&#39;-&#39;*50)
print(classification_report(y_val, pred))</code></pre>
<pre><code>7/7 [==============================] - 0s 2ms/step
[[155  14]
 [ 10  21]]
--------------------------------------------------
              precision    recall  f1-score   support

           0       0.94      0.92      0.93       169
           1       0.60      0.68      0.64        31

    accuracy                           0.88       200
   macro avg       0.77      0.80      0.78       200
weighted avg       0.89      0.88      0.88       200</code></pre><p>0과 1로 분류를 위해 <code>np.where</code>를 통해 0.5 이상인 값은 1 미만이면 0 으로 나누는 과정을 거쳐야 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[머신러닝 - 모델]]></title>
            <link>https://velog.io/@dalbong_97/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8</link>
            <guid>https://velog.io/@dalbong_97/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8</guid>
            <pubDate>Sun, 19 Mar 2023 11:12:36 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dalbong_97/post/8fbeee93-69fc-4d79-a63b-7f2abe61554c/image.png" alt=""></p>
<p><a href="https://coconut-emoji.tistory.com/">이미지출처</a>
<a href="https://velog.io/@dalbong_97/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EC%99%80-%EC%A0%84%EB%8B%AC%EC%9D%B8%EC%9E%90-syntax-%EC%95%BD%EC%86%8D">syntax 약속</a>
본 포스팅은 KT 에이블스쿨 교육내용을 제 나름대로 정리하여 작성하였습니다</p>
<hr>
<p>사이킷런에서는 다양한 회귀, 분류 알고리즘을 제공하고 있다. 하나하나 차근차근 알아보도록 하자.</p>
<h1 id="선형-회귀linear-regression">선형 회귀(Linear Regression)</h1>
<ul>
<li><p>데이터의 회귀성
데이터들의 일련의 데이터 포인트들이 선형 패턴 또는 관계를 따르는 현상을 의미한다.</p>
</li>
<li><p>최적의 회귀모델이란?
전체 데이터의 오차합이 최소가 되는 모델</p>
</li>
<li><p>다중회귀와 단순회귀
독립변수 x 의 갯수로 나눌 수 있다. x가 하나면 단순, 여러개면 다중회귀 이다.</p>
</li>
<li><p>선형회귀식
선형회귀는 최선(최소 오차)의 가중치와 편향을 찾는 과정이라고도 할 수 있다.
$$
\hat{y} = w_0 + w_1 x_1 + w_2 x_2 , ... , w_n x_n$$
$$
w_0 = 가중치$$
$$
w_1,, w_2,, w_n = 편향$$</p>
</li>
</ul>
<p><code>model.coef_</code> 로 변수(feature) 별 편향을 알 수 있으며,
<code>model.intercept_</code> 로 가중치를 알 수 있다.</p>
<hr>
<h1 id="k-최근접-이웃k---nearest-neighbor">K 최근접 이웃(K - Nearest Neighbor)</h1>
<p>&#39;K&#39; 개의 근처값으로 값을 추측하는 지도학습 알고리즘이다.
<span style="color:aqua">회귀</span>와 <span style="color:rgb(255, 0, 255)">분류</span> 둘 다 사용된다. 판단기준은 회귀에서는 k 개의 값의 평균이며, 분류에서는 가장 많이 포함된 유형(class)이다.</p>
<ul>
<li><p>K 값
적절한 값을 찾는게 중요한 머신러닝에서, K값도 물론 적절하게 찾아줘야한다.
K 값을 1로 설정하면 너무 편향된 값을 얻으며, K = 6 처럼 값이 짝수이면 과반수를 구할 수 없는 문제점들이 있다.</p>
</li>
<li><p>거리
근처, 즉 가장 가까운 거리에 있는 값들은 어떻게 판단할까?</p>
<ul>
<li><p>유클리드(Euclidean) 방법
두 점 간의 유클리드 거리를 구하는 방법이라고는 하는데... 쉽게 말하자면 피타고라스 법칙을 이용해서 거리를 구하는 법이라고 이해하면 편하다.(두 점사이의 완전 직선 거리)</p>
</li>
<li><p>맨하탄(Manhattan) 방법
맨하탄( = 잘 계획된 격자형식의 도시)에서 길을 찾는 방법을 연상하면 된다. 직각 좌표의 좌표값 차이로 거리를 구한다.</p>
</li>
</ul>
</li>
<li><p>스케일링
KNN 방식은 모든 데이터가 같은 값의 범위를 구할 때 가장 좋은 성능을 보여주기 때문에 스케일링이 필수적이다. <a href="https://velog.io/@dalbong_97/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D#2-2-2-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A4%80%EB%B9%84">링크</a>의 정규화를 참고하자.</p>
</li>
</ul>
<hr>
<h1 id="결정-트리decision-tree">결정 트리(Decision Tree)</h1>
<p>특정 변수에 대한 의사결정 규칙을 나뭇가지가 뻗는 형태로 분류한 알고리즘이다.
분류와 회귀 모두 사용된다.
직관적, 쉬운 설명과 이해, 스케일링이 불필요하다는 장점이 있으며
의미있는 질문을 하지 못하면 학습성능이 좋지 못하다는 것과 과적합으로 인한 모델 성능 감소 가능성이 높다는 단점이 있다.
결과적으로 분할이 많이 될 수록 과적합 위험이 높아지는 방식이므로, 하이퍼파라미터들을 이용해 분할을 제한한다.(like 가지치기)
백문이 불여일견이라고 시각화된 트리를 보면서 이야기해 보자.</p>
<p>코드</p>
<pre><code class="language-python">import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt
%config InlineBackend.figure_format = &#39;retina&#39;
# Load the iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize the Decision Tree Classifier
clf = DecisionTreeClassifier(random_state=42)

# Fit the classifier to the training data
clf.fit(X_train, y_train)

# Visualize the decision tree
plt.figure(figsize=(12, 8))
plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()</code></pre>
<p>결과
<img src="https://velog.velcdn.com/images/dalbong_97/post/47bc9df4-af91-45e1-a960-7d48d541cc36/image.png" alt=""> 시각화 사진에서 네모 하나를 &#39;노드&#39; 라고 부르는데, 노드에는 각각의 정보가 담겨 있다.
<img src="https://velog.velcdn.com/images/dalbong_97/post/eb3c1222-3b5a-4e95-8003-a62265c14c50/image.png" alt=""></p>
<ol>
<li>분할 조건 또는 규칙: 데이터를 분할하는 데 사용되는 기능의 경계값.</li>
<li>지니 불순도: 각 노드에 대한 불순도 또는 오분류 정도.</li>
<li>샘플 수: 노드에 도달한 총 샘플 수로 노드의 대표성을 추정하는 데 사용.</li>
<li>값 배열: 노드의 각 클래스에 대한 샘플 분포.</li>
<li>예측 클래스: 노드에서 샘플의 비율이 가장 높은 클래스.</li>
</ol>
<hr>
<h2 id="지니-불순도">지니 불순도?</h2>
<p>Decision Tree에서 불순도(얼마나 섞여있는지)를 측정하기 위한 지표이다.
불순도를 통해서 값이 얼마나 분류가 잘 되었는지를 추론할 수 있다.
값은 0 ~ 0.5 까지 이며, 0에 가까울 수록 분류된 데이터의 순도가 높다고 할 수 있으며, 이는 곧 분류가 잘 되었음을 의미한다. 지니 불순도의 값이 낮을걸로 Decision Tree의 노드를 결정한다.
$$
Gini = 1 - \sum (p_i)^2
$$
$$
= 1-(양성class비율^2 + 음성class비율^2)
$$
지니 불순도 높을수록 -&gt; 분류잘안됨(안좋음) 만 기억하자</p>
<hr>
<h2 id="엔트로피와-정보이득">엔트로피와 정보이득</h2>
<ul>
<li><p>엔트로피
지니계수와 같이 데이터의 불순도를 확인할 수 있는 지표이다.
값은 0 ~ 1 까지 이며, 값의 의미는 지니 불순도와 같다 
$$
Entropy = -\sum_{i=1}^{n} p_i \log_2 p_i
$$
$$
= -(음성class비율)\times\log_2 (음성clas비율) - (양성class비율)\times\log_2 (양성clas비율)
$$
$$
p_i : 집합 안에서 , i 의 , 확률
$$</p>
</li>
<li><p>정보이득
엔트로피를 이용해 구할 수 있다. 어떤 속성이 얼마나 많은 정보를 제공하는지를 알 수 있다.
부모 노드와 자식 노드의 엔트로피 &#39;차이&#39;의 가중평균으로 계산한다.
$$
InformationGain = Entropy(parent) - \sum_{i=1}^{k} \frac{|D_i|}{|D|} Entropy(D_i)
$$</p>
</li>
</ul>
<p>정보이득은 으로 노드를 나누게 되면 엔트로피를 더 많이 감소시킬 수 있는 방식으로 값을 나누기 때문에, 뚜렷한 값이나 범주를 가진 변수에 편향될 수 있다는 점이 있다. 그러므로 변수가 많을 때에는 지니계수를 쓰는게 좋다.</p>
<table>
<thead>
<tr>
<th>하이퍼파라미터</th>
<th>설명</th>
<th>사용 예시</th>
</tr>
</thead>
<tbody><tr>
<td><code>max_depth</code></td>
<td>트리의 최대 깊이. 트리 성장을 제한하여 과적합을 방지합니다.</td>
<td><code>max_depth=10</code></td>
</tr>
<tr>
<td><code>min_samples_split</code></td>
<td>내부 노드를 분할하는 데 필요한 최소 샘플 수. 작은 노드로 인한 과적합을 방지합니다.</td>
<td><code>min_samples_split=20</code></td>
</tr>
<tr>
<td><code>min_samples_leaf</code></td>
<td>리프 노드에 있어야 하는 최소 샘플 수. 리프의 크기를 조절합니다.</td>
<td><code>min_samples_leaf=5</code></td>
</tr>
<tr>
<td><code>max_features</code></td>
<td>최적의 분할을 찾을 때 고려할 기능 수의 최대값. 무작위성을 증가시켜 과적합을 방지할 수 있습니다.</td>
<td><code>max_features=&quot;sqrt&quot;</code></td>
</tr>
<tr>
<td><code>max_leaf_nodes</code></td>
<td>최대 리프 노드 수. 과적합을 방지하기 위해 리프 노드 수를 제한합니다.</td>
<td><code>max_leaf_nodes=50</code></td>
</tr>
<tr>
<td><code>min_impurity_decrease</code></td>
<td>노드 분할에 필요한 최소 불순도 감소. 이 값보다 작은 불순도 감소는 분할을 하지 않습니다.</td>
<td><code>min_impurity_decrease=0.01</code></td>
</tr>
<tr>
<td><code>min_impurity_split</code></td>
<td>분할을 중단할 불순도의 임계값. 이 값을 초과하는 불순도를 가진 노드는 분할을 중단합니다. (deprecated)</td>
<td><code>min_impurity_split=0.1</code> (사용되지 않음)</td>
</tr>
<tr>
<td><code>criterion</code></td>
<td>분할을 결정하는 기준. &quot;gini&quot;(지니 불순도) 또는 &quot;entropy&quot;(엔트로피) 중 하나를 선택할 수 있습니다.</td>
<td><code>criterion=&quot;gini&quot;</code></td>
</tr>
<tr>
<td><code>splitter</code></td>
<td>각 노드에서 분할을 선택하는 전략. &quot;best&quot;는 최적의 분할을 선택하고, &quot;random&quot;은 무작위 분할을 선택합니다.</td>
<td><code>splitter=&quot;best&quot;</code></td>
</tr>
</tbody></table>
<p>작성하기 귀찮아서 gpt한테 맡김 ㅋㅋ</p>
<hr>
<h1 id="로지스틱-회귀logistic-regression">로지스틱 회귀(Logistic Regression)</h1>
<p>종속변수의 결과값이 이분법으로 나누어 지는 경우(이진결과)에 사용된다.(예 아니오, 참 거짓, 0 1)
선형 회귀선을 찾는것이 아니고 로지스틱(시그모이드) 함수에 반환되는 값을 확률로 간주하여 값 0.5를 기준으로 이진 분류를 수행한다.</p>
<p>회귀라는 이름은 갖지만 선을 찾는건 아니고, 정해져 있는 선에 값을 찍어서 확률값을 통해 0, 1 을 분류한다는 소리인 것 같다. 
쉽게 풀어쓴답시고 썼는데 위에문장이랑 별 차이 없는것같다.<img src="https://velog.velcdn.com/images/dalbong_97/post/27997961-e389-4a56-bd4b-3d8f8e47ed8e/image.png" alt=""></p>
<hr>
<h1 id="support-vector-machine">Support Vector Machine</h1>
<p>분류를 위한 기준선(결정경계선)을 찾는 알고리즘. 의외로 <span style="color:aqua">분류</span>와 <span style="color:rgb(255, 0, 255)">회귀</span> 둘 다 사용할 수 있다.
각각 SVC(Support Vector Classification), SVR(Support Vector Regression) 으로 불린다.
마진을 &#39;최대&#39;로 하는 결정 경계를 찾는것이 SVM의 목표이다.
성능을 높이기 위해서 <span style="color:rgb(255, 178, 0)">정규화(scaling)</span>가 필수이다.
<img src="https://nlp.stanford.edu/IR-book/html/htmledition/img1260.png" alt=""></p>
<ul>
<li><p>서포트 벡터(Support Vector)
결정 경계선과 가장 가까운 데이터 포인트</p>
</li>
<li><p>마진(margin)
결정경계선과 서포트 벡터 사이의 거리</p>
</li>
<li><p>Cost(정규화 매개변수)
분류 오류를 결정하는 값, 마진을 최대화 할 수 있다. 값을 높일수록 더 넓은 마진을 허용하지만 오분류가능성이 있다. 누누히말하지만 적절한 Cost 값을 찾는게 중요하다.
높으면 과대적합, 낮으면 과소적합 위험이 있다.</p>
</li>
<li><p>초평면(Hyperplane)
SVM의 결정 경계를 의미한다. 데이터가 나타나는 공간보다 차원이 하나 적다. 그래서 2차원에서는 경계선(1차원), 3차원에서는 경계면(2차원) 이 된다.</p>
</li>
<li><p>커널 함수(Kernel function)
대부분의 데이터는 선형으로 분류하기 힘드므로 커널 함수를 이용하여 비선형으로 데이터를 분류한다. 데이터간에 다른차원으로 분리해서 분류를 한다나 뭐라나...
RBF(Radial Basis Function)이 가장 많이 쓰인다.</p>
</li>
<li><p>감마(gamma)
비선형 SVM에서 쓰이는 값으로, 모델이 생성하는 경계가 복잡해지는 정도를 나타낸다.
Cost와 비슷한 역할을 한다고 생각하면 될 것 같다.</p>
</li>
</ul>
<hr>
<h1 id="기본-알고리즘-데이터-전처리-정리">기본 알고리즘 데이터 전처리 정리</h1>
<table>
<thead>
<tr>
<th>알고리즘</th>
<th>스케일링</th>
<th>범주형 변수 처리</th>
</tr>
</thead>
<tbody><tr>
<td>선형 회귀</td>
<td>필요 없음</td>
<td>가변수화</td>
</tr>
<tr>
<td>KNN</td>
<td>필요</td>
<td>가변수화</td>
</tr>
<tr>
<td>의사결정나무</td>
<td>필요 없음</td>
<td>필요 없음</td>
</tr>
<tr>
<td>로지스틱 회귀</td>
<td>필요 없음</td>
<td>가변수화</td>
</tr>
<tr>
<td>SVM</td>
<td>필요</td>
<td>가변수화</td>
</tr>
<tr>
<td>***</td>
<td></td>
<td></td>
</tr>
<tr>
<td># 앙상블 알고리즘</td>
<td></td>
<td></td>
</tr>
<tr>
<td>여러가지 기본 모델 알고리즘들을 결합하여 하나의 최종 예측 모델을 생성하는 방법.</td>
<td></td>
<td></td>
</tr>
<tr>
<td>일반적으로 단일 모델보다 다 나은 성능과 과적합이 줄어든다.</td>
<td></td>
<td></td>
</tr>
<tr>
<td>***</td>
<td></td>
<td></td>
</tr>
<tr>
<td>## 보팅(Voting)</td>
<td></td>
<td></td>
</tr>
<tr>
<td>여러개의 알고리즘이 투표를 통해 최종 예측 결과를 결정하는 방식, 소프트보팅과 하드보팅이 있다.</td>
<td></td>
<td></td>
</tr>
<tr>
<td>분류로 예시를들어 차이를 설명하자면 다음과 같다.</td>
<td></td>
<td></td>
</tr>
<tr>
<td>* 하드 보팅</td>
<td></td>
<td></td>
</tr>
<tr>
<td>다수의 알고리즘이 예측한 클래스 값이 최종 결과값</td>
<td></td>
<td></td>
</tr>
</tbody></table>
<ul>
<li>소프트 보팅
모든 알고리즘이 예측한 클래스 값의 확률의 평균을 귀한뒤 가장 높은 값을 가진 클래스를 최종 결과로 선정</li>
</ul>
<p>예시 코드 분류인지 회귀인지에 따라 Voting 뒤에 오는 글자를 다르게 하면 된다.</p>
<pre><code class="language-python">import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier

# Load the iris dataset
data = load_iris()
X, y = data.data, data.target

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Define the base models
lr = LogisticRegression()
dt = DecisionTreeClassifier()
knn = KNeighborsClassifier()

# Create the Voting Classifier using the base models
voting_classifier = VotingClassifier(estimators=[(&#39;lr&#39;, lr), (&#39;dt&#39;, dt), (&#39;knn&#39;, knn)], voting=&#39;hard&#39;)

# Train the Voting Classifier on the training data
voting_classifier.fit(X_train, y_train)

# Make predictions on the test data
y_pred = voting_classifier.predict(X_test)

# Calculate the accuracy of the Voting Classifier
accuracy = accuracy_score(y_test, y_pred)
print(f&quot;Voting Classifier Accuracy: {accuracy:.2f}&quot;)</code></pre>
<hr>
<h2 id="배깅bagging">배깅(Bagging)</h2>
<p>&#39;Bootstrap Aggregating&#39; 약자, 데이터로부터 부트스트랩(샘플링의 한 종류) 한 데이터로 모델을 학습시킨 후, 학습된 모델의 결과를 집계하여 최종 결과를 얻는 방법. 분산을 줄이고 과적합을 방지하는데 도움이 된다.
<span style="color:aqua">다수의 모델을 예측 후 결합을 하는 방식</span>에서 샘플링과 비슷한 측면이 있지만, <span style="color:rgb(255, 0, 255)">같은 모델로 학습을 한다는 점(랜덤 포레스트)과, 샘플링된 데이터를 사용</span>한다는 차이가 있다.</p>
<h3 id="랜덤-포레스트random-forest">랜덤 포레스트(Random Forest)</h3>
<p>배깅을 이용한 앙상블의 가장 대표적인 알고리즘, Decision Tree 알고리즘을 여러 번 사용하여 결합한다는 의미에서 Forest라는 의미가 붙었다.
두가지를 무작위로 선택한다. 한가지는 배깅 알고리즘이라는 점에서 추측할 수 있듯이, 데이터를 부트스트래핑한다는 것이고, 나머지 하나는 Decision Tree의 분할 기준이 되는 Feature를 랜덤으로 선택하는 것이다.</p>
<p>주요 하이퍼파라미터는 Decision Tree 와 비슷하다.</p>
<table>
<thead>
<tr>
<th>하이퍼파라미터</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><code>n_estimators</code></td>
<td>숲에 있는 나무의 수. 나무의 수를 늘리면 일반적으로 모델 성능이 향상되지만 계산 시간이 늘어난다.</td>
</tr>
<tr>
<td><code>max_features</code></td>
<td>각 노드에서 분할을 위해 고려되는 특성의 최대 개수. 이 값을 줄이면 다양성이 증가하여 과적합을 줄일 수 있다.</td>
</tr>
<tr>
<td><code>max_depth</code></td>
<td>나무의 최대 깊이. 이 값을 제한하면 모델의 복잡성이 감소하여 과적합을 방지할 수 있다.</td>
</tr>
<tr>
<td><code>min_samples_split</code></td>
<td>노드를 분할하기 위한 최소 샘플 수. 이 값을 높이면 모델의 복잡성이 감소하여 과적합을 방지할 수 있다.</td>
</tr>
<tr>
<td><code>min_samples_leaf</code></td>
<td>리프 노드에 필요한 최소 샘플 수. 이 값을 높이면 모델의 복잡성이 감소하여 과적합을 방지할 수 있다.</td>
</tr>
</tbody></table>
<hr>
<h2 id="부스팅boosting">부스팅(Boosting)</h2>
<p>같은 유형의 알고리즘 기반 분류기 여러 개에 대해 순차적으로 학습을 수행하는 알고리즘.
Decision Tree를 병렬적으로 훈련하는 Random Forest와 달리, 순차적으로 훈련한다는 차이가 있다. 즉, 이전 분류기 학습 결과에 영향을 받는다.
배깅에 비해 성능이 좋지만 속도가 느리고 과적합 가능성이 있다.
이러한 부스팅 알고리즘을 최적화하고 효율화하여 개선한 XGBoost 알고리즘이 자주 사용된다.
다음은 XGBoost 알고리즘의 하이퍼파라미터이다.</p>
<table>
<thead>
<tr>
<th>하이퍼파라미터</th>
<th>설명</th>
<th>일반적인 값과 기본값</th>
</tr>
</thead>
<tbody><tr>
<td><code>learning_rate</code></td>
<td>학습률입니다. 각 부스팅 단계에서 새로운 weak learner의 가중치를 조정하는 데 사용됩니다. 일반적으로 낮은 값이 설정됩니다.</td>
<td>일반적인 값: 0.01 ~ 0.3, 기본값: 0.3</td>
</tr>
<tr>
<td><code>max_depth</code></td>
<td>각 weak learner(결정 트리)의 최대 깊이입니다. 이 값을 줄이면 과적합을 방지할 수 있습니다.</td>
<td>일반적인 값: 3 ~ 10, 기본값: 6</td>
</tr>
<tr>
<td><code>min_child_weight</code></td>
<td>자식 노드에 필요한 최소 가중치 합입니다. 이 값을 높이면 과적합을 방지할 수 있습니다.</td>
<td>일반적인 값: 1 ~ 20, 기본값: 1</td>
</tr>
<tr>
<td><code>gamma</code></td>
<td>트리 분할을 허용하는 데 필요한 최소 손실 감소입니다. 이 값을 높이면 과적합을 방지할 수 있습니다.</td>
<td>일반적인 값: 0 ~ 20, 기본값: 0</td>
</tr>
<tr>
<td><code>subsample</code></td>
<td>각 weak learner를 학습하는 데 사용되는 샘플의 비율입니다. 이 값을 낮추면 과적합을 방지할 수 있습니다.</td>
<td>일반적인 값: 0.5 ~ 1, 기본값: 1</td>
</tr>
<tr>
<td><code>colsample_bytree</code></td>
<td>각 weak learner를 학습하는 데 사용되는 특성의 비율입니다. 이 값을 낮추면 과적합을 방지할 수 있습니다.</td>
<td>일반적인 값: 0.5 ~ 1, 기본값: 1</td>
</tr>
<tr>
<td><code>lambda</code></td>
<td>L2 정규화 항의 가중치입니다. 이 값을 높이면 과적합을 방지할 수 있습니다.</td>
<td>일반적인 값: 0 ~ 10, 기본값: 1</td>
</tr>
<tr>
<td><code>alpha</code></td>
<td>L1 정규화 항의 가중치입니다. 이 값을 높이면 과적합을 방지할 수 있습니다.</td>
<td>일반적인 값: 0 ~ 10, 기본값: 0</td>
</tr>
<tr>
<td><code>n_estimators</code></td>
<td>부스팅 단계(weak learner)의 수입니다. 더 많은 단계가 진행될수록 모델이 복잡해지지만 과적합이 발생할 수 있습니다.</td>
<td>일반적인 값: 100 ~ 1000, 기본값 100</td>
</tr>
</tbody></table>
<h3 id="catboost">catboost?</h3>
<p>최근에 나온 그라디언트 부스팅 알고리즘이다.
범주형 특성에 효율적으로 처리하도록 설계되었으며 GPU 가속을 이용할 수 있어서 다른 그라디언트 부스팅 알고리즘보다 더 빠르다고 한다.
알고리즘의 기술적인 특징에 관련해서 아주 잘 요약한 <a href="https://dailyheumsi.tistory.com/136">블로그 글</a>이 있어서 따로 포스팅은 생략...</p>
<hr>
<h2 id="스테킹stacking">스테킹(Stacking)</h2>
<p>여러 모델의 예측 값을 최종 모델의 학습 데이터로 사용하여 예측하는 방법.
기본모델과 최종모델로 나누어서 학습을 진행한다. 여러개의 기본모델로 학습을 진행한 뒤 마지막으로 최종모델을 이용하여 최종 예측을 수행하는 알고리즘이다.
도식화</p>
<pre><code class="language-yaml">      Base Model 1   Base Model 2   ...   Base Model N
          |              |                      |
          v              v                      v
        ┌─────┐        ┌─────┐                ┌─────┐
Training┤  M1 ├────────┤  M2 ├────────────────┤  MN ├─────┐
 Data   └─────┘        └─────┘                └─────┘     |
           |              |                      |        |
           v              v                      v        v
        ┌─────┐        ┌─────┐                ┌─────┐   ┌─────┐
 Test   ┤  M1 ├────────┤  M2 ├────────────────┤  MN ├───┤MetaM├─── Final Prediction
 Data   └─────┘        └─────┘                └─────┘   └─────┘
           |              |                      |
           v              v                      v
      Predictions 1  Predictions 2          Predictions N</code></pre>
<p>예시 코드</p>
<pre><code class="language-python">import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import StackingClassifier

# Load Iris dataset
data = load_iris()
X, y = data.data, data.target

# Split the dataset into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Define base models
base_models = [
    (&#39;logistic_regression&#39;, LogisticRegression()),
    (&#39;knn&#39;, KNeighborsClassifier(n_neighbors=3)),
    (&#39;random_forest&#39;, RandomForestClassifier(n_estimators=100, random_state=42))
]

# Define the meta-model
meta_model = LogisticRegression()

# Create the stacking classifier
stacking_classifier = StackingClassifier(estimators=base_models, final_estimator=meta_model)

# Fit the stacking classifier to the training data
stacking_classifier.fit(X_train, y_train)

# Evaluate the stacking classifier on the test data
score = stacking_classifier.score(X_test, y_test)
print(f&quot;Stacking Classifier Test Accuracy: {score:.2f}&quot;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[머신러닝 - 개괄]]></title>
            <link>https://velog.io/@dalbong_97/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@dalbong_97/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Wed, 15 Mar 2023 16:08:53 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dalbong_97/post/544c003f-2bd9-4680-b204-0ffc6cce3667/image.png" alt="">
<a href="https://coconut-emoji.tistory.com/">이미지출처</a>
<a href="https://velog.io/@dalbong_97/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EC%99%80-%EC%A0%84%EB%8B%AC%EC%9D%B8%EC%9E%90-syntax-%EC%95%BD%EC%86%8D">syntax 약속</a>
본 포스팅은 KT 에이블스쿨 교육내용을 제 나름대로 정리하여 작성하였습니다</p>
<hr>
<h1 id="머신러닝">머신러닝?</h1>
<p>ML(머신러닝)은 사용하는 데이터를 기반으로 학습 또는 성능 향상을 지원하는 시스템을 구축하는 데 초점을 맞추는 인공 지능(AI)의 하위 집합입니다. <a href="https://www.oracle.com/kr/artificial-intelligence/machine-learning/what-is-machine-learning/">출처</a>
<img src="https://velog.velcdn.com/images/dalbong_97/post/8925ae8b-0d9e-43a2-bcd1-b84986f8c067/image.jpeg" alt="">대충 이런관계이다.</p>
<hr>
<h1 id="머신러닝-학습-종류">머신러닝 학습 종류</h1>
<p>머신러닝은 학습 방법에 따라</p>
<ul>
<li><p>지도학습(Supervised Learning)
학습 대상이 되는 데이터에 정답을 주어 규칙성을 배우게 하는 방법</p>
</li>
<li><p>비지도학습(Unsupervised Learning)
정답이 없는 데이터 만으로 배우게 하는 방법</p>
</li>
<li><p>강화학습(Reinforcement Learning)
선택한 결과에 보상을 받아 행동을 개선하며 배우게 하는 학습방법</p>
</li>
</ul>
<p>으로 나뉜다.</p>
<p>또한 학습 과제에 따라</p>
<ul>
<li>분류(Classification)</li>
<li>회귀(Regression)</li>
<li>군집화(Clulstering)</li>
</ul>
<p>로 나뉜다.<img src="https://velog.velcdn.com/images/dalbong_97/post/301b5771-fa90-48ba-bf20-ed7bd4a8e5ed/image.jpeg" alt=""> 자세한건 그림을 참고하자.</p>
<p>일단은 <a href="https://ko.wikipedia.org/wiki/Scikit-learn">&#39;사이킷런(sklearn)</a>을 사용하여 분류와 회귀에 대해서만 다룰 예정이다.</p>
<hr>
<h1 id="1-미리-알아-둘-용어">1. 미리 알아 둘 용어</h1>
<ol start="0">
<li>분류와 회귀</li>
<li>모델, 모델링</li>
<li>행, 열</li>
<li>독립변수, 종속변수</li>
<li>오차와 평균</li>
<li>데이터 분리</li>
<li>과대적합 &amp; 과소적합</li>
</ol>
<hr>
<h2 id="1-0-분류와-회귀">1. 0. 분류와 회귀</h2>
<p>주어진 문제가 분류인지 회귀를 구분하는 것은 <span style="color:aqua">매우</span> 중요하다. 사용하는 알고리즘과 평가 방법이 달라지기 때문다.</p>
<p>매우 간단하게 요약하자면</p>
<ul>
<li><p>분류 : 그룹 예측</p>
</li>
<li><p>회귀 : 값 예측</p>
</li>
</ul>
<p>판단기준은 <span style="color:aqua">값의 연속성 여부</span> 이다.</p>
<hr>
<h2 id="1-1-모델-모델링">1. 1. 모델, 모델링</h2>
<ul>
<li><p>모델 : 데이터로 부터 pattern 을 찾아 수식으로 정리해 놓은 것</p>
</li>
<li><p>모델링 : (오차가 적은) 모델을 만드는 것 혹은</p>
<blockquote>
<p>머신이 적절한 학습을 통해 최선의 모델을 만들 수 있도록 노력하는 행위</p>
</blockquote>
</li>
<li><p>모델링의 목적 : sample을 가지고 전체를 추정하기 위함</p>
<ul>
<li>sample = 표본, 부분집합, 일부, 과거의 데이터</li>
<li>전체 = 모집단, 전체집합, 현재 혹은 미래의 데이터</li>
</ul>
</li>
</ul>
<hr>
<h2 id="1-2-행-열">1. 2. 행, 열</h2>
<p>  다른 명칭들을 숙지해야 한다.</p>
<ul>
<li><p>행(Row)</p>
<ul>
<li><p>개체(Instance)</p>
</li>
<li><p><span style="color:aqua">관측치(Observed Value)</span></p>
</li>
<li><p>기록(Record)</p>
</li>
<li><p>사례(Example)</p>
</li>
<li><p>경우(Case)</p>
</li>
<li><p>열(Column)</p>
<ul>
<li>특성(Feature)</li>
<li><span style="color:aqua">속성(Attribute)</span></li>
<li>변수(Variable)</li>
<li>필드(Field)</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="1-3-독립변수-종속변수">1. 3. 독립변수, 종속변수</h2>
<p>y = ax + b 에서</p>
<p>x : 독립변수
y : 종속변수</p>
<p>이다.</p>
<p>x 의 값의 변화에 따라 y의 값이 변화하므로 y는 x에 종속되어있다고 할 수 있다.</p>
<hr>
<h2 id="1-4-오차와-평균">1. 4. 오차와 평균</h2>
<ul>
<li>평균(mean) - 통계학에서 사용되는 가장 단순한 <span style="color:aqua">모델</span></li>
<li>오차(error) - 관측치와 모델의 차이(이탈도, Deviance 라고도 부른다.)</li>
</ul>
<hr>
<h2 id="1-5-데이터-분리">1. 5. 데이터 분리</h2>
<p>머신러닝을 하기 위해서는 데이터셋의 분리가 필요하다.</p>
<ul>
<li>학습용(training)</li>
<li>검증용(validation)</li>
<li>평가용(testing) -&gt; 미래의 data, 찐 막 최종 평가</li>
</ul>
<p>좀 검증용과 평가용 데이터가 햇갈릴 수도 있는데, 모의고사와 수능의 차이라고 생각하면 이해가 조금 편할 것 같다.</p>
<ul>
<li>target(y)</li>
<li>feature(x)</li>
</ul>
<p>실전에서는 평가용 데이터는 현실 상황에선 별도로 제공되는 경우가 많다. 하지만 학습에서는 가지고 있는 데이터에서 따로 떼서 사용한다.</p>
<p>각각 6:2:2 비율 혹은 검정을 제외한 7:3 비율로 나누는 것이 일반적이나,
아주 많은 양의 데이터(백만개단위)를 다루는 빅데이터의 경우에는 98:1:1 로하는 경우도 있다고 한다.
<a href="https://www.youtube.com/watch?v=_Fe5kKmFieg&amp;list=PLkDaE6sCZn6E7jZ9sN_xHwSHOdjUxUW_b&amp;index=7">출처</a>
<img src="https://velog.velcdn.com/images/dalbong_97/post/e0ccebfe-4bfb-44c9-b854-196051bb178e/image.jpeg" alt="">일반적인 지도학습 머신러닝 교육에서 분리되는 데이터 모양</p>
<hr>
<h2 id="1-6-과대적합과-과소적합">1. 6. 과대적합과 과소적합</h2>
<p>머신러닝을 관통하는 키워드에는 <span style="color:aqua">&#39;과유불급&#39;</span> 이라고 생각한다. 모델 학습이 너무 과하면 과대적합이, 너무 적으면 과소적합이 일어나는 등...
항상 적절한 point를 찾는게 중요하다고 할 수 있다.</p>
<ul>
<li><p>과대적합(Overfitting)
학습 데이터에 대해서 점수가 높지만, 실제 데이터를 가지고 하는 예측(평가 데이터)에는 점수가 매우 낮은 경우</p>
</li>
<li><p>과소적합(Underfitting)
학습 데이터가 평가데이터보다 점수가 낮은 경우, 혹은 둘 다 매우 낮은 경우, 모델이 너무 단순하여 적절하게 훈련이 안 된 경우</p>
</li>
</ul>
<hr>
<h1 id="2-모델링-과정">2. 모델링 과정</h1>
<ol>
<li>불러오기</li>
<li>데이터 이해 및 준비</li>
<li>모델 성능 예측 및 선정</li>
<li>모델 튜닝 및 학습</li>
<li>예측 및 평가</li>
</ol>
<hr>
<h2 id="2-1-라이브러리-불러오기">2. 1. 라이브러리 불러오기</h2>
<p>머신러닝에 필요한 기본 라이브러리와 데이터들을 불러온다.</p>
<pre><code class="language-python">import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import warnings

warnings.filterwarnings(action=&#39;ignore&#39;)
%config InlineBackend.figure_format = &#39;retina&#39;</code></pre>
<p>데이터프레임에 관련된 라이브러리인 <code>numpy</code>, <code>pandas</code>
시각화를 담당하는 라이브러리인 <code>seaborn</code>, <code>matplotlib</code>
그리고 각종 다양한 라이브러리도 많지만 생략한다.</p>
<hr>
<h2 id="2-2-데이터-이해-및-준비">2. 2. 데이터 이해 및 준비</h2>
<h3 id="2-2-1-데이터-이해">2. 2. 1. 데이터 이해</h3>
<p>불러온 데이터를 탐색하여 충분히 이해할 수 있도록 한다. 데이터 탐색과정은 <a href="https://velog.io/@dalbong_97/pandas-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC#2-%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%94%84%EB%A0%88%EC%9E%84-%ED%83%90%EC%83%89">링크</a>로 대체한다.
추가적으로 seaborn의 <code>corr()</code> 메소드를 이용하여 변수 관 상관관계를 분석할 수 있다.
이 단계에서 제일 중요한 과정은 <span style="color:aqua">Target(y)</span> 값을 찾는 것이다.</p>
<hr>
<h3 id="2-2-2-데이터-준비">2. 2. 2. 데이터 준비</h3>
<p>머신러닝에 사용할 수 있도록 데이터들을 전처리해주는 과정이다.</p>
<ul>
<li>불필요한 변수 제거
머신러닝에 사용할 필요가 없는 항목들, 주민번호나 사번 등 개인을 식별할 용도로 쓰이는 변수들은 <code>drop</code> 메소드를 이용하여 삭제해준다.</li>
</ul>
<pre><code class="language-python">data.drop(&#39;colname&#39;, axis=1, inplace=True)</code></pre>
<ul>
<li><p>필요한 변수 추가
데이터 이해과정중 추가가 필요하겠다고 생각한 변수들을 추가해준다.</p>
</li>
<li><p>타겟 설정과 데이터 분리
타겟을 설정한 뒤 기존 데이터프레임에서 분리해 y에 할당하고, y를 제외한 데이터들도 x에 할당해준다.</p>
<pre><code class="language-python">target = &#39;colname&#39;
y = data[target]
x = data.drop(target, axis=1)</code></pre>
</li>
<li><p>결측치 처리
자세한 내용은 <a href="https://velog.io/@dalbong_97/pandas-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC#7-%EA%B2%B0%EC%B8%A1%EC%B9%98-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0">링크</a>를 참고하자.
추가로 Knn imputer같은 다양한 결측치 처리 방법도 있는데, 후에 수정하여 추가하겠다.</p>
</li>
<li><p>가변수화
분류를 위한 머신러닝 알고리즘에는 &#39;가변수화&#39;라는게 필요하다.
일반적으로 자료형이 object인 변수들(예를들어 성별, 만족도 조사 결과 등) 들이 대상이 된다. 코드에 대한 자세한 이해도 역시 <a href="https://velog.io/@dalbong_97/pandas-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC#7-4-%EA%B0%80%EB%B3%80%EC%88%98dummy-variable-%EB%A7%8C%EB%93%A4%EA%B8%B0">링크</a>를 참고하자 ㅋㅋㅋ</p>
<pre><code class="language-python">dumn_cols = [&#39;col1&#39;, &#39;col2&#39;, &#39;col3&#39;, &#39;col4&#39;]
x = pd.get_dummies(x, columns=dumn_cols, drop_first=True)</code></pre>
</li>
<li><p>데이터 분리
학습용 데이터와 평가용(예측용) 데이터를 분리해야 한다.
<code>sklearn</code> 의 <code>train_test_split</code> 모듈을 이용해서 분리한다.
학습에서는 같은 결과값을 봐야하므로 <code>random_state</code> 를 같은 값으로 지정한다.
위쪽의 데이터 분리의 그림을 토대로 분리한 것이며, 7:3 비율로 분리한 것이다.</p>
<pre><code class="language-python">from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)</code></pre>
</li>
<li><p>정규화(scaling)
모델의 성능을 높이기 위해(특히 KNN) 스케일링이 필요한 경우가 있다.
대표적으로 2가지가 있다.</p>
<ul>
<li><p>Normalization(min-max scaling)
$$
X_{norm} = \frac{x - x_{min}}{x_{max}-x_{min}}
$$</p>
</li>
<li><p>Standardization
$$
X_{Z}=\frac{x-mean}{std}
$$</p>
</li>
</ul>
</li>
</ul>
<p>위 공식을 직접 사용하거나, <code>sklearn</code> 이 기본적으로 제공하는 함수를 사용해도 된다.</p>
<pre><code class="language-python">from sklearn.preprocessing import MinMaxScaler, StandardScaler
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train_s = scaler.transform(x_train)
x_test_s = scaler.transform(x_test)</code></pre>
<hr>
<h2 id="2-3-모델-성능-예측-및-선정">2. 3. 모델 성능 예측 및 선정</h2>
<p>모델의 종류
주어진 데이터셋에 어떤 모델을 사용할지 결정하는 것이다. 모델 성능 예측은 해당 모델로 학습한 후 테스트를 진행했을 때 예상되는 성능을 추정하는 과정이다. 이는 검증 과정과 유사하다.(같은건가?)
예측 및 평가가 &#39;수능&#39;이라면 본 과정은 &#39;모의고사&#39; 인 셈이다.
일반적인 모델 성능평가 지표를 사용하거나, K-분할 교차 검증(K-Fold Cross Validation)을 사용한다.</p>
<hr>
<h3 id="2-3-1-모델-종류">2. 3. 1. 모델 종류</h3>
<p>따로 포스팅 예정</p>
<hr>
<h3 id="2-3-2-선정을-위한-모델-성능-예측">2. 3. 2. 선정을 위한 모델 성능 예측</h3>
<p>K-분할 교차 검증(K-Fold Cross Validation)
모든 데이터를 K 개로 분할하여 <span style="color:aqua">1번 평가</span> <span style="color:rgb(255, 0, 255)">K-1 번 학습</span> 후, 분할에 대한 모든 성능 추정치를 평균 혹신 표준편차로 나타낸 수치를 최종 정확도로써 사용한다.
<img src="https://velog.velcdn.com/images/dalbong_97/post/5bfc3d74-809f-4352-9e91-aeecd36e1d6e/image.png" alt="">출처 - scikit-learn 라이브러리의 공식 문서
다크모드에서는 잘 안보인다...(이런젠장)
다음과 같은 장점들이 있다.</p>
<ul>
<li>정확도상승</li>
<li>평가데이터 편향 방지</li>
<li>일반화된 모델</li>
<li>데이터 부족으로 인한 과소적합 방지 </li>
</ul>
<p><code>sklearn</code> 에서는 <code>cross_val_score</code> 모듈을 임포트 하여 간단하게 사용할 수 있다.</p>
<pre><code class="language-python"># 불러오기
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score

# 검증용 모델 선언하기 
model = DecisionTreeClassifier(max_depth=5,  random_state=1)

# 검증하기
cv_score = (model, x_train, y_train, cv=10)
cross_val_score

# 확인
print(cv_score)
print(&#39;평균:&#39;, cv_score.mean())
print(&#39;표준편차:&#39;, cv_score.std())</code></pre>
<hr>
<h2 id="2-4-모델-튜닝-및-학습">2. 4. 모델 튜닝 및 학습</h2>
<h3 id="2-4-1-하이퍼파라미터-튜닝">2. 4. 1 하이퍼파라미터 튜닝</h3>
<p>모델의 하이퍼파라미터(hyperparameter)를 조절하여 모델을 튜닝할 수 있다.</p>
<p>하이퍼파라미터(hyperparameter)란?
훈련 과정에서 학습되지 않지만 훈련이 시작되기 전에 설정되는 매개변수
간단하게 말하면, 모델링 시에 사용자가 조절할 수 있는 옵션이라고 보면 되겠다.
하이퍼파라미터는 모델의 성능에 큰 영향을 미치므로 적절한 값의 설정은 매우 중요하다.
물론 다음의 이유로 최적의 파라미터를 얻었을 지라도 운영환경에서 성능이 보장되지 않을 수도 있다.</p>
<ul>
<li><p>과적합</p>
</li>
<li><p>미래의 데이터가 과거와는 다른 경향값을 가짐
과거의 데이터를 가지고 미래를 평가하는 머신러닝 모델의 특성상 미래의 모델이 과거의 경향성을 따라가지 않는다면 맞지 않을 수 있다.</p>
</li>
<li><p>확률론적 관점
어디까지나 최적의 파라미터는 최고의 성능을 가질 수 있는 &#39;확률&#39;이 제일 높은 값이기 때문에 한~두번의 평가에서는 다른 파라미터가 우세한 경우도 있다.</p>
</li>
</ul>
<p>하이퍼파라미터를 튜닝하는데는 두가지 방법이 있다.</p>
<ul>
<li>Grid Search -&gt; 전수조사</li>
<li>Random Search -&gt; 일부만 조사</li>
</ul>
<p>&#39;딱 봐도 그리드서치는 잘뽑는데 오래걸리고, 랜덤은 반대겠지? ㅎㅎ~&#39; 라 생각한 당신
<span style="color:rgb(255, 178, 0)">정답</span>이다 ㅋㅋ</p>
<pre><code class="language-python"># 기본 모델 선언
model_xgb = XGBClassifier(random_state=1)
# 파라미터 지정, 여러개 지정도 가능하다.
param = {&#39;max_depth&#39;: range(1, 21)}

model = GridSearchCV(model_xgb,
                     param,
                     cv=5,
                     scoring=&#39;accuracy&#39;)                    </code></pre>
<p>Random Search는 위의 코드 괄호 안에 <code>n_iter</code> 라는 변수를 추가하면 된다.
임의로 선택할 파라미터의 조합 수를 나타낸다.
<code>cv</code>는 검증용으로 사용하는 K-Fold Cross Validation 의 K 값이다.
위의 코드는 <code>max_depth</code> 를 1~20 까지, 그리고 각각 5번의 검증을 거치므로 총 100번의 시행횟수를 가지게 될 것이다.</p>
<pre><code class="language-python"># 학습하기
model.fit(x_train, y_train)

print(model.best_params_)
print(model.best_score_)</code></pre>
<p>튜닝을 거치고 바로 모델을 fitting 하게되면 알아서 최적의 값을으로 학습을 하게된다.
<code>beat_params_</code> 와 <code>bset_score_</code> 를 통해 최적의 파라미터와 test 데이터를 넣었을 시 예측되는 점수를 표시해준다.</p>
<pre><code class="language-python">plt.figure(figsize=(6, 5))
plt.barh(list(x), model.best_estimator_.feature_importances_)
plt.show()</code></pre>
<p><code>best_estimator_</code> 최고 추정치의 <code>feature_importances_</code> 변수 중요도도 Plot 할 수 있다.</p>
<hr>
<h3 id="2-4-2-feature-selection">2. 4. 2 Feature selection</h3>
<p>Decision Tree, Random Forest를 기반으로 하는 모델들에 사용되며 Feature 가 많은 데이터에 유용하다.
모델 fitting(학습) 후 <code>모델명.feature_importances_</code> 를 작성하면 중요도를 반환해준다.
보통은 feature 이름과 결합하여 DataFrame을 만들어 사용하며. 이를 통해 중요한 feature를 쉽게 확인할 수 있다.</p>
<p>다음은 for 문을 이용하여 모델링에 필요한 최적의 feature 갯수를 구하는 코드의 예시이다.
미리 <code>GridSearch</code>를 통해 최적의 파라미터를 구한 상태에서 시작한다.</p>
<pre><code class="language-python">acc = pd.DataFrame(columns=[&#39;accuracy_score&#39;])

for i in range(130):

    importance_n = importance_sort[&#39;feature_name&#39;][:i+1]

    x_train_n = x_train[importance_n]
    x_val_n = x_val[importance_n]

    xgb_n_model = XGBClassifier(learning_rate=0.3, max_depth=3, random_state=2023)
    xgb_n_model.fit(x_train_n, y_map_train)
    xgb_n_pred = xgb_n_model.predict(x_val_n)

    acc.loc[i] = accuracy_score(y_map_val,xgb_n_pred)
    print(acc.loc[i])

acc</code></pre>
<hr>
<h2 id="2-5-예측-및-평가">2. 5. 예측 및 평가</h2>
<p>문제가 <span style="color:aqua">분류</span>인지 <span style="color:rgb(255, 0, 255)">회귀</span>인지에 따라 평가방식이 다르다.
값에는 3가지가 있다.</p>
<ul>
<li><p>실제값
목표로 하는 값, 성능평가는 이 값과의 비교로 한다.</p>
</li>
<li><p>예측값
머신러닝 알고리즘으로 &#39;새롭게&#39; 예측한 값</p>
</li>
<li><p>평균값
&#39;기존에&#39; 예측한 값</p>
</li>
</ul>
<hr>
<h3 id="2-5-0-평가-관련-모듈-불러오기">2. 5. 0. 평가 관련 모듈 불러오기</h3>
<p>평가 관련 모듈 불러오기</p>
<pre><code class="language-python">from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error, mean_absolute_percentage_error

# 보통은 이렇게 씀
from sklearn.metrics import *</code></pre>
<hr>
<h3 id="2-5-1-회귀모델의-평가">2. 5. 1. 회귀모델의 평가</h3>
<ul>
<li><p>오차
회귀 모델의 평가는 예측값과 실제값의 차이인 오차(Error)를 확인한다.
상식적으로 예측값과 실제값의 차이가 작을 수록 좋은 모델이므로, 오차는 낮을수록 좋다.
실제값과 예측값의 오차는 샘플마다 다르므로, 이를 한번에 말하는 수치들이 필요하다.
$$
y_i :i번째 샘플의 실제 값
$$
$$
\hat{y_i} : i번째 샘플의 예측값
$$
MSE(Mean Squared Error) - 평균 제곱 오차
$$
MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2
$$
RMSE(Root Mean Squared Error) - 평균 제곱근 오차
$$
RMSE = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2}
$$
MAE(Mean Absolute Error) - 평균 절대 오차
$$
MAE = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y_i}|
$$
MAPE(Mean Absolute Percentage Error) - 평균 절대 백분율 오차
$$
MAPE = \frac{100percent}{n}\sum_{i=1}^{n}\left|\frac{y_i - \hat{y_i}}{y_i}\right|
$$
일반적으로 MAE를 많이 사용한다.</p>
</li>
<li><p>오차 제곱합
SST(Sum Squared Total) : 전체 오차
$$
SST = \sum_{i=1}^{n}(y_i - \bar{y})^2
$$
SSR(Sum Squared Regression) : 전체 오차 중 회귀식이 잡은 오차
$$
SSR = \sum_{i=1}^{n}(\hat{y_i} - \bar{y})^2
$$
SSE(Sum Squared Error) : 전체 오차 중 회귀식이 못잡은 오차
$$
SSE = \sum_{i=1}^{n}(y_i - \hat{y_i})^2
$$
정의대로라면 당연히 밑의 공식도 성립한다.
$$
SST = SSE + SSR
$$</p>
</li>
<li><p>결정계수(R²)
MSE를 표준화 한 수치, 전체 오차 중 회귀식이 잡아낸 오차의 &#39;비율&#39;을 의미한다. 
오차의 비, 설명력이라고도 부른다.
비율이므로 0~1 사이에 값이 표기되며, 높을수록 모델이 데이터를 잘 학습함을 의미한다.
$$
R^2 = \frac{SSR}{SST} = 1 - \frac{SSE}{SST}
$$</p>
</li>
</ul>
<p>사이킷런에서는 다양한 메소드를 이용해서 평가값을 구할 수 있다.
RMSE는 MSE에서 <code>squared</code> 옵션을 이용하여 구할 수 있다</p>
<pre><code class="language-python">print(f&#39;RMSE  : {mean_squared_error(y_val, pred, squared=False)}&#39;)
print(f&#39;MAE   : {mean_squared_error(y_val, pred)}&#39;)</code></pre>
<hr>
<h3 id="2-5-2-분류모델의-평가">2. 5. 2. 분류모델의 평가</h3>
<p>분류모델은 정확히 맞춘 비율을 평가한다.</p>
<p>confusion matrix(혼동행렬, 오분류표)
실제값과 예측된 값의 관계를 나타낸 표이다.
예측값과 실제값이 일치한 경우 <span style="color:aqua">True</span> 이며, 예측여부에 따라 <span style="color:aqua">N</span>과 <span style="color:rgb(255, 0, 255)">P</span>로 나뉜다.</p>
<table>
<thead>
<tr>
<th>Actual/Predicted</th>
<th>Negative</th>
<th>Positive</th>
</tr>
</thead>
<tbody><tr>
<td>Negative</td>
<td>True Negative (TN)</td>
<td>False Positive (FP)</td>
</tr>
<tr>
<td>Positive</td>
<td>False Negative (FN)</td>
<td>True Positive (TP)</td>
</tr>
</tbody></table>
<p>평가 지표</p>
<ul>
<li>정확도(Accuracy)<span style="color:aqua">모든 예측</span> 중 <span style="color:rgb(255, 0, 255)">정확히 예측(True)</span> 한 비율
가장 직관적으로 모델 성능을 확인할 수 있는 평가 지표
$$
Accuracy = \frac{TP + TN}{TP + TN + FP + FN}$$</li>
<li>정밀도(Precision) : <span style="color:aqua">1이라 예측</span>한 것 중 <span style="color:rgb(255, 0, 255)">1인 비율</span>
$$
Precision = \frac{TP}{TP + FP} = \frac{TP}{Predicted, Positive}$$</li>
<li>재현율(Recall, 민감도) : <span style="color:aqua">실제 1인 것</span>을 <span style="color:rgb(255, 0, 255)">1이라 예측</span>한 비율
$$
Recall = \frac{TP}{TP + FN} = \frac{TP}{Actual, Positive}$$$$</li>
<li>특이도(Specify) : <span style="color:aqua">실제 0인 것</span>을 <span style="color:rgb(255, 0, 255)">0이라 예측</span>한 비율
$$
Specify = \frac{TN}{TN + FP}$$</li>
<li>정밀도와 재현율의 조화평균
$$
F_1 = 2 \cdot \frac{precision \cdot recall}{precision + recall}$$</li>
</ul>
<p>정밀도와 재현율</p>
<ul>
<li>매우 햇갈리므로 정확하게 아는것이 중요하다.<ul>
<li>정밀도 : 예측 관점, &#39;P&#39;를 통해 연상하면 편하다.</li>
<li>재현율 : 실제 관점, 실제가 positive 인 것이 분모이다.</li>
</ul>
</li>
<li>비슷해 보이는데 왜 쓸까?<ul>
<li>실제 1인 것을 맞출 확률이 중요한 분야에서 사용한다.(감염병 판별, 산업분야 등)</li>
</ul>
</li>
</ul>
<p>혼동행렬과 분류결과 예시
Classification Report 의 recall 값과 f1-score 값을 주로 본다.</p>
<pre><code class="language-python">print(&#39;accuracy_score: &#39;,accuracy_score(y_test,xgb_top_pred))
print(&#39;\n confusion_matrix: \n&#39;,confusion_matrix(y_test,xgb_top_pred))
print(&#39;\n classification_report: \n&#39;,classification_report(y_test,xgb_top_pred))</code></pre>
<pre><code>Confusion Matrix:
[[10  0  0]
 [ 0  9  1]
 [ 0  1  9]]
Classification Report:
              precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        10
  versicolor       0.90      0.90      0.90        10
   virginica       0.90      0.90      0.90        10

    accuracy                           0.93        30
   macro avg       0.93      0.93      0.93        30
weighted avg       0.93      0.93      0.93        30</code></pre><hr>
<h1 id="3-토이데이터">3. 토이데이터</h1>
<hr>
<h1 id="4-학습곡선">4. 학습곡선</h1>
<hr>
<h1 id="5-규제">5. 규제</h1>
<hr>
<h1 id="6-분산팽창지수">6. 분산팽창지수</h1>
<hr>
<h1 id="참고--관련-함수-불러오기">참고 : 관련 함수 불러오기</h1>
<pre><code class="language-python"># 분리하기
from sklearn.model_selection import train_test_split

# 회귀문제
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_percentage_error
from sklearn.metrics import r2_score

# 분류문제
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTree Classifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import recall_score
from sklearn.metrics import precision_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix

# 성능튜닝
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import GridSearchCV</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[glob]]></title>
            <link>https://velog.io/@dalbong_97/glob</link>
            <guid>https://velog.io/@dalbong_97/glob</guid>
            <pubDate>Tue, 21 Feb 2023 11:17:22 GMT</pubDate>
            <description><![CDATA[<p><a href="https://coconut-emoji.tistory.com/">이미지출처</a></p>
<p>본 포스팅은 KT 에이블스쿨 교육내용을 바탕으로 제 나름대로 정리하여 작성하였습니다.</p>
<hr>
<p>파이썬을 이용하면서 다수의 파일들을 다뤄야 할 때 유용한 모듈이다.
사용자가 제시한 조건에 맞는 파일들을 <code>list</code> 형식으로 반환해준다.</p>
<h1 id="import">import</h1>
<pre><code class="language-python">from glob import glob</code></pre>
<p><code>*</code> 과 <code>?</code> 를 이용하여 조건을 제시할 수 있다.</p>
<ul>
<li><p><code>*</code> 임의 길이의 모든 문자열</p>
</li>
<li><p><code>?</code> 한자리의 문자열</p>
</li>
</ul>
<hr>
<h1 id="예시">예시</h1>
<p>glob와 <code>for</code> 문을 이용하여 판다스의 데이터프레임을 한번에 불러올 수 있다.</p>
<pre><code class="language-python">import pandas as pd
from glob import glob
file_names = glob(&quot;생활이동_자치구_202212/*.csv&quot;) #1
total = pd.DataFrame() #3.1

for file_name in file_names:
    temp = pd.read_csv(file_name, encoding=&#39;cp949&#39;) #2
    total = pd.concat([total, temp]) # 3.2</code></pre>
<ul>
<li><p>#1
생활이동_자치구_202212 디렉토리에 있는 <code>.csv</code> 확장자를 가진 모든 파일들을 읽어온 뒤, <code>file_names</code> 라는 변수에 <code>list</code> 로 저장시켜준다.</p>
</li>
<li><p>#2
<code>file_name</code> 의 요소로 <code>for</code> 문을 작성하여 <code>read_csv</code> 메소드를 이용해 csv 파일을 읽은 뒤, temp 변수에 저장한 뒤,</p>
</li>
<li><p>#3
미리 저장한 빈 데이터 프레임인 <code>total</code> 변수에 <code>concat()</code> 함수를 이용하여 세로로 합쳐주는 행위를 <code>for</code> 으로 반복했다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬 개념정리 - 매개변수와 전달인자, syntax 약속]]></title>
            <link>https://velog.io/@dalbong_97/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EC%99%80-%EC%A0%84%EB%8B%AC%EC%9D%B8%EC%9E%90-syntax-%EC%95%BD%EC%86%8D</link>
            <guid>https://velog.io/@dalbong_97/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EC%99%80-%EC%A0%84%EB%8B%AC%EC%9D%B8%EC%9E%90-syntax-%EC%95%BD%EC%86%8D</guid>
            <pubDate>Mon, 20 Feb 2023 11:19:49 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dalbong_97/post/ed5fd78f-5a0b-4d0c-aa31-368fdf67ed4f/image.png" alt="">
<a href="https://coconut-emoji.tistory.com/">이미지출처</a></p>
<hr>
<h1 id="함수">함수</h1>
<p>매개변수와 전달인자에 대해 알아보기 이전에 함수의 구조에대하여 먼저 알아야한다.
함수의 구조는 보통 이렇게 생겼다.</p>
<pre><code>funcname(parametername1, parametername2...)</code></pre><p><code>funcname</code> 는 함수의 이름이고, <code>parametername</code> 들은 함수의 <span style="color:aqua">매개변수(parameter)</span>이다.
함수는 매개변수를 갖지 않거나 1개 이상 가지기도 한다. 
또한 매개변수는 각각의 이름을 가진다. (변수니까 당연한 건가?)</p>
<hr>
<h1 id="매개변수와-전달인자">매개변수와 전달인자</h1>
<p>위를 참고하면 매개변수는 함수의 <span style="color:aqua">입력값</span>과 같은 역할을 한다는 것을 알았을 것이다.
그럼 전달인자는 무엇일까?</p>
<p><span style="color:rgb(255, 0, 255)">전달인자(arguments)</span>는 매개변수에 data를 넣은 것을 의미한다.</p>
<p><code>arguments</code> : 함수로 전달되어 호출(call)되는 데이터
<code>parameter</code> : 그 데이터의 이름</p>
<p>이라고 설명을 할 수 있겠다.</p>
<p>이해를 돕기 위해 간단한 함수를 만든 뒤 예시를 들어 설명하겠다.
한국어 이름을 입력받아서 한글자씩 출력해주는 함수이다.</p>
<pre><code class="language-python">def name_spliter(name) :
    print(name[0])
    print(name[1])
    print(name[2])</code></pre>
<p>엄준식을 함수의 입력값으로 작성하면,</p>
<pre><code class="language-python">name_spliter(&#39;엄준식&#39;)</code></pre>
<pre><code>엄
준
식</code></pre><p>이런 결과가 뜰 것이다.
<code>name</code> 이 함수의 <code>parameter</code> 가 되는 것이고,
<code>엄준식</code> 이 함수의 <code>arguments</code> 가 되는 것이다.</p>
<hr>
<h1 id="위치인자와-키워드인자">위치인자와 키워드인자</h1>
<p>함수의 <code>arguments</code> 는 두 가지 방법으로 작성할 수 있는데,
하나는 위치인자이고 다른 하나는 키워드인자이다.</p>
<ul>
<li><p>위치인자(positional arguments)
전달인자(arguments)를 매개변수(parameter)의 위치와 일치시키는 것.
위치값이 기준이므로 입력순서가 바뀌면 함수가 원하는데로 작동하지 않을 수 있다.
함수의 매개변수의 수가 적거나, 전부 작성해야 하는 경우에 사용한다.</p>
</li>
<li><p>키워드인자(keyword arguments)
매개변수(parameter)에 등호를 이용하여 전달인자(arguments)를 할당하는 것.
작성하기 번거로운 단점이 있으나, 입력 순서에 영향을 받지 않는다.
함수의 매개변수의 수가 많거나 일부만 작성해도 되는 경우에 사용한다.</p>
</li>
</ul>
<hr>
<h1 id="syntax-약속">syntax 약속</h1>
<p>블로그에 작성된 여러 함수와 메소드의 syntax들을 보면 어떤 매개변수는 위치인자를 사용하고, 어느것은 키워드 인자를 사용하기도 한다. 이거진짜 상당히 햇갈림
이에 따른 혼란을 줄이기 위해 파라미터 설명 옆에 위치인자로 이용되는 매개변수는 <code>L</code>, 키워드인자로 사용되는 매개변수는 <code>K</code> 로 작성할 예정이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[pandas 개념정리]]></title>
            <link>https://velog.io/@dalbong_97/pandas-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@dalbong_97/pandas-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 20 Feb 2023 01:19:31 GMT</pubDate>
            <description><![CDATA[<p><a href="https://coconut-emoji.tistory.com/">이미지출처</a>
<a href="https://velog.io/@dalbong_97/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EC%99%80-%EC%A0%84%EB%8B%AC%EC%9D%B8%EC%9E%90-syntax-%EC%95%BD%EC%86%8D">syntax 약속</a>
본 포스팅은 KT 에이블스쿨 교육내용을 바탕으로 제 나름대로 정리하여 작성하였습니다</p>
<hr>
<h1 id="pandas란">Pandas란?</h1>
<p><span style="color:aqua">데이터프레임</span>을 처리하기 위해 이용하는 python의 라이브러리 중 하나이다.
이 포스팅에서도 기능들에 대해 설명하겠지만, 당연히 부족하므로 자세한건 <a href="https://pandas.pydata.org/docs/index.html">링크</a>를 참고하자.</p>
<h2 id="데이터프레임">데이터프레임?</h2>
<p>행과 열의 인덱스가 존재하고 인덱스에 맞게 데이터들이 존재하는 데이터구조이다.
한마디로 그냥 엑셀같은거라고 보면 이해가 빠를 것이다.
직접 만들수도 있지만 보통 excel, csv, DB 등에서 읽어온다.</p>
<h2 id="series">series?</h2>
<p>인덱스와 값으로 나타내어지는 열이 &#39;하나&#39;인 자료형은 따로 <code>series</code> 자료형이라고 부른다.</p>
<hr>
<hr>
<h1 id="1-데이터프레임-생성">1. 데이터프레임 생성</h1>
<h2 id="1-1-라이브러리-불러오기">1. 1. 라이브러리 불러오기</h2>
<p>데이터프레임을 이용하기 위해서는 pandas 라이브러리를 <code>import</code> 해주어야 한다.
일반적으로 <code>as</code> 를 이용해여 &#39;pd&#39;라는 별칭을 주어 사용한다.</p>
<pre><code class="language-python">import pandas as pd</code></pre>
<p>앞으로 밑에 나오는 코드들은 전부 pandas를 <code>import</code> 했다는 가정 하에 작성한 것이다.</p>
<hr>
<h2 id="1-2-데이터프레임-직접-만들기">1. 2. 데이터프레임 &#39;직접&#39; 만들기</h2>
<p>데이터프레임을 구성하는 3가지 요소로 구성되어 있다.</p>
<ul>
<li>열</li>
<li>행</li>
<li>데이터</li>
</ul>
<p><code>pd.DataFrame()</code> 함수에 위 세가지 요소를 넣어서 데이터프레임을 만들 수 있다.
열과 행 이름은 생략할 수 있으며, 생략시 순서에 기번한 정수로 인덱싱된다.</p>
<pre><code class="language-python">syntax
df = pd.dataFrame(data, index, columns)</code></pre>
<ul>
<li><p><code>df</code> 데이터프레임 이름</p>
</li>
<li><p><code>index</code> 열 이름 <code>L</code> <code>K</code></p>
</li>
<li><p><code>columns</code> 행 이름 <code>L</code> <code>K</code></p>
</li>
</ul>
<h3 id="리스트로-만들기">리스트로 만들기</h3>
<ul>
<li><p>1차원 리스트
1개의 <span style="color:aqua">열</span>을 가진 데이터프레임이 생성된다.</p>
</li>
<li><p>2차원 리스트
안쪽에 중첩되어있는 리스트가 <span style="color:aqua">행</span>으로 생성된다.
예시</p>
</li>
</ul>
<pre><code class="language-python"># 2차원 리스트 만들기
stock = [[94500, 92100, 92200, 92300],
         [96500, 93200, 95900, 94300],
         [93400, 91900, 93400, 92100],
         [94200, 92100, 94100, 92400],
         [94500, 92500, 94300, 92600]]

# 데이터프레임 만들기
df = pd.DataFrame(stock)

# 확인
df</code></pre>
<table>
<thead>
<tr>
<th></th>
<th>0</th>
<th>1</th>
<th>2</th>
<th>3</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>94500</td>
<td>92100</td>
<td>92200</td>
<td>92300</td>
</tr>
<tr>
<td>1</td>
<td>96500</td>
<td>93200</td>
<td>95900</td>
<td>94300</td>
</tr>
<tr>
<td>2</td>
<td>93400</td>
<td>91900</td>
<td>93400</td>
<td>92100</td>
</tr>
<tr>
<td>3</td>
<td>94200</td>
<td>92100</td>
<td>94100</td>
<td>92400</td>
</tr>
<tr>
<td>4</td>
<td>94500</td>
<td>92500</td>
<td>94300</td>
<td>92600</td>
</tr>
<tr>
<td>### 딕셔너리로 만들기</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><code>key</code> 와 <code>value</code> 로 구성되어있으므로, <code>key</code> 가 <code>rownames</code>이 되고, <code>value</code> 가 <code>data</code>가 된다.</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>***</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>## 1. 3. CSV 파일 읽어오기</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>### CSV 파일이란?</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><span style="color:aqua">C</span>omma <span style="color:aqua">S</span>eperated <span style="color:aqua">V</span>alues</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>단어 뜻 그대로 쉼표로 값을 구분한 데이터를 의미한다. 사실 쉼표가 아니더라도 특정한 구분자를 가지고 데이터들을 구분해놨으면 모두 CSV라고 부르는 것 같다.</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><a href="https://velog.io/@dalbong_97/glob">파일 여러개 읽기</a></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>### 읽어오기</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>```python</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>syntax</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>df = pd.read_csv(path)</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>```</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>주요 <code>parameter</code></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>* <code>path</code> <code>L</code> 데이터 경로</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>데이터를 읽어올 경로이다. 로컬 위치가 될 수도 있고, 링크가 될 수도 있다.</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>* <code>sep</code> <code>K</code> 구분자를 지정. (기본값:콤마)</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<ul>
<li><code>header</code> <code>K</code> 헤더가 될 행 번호. (기본값:0)
일반적인 데이터프레임에서는 맨 위의 행이 헤더이므로 건들 일을 많이 없을 것이다.</li>
<li><code>index_col</code> <code>K</code> <span style="color:aqua">행</span> 인덱스가 될 <span style="color:aqua">열</span>을 지정. (기본값:<code>False</code>)
가끔 맨 앞의 열이 숫자로 이루어져 있으면 자동으로 인덱스가 되는 경우가 있으므로 <code>False</code> 를 직접 써줘야 하는 경우가 있다.</li>
<li><code>names</code> <code>K</code>열 이름 지정
문자열로 이루어진 <code>list</code> 를 이용하여 열 이름을 지정해 줄 수 있다.</li>
<li><code>endoing</code> <code>K</code> 인코딩 방식
<span style="color:aqua">한글이 포함된 파일을 읽을때에는 오류가 발생하므로</span> <code>encoding=&#39;CP949&#39;</code> 를 입력해주자.</li>
</ul>
<hr>
<hr>
<h1 id="2-데이터프레임-탐색">2. 데이터프레임 탐색</h1>
<blockquote>
<p>데이터터프레임의 데이터를 알아과는 과정.</p>
</blockquote>
<h2 id="2-1-데이터-확인하기">2. 1. 데이터 확인하기</h2>
<p>데이터를 확인할 수 있는 다양한 메소드드와 속성들이 있다. 하나하나 확인해보자.</p>
<h3 id="데이터-확인">데이터 확인</h3>
<p>jupyter lab 이나 jupyter notebook 혹은 그를 기반으로 하는 google colab 같은 경우에는 변수명을 입력한 뒤 셀을 실행시키면 볼 수 있다.
하지만 이 경우에는 가장 밑에 있는 하나의 변수만 볼 수 있으므로, <code>print()</code> 함수를 이용하여 출력하거나, <code>display()</code> 함수를 이용하여 데이터프레임 모양으로 출력할 수 있다.</p>
<h3 id="상위-하위-데이터">상위, 하위 데이터</h3>
<ul>
<li><code>head(n)</code> <code>tail(n)</code> 메소드
n에는 정수가 들어가며 확인할 데이터의 갯수를 지정할 수 있다. 기본값은 5이다.<h3 id="데이터-크기">데이터 크기</h3>
</li>
<li><code>shape</code> 속성
(행갯수, 열갯수)의 <code>tuple</code> 형태로 데이터를 반환해준다.
행갯수 열갯수를 따로따로 알고싶다면 [0], [1] 등 인덱싱을 해주면 된다.<pre><code># 행만 확인하고 싶을 때
df.shape[0]
</code></pre></li>
</ul>
<h1 id="열만-확인하고-싶을-때">열만 확인하고 싶을 때</h1>
<p>df.shape[1]</p>
<pre><code>### 행, 열 정보
* `index` 속성
인덱스의 갯수를 알려준다.

* `values` 속성
행과 열을 제외한 값들을 전부 표시해준다. 데이터를 행별로 묶은 2차원 `list`로 반환해준다.

* `colunms` 속성
열의 값들과 데이터 타입을 표시해준다.
### 자료형 확인
`dtypes` 속성
열의 자료형을 알려준다. 문자열 데이터는 `str` 대신 &lt;span style=&quot;color:aqua&quot;&gt;object&lt;/span&gt; 라고 표현해줌을 유의하자

* `info()` 메소드
열별 자료형, 데이터 갯수(결측지가 아닌), 열의 자료형별 갯수, 메모리 사용량 등을 알려준다.
사실상 `.dtypes` 에서 알려주는 것을 포함하여 더 많은 정보를 알려준다.
### 기술 통계
`describe()` 메소드
데이터의 기술 통계(Descriptive Statics)를 나타내준다.
* count : 갯수
* mean : 평균
* std : 표준편차
* 25%, 50%, 75% : 사분위값
* max : 최댓값

`describe().T` 를 하면 행과 열을 뒤집어서 보여준다.
***
***
# 3. 데이터프레임 조회
## 3. 1. 데이터 정렬
`sort_values()` 메소드를 이용하여 특정 열을 기준으로 정렬할 수 있다. &lt;span style=&quot;color:aqua&quot;&gt;&#39;s&#39;&lt;/span&gt; 에 유의하도록 하자..
```python
syntax
df.sort_values(by, ascending, inplace)</code></pre><ul>
<li><p><code>df</code> 데이터프레임 이름</p>
</li>
<li><p><code>by</code> <code>L</code> <code>K</code> 기준
기준으로 삼을 열 이름</p>
</li>
<li><p><code>ascending</code> <code>K</code> 차순 설정(기본값 :<code>True</code>)
<code>True</code> 입력시 오름차순으로 정렬해준다. 내림차순은 <code>False</code></p>
</li>
<li><p><code>inplace</code> <code>K</code> 반영여부</p>
</li>
</ul>
<p><code>list</code> 를 이용해 복합적으로 정렬할 수도 있다.
앞쪽 index기준으로 정렬을 한 뒤, 같은 값이 나오면 그 다음의 index 기준으로 정렬해준다.</p>
<hr>
<h2 id="3-2-데이터-집계">3. 2. 데이터 집계</h2>
<h3 id="고유값과-최빈값-확인">고유값과 최빈값 확인</h3>
<ul>
<li><code>unique()</code> 메소드<pre><code>df[rowname].unique()</code></pre>특정 열의 고유값들을 배열로 반환해준다.</li>
<li><code>nunique()</code> 메소드<pre><code>df[rowname].nunique()</code></pre>특정 열의 고유값의 <span style="color:aqua">개수</span>를 <code>int</code>로 반환해준다.</li>
<li><code>value_counts()</code> 메소드<pre><code>df[rowname].value_counts(dropna)</code></pre>특정 열의 고유값과, 갯수를 <code>series</code> 형태로 반환해준다.
<code>dropna</code> 옵션을 <code>False</code> 로 지정하면 결측치(NaN값)도 카운트해주며,
기본값은 <code>True</code> 이다.</li>
</ul>
<p>아래의 방법으로 <span style="color:aqua">고유값이 2개 이상인 자료들</span>만 확인할 수도 있다.</p>
<pre><code class="language-python">df[rowname].value_counts(dropna).loc[lambda x :x&gt;1]</code></pre>
<ul>
<li><p><code>mode()</code> 메소드 </p>
<pre><code>df[rowname].mode()</code></pre><p>지정한 열에서의 주어진 값들 중 가장 자주 관측되는 값을 최빈값이라 한다.
관측횟수가 같은 경우도 있으므로 유일한 값이 아닐 수 있다.</p>
<h3 id="기본-통계">기본 통계</h3>
<pre><code class="language-python">df.x(axis)</code></pre>
</li>
<li><p><code>df</code> 데이터명
특정 열(들), 행(들)이 될 수도 있고, 데이터프레임 전체가 될 수도 있다.</p>
</li>
<li><p><code>axis</code> 축, 입력값으로 0과 1이 있다.
0이 행, 1이 열인데 조금 혼동될 수 있는 부분이 있다.
모든 행을 더해야 하므로 <code>axis=0</code> 을 입력하면 <span style="color:aqua">세로</span>로 집계되며,
모든 열을 더해야 하므로 <code>axis=1</code> 을 입력하면 <span style="color:rgb(255, 0, 255)">가로</span>로 집계됨을 유의하자</p>
</li>
<li><p><code>x</code> 통계 메소드들
합 <code>sum()</code>, 최댓값 <code>max()</code>, 최솟값 <code>min()</code>, 평균값 <code>mean()</code>, 중앙값 <code>median()</code>, 갯수 <code>count()</code>, 고유값 <code>value_counts()</code> 등이 있다.</p>
</li>
</ul>
<hr>
<h2 id="3-3-행-열-조회">3. 3. 행, 열 조회</h2>
<p>행과 열을 조회할 때에는 기본적으로 <code>df.loc[row, column]</code> 형태로 조회한다.
<code>iloc</code>를 이용해서 열을 조회할 수도 있다.
<code>loc</code> 안에 조건문이 들어간다 생각하면 편하다.
한번에 잘 정리된 사진으로 대체한다.
<img src="https://velog.velcdn.com/images/dalbong_97/post/db24526b-17b4-4e51-a339-36a5f1941297/image.png" alt="">
얇은 코드가 원래 형태이며, 조건에 따라 생략이 가능하기에 일반적으로는 굵게 표시된 코드 형태로 조회한다.</p>
<hr>
<h2 id="3-4-문자열이-포함된-데이터-조회">3. 4. 문자열이 포함된 데이터 조회</h2>
<p><code>object</code> 로 된 데이터들을 대상으로 <code>.str.contains()</code> 메소드를 이용하여 특정 문자열이 포함된 데이터들을 조회할 수 있다.</p>
<pre><code class="language-python">syntax
df[df[&#39;colname&#39;].str.contains(&#39;str&#39;)]</code></pre>
<p><code>&#39;str&#39;</code> 부분에 조회하고싶은 문자열을 작성하면 된다.</p>
<hr>
<hr>
<h1 id="4-데이터프레임-집계">4. 데이터프레임 집계</h1>
<h2 id="groupby">groupby()</h2>
<p><code>groupby()</code> 메소드를 이용해 데이터를 집계할 수 있다.
범주값인 데이터를 이용하여 데이터프레임을 범주화해서 나타내는데 용이하며, 통계 메소드들(3. 2. 2. 참고)를 이용하여 범주별 통계값을 표시하는데 사용된다.</p>
<pre><code class="language-python">syntax
df.groupby(by, as_index)[&#39;colname&#39;].x</code></pre>
<ul>
<li><p><code>by</code> <code>L</code> <code>K</code> 집계기준 열
<code>list</code> 를 이용해 여러 열을 집계기준으로 세울 수 있다.</p>
</li>
<li><p><code>as_index</code> <code>K</code> 집계 기준 인덱스(기본값 : <code>False</code>)
집계기준을 인덱스로 사용할지 여부를 설정할 수 있다. <code>True</code> 로 설정시 집계 기준열의 값들이 인덱스로 설정된다. <code>False</code> 면 정수 인덱스로 설정된다.</p>
</li>
<li><p><code>col</code> 집계할 열
&#39;집계 기준&#39;에 따라 집계할 열. <code>list</code> 로 여러 열을 집계할 수 있다.
집계할 열을 하나만 작성시 <code>series</code> 자료형으로 반환되므로 <code>[]</code> 를 하나 더 작성하여 데이터프레임으로 반환하도록 하자.(권장)
또한, 생략도 할 수 있으며 생략 시 모든 열에 대하여 집계한다.</p>
</li>
<li><p><code>x</code> 통계 메소드들
범주별로 집계한 데이터들을 통계처리 할 수 있다. (3. 2. 2. 참고)</p>
</li>
</ul>
<p><code>agg()</code> 메소드를 이용하여 여러 열을 다양한 각각의 통계 메소드로 집계할 수 있다.</p>
<pre><code class="language-python"># example
pass1 = passes.groupby(&#39;team1&#39;, as_index = False).agg({&#39;passes team1&#39;:&#39;sum&#39;,&#39;passes completed team1&#39;:&#39;sum&#39;})</code></pre>
<hr>
<h2 id="pivot_table">pivot_table()</h2>
<p><code>pivot_table()</code> 메소드를 이용해도 집계가 가능하다.
<code>group()</code> 메소드와 다른 점은 집계기준을 열과 행으로 설정할 수 있다는 점에 있다.</p>
<pre><code class="language-python">syntax
df.pivot_table(index, columns, values, aggfunc)</code></pre>
<ul>
<li><p><code>index</code> <code>K</code> 집계기준(행)
집계기준이 되는 행을 만들 수 있다.</p>
</li>
<li><p><code>columns</code> <code>K</code> 집계기준(열)
집계기준이 되는 열을 만들 수 있다.</p>
</li>
<li><p><code>values</code> <code>K</code> 집계값
집계 대상이 되는 값이다.</p>
</li>
<li><p><code>aggfunc</code> <code>K</code> 통계값
집계 대상을 어떤 통계 방법으로 집계할지 정하는 매개변수이다. 3. 2. 의 통계 메소드들을 참고하여 <code>str</code> 로 전달인자를 입력하면 된다. ex) <code>aggfunc = &#39;sum&#39;</code> </p>
</li>
</ul>
<hr>
<hr>
<h1 id="5-데이터프레임-시각화">5. 데이터프레임 시각화</h1>
<p>pands에서 기본적으로 제공하는 시각화를 사용하거나 matplotlib을 사용한다.</p>
<ul>
<li><code>plot()</code> 메소드<pre><code>df.plot(kind)</code></pre><code>kind</code> 그릴 그래프의 종류를 지정할 수 있다. &#39;line&#39;, &#39;bar&#39;, &#39;hist&#39; 등등이 있다.</li>
<li>matplotlib<pre><code class="language-python">import matplotlib.pyplot as plt
</code></pre>
</li>
</ul>
<h1 id="고해상도-시각화">고해상도 시각화</h1>
<p>%config InlineBackend.figure_format=&#39;retina&#39;</p>
<pre><code>자세한 것은 matplotlib 공식 사이트의 [Quick start guide](https://matplotlib.org/stable/tutorials/introductory/quick_start.html)와 [Plot types](https://matplotlib.org/stable/plot_types/index.html)를 참고하자.
***
***
# 6. 데이터프레임 변경
## 6. 1. 열 이름 변경
`rename()` 메소드와 `columns` 속성을 이용하여 열의 이름을 변경할 수 있다.

`columns` 속성
```python
syntax
df.columns = [&#39;colname1&#39;, &#39;colname2&#39;, ... ]</code></pre><p>모든 열을 바꾸는 기능이므로 데이터프레임의 모든 열을 작성해야 하며,
변경을 원하지 않는 열은 기존의 이름을 작성하면 된다.</p>
<p><code>rename()</code> 메소드</p>
<pre><code class="language-python">syntax
df.rename(columns = {&#39;colname1&#39; : &#39;colname2&#39;, ...}, inplace)</code></pre>
<ul>
<li><p><code>colname1</code> 기존 열 이름</p>
</li>
<li><p><code>colname2</code> 바꿀 열 이름</p>
</li>
<li><p>메소드 이므로 반영을 위해 변수에 할당해주거나 <code>inplace = True</code> 해주자.</p>
</li>
</ul>
<hr>
<h2 id="6-2-열-추가">6. 2. 열 추가</h2>
<p>기존 데이터에서 계산된 결괏값을 저장해야 할 경우에 사용된다.</p>
<p>오른쪽에 추가하기</p>
<pre><code class="language-python">syntax
df[&#39;colname&#39;] = df[&#39;col1&#39;] (operator) df[&#39;col2&#39;]</code></pre>
<ul>
<li><code>colname</code> 추가할 열의 이름</li>
<li><code>operator</code> 계산을 위한 연산자 +, -, /, 같은거...</li>
</ul>
<p>원하는 위치에 추가하기 - <code>insert()</code> 메소드 </p>
<pre><code class="language-python">syntax
df.insert(indexnum, &#39;colname&#39;, df[&#39;col1&#39;] (operator) df[&#39;col2&#39;])</code></pre>
<ul>
<li><code>indexnum</code> 추가할 열의 위치(<code>int</code> 값), 해당하는 인덱스의 <span style="color:aqua">앞</span>에 열이 추가된다.</li>
</ul>
<hr>
<h2 id="6-3-행-열-삭제">6. 3. 행, 열 삭제</h2>
<p><code>drop()</code> 메소드를 사용하여 삭제할 수 있다.</p>
<pre><code class="language-python">syntax
df.drop(delete, axis, inplace)</code></pre>
<ul>
<li><p><code>delete</code> <code>L</code> 삭제할 행 또는 열
열 이름이 들어갈 수도 있고, 행 또는 열의 인덱스 번호가 들어갈 수도 있다.
또한 <code>list</code> 를 이용하여 한번에 여러 개를 삭제할 수 있다.</p>
</li>
<li><p><code>axis</code> <code>K</code>삭제할 축, 기본값 = 0
행을 삭제할지 열을 삭제할지 정해야 한다. 0은 행을 삭제하고, 1은 열을 삭제한다.</p>
</li>
<li><p><code>inplace</code> <code>K</code>
메소드이므로 <code>True</code> 를 이용해 반영해주어야 한다.</p>
</li>
</ul>
<hr>
<h2 id="6-4-인덱스-재설정">6. 4. 인덱스 재설정</h2>
<p><code>set_index()</code> 메소드를 이용하여 기존 열을 인덱스로 설정 할 수 있다.</p>
<pre><code class="language-python">syntax
df.set_index(&#39;col&#39;, inplace)</code></pre>
<ul>
<li><p><code>col</code> 인덱스로 설정할 열이름 </p>
</li>
<li><p><code>inplace</code> <code>K</code>
메소드이므로 반영하기위해서는 <code>True</code> 해주어야 한다.</p>
</li>
<li><p>열 이름이 인덱스의 이름으로 적용된다.
딱히 사용할 일이 없으므로 <code>df.index.name = None</code> 로 삭제해준다.</p>
</li>
</ul>
<p><code>reset_index()</code> 메소드를 이용하여 행번호에 기반한 정수값으로 인덱스를 초기화 할 수 있다.</p>
<pre><code class="language-python">syntax
df.reset_index(drop)</code></pre>
<ul>
<li><code>drop</code> <code>K</code> 이전 인덱스 버림 여부
인덱스를 초기화 하기 전에 기존에 있던 인덱스를 버릴지 말지 선택하는 옵션이다.
기본값은 <code>False</code> 이며, 인덱스를 일반 열로 가져온다. <code>True</code> 시 버린다.</li>
</ul>
<p>기존의 인덱스를 일반 열로 가져왔을 때(<code>drop=False</code>) 가져온 열의 이름은 index 가 되니 <code>rename()</code> 메소드를 이용해 바꿔주자.</p>
<h3 id="6-4-1-multi-index-삭제">6. 4. 1. multi index 삭제</h3>
<p><code>droplevel()</code> 메소드를 이용하여 지울 수 있다. <code>int</code> 값으로 인덱스의 인덱스에 접근(말이좀 이상하다) 하거나. 삭제하고싶은 이름을 지정하여 삭제할 수 있다. 보통 0번째(맨위) 꺼를 삭제하는데 쓰는 것 같다.
데이터의 columns 속성에 droplevel() 메서드를 적용한 columns 을 할당해줌으로써 적용한다.
다음은 예시코드이다.</p>
<pre><code class="language-python"># Creating a sample MultiIndex DataFrame with multi-indexed columns
data = {(&#39;A&#39;, &#39;Sub1&#39;): [1, 2, 3, 4], (&#39;A&#39;, &#39;Sub2&#39;): [5, 6, 7, 8], (&#39;B&#39;, &#39;Sub1&#39;): [9, 10, 11, 12], (&#39;B&#39;, &#39;Sub2&#39;): [13, 14, 15, 16]}
index = pd.Index([&#39;Row1&#39;, &#39;Row2&#39;, &#39;Row3&#39;, &#39;Row4&#39;], name=&#39;Index&#39;)
columns = pd.MultiIndex.from_tuples([(&#39;A&#39;, &#39;Sub1&#39;), (&#39;A&#39;, &#39;Sub2&#39;), (&#39;B&#39;, &#39;Sub1&#39;), (&#39;B&#39;, &#39;Sub2&#39;)], names=[&#39;Category&#39;, &#39;Subcategory&#39;])
df = pd.DataFrame(data, index=index, columns=columns)

print(&quot;Original DataFrame:&quot;)
print(df)
print(&quot;\n&quot;)

# Dropping the &#39;Subcategory&#39; level from the columns
df_dropped = df.copy()
df_dropped.columns = df_dropped.columns.droplevel(&#39;Subcategory&#39;)

print(&quot;DataFrame after dropping &#39;Subcategory&#39; level:&quot;)
print(df_dropped)</code></pre>
<p>실행값</p>
<pre><code>Original DataFrame:
Category       A         B     
Subcategory Sub1 Sub2 Sub1 Sub2
Index                          
Row1           1    5    9   13
Row2           2    6   10   14
Row3           3    7   11   15
Row4           4    8   12   16


DataFrame after dropping &#39;Subcategory&#39; level:
Category  A  A   B   B
Index                 
Row1      1  5   9  13
Row2      2  6  10  14
Row3      3  7  11  15
Row4      4  8  12  16</code></pre><hr>
<h2 id="6-5-범주값-변경매핑">6. 5. 범주값 변경(매핑)</h2>
<p><code>map()</code> 메소드와 <code>replace()</code> 메소드를 이용하면 범주형 값을 다른 값으로 바꿀 수 있다.
문법은 똑같기에 한번에 작성하겠다.</p>
<pre><code class="language-python">syntax
df.x({value1:value2})</code></pre>
<ul>
<li><p><code>x</code> : <code>map</code> or <code>replace</code></p>
</li>
<li><p><code>value1</code> 교체 대상</p>
</li>
<li><p><code>value2</code> 교체 값</p>
</li>
</ul>
<p>그럼 두 메소드 사이엔 무슨 차이가 있을까?</p>
<ul>
<li><p><code>map()</code> 
매핑되지 못한 값들을 <code>NaN</code> 값으로 변경</p>
</li>
<li><p><code>replace()</code> 
매핑되지 못한 값들을 그대로 냅둠, 전제 데이터 프레임 대상으로 매핑이 가능</p>
</li>
</ul>
<hr>
<h2 id="6-6-범주값-만들기데이터-이산화">6. 6. 범주값 만들기(데이터 이산화)</h2>
<p>연속값을 범주값으로 표현하는 과정을 이산화(Discretizatin) 이라고 한다.
데이터의 심도있는 분석과 단순화를 할 수 있어 머신러닝 성능 향상에 도움이 된다.
<code>pd.cut()</code> 함수와 <code>pd.qcut()</code> 함수를 이용하여 할 수 있다.</p>
<p><code>pd.cut()</code> 함수
데이터의 크기를 기준으로 구간을 나누고 싶을 때 사용한다.</p>
<pre><code class="language-python">syntax
pd.cut(df[column], bins. labels)

# example
bin1 = [-np.inf, 2.0, 2.9, 3.5625, np.inf]
tip[&#39;group1&#39;] = pd.cut(df[&#39;score&#39;], bins=bin1, labels=list(&#39;abcd&#39;))</code></pre>
<ul>
<li><p><code>bins</code> <code>K</code> 나눌 구간
<code>int</code> 혹은 <code>int</code> 로 이루어진 <code>list</code> 가 들어간다.
<code>int</code> 를 넣은 경우 범위를 자동으로 나누어 준다. (최댓값-최솟값/n) 으로 추정
리스트 사용 예제는 위의 example 을 참고하자.</p>
</li>
<li><p><code>labels</code> <code>K</code> 범위의 이름
<code>list</code> 로 나타낸다.</p>
</li>
</ul>
<p><code>pd.qcut()</code> 함수
갯수를 기준으로 구간을 나눌 때 사용한다. 구간의 갯수를 지정하면 자동으로 동일한 갯수를 갖는 구간을 만들어준다.</p>
<pre><code class="language-python">syntax
pd.qcut(df[column], bins, labels)</code></pre>
<ul>
<li><code>bins</code> <code>K</code> 나눌 구간의 &#39;갯수&#39;
<code>int</code> 값만 들어갈 수 있다.</li>
</ul>
<p><code>bins</code> 가 4인 경우 4분위수를 기준으로 구간을 나눈 것과 같은 결과가 나온다.
즉, <code>cut()</code> 함수에서도 4분위수를 기준으로 구간을 입력하면 같은 결과를 확인할 수 있다.</p>
<hr>
<h2 id="6-7-자료형-변경">6. 7. 자료형 변경</h2>
<h3 id="날짜-자료형">날짜 자료형</h3>
<p>CSV 파일에서 날짜 자료형을 가진 데이터는 <code>object</code> 로 읽어오게 된다.
전처리를 용이하게 하기 위해 <code>pd.to_datetime()</code> 함수를 이용해 날짜 자료형으로 변경해 줄 필요가 있다.</p>
<pre><code class="language-python">syntax
pd.to_datetime(df[&#39;colname&#39;])</code></pre>
<p>괄호 안에 자료형을 바꾸고 싶은 데이터프레임의 열을 지정하면 된다.
날짜 자료형인 열에서 추가로
<code>.dt.year</code>
<code>.dt.month</code>
<code>.dt.day</code>
<code>.dt.time</code>
<code>.dt.date</code>
<code>.dt.dayofweek</code>
등을 이용해 년과 월을 추출할 수 있다.</p>
<h3 id="다른-자료형">다른 자료형</h3>
<p>날짜를 제외한 다른 자료형들은 <code>astype()</code> 메소드를 이용하여 다른 자료형으로 변경할 수 있다.</p>
<pre><code class="language-python">syntax
df[&#39;colname&#39;].astype(type)
혹은
df.astype({&#39;colname&#39;};&#39;type&#39;)</code></pre>
<p>열이름 없이 데이터프레임만 되는지는 해보진 않았다.
아마 보통은 특정 열의 자료형만 바꾸지 않을까 싶다.
<code>type</code> <code>L</code> 에 원하는 자료형을 넣으면 된다.(<code>str</code> 로 안넣어도 됨) 단, 두번째 syntax는 <code>str</code> 로 넣어야 한다.</p>
<p>또한 <code>to_numeric()</code> 함수를 이용하여, <code>int</code> 나 <code>float</code> 지정 없이 변경할 수도 있다!</p>
<hr>
<h2 id="6-8-중복값-제거하기">6. 8. 중복값 제거하기</h2>
<p>시계열 데이터에 날짜 부분에 값이 중복되어 들어가 있는 경우가 더럿 있다.
3. 2. 에서 설명한 <code>value_counts()</code> 메소드 를 통해 중복값을 집계할 수 있으며,
집계된 데이터들을 <code>drop_duplicates()</code> 메소드를 통해 제거할 수 있다.</p>
<pre><code class="language-python">syntax
df.drop_duplicates(inplace, keep, subset)</code></pre>
<ul>
<li><p><code>inplace</code> <code>K</code> 반영여부
메소드이므로 반영하기 위해서는 <code>True</code> 를 해줘야한다.</p>
</li>
<li><p><code>keep</code> <code>K</code> 남길 데이터 (기본값 : <code>keep=first</code>)
중복된 데이터 중 남길 데이터를 선택할 수 있는 옵션이다.
<code>&#39;first&#39;</code> 첫 번째 데이터를 남김
<code>&#39;last&#39;</code> 마지막 데이터를 남김
<code>False</code> 다 지움</p>
</li>
<li><p><code>subset</code> 삭제기준이 될 열
해당 열의 데이터가 같으면 데이터가 제거된다.
열 이름을 <code>str</code> 로 쓰거나, 열의 index 를 작성하면 된다.
작성하지 않으면 해당 행(row)의 데이터가 모두 같아야 제거된다.</p>
</li>
</ul>
<hr>
<h2 id="6-9-데이터-슬라이싱">6. 9. 데이터 슬라이싱</h2>
<p>데이터가 <code>object</code> 자료형인 경우 <code>.str.slice()</code> 메소드를 이용하여 슬라이싱이 가능하다.</p>
<pre><code class="language-python">syntax
df[&#39;colname&#39;].str.slice(start, stop)</code></pre>
<ul>
<li><p><code>start</code> <code>K</code> 슬라이싱을 시작할 인덱스, <code>int</code>값이다.</p>
</li>
<li><p><code>stop</code> <code>K</code> 슬라이싱을 끝낼 인덱스, <code>int</code> 값이다.</p>
</li>
</ul>
<p><code>range()</code> 함수와 유사하게 끝나는 값 -1 까지 카운트되는것에 유의하자</p>
<hr>
<hr>
<h1 id="7-결측치-처리하기">7. 결측치 처리하기</h1>
<p>정확한 데이터 분석을 위해 결측치 제거는 필수이다.</p>
<h2 id="7-1-결측치-확인">7. 1. 결측치 확인</h2>
<p><code>info()</code> 메소드로 확인
인덱스의 갯수와 null 이 아닌 자료형의 갯수를 알려주므로 두 값에 차이로 결측치 존재 여부와 갯수를 구할 수 있다.</p>
<p><code>isnull()</code>, <code>notnull()</code> 메소드 이용</p>
<ul>
<li><p><code>isnull()</code> 메소드
결측치가 <span style="color:aqua">있는</span> 데이터를 <code>True</code> 로 나타내며, 없는 곳은 <code>False</code> 로 나타낸다. <code>isna()</code> 메소드도 같은 기능을 한다.</p>
</li>
<li><p><code>notnull()</code> 메소드
결측치가 <span style="color:aqua">없는</span> 데이터를 <code>True</code> 로 나타내며, 없는 곳은 <code>False</code> 로 나타낸다. <code>notna()</code> 메소드도 같은 기능을 한다.</p>
</li>
</ul>
<p><code>sum()</code> 메소드와 같이 사용하여 결측치의 갯수를 구할 수 있다.</p>
<pre><code class="language-python"># example
air.isna().sum()</code></pre>
<pre><code>Ozone      37
Solar.R     7
Wind        0
Temp        0
Month       0
Day         0
dtype: int64</code></pre><hr>
<h2 id="7-2-결측치-제거">7. 2. 결측치 제거</h2>
<p><code>dropna()</code> 메소드로 결측치가 있는 행이나 열을 제거할 수 있다.</p>
<pre><code class="language-python">syntax
df.dropna(subset, axis, inplace)

# example, Ozone 열이 결측치인 행 제거
air_test.dropna(subset=[&#39;Ozone&#39;],axis=0, inplace=True)</code></pre>
<ul>
<li><p><code>subset</code> <code>K</code> 범위
열 이름을 지정할 수 있다. 지정한 열의 결측치만 제거 할 수 있다.
생략 시 모든 데이터프레임에 대하여 결측치를 제거한다.</p>
</li>
<li><p><code>axis</code> <code>K</code> 행 또는 열
0 일시 행이며, 1일시 열이다.</p>
</li>
<li><p><code>inplace</code> <code>K</code> 반영여부
메소드이므로 데이터프레임에 변경된 결과를 적용시키려면 <code>True</code> 로 입력해야 한다.</p>
</li>
</ul>
<hr>
<h2 id="7-3-결측치-채우기">7. 3. 결측치 채우기</h2>
<p>결측치를 무조건적으로 없애기보단 관련이 있는 값으로 채워넣는게 데이터 분석에 더 유용할 수 있다. <code>fillna()</code> 메소드를 사용해 결측치를 다른 값으로 채울 수 있다.</p>
<pre><code class="language-python">syntax
df[&#39;colname&#39;].fillna(something, inplace)</code></pre>
<ul>
<li><p><code>colname</code> 결측치를 채울 열</p>
</li>
<li><p><code>something</code> 조건?
결측치를 어떻게 채울지 결정할 수 있는 매개변수이다.
모든 결측치를 특정한 값으로 채워넣으려면 <code>int</code> 값이나 변수를 넣으면 되고,
특정한 값으로 채워넣는 몇가지 방법이 있다,
<code>method=ffill</code> 바로 앞의 인덱스의 값으로 채우기
<code>method=bfill</code> 바로 뒤의 인덱스의 값으로 채우기</p>
</li>
<li><p>또한 <code>fillna()</code> 메소드 대신 <code>interpoltae()</code> 메소드를 이용하여 선형보간법으로 결측치를 채워 넣을 수 있다.</p>
<pre><code class="language-python"># example
air_test[&#39;Ozone&#39;].interpolate(method = &#39;linear&#39;, inplace = True)</code></pre>
</li>
</ul>
<hr>
<h2 id="7-4-가변수dummy-variable-만들기">7. 4. 가변수(Dummy Variable) 만들기</h2>
<p>가변수란? 범주형 데이터를 독립된 열로 변환한 것
머신러닝을 위한 데이터 모델링에 필요한 과정이다.
가변수를 만드는 과정을 &#39;One-Hot-Encoding&#39; 이라고 부른다.
<code>get_dummies()</code> 함수를 사용해서 가변수를 만들 수 있다.</p>
<pre><code class="language-python">syntax
pd.get_dummies(df, columns, drop_first)</code></pre>
<ul>
<li><p><code>df</code> 가변수를 만들 데이터프레임</p>
</li>
<li><p><code>columns</code> 가변수를 만들 열
<code>list</code> 를 이용하여 한번에 처리할 수 있다. 지정하지 않으면 object 값을 가지는 모든 열이 대상이 된다.
기존 열은 자동으로 제거되며, 열 이름은 prefix로 지정된다.</p>
</li>
<li><p><code>drop_first</code> 첫 열 버리기
<code>True</code> 입력 시 첫번째 열을 버릴 수 있다.
<a href="https://ko.wikipedia.org/wiki/%EB%8B%A4%EC%A4%91%EA%B3%B5%EC%84%A0%EC%84%B1">다중공선성</a> 문제를 없애기 위해 <code>True</code> 로 해놓자. </p>
</li>
</ul>
<p>이해를 좀 더 돕기위해 설명을 첨부하자면,
만약 남성 여성으로 나누어진 데이터에 가변수를 만든다고 가정해 보자.
값이 남자면 1인 열과 여자인 1인 열로 나누어 질 것이다.
남성과 여성은 범주값(남자가 아닐시 여자, 여자가 아닐시 남자) 이므로 사실상 열 하나가 없어도 성별여부를 충분히 파악할 수 있을 것이다. 
그러므로 회귀분석에도 방해되고, 쓸모도 없으므로 첫 행을 하나 삭제해준다.</p>
<hr>
<hr>
<h1 id="8-데이터프레임-합치기">8. 데이터프레임 합치기</h1>
<p>전처리를 위해 집계하고 조회한 데이터들을 합쳐야 하기도 한다.</p>
<h2 id="8-1-concat합치기">8. 1. Concat(합치기)</h2>
<p><code>concat()</code> 함수를 이용해서 데이터를 물리적으로 합칠 수 있다.</p>
<pre><code class="language-python">syntax
pd.concat([df1, df2], join, axis)</code></pre>
<ul>
<li><p><code>df</code> <code>L</code> 합칠 데이터프레임</p>
</li>
<li><p><code>join</code> <code>K</code> 합칠 옵션 ( 기본값 : <code>join = &#39;outer&#39;</code> )
합칠 데이터프레임의 인덱스 혹은 열이 같으면 좋겠지만 다른 경우가 있을 것이다.
인덱스 혹은 열이 다른 경우 빈 값이 생기는 열 혹은 행을 결측치로 채우는 옵션이 <code>&#39;outer&#39;</code>, 아예 제거하는 옵션이 <code>&#39;inner&#39;</code> 이다.</p>
</li>
<li><p><code>axis</code> <code>K</code> 합칠 방향 (기본값 : <code>0</code>)
<code>0</code>이면 세로, <code>1</code> 이면 가로로 합친다.</p>
</li>
</ul>
<hr>
<h2 id="8-2-join병합">8. 2. join(병합)</h2>
<p><code>merge()</code> 함수를 이용하여 두 데이터프레임을 지정한 키 값 기준으로 병합할 수 있다.
가로로만 붙일 수 있다.</p>
<pre><code>syntax
pd.merge(df1, df2, on, how)</code></pre><ul>
<li><p><code>df</code> <code>L</code> 합칠 데이터프레임
<code>concat</code> 와 달리 <code>list</code> 로 묶여있지 않음을 유의하자.
또한 <code>how</code> 값에 따라 합치는 순서에 따라 결과가 달라질 수 있으니 유의하자.</p>
</li>
<li><p><code>on</code> <code>K</code> 합칠 기준이 될 키값(열)
같은 이름의 열이 있으면 지정하지 않아도 자동으로 조인된다.
명시적으로 지정하는 것이 권고된다.</p>
</li>
<li><p><code>how</code> <code>K</code> 병합 기준 (기본값 : <code>how=&#39;inner&#39;</code>)
<code>left</code> 
왼쪽 데이터(<code>df1</code>)을 기준으로 병합한다. 
왼쪽에 있는 열은 결측치로 채우고 없는 열은 삭제한다.
<code>right</code>
오른쪽 데이터(<code>df2</code>)을 기준으로 병합한다.
오른쪽에 있는 열은 결측치로 채우고 없는 열은 삭제한다.
<code>outer</code>
빈 값이 생기는 모든 데이터를 결측치로 채운다. 합집합과 유사하다 생각하자.
<code>inner</code>
빈 값이 생기는 모든 데이터의 행과 열을 삭제한다. 교집합과 유사하다 생각하자.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[numpy 개념정리]]></title>
            <link>https://velog.io/@dalbong_97/numpy-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@dalbong_97/numpy-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sat, 18 Feb 2023 16:22:19 GMT</pubDate>
            <description><![CDATA[<p><a href="https://coconut-emoji.tistory.com/">이미지출처</a>
<a href="https://velog.io/@dalbong_97/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EC%99%80-%EC%A0%84%EB%8B%AC%EC%9D%B8%EC%9E%90-syntax-%EC%95%BD%EC%86%8D">syntax 약속</a>
본 포스팅은 KT 에이블스쿨 교육내용을 바탕으로 제 나름대로 정리하여 작성하였습니다</p>
<hr>
<h1 id="넘파이란">넘파이란?</h1>
<p>배열을 이용하게 해줄 수 있는 파이썬 라이브러리
파이썬에서 가장 유명한 라이브러리 중 하나
<code>list</code>랑 비슷하다</p>
<h2 id="왜씀">왜씀?</h2>
<p>넘파의 각종 내장 메소드들을 이용하여 요소들을 한번에 처리할 수 있다.
예를들어 <code>list</code>같은경우는  <code>list * 숫자</code> 를 하면 숫자만큼 리스트가 복사되었지만,
배열에서는 요소에 값을 하나하나 곱해줄 수 있다.
리스트는 저거 하려면 for문으로 만들어줘야 한다... ㅋㅋ
하지만 장점만 있는건 아니다. 여러가지 자료형으로 존재할 수 있는 <code>list</code> 와 달리 한가지 자료형으로만 존재할 수 있다.</p>
<hr>
<h1 id="1-용어-정의">1. 용어 정의</h1>
<p><img src="https://velog.velcdn.com/images/dalbong_97/post/dc91f77a-cb4b-4c82-bb39-601181294393/image.png" alt=""></p>
<ul>
<li>axis : 배열의 축</li>
<li>rank : 축의 갯수, 혹은 차원이라고 부른다.(선형대수학)</li>
<li>shape : 배열의 크기(=축의 길이)</li>
</ul>
<h2 id="축-번호-매기기">축 번호 매기기</h2>
<ul>
<li>1차원 배열 : 축이 하나뿐(행)이므로 당연히 행이 axis 0 이다.</li>
<li>2차원 배열 : 행, 열 순으로 axis 0, axis 1 이다.</li>
<li>3차원 배열 : <span style="color:aqua">높이</span>, <span style="color: fuchsia">행</span>, <span style="color:rgb(255, 178, 0)">열</span> 순으로 <span style="color:aqua">axis0</span>, <span style="color: fuchsia">axis1</span>, <span style="color:rgb(255, 178, 0)">axis2</span> 이다. 혼동하지 말자</li>
</ul>
<hr>
<h1 id="2-라이브러리-불러오기">2. 라이브러리 불러오기</h1>
<pre><code class="language-python">import numpy as np</code></pre>
<p><code>import</code>를 이용해 불러올 수 있고, 보통 <code>as</code> 를 이용해 <code>np</code> 라는 별칭으로 사용한다.</p>
<hr>
<h1 id="3-배열-만들기">3. 배열 만들기</h1>
<h2 id="31-배열-생성">3.1. 배열 생성</h2>
<pre><code class="language-python">np.array(리스트)</code></pre>
<h2 id="32-배열-정보-확인">3.2 배열 정보 확인</h2>
<p>배열의 정보를 확인할 수 있는 다양한 <span style="color:aqua">속성</span>(메소드와 함수와는 또 다름)들이 있다.</p>
<h3 id="차원-확인">차원 확인</h3>
<pre><code class="language-python">리스트.ndim</code></pre>
<p>배열의 차원(=축의 갯수)를 <code>int</code> 로 반환한다.</p>
<h3 id="형태크기-확인">형태(크기) 확인</h3>
<pre><code>리스트.shape</code></pre><p>배열의 크기를 <code>tuple</code>로 반환한다.</p>
<ul>
<li>1차원: (x,)</li>
<li>2차원: (x, y)</li>
<li>3차원: (x, y, z)
  *<span style="color:aqua">왼쪽</span>부터 axis0, axis1, axis2 이다.<h3 id="자료형-확인">자료형 확인</h3>
<pre><code>리스트.dtype</code></pre>배열의 자료형을 반환한다.
배열은 한가지 자료형만 가질 수 있는것을 기억하자</li>
</ul>
<h3 id="reshape형태변환">reshape(형태변환)</h3>
<pre><code class="language-python">배열.reshape(원하는 형태)</code></pre>
<p>배열을 다양한 <span style="color:aqua">형태(shape)</span>로 변환해준다.
배열에 포함된 요소가 사라지지 않는 형태, 즉 요소의 숫자가 같은 형태로만 변활할 수 있다.
-&gt; (원래 배열의 행 수) * (원래 배열의 열 수) = (바꾸려는 함수의 행수) * (바꾸려는 함수의 열 수)
<img src="https://velog.velcdn.com/images/dalbong_97/post/d8b64b03-4fd3-4386-b841-b0bd69652d0f/image.png" alt=""></p>
<ul>
<li><span style="color:aqua">-1</span> 을 이용하여 원하는 행 수와 열 수만 지정하여<code>Reshape</code>할 수 있다.</li>
</ul>
<hr>
<h1 id="4-배열-조회">4. 배열 조회</h1>
<h2 id="인덱싱">인덱싱</h2>
<p>당연히 첫 번째 값은 0 부터 시작한다.
1차원 배열의 인덱싱은 리스트랑 일치하기에 생략</p>
<pre><code class="language-python">syntax
arrayname[row, column]</code></pre>
<p><code>arrayname</code> 배열명
<code>row</code> 인덱싱 하고 싶은 행, <code>int</code>값이다.
<code>column</code> 인덱싱 하고 싶은 열, <code>int</code> 값이다.
<code>row</code>, <code>column</code> 부분에 리스트를 넣어서 여러 값을 조회 가능하다.
&#39;:&#39; 를 이용하여 전체를 조회 할 수 있다.</p>
<h2 id="슬라이싱">슬라이싱</h2>
<p>범위를 지정하여 위치의 요소를 조회 할 수 있다. 인덱싱이랑 매우 유사하다.
<span style="color:aqua">마지막 범위 값은 대상에 포함되지 않는다는 점을 유의하자!</span>
&#39;:&#39; 를 이용해도 마지막 인덱스 값은 포함되지 않는다.
즉, 배열[1:M, 2:N]이라면 1 ~ M-1행, 2 ~ N-1열이 조회 대상이 된다.</p>
<pre><code class="language-python">syntax
arrayname[rowarea, columnarea]</code></pre>
<p><code>arrayname</code> 배열명
<code>rowarea</code> 슬라이싱 하고 싶은 행의 범위, <code>행N:행M</code> 형태로 나타낸다.
물론 행1, 행2 의 값은 <code>int</code> 이다.
<code>columnarea</code> 도 열의 범위인 점을 제외하고는 같기에 생략.</p>
<p>한눈에 보는 인덱싱과 슬라이싱
<img src="https://velog.velcdn.com/images/dalbong_97/post/e0c4eaeb-b934-4a9a-b8d7-5df2f286839f/image.png" alt=""></p>
<h2 id="조건-조회불리안-방식">조건 조회(불리안 방식)</h2>
<p>조건에 맞는 요소를 선택하는 선택하는 방식이다.
조회 결과는 &#39;1차원 배열&#39; 이 된다.</p>
<pre><code class="language-python">syntax
arrayname[conditions]</code></pre>
<p><code>conditions</code> 조회를 원하는 조건을 의미한다.
<code>&amp;</code> 와 <code>|</code> 를 이용하여 여러가지 조건을 조회할 수 있다. 각각 <code>and</code> 와 <code>or</code> 역할을 수행한다.</p>
<p>예시</p>
<pre><code class="language-python"># 2차원 배열 만들기
score= np.array([[78, 91, 84, 89, 93, 65],
                 [82, 87, 96, 79, 91, 73]])

# 짝수만 조회
print(score[score % 2 == 0])</code></pre>
<pre><code>[78 84 82 96]</code></pre><h1 id="5-배열-연산">5. 배열 연산</h1>
<p>다양한 함수 혹은 연산자를 이용하여 배열 성분간의 다양한 연산을 할 수 있다.
행렬에 대한 연산도 가능하나 선형대수에 대한 도메인 지식이 필요하므로 생략하겠다.</p>
<ul>
<li>덧샘 : <code>+</code> 혹은 <code>np.add()</code></li>
<li>뺄샘 : <code>-</code> 혹은 <code>np.substract()</code></li>
<li>곱샘 : <code>*</code> 혹은 <code>np.multiply()</code></li>
<li>나눗샘 : <code>/</code> 혹은 <code>np.divie()</code></li>
<li>제곱 : <code>**</code> 혹은 <code>np.power()</code></li>
<li>제곱근 : <code>np.sqrt()</code>
<img src="https://velog.velcdn.com/images/dalbong_97/post/44a3f635-1642-494a-8d45-fa9962dfb08d/image.png" alt="">
끝!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[안녕 벨로그!]]></title>
            <link>https://velog.io/@dalbong_97/%EC%95%88%EB%85%95-%EB%B2%A8%EB%A1%9C%EA%B7%B8</link>
            <guid>https://velog.io/@dalbong_97/%EC%95%88%EB%85%95-%EB%B2%A8%EB%A1%9C%EA%B7%B8</guid>
            <pubDate>Wed, 15 Feb 2023 02:00:30 GMT</pubDate>
            <description><![CDATA[<p>안녕 벨로그!</p>
<pre><code class="language-python">print(Hello! velog!)</code></pre>
]]></description>
        </item>
    </channel>
</rss>