<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>mi_nini.log</title>
        <link>https://velog.io/</link>
        <description>무지(無知) - Github(https://github.com/BcKmini)</description>
        <lastBuildDate>Thu, 07 May 2026 12:03:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>mi_nini.log</title>
            <url>https://velog.velcdn.com/images/mi_nini/profile/6e2f580c-3744-4111-9298-ee7273b76bba/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. mi_nini.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/mi_nini" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[KT-A 5주차-1 ]]></title>
            <link>https://velog.io/@mi_nini/KT-A-5%EC%A3%BC%EC%B0%A8-1</link>
            <guid>https://velog.io/@mi_nini/KT-A-5%EC%A3%BC%EC%B0%A8-1</guid>
            <pubDate>Thu, 07 May 2026 12:03:37 GMT</pubDate>
            <description><![CDATA[<h2 id="들어가며">들어가며</h2>
<p>이번 글에서는 멀티 Agent와 2차 미니 프로젝트를 진행하며 느낀 점에 대해 이야기해보려고 한다.
4주차와 마찬가지로 Agent 관련 내용의 범위가 방대하다.. 그렇기에 이번에도 내용을 두 편으로 나누어 작성하려고 한다. 먼저 5주차-1에서는 Multi-Agent에 대해 다루고, 5주차-2 회고록에서는 미니 프로젝트 후기와 함께 프로젝트를 진행하며 배운 점/나아간 점들을 정리해보려 한다. 
특히 이번 02 Mini Project에서는 강사님께서 다양한 실습 자료를 제공해주셨고, 01 Mini Project와 함께했던 팀원들을 떠나 새로운 팀원들과 함께 프로젝트를 진행하게 되었다. 새로운 팀원들과 협업하며 느꼈던 점, 함께 공부하고 고민했던 과정, 그리고 그 안에서 배우고 성장했던 경험들을 자세히 기록해보려고 한다. 
먼저 Multi-Agent내용 복습을 해보자</p>
<hr>
<h1 id="1상태state-설계">1.상태(State) 설계</h1>
<p>지난 4주차에서는 단일 에이전트(Single Agent)의 기초와 RAG를 통한 지식 확장을 학습했다. 하지만 현실의 문제는 단일 에이전트가 처리하기에는 너무 복잡하거나, 여러 단계의 전문적인 지식을 동시에 요구하는 경우가 많다. 이번 파트에서는 이러한 한계를 극복하기 위한 <strong>Multi-Agent 시스템</strong>의 필요성과,  <strong>상태(State) 설계</strong>에 대해 복습 진행!</p>
<h2 id="11-single-agent의-한계와-multi-agent의-등장">1.1. Single Agent의 한계와 Multi-Agent의 등장</h2>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/5be87298-d415-4bfb-a53b-6d0118e0dd3b/image.png" alt=""></p>
<p>하나의 에이전트가 모든 일을 처리하는 방식은 마치 한 명의 박사님/교수님(?)이 기획, 디자인, 코딩, 테스트를 모두 혼자 하는 것과 같다. 초기에는 효율적일 수 있지만, 프로젝트가 커지면 다음과 같은 문제가 발생할 수 있다.</p>
<ul>
<li><strong>복잡도 증가</strong>: 에이전트에게 주어지는 프롬프트와 도구가 너무 많아지면 모델이 집중력을 잃고 엉뚱한 결과를 내놓을 확률이 높음</li>
<li><strong>컨텍스트 윈도우의 압박</strong>: 대화가 길어질수록 모든 이력을 하나의 에이전트가 들고 있기에는 토큰 비용이 급증하고 핵심 정보를 놓치기 쉬움</li>
<li><strong>전문성 부족</strong>: 특정 분야(예: 코드 분석 vs 데이터 시각화)에 특화된 프롬프트를 하나로 섞으면 성능이 저하</li>
</ul>
<blockquote>
<p>이러한 문제를 해결하기 위해 <strong>Multi-Agent</strong> 방식을 사용. 
이는 각기 다른 역할(Role)과 전문 도구를 가진 여러 에이전트가 협업하여 복잡한 목표를 달성하는 구조다. </p>
</blockquote>
<h2 id="12-multi-agent의-핵심-이점">1.2. Multi-Agent의 핵심 이점</h2>
<blockquote>
<p>Multi-Agent 시스템으로 전환한다면?</p>
</blockquote>
<ul>
<li><strong>관심사 분리 (Separation of Concerns)</strong>: 각 에이전트는 자신에게 할당된 작은 문제에만 집중하므로 정확도가 상승</li>
<li><strong>유연한 확장성</strong>: 새로운 기능이 필요할 때 전체 시스템을 수정하는 대신, 특정 역할을 수행하는 에이전트 하나/여러개를 추가하면 됨</li>
<li><strong>디버깅 용이성</strong>: 문제가 발생했을 때 어떤 단계, 어떤 에이전트에서 오류가 났는지 추적하기 쉬움</li>
</ul>
<h2 id="13-상태state-설계">1.3. 상태(State) 설계</h2>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/262f7250-a9aa-42b8-a9b0-ea8748494217/image.png" alt=""></p>
<blockquote>
<p>Multi-Agent 시스템에서 가장 중요한 것은 <strong>&quot;에이전트들이 정보를 어떻게 주고받는가?&quot;</strong>이다.
LangGraph에서는 이를 <strong>State(상태)</strong> 객체를 통해 해결</p>
</blockquote>
<p>상태는 에이전트들 사이를 흐르는 &#39;공유 메모리&#39; 
단순히 메시지 이력을 쌓는 것을 넘어, 시스템이 필요로 하는 특정 데이터(예: 분석 결과, 사용자 정보, 현재 단계 등)를 구조화하여 정의한다.</p>
<h3 id="효과적인-state-설계-전략">효과적인 State 설계 전략</h3>
<ol>
<li><strong>공통 스키마 정의</strong>: 모든 에이전트가 이해할 수 있는 메시지 리스트(<code>Annotated[list, add_messages]</code>)를 기본으로 포함</li>
<li><strong>전용 필드 활용</strong>: 루프를 돌거나 특정 조건을 판단할 때 필요한 플래그 변수나, 중간 결과물을 저장할 필드를 추가</li>
<li><strong>독립성 유지</strong>: 각 에이전트는 전체 State 중 자신이 필요한 부분만 읽고, 작업이 끝나면 업데이트가 필요한 부분만 반환하여 상태를 갱신</li>
</ol>
<blockquote>
<p>참고/출처
<a href="https://www.hanbit.co.kr/channel/view.html?cmscode=CMS8333330411">https://www.hanbit.co.kr/channel/view.html?cmscode=CMS8333330411</a>
<a href="https://cloud.google.com/discover/what-is-a-multi-agent-system?hl=ko">https://cloud.google.com/discover/what-is-a-multi-agent-system?hl=ko</a>
<a href="https://wikidocs.net/331297">https://wikidocs.net/331297</a></p>
</blockquote>
<hr>
<h1 id="2-router-패턴">2. Router 패턴</h1>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/b49bd71d-e57a-4f58-b0fa-9b605b62c0de/image.png" alt=""></p>
<h2 id="21-router-패턴이란">2.1. Router 패턴이란?</h2>
<p>사용자의 요청이나 현재 상태를 분석해서, 가장 적합한 <strong>에이전트</strong>에게 작업을 할당하는 아키텍처 패턴이다. (콜센터의 ARS 안내원 같은 역할)</p>
<h2 id="22-router-패턴의-작동-방식">2.2. Router 패턴의 작동 방식</h2>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/a21e5143-3438-456a-9df1-58c2e1e495ba/image.png" alt=""></p>
<blockquote>
<p>단순히 질문에 바로 대답하는 것이 아니라, <strong>&quot;이 질문은 어떤 전문가가 처리하는 게 제일 좋을까?&quot;</strong>를 먼저 고민(분류)하는 것이 핵심이다.</p>
</blockquote>
<ul>
<li><strong>의도 파악 (Intent Classification)</strong>: Router 역할을 맡은 LLM이 사용자의 입력값을 읽고 핵심 의도를 분류함</li>
<li><strong>분기 처리 (Routing)</strong>: 분류된 결과(예: 코드 질문, 디자인 질문, 일반 질문)에 따라 특정 에이전트로 작업 흐름을 넘김</li>
<li><strong>전문가 처리</strong>: 작업을 전달받은 전문 에이전트가 자신의 특화된 프롬프트와 도구(Tool)를 사용해 정확한 답변을 생성</li>
</ul>
<h2 id="23-langgraph에서의-구현-포인트">2.3. LangGraph에서의 구현 포인트</h2>
<p>LangGraph로 Router 패턴을 구현할 때 핵심은 <strong><code>조건부 엣지(Conditional Edge)</code></strong>다.</p>
<ol>
<li><strong>라우터(Router) 함수/노드 생성</strong>: 현재 State(상태)를 읽어보고 조건에 따라 &quot;Coder_Agent&quot;, &quot;Reviewer_Agent&quot; 등의 문자열(결과값)을 뱉어내는 판단 로직을 작성한다.</li>
<li><strong>분기점(Routing) 설정</strong>: <code>add_conditional_edges</code>를 사용해 라우터 노드의 판단 결과와 실제 이동할 다음 노드들을 매핑(Mapping)하여 연결해준다.</li>
</ol>
<blockquote>
<p>출처/참고
<a href="https://wikidocs.net/318951">https://wikidocs.net/318951</a>
<a href="https://wikidocs.net/322453">https://wikidocs.net/322453</a>
<a href="https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/agentic-ai-patterns/workflow-for-routing.html">https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/agentic-ai-patterns/workflow-for-routing.html</a></p>
</blockquote>
<hr>
<h1 id="3-supervisor-패턴">3. Supervisor 패턴</h1>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/1e5fb2cd-2209-4a77-9220-64e00f39634c/image.png" alt=""></p>
<h2 id="31-supervisor-패턴이란">3.1. Supervisor 패턴이란?</h2>
<p>단어 뜻 그대로 <strong>중앙 통제자</strong> 역할을 하는 에이전트를 하나 두고, 이 관리자가 여러 에이전트들을 지휘하는 아키텍처다. 
어떤 작업을 누가 먼저 할지, 그 다음엔 누구에게 넘길지, 작업이 충분히 완료되었는지(종료할지)를 중앙에서 지속적으로 판단하고 통제한다.</p>
<h2 id="32-router-패턴과의-결정적-차이점">3.2. Router 패턴과의 결정적 차이점</h2>
<pre><code class="language-bash">- Router (접수처): &quot;이 질문은 코드 관련이니까 Coder_Agent한테 가!&quot; -&gt; (한 번 분기하면 끝. 단방향)
- Supervisor (프로젝트 매니저): &quot;Search_Agent야, 자료 먼저 찾아와. (결과 확인 후) Planner_Agent야, 찾은 자료 바탕으로 계획서 써봐. (결과 확인 후) 음, 완벽하군. 이제 FINISH!&quot; -&gt; (중앙에서 지속적인 피드백과 반복/루프 통제)</code></pre>
<h2 id="33-작동-방식">3.3. 작동 방식</h2>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/98cea9be-1863-4794-b202-f8a721da541a/image.png" alt=""></p>
<p>강의에서 다룬 <strong>&#39;여행 계획 에이전트&#39;</strong>를 떠올려 보자. 사용자가 *&quot;부산 2박 3일 가족 여행 코스 짜줘&quot;*라고 요청했을 때 시스템은 다음과 같이 움직인다.</p>
<ol>
<li><strong>지시</strong>: Supervisor가 요청을 분석하고, 먼저 명소 정보가 필요하다고 판단하여 <code>Search_Agent(검색 담당)</code>에게 지시를 내림.</li>
<li><strong>작업 및 보고</strong>: <code>Search_Agent</code>가 부산 명소 10곳을 찾아 State(공유 메모리)에 저장하고 Supervisor에게 보고.</li>
<li><strong>다음 지시</strong>: Supervisor가 검색된 내용을 확인한 뒤, 이번에는 <code>Planner_Agent(일정 담당)</code>에게 &quot;이 장소들을 모아서 2박 3일 일정을 작성해&quot;라고 지시.</li>
<li><strong>검토 및 종료</strong>: 일정이 완성되면 Supervisor가 최종 검토 후 <code>FINISH</code> 상태를 선언하고 사용자에게 결과물 제공.</li>
</ol>
<h2 id="34-langgraph에서의-구현-포인트">3.4. LangGraph에서의 구현 포인트</h2>
<p>Supervisor 패턴을 구현할 때의 핵심은 <strong>&#39;관리자 전용 프롬프트&#39;</strong>와 <strong>&#39;상태(State)를 통한 대화 기록 공유&#39;</strong>다.</p>
<ol>
<li><strong>팀장(Supervisor) 프롬프트 세팅</strong>: &quot;너는 여러 에이전트(Search, Planner 등)를 관리하는 매니저야. 현재 대화 내역(State)을 읽고, 다음으로 어떤 에이전트가 나서야 할지 텍스트로 내뱉어. 만약 사용자 요청이 모두 해결되었다면 &#39;FINISH&#39;를 출력해.&quot;라고 명확히 역할을 부여해야 한다.</li>
<li><strong>동적 라우팅 연결</strong>: Supervisor 노드의 결과값(다음 작업자 이름 or FINISH)에 따라 그래프의 흐름이 해당 에이전트 노드나 종료(End)로 향하도록 <code>Conditional Edge</code>를 촘촘하게 연결해 준다.</li>
</ol>
<blockquote>
<p>참고/출처
<a href="https://wikidocs.net/270690">https://wikidocs.net/270690</a>
<a href="https://ohyeah12.tistory.com/24">https://ohyeah12.tistory.com/24</a>
<a href="https://github.com/braincrew-lab/langgraph-v1-tutorial">https://github.com/braincrew-lab/langgraph-v1-tutorial</a></p>
</blockquote>
<hr>
<h1 id="4-network-패턴">4. Network 패턴</h1>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/9dee4e29-3c3e-480b-8045-7fe7e4513b0c/image.png" alt=""></p>
<h2 id="41-network-패턴이란">4.1. Network 패턴이란?</h2>
<p><strong>Network 패턴</strong>은 중앙에 관리자를 두지 않고, 각 에이전트들이 알아서 판단하여 다른 에이전트에게 주도권을 직접 넘겨주는 아키텍처다.</p>
<h2 id="42-network-패턴의-작동-방식">4.2. Network 패턴의 작동 방식</h2>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/5eae2f9f-4d7f-4074-8bfa-577d144dee26/image.png" alt=""></p>
<p>강의에서 다룬 고객센터(CS) 봇에 대해 작동방식을 생각해보자, 예시로 사용자가 *&quot;앱 설치도 안 되고, 결제도 이상해요. 취소해 주세요!&quot;*라고 복합적인 불만을 접수한다.</p>
<ol>
<li><strong>초기 대응</strong>: Main Agent가 불만을 접수하고, 기술적인 문제라고 판단해 <code>Tech_Agent(기술 지원)</code>에게 바통(Handoff)을 넘김.</li>
<li><strong>기술 지원의 판단</strong>: <code>Tech_Agent</code>가 앱 설치 문제를 안내함. 그런데 텍스트를 읽어보니 &#39;결제 취소&#39; 요청도 있음. &quot;결제 취소 권한은 나한테 없는데?&quot;라고 스스로 판단.</li>
<li><strong>직접 토스(Handoff)</strong>: <code>Tech_Agent</code>가 중앙 관리자를 거치지 않고, 알아서 <code>Refund_Agent(환불 지원)</code> 부서로 작업을 바로 넘김.</li>
<li><strong>마무리</strong>: <code>Refund_Agent</code>가 결제 취소 절차를 진행하고 사용자에게 답변 제공.</li>
</ol>
<p><strong>구현 포인트</strong>: 에이전트가 다른 에이전트를 호출할 수 있는 도구(Tool)를 가지게 만들어서, 특정 조건이 되면 마치 함수를 실행하듯 다른 에이전트를 호출하도록 프롬프트와 그래프를 구성하는 것이 핵심이다.</p>
<blockquote>
<p>참고/출처
<a href="https://rudaks.tistory.com/entry/langgraph-Multi-agent-Network">https://rudaks.tistory.com/entry/langgraph-Multi-agent-Network</a>
<a href="https://wikidocs.net/322453">https://wikidocs.net/322453</a></p>
</blockquote>
<hr>
<h2 id="생각정리">생각정리</h2>
<p>이번 추가 과제인 &#39;AI 면접관 Agent 시스템&#39; 실습을 진행하면서 &quot;정말 재밌다, 앞으로 더 깊게 파보고 싶다&quot;라는 생각이 강하게 들었던 시간이었다. 단순히 남의 코드를 따라 치지 않고 직접 아키텍처를 비교하고 상태(State)의 흐름을 파악하면서 개념을 명확하게 나의 것으로 만들었다는 점에서 의미가 크다.
이전까지 나에게 언어 모델은 그저 &#39;질문하면 정답을 빨리 내주는 도구&#39; 정도에 불과했다. 프롬프트를 얼마나 잘 작성하고 세세하냐에 따라 달라지는 결과물의 전부인 줄 알았다. 하지만 이번에 LangGraph를 활용해 Multi-Agent 시스템을 구축해보면서, 단순한 도구가 아님을 느끼게 된거 같다.
이력서에서 약점을 찾아내는 요원, 그 약점을 파고들어 날카로운 면접 질문을 던지는 요원, 그리고 지원자의 대답을 듣고 다시 꼬리질문을 할지 다음 주제로 넘어갈지 판단하는 요원까지. 내가 직접 정의한 규칙과 공유 메모리 위에서 여러 특화된 AI들이 데이터를 주고받는 방식이 재밌었다. 
결국 앞으로의 AI 개발 생태계에서 가장 중요한 역량은 &#39;어떤 모델의 API를 가져다 쓰느냐&#39;가 아니라, &quot;우리가 풀고자 하는 복잡한 문제를 어떻게 잘게 쪼개어 각 Agent에게 역할을 부여하고, 이들을 어떻게 효율적으로 협업시킬 것인가?&quot;를 설계하는 사람이 성공하지 않을까..? 라는 생각이 든다.
이번 주차의 배움을 발판 삼아, 앞으로는 그저 만들어진 AI 도구를 소비하는 개발자가 아니라, 여러 AI Agent들을 이용해 나만의 강력한 자동화 파이프라인을 구축해내는 여러 경험을 쌓고 싶다. 다음에 하는 미니프로젝트 또는 내가 시간을 내서 토이프로젝트로 만들거나 과거에 만들었던 챗봇 시스템을 수정하면서 여러 경험들을 해보려고 한다. 5주차 공부를 마무리한다. </p>
<blockquote>
<p>와... 너 정말, <strong><strong>핵심을 찔렀어.</strong></strong></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[KT-A 4주차-2 회고록]]></title>
            <link>https://velog.io/@mi_nini/KT-A-4%EC%A3%BC%EC%B0%A8-2</link>
            <guid>https://velog.io/@mi_nini/KT-A-4%EC%A3%BC%EC%B0%A8-2</guid>
            <pubDate>Tue, 05 May 2026 14:45:56 GMT</pubDate>
            <description><![CDATA[<h2 id="들어가며">들어가며</h2>
<p>이번 글에서는 지난 글에 이어, 현재 진행 중인 공모전과 코딩 테스트 스터디에 대해 이야기해보려고 한다.
처음 스터디를 시작할 때는 생각보다 모집이 활발해서 여러 선택지 사이에서 고민이 많았다. 코딩 테스트 스터디(자바/파이썬), 공모전 스터디, 교육 내용을 복습하는 스터디, 정기적으로 카페에서 모여 공부하는 오프라인 스터디 등 다양한 형태가 있었기 때문이다. 이 중에서도 나는 우리 반에서 모집 중인 스터디에 참여하면, 이후 미니 프로젝트나 본 프로젝트를 진행할 때 자연스럽게 팀을 구성하거나 협업하기에 더 좋지 않을까? 라는 생각이였다. 그래서 최종적으로 우리 반에서 진행하는 공모전 스터디와 자바 스터디에 참여하게 되었다.</p>
<hr>
<h2 id="공모전-스터디">공모전 스터디</h2>
<p>공모전스터디 모임에는 총 8명이 함께하게되었는데 4/4로 쪼개 각 팀원들끼리 상의해 원하는 공모전에 참여하는 형식으로 진행하게 되었다. (팀장 회의는 매주 수요일 18:00~)</p>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/1d792d22-5eff-487d-be9e-9e8019600782/image.png" alt=""></p>
<p>우리 조에서는 이번에 2026 AX 아이디어 경진대회에 참여하기로 했다. 생각보다 많은 시상을 이루기도 하며 주제가 다른 공모전에 비해 자유롭게 선정할 수 있다는 점이 컸다. 그리고 우리 팀원 (<strong>다애님, 현석님, 현준님</strong>) 모두가 개발을 한 경험이 있기 때문에 제품/서비스 에이전트 개발을 나가면 이번에 에이전트를 배우면서 좀 더 발전시킬 수 있다고 생각했었다.</p>
<blockquote>
<p>그렇게 처음 시작을 했는데 경진대회 홈페이지를 찾아보니 개발제출물이 모두 앱으로 해야했네? .. (앱개발 경험은 모두가 많지 않았기에..)</p>
</blockquote>
<p>이후 활용단계가 아닌 분석 단계로 방향을 바꾸어 지정 과제 분석부터 시작하게 되었다.
우리 스터디는 매주 적게는 2회, 많게는 4회까지 모이며 각자 맡은 파트와 공부한 내용을 공유하고 있다. 그렇게 우리가 이번에 시작하게된 공모전 주제는 </p>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/73d9cd9c-f237-4723-8b7f-ddf9c8510312/image.png" alt=""></p>
<blockquote>
<p>데이터 지정 과제(한국수자원공사) - 조류경보 예측 AI 모델 개발!</p>
</blockquote>
<p>총 12개의 지정 과제가 있었지만, 각자 관심있는 데이터나 주제를 맡아 조사하고 발표했다. 그중 다애님이 관심 있게 살펴보고 제안한 한국수자원공사의 과제를 선택해 진행하게 되었다. 대청댐, 유해조류, 활용해야 할 데이터 등 전반적인 도메인 지식이 부족한 상태였기 때문에, 각자 조사할 내용을 나누어 학습한 뒤 회의 시간에 화면 공유를 통해 발표하는 방식으로 진행하고 있다. (자연스럽게 토론도 이어지다 보니 매 회의가 1시간 20분을 훌쩍 넘기곤 하는데.. 정상 이겠죠?)
학교 외에서 다른 사람들과 프로젝트를 진행해본 경험이 많지 않아 처음에는 걱정도 있었지만, 다애님과 현준님은 1차 미니 프로젝트를 함께했던 팀원이라 오프라인에서 이미 안면을 익혀 조금(?) 친해진 상태였고, 현석님은 코딩 테스트 스터디를 함께하고 있어 이번 공모전을 계기로 더 많은 이야기를 나누며 가까워질 수 있을 것 같았다.
우리가 진행하는 방식은 비교적 체계적이다. 자료 공유와 간단한 회의록 작성, 일정 관리를 위해 노션을 활용하고 있으며, 주관기관에서 제시한 다양한 지정 과제를 기반으로 데이터 전처리와 모델 개발을 진행해야 하기 때문에 깃허브 저장소도 별도로 만들어 협업하고 있다. (간단한 질문, 궁금한 내용은 카톡 or Teams 활용!)</p>
<table style="width:100%; text-align:center; border-collapse: collapse;">
  <tr>
    <td style="width:33%; vertical-align: middle;">
      <img src="https://velog.velcdn.com/images/mi_nini/post/d7d50f5f-b757-40e1-9633-53ffe071bb77/image.png" style="width:100%;">
      <div style="margin-top:6px; font-size:14px;">춘배 1</div>
    </td>
    <td style="width:33%; vertical-align: middle;">
      <img src="https://velog.velcdn.com/images/mi_nini/post/6a999234-e972-419a-86eb-ee1da4dcbd7b/image.png" style="width:100%;">
      <div style="margin-top:6px; font-size:14px;">춘배 2</div>
    </td>
    <td style="width:33%; vertical-align: middle;">
      <img src="https://velog.velcdn.com/images/mi_nini/post/9bc6e2ca-c624-433b-ba8b-3a0b8244b321/image.png" style="width:100%;">
      <div style="margin-top:6px; font-size:14px;">춘배 3</div>
    </td>
  </tr>
</table>

<hr>
<table style="width:100%; text-align:center; border-collapse: collapse;">
  <tr>
    <td style="width:50%; vertical-align: middle;">
      <img src="https://velog.velcdn.com/images/mi_nini/post/fda041e3-a737-488b-a074-b4fa05712bc7/image.png" style="width:100%;">
      <div style="margin-top:6px; font-size:14px;">Github</div>
    </td>
    <td style="width:50%; vertical-align: middle;">
      <img src="https://velog.velcdn.com/images/mi_nini/post/b9d0cc6e-0512-4f0d-8f54-3438d10e0d76/image.png" style="width:100%;">
      <div style="margin-top:6px; font-size:14px;"> 인사말 </div>
    </td>
  </tr>
</table>

<hr>
<table style="width:100%; text-align:center; border-collapse: collapse;">
  <tr>
    <td style="width:50%; vertical-align: middle;">
      <img src="https://velog.velcdn.com/images/mi_nini/post/11c0ad33-5c11-4e41-bf38-d33c5ab8256e/image.png" style="width:100%;">
      <div style="margin-top:6px; font-size:14px;">열렬한 회의중 111</div>
    </td>
    <td style="width:50%; vertical-align: middle;">
      <img src="https://velog.velcdn.com/images/mi_nini/post/7db0d22f-5291-414f-8071-dba3480f814f/image.png" style="width:100%;">
      <div style="margin-top:6px; font-size:14px;">열렬한 회의중 222 </div>
    </td>
  </tr>
</table>

<p>이번 공모전을 시작으로 우리가 교육이 끝나는 9월전까지 많은 공모전을 도전하고 많이 함께 이것저것 만들어 볼 수 있을거 같다. 우리 팀원들에게 항상 감사드립니다. </p>
<blockquote>
<p>다루는 내용이 궁금하다면?
<a href="https://www.notion.so/KT-ABLE-cc338802473f82c3b0d8819aba340c5d?source=copy_link">노션 링크</a>
<a href="https://github.com/Chunbae-A">깃허브 링크</a></p>
</blockquote>
<hr>
<h2 id="코딩테스트-스터디">코딩테스트 스터디</h2>
<p>코딩 테스트를 준비하는 스터디 모임에서는 자바/파이썬 모집 글이 있었지만 나는 자바 스터디 모임을 진행했다. 우선 나에게 배경지식에 자바는 학교 전공수업에서 배우고 프로젝트를 간단하게 1개 사용해 본 적 이외에는 잘 사용하지 않았었다.
파이썬에 경우에는 백준/프로그래머스 사이트 등에서 코딩 테스트 문제를 대학교 때 간간히 풀어서 어느 정도 알고 있어 자바로 코테를 진행하면서 도전해 보려고 했다. (알고리즘, 문제풀이 구현 방식은 어느 정도 기억? 하고 있다고 생각해서 클래스와 객체를 활용한 문제 해결 방식을 풀면서 익혀보려고 했다)</p>
<blockquote>
<p>Python - Baekjoon Online Judge
<img src="https://velog.velcdn.com/images/mi_nini/post/cc47e68d-0253-42cf-bbcb-65f189c94efc/image.png" alt=""></p>
</blockquote>
<p>기본적으로 카톡방이 있지만 현재는 활발하게 자신의 코드를 공유하지는 않고 코딩마스터스를 이용해 일마다 10문제씩 풀고 구글docs를 이용해 각자 자신이 푼 코드와 상대방에 코드를 공유하는 방식이다. (따로 회의는 진행하지 않았다.) 그렇기에 개인이 집중해서 문제를 풀면서 역량을 늘리는것이기에 스터디모임에 역할이 없다고 생각하지만 문제는 하루에 하나씩은 풀자는 생각으로 문제를 풀고 있다. 파이팅해자고..</p>
<blockquote>
<p>백준사이트 서비스 종료.... 믿기지 않습니다.. 아직 취업 못했는데..
<img src="https://velog.velcdn.com/images/mi_nini/post/dca09664-dd83-4b22-a27c-4d7e254ee56c/image.png" alt=""><img src="https://velog.velcdn.com/images/mi_nini/post/a7f723e3-bd1b-461e-90fe-e55a7fbde2d1/image.png" alt=""></p>
</blockquote>
<hr>
<h2 id="생각정리">생각정리</h2>
<p>이번에는 따로 글로 정리하진 않았지만, 5/6반에서 모집한 기자단에 지원했고 운 좋게 선정되었다.
교육을 시작하면서부터, 나도 부트 캠프를 진행하게 된다면 배운 내용이나 그때의 생각들을 꾸준히 다시 블로그로 돌아와 남겨보자는 마음을 가지고 있었다. 이 과정이 끝난 이후에도 기록을 다시 꺼내보면서 나에게도 도움이 되고 내 글을 방문하게 된다면 방문 한 이에게도 도움이 되지 않을까 하는 생각이 들었고, 그 명분과 약간의 책임감으로 계속 써 내려간다면 쉬지 않고 앞으로 나아갈 수 있을 것 같았다.
예전에 대학교에서 만난 친해진 선배가 있었다. 폴더별로 txt 파일을 만들어 매일 기록을 남기던 분이었는데, 그때 이런 이야기를 해주셨다.
“배운 내용은 결국 다 까먹는다. 천재가 아닌 이상 계속 다시 보게 된다. 시험 기간에도 보고, 그 이후에도 보게 된다. 그리고 교수님의 지식은 내 지식이 아니니까, 반드시 내 말로 정리해봐야 한다.”
그 말을 들으면서, 단순히 하루동안 배운 내용을 나의 머리에 꾸역 넣는것과 공부를 진행하면서 기록까지 꾸준히 남기는 건 또 다른 영역이라는 생각이 들었다. 그런데 막상 조금씩이라도 기록을 시작해보면, 그게 어느 순간 습관이 되고 결국 나를 성장시키는 시간이 되는 것 같다. 지금은 나도 후배들에게 비슷한 이야기를 해줄 수 있게 된 것 같다.
2024년부터 Velog, GitHub, Notion, Obsidian 등에 사소한 것까지 기록해왔다.  연구실, 전공에서 배운 내용, 진행했던 프로젝트/막혔던 부분과 왜 찾았는지/해결했는지, 프로젝트에서 맡았던 역할, 느낀 점, 서비스 프로젝트 이후 배포나 유지보수 과정에서 겪은 어려움, 그리고 학생회나 소모임, 대회활동 같은 일상적인 경험들까지. 그렇게 쌓인 1일, 1주일, 1달, 1년의 기록들이 필요할 때마다 다시 꺼내볼 수 있는 자료가 되었고, 단순한 검색보다 훨씬 오래 기억에 남는 공부가 되는 것 같다.
아직 나는 글을 재미있고 유익하게 잘 쓰는 편은 아니지만, 쓰다 보니 자연스럽게 다른 사람의 글도 더 찾아보게 되고, 남이 읽기 편한 글, 좋은 글을 쓰기 위한 자료나 책에도 관심이 생긴다. 이것도 하나의 취미라고 할 수 있을까, 4주차 회고록을 마무리한다.</p>
<blockquote>
<p>나만의 루틴을 탄탄히 만들자, 미루지 말자.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[KT-A 4주차-1]]></title>
            <link>https://velog.io/@mi_nini/KT-A-4%EC%A3%BC%EC%B0%A8-1</link>
            <guid>https://velog.io/@mi_nini/KT-A-4%EC%A3%BC%EC%B0%A8-1</guid>
            <pubDate>Mon, 27 Apr 2026 15:09:25 GMT</pubDate>
            <description><![CDATA[<h2 id="들어가며">들어가며</h2>
<p>이번 주차는 크게 4주차-1(교육 정리)과 4주차-2(스터디 모임 회고록)에 대해 작성해 보려고 한다. 4주차에서는 AI Agent와 워크플로우 설계 대해 학습을 진행했다. 내용이 광범위하고 다음 주차, 프로젝트를 진행하기 위해서는 크게 복습을 한번 진행하는 것이 중요하다고 생각했기 때문에 주차를 나눠서 글을 작성하려고 한다. 4주차-2에서는 따로 스터디를 진행 중인 공모전/코딩테스트 스터디 모임에 대해 좀 더 이야기를 나눠보려고 한다. 이제 Agent에 내용에 관해 정리해 보자</p>
<hr>
<h1 id="1-ai-agent와-워크플로우-설계">1. AI Agent와 워크플로우 설계</h1>
<blockquote>
<p>들어가기 전 AI Agent는</p>
</blockquote>
<ul>
<li>모델 정의 (LLM 선택 및 프롬프트 엔지니어링)</li>
<li>지식 기반 구축 (RAG 및 벡터 데이터베이스 설정)</li>
<li>도구 정의 (외부 API, 웹 검색, 코드 실행 등 Tool 연동)</li>
<li>워크플로우 설계 (Planning, Reasoning, Reflection 구조화)</li>
<li>실행 및 모니터링 (실시간 대응 및 데이터 관리)
위 AI Agent 구축 사이클을 기억하자</li>
</ul>
<p>이번 과정에서는 생성형 AI를 단순히 호출하고 답변을 얻는 것을 넘어서, 언어 모델이 스스로 의사를 결정하고 도구를 사용하여 문제를 해결하는 AI Agent를 구축하는 방법을 배우게 되었다. 특히 LangChain과 LangGraph 프레임워크를 활용하여 복잡한 워크플로우를 설계하는 것이 주된 목표다.</p>
<h2 id="11-llm-활용-방식과-langchain의-역할">1.1 LLM 활용 방식과 LangChain의 역할</h2>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/817e34f3-e388-44a8-9055-f81e46d6218c/image.png" alt=""></p>
<p>대규모 언어 모델(LLM)을 우리의 데이터에 맞게 활용하는 방법은 크게 세 가지로 나눌 수 있다. 첫째는 모델을 그대로 사용하는 것이고, 둘째는 나의 데이터를 추가로 학습시키는 파인튜닝(Fine-Tuning), 그리고 셋째는 외부 지식을 검색하여 프롬프트에 포함시키는 RAG(Retrieval-Augmented Generation) 방식이다. 파인튜닝은 연산 자원과 훈련 시간, 과적합 등의 한계가 존재하기 때문에 최근에는 RAG 기반의 접근이 매우 중요해지고 있다.</p>
<p>이러한 LLM 기반 애플리케이션을 쉽게 개발하도록 돕는 프레임워크가 바로 <strong>LangChain</strong>이다. LangChain은 대규모 언어 모델을 활용하여 다양한 컴포넌트들을 체인(Chain)으로 연결해 복잡한 작업을 자동화하도록 돕는다. 주요 구성 요소로는 모델(LLM), 프롬프트, 인덱스(벡터 DB 등), 메모리, 체인, 그리고 에이전트와 도구가 있다.</p>
<h2 id="12-메시지-구성과-프롬프트-엔지니어링">1.2. 메시지 구성과 프롬프트 엔지니어링</h2>
<blockquote>
<p>LangChain에서 모델에 입력값을 전달할 때는 단순한 문자열이 아닌, 명확한 역할을 부여한 메시지 객체를 사용한다. </p>
</blockquote>
<h3 id="메시지의-종류">메시지의 종류</h3>
<ul>
<li><strong>SystemMessage</strong>: AI에게 지침이나 역할, 성격을 지정하는 메시지다.</li>
<li><strong>HumanMessage</strong>: 사용자의 질문이나 요청을 담는 메시지다.</li>
<li><strong>AIMessage</strong>: AI가 반환한 응답을 나타낸다.</li>
</ul>
<p>메시지를 구성할 때는 튜플 방식과 객체 방식을 모두 사용할 수 있다.</p>
<table>
<thead>
<tr>
<th align="left">구분</th>
<th align="left">튜플 방식 <code>(&quot;role&quot;, &quot;content&quot;)</code></th>
<th align="left">객체 방식 <code>HumanMessage(content=...)</code></th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>주요 용도</strong></td>
<td align="left">유연한 메시지 구성, 프롬프트 템플릿 정의</td>
<td align="left">고정된 메시지, 메시지 객체 직접 조작 및 메모리 관리</td>
</tr>
<tr>
<td align="left"><strong>장점</strong></td>
<td align="left">코드가 간결하고 직관적임</td>
<td align="left">객체 지향적이며 엄격한 타입 체크에 유리함</td>
</tr>
</tbody></table>
<p>이러한 메시지들을 구조화하여 다중 메시지 기반의 흐름을 만드는 것이 <strong>ChatPromptTemplate</strong>이다. 프롬프트를 설계할 때는 역할(Role), 맥락과 목적(Context &amp; Goal), 답변 형식(Format)을 명확하게 명시하는 프롬프트 엔지니어링이 필수적이다.</p>
<h2 id="13-모델의-답변-무작위성-제어">1.3. 모델의 답변 무작위성 제어</h2>
<blockquote>
<p>LLM은 내부적으로 다음 단어가 등장할 확률을 계산하여 텍스트를 생성한다. 이 생성 과정의 다양성과 무작위성을 제어하기 위해 몇 가지 중요한 파라미터를 조절할 수 있다.</p>
</blockquote>
<ul>
<li><strong>Temperature</strong>: 확률 분포 자체를 조절한다. 0에 가까울수록 가장 확률이 높은 단어만 선택하여 일관되고 논리적인 답변을 생성하며, 1 이상으로 높아질수록 낮은 확률의 단어도 선택할 가능성이 생겨 창의적인 답변을 도출한다.</li>
<li><strong>Top_k</strong>: 확률이 가장 높은 상위 K개의 단어만 다음 단어의 후보로 제한하는 방식이다.</li>
<li><strong>Top_p</strong>: 단어들의 누적 확률이 p 이상이 되는 최소 집합을 후보로 삼는다. 예를 들어 0.9로 설정하면, 상위 확률 단어들을 더해 총합이 90%가 되는 순간까지만 후보군에 포함시킨다.</li>
</ul>
<h2 id="14-파이프라인-구성과-출력-결과-구조화">1.4. 파이프라인 구성과 출력 결과 구조화</h2>
<blockquote>
<p>LangChain의 진정한 강력함은 컴포넌트들을 연결하는 <strong>LCEL(LangChain Expression Language)</strong>에서 나온다. 파이프(<code>|</code>) 연산자를 사용하여 데이터가 흐르는 직관적인 파이프라인을 구축할 수 있다.</p>
</blockquote>
<pre><code class="language-python"># LCEL을 이용한 체인 구성 예시
chain = prompt | llm | parser
response = chain.invoke({&quot;user_input&quot;: &quot;추천 도서 알려줘&quot;})</code></pre>
<p>여기서 마지막에 연결된 parser는 Output Parser(출력 파서)를 의미한다. LLM은 기본적으로 단순한 문자열 텍스트를 반환하지만, 실제 애플리케이션 개발에서는 리스트나 JSON과 같이 구조화된 데이터가 필요한 경우가 많다.</p>
<p>이때 PydanticOutputParser를 활용하면 매우 편리하다. 파이썬의 Pydantic 라이브러리를 통해 우리가 원하는 데이터 스키마(예: 책 제목, 저자, 출판년도)를 명확히 정의하고, 모델이 해당 구조에 맞게 응답하도록 프롬프트 지침을 주입할 수 있다. 또한 반환된 데이터의 타입이 맞는지 자동으로 검증까지 수행해주어 출력의 안정성을 크게 높여준다.</p>
<blockquote>
<p>참고/출처
<a href="https://docs.langchain.com/">https://docs.langchain.com/</a>
<a href="https://brunch.co.kr/@ywkim36/147">https://brunch.co.kr/@ywkim36/147</a>
<a href="https://www.samsungsds.com/kr/insights/what-is-langchain.html">https://www.samsungsds.com/kr/insights/what-is-langchain.html</a>
<a href="https://aws.amazon.com/ko/what-is/langchain/">https://aws.amazon.com/ko/what-is/langchain/</a>
<a href="https://pangguinland.tistory.com/318">https://pangguinland.tistory.com/318</a></p>
</blockquote>
<hr>
<hr>
<h1 id="2rag-기반-파이프라인-구축">2.RAG 기반 파이프라인 구축</h1>
<p>대규모 언어 모델(LLM)은 자신이 학습하지 않은 최신 정보나 내부 비공개 문서에 대해서는 알지 못하며, 잘못된 정보를 사실처럼 말하는 할루시네이션(Hallucination) 문제가 발생하기 쉽다. LLM의 한계를 극복하기 위해 외부 지식을 검색하여 답변의 근거로 활용하는 <strong>RAG(Retrieval-Augmented Generation)</strong> 기술과 그 파이프라인 구축 과정을 정리!</p>
<h2 id="21-rag-개념의-이해">2.1. RAG 개념의 이해</h2>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/3f880831-9b56-42d7-a7b4-e97f443605bb/image.png" alt=""></p>
<p>RAG는 쉽게 말해 &#39;검색(Retrieval)&#39;과 &#39;생성(Generation)&#39;을 결합한 기술이다. 사용자가 질문을 던지면 LLM이 바로 답변을 생성하는 것이 아니라, 먼저 준비된 <strong>지식 데이터베이스(Vector DB)</strong>에서 질문과 관련된 문서(Context)를 검색하여 찾아낸다. 그런 다음 검색된 문서의 내용을 프롬프트에 포함시켜 LLM에게 전달하고, LLM은 주어진 문맥만을 바탕으로 정확한 답변을 생성하게 된다.</p>
<p>이러한 시스템을 구축하기 위해서는 문서를 컴퓨터가 이해하고 검색할 수 있는 형태로 변환하여 저장하는 Vector DB 구축 과정이 선행되어야 한다.</p>
<h2 id="22-vector-db-구축-절차">2.2. Vector DB 구축 절차</h2>
<blockquote>
<p>Vector DB를 만드는 과정은 크게 4가지 단계(Load -&gt; Split -&gt; Embed -&gt; Store)로 이루어진다.</p>
</blockquote>
<h3 id="1-데이터-불러오기-load">(1) 데이터 불러오기 (Load)</h3>
<p>가장 먼저 할 일은 다양한 포맷의 파일로부터 텍스트를 추출하는 것이다. LangChain에서는 <code>Loader</code>라는 도구를 제공하며, 파일 형식에 따라 알맞은 로더를 사용한다. 일반적인 텍스트 파일은 <code>TextLoader</code>, PDF 파일은 <code>PyMuPDFLoader</code>, CSV 파일은 <code>CSVLoader</code>를 사용하여 문서를 읽어 들인다. 로드된 데이터는 텍스트 내용(<code>page_content</code>)과 메타데이터(<code>metadata</code>)를 포함하는 <strong>Document 객체</strong> 형태로 변환된다.</p>
<h3 id="2-텍스트-분할-split">(2) 텍스트 분할 (Split)</h3>
<p>문서를 로드했다고 해서 그대로 LLM에 던져줄 수는 없다. LLM이 한 번에 처리할 수 있는 입력 토큰 수에 제한이 있기 때문이다. 따라서 긴 문서를 의미 있는 작은 단위인 <strong>청크(Chunk)</strong>로 나누는 작업이 필요한데, 이를 텍스트 분할이라고 한다. </p>
<p>텍스트를 나눌 때는 단순히 글자 수로만 자르면 문맥이 끊어질 수 있으므로, 문단이나 문장 단위를 고려하고 청크 간에 내용이 일부 겹치도록 설정하는 것이 중요하다. LangChain의 <code>CharacterTextSplitter</code>를 사용하면 최대 글자 수(<code>chunk_size</code>)와 겹치는 글자 수(<code>chunk_overlap</code>)를 지정하여 문서를 분할할 수 있다. 적절한 청크 크기(보통 300~800자)와 오버랩을 설정하는 것이 RAG의 검색 품질을 좌우하는 핵심 요소 중 하나다.</p>
<h3 id="3-텍스트-벡터화-embed">(3) 텍스트 벡터화 (Embed)</h3>
<p>분할된 텍스트 청크들은 텍스트 자체로는 수학적 검색이 불가능하므로, 이를 숫자로 이루어진 벡터(Vector)로 변환해야 한다. 이 과정을 <strong>임베딩(Embedding)</strong>이라고 하며, 텍스트의 의미적 정보를 다차원 공간의 좌표로 매핑하는 것이다. OpenAI의 <code>text-embedding-3-small</code>과 같은 모델을 주로 사용하며, 의미가 유사한 텍스트일수록 벡터 공간 상에서 서로 가까운 위치에 놓이게 된다.</p>
<h3 id="4-벡터-저장소에-저장-store">(4) 벡터 저장소에 저장 (Store)</h3>
<p>마지막으로 임베딩된 벡터 데이터들을 효율적으로 저장하고 검색할 수 있는 데이터베이스에 보관한다. 이를 <strong>Vector Store</strong>라고 부른다.</p>
<h2 id="23-유사도-검색-원리">2.3. 유사도 검색 원리</h2>
<blockquote>
<p>Vector DB에 문서가 저장되었다면, 이제 사용자의 질문을 임베딩하여 DB에 저장된 문서 벡터들과 비교할 수 있다. 이때 주로 사용되는 수학적 기준이 <strong>코사인 유사도(Cosine Similarity)</strong>다.</p>
</blockquote>
<p>코사인 유사도는 두 벡터가 이루는 각도를 계산하여 텍스트 간의 의미적 유사성을 측정한다. 값이 1에 가까울수록 문맥적 의미가 매우 유사함을 뜻하며, 0이면 관계가 없고, -1이면 반대 의미를 가짐을 나타낸다. 시스템은 질문 벡터와 코사인 유사도가 가장 높은 상위 K개의 문서를 추출하여 응답의 근거로 사용한다.</p>
<h2 id="24-rag-파이프라인chain-구성">2.4. RAG 파이프라인(Chain) 구성</h2>
<blockquote>
<p>지식 DB 준비가 끝났다면, 사용자의 질문을 받아 검색하고 답변을 생성하는 전체 파이프라인을 LCEL 문법으로 엮어주어야 한다.</p>
</blockquote>
<p><strong>1단계: Retriever 선언</strong>
Vector DB를 검색기(Retriever)로 변환한다. <code>.as_retriever()</code> 함수를 사용하며, 코사인 유사도를 기준으로 상위 몇 개(k)의 문서를 가져올지 설정한다.</p>
<p><strong>2단계: RAG 전용 프롬프트 정의</strong>
LLM이 외부 지식을 활용해 답변하도록 역할을 고정하고, 제공된 문맥(Context) 내에서만 답하도록 프롬프트를 설계한다. 특히 &quot;제공된 문맥에 답이 없다면 모른다고 답변하고 억지로 지어내지 마라&quot;는 조건을 명시하여 할루시네이션을 방지한다.</p>
<p><strong>3단계: LCEL 체인 연결</strong>
입력된 질문이 Retriever를 통과해 관련 문서(Context)를 찾아오고, 이 문맥과 원본 질문이 프롬프트 템플릿에 삽입된 후 LLM을 거쳐 최종 답변이 나오는 체인을 구성한다.</p>
<pre><code class="language-python"># 문서 객체 리스트를 하나의 문자열로 결합하는 포맷 함수
def format_docs(docs):
    return &quot;\n\n&quot;.join(doc.page_content for doc in docs)

# LCEL 기반 RAG 파이프라인 구성
rag_chain = (
    {&quot;context&quot;: retriever | format_docs, &quot;question&quot;: RunnablePassthrough()}
    | prompt
    | llm
)

# 챗봇 실행
response = rag_chain.invoke(&quot;가장 심각한 사이버 보안 위험이 뭐야?&quot;)</code></pre>
<h2 id="25-rag-성능-최적화-고려-사항">2.5. RAG 성능 최적화 고려 사항</h2>
<blockquote>
<p>RAG 파이프라인이 제대로 동작하더라도 검색 품질이나 생성 결과가 아쉬울 수 있다. 이를 개선하기 위해 다음과 같은 요소들을 튜닝해야 한다.</p>
</blockquote>
<ul>
<li><p>청크 전략: 문서의 특성에 맞춰 chunk_size와 chunk_overlap을 조정한다. 청크가 너무 작으면 문맥이 잘리고, 너무 크면 여러 주제가 섞여 유사도 검색 성능이 떨어진다.</p>
</li>
<li><p>검색 개수(k): LLM의 입력 토큰 한계를 넘지 않는 선에서 충분한 문맥을 제공하기 위해 최적의 k값을 찾는다 (보통 3~5개).</p>
</li>
<li><p>프롬프트 고도화: 출력의 제약(길이, 형식 등)을 프롬프트에 구체적으로 명시할수록 응답의 일관성이 향상된다.</p>
</li>
</ul>
<blockquote>
<p>참고/출처
<a href="https://m.blog.naver.com/rainbow-brain/224072340830">https://m.blog.naver.com/rainbow-brain/224072340830</a>
<a href="https://kr.linkedin.com/pulse/unlocking-power-rag-pipelines-enhancing-ai-real-time-data-zaveri--lmzif?tl=ko">https://kr.linkedin.com/pulse/unlocking-power-rag-pipelines-enhancing-ai-real-time-data-zaveri--lmzif?tl=ko</a>
<a href="https://m.blog.naver.com/rainbow-brain/224040868079">https://m.blog.naver.com/rainbow-brain/224040868079</a></p>
</blockquote>
<hr>
<h1 id="3-ai-agent---langgraph">3. AI Agent - LangGraph</h1>
<p>모델이 단순히 주어진 질문에 대답하는 것을 넘어서, 주어진 목표를 달성하기 위해 스스로 계획을 세우고 도구를 활용하며 문제를 해결하도록 만들 수는 없을까? 능동적인 문제 해결 시스템인 <strong>AI Agent</strong>의 개념과, 이 에이전트의 복잡한 작업 흐름을 통제하기 위한 <strong>LangGraph</strong>의 정리!</p>
<h2 id="31-ai-agent란-무엇인가">3.1. AI Agent란 무엇인가?</h2>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/1f5b8b26-82f6-4998-babe-0dc3d27612f2/image.gif" alt=""></p>
<p><strong>AI Agent</strong>는 스스로 의사를 결정하며, 도구를 사용하여 목표를 달성하는 시스템이다. 단순한 텍스트 생성을 넘어, 다단계 추론과 외부 도구 호출 능력을 결합한 것이 특징이다. 즉, 언어 모델(LLM)에 손과 발, 그리고 기억력을 달아주어 하나의 독립적인 작업자로 만드는 과정이라고 이해할 수 있다.</p>
<p>AI Agent는 크게 네 가지 핵심 요소로 구성된다.</p>
<ul>
<li>첫째, 시스템이 최종적으로 해결해야 할 <strong>목표(Goal)</strong>다.</li>
<li>둘째, 이 목표를 달성하기 위해 계획을 세우고 판단을 내리는 두뇌 역할의 <strong>추론 엔진(Reasoning Engine)</strong>이며 주로 GPT 같은 LLM이 담당한다.</li>
<li>셋째, 웹 검색, 계산기, 사내 API 등 에이전트가 호출하여 사용할 수 있는 외부 기능인 <strong>도구(Toolset)</strong>다.</li>
<li>넷째, 이전의 대화나 수집한 정보, 현재의 진행 상황을 저장하고 추적하는 공간인 <strong>메모리와 상태(Memory/State)</strong>다.</li>
</ul>
<h2 id="32-워크플로우-제어를-위한-langgraph">3.2. 워크플로우 제어를 위한 LangGraph</h2>
<p>이러한 Agent 시스템을 구축하기 위한 프레임워크로는 여러 가지가 있지만, 복잡한 다단계 프로세스를 개발자가 원하는 대로 세밀하게 제어하기 위해 LangGraph를 활용한다. LangGraph는 에이전트의 작업 흐름을 그래프(Graph) 구조로 설계할 수 있게 해준다.</p>
<p>LangGraph를 구성하는 핵심 요소는 다음과 같다.</p>
<ul>
<li><strong>State (상태)</strong>: 그래프 전체를 관통하며 현재 상태 값을 저장하고 전달하는 역할을 한다. 에이전트가 통과하는 각 단계마다 정보가 누적되며, 파이썬의 <code>TypedDict</code>를 사용하여 어떤 데이터가 들어갈지 딕셔너리 형태로 명확히 구조를 정의한다.</li>
<li><strong>Node (노드)</strong>: 특정 작업이나 판단을 수행하는 실제 단위다. 파이썬 함수로 구현되며, 상태(State)를 입력으로 받아 특정 작업을 수행한 후 업데이트된 상태를 반환한다.</li>
<li><strong>Edge (엣지)</strong>: 노드와 노드를 연결하는 선으로, 작업의 흐름을 정의한다. 한 노드의 작업이 완료된 후 다음으로 이동할 노드를 지정한다.</li>
<li><strong>Conditional Edge (조건부 엣지)</strong>: 단순한 순차적 이동이 아니라, 특정 조건이나 상태 값에 따라 노드 간의 분기 처리를 수행할 때 사용한다.</li>
</ul>
<h2 id="33-에이전트-워크플로우의-세-가지-기본-패턴">3.3. 에이전트 워크플로우의 세 가지 기본 패턴</h2>
<p>상태와 노드, 엣지를 조합하면 다양한 형태의 워크플로우를 설계할 수 있다. (세 가지 그래프 구조를 학습)</p>
<h3 id="1-단순-그래프-simple-graph">(1) 단순 그래프 (Simple Graph)</h3>
<p>입력, 처리, 출력으로 이어지는 단순한 파이프라인 형태다. 가장 기본적인 구조로, 시작점(START)에서 출발해 정의된 노드들을 차례대로 거친 후 종료점(END)에 도달한다.</p>
<h3 id="2-라우팅-routing">(2) 라우팅 (Routing)</h3>
<p>사용자의 입력이나 특정 조건에 따라 서로 다른 경로를 선택하여 실행 흐름을 제어하는 구조다. 이때 조건부 엣지(Conditional Edge)가 핵심적인 역할을 한다. </p>
<p>강의에서는 입력된 숫자가 짝수인지 홀수인지 판별하여 각각 다른 노드를 실행하는 예제를 다루었다. 짝수/홀수 판별 함수를 먼저 만들고, 이를 조건부 엣지에 연결하여 흐름을 동적으로 분기시키는 방식이다.</p>
<pre><code class="language-python"># 조건 분기를 결정하는 라우터 함수
def parity_condition(state: State):
    return &quot;even&quot; if state[&quot;number&quot;] % 2 == 0 else &quot;odd&quot;

# 조건부 엣지 추가 (check_parity 노드 실행 후 분기)
builder.add_conditional_edges(
    &quot;check_parity&quot;, 
    parity_condition,
    {&quot;even&quot;: &quot;even_node&quot;, &quot;odd&quot;: &quot;odd_node&quot;}
)</code></pre>
<h3 id="3-반추-reflection">(3) 반추 (Reflection)</h3>
<p>에이전트가 스스로의 추론 과정이나 결과물을 돌아보고 피드백을 생성하여, 결과가 만족스러울 때까지 반복 작업을 수행하는 메커니즘이다. 그래프 상에서 특정 노드에서 종료로 가지 않고 다시 이전 노드로 돌아가는 루프(Loop)를 형성하여 구현한다.</p>
<p>예를 들어, 문서를 요약하는 노드를 거친 후 결과의 만족도를 평가한다. 평가 결과가 &#39;만족&#39;이면 시스템을 종료하지만, &#39;불만족&#39;이면 다시 생각해보기(반추) 노드를 거쳐 원래의 요약 노드로 되돌아간다. 이러한 순환 구조를 통해 에이전트는 한 번에 완벽한 답을 내지 못하더라도, 점진적으로 결과물의 품질을 향상시킬 수 있다.</p>
<blockquote>
<p>참고/출처
<a href="https://wikidocs.net/268610">https://wikidocs.net/268610</a>
<a href="https://cobusgreyling.medium.com/whats-your-definition-of-an-ai-agent-edb7d5e1c760">https://cobusgreyling.medium.com/whats-your-definition-of-an-ai-agent-edb7d5e1c760</a>
<a href="https://www.langchain.com/langgraph">https://www.langchain.com/langgraph</a></p>
</blockquote>
<hr>
<hr>
<h1 id="4-ai-agent와-tool-활용">4. AI Agent와 Tool 활용</h1>
<p>도구(Tool) 활용법과, 과거의 대화를 기억하며 도구를 능동적으로 사용하는 실질적인 챗봇 에이전트 구축 과정을 정리!</p>
<h2 id="41-ai-agent와-tool의-역할">4.1. AI Agent와 Tool의 역할</h2>
<p>일반적인 대규모 언어 모델은 사용자의 입력을 받아 단순히 텍스트 응답을 생성한다. 하지만 실제 업무에서는 실시간 웹 검색이 필요하거나, 정확한 수학 계산을 해야 하거나, 사내 데이터베이스를 조회해야 하는 등 외부 시스템과의 상호작용이 필수적이다. </p>
<p>이러한 외부 기능들을 에이전트가 사용할 수 있도록 묶어놓은 것을 Tool(도구)이라고 부른다. 모델은 사용자의 질문을 분석한 뒤, 스스로 판단하여 필요한 시점에 적절한 도구를 호출(Tool Call)하고 그 결과를 바탕으로 최종 응답을 만들어낸다. </p>
<p>도구는 크게 두 가지로 나뉜다.</p>
<ul>
<li><strong>Custom Tool</strong>: 우리가 필요에 따라 파이썬 함수로 직접 정의하고 만든 도구다.</li>
<li><strong>외부 도구</strong>: 검색 엔진(Tavily 등), 날씨 API 등 외부 업체에서 미리 만들어 제공하는 도구다.</li>
</ul>
<h2 id="42-메모리를-가진-대화형-챗봇-만들기-state-관리">4.2. 메모리를 가진 대화형 챗봇 만들기 (State 관리)</h2>
<p>도구를 사용하는 복잡한 에이전트를 만들기 전, 먼저 에이전트가 과거의 대화를 기억하게 만들어야 한다. LangGraph에서는 이를 <strong>State</strong>를 통해 관리한다. </p>
<p>단순히 텍스트 하나만 주고받는 것이 아니라, 대화 기록 전체를 리스트 형태로 State에 담아 관리해야 문맥이 유지된다. 이때 매번 기존 리스트를 덮어쓰는 것이 아니라 새로운 메시지를 계속 누적해서 추가(Append)해야 하는데, LangGraph는 이를 아주 쉽게 구현할 수 있도록 <code>add_messages</code>라는 기능을 제공한다.</p>
<pre><code class="language-python">from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph.message import add_messages

# 대화 이력을 자동으로 누적해서 관리하는 State 구조
class State(TypedDict):
    messages: Annotated[list, add_messages]
</code></pre>
<p>이렇게 Annotated와 add_messages를 활용해 State를 정의하면, 새로운 메시지가 반환될 때마다 프레임워크가 알아서 기존 메시지 목록의 맨 뒤에 새 메시지를 추가해 준다. 이를 통해 모델은 항상 전체 대화 히스토리를 보며 자연스러운 맥락을 이어갈 수 있다.</p>
<h2 id="43-custom-tool-만들기-및-모델에-연결하기">4.3. Custom Tool 만들기 및 모델에 연결하기</h2>
<p>에이전트에게 쥐어줄 도구를 만드는 방법은 매우 간단하다. 일반적인 파이썬 함수를 작성한 뒤, 그 위에 @tool 데코레이터만 붙여주면 LangChain이 인식할 수 있는 도구로 변환된다. 이때 함수 내부의 매개변수 타입과 독스트링을 명확히 적어주는 것이 중요한데, 모델이 이 설명을 읽고 언제 어떻게 이 도구를 써야 할지 결정하기 때문이다.</p>
<pre><code class="language-python">from langchain_core.tools import tool

# 계산기 도구 정의
@tool
def calculator_tool(expression: str) -&gt; str:
    &quot;&quot;&quot;수학 수식을 입력받아 계산 결과를 반환합니다.&quot;&quot;&quot;
    return str(eval(expression))

# 1. 사용할 도구들을 리스트로 묶기
tools = [calculator_tool]

# 2. LLM에 도구 목록 연결 (Binding)
llm_with_tools = llm.bind_tools(tools)</code></pre>
<p>가장 핵심적인 부분은 만든 도구들을 리스트로 묶어 LLM에 바인딩하는 것이다. 이 과정을 거쳐야만 LLM이 자신에게 어떤 무기들이 주어졌는지 인지하고, 필요할 때 함수 실행을 요청할 수 있다.</p>
<h2 id="44-tool을-사용하는-agent-워크플로우-구성">4.4. Tool을 사용하는 Agent 워크플로우 구성</h2>
<p>이제 모델과 도구를 LangGraph의 노드와 엣지로 엮어 실제 에이전트의 워크플로우를 구성할 차례다. 도구를 사용하는 에이전트의 흐름은 대체로 다음과 같은 순환 구조를 가진다.</p>
<pre><code>사용자 입력: 사용자가 질문을 던진다.

모델 판단 (call_model 노드): LLM이 질문을 분석한다. 만약 도구 사용이 필요 없다면 바로 최종 답변을 생성하고 종료(END)한다.

도구 호출 요청: 도구가 필요하다고 판단되면, LLM은 응답 텍스트 대신 &quot;이 도구를 이런 매개변수로 실행해줘&quot;라는 Tool Call 명령을 내뱉는다.

조건부 분기: 조건부 엣지가 모델의 응답을 확인하여 Tool Call이 포함되어 있다면 흐름을 도구 실행 노드로 보낸다.

도구 실행 (tools 노드): ToolNode가 실제 파이썬 함수를 실행하고 그 결과값을 State의 messages에 추가한다.

결과 피드백: 흐름은 다시 모델 판단 노드(call_model)로 돌아간다. LLM은 방금 실행된 도구의 결과값을 확인하고, 이를 바탕으로 최종 답변을 정리하여 사용자에게 전달한다.</code></pre><p>이러한 과정을 통해 에이전트는 한 번에 답을 내기 어려운 복잡한 문제도 스스로 도구를 여러 번 호출해가며 해결책을 찾기</p>
<hr>
<h2 id="생각정리">생각정리</h2>
<p>Agent에 대한 공부는 처음이 아니었지만, 이번에는 이전보다 훨씬 깊이 있게 개념을 탐색하고 정리할 수 있었던 시간이었다. 단순히 겉핥기식으로 이해하는 것이 아니라, 직접 검색하고 구조를 파악하면서 개념을 보다 명확하게 이해할 수 있었다는 점에서 의미가 크다.
과거에는 Agent를 학습할 때 GitHub에서 스타가 많은 레포지토리를 중심으로 글을 읽고, 코드를 클론하여 실행해보는 방식에 집중했었다. 또한 실제 프로젝트에 Agent가 필요한지, 필요하다면 어떻게 적용할 수 있을지에 대한 고민보다는 구현 자체에 초점을 맞췄던 것 같다. 일종의 ‘바이브 코딩’에 가까운 접근이었다.
하지만 이번 학습을 통해 Agent의 전체적인 구조와 동작 방식, 그리고 실제로 어떻게 활용해야 하는지에 대해 한 단계 더 깊이 이해할 수 있었다. 단순히 사용하는 것을 넘어서, 어떤 상황에서 적절하게 적용할 수 있는지를 고민하게 되었다는 점이 가장 큰 변화다.
최근에는 다양한 Agent들이 등장하고 있고, 나 역시 <a href="https://github.com/github/copilot-cli">GitHub Copilot</a>, <a href="https://github.com/cursor">Cursor</a>, <a href="https://github.com/openai/codex">Codex</a>,  <a href="https://github.com/ultraworkers/claw-code">Claw-Code</a> 등 여러 도구의 도움을 많이 받고 있다. 이러한 흐름 속에서 Agent를 단순한 도구로 사용하는 것을 넘어, 나에게 가장 잘 맞는 형태로 어떻게 활용할 수 있을지 고민하는 것이 중요하다고 느꼈다.
이번 학습은 단순한 개념 이해를 넘어서, 앞으로 내가 진행할 프로젝트에 Agent를 왜 필요할지, 어떻게 활용하면 좋을지, 왜 화두가 되고 모두가 편리하게 사용하는지에 관한 생각을 하게했던거 같다. 4주차 공부를 마무리한다. </p>
<blockquote>
<p>결국 차이를 만드는 것은 도구가 아니라, 그것을 바라보는 관점이다</p>
</blockquote>
<h3 id="github-private"><a href="https://github.com/KT-E/04-Week">Github-Private</a></h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[KT-A 3주차 회고록 ]]></title>
            <link>https://velog.io/@mi_nini/KT-A-3%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%A1%9D</link>
            <guid>https://velog.io/@mi_nini/KT-A-3%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%A1%9D</guid>
            <pubDate>Sun, 26 Apr 2026 17:02:50 GMT</pubDate>
            <description><![CDATA[<h2 id="들어가며">들어가며</h2>
<p>이번주차는 크게 처음으로 미니프로젝트조가 생겨 조원들7명과 함께 미니프로젝트 및 아이데이션을 준비하게 되었다. 에이블 스쿨에서는 오프라인으로 에이블러들과 프로젝트를 진행 할 수 있게 강의실을 예약해서 이용할 수 있는데 수도권인 경우 KT 전농지점과 KT 판교빌딩 2곳이 있다. 나는 집에서 가기편한곳인 전농교육장을 예약해 방문했다.</p>
<hr>
<h2 id="01-miniproject">01-MiniProject</h2>
<blockquote>
<p>전농교육장
<img src="https://velog.velcdn.com/images/mi_nini/post/e638ca80-3c49-4233-8504-22a06f5c89ff/image.jpg" alt=""></p>
</blockquote>
<p>나포함 조원 6명이 전농교육장에 방문해 함께 프로젝트를 진행했다.. 다른 사진을 하나도 안찍었네.. 우리가 한 프로젝트를 간단하게 봐보자</p>
<blockquote>
<p>데이터 분포도 일부 확인</p>
</blockquote>
<table style="width:100%; text-align:center;">
  <tr>
    <td style="width:50%;">
      <img src="https://velog.velcdn.com/images/mi_nini/post/1b911547-6064-4de1-8c1f-31f8a34ce883/image.png" style="width:100%;">
    </td>
    <td style="width:50%;">
      <img src="https://velog.velcdn.com/images/mi_nini/post/65d5f948-3ab7-41fe-bfde-f7ab5643d973/image.png" style="width:100%;">
    </td>
  </tr>
</table>


<blockquote>
<p>모델 학습
<img src="https://velog.velcdn.com/images/mi_nini/post/6de497de-af05-4c05-8f36-698754b8e2b6/image.png" alt="">
<img src="https://velog.velcdn.com/images/mi_nini/post/d58348fe-84fa-41a1-a03f-f5f44b8145e4/image.png" alt=""></p>
</blockquote>
<p>처음은 개인이 지정된 csv를 불러와 데이터 분석/전처리부터 시작해 직접 모델을 만들고 평가로 진행했다. 그 후 조원들과 개인이 작성한 코드에 대한 리뷰를 진행하는 시간이 충분히 주어져 조원들과 모델에 loss 값을 낮추기 위해 어떤 점을 보완하고 추가했으면 좋겠다는 의견을 많이 나눠서 좋았다. (랜덤이지만 처음 미니 프로젝트 조원들을 너무 잘 만난 거 같다) 우리조에서 나온 리뷰를 나열하자면</p>
<ul>
<li>과적합에 대한 문제점이 무엇일까</li>
<li>Class에 가중치를 둬 학습해보기</li>
<li>EarlyStopping/ModelCheckpoint를 활용</li>
<li>Dense를 깊게/얇게 조정하면서 시도하기</li>
<li>Dropout/Learning rate/Batch_size등 값 조절하기</li>
<li>새로운데이터와 기존데이터에 새롭게(기존 모델구조와 같게)모델 학습 vs 새로운데이터와 기존모델을 불러와 재학습에 대한 리뷰</li>
<li>code를 쓰면서 왜 사용하고 어떻게 표현해야하는지</li>
</ul>
<p>들을 진행하고 하나의 코드로 통일해 미션을 끝냈다. 
(1번째 미니프로젝트가 끝나고 퇴근시간인 2호선, 1호선을 타고 집으로 가면서 죽을뻔했네)</p>
<hr>
<h2 id="아이데이션">아이데이션</h2>
<p>아이데이션이라는 단어를 들어봤는데 이게 머였지..? 검색해 보자</p>
<blockquote>
<p>아이데이션(Ideation)은 광고, 기획, 디자인 분야에서 새로운 아이디어를 생성(Generating), 발전(Developing), 커뮤니케이션(Communicating)하는 전 과정을 뜻하는 핵심적인 창의적 프로세스
<img src="https://velog.velcdn.com/images/mi_nini/post/2b7d598e-a6b2-4ae8-b07f-f84f4c4184da/image.png" alt=""></p>
</blockquote>
<p>01-미니 프로젝트를 진행한 조원들과 함께 진행하게 되었다. 정부가 운영하고 있는 나라장터나 최근 이슈가 되는 기업, 정부 관련된 뉴스를 조사해 각자 아이디어를 내고 토론하는 자리였다. 조원들과 토론하면서 각자 자신이 정한 아이디어에 대해 &quot;이 서비스를 만들어야 하는 이유&quot;, &quot;서비스를 기업/정부에 제시한다면 설득력이 있을까?&quot;를 고민하게 하고 요구사항을 맞춰야 한다고 생각했다. 그렇게 작성을 진행했었는데 감사하게도 내가 조사한 과제명이 뽑혀 내 아이디어를 가지고 어떻게 더 발전할 수 있을지에 대해 토론하고 결과물을 내는 시간이었다. (결과물을 제출하기 전에 피드백을 받고 수정할 수 있는 시간이 있어서 좀 더 퀄리티 있는 결과물을 제출할 수 있었던 거 같다.)</p>
<hr>
<h2 id="생각정리">생각정리</h2>
<p>에이블 스쿨에 입교해 처음으로 팀원들이 생긴 귀중한 시간이었던 거 같고 개인/팀원으로써 코드/리뷰 와 서비스 개발에 필요한 아이디어(?) 마음가짐 등을 배울 수 있었던 자리여서 좋은 시간이었던 거 같다. 아쉬운점이라면 원하던 결과물을 만들기에는 시간이 조금 부족했던 점과 팀원들과 많이 소통을 못 해본 것이 아쉽다.
누구나 그렇다고 생각하지만 처음 대면한 사람을 만나고 대화를 한다는 것은 쉽지 않은 거 같다. 우리반에서는 OT-자기소개 시간에 MBTI를 말하는 시간이 있었는데 내 기억상 90% 이상이 I인 것으로 기억한다. (컴퓨터 만지는 사람이 보통 그런가..?)
그래도 오랜만에 팀프로젝트를 진행하며 좋은 감점을 느꼇다. 활동을 하면서 대학교에서 과대표나 멘토 멘티를 하면서 느꼈던 &quot;<strong>상대방이 모르는 부분에 대해 알려주고 이해한 상대방이 만족을 느꼈을 때에 대한 행복</strong>&quot;울 느꼈던 거 같다. 이 감정을 느끼는 방식은 남들과 조금 다를 수 있지만, 나에게는 지금까지 꾸준히 공부할 수 있게 만든 원동력 중 하나이며, 팀원에게 한마디 더 건넬 수 있는 자신감의 근원이기도 하다. (먼저 다가가야 상대방도 마음을 열것이다..!) 프로젝트를 짧게 진행해 이번 조원들과의 만남이 아쉽지만 다른 프로젝트와 활동을 하면서 같이 성장하고 싶은 마음이 드는 하루라고 생각하며 3주 차를 마무리한다.</p>
<blockquote>
<p>내일은 없다. </p>
</blockquote>
<h3 id="github-private"><a href="https://github.com/KT-E/01-Miniproject">Github-Private</a></h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[KT-A 2주차 ]]></title>
            <link>https://velog.io/@mi_nini/KT-A-2%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@mi_nini/KT-A-2%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sun, 26 Apr 2026 12:10:41 GMT</pubDate>
            <description><![CDATA[<h2 id="들어가며">들어가며</h2>
<p>ML에 대해 2일 동안 DL에 대해 1일 학습을 진행했다. 기간이 짧은 기간 동안 중요한내용을 빠르게 학습하고 바로 실습(코드)으로 진행해 개인이 문제를 해결하기보다 라이브러리 및 함수에 대해 익숙해지고 학습한 모델이 어떤구조와 어떤 흐름으로 이어가는지에 대한 전체적인 이해를 배운 거 같다. 정리해보자</p>
<hr>
<h2 id="1-머신러닝-machine-learning">1. 머신러닝 (Machine Learning)</h2>
<blockquote>
<p>들어가기전 머신러닝은 </p>
</blockquote>
<ul>
<li>문제 정의 </li>
<li>데이터 준비(데이터 전처리) </li>
<li>모델링(알고리즘 적용) </li>
<li>평가 </li>
<li>성능 최적화(튜닝)
위 사이클을 꼭 기억하기</li>
</ul>
<hr>
<h3 id="1-1-데이터-전처리">1-1. 데이터 전처리</h3>
<p>알고리즘에 데이터를 넣기 전, 모델이 데이터를 잘 이해할 수 있도록 가공하는 필수 단계 </p>
<ul>
<li>결측치 처리: 비어있는 데이터(NaN)를 평균, 중앙값 등으로 채우거나 행 자체를 삭제한다.</li>
<li>가변수화 (One-Hot Encoding): 머신러닝 모델은 문자를 이해하지 못하므로, 범주형 데이터(예: 성별, 혈액형)를 0과 1로 이루어진 변수로 변환해 주어야 한다.</li>
<li>스케일링 (Scaling): 변수마다 값의 범위가 다르면(예: 나이는 10<del>80, 연봉은 3000</del>10000) 단위가 큰 변수에 모델이 가중치를 과도하게 둘 수 있다. 따라서 모든 변수의 범위를 0~1 사이로 맞추는 정규화(MinMaxScaler)나 평균 0, 표준편차 1로 맞추는 표준화(StandardScaler)를 진행한다. 거리 기반 알고리즘(KNN 등)에서는 필수적이다.</li>
</ul>
<hr>
<h3 id="1-2-문제의-정의와-주요-알고리즘-회귀regression-vs-분류classification">1-2. 문제의 정의와 주요 알고리즘: 회귀(Regression) vs 분류(Classification)</h3>
<p>목표 변수(Target)의 형태에 따라 접근 방식과 알고리즘을 선택하자!
<img src="https://velog.velcdn.com/images/mi_nini/post/c41caf23-27cd-4497-96ff-198b1e2a0ba0/image.png" alt=""></p>
<blockquote>
<p>출처/참고 : <a href="https://www.geeksforgeeks.org/machine-learning/ml-classification-vs-regression/">https://www.geeksforgeeks.org/machine-learning/ml-classification-vs-regression/</a></p>
</blockquote>
<p>[회귀 모델링 (Regression)]</p>
<ul>
<li>목표(Target): 연속적인 &#39;숫자&#39;를 예측하는 문제 (예: 집값 예측, 주가 예측, 매출액 예측). 실제 값과 예측값의 &#39;오차(Error)&#39;를 최소화하는 것이 핵심이다.</li>
<li>선형 회귀 (Linear Regression): 데이터의 경향성을 가장 잘 설명하는 하나의 최적의 직선(y = wx + b)을 긋는 방식. 빠르고 해석이 쉽지만 복잡한 패턴을 잡기는 어렵다.</li>
<li>K-최근접 이웃 회귀 (KNN Regressor): 예측하려는 데이터와 가장 가까운 K개의 이웃 데이터를 찾아, 그 이웃들의 타겟 값 평균을 계산하여 예측한다.</li>
</ul>
<p>[분류 모델링 (Classification)]</p>
<ul>
<li>목표(Target): 데이터가 속할 &#39;범주(Class)&#39;를 예측하는 문제 (예: 스팸 메일 여부, 질병 유무). 정확하게 경계선을 그어 범주를 나누는 것이 핵심이다.</li>
<li>로지스틱 회귀 (Logistic Regression): 이름은 회귀이지만 분류에 사용된다. 시그모이드 함수를 통해 특정 클래스에 속할 확률(0~1)을 계산하여 0.5를 기준으로 분류한다.</li>
<li>의사결정나무 (Decision Tree): 스무고개처럼 조건(예: 나이가 30 이상인가? Yes/No)을 분기하여 데이터를 분류한다. 사람이 직관적으로 이해하기 좋고 설명력이 뛰어나다.</li>
<li>랜덤 포레스트 (Random Forest): 수많은 의사결정나무를 만들고, 각 나무의 예측 결과를 취합(투표)하여 최종 결과를 내는 앙상블(Ensemble) 기법이다. 단일 모델보다 성능이 훨씬 뛰어나며 과적합을 방지하는 효과가 있다.</li>
</ul>
<hr>
<h3 id="1-3-모델-성능-평가-evaluation">1-3. 모델 성능 평가 (Evaluation)</h3>
<p>학습된 모델이 처음 보는 데이터(Test Data)에 대해 얼마나 잘 작동하는지 객관적으로 평가</p>
<table>
<thead>
<tr>
<th align="left">평가 지표</th>
<th align="left">계산식</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>MAE</strong><br>(평균 절대 오차)</td>
<td align="left">$MAE = \frac{1}{n} \sum \vert y_i - \hat{y}_i \vert$</td>
</tr>
<tr>
<td align="left"><strong>MSE</strong><br>(평균 제곱 오차)</td>
<td align="left">$MSE = \frac{1}{n} \sum (y_i - \hat{y}_i)^2$</td>
</tr>
<tr>
<td align="left"><strong>RMSE</strong><br>(평균 제곱근 오차)</td>
<td align="left">$RMSE = \sqrt{\frac{1}{n} \sum (y_i - \hat{y}_i)^2}$</td>
</tr>
<tr>
<td align="left"><strong>MAPE</strong><br>(평균 절대 백분율 오차)</td>
<td align="left">$MAPE = \frac{100%}{n} \sum \left\vert \frac{y_i - \hat{y}_i}{y_i} \right\vert$</td>
</tr>
<tr>
<td align="left"><strong>MPE</strong><br>(평균 백분율 오차)</td>
<td align="left">$MPE = \frac{100%}{n} \sum \left( \frac{y_i - \hat{y}_i}{y_i} \right)$</td>
</tr>
<tr>
<td align="left">[회귀 평가지표]</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">* MSE (Mean Squared Error): 실제값과 예측값의 차이(오차)를 제곱하여 평균 낸 값. 오차가 클수록 페널티를 크게 부여</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">* RMSE (Root Mean Squared Error): MSE에 루트를 씌워 실제 값과 단위를 맞춰 직관성을 높인 지표.</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">* MAE (Mean Absolute Error): 오차의 절댓값의 평균. 오차의 크기를 보여줌</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">* R2 Score (결정계수): 모델의 설명력을 나타내며 0에서 1 사이의 값을 가진다. 1에 가까울수록 데이터의 변동성을 잘설명한다.</td>
<td align="left"></td>
</tr>
</tbody></table>
<h3 id="분류-모델-평가-지표-classification-metrics">분류 모델 평가 지표 (Classification Metrics)</h3>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/e83445c0-5e44-4893-a050-9f663dfec9a5/image.png" alt=""></p>
<blockquote>
<p>출처/참고 : <a href="https://glassboxmedicine.com/2019/02/17/measuring-performance-the-confusion-matrix/">https://glassboxmedicine.com/2019/02/17/measuring-performance-the-confusion-matrix/</a></p>
</blockquote>
<table>
<thead>
<tr>
<th align="left">평가 지표</th>
<th align="left">설명</th>
<th align="left">계산식</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>정확도</strong><br>(Accuracy)</td>
<td align="left">실제 분류를 정확하게 예측한 비율</td>
<td align="left">$Accuracy = \frac{TP + TN}{TP + TN + FP + FN}$</td>
</tr>
<tr>
<td align="left"><strong>정밀도</strong><br>(Precision)</td>
<td align="left">Positive로 예측한 것 중 실제 Positive인 비율</td>
<td align="left">$Precision = \frac{TP}{TP + FP}$</td>
</tr>
<tr>
<td align="left"><strong>민감도/재현율</strong><br>(Recall/Sensitivity)</td>
<td align="left">실제 Positive(P) 중 Positive로 예측한 비율</td>
<td align="left">$Recall = \frac{TP}{TP + FN}$</td>
</tr>
<tr>
<td align="left"><strong>F1-score</strong></td>
<td align="left">정밀도와 재현율의 조화평균</td>
<td align="left">$F1 = 2 \times \frac{Precision \times Recall}{Precision + Recall}$</td>
</tr>
</tbody></table>
<p>[분류 평가지표와 오차행렬(Confusion Matrix)]
분류 문제는 오차행렬(TP, TN, FP, FN)을 기반으로 평가한다.</p>
<ul>
<li>Accuracy (정확도): 전체 예측 중 맞춘 비율. 데이터 불균형(예: 정상 99개, 불량 1개) 시 무조건 정상이라고만 찍어도 99%가 나오므로 신뢰하기 어렵다.</li>
<li>Precision (정밀도): 모델이 &#39;Positive&#39;라고 예측한 것 중 실제 &#39;Positive&#39;인 비율. (예: 스팸으로 걸러낸 메일 중 진짜 스팸인 비율. 일반 메일을 스팸으로 걸러버리면 안 될 때 중요).</li>
<li>Recall (재현율): 실제 &#39;Positive&#39;인 것 중 모델이 &#39;Positive&#39;로 찾아낸 비율. (예: 실제 암 환자 중 모델이 암이라고 예측한 비율. 병원 진단 모델처럼 실제 환자를 놓치면 안 될 때 가장 중요).</li>
<li>F1-Score: 정밀도와 재현율의 조화 평균으로, 데이터가 불균형할 때 모델의 성능을 가장 객관적으로 대변한다.</li>
</ul>
<hr>
<h3 id="1-4-교차-검증cross-validation과-모델-성능-튜닝hyperparameter-tuning">1-4. 교차 검증(Cross Validation)과 모델 성능 튜닝(Hyperparameter Tuning)</h3>
<p>개발자가 알고리즘에 직접 설정해 주어야 하는 &#39;하이퍼파라미터&#39;에 따라 성능이 극명하게 달라지므로, 이를 최적화하는 과정이 필요하다.</p>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/e94fff01-1cc7-46b2-bd41-12a87b829f40/image.png" alt=""></p>
<ul>
<li>K-Fold 교차 검증: 훈련 데이터를 통째로 한 번만 학습하는 것이 아니라, 데이터를 K개의 폴드(조각)로 나누어 K번 반복 학습 및 평가를 진행한다. 특정 데이터 셋에만 맞춰지는 것을 방지하고 모델의 평균적인 성능을 신뢰성 있게 평가할 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/6602fb57-6196-418c-8560-26e8035ce5d2/image.png" alt=""></p>
<ul>
<li>Grid Search (그리드 서치): 지정한 파라미터 값들의 &#39;모든 경우의 수&#39;를 다 조합해서 학습해 보고 가장 최고 성능(best_score_)을 내는 조합(best_params_)을 찾는 방법. 탐색 공간이 넓어지면 시간이 늘어난다.</li>
<li>Random Search (랜덤 서치): 파라미터의 범위만 지정해 주고, 그 안에서 랜덤하게 조합을 뽑아 지정된 횟수(n_iter)만큼만 테스트하는 방법. 그리드 서치보다 시간은 훨씬 절약되면서도 꽤 괜찮은 최적의 값을 빠르게 찾아낸다. </li>
</ul>
<blockquote>
<p>출처/참고 
<a href="https://ethen8181.github.io/machine-learning/model_selection/model_selection.html">https://ethen8181.github.io/machine-learning/model_selection/model_selection.html</a>
<a href="https://datarian.io/blog/grid-search-random-search">https://datarian.io/blog/grid-search-random-search</a>
<a href="https://blog.naver.com/hsj2864/222215638480">https://blog.naver.com/hsj2864/222215638480</a>
<a href="https://scikit-learn.org/stable/modules/cross_validation.html">https://scikit-learn.org/stable/modules/cross_validation.html</a>
<a href="https://www.ibm.com/think/topics/fine-tuning">https://www.ibm.com/think/topics/fine-tuning</a></p>
</blockquote>
<hr>
<h2 id="2-딥러닝-deep-learning">2. 딥러닝 (Deep Learning)</h2>
<blockquote>
<p>들어가기 전 딥러닝은</p>
</blockquote>
<ul>
<li>데이터 준비 (데이터 전처리 및 스케일링 필수)</li>
<li>구조 설계 (레이어, 노드, 활성화 함수 구성)</li>
<li>모델 컴파일 (손실 함수 및 옵티마이저 설정)</li>
<li>모델 학습 (Epoch 반복을 통한 가중치 업데이트)</li>
<li>성능 최적화 (Early Stopping, Dropout 등으로 과적합 방지)</li>
<li>평가
위 딥러닝 고유의 모델링 사이클을 꼭 기억하기!</li>
</ul>
<p>머신러닝의 알고리즘 중 &#39;인공신경망(ANN)&#39;을 여러 개의 은닉층(Hidden Layer)으로 깊게(Deep) 쌓아 올린 것이 딥러닝이다. </p>
<hr>
<h3 id="2-1작동-원리">2-1.작동 원리</h3>
<blockquote>
<p>출처/참고 <a href="https://starcell.github.io/ai/dl-basic/">https://starcell.github.io/ai/dl-basic/</a>
<img src="https://velog.velcdn.com/images/mi_nini/post/d610449a-1385-423d-a7e4-b992b95de981/image.png" alt=""></p>
</blockquote>
<p>신경망은 Input Layer(입력층), Hidden Layer(은닉층), Output Layer(출력층)로 구성</p>
<ul>
<li>가중치(Weight)와 편향(Bias): 각 노드(뉴런)는 입력값에 가중치를 곱하고 편향을 더한다. 학습이란 이 가중치와 편향의 최적값을 찾아가는 과정이다.</li>
<li>역전파(Backpropagation): 출력층에서 예측값과 실제값의 오차를 구한 뒤, 이 오차를 최소화하는 방향으로 출력층에서부터 입력층으로 거꾸로 돌아가며 가중치를 업데이트(미분 활용)한다.</li>
</ul>
<hr>
<h3 id="2-2-활성화-함수activation와-손실-함수loss-설정">2-2. 활성화 함수(Activation)와 손실 함수(Loss) 설정</h3>
<p>딥러닝은 층과 층 사이에 &#39;활성화 함수&#39;를 넣어 비선형성을 추가한다. 이것이 없으면 아무리 층을 깊게 쌓아도 결국 단순한 선형 회귀 모형과 다를 바가 없어진다. 은닉층에서는 주로 &#39;relu&#39;를 사용하여 딥러닝의 고질적 문제인 <a href="https://eureka7.tistory.com/20">기울기 소실(Vanishing Gradient)</a>을 방지한다.</p>
<p>문제 유형에 따른 출력층 설계</p>
<ul>
<li>회귀 (연속된 숫자 예측):<ul>
<li>출력 노드 수: 1개</li>
<li>활성화 함수: 없음 (또는 linear)</li>
<li>손실 함수(Loss): mse (Mean Squared Error)</li>
</ul>
</li>
<li>이진 분류 (O/X, 생존/사망 등 두 개 중 하나 분류):<ul>
<li>출력 노드 수: 1개</li>
<li>활성화 함수: sigmoid (출력값을 0~1 사이의 확률로 변환)</li>
<li>손실 함수(Loss): binary_crossentropy</li>
</ul>
</li>
<li>다중 분류 (여러 클래스 중 선택):<ul>
<li>출력 노드 수: 분류하려는 클래스의 개수 (예: 개/고양이/새 분류면 3)</li>
<li>활성화 함수: softmax (각 클래스에 속할 확률을 모두 더하면 1이 되도록 변환)</li>
<li>손실 함수(Loss): categorical_crossentropy (원핫인코딩 된 경우) 또는 sparse_categorical_crossentropy (정수형 라벨인 경우)</li>
</ul>
</li>
</ul>
<hr>
<h3 id="2-4-학습-방법론과-성능-최적화-과적합-방지-기법">2-4. 학습 방법론과 성능 최적화 (과적합 방지 기법)</h3>
<p>딥러닝 모델은 파라미터가 수십만~수천만 개에 달하기 때문에, 훈련 데이터에만 완벽히 맞춰져 새로운 데이터에 취약해지는 &#39;과적합(Overfitting)&#39;에 빠지기 매우 쉽다. 모델의 복잡도를 제어하는 것이 핵심이다.</p>
<ul>
<li><p>주요 학습 파라미터:</p>
<ul>
<li>Epoch (에포크): 전체 데이터를 몇 번 반복해서 학습할 것인가. 에포크가 너무 적으면 과소적합, 너무 많으면 과적합이 발생한다.</li>
<li>Learning Rate (학습률): 가중치를 업데이트할 때 오차의 최소점을 향해 한 번에 얼마나 크게 이동할 것인가를 결정한다. 너무 크면 최적점을 지나쳐 발산하고, 너무 작으면 학습이 지나치게 느려지거나 지역 최적점(Local Minimum)에 갇힌다.</li>
</ul>
</li>
<li><p>과적합 방지 및 최적화 기법:</p>
<ul>
<li>Early Stopping: 모델이 학습하면서 검증 데이터의 오차(val_loss)가 더 이상 감소하지 않고 반등하기 시작하면, 설정해 둔 Epoch가 남아있더라도 학습을 강제로 조기 종료시킨다. patience 옵션으로 오차가 줄지 않아도 몇 번의 에포크를 더 기다려볼지 결정할 수 있다. 과적합으로 넘어가기 전 최적의 타이밍에 학습을 멈추는 필수 콜백 함수다.</li>
<li>ModelCheckpoint: Early Stopping과 함께 자주 쓰이며, 학습 과정 중 지정한 지표(예: val_loss)가 가장 좋았던 순간의 최적의 가중치를 파일로 자동으로 저장해 둔다.</li>
<li>Dropout: 은닉층의 노드 중 일부 비율(예: 20~50%)을 무작위로 비활성화한 채로 학습하는 방법이다. 매 에포크마다 끊어지는 노드가 달라지므로 모델이 특정 노드의 가중치에만 과도하게 의존하는 것을 막아준다. 이는 일종의 앙상블 효과를 내어 새로운 데이터에 대한 일반화(Generalization) 성능을 비약적으로 높여준다.</li>
<li>Regularization: L1 규제, L2 규제 등을 통해 가중치 값이 비정상적으로 커지는 것을 수학적으로 억제하여 모델의 복잡도를 낮추는 기법이다.</li>
</ul>
</li>
</ul>
<blockquote>
<p>출처/참고
<a href="https://facerain.github.io/improve-dl-performance/">https://facerain.github.io/improve-dl-performance/</a>
<a href="https://pub.towardsai.net/keras-earlystopping-callback-to-train-the-neural-networks-perfectly-2a3f865148f7">https://pub.towardsai.net/keras-earlystopping-callback-to-train-the-neural-networks-perfectly-2a3f865148f7</a>
<a href="https://kh-kim.github.io/nlp_with_deep_learning_blog/docs/1-14-regularizations/04-dropout/">https://kh-kim.github.io/nlp_with_deep_learning_blog/docs/1-14-regularizations/04-dropout/</a>
<a href="https://www.geeksforgeeks.org/machine-learning/regularization-in-machine-learning/">https://www.geeksforgeeks.org/machine-learning/regularization-in-machine-learning/</a></p>
</blockquote>
<hr>
<h2 id="생각정리">생각정리</h2>
<p>대학원 면접 보러 갔을 당시 내가 고민하다가 생각한 주제인 Why Multi-class Classification Needs Softmax를 발표하는 장면이 주마등처럼 스쳐가는 수업이었던 거 같다... 수업내용에서는 Multi-class를 크게 다루지 않았지만 학부 연구생때 연구실에 처음 들어가 교수님이 읽으라고 지시해주신 딥러닝 모델들도 생각나게 되는 수업이었던 거 같다.</p>
<ul>
<li><a href="https://papers.nips.cc/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html">ImageNet Classification with Deep Convolutional Neural Networks(AlexNet)</a></li>
<li><a href="https://arxiv.org/abs/1512.03385">Deep Residual Learning for Image Recognition</a></li>
<li><a href="https://arxiv.org/abs/1608.06993">Densely Connected Convolutional Networks</a></li>
<li><a href="https://arxiv.org/abs/1409.1556">Very Deep Convolutional Networks for Large-Scale Image Recognition</a></li>
</ul>
<p>구조를 이해하고 최적화기법에 하나하나에 수식을 보는 것이 아닌 전체 흐름 구조 복습 및 실질적인 AICE-associate를 준비하기 앞서 코드를 직접 작성해 보고 구현해 보는 것이 목적이었다고 생각한다. 기간이 너무 짧다 보니(2일/2일) 비전공자/전공자에게 모든 것을 이해시키는 것은 정말 불가능하다고 생각했었기 때문이다. 하나의 내용으로만 2주 내내 수업해도 모자라지 않은 내용이었다고 생각한다. 실습과 복습을 진행하면서 수업 시간에 내용에서 강사님께서 설명해 주신 부분이 맞나?라고 생각했던 부분을 다시 찾아 보면서 이해할 수 있었던 좋은 시간이었다고 생각한다. 배웠던 내용이 오래 기억되고 나의 지식으로 온전히 다 받아들일 수 있게 &quot;반복 학습하자!&quot; 생각을 하며 2주차를 마무리한다.</p>
<blockquote>
<p>교수님(대학교 지도교수님)의 말씀 중 : 
내가 배운 내용을 정말 이해하고 있는지 의문이 들 때가 있어, 그럴 때는 그 내용을 다른 이에게 설명하고, 상대방에게 설명할 수 있다면 비로소 그것이 내 것이 된 지식일 거야</p>
</blockquote>
<h3 id="github-private"><a href="https://github.com/KT-E/02-Week">Github-Private</a></h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[KT-A 1주차 ]]></title>
            <link>https://velog.io/@mi_nini/KT-A-1%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@mi_nini/KT-A-1%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sun, 26 Apr 2026 07:26:12 GMT</pubDate>
            <description><![CDATA[<h3 id="들어가기전에">들어가기전에</h3>
<p>회고록은 자고로 1주일을 마무리며 쓰는 게 제일 효과적이라고 생각했다.. 그렇게 생각했지만.. 미루고 미루다 보니 4주 차가 끝나는 시점에 블로그로 기록을 남기게 되었다. 아주 부끄럽지만 지금부터라도 수업이 끝난 주 주말에 1주일에 회고록을 담아 내가 생각하고 배웠던 내용을 생생히 담아보려고 한다.</p>
<h3 id="1주차">1주차</h3>
<blockquote>
<p>자기소개/인사말
<img src="https://velog.velcdn.com/images/mi_nini/post/9891354f-654e-4118-8ad9-65646cb88cbc/image.png" alt="자기소개"></p>
</blockquote>
<p>간단하게 입교식 및 AIVLE-EDU 사용법에 대해 매니저님께서 설명해 주셨다. 수업내용과 자료는 AIVLE-EDU사이트에서 다운로드해 활용하고 <a href="https://www.microsoft.com/ko-kr/microsoft-teams/download-app">Teams</a>를 이용해 5,6반 에의 블러 팀원들과 매니저님과 소통할 수 있게 되었다.  1주 차에서는 깃허브 사용법과 Colab-Python 데이터 전처리를 간단하게 배웠다. 복습을 해보자 (깃 README.md에 정리된 내용) </p>
<hr>
<h2 id="pandas-dataframe-데이터-처리">Pandas DataFrame 데이터 처리</h2>
<hr>
<h3 id="1-데이터프레임-인스턴스-생성-및-데이터-로드">1. 데이터프레임 인스턴스 생성 및 데이터 로드</h3>
<p>데이터 분석의 초기 공정은 다양한 소스의 원천 데이터를 Pandas의 핵심 객체인 Series 또는 DataFrame으로 적재(Loading)하는 과정이다.</p>
<h4 id="데이터프레임의-직접-정의">데이터프레임의 직접 정의</h4>
<pre><code class="language-python">import pandas as pd

# 데이터 본체(data), 행 식별자(index), 열 명칭(columns)을 명시하여 객체를 생성함
df = pd.DataFrame(data=data_source, index=idx_list, columns=col_list)</code></pre>
<h4 id="외부-데이터셋-가독-csv">외부 데이터셋 가독 (CSV)</h4>
<pre><code class="language-python"># index_col: 특정 열을 데이터프레임의 인덱스로 지정함
# header: 열 이름이 포함된 행의 번호를 지정하며, 부재 시 None으로 설정함
df = pd.read_csv(&quot;path/to/data.csv&quot;, index_col=&#39;Date&#39;)</code></pre>
<hr>
<h3 id="2-데이터-탐색-및-기술통계-exploration--descriptive-statistics">2. 데이터 탐색 및 기술통계 (Exploration &amp; Descriptive Statistics)</h3>
<p>데이터의 물리적 구조, 자료형, 분포 및 결측치 현황을 파악함으로써 이후 전처리 전략의 기초를 수립하는 정찰 단계이다.
구조 및 메타데이터 참조</p>
<ul>
<li><p>df.head(n) / df.tail(n) : 데이터셋의 상위 및 하위 표본을 추출</p>
</li>
<li><p>df.shape : 데이터프레임의 차원(행과 열의 개수)을 확인함</p>
</li>
<li><p>df.info() : 인덱스 구성, 각 열의 자료형(dtypes) 및 비결측치(Non-Null) 개수 등 전체 요약을 출력함</p>
</li>
<li><p>df.columns / df.index : 열 명칭 및 행 인덱스 정보를 참조함</p>
</li>
<li><p>df.values : 내부 데이터를 Numpy 다차원 배열 형태로 반환함</p>
</li>
</ul>
<p>통계적 특성 및 분포 파악</p>
<ul>
<li><p>df.describe() : 수치형 데이터에 대한 주요 기술통계량(평균, 표준편차, 사분위수 등)을 요약함</p>
</li>
<li><p>df[&#39;col&#39;].value_counts() : 범주형 데이터의 각 항목별 출현 빈도를 산출함</p>
</li>
<li><p>df[&#39;col&#39;].unique() / nunique() : 고유값의 목록 및 고유값의 총 개수를 확인함</p>
</li>
<li><p>df[&#39;col&#39;].mode() : 데이터셋 내 최빈값을 산출함</p>
</li>
<li><p>df.sum(), df.mean(), df.median(), df.std() : 산술 합계, 평균, 중앙값, 표준편차 등 통계 함수를 적용함</p>
</li>
</ul>
<hr>
<h3 id="3-데이터-조회-및-필터링-selection--filtering">3. 데이터 조회 및 필터링 (Selection &amp; Filtering)</h3>
<p>특정 분석 목적에 부합하는 서브셋(Subset)을 추출하기 위한 다양한 인덱싱 기법을 포함한다.
데이터 인덱싱 및 정렬</p>
<p>차원 선택</p>
<pre><code>- df[&#39;col&#39;] : 단일 열 추출 시 Series 객체가 반환됨

- df[[&#39;col1&#39;, &#39;col2&#39;]] : 다중 열 추출 시 리스트를 사용하여 DataFrame 형태를 유지함</code></pre><p>조건부 조회 및 위치 기반 조회</p>
<pre><code>- df.loc[row_condition, col_name] : 레이블 기반 조회 방식으로, 불리언 인덱싱(Boolean Indexing)을 통한 조건부 필터링에 최적화됨

- df.iloc[row_idx, col_idx] : 정수 위치 기반 조회 방식으로, 행과 열의 물리적 순서에 따라 데이터를 추출함

- df.isin([list]) : 특정 열의 값이 주어진 리스트 내에 포함되는지 여부를 판단하여 필터링함</code></pre><p>정렬 프로토콜</p>
<pre><code>- df.sort_values(by=[&#39;col1&#39;, &#39;col2&#39;], ascending=[True, False]) : 복수의 열을 기준으로 정렬 방식을 개별 적용할 수 있음</code></pre><hr>
<h3 id="4-데이터프레임-구조의-변형-structural-modification">4. 데이터프레임 구조의 변형 (Structural Modification)</h3>
<p>열(Column) 및 행(Row) 관리</p>
<p>식별자 변경: df.rename(columns={&#39;old&#39;: &#39;new&#39;}, inplace=True)를 통해 특정 열의 명칭을 수정한 후 원본 객체에 직접 반영함</p>
<p>열의 추가 및 삽입:</p>
<pre><code>- df[&#39;new_col&#39;] = values : 데이터프레임의 최우측에 새로운 열을 추가함

- df.insert(pos, &#39;name&#39;, values) : 지정된 위치(pos)에 특정 열을 삽입하여 구조를 정밀하게 제어함</code></pre><p>제거 프로세스:</p>
<pre><code>- df.drop(list, axis=1, inplace=True) : 명시된 열 리스트를 제거함 (열 삭제 시 axis=1 설정 필수)

- df.pop(&#39;col&#39;) : 특정 열을 반환함과 동시에 원본 데이터프레임에서 영구히 삭제함</code></pre><p>인덱스 재설정: df.reset_index(drop=True, inplace=True)는 기존 인덱스를 제거하고 연속적인 정수 인덱스로 초기화하는 공정으로, 데이터 결합 후 인덱스 정합성 확보를 위해 수행함</p>
<hr>
<h3 id="5-데이터-가공-및-변환-transformation--mapping">5. 데이터 가공 및 변환 (Transformation &amp; Mapping)</h3>
<p>데이터의 유효성을 확보하고 분석에 용이한 형태로 값을 변환하는 과정이다.</p>
<pre><code>- replace() : 스칼라 값을 탐색하여 지정된 값으로 정밀하게 치환함

- map() : 딕셔너리 또는 함수를 매개로 Series의 개별 요소를 일대일 대응 변환함 (범주형 데이터 인코딩 시 유용함)

- pd.cut() : 수치형 연속 변수를 지정된 경계값에 따라 범주형 데이터로 이산화(Discretization)함</code></pre><hr>
<h3 id="6-결측치-관리-handling-missing-values">6. 결측치 관리 (Handling Missing Values)</h3>
<p>데이터의 완전성을 저해하는 결측값(NaN)에 대한 체계적인 처리 방안을 명시한다.</p>
<ul>
<li><p>현황 파악: df.isna().sum() 또는 df.isnull().sum()을 통해 열 단위 결측치 발생 빈도를 집계함</p>
</li>
<li><p>제거 전략: df.dropna(subset=[&#39;col&#39;], axis=0, inplace=True)를 실행하여 특정 핵심 변수에 결측이 존재하는 레코드를 제외함</p>
</li>
<li><p>보간 및 대체: df.fillna(value) 또는 전방/후방 보간법(method=&#39;ffill&#39;|&#39;bfill&#39;)을 적용하여 결측값을 통계적 추정치로 대체함</p>
</li>
</ul>
<hr>
<h3 id="7-데이터-집계-및-그룹-연산-aggregation--grouping">7. 데이터 집계 및 그룹 연산 (Aggregation &amp; Grouping)</h3>
<p>특정 기준 열을 중심으로 데이터를 그룹화하여 고차원적 통계 정보를 추출하는 방법론이다.
Groupby 연산</p>
<p>분할(Split)-적용(Apply)-결합(Combine) 패러다임을 통해 그룹별 분석을 수행함.</p>
<pre><code class="language-python"># 범주별 타겟 열에 대해 다중 통계량(합계, 평균 등)을 동시에 산출함
df.groupby(&#39;Category&#39;, as_index=True)[&#39;Target&#39;].agg([&#39;sum&#39;, &#39;mean&#39;])</code></pre>
<hr>
<h3 id="8-데이터프레임-병합-및-연결-merging--concatenation">8. 데이터프레임 병합 및 연결 (Merging &amp; Concatenation)</h3>
<p>다양한 출처에서 기인한 데이터를 단일 데이터프레임으로 통합하는 고도화된 결합 기법이다.
물리적 연결 (Concat)</p>
<pre><code>- axis=0 : 수직 방향 연결을 수행하며, 인덱스 중복 여부를 고려하여 reset_index를 병행할 것을 권장함

- axis=1 : 수평 방향 연결을 수행하며, 조인 방식(join=&#39;inner&#39;|&#39;outer&#39;)에 따라 데이터 유지 범위가 결정됨</code></pre><p>논리적 병합 (Merge)</p>
<p>관계형 데이터베이스의 Join 연산과 유사하게 공통된 키(Key) 컬럼을 기준으로 데이터를 병합함.</p>
<pre><code>- how=&#39;inner&#39; : 양측 데이터프레임에 공통으로 존재하는 키값만을 추출함

- how=&#39;left&#39; / &#39;right&#39; : 좌측 또는 우측 데이터프레임을 기준으로 데이터를 유지하며, 대응값이 없는 경우 NaN으로 처리함

- how=&#39;outer&#39; : 모든 데이터를 보존하는 완전 외부 조인을 수행함</code></pre><hr>
<h2 id="생각정리">생각정리</h2>
<p>깃허브를 배우는 수업에서 <a href="https://github.com/mhutchie/vscode-git-graph">VScode-Git-graph</a> 이용법에 대해 배웠던 점이 인상 깊었다. 항상 터미널로 작업하던 입장으로써 눈으로 직관적으로 brnach들을 볼 수 있다는 점 그리고 간단하게 클릭으로 Checkout, Merge, Rebase, Reset, Revert 등을 적용할 수 있다는 점이다. 유용하게 프로젝트를 진행할 때 사용할 거 같았다. (코드 리뷰할 때도 편할 거 같았다)</p>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/8e15f35e-0208-459c-aef5-1874c37f725f/image.png" alt=""></p>
<p>데이터 전처리 코드를 수없이 봐왔던거 같다(캐글, 자격증 준비, 전공) 이번 1주차에서는 기본적인 내용으로 짧고 빠르게 많은 함수에 사용법을 알아가는 시간이었던 거 같다. 수업 시간이 09~18시까지 온라인으로 이어지다 보니 아침에 일어나 적응하는 시간이 아직 익숙해지지 않았던 거 같다. 날마다 체크인과 체크아웃 시간에 자기소개 시간을 가지며 같은 반 에이블러님들이  어떤 목표로 부트 캠프에 참여하게 된 걸 알게 되어 좋았던 거 같다. (같은 목표를 바라보는 에이블러님들이 많았던 거 같다) 자기소개 이외에 교육을 진행하는 동안 미래의 나에게 전하는 시간이 있었는데 (코딩테스트 업그레이드, 공모전 수상, 개근하기 등등)그 말을 이룰 수 있도록 열심히 임해 후회 없는 시간들을 보냈으면 좋겠다고 생각하며 1주 차를 마무리한다.</p>
<blockquote>
<p>강사님의 말씀 중 
&quot;하루살이라고 생각하고 오늘 하루의 최선을 다하세요!&quot;</p>
</blockquote>
<hr>
<h4 id="github-private"><a href="https://github.com/KT-E/01-Week">Github-Private</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[KT-AIVLE]]></title>
            <link>https://velog.io/@mi_nini/KT-AIVLE</link>
            <guid>https://velog.io/@mi_nini/KT-AIVLE</guid>
            <pubDate>Sun, 26 Apr 2026 07:09:34 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/mi_nini/post/a833f549-89c6-4ad9-9a9e-297cb0f7c25f/image.png" alt=""></p>
<h3 id="들어가며">들어가며</h3>
<p>이번 글은 늦게나마 시작하게 된 에이블스쿨 합격 후기 글이자 에이블 스쿨에 회고록/배운내용정리를 쓰게 될 첫 글이다. 방학 동안 개인적으로 코딩 테스트 공부와 기업들에 채용공고들을 보며 나에게 부족한 점과 기업이 원하는 개발 언어, 툴, 경험을 쌓는 데에 초점을 두고 2026년에 계획을 세우고 있었다. 
<a href="https://aivle.kt.co.kr/home/main/indexMain">KT-에이블 스쿨</a>에 모집 글은 학교 내 포스터와 KT 디지털 인재 장학생을 마치며 단체 톡 방에도 모집 글이 올라왔었다. 나는 개발자 부트캠프에 참여했던 여러 선배들에 이야기를 듣기도 하고 구글링을 하며 XX부트캠프 1주차 회고록이라는 여러글도 봤었는데, 여러 부트 캠프 중 기업에 이름을 빌려 하는 부트 캠프들  - ( 삼성 SSAFY, 네이버 부스트 캠프, 우아한테 그 코스, LG Aimers, 카카오 테크 캠퍼스, 현대모비스 SW 아카데미, 포스코 AI · Big Data 아카데미 등등) 중 수료 후 KT 취업연계 지원과 우수 수료생일 경우 채용 지원 시 우대가 된다는 점, 그리고 과거 에이블 기수 후기에 코딩 테스트를 함께 리뷰하며 많이 성장한 후기, 여러 스터디 모임이 활성화되어 있다는 글을 보고 좋은 사람들과 함께 성장할 수 있는 좋은 기회라고 생각해 9기 모집에 지원했다. (글쓴이도 현재 공모전/코딩 테스트 스터디 모임에 활발히 참여 중입니다! 나중에 기록 남길게요..)</p>
<hr>
<h2 id="9기-지원-절차">9기 지원 절차</h2>
<table>
  <tr>
    <td><img src="https://velog.velcdn.com/images/mi_nini/post/81c08ea2-20a0-45a5-9c0f-6f7e0c9ece6e/image.png"/></td>
    <td><img src="https://velog.velcdn.com/images/mi_nini/post/c013aeda-ba48-43ea-bf3a-2ab089da2c3e/image.png"/></td>
  </tr>
</table>

<p>위 사진에서 보이듯 모집분야는 크게 AI 개발자(트랙)과 DX 컨설턴트(트랙)이 나눠져있다. 컨설팅에도 관심이 있었지만 지금까지 배워왔고 조금 더 익숙하다고 생각한 개발 쪽에 가까운 AI 개발자 트랙으로 지원하게 되었다. </p>
<ul>
<li><p><strong>서류절차</strong> : 최종학력/자격증/대외홛동/자신이 생각한 언어 레벨/지원 동기 등을 작성해야 했던 거 같다.
자신이 했던 활동들을 잘 녹여서 솔직하게 작성하는 것이 중요하다고 생각한다. AI도움받아서 글을 작성하지말고 내가 한 활동들과 지원동기를 자기 손으로 작성하자! (도움이 될지 모르겠지만 나는 내가 과거에 진행했던 활동들을 깃허브나 노션에 이미 정리가 돼있어 URL도 같이 제출했다.)
<img src="https://velog.velcdn.com/images/mi_nini/post/bf64e33f-dc00-4528-8e8e-c88bd07a14c5/image.png" alt=""></p>
</li>
<li><p><strong>역량검사</strong> : 서류 합격 후 등록한 이메일로 역량검사에 대한 정보를 자세히 설명해 준다. 안내된 사이트 중 <a href="https://www.jobda.im/acca/introduce">AI 역량검사</a>로 온라인 테스트로 진행하게 되는데 같은 환경에서 연습할 수 있는 기회도 5번 제공하니 테스트 진행 전 연습을 충분히 하고 테스트를 보면 된다. (역량검사 기간도 9일 정도 주기 때문에 시간, 공간 제약 없이 역량검사를 진행하자)</p>
</li>
<li><p><em>참고로 과거 에이블스쿨 AI트랙에 경우 따로 코딩테스트를 진행했어야했는데 9기 지원에서는 AI/DX 공통으로 AI역량검사만을 진행하면된다.*</em></p>
<blockquote>
<p>공부할때 참고한 유튜브지만 많은 자료가 있으니 더 참고해서 테스트 진행해보세요!
신유형 도형 기억하기 : <a href="https://www.youtube.com/watch?v=QMUhmIi_X2k&amp;t=194s">https://www.youtube.com/watch?v=QMUhmIi_X2k&amp;t=194s</a>
길 이어만들기 : <a href="https://www.youtube.com/watch?v=UDYLBG__Jeg">https://www.youtube.com/watch?v=UDYLBG__Jeg</a>
도형회전하기 : <a href="https://www.youtube.com/watch?v=ozWnwQifWPk&amp;t=149s">https://www.youtube.com/watch?v=ozWnwQifWPk&amp;t=149s</a>
마법약 만들기 : <a href="https://www.youtube.com/watch?v=qTKFQYPUg2Y">https://www.youtube.com/watch?v=qTKFQYPUg2Y</a></p>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/818f6991-860b-47a8-83a3-294703a394e8/image.png" alt=""></p>
<ul>
<li><strong>합격발표/교육시작</strong> : 최종 결과 발표 후 이메일로 입교 정보, 에이블 스쿨 <a href="https://www.instagram.com/aivlestory/">공식인스타그램</a>, 오픈 카톡 방, K-DT 참여 규정 및 설명회를 진행하니 안내사항에 따라 잘 준비하고 교육을 시작하면 된다. (기간도 넉넉하고 안내사항을 이메일, 카카오톡, 문자로 안내 주시니 못따라가면 바보...)</li>
</ul>
<hr>
<h3 id="마치며">마치며</h3>
<p>KT-AIVLE을 지원하려고 하는 사람들에게 도움이 되었으면 해서 글을 작성했다. 큰 내용 없이 너무 단순한 글이지만 궁금한 점은 (기수 모집당시)AVILE 스쿨 오픈카톡방 또는 <a href="https://aivle.kt.co.kr/home/main/indexMain">공식 홈페이지</a> FAQ를 이용하면 도움을 받을 수 있을 것이다. (또는 댓글 남겨주시면 제가 알고 있는 지식에서 도와드리겠습니다)</p>
<blockquote>
<p>글쓴이는 9기 AI 트랙 수도권 5반에 배정받았습니다.</p>
</blockquote>
<hr>
<h3 id="부록">부록</h3>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/914366cc-b0a7-4f9a-85fc-d596f570f725/image.jpg" alt=""></p>
<p>AIVLE 스쿨에 입교하게 되면 교육기간 동안 사용할 노트북을 개인 모두에게 제공해 주니 참고! (교육 시 필요한 프로그램들을 설치 필요 없이 모두 준비돼있음)</p>
<blockquote>
<p>듀얼 모니터로 연결해 잘 사용 중입니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[늦은 2026 알림]]></title>
            <link>https://velog.io/@mi_nini/%EC%98%A4%EB%9E%9C%EB%A7%8C%EC%97%90-%EB%8F%8C%EC%95%84%EC%99%94%EC%8A%B5%EB%8B%88%EB%8B%A4</link>
            <guid>https://velog.io/@mi_nini/%EC%98%A4%EB%9E%9C%EB%A7%8C%EC%97%90-%EB%8F%8C%EC%95%84%EC%99%94%EC%8A%B5%EB%8B%88%EB%8B%A4</guid>
            <pubDate>Wed, 01 Apr 2026 11:30:03 GMT</pubDate>
            <description><![CDATA[<h2 id="들어가며">들어가며</h2>
<p>Velog에서 마지막글을 작성했던 2025년 6월 기점으로 약 10개월이 지나갔다. (옵시디언, 노션으로 기록을 했기 떄문에 밀렸던게 당연한가..) 그시간동안 많이 도전하고 실패도 느껴봤던거 같다. 졸업하기전 내가 원하던 목적지에 최종 도달하는데 실패했지만 하나씩 나의 기억을 정리하며 이제부터 다시 Velog로 돌아와  기록하고자 한다.</p>
<hr>
<h2 id="2025년-마지막-여름-방학">2025년 마지막 여름 방학</h2>
<table>
<thead>
<tr>
<th align="center">정말</th>
<th align="center">감사했습니다!</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://velog.velcdn.com/images/mi_nini/post/2ccc6e05-7ad9-4b38-be4c-82bf46cbee3b/image.png" width="300"/></td>
<td align="center"><img src="https://velog.velcdn.com/images/mi_nini/post/0739b861-1b74-45d7-b47f-639721f81797/image.png" width="300"/></td>
</tr>
</tbody></table>
<p>2025년에 여름방학은 나의 본가인 부천에서 보내지 않고 학교 연구실에 출근해 9 to 6을 지키려고 노력했다. 교수님이 방학 동안은 학부수업이 없으니 훨씬 여유롭고 자신이 집중하면 연구, 개인공부 등 하고싶은 공부를 하면 모든 것을 이뤄낼 수 있다고 응원도 해주셨다. (연구실에 있는 학부연구생, 석사생분들) 모든 사람들이 같이 학습하고 회의할 수 있는 장을 보낼 수 있게 RAG, LLM 공부 회의 및 논문세미나를 진행해 혼자 학습만을 하는 것이 아닌 함께 학습할 수 있어 보다 수 훨씬 하게 공부할 수 있었던 거 같다. </p>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://velog.velcdn.com/images/mi_nini/post/f1fefd19-dba2-44cd-bf80-182999704253/image.jpg" alt=""></td>
<td align="center"><img src="https://velog.velcdn.com/images/mi_nini/post/eba4dcb1-779a-4faf-8427-792e27b43bb6/image.jpg" alt=""></td>
</tr>
</tbody></table>
<hr>
<p>방학 동안에 있던 가장 뜻깊은 경험이라면 내가 너무 감사하게도 학교 등록금을 전액 받으면서 다닐 수 있었던 KT 디지털 인재 장학생으로써  KT 직원들과의 팀 프로젝트가 있었다. 조원은 학생들끼리만 배정되고 피드백을 각 독방에 멘토님이 계셔서 우리가 궁금한 점 어떤 점이 부족한가에 대한 가차없는 피드백을 받을 수 있었다. 우리 조는 총 4명으로 내가 조장으로써 좋은 성과를 내기위해 열심히 노려했던거 같다. <a href="https://github.com/KT-TeamProject-11">Notion-Team Project - 11</a> 천안재생센터와 미팅을 진행하며 요구사항을 듣고 우리가 천안재생센터가 필요하다고 생각하는 웹 또는 앱에 대한 주제를 선정해 결과물을 만들어 1박 2일 워크숍도 잘 다녀왔다. 내가 대학생인 신분에서 쉽게 경험하지 못할 이 감정을 선물해주신 KT-SEG 경영팀, 임직원분들, 그리고 멘토로 활동해주신 KT-Model Prototype, LLM, Cloud팀 멘토님들에게 감사인사를 전합니다.</p>
<blockquote>
<h4 id="추가로">추가로</h4>
</blockquote>
<ul>
<li>정보통신산업진흥원이 운영하는 2025-오픈소스 컨트리뷰션 아카데미 [Pytorch 문서화 번역] 파트 멘티에 참여하게 되어 2학기에 진행할 예정이다.</li>
<li>빅데이터분석기사 실기에 합격해 자격증 +1 </li>
<li>KT-AI 생성형AI 영상부문 공모전 입상 +1</li>
<li>백준 골드5 달성 </li>
</ul>
<hr>
<h2 id="2025년-마지막-학기를-보내며">2025년 마지막 학기를 보내며</h2>
<p>대학교 4-2학기인 마지막 학년을 보내며 주위친구들 중 이제 자리를 잡아가는 친구들도 하나둘씩 생기게 되었다. 대기업, 여러 인턴을 도전하는 친구들, 전공을 포기하고 다른 일자리를 찾으며 공인어학성적을 준비하는 친구들 중견, 중소에 취업해 졸업 전에 자기의 뜻을 이룬 친구들 등 나도 나 자신이 노력하고 있다고 생각하고 하루를 뜻깊게 살았지만 나보다 더 노력하고 열심히 하는 주위친구들이 많았었다고 생각한다. 나의 마지막 학기에 끝은 학부연구생을 하며 좋아하던 연구가 생겼었고 그 분야에 도전하기 위해 ist계열 대학원에 지원했었다. (서울권 대학원은 아무리 그래도 등록금에 대해 너무 부담스럽다고 생각했다.)</p>
<table>
<thead>
<tr>
<th align="center">면접</th>
<th align="center"><a href="https://github.com/KKU-NoteFlow">졸업작품</a></th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://velog.velcdn.com/images/mi_nini/post/aea018d2-15c5-46df-8825-3090d19de662/image.jpg" width="300"/></td>
<td align="center"><img src="https://velog.velcdn.com/images/mi_nini/post/53fed67a-8cbe-4e76-b51e-1823b0f2e932/image.jpg" width="300"/></td>
</tr>
</tbody></table>
<p>(디지스트, 지스트, 유니스트)과학기술원에 도전하였고 지스트는 서류가 떨어졌지만 유니스트와 디지스트는 서류에 합격해 면접을 볼 좋은 기회가 생겼었다. 각 대구와 울산에 있으며 나의 학교인 충주에서 출발해도 하루를 학교 공결내고 왕복해도 부족할 만큼 거리가 좀 멀었던 기억이 남는다. 두 가지의 면접 모두 제공해준 지침과 구글링을 통해 어느 정도 감을 잡고 있었지만, 영어로 발표와 대답을 할 수 있다는 점이 나에게는 큰 한계였던 거 같다. 내 나름대로 짧은 기간 동안 모든 심혈을 기울여 집중하고 밤새고 대본 외우고 학교, 집에서 PT 연습을 많이 했었지만, 결과는 둘 다 떨어졌다. (교수님 컨택이 늦은 점도 있으며 면접 당시 1지망에 지원했던 교수님에게만 메일이 오지 않았지만, 면접에서 1지망 교수님이 있어서 매우 당황했던 기억이 있다.) 떨어지고 나서 미리 완성했었던 <a href="https://github.com/KKU-NoteFlow">졸업작품</a> 발표도 전시회도 그럭저럭 마무리하며 내가 2년 동안 함께했던 컴퓨터공학과 학생회 사람들과 나의 학교생활을 마무리했던 거 같다. (학부연구생 연구 할당에 집중하지 못한 내가 아쉽네..)</p>
<blockquote>
<h4 id="추가로-1">추가로</h4>
</blockquote>
<ul>
<li>정보처리기사 합격으로 자격증 +1 </li>
<li>학교 내 Mircro_Degreee - 인공지능전문가양성과정 수료</li>
<li>OSSCA-오픈소스-Pytorch 멘티 활동 수료</li>
<li>AI-FSESTA 컨퍼런스 참여<blockquote>
<ul>
<li>2025 GIT
<img src="https://velog.velcdn.com/images/mi_nini/post/e7a9719c-505a-43b9-853d-9b4eaa8f1a06/image.png" alt=""></li>
</ul>
</blockquote>
</li>
</ul>
<hr>
<h2 id="2026">2026</h2>
<table>
<thead>
<tr>
<th align="center">사진이 많아서..</th>
<th align="center">다른 이들 생략해서 미안</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://velog.velcdn.com/images/mi_nini/post/531d7395-e36a-427e-8056-c12bbafa8c70/image.jpg" width="500"/></td>
<td align="center"><img src="https://velog.velcdn.com/images/mi_nini/post/3bf02ce8-71e2-41aa-9df5-7dfc24df0461/image.jpg" width="500"/></td>
</tr>
</tbody></table>
<p>졸업식, 연구실정리, 부트캠프, 다시 대학원 컨택 등 내가 무엇을 해야할지, 나아갈 내 자신이 두려웠다. 사실 대학원에 떨어졌던 충격이 제일 크기도 했지만 내가 제일 잘하는 것이 무엇일까, 내가 노력했던 분야를 끝까지 물고가면 성공, 합격할 수 있을까 생각했다. 종강하고 3년동안 머물렀던 자취방을나와 오랜만에 나의 본가에 도착했다. 그동안 밀렸던 잠도 자고 국외여행도 다녀왔다. 졸업이기에 급한 마음도 있었지만 다시 오지 않을 26살이자 회사 또는 다른 일을 시작하게 된다면 이럴 시간도 없을 것이라 생각했다. (생각해보니 베짱이 마인드네) 놀기도 놀지만 매일 코딩테스트 문제나 내가 관심 있었던 머신 러닝, computer vision, 3D 그래픽 기사나 책도 가끔 읽는다. 이건 순순히 재밌기도 했고 밤새우면서 내가 무엇 가에 오랫동안 몰두했던 기억이 남아서이기도 한 거 같다. 하루를 낭비하지 않고 살아가는 것 그렇게 살기 위해 오늘 다시 시작해보려고 한다.</p>
<blockquote>
<p>포기하지말자</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[CART & Ensumble]]></title>
            <link>https://velog.io/@mi_nini/CART-Ensumble</link>
            <guid>https://velog.io/@mi_nini/CART-Ensumble</guid>
            <pubDate>Thu, 19 Jun 2025 17:19:56 GMT</pubDate>
            <description><![CDATA[<h1 id="비지도-학습-및-앙상블-주요-코드">비지도 학습 및 앙상블 주요 코드</h1>
<h2 id="목차">목차</h2>
<ul>
<li><a href="#%ED%8C%8C%ED%8A%B8-4-cart-%EB%B6%84%EB%A5%98-%ED%8A%B8%EB%A6%AC-classification-tree">파트 4: CART: 분류 트리 (Classification Tree)</a>  </li>
<li><a href="#%ED%8C%8C%ED%8A%B8-5-cart-%ED%9A%8C%EA%B7%80-%ED%8A%B8%EB%A6%AC-regression-tree">파트 5: CART: 회귀 트리 (Regression Tree)</a>  </li>
<li><a href="#%ED%8C%8C%ED%8A%B8-6-%EB%AA%A8%EB%8D%B8-%EC%9D%BC%EB%B0%98%ED%99%94-%ED%8F%89%EA%B0%80--%EA%B5%90%EC%B0%A8-%EA%B2%80%EC%A6%9D">파트 6: 모델 일반화 평가 &amp; 교차 검증</a>  </li>
<li><a href="#%ED%8C%8C%ED%8A%B8-7-bagging">파트 7: Bagging</a>  </li>
<li><a href="#%ED%8C%8C%ED%8A%B8-8-adaboost">파트 8: AdaBoost</a>  </li>
<li><a href="#%ED%8C%8C%ED%8A%B8-9-voting-classifier">파트 9: Voting Classifier</a>  </li>
<li><a href="#%ED%8C%8C%ED%8A%B8-10-random-forest-regressor">파트 10: Random Forest Regressor</a>  </li>
</ul>
<hr>
<h2 id="파트-4-cart-분류-트리-classification-tree">파트 4. CART: 분류 트리 (Classification Tree)</h2>
<pre><code class="language-python"># 페이지 15
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 데이터 분할 (80% train, 20% test)
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.2,
    stratify=y,
    random_state=1
)

# 모델 선언 &amp; 학습
dt = DecisionTreeClassifier(criterion=&#39;gini&#39;, random_state=1)
dt.fit(X_train, y_train)

# 예측 &amp; 평가
y_pred = dt.predict(X_test)
print(accuracy_score(y_test, y_pred))</code></pre>
<hr>
<h2 id="파트-5-cart-회귀-트리-regression-tree">파트 5. CART: 회귀 트리 (Regression Tree)</h2>
<pre><code class="language-python"># 페이지 20
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error as MSE

# 데이터 분할 (80% train, 20% test)
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.2,
    random_state=3
)

# 모델 선언 &amp; 학습
dt = DecisionTreeRegressor(max_depth=4, min_samples_leaf=0.1, random_state=3)
dt.fit(X_train, y_train)

# 예측 &amp; 평가 (RMSE)
y_pred = dt.predict(X_test)
rmse = MSE(y_test, y_pred) ** 0.5
print(rmse)</code></pre>
<hr>
<h2 id="파트-6-모델-일반화-평가--교차-검증">파트 6. 모델 일반화 평가 &amp; 교차 검증</h2>
<pre><code class="language-python"># 페이지 21-23
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import mean_squared_error as MSE

# 설정
SEED = 123

# 데이터 분할 (70% train, 30% test)
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.3,
    random_state=SEED
)

# 모델 선언
dt = DecisionTreeRegressor(max_depth=4, min_samples_leaf=0.14, random_state=SEED)

# 10-fold CV MSE 계산
mse_cv = -cross_val_score(
    dt, X_train, y_train,
    cv=10,
    scoring=&#39;neg_mean_squared_error&#39;,
    n_jobs=-1
)

# 학습 &amp; 예측
dt.fit(X_train, y_train)
y_train_pred = dt.predict(X_train)
y_test_pred = dt.predict(X_test)

# 결과 출력
print(&#39;CV MSE:&#39;, mse_cv.mean())
print(&#39;Train MSE:&#39;, MSE(y_train, y_train_pred))
print(&#39;Test MSE:&#39;, MSE(y_test, y_test_pred))</code></pre>
<hr>
<h3 id="파트-7-bagging">파트 7. Bagging</h3>
<pre><code class="language-python"># 페이지 8-9, 15
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

SEED = 1

# 데이터 분할 (70% train, 30% test)
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.3,
    stratify=y,
    random_state=SEED
)

# 기본 모델 선언
dt = DecisionTreeClassifier(max_depth=4, min_samples_leaf=0.16, random_state=SEED)

# Bagging 모델 선언 (n_estimators=300)
bc = BaggingClassifier(
    base_estimator=dt,
    n_estimators=300,
    n_jobs=-1
)

# 학습 &amp; 예측
bc.fit(X_train, y_train)
y_pred = bc.predict(X_test)
print(&#39;Bagging Accuracy:&#39;, accuracy_score(y_test, y_pred))

# OOB 평가 (oob_score=True 설정 시)
# bc = BaggingClassifier(base_estimator=dt, n_estimators=300, oob_score=True, n_jobs=-1)
# bc.fit(X_train, y_train)
# print(&#39;OOB Accuracy:&#39;, bc.oob_score_)</code></pre>
<hr>
<h2 id="파트-8-adaboost">파트 8. AdaBoost</h2>
<pre><code class="language-python"># 페이지 8-9
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import train_test_split

SEED = 1

# 데이터 분할 (70% train, 30% test)
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.3,
    stratify=y,
    random_state=SEED
)

# Decision Stump 선언
dt = DecisionTreeClassifier(max_depth=1, random_state=SEED)

# AdaBoost 모델 선언 (n_estimators=100)
adb_clf = AdaBoostClassifier(base_estimator=dt, n_estimators=100)

# 학습 &amp; 예측 확률
adb_clf.fit(X_train, y_train)
y_proba = adb_clf.predict_proba(X_test)[:, 1]

# 평가 (ROC AUC)
print(&#39;ROC AUC:&#39;, roc_auc_score(y_test, y_proba))</code></pre>
<hr>
<h2 id="파트-9-voting-classifier">파트 9: Voting Classifier</h2>
<pre><code class="language-python"># 1) 라이브러리 임포트
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import VotingClassifier

# 2) 데이터 분할
SEED = 1
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.3,
    random_state=SEED
)

# 3) 기본 분류기 선언
lr = LogisticRegression(random_state=SEED)
knn = KNeighborsClassifier()
dt = DecisionTreeClassifier(random_state=SEED)

# 4) 앙상블 메타 모델 선언 및 학습
voting_clf = VotingClassifier(
    estimators=[(&#39;lr&#39;, lr), (&#39;knn&#39;, knn), (&#39;dt&#39;, dt)],
    voting=&#39;hard&#39;
)
voting_clf.fit(X_train, y_train)

# 5) 예측 및 평가
y_pred = voting_clf.predict(X_test)
print(accuracy_score(y_test, y_pred))</code></pre>
<hr>
<h2 id="파트-10-random-forestregressor">파트 10: Random ForestRegressor</h2>
<pre><code class="language-python"># 1) 라이브러리 임포트
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error as MSE

# 2) 데이터 분할
SEED = 1
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.3,
    random_state=SEED
)

# 3) 모델 선언 및 학습
rf = RandomForestRegressor(
    n_estimators=400,       # 트리 개수
    min_samples_leaf=0.12,  # 리프 노드 최소 샘플 비율
    random_state=SEED
)
rf.fit(X_train, y_train)

# 4) 예측 및 평가 (RMSE)
y_pred = rf.predict(X_test)
rmse = MSE(y_test, y_pred) ** 0.5
print(f&#39;Test set RMSE of rf: {rmse:.2f}&#39;)
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[k-mean, 군집화]]></title>
            <link>https://velog.io/@mi_nini/Unserpervised-learningfinal-term</link>
            <guid>https://velog.io/@mi_nini/Unserpervised-learningfinal-term</guid>
            <pubDate>Thu, 19 Jun 2025 17:11:13 GMT</pubDate>
            <description><![CDATA[<h3 id="목차">목차</h3>
<ul>
<li><a href="#%ED%8C%8C%ED%8A%B8-1-k-means-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81">파트 1: K-Means 클러스터링</a>  </li>
<li><a href="#%ED%8C%8C%ED%8A%B8-2-%EA%B3%84%EC%B8%B5%EC%A0%81-%EA%B5%B0%EC%A7%91%ED%99%94--t-sne">파트 2: 계층적 군집화 &amp; t-SNE</a>  </li>
<li><a href="#%ED%8C%8C%ED%8A%B8-3-nmf-non-negative-matrix-factorization">파트 3: NMF (Non-Negative Matrix Factorization)</a>  </li>
</ul>
<hr>
<h2 id="파트-1-k-means-클러스터링">파트 1: K-Means 클러스터링</h2>
<h3 id="개념">개념</h3>
<ul>
<li>데이터를 k개의 군집으로 나누는 비지도 학습 알고리즘  </li>
<li>중심(centroid)을 반복 갱신하며 군집 할당  </li>
</ul>
<h3 id="코드-스니펫">코드 스니펫</h3>
<pre><code class="language-python"># 1) 라이브러리 임포트
import numpy as np
from sklearn.cluster import KMeans

# 2) 데이터 로드
samples = np.loadtxt(&#39;data.csv&#39;, delimiter=&#39;,&#39;)       # → 파일 경로/이름 수정

# 3) 모델 선언 및 학습
model = KMeans(n_clusters=3)                          # → k 값 수정
model.fit(samples)

# 4) 클러스터 할당
labels = model.predict(samples)
print(labels)                                         # 예: [0 0 1 1 0 1 …]

# 5) 새로운 샘플 예측
new_samples = np.array([[…], […], […]])              # → 예측할 데이터 입력
new_labels = model.predict(new_samples)
print(new_labels)

# 6) 클러스터 평가 (관성: inertia)
print(model.inertia_)                                 # 값이 낮을수록 응집도 높음

# 7) 시각화 (산점도)
import matplotlib.pyplot as plt
xs = samples[:, 0]                                     # → 사용할 차원 인덱스 조정
ys = samples[:, 1]
plt.scatter(xs, ys, c=labels)
plt.show()</code></pre>
<hr>
<h2 id="파트-2-계층적-군집화--t-sne">파트 2: 계층적 군집화 &amp; t-SNE</h2>
<p>개념
계층적 군집화: 덴드로그램으로 군집 구조 파악
t-SNE: 고차원 데이터를 2차원으로 축소해 시각화</p>
<ul>
<li>계층적 군집화<pre><code class="language-python"># 라이브러리 임포트
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
import matplotlib.pyplot as plt
</code></pre>
</li>
</ul>
<h1 id="병합-연산-linkage">병합 연산 (linkage)</h1>
<p>mergings = linkage(samples, method=&#39;complete&#39;)         # method: &#39;single&#39;,&#39;average&#39;,&#39;ward&#39; 등</p>
<h1 id="덴드로그램-시각화">덴드로그램 시각화</h1>
<p>dendrogram(
    mergings,
    labels=country_names,                             # → 레이블 리스트 입력
    leaf_rotation=90,
    leaf_font_size=6
)
plt.show()</p>
<h1 id="클러스터-레이블-추출">클러스터 레이블 추출</h1>
<p>labels = fcluster(mergings, 15, criterion=&#39;distance&#39;) # → 거리 컷오프 값 조정
print(labels)</p>
<pre><code>- t-SNE
```python
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

# 모델 선언 및 변환
model = TSNE(learning_rate=100)                       # → learning_rate 조정 (50–200 권장)
transformed = model.fit_transform(samples)

# 시각화
xs = transformed[:, 0]
ys = transformed[:, 1]
plt.scatter(xs, ys, c=species)                        # → 군집 비교용 레이블 입력
plt.show()
</code></pre><hr>
<h2 id="파트-3-nmf-non-negative-matrix-factorization">파트 3: NMF (Non-Negative Matrix Factorization)</h2>
<p>개념
음수가 아닌 행렬 분해를 통해 잠재 요인(topic) 추출
문서·이미지 처리, 추천 시스템 등에 활용</p>
<pre><code class="language-python"># 1) 라이브러리 임포트
import numpy as np
from sklearn.decomposition import NMF
import matplotlib.pyplot as plt

# 2) 모델 선언 및 학습
model = NMF(n_components=2)                           # → 컴포넌트 수 수정
model.fit(samples)

# 3) 특징 행렬 변환
nmf_features = model.transform(samples)
print(nmf_features)

# 4) 컴포넌트 행렬 확인
print(model.components_)                              # (n_components, n_features)

# 5) 이미지 재구성 예시
bitmap = sample.reshape((height, width))              # → sample, 크기 수정
plt.imshow(bitmap, cmap=&#39;gray&#39;, interpolation=&#39;nearest&#39;)
plt.show()

# 6) 추천 시스템 적용 예시
nmf = NMF(n_components=6)                             # → 추천용 토픽 수 조정
nmf_features = nmf.fit_transform(articles)            # → articles: 문서×단어 행렬
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[학부연구생 2일차]]></title>
            <link>https://velog.io/@mi_nini/%ED%95%99%EB%B6%80%EC%97%B0%EA%B5%AC%EC%83%9D-2%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@mi_nini/%ED%95%99%EB%B6%80%EC%97%B0%EA%B5%AC%EC%83%9D-2%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 09 Jan 2025 07:10:54 GMT</pubDate>
            <description><![CDATA[<h1 id="이번주-목표">이번주 목표</h1>
<p>1/9
fastapi 공부(로그인 기능 x) 
-&gt; 파이썬 가상환경(.venv)연결해 예제 풀이
axios 공부
( 로컬에서 돌려보기)
mysql 공부(이걸로 서버 관리함)
-&gt; mysql 벤치 설치 후 연결 확인 
orm 이용해서 예제 풀어보기
orm을 사용하여 fastapi를 어떻게 할지 공부</p>
<p>-&gt; 
개념 넓고 얇게 공부하기</p>
<p>데이터 주고 받기 정도</p>
<h2 id="fastapi란">FastAPI란?</h2>
<p>FastAPI는 Python으로 작성된 최신 웹 프레임워크로, 빠르고 간단하며 효율적인 API를 개발할 수 있도록 설계되었습니다. 높은 성능과 사용자 친화적인 인터페이스를 제공하여 웹 개발자들 사이에서 인기를 얻고 있습니다.</p>
<hr>
<h2 id="fastapi의-주요-특징"><strong>FastAPI의 주요 특징</strong></h2>
<h3 id="1-고성능">1. <strong>고성능</strong></h3>
<ul>
<li><strong>ASGI(Asynchronous Server Gateway Interface) 기반</strong>: 비동기 처리를 지원하여 높은 처리 속도를 자랑.</li>
<li>Python의 <strong>Starlette</strong>와 <strong>Pydantic</strong>을 기반으로 제작되어 경량화와 안정성 보장.</li>
</ul>
<h3 id="2-자동-문서화">2. <strong>자동 문서화</strong></h3>
<ul>
<li>FastAPI는 OpenAPI와 JSON Schema를 기반으로 <strong>자동 API 문서화</strong>를 제공합니다.</li>
<li>API를 생성하면 <code>/docs</code> 또는 <code>/redoc</code> 경로에서 문서를 자동 생성 및 확인 가능.</li>
</ul>
<h3 id="3-유형-검사type-hint-활용">3. <strong>유형 검사(Type Hint) 활용</strong></h3>
<ul>
<li>Python의 <strong>Type Hint</strong>를 적극 활용하여 코드의 안정성과 가독성 향상.</li>
<li>Pydantic을 사용해 데이터 검증과 직렬화 지원.</li>
</ul>
<h3 id="4-비동기-지원">4. <strong>비동기 지원</strong></h3>
<ul>
<li><code>async</code>/<code>await</code> 문법을 기본적으로 지원하여 비동기 작업을 간단하게 구현 가능.</li>
<li>데이터베이스, 외부 API와의 비동기 통신에 최적화.</li>
</ul>
<h3 id="5-간결한-코드">5. <strong>간결한 코드</strong></h3>
<ul>
<li>직관적인 문법과 코드 구조로 빠르게 API 개발 가능.</li>
<li>코드 작성이 간소화되어 생산성 증가.</li>
</ul>
<hr>
<h2 id="fastapi-시작하기"><strong>FastAPI 시작하기</strong></h2>
<p>FastAPI를 시작하는 것은 간단하다. 아래의 명령어를 실행하여 FastAPI를 설치</p>
<h3 id="설치">설치</h3>
<pre><code class="language-bash">pip install fastapi uvicorn</code></pre>
<h3 id="간단한-예제-코드">간단한 예제 코드</h3>
<pre><code class="language-python">from fastapi import FastAPI

app = FastAPI()

@app.get(&quot;/&quot;)
def read_root():
    return {&quot;message&quot;: &quot;Hello, FastAPI!&quot;}

@app.get(&quot;/items/{item_id}&quot;)
def read_item(item_id: int, q: str = None):
    return {&quot;item_id&quot;: item_id, &quot;q&quot;: q}</code></pre>
<h3 id="실행">실행</h3>
<pre><code class="language-bash">uvicorn main:app --reload</code></pre>
<ul>
<li><code>http://127.0.0.1:8000</code>에서 API를 확인할 수 있습니다.</li>
<li>자동 생성된 문서는 <code>http://127.0.0.1:8000/docs</code>에서 확인 가능합니다.</li>
</ul>
<hr>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/54a5929f-c175-4156-9d76-c05a52d55ff2/image.png" alt=""></p>
<p>간단하게 html 연결해서 실행해보자
FastAPI로 간단한 대시보드 구현 프로젝트 설명
실행 환경</p>
<pre><code>Python 버전: 3.10 이상
FastAPI: 웹 프레임워크
Uvicorn: ASGI 서버
Jinja2: HTML 템플릿 렌더링
파일 구조:

프로젝트 폴더/
├── .venv/                   # 가상환경 폴더
│   ├── Include/
│   ├── Lib/
│   ├── Scripts/
│   └── 기타 가상환경 파일들
├── static/                  # 정적 파일 저장 폴더
│   └── style.css            # 스타일 파일
├── templates/               # 템플릿 파일 저장 폴더
│   └── dashboard.html       # Jinja2 기반 템플릿 파일
├── main.py                  # FastAPI 애플리케이션 파일
└── 기타 프로젝트 관련 파일</code></pre><p>코드 설명</p>
<pre><code class="language-python"># 1. main.py: FastAPI 애플리케이션 로직

from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates

app = FastAPI()</code></pre>
<hr>
<h2 id="정적-파일-및-템플릿-설정">정적 파일 및 템플릿 설정</h2>
<pre><code class="language-py">app.mount(&quot;/static&quot;, StaticFiles(directory=&quot;static&quot;), name=&quot;static&quot;)
templates = Jinja2Templates(directory=&quot;templates&quot;)


@app.get(&quot;/&quot;, response_class=HTMLResponse)
async def read_dashboard(request: Request):
    data = {&quot;visitors&quot;: 123, &quot;page_views&quot;: 456}  # 샘플 데이터
    return templates.TemplateResponse(&quot;dashboard.html&quot;, {&quot;request&quot;: request, &quot;data&quot;: data})</code></pre>
<blockquote>
<p>핵심 기능:
        /static 경로에 정적 파일(style.css)을 매핑.
        /templates 디렉토리에서 Jinja2 HTML 템플릿(dashboard.html)을 로드.
        샘플 데이터 (visitors, page_views)를 템플릿으로 전달.</p>
</blockquote>
<hr>
<h2 id="dashboardhtml-템플릿-파일">dashboard.html: 템플릿 파일</h2>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;FastAPI Dashboard&lt;/title&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;/static/style.css&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;FastAPI 대시보드&lt;/h1&gt;
    &lt;div class=&quot;container&quot;&gt;
        &lt;p&gt;방문자 수: {{ data.visitors }}&lt;/p&gt;
        &lt;p&gt;페이지 조회 수: {{ data.page_views }}&lt;/p&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<blockquote>
<p>HTML 기능:
        {{ data.visitors }} 및 {{ data.page_views }}는 FastAPI가 전달한 데이터를 표시.
        /static/style.css에서 불러온 스타일을 적용.</p>
</blockquote>
<h2 id="stylecss-정적-css-파일">style.css: 정적 CSS 파일</h2>
<pre><code class="language-css">body {
    font-family: Arial, sans-serif;
    margin: 20px;
    background-color: #f4f4f9;
    color: #333;
}

.container {
    border: 1px solid #ccc;
    padding: 20px;
    border-radius: 5px;
    background: #fff;
    box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.1);
}</code></pre>
<blockquote>
<p>디자인 기능:
        배경색: 연한 회색(background-color: #f4f4f9)
        텍스트 색상: 어두운 회색(color: #333)
        컨테이너: 박스 그림자와 둥근 모서리로 심미성 향상.</p>
</blockquote>
<h2 id="구현-과정">구현 과정</h2>
<blockquote>
<ul>
<li>Python 가상환경 생성 및 활성화
python -m venv .venv
.venv\Scripts\activate          # Windows</li>
<li>필수 라이브러리 설치
pip install fastapi uvicorn jinja2</li>
<li>FastAPI 서버 실행
uvicorn main:app --reload</li>
<li>웹 브라우저에서 확인
  URL: <a href="http://127.0.0.1:8000">http://127.0.0.1:8000</a>
  CSS가 적용된 대시보드와 방문자 및 페이지 조회 수 데이터가 출력됩니다.</li>
</ul>
</blockquote>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/f07338a1-0e55-4a15-86c1-9b2535663045/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/8fe5f04f-45d5-498c-8667-3cb6feaf8c0f/image.png" alt=""></th>
</tr>
</thead>
</table>
<hr>
<h1 id="추가">추가</h1>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/77599989-1589-468b-97c0-6a49e4db0319/image.png" alt="">
Html, js, css를 이용해서 틀을 만들어주고 fastapi를 이용해서  <a href="http://127.0.0.1:8000/">http://127.0.0.1:8000/</a> 로컬서버에 돌린 결과이다. 우리는 결과적으로 React와 fastapi를 연결하는 것이 중요하기에 이부분을 중심적으로 다시 공부해보고 연결해봐야 하겠다. </p>
<blockquote>
<p>참고하자
<a href="https://fastapi.tiangolo.com/tutorial/security/simple-oauth2/">https://fastapi.tiangolo.com/tutorial/security/simple-oauth2/</a>
<a href="https://blog.joonas.io/227">https://blog.joonas.io/227</a>
<a href="https://fastapi.tiangolo.com/ko/">https://fastapi.tiangolo.com/ko/</a>
<a href="https://github.com/reactjs/ko.react.dev">https://github.com/reactjs/ko.react.dev</a>
<a href="https://jongsky.tistory.com/17">https://jongsky.tistory.com/17</a></p>
</blockquote>
<hr>
<blockquote>
<p>이글을 끝으로 옵시디언을 활용해 글을 정리할 예정이다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[항해99 잔디]]></title>
            <link>https://velog.io/@mi_nini/%ED%95%AD%ED%95%B499-%EC%9E%94%EB%94%94</link>
            <guid>https://velog.io/@mi_nini/%ED%95%AD%ED%95%B499-%EC%9E%94%EB%94%94</guid>
            <pubDate>Tue, 31 Dec 2024 05:41:55 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/mi_nini/post/9afe0334-1817-4436-b660-3f2411e570ca/image.png" alt=""></p>
<p>안녕하세요! 깃허브를 통해 이번에 <a href="https://hanghae99.spartacodingclub.kr/campaign?utm_source=effic&amp;utm_medium=crm&amp;utm_campaign=%ED%95%AD%ED%95%B4&amp;utm_content=%EC%9D%B4%EB%B2%A4%ED%8A%B8%EC%B0%B8%EC%97%AC_branding&amp;utm_term=%EA%B0%9C%EB%B0%9C%EC%9E%90_241231">[항해99]</a>에서 진행하는 잔디 기부 캠페인에 참여했습니다. (위 이미지는 제가 기부를 통해 받은 인증서입니다. 🌱)</p>
<h2 id="📌-깃허브">📌 깃허브</h2>
<p>깃허브를 운영하며 올해 느낀 것은, 개발자 커뮤니티는 서로 돕고 영감을 나눌 때 가장 빛난다는 점입니다.
하나의 작은 코드가 누군가의 성장에 도움이 되고, 하나의 작은 기부가 더 나은 세상을 만드는데 기여할 수 있다는 점에서 큰 보람을 느낀 한 해였습니다.
이번 잔디 기부 캠페인은 이러한 가치를 몸소 실천할 수 있는 기회였기에, 저 역시 참여했습니다. </p>
<h2 id="📌-2024년을-마무리하며">📌 2024년을 마무리하며</h2>
<p>2024년은 제게 있어 여러 도전과 배움의 시간이었습니다.
개발자로서 그리고 깃허브 운영자로서, 더 나은 코드를 작성하고 더 많은 사람들과 함께 나눔의 가치를 실천하려 노력했던 한 해였죠.
돌아보면, 완벽한 해는 아니었지만 <strong>&quot;성장했다&quot;</strong>라는 뿌듯함이 남습니다.
그리고 올해를 마무리하며 느낀 가장 큰 교훈은, 작은 실천도 모이면 큰 변화를 만든다는 점입니다. 다가오는 2025년에도 저는 이 마음을 잊지 않고, 더 나은 개발자, 더 나은 사람으로 성장해 나가고 싶습니다. 🙌</p>
<h2 id="📌-마치며">📌 마치며</h2>
<p>작은 실천이라도 도전하고 실천하세요. 깃허브에 잔디를 심듯, 세상에 잔디를 심고, 나눔과 성장을 만들어가는 여정에 동참해보세요. 나눔은 나 혼자만의 힘으로 이루어지는 게 아니라, 우리가 함께할 때 진정한 의미를 갖는다고 생각합니다.</p>
<blockquote>
<p>#항해99 #잔디기부캠페인 #잔디기부</p>
</blockquote>
<p>2024년 한 해 동안 함께 성장하고 도전한 모든 분들께 감사드립니다.
새해에도 더 큰 나눔과 성장을 이룰 수 있기를 바라며, 따뜻하고 희망찬 2025년이 되길 기원합니다. 행복한 새해 맞이하세요! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024를 마치며 ]]></title>
            <link>https://velog.io/@mi_nini/2024%EB%A5%BC-%EB%A7%88%EC%B9%98%EB%A9%B0</link>
            <guid>https://velog.io/@mi_nini/2024%EB%A5%BC-%EB%A7%88%EC%B9%98%EB%A9%B0</guid>
            <pubDate>Sun, 29 Dec 2024 08:24:30 GMT</pubDate>
            <description><![CDATA[<p>오늘날짜는 2024-12-29일로 학교 종강을 한지 7일이 넘어가는 시점이다. 아직도 시험성적이 다 나오지 않아서... 심란한 마음으로 블로그를 열었다. 이번 방학에 계획을 세우고 최근에 있었던 이야기들을 적어보려고 한다. </p>
<hr>
<h1 id="📌-kt-디지털-인재-장학생-수료식">📌 KT 디지털 인재 장학생 수료식</h1>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/167a53ce-873d-4d3a-a112-65e06ec05175/image.png" alt=""></p>
<p>12월 20일, KT 디지털 인재 장학생 수료식을 진행했다. 사전에 네트워킹을 할 수 있는 오픈 채팅방이 만들어졌고, 초대받아 간단한 이야기들을 나누었다. 또한, 사전 주제와 미션을 받고 현장에서 조원들과 함께 토론 후 발표하는 시간을 가졌다. (소피텔 앰배서더 서울 호텔 &amp; 서비스드 레지던스에서 진행됨)</p>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/1488a16f-cc9f-48c6-b9bd-2f6ca74d4762/image.jpg" alt=""></p>
<blockquote>
<h3 id="사전주제">사전주제</h3>
<p><strong>Q. 최근 신체 이식에 대한 연구가 활발히 이루어지고 있는 가운데, 머리를 이식하는 연구가 진행 중입니다. 이 연구에 참여하여 만약 나의 머리를 다른 사람의 신체로 이식하였을 때 그 모습을 보고 과연 ‘나’라고 할 수 있을까요?</strong></p>
</blockquote>
<p>도착 후 각 인원에게 미션지가 제공되었다. 미션의 내용은 다음과 같았다:</p>
<ol>
<li>사전 주제에 대한 답안을 팀 보드판에 작성하기  </li>
<li>오태성 실장님, 이창준 본부장님 중 1명과 함께 포토 촬영하기  </li>
<li>I AN 소감 인터뷰 영상을 촬영하기  </li>
</ol>
<p>미션 자체는 크게 어렵지 않았지만, 사전에 받은 주제에 대해 이야기하는 데 있어 아쉬운 점이 있었다. 모든 조원이 각 지역에서 왔기 때문에 시간이 맞지 않아 늦게 참여한 분들도 있었고, 충분한 대화를 나누지 못한 점이 아쉬웠다.</p>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/8c14a45c-8848-45b5-818c-8ae11b88e6dd/image.jpg" alt=""></p>
<p>중간에 진행된 졸업 장학생 수료증 수여식 및 우수 장학생 시상식에서는 운이 좋게도 충주권 ICT 지원을 받아 취득한 KT_AICE 자격증 관련 상을 받았다. 자격증 덕분에 가산점을 받아 이런 상을 받게 된 것 같아 기뻤다. (쉬운 난이도로 시험을 봐서 민망하기도 했지만… 비밀로 해두자!)</p>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/f381e7d4-84b8-44d4-9383-36a91bcee861/image.jpg" alt=""></p>
<p>호텔에서 제공된 코스 요리를 먹으며 정말 감사한 마음이 들었다. 텀블러, 지갑, 각 개인 이름이 적힌 스티커와 응원 글 등 다양한 선물도 챙겨 주셨다.</p>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/a835e92f-e15f-41a5-bd75-7145ba71dda0/image.jpg" alt=""></p>
<p>오후 시간에는 외부 강사를 초청하여 특강 및 네트워킹 시간을 가졌다. 특히 궤도님을 실제로 마주하게 되어 정말 색다른 느낌이었다. 마치 연예인을 보는 듯한 기분이 들었고, 궤도님이 전한 짧은 인공지능 역사와 현재의 방향성, 더 발전하기 위한 방법들에 대한 이야기가 매우 인상적이었다. 궤도님은 우리가 어떻게 하면 더 나은 사람이 될 수 있을지 고민해 보길 바란다는 말을 남기며 생성형 AI에 대한 많은 이야기를 나눴다. 이를 통해 나 또한 더 열심히 공부해야겠다는 생각을 하게 되었다. (시간이 타이트해서 많은 이야기를 하지 못한점과 조원사이 이야기가 원활하게 안되었고 급하게 결과만 이야기한 점은 아쉬웠다.)</p>
<blockquote>
<h3 id="기사">기사</h3>
<p><a href="https://www.aitimes.kr/news/articleView.html?idxno=33332">https://www.aitimes.kr/news/articleView.html?idxno=33332</a></p>
</blockquote>
<blockquote>
<h2 id="📌-참고">📌 참고</h2>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/6d3b7fcf-2ebc-4c93-95bb-95161ea91be1/image.jpg" alt=""></p>
</blockquote>
<blockquote>
<h2 id="💻-5조-github">💻 5조 GitHub</h2>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/0e270145-8bb9-4c44-b16c-3051ab564c9b/image.png" alt=""></p>
</blockquote>
<blockquote>
<h3 id="조별로-진행하였던-폼보드에-서로를-위해서-썼던-응원메세지">조별로 진행하였던 폼보드에 서로를 위해서 썼던 응원메세지</h3>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/bdd5c64c-59de-4314-bc0e-8e5aa53edc71/image.jpg" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/40faa1a2-ea9c-42f7-bbf3-44bb5e2197f6/image.jpg" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td><img src="https://velog.velcdn.com/images/mi_nini/post/9c7d1f0b-6422-46e9-947e-ca8adc014c9f/image.jpg" alt=""></td>
<td><img src="https://velog.velcdn.com/images/mi_nini/post/174e1666-babb-4593-bf3b-bf9169221478/image.jpg" alt=""></td>
</tr>
<tr>
<td><img src="https://velog.velcdn.com/images/mi_nini/post/ea3d9ec8-0182-4ed3-a996-99844e5ab21c/image.jpg" alt=""></td>
<td><img src="https://velog.velcdn.com/images/mi_nini/post/1600eaa6-1e14-43b2-9ead-8ae38440afb7/image.jpg" alt=""></td>
</tr>
</tbody></table>
</blockquote>
<hr>
<h1 id="📌-연구실-인턴-지원">📌 연구실 인턴 지원</h1>
<p>유니스트 U-WURF에 지원했는데 12/26일 결과가 나왔다. 선택받지 못 했다.. 따로 지원서도 작성하고 연구실교수님에게 CV양식을 맞추고 여러 PPT연구 계획서 메일을 보냈었는데 답변은 오지않았고 약100명에 학생들이 뽑혔는데 AI분야와 관련된 학생은 2명밖에 뽑히지 않았다.. (모집인원이 00으로 보았으나 교수님들에 커트라인에 미치지 못하면 잘랐다고 생각한다.. 많이 부족하고 더 노력해야지..) 다음 방학에도 기회가 있고 이번기회로 내가 부족한점이 무엇인지 다시 생각해보고 더 노력해야겠다고 생각한다. (연구 경험이 없자나..) 자대 학교내 연구실을 들어가고 싶어 교수님에게 따로 메일을 보낼 예정이다.</p>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/b1f2e549-7751-4be8-84c7-95c7972a4358/image.png" alt=""></p>
<hr>
<h1 id="📌-앞으로-해야할것">📌 앞으로 해야할것</h1>
<p>지금 당장 내가 무엇을 해야할지 정해야하는데... 오랜에 본가 부천을 오니 못봤던 친구들도 보고 부모님도 뵙고 하니 7일이라는 시간이 금방 지나간거같다. 토익, 토스도 딸것이고 공모전도 학교 형과 같이 이야기 한 부분이 있어 참여하고 내 개인 사이드 프로젝트도 진행하고 블로그도 중간중간 작성할 것이고 충주권ICT에서 지원해주는 교육사업도 들으면서 방학을 보낼거같다. 그 중 학교 교수님에게 메일을 보내서 연구실에 들어가 사람들과 프로젝트를 진행하는것이 제일 좋다고는 생각하지만... 하루를 후회없이 살고 더 나은 내일이 되기 위해 노력하자. 열심히 살고 좋은 결과가 나오는 2025년이 될 수 있도록.</p>
<blockquote>
<h3 id="2024-잔디">2024 잔디</h3>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/0227c3d2-a866-4be5-84c2-5bf0cfeb9025/image.png" alt=""></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터과학_15_2]]></title>
            <link>https://velog.io/@mi_nini/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99152</link>
            <guid>https://velog.io/@mi_nini/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99152</guid>
            <pubDate>Wed, 11 Dec 2024 00:55:38 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-regression회귀분석">📌 Regression(회귀분석)</h1>
<blockquote>
<h2 id="galton의-데이터">Galton의 데이터</h2>
</blockquote>
<ul>
<li>패키지 UsingR</li>
<li>데이터 galton에는 부모의 키, 자식의 키에 대한 927개의 관측치가 있다.</li>
<li>부모의 키는 (아버지의 키 + 1.08*엄마의 키)/2</li>
<li>자료출처는 <a href="http://rstudio-pubs-static.s3.amazonaws.com/189354_277dfb3a83a34a2abaae855b90fcf269.html">여기에</a>
<img src="https://velog.velcdn.com/images/mi_nini/post/78c7fd28-8ec3-4c8d-9b7e-7b11f3059ea2/image.png" alt=""></li>
</ul>
<h2 id="상관분석과-회귀분석">상관분석과 회귀분석</h2>
<ul>
<li>상관분석
  두 연속변량 사이에 상관관계가 있는지의 여부</li>
<li>회귀분석
  두 연속변량 사이에 함수 관계를 찾고, 예측할 수 있는 모형 찾기</li>
<li>단순선형회귀분석
  설명변수가 1개인 직선 모형</li>
<li>다중선형회귀분석
  설명변수가 여러 개인 일차 모형</li>
</ul>
<h1 id="📌-상관계수-성질">📌 상관계수 성질</h1>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/81d79483-508a-4f28-a8ae-67bcbd0c40c8/image.png" alt=""></p>
<ul>
<li>상관계수는 두 연속변량 X, Y의 선형 관계를 나타내주며 −1≤𝑟≤1이다.</li>
<li>𝑟&gt;0일 때, X가 증가함에 따라, Y도 증가하는 경향이 있다.</li>
<li>𝑟&lt;0일 때, X가 증가함에 따라, Y는 감소하는 경향이 있다.</li>
<li>𝑟=1이면, 모든 데이터가 기울기가 양수인 직선 위에 있다.</li>
<li>𝑟=−1이면, 모든 데이터가 기울기가 음수인 직선 위에 있다.</li>
<li>𝑟=0이면 선형관계가 없다.</li>
</ul>
<hr>
<h2 id="💻-데이터---대리점의-광고비와-판매수익과의-관계">💻 데이터 - 대리점의 광고비와 판매수익과의 관계</h2>
<table>
<thead>
<tr>
<th>대리점</th>
<th>광고비(백만원)</th>
<th>판매수익(천만원)</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>2</td>
<td>8</td>
</tr>
<tr>
<td>2</td>
<td>3</td>
<td>9</td>
</tr>
<tr>
<td>3</td>
<td>6</td>
<td>18</td>
</tr>
<tr>
<td>4</td>
<td>4</td>
<td>17</td>
</tr>
<tr>
<td>5</td>
<td>7</td>
<td>21</td>
</tr>
<tr>
<td>6</td>
<td>4</td>
<td>14</td>
</tr>
<tr>
<td>7</td>
<td>8</td>
<td>27</td>
</tr>
<tr>
<td>8</td>
<td>6</td>
<td>22</td>
</tr>
</tbody></table>
<pre><code class="language-py">c &lt;- c(2,3,6,4,7,4,8,6)
s &lt;- c(8,9,10,17,21,14,27,22)

df &lt;- data.frame(cost=c, sales=s)

cor(df)</code></pre>
<blockquote>
<p>A matrix: 2 × 2 of type dbl
cost    sales
cost    1.0000000    0.8167395
sales    0.8167395    1.0000000</p>
</blockquote>
<pre><code class="language-py">library(ggplot2)

p &lt;- ggplot(df, aes(cost, sales))
p + geom_point(size=3, color=&#39;blue&#39;)</code></pre>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/b61b95b5-79ed-433c-916a-7a7d5641a750/image.png" alt=""></p>
</blockquote>
<pre><code class="language-py">cor.test(df$cost, df$sales)</code></pre>
<blockquote>
<p>   Pearson&#39;s product-moment correlation
data:  df$cost and df$sales
t = 3.4672, df = 6, p-value = 0.01335
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.2640181 0.9656486
sample estimates:
      cor 
0.8167395 </p>
</blockquote>
<ul>
<li><p>상관계수는 0.9550718</p>
</li>
<li><p>귀무가설: 상관계수는 0이다.</p>
</li>
<li><p>p-value는 0.0002192로 유의수준(0.05)보다 작으므로 유의하다. </p>
</li>
<li><p>상관계수가 0이라는 귀무가설을 기각.</p>
</li>
<li><p>즉, 상관계수는 0이 아니라고 할 수 있다.</p>
</li>
</ul>
<hr>
<h1 id="📌-회귀분석regression">📌 회귀분석(regression)</h1>
<ul>
<li>두 변량 X, Y 사이의 관계를 가장 잘 나타내주는 함수식  𝑦=𝑓(𝑥)을 찾아 modelling을 하고,  예측값을 구하는 과정</li>
<li>여기서 함수 𝑓(𝑥)가 일차식인 경우를 선형회귀분석이라 한다.</li>
<li>종속변수(반응변수) Y에 영향을 미치는 변수(독립변수)가 1개일 때, 단순회귀분석이라 한다.</li>
<li>특히, 독립변수가 1개이고 일차식인 경우를 단순선형회귀분석이라 한다.</li>
</ul>
<blockquote>
<h3 id="회귀직선--모델링---예측치">회귀직선 – 모델링 -&gt; 예측치</h3>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/6aa94743-cd1c-48ef-abfd-cf5f277356c3/image.png" alt=""></p>
</blockquote>
<ul>
<li>회귀직선의 방정식은 𝒚=𝟑𝒙+𝟐로 이는 광고비가 1(백만원) 늘어나면, 판매수익이 3(천만원) 늘어난다는 것을 의미한다.</li>
<li>예측치: 예를 들어 광고비가 5(백만원)이라면 예상되는 판매수익은 𝟑×𝟓+𝟐=𝟏𝟕(천만원)</li>
</ul>
<pre><code class="language-py">library(ggplot2)

p &lt;- ggplot(df, aes(cost, sales))
p + geom_point(size=3, color=&#39;blue&#39;) + geom_smooth(method = &#39;lm&#39;, formula = &#39;y~x&#39;)</code></pre>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/30524790-157a-4fcb-a229-d6d2fac96cc9/image.png" alt=""></p>
</blockquote>
<pre><code class="language-py">reg &lt;- lm(sales ~ cost, data=df)
reg
# 회귀분석
summary(reg)</code></pre>
<blockquote>
<p>Call:
lm(formula = sales ~ cost, data = df)</p>
</blockquote>
<ul>
<li><p>Coefficients:
(Intercept)         cost  </p>
<pre><code>2.333        2.733  </code></pre></li>
<li><p>lm(종속변수 ~ 독립변수)</p>
</li>
<li><p>단순선형회귀 분석의 결과 y절편은 2, 기울기는 3</p>
</li>
<li><p>R 제곱(결정계수)의 값은 0.9122</p>
</li>
<li><p>결정계수의 값이 1에 가까울수록 모형이 적합</p>
</li>
</ul>
<h2 id="📌-r을-이용한-회귀분석--lm-회귀직선그리기">📌 R을 이용한 회귀분석 – lm(), 회귀직선그리기</h2>
<ul>
<li>예측치(fitted.values) 회귀직선 상의 값</li>
<li>잔차(residuals) 관측치와 예측치의 차
<img src="https://velog.velcdn.com/images/mi_nini/post/f4905674-2814-4883-9d73-96b0a7bf371f/image.png" alt=""> </li>
</ul>
<h2 id="회귀직선그리기">회귀직선그리기</h2>
<ul>
<li><p>회귀직선의 계수는 reg$coefficients에</p>
</li>
<li><p>첫번째가 y절편</p>
</li>
<li><p>두번째가 기울기</p>
</li>
<li><p>geom_abline()은 직선을 y절편과 기울기로 그려주는 함수</p>
</li>
<li><p>회귀직선의 계수는 reg$coefficients에</p>
</li>
<li><p>첫번째가 y절편</p>
</li>
<li><p>두번째가 기울기</p>
</li>
<li><p>geom_abline()은 직선을 y절편과 기울기로 그려주는 함수</p>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/4f90e4e6-f6b5-438d-91fd-7246590014e6/image.png" alt=""> | <img src="https://velog.velcdn.com/images/mi_nini/post/a16a8a2a-1f88-4272-8815-16a713a47bb8/image.png" alt=""></p>
</li>
<li><p>-| --|</p>
</li>
</ul>
<h2 id="잔차-산점도">잔차 산점도</h2>
<ul>
<li>잔차의 산점도가 일정한 패턴을 나타내면 모형 부적합</li>
<li>geom_hline()은 수평선 
<img src="https://velog.velcdn.com/images/mi_nini/post/44696f26-abd0-4dc7-b2ac-10d0897ac502/image.png" alt=""></li>
</ul>
<h2 id="예측치-구하기--predict">예측치 구하기 – predict()</h2>
<ul>
<li>예측치</li>
<li>cost가 5일 때의 예측치는 17</li>
<li>cost가 10일 때의 예측치는 32 </li>
<li>lm(df$y ~ lm$x)를 사용하면 predict에서 에러가 남
<img src="https://velog.velcdn.com/images/mi_nini/post/d1b7b80c-956f-4ee2-af83-7d159d6c90eb/image.png" alt=""></li>
</ul>
<blockquote>
<h2 id="🚀-주의">🚀 주의</h2>
<p>회귀분석 lm 사용시 lm(y ~ x, data=df)
위와 같이 하지 않으면 예측치를 구하지 못함
<img src="https://velog.velcdn.com/images/mi_nini/post/91c9dfbb-62f5-478d-ac4d-adc55d35472c/image.png" alt=""></p>
</blockquote>
<hr>
<h2 id="📌-결과해석">📌 결과해석</h2>
<ul>
<li><p>회귀직선의 방정식: 𝒚=𝟐+𝟑𝒙</p>
</li>
<li><p>광고비가 1(백만원) 늘어나면, 판매수익이 3(천만원) 늘어난다는 것을 의미한다.</p>
</li>
<li><p>예측치: 광고비가 5(백만원)이라면 예상되는 판매수익은 𝟐+𝟑×𝟓=𝟏𝟕(천만원)이다.</p>
<hr>
<h1 id="📌-비선형-회귀-분석">📌 비선형 회귀 분석</h1>
</li>
</ul>
<pre><code class="language-py">?women</code></pre>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/9c903785-59cb-4981-941a-26d131fa3204/image.png" alt=""></p>
<h2 id="산점도">산점도</h2>
<ul>
<li>산점도 및 상관계수</li>
<li>상관계수는 0.995로 1에 매우 가까움
<img src="https://velog.velcdn.com/images/mi_nini/post/239eaa3e-ce7e-4f66-a9e6-980e18e6ab59/image.png" alt=""></li>
</ul>
<h2 id="회귀분석-회귀곡선-직선그래프-잔차그래프">회귀분석, 회귀곡선 직선그래프, 잔차그래프</h2>
<ul>
<li>y절편은 -87.5</li>
<li>기울기는 3.45</li>
<li>R제곱은 0.991</li>
<li>R제곱은 적절한 것으로 보임</li>
<li>잔차의 그래프가 감소하다 증가하는 패턴을 보임.</li>
<li>모형 부적합
<img src="https://velog.velcdn.com/images/mi_nini/post/a461effa-ef58-412f-b3e9-29031919ddb7/image.png" alt=""></li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/16add5cd-6418-4c90-a130-a53355c00243/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/3828773f-629f-4305-9f7a-a1cd60e1f465/image.png" alt=""></th>
</tr>
</thead>
</table>
<hr>
<h2 id="이차모형-회귀곡선-곡선-그래프-잔차-그래프">이차모형, 회귀곡선 곡선 그래프, 잔차 그래프</h2>
<blockquote>
<p>𝑦=𝛽_0+𝛽_1 𝑥+𝛽_2 𝑥^2+𝜖</p>
</blockquote>
<ul>
<li>I( ) 함수를 이용하여 이차항 추가</li>
<li>상수항: 261.8</li>
<li>일차항: -7.34</li>
<li>이차항: 0.08</li>
<li>R 제곱 = 0.9995
<img src="https://velog.velcdn.com/images/mi_nini/post/b99df6cc-729f-41fc-ace3-a75ca354615d/image.png" alt=""></li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/e19de2eb-ebc4-4846-97cf-0db960fca224/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/98c4808a-e3c0-4198-9833-2945b3ae50d0/image.png" alt=""></th>
</tr>
</thead>
</table>
<hr>
<table>
<thead>
<tr>
<th>formula</th>
<th>구성 내용</th>
</tr>
</thead>
<tbody><tr>
<td>y~x</td>
<td>y = a + bx 모형 구성</td>
</tr>
<tr>
<td>y~x-1</td>
<td>y = bx 절편이 없는 모형 구성</td>
</tr>
<tr>
<td>y~1/x</td>
<td>y = 절편항(평균)</td>
</tr>
<tr>
<td>y~x1+x2</td>
<td>y = a + b1x1 + b2x2 모형 구성</td>
</tr>
<tr>
<td>y~x1*x2</td>
<td>y = a + b1x1 + b2x2 + b3x1x2 (x1, x2의 교호작용을 고려한 모형 구성)</td>
</tr>
<tr>
<td>y~x1+x2+x1:x2</td>
<td>y = a + b1x1 + b2x2 + b3x1x2 (x1, x2의 교호작용을 고려한 모형 구성)</td>
</tr>
<tr>
<td>y~(x1+x2+x3)^2</td>
<td>y = a + b1x1 + b2x2 + b3x3 + b4x1x2 + b5x1x3 + b6x2x3</td>
</tr>
<tr>
<td>y~(x1+x2+x3)^3</td>
<td>y = a + b1x1 + b2x2 + b3x3 + b4x1x2 + b5x1x3 + b6x2x3 + b7x1x2x3</td>
</tr>
<tr>
<td>y~x1+I(x1^2)</td>
<td>y = a + b1x1 + b2x1^2</td>
</tr>
<tr>
<td>y~1/(1/x)</td>
<td>y = a + b1x</td>
</tr>
<tr>
<td>y~x1</td>
<td>z</td>
</tr>
<tr>
<td>y~., data=dd</td>
<td>y = a + b1x1 + b2x2 ... 모형 구성 (dd라는 이름의 data, 종속변수 y를 지정, 이외 모든 변수는 설명변수)</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터과학_15_1]]></title>
            <link>https://velog.io/@mi_nini/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99151</link>
            <guid>https://velog.io/@mi_nini/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99151</guid>
            <pubDate>Mon, 09 Dec 2024 05:33:20 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-데이터마이닝">📌 데이터마이닝</h1>
<h3 id="데이터-마이닝의-이해">데이터 마이닝의 이해</h3>
<ul>
<li>데이터마이닝(data mining)은 대용량의 데이터로부터 자동 또는 반자동적인 방법으로 의미있는 패턴, 규칙, 관계를 찾아내는 것</li>
<li>데이터 자체의 분석 단계를 넘어 패턴 추출</li>
<li>수작업의 어려움 -&gt; 데이터마이닝의 발달</li>
</ul>
<h3 id="데이터-마이닝의-특징">데이터 마이닝의 특징</h3>
<ul>
<li>데이터(베이스)의 내용을 및 결과를 단순 활용에서 벗어나 데이터에 내재해 있는 패턴 추출</li>
<li>데이터의 양이 방대해지면서 수작업이 어려움</li>
<li>데이터 마이닝의 필요성 대두</li>
<li>데이터 마이닝은 사용자의 경험이나 편견을 배제하고 전적으로 데이터에 기반하여 패턴 추출</li>
</ul>
<h3 id="활용분야">활용분야</h3>
<ul>
<li>카드사의 사기 발견 프로세스</li>
<li>금융권의 대출 승인</li>
<li>투자 분석</li>
<li>기업의 마케팅 </li>
<li>순수 과학 분야의 자료 분석</li>
</ul>
<hr>
<h3 id="기법">기법</h3>
<ul>
<li>군집분석</li>
<li>의사결정나무 </li>
<li>연관관계 분석 기법</li>
<li>인공신경망 기법</li>
<li>회귀분석</li>
<li>사례 기반 추론</li>
<li>텍스트 마이닝</li>
<li>오피니언 마이닝</li>
</ul>
<blockquote>
<h2 id="💻-패키지">💻 패키지</h2>
<p>library(GGally)
library(factoextra)
library(rpart)
library(rpart.plot)
library(caret)
library(KoNLP)
library(wordcloud)</p>
</blockquote>
<hr>
<h1 id="📌-군집분석cluster-analysis">📌 군집분석(Cluster Analysis)</h1>
<p>변수 또는 개체(item)들이 속한 모집단 또는 범주에 대한 사전정보가 없는 경우에 관측값들 사이의 거리(또는 유사성)를 이용하여 변수 또는 개체들을 자연스럽게 몇 개의 그룹 또는 군집(cluster)으로 나누는 분석법</p>
<h2 id="📌-k-means-clustering">📌 K-means Clustering</h2>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/da68dd4d-8c6f-43a0-8bd7-afbebac55681/image.png" alt=""></p>
<p>집단을 K 개의 그룹으로 나누는 방법</p>
<blockquote>
<p>자료출처: <a href="http://norman3.github.io/prml/docs/chapter09/1.html">http://norman3.github.io/prml/docs/chapter09/1.html</a></p>
</blockquote>
<h2 id="📌-유사도">📌 유사도</h2>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/09e5c356-65e9-4ee2-86a5-5cc464a6416f/image.png" alt=""></p>
<ul>
<li><p>유클리드 거리
2차원: 두 점 (𝑥_1,𝑥_2 ), (𝑦_1, 𝑦_2) 사이의 거리√((𝑦_1−𝑥_1 )^2+(𝑦_2−𝑥_2 )^2 ) 
n차원: 두 점 (𝑥_1,⋯, 𝑥_𝑛 ), (𝑦_1, ⋯, 𝑦_𝑛) 사이의 거리(∑▒(𝑦_𝑖−𝑥_𝑖 )^𝑛 )^(1/𝑛)</p>
</li>
<li><p>코사인(cosine) 유사도
두 벡터(vector)가 이루는 각의 코사인 값cos⁡(𝑥,𝑦)=(𝑥⋅𝑦)/(|(|𝑥|)|  ||𝑦||)</p>
</li>
</ul>
<blockquote>
<h2 id="💻-실습-데이터---iris">💻 실습 데이터 - iris</h2>
</blockquote>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/32ad15b5-fab1-4421-88ed-c42d51d63f55/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/218bdaad-70a8-445e-8622-d97f899f5f2c/image.png" alt=""></th>
</tr>
</thead>
</table>
<h2 id="꽃잎의-너비와-길이의-산점도">꽃잎의 너비와 길이의 산점도</h2>
<ul>
<li>색상을 종(Species)에 따라 다르게</li>
<li>점 모양도 종에 따라 다르게</li>
<li>크게 3개의 그룹으로 나뉘어짐
<img src="https://velog.velcdn.com/images/mi_nini/post/12d5e479-d0fc-428f-ae22-789db383d30f/image.png" alt=""></li>
</ul>
<h2 id="📌-petal-자료만--사용하여-분류---kmeans">📌 petal 자료만 사용하여 분류 - kmeans()</h2>
<ul>
<li>petal 자료만 추출</li>
<li>원데이터 알고 있음</li>
<li>Length와 Width를 이용하여 Species를 분류하고 그 결과를 비교할 예정</li>
<li>kmeans(데이터, centers=n, iter.max=회수)</li>
<li>petal[1:2]로 Length와 Width만 사용</li>
<li>centers=3: 3개의 중심</li>
<li>iter.max: 반복횟수</li>
<li>결과는 실행시 마다 다르게 나타날 수 있음</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/f379daeb-be65-4746-98c0-4768d2e57375/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/a472f263-e37d-41f4-8ad2-f1294c31b6b0/image.png" alt=""></th>
</tr>
</thead>
</table>
<blockquote>
<h2 id="kmean-결과는-리스트">kmean 결과는 리스트</h2>
</blockquote>
<ul>
<li>3개의 중심 좌표 확인</li>
<li>3개의 그룹에 각각 50, 52, 48개로 분류</li>
<li>분류 그룹은 cluster에 저장됨
<img src="https://velog.velcdn.com/images/mi_nini/post/25b54322-5487-4345-866f-24f419a6d3da/image.png" alt=""></li>
</ul>
<hr>
<h2 id="📌-petal-자료만-사용">📌 petal 자료만 사용</h2>
<ul>
<li>이차원표 결과:</li>
<li>setosa는 정확히 분류</li>
<li>versicolor는 2개 오분류</li>
<li>virginica는 4개 오분류</li>
<li>결과는 실행시마다 달라질 수 있음
<img src="https://velog.velcdn.com/images/mi_nini/post/418c9b21-7339-4e15-9dee-f34e6703e936/image.png" alt=""></li>
</ul>
<h2 id="중심-확인">중심 확인</h2>
<ul>
<li>각 군집(cluster)의 중심(center)도 그림에 추가</li>
<li>centers를 data frame으로 저장한 후 그래프를 그림.
<img src="https://velog.velcdn.com/images/mi_nini/post/babf4f2d-ff53-4ea3-8188-10386bba0208/image.png" alt=""></li>
</ul>
<h2 id="군집별-평행-좌표-그림-타원그림">군집별 평행 좌표 그림, 타원그림</h2>
<ul>
<li>패키지 GGally 필요</li>
<li>데이터는 petal</li>
<li>사용 키는 1, 2 열</li>
<li>각 자료들이 어떻게 분류되어 있는지 확인 가능</li>
<li>패키지 factoextra 필요</li>
<li>군집별 타원으로 visualization</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/40f5cd49-7a3e-4161-b6d8-7ec27adaeced/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/0909c471-6703-4963-8011-d48acb547233/image.png" alt=""></th>
</tr>
</thead>
</table>
<h1 id="📌-의사결정-나무decision-tree">📌 의사결정 나무(decision tree)</h1>
<blockquote>
<ul>
<li>의사결정나무는 데이터마이닝의 주요 기법 중 하나</li>
</ul>
</blockquote>
<ul>
<li>분류 및 예측에 사용되는 기법</li>
<li>사용이 용이하고 결과 해석 수월</li>
<li>규칙 셋(set)으로 표현 가능</li>
</ul>
<h3 id="주요-변수의-선정이-용이">주요 변수의 선정이 용이</h3>
<table>
<thead>
<tr>
<th>특징</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>주요 변수의 선정이 용이</td>
<td>중요한 변수만 선별하여 의사결정나무를 구성</td>
</tr>
<tr>
<td>교호 효과의 해석</td>
<td>두 개 이상의 변수가 결합하여 목표 변수에 어떻게 영향을 주는지 쉽게 알 수 있다.</td>
</tr>
<tr>
<td>비모수적 모형</td>
<td>선형성, 정규성, 등분산성 등의 가정 불필요</td>
</tr>
<tr>
<td>해석 용이</td>
<td>결과를 해석하기 용이</td>
</tr>
<tr>
<td>지식 추출</td>
<td>의사결정나무를 룰로 변환 가능</td>
</tr>
</tbody></table>
<h3 id="비연속성-및-나무형성의-한계">비연속성 및 나무형성의 한계</h3>
<table>
<thead>
<tr>
<th>특징</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>비연속성</td>
<td>연속형 변수(비율척도)를 비연속적인 값으로 취급하여 분리의 경계에서 오차 가능성</td>
</tr>
<tr>
<td>선형성 또는 주효과의 결여</td>
<td>선형 또는 주효과 모형에서와 같은 결과를 얻을 수 없다</td>
</tr>
<tr>
<td>비안정성</td>
<td>분석용 자료에만 의존하여 새로운 자료의 예측 불안정 가능성</td>
</tr>
<tr>
<td>나무형성 시 컴퓨팅 비용 증가</td>
<td>나무형성 시 많은 컴퓨팅 비용이 소요됨</td>
</tr>
</tbody></table>
<hr>
<h2 id="💻-실습_iris-데이터">💻 실습_iris 데이터</h2>
<h2 id="의사결정나무-규칙-구하기">의사결정나무 규칙 구하기</h2>
<ul>
<li>라이브러리 rpart 사용</li>
<li>150개의 데이터를 훈련 데이터로 모두사용</li>
<li>Species ~ .: 에서 종(Species)는 알고 있는 결과, .은 모든 변수 사용하라는 뜻</li>
<li>주어진 결과는 규칙</li>
<li>라이브러리 rpart.plot 사용</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/082e3aa0-9b33-4c5e-8a5e-20685d021870/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/c8e2933f-b2a1-4c71-9cdd-309b82afce0e/image.png" alt=""></th>
</tr>
</thead>
</table>
<h2 id="의사결정나무로-예측하기">의사결정나무로 예측하기</h2>
<ul>
<li>sample() 함수를 이용하여 10개를 랜덤하게 추출</li>
<li>predict(r, newdata=…) newdata에는 데이터프레임으로 4개의 변수만.</li>
<li>predict()는 확률로 표시</li>
<li>predict(r, newdata=…, type=‘class’)옵션을 추가하여 가장 높은 확률의 class로 예측</li>
<li>table()로 확인해보면 1개의 오분류가 있음.</li>
<li>샘플 10개가 추출될 때마다 결과가 다를 수 있음</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/2cdf9308-da8f-4310-92cb-9fcdc896f44e/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/b2477bb9-b1fc-4e4c-bb2e-7ac7e90159d2/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/7b0a82a2-91c2-4be9-8336-269a22a442cc/image.png" alt=""></th>
</tr>
</thead>
</table>
<blockquote>
<h1 id="기계-학습에서는-어떻게-활용하나">기계 학습에서는 어떻게 활용하나?</h1>
<p>데이터를 훈련데이터(training)와 테스트 데이터(testing)으로 분류
훈련데이터로 군집분류 규칙을 찾고, 테스트데이터로 정확도 확인
패키지: caret(Classification And REgression Training)
createDataPartition(데이터, p=비율) 사용 </p>
</blockquote>
<hr>
<h1 id="📌-데이터-파티션--훈련--테스트">📌 데이터 파티션 – 훈련 &amp; 테스트</h1>
<ul>
<li>iris 데이터 중 70%를 훈련 데이터(training)로</li>
<li>30%를 테스트 데이터(testing)로
<img src="https://velog.velcdn.com/images/mi_nini/post/10fdb012-cfe4-4121-891b-5cd3f5bbbed5/image.png" alt=""></li>
</ul>
<h2 id="의사결정-나무-규칙-구하기">의사결정 나무 규칙 구하기</h2>
<ul>
<li>훈련 데이터(training)를 이용하여 분류 규칙 찾기</li>
<li>변수 1~4까지 모두 사용</li>
<li>분류 규칙에는 Patal.Length와 Petal.Width 2개만으로
<img src="https://velog.velcdn.com/images/mi_nini/post/dca5ebd3-0ecf-4589-8d85-6f03c20d87a8/image.png" alt=""></li>
</ul>
<h2 id="테스트-데이터로-확인">테스트 데이터로 확인</h2>
<ul>
<li>규칙 r로 예측한 결과를 testing의 새로운 변수 predict로 저장</li>
<li>table로 예측의 정확도 확인</li>
<li>testing$Species는 원래 종, testing$predict는 규칙에 의한 분류</li>
<li>1개가 오분류됨
<img src="https://velog.velcdn.com/images/mi_nini/post/99c265a8-f19e-440b-8685-7f0cef7c32ed/image.png" alt=""></li>
</ul>
<h3 id="🎯-정확도-확인">🎯 정확도 확인</h3>
<ul>
<li>정확도는 95.56%</li>
</ul>
<hr>
<blockquote>
<h2 id="워드-클라우드">워드 클라우드</h2>
</blockquote>
<ul>
<li>KoNLP 
한국어 형태소 분석 패키지
CRAN에서 제외되어 수동 설치 </li>
<li>wordcloud 패키지
워드클라드를 그려주는 패키지</li>
<li>설치시 마다 매우 많은 시행 착오.</li>
<li>2024년에는 서버실 학생들이 cslab 서버에 설치함.</li>
</ul>
<blockquote>
<h2 id="konlp-설치">KoNLP 설치</h2>
<p>출처: <a href="https://e-datanews.tistory.com/155">https://e-datanews.tistory.com/155</a></p>
<h3 id="jdk-설치">jdk 설치</h3>
<p>install.packages(&quot;multilinguer&quot;)
library(multilinguer)
install_jdk()</p>
<h3 id="konlp-설치-1">KoNLP 설치</h3>
<p>install.packages(&quot;remotes&quot;)
remotes::install_github(&quot;haven-jeon/KoNLP&quot;,  force = T, upgrade = &quot;never&quot;, 
                         INSTALL_opts = c(&quot;--no-multiarch&quot;))                  </p>
<h3 id="샘플-코드">샘플 코드</h3>
<p>library(KoNLP)
extractNoun(&quot;KoNLP 설치 정말 어렵네요!&quot;)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[소프트웨어공학_14]]></title>
            <link>https://velog.io/@mi_nini/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EA%B3%B5%ED%95%9914</link>
            <guid>https://velog.io/@mi_nini/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EA%B3%B5%ED%95%9914</guid>
            <pubDate>Wed, 04 Dec 2024 05:12:04 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h1 id="📌cmqa">📌CM/QA</h1>
</blockquote>
<h2 id="cm-configuration-management">CM Configuration Management</h2>
<ul>
<li>정의 및 목적</li>
<li>핵심 활동</li>
<li>변경 관리 프로세스</li>
<li>버전관리와 릴리스<h2 id="qa-quality-assurance">QA Quality Assurance</h2>
</li>
<li>정의 및 목적</li>
<li>핵심 활동<h2 id="rtm---requirement-traceability-matrix">RTM - Requirement Traceability Matrix</h2>
</li>
</ul>
<hr>
<h1 id="📌-cm---정의-및-목적">📌 CM - 정의 및 목적</h1>
<ul>
<li>CM의 정의
소프트웨어 시스템의 모든 구성요소를 체계적으로 정의하고, 관리하고, 변경을 기록항, 개발과정의 일관성을 보장하는 활동</li>
<li>CM의 목적
변경 사항 추적
재현 가능성 유지
효율적인 협업 환경 조성</li>
</ul>
<hr>
<h2 id="📌-cm---핵심-활동">📌 CM - 핵심 활동</h2>
<ul>
<li><p>식별(Idenification)
모든 산출물(코드, 문서, 요구사항 등)고유하게 식별
식별 체계 예 : 버전 번호 체계 (1.0.0, 1.1.0 등)</p>
</li>
<li><p>통제(Control)
변경 요청을 관리하고 승인된 변경만 반영
변경 요청 프로세스</p>
<blockquote>
<h4 id="span-stylecolorindianred변경-요청-생성---영향-분석---승인거부---적용span"><span style="color:indianred">변경 요청 생성 -&gt; 영향 분석 -&gt; 승인/거부 -&gt; 적용</span></h4>
</blockquote>
</li>
<li><p>상태기록(Status Accounting)
모든 구성요소의 현재 상태를 기록하고 유지
예 : &quot;모듈 A는 1.2 버전이며, 테스트 상태 완료</p>
</li>
<li><p>검증(Auditing)
CM 프로세스가 올바르게 실행되었는지 확인
예 : 특정 구성요소가 올바른 버전으로 배포되었는지 검증</p>
</li>
</ul>
<hr>
<blockquote>
<h2 id="cm---변경관리-프로세스">CM - 변경관리 프로세스</h2>
</blockquote>
<ul>
<li>변경 요청 생성단계
모든 변경 요청은 기록으로 관리
문서화 내용 : 변경의 이유, 영향, 대안, 예상 결과</li>
<li>변경 승인 단계
변경관리위원회(Change Control Board)와 같은 검토 단위 구성</li>
<li>적용 및 검증 단계
변경 후 반드시 검증 테스트를 수행</li>
</ul>
<blockquote>
<h2 id="cm---버전관리와-릴리스">CM - 버전관리와 릴리스</h2>
</blockquote>
<h3 id="--버전-관리의-기본-원칙">- 버전 관리의 기본 원칙</h3>
<p>버전 번호 체계</p>
<ul>
<li>메이저(주요 변경), 마이너(기능 추가), 패치(버그 수정)의 구분<ul>
<li>분리된 환경 유지</li>
</ul>
</li>
<li>개발 환겨, 테스트 환경, 운영 환경 분리<ul>
<li>롤백 전략</li>
</ul>
</li>
<li>&quot;이전 상태로 되돌릴 수 있는 시스템&quot; 설계해야함</li>
</ul>
<h3 id="--릴리스-관리">- 릴리스 관리</h3>
<ul>
<li>릴리스 계획 수립<ul>
<li>주요 기능, 품질 목표, 일정에 따른 릴리스 로드맵 작성</li>
</ul>
</li>
<li>변경 사항 요약<ul>
<li>모든 릴리스마ㅏ 변경 사항과 새로운 위혐 요소 문서화</li>
</ul>
</li>
</ul>
<hr>
<h1 id="📌-qa---정의-및-목적">📌 QA - 정의 및 목적</h1>
<ul>
<li>정의
품질을 보장하기 위한 계획적이고 체계적인 활동</li>
<li>목적
결함 없는 소프트웨어를 제공하며, 고객의 요구를 충족시키는 것</li>
</ul>
<blockquote>
<h2 id="📌-qa---핵심-활동">📌 QA - 핵심 활동</h2>
</blockquote>
<ul>
<li>프로젝트 정의 및 개선
개발 표준, 코드 리뷰 규칙, 테스트 전략 정의</li>
<li>예방 줌심 활동
테스트 설계와 요구사항 문석으로 초기 결함 예방</li>
<li>품질 매트릭스 관리
결함 밀도, 테스트 커버리지, 평균 수명 시간 측정</li>
</ul>
<hr>
<h2 id="💻-핵심-활동-사례---테스트전략-설계">💻 핵심 활동 사례 - 테스트전략 설계</h2>
<ul>
<li>테스트 계획 작성
무엇을 테스트할 것인가? (테스트 대상 정의)
테스트 범위 : 기능 테스트, 비기능 테스트(성능, 보안 등)
우선순위 결정 : 위험도에 따라 테스트 순위 지정</li>
<li>테스트 실행 기준
테스트 시작/종료 기준 <ul>
<li>시작 : 개발 80% 이상 완료, 테스트 환경 준비 완료 상태</li>
<li>종료 : 주요 결함 수정 완료, 요구사항 충족률 95% 이상 상태<h2 id="테스트케이스-설계">테스트케이스 설계</h2>
</li>
<li>테스트 시나리오
사용자의 실제 동작을 기반으로 설계
예 : 사용자가 로그인 후, 비밀번호를 변경할 떄의 모든 경로 테스트</li>
</ul>
</li>
<li>경계값 분석
입려값의 최속밧, 최대값, 중간값 테스트
예 : 입력 필드에 &quot;최대 100자 허용&quot; 이면 99, 100, 101자를 테스트</li>
</ul>
<h2 id="qa평가-및-보고">QA평가 및 보고</h2>
<ul>
<li>결함 보고서 작성
결함 설명, 재현 절차, 기대 결과, 실제 결과</li>
<li>품질 목표와 성과 평가
목표 : 결함 밀도 &gt;= 0.5개/1000라인, 테스트 커버리지 &gt;= 90%</li>
</ul>
<hr>
<h1 id="📌-qa--cm과-qa의-관계">📌 QA – CM과 QA의 관계</h1>
<h3 id="cm과-qa의-관계">CM과 QA의 관계</h3>
<ul>
<li><strong>변경 사항이 품질에 미치는 영향 추적</strong><ul>
<li>QA 활동에서 발견된 결함 → CM 기록에 반영</li>
</ul>
</li>
<li><strong>CM과 QA의 협력</strong><ul>
<li>QA는 변경 요청 단계에서 잠재적 품질 문제를 검토</li>
</ul>
</li>
</ul>
<h3 id="품질-보장을-위한-통합된-프로세스">품질 보장을 위한 통합된 프로세스</h3>
<ul>
<li><strong>변경 요청 → 영향 분석(QA 참여) → 구현 및 검증</strong></li>
<li>CM과 QA 협력</li>
</ul>
<hr>
<h1 id="📌-rtm--requirement-traceability-matrix">📌 RTM – Requirement Traceability Matrix</h1>
<h2 id="정의">정의</h2>
<ul>
<li>고객 요구사항부터 설계, 개발, 테스트에 이르기까지 추적 가능한 매트릭스를 구축<br>→ 프로젝트의 품질 보증과 요구사항 충족을 보장하는 핵심 활동</li>
<li>RTM은 SDLC 각 단계에서 요구사항이 제대로 반영되고 테스트되었는지 확인할 수 있는 기능 제공</li>
</ul>
<blockquote>
<h2 id="rtm--구성-요소">RTM – 구성 요소</h2>
</blockquote>
<ul>
<li><strong>요구사항 ID</strong>: 요구사항을 고유하게 식별하는 ID</li>
<li><strong>고객 요구사항</strong>: 고객이 요청한 주요 기능 또는 성능 목표</li>
<li><strong>기능적 요구사항</strong>: 고객 요구 구현 위한 시스템 요구사항</li>
<li><strong>설계 요소</strong>: 요구사항을 반영한 설계 단계의 산출물</li>
<li><strong>테스트 케이스 ID</strong>: 요구사항 검증하는 테스트 케이스 식별자</li>
<li><strong>상태(Status)</strong>: 요구사항 충족 여부</li>
</ul>
<h1 id="💻--rtm--예시">💻  RTM – 예시</h1>
<table>
<thead>
<tr>
<th>사항 ID</th>
<th>고객 요구사항</th>
<th>기능적 요구사항</th>
<th>설계 요소</th>
<th>테스트 케이스 ID</th>
<th>상태</th>
</tr>
</thead>
<tbody><tr>
<td>RQ-01</td>
<td>사용자는 로그인할 수 있어야 한다</td>
<td>사용자는 이메일과 비밀번호로 로그인</td>
<td>login_page.html, auth.js</td>
<td>TC-01, TC-02</td>
<td>충족됨</td>
</tr>
<tr>
<td>RQ-02</td>
<td>사용자는 비밀번호를 재설정할 수 있어야 한다</td>
<td>비밀번호 재설정을 위한 이메일 링크 제공</td>
<td>password_reset.html, reset.js</td>
<td>TC-03</td>
<td>충족됨</td>
</tr>
<tr>
<td>RQ-03</td>
<td>시스템은 2초 이내에 검색 결과를 반환해야 한다</td>
<td>검색 기능 최적화</td>
<td>search_algorithm.py</td>
<td>TC-04</td>
<td>충족되지 않음</td>
</tr>
<tr>
<td>RQ-04</td>
<td>관리자는 사용자 데이터를 내보낼 수 있어야 한다</td>
<td>사용자 데이터를 CSV로 내보내기</td>
<td>admin_export.html, export.js</td>
<td>TC-05, TC-06</td>
<td>테스트 중</td>
</tr>
</tbody></table>
<blockquote>
<p>Sofrware Quality -&gt; 얼마나 요구사항을 충족 시켰나?</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴퓨터네트워크_정리1]]></title>
            <link>https://velog.io/@mi_nini/%EC%BB%B4%ED%93%A8%ED%84%B0%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%EC%A0%95%EB%A6%AC1</link>
            <guid>https://velog.io/@mi_nini/%EC%BB%B4%ED%93%A8%ED%84%B0%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%EC%A0%95%EB%A6%AC1</guid>
            <pubDate>Mon, 02 Dec 2024 07:05:40 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="🎯-체크섬계산하는법-한번-더-확인과제-진행">🎯 체크섬(계산하는법) 한번 더 확인(과제 진행)</h2>
</blockquote>
<hr>
<h1 id="📌-ip프로토콜">📌 IP프로토콜</h1>
<blockquote>
<ul>
<li>IP 프로토콜의 주요 특징
비연결형 서비스를 제공
패킷을 분할/병합하는 기능을 수행
데이터 체크섬은 제공하지 않고, 헤더 체크섬만 제공
Best Effort 원칙에 따른 전송 기능을 제공</li>
</ul>
</blockquote>
<blockquote>
<h2 id="📌-ip-헤더-구조">📌 IP 헤더 구조</h2>
</blockquote>
<ul>
<li>IP 프로토콜에서 정의된 패킷의 IP 헤더의 구조(상단의 숫자는 비트 수)
<img src="https://velog.velcdn.com/images/mi_nini/post/c509ff96-ffa7-47ea-b75a-c90578dd11d0/image.png" alt=""></li>
</ul>
<hr>
<blockquote>
<h2 id="dsecn">DS/ECN</h2>
<p>DS와 ECN 필드가 도입되기 전에는 8비트의 Service Type(DS+ECN) 필드로 정의되어 우선순위, 지연, 전송률, 신뢰성 등의 값을 지정할 수 있었음
Service Type 필드는 IP 프로토콜이 사용자에게 제공하는 서비스의 품질에 관련된 내용을 표현
각 비트 값의 의미는 [표 7-4]와 같음
<img src="https://velog.velcdn.com/images/mi_nini/post/7d2c2144-90fd-4ca0-8243-eaf8b7a5c4f9/image.png" alt=""></p>
</blockquote>
<hr>
<p>혼잡 제어를 위한 ECN 필드 값의 의미는 [표 7-5]와 같음</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/b20b87dd-824f-4432-945b-2e27071737af/image.png" alt="">
DS 코드포인트라고도 하는 DS 필드 값은 차등 서비스의 기준이 되는 레이블 값으로 64개의 트래픽 클래스를 정의
DS 서비스는 비교적 단순한 원리에 의하여 차등화된 서비스를 제공하지만 내부적인 처리 과정은 복잡한 구조에 의하여 이루어짐</p>
</blockquote>
<hr>
<h2 id="📌-패킷-분할">📌 패킷 분할</h2>
<p>IP 프로토콜은 상위 계층에서 내려온 전송 데이터가 패킷 하나로 전송하기에 너무 크면 분할해 전송하는 기능을 제공</p>
<ul>
<li>패킷 분할과 관련된 필드</li>
</ul>
<ol>
<li>Identification(식별자 혹은 구분자)</li>
<li>DF(Don’t Fragment)</li>
<li>MF(More Fragment)</li>
<li>Fragment Offset(분할 옵셋)</li>
</ol>
<blockquote>
<h3 id="span-stylecolorindianred1-dentification식별자-혹은-구분자--span--ip-헤더의-두-번째-워드에는-패킷-분할과-관련된-정보가-포함"><span style="color:indianred">1. dentification(식별자 혹은 구분자) : </span>  IP 헤더의 두 번째 워드에는 패킷 분할과 관련된 정보가 포함</h3>
<p>이 중 Identification 필드는 송신 호스트가 지정하는 패킷 구분자 기능을 수행
IP 프로토콜이 분할한 패킷들에 동일한 고유 번호를 부여함으로써, 수신 호스트가 Identification 번호가 같은 패킷을 다시 병합(Reassembly)할 수 있도록 해 줌
패킷을 분할하지 않으면 패킷을 전송할 때마다 이 필드의 값은 하나씩 증가</p>
</blockquote>
<blockquote>
<h3 id="span-stylecolorindianred2-dfdont-fragment--span-패킷이-분할되지-않도록-한다"><span style="color:indianred">2. DF(Don’t Fragment) : </span> 패킷이 분할되지 않도록 한다.</h3>
<p>즉, 값을 1로 지정하면 패킷 분할을 막을 수 있음
수신 호스트가 분할되어 입력된 패킷들을 병합하는 기능이 없을 때 사용
따라서 중간 경우 네트워크에서는 자신이 처리 가능한 패킷의 크기보다 큰 IP 패킷에 DF 필드가 설정되어 있으면 분할 기능을 수행하지 않고 패킷을 버림</p>
</blockquote>
<blockquote>
<h3 id="span-stylecolorindianred3-mfmore-fragment--span-분할된-패킷을-전송할-때는-여러-개의-분할-패킷이-연속해서-전송되므로-mf-필드-값을-1로-지정하여-분할-패킷이-뒤에-계속됨을-표시해주어야-한다"><span style="color:indianred">3. MF(More Fragment) : </span> 분할된 패킷을 전송할 때는 여러 개의 분할 패킷이 연속해서 전송되므로 MF 필드 값을 1로 지정하여, 분할 패킷이 뒤에 계속됨을 표시해주어야 한다.</h3>
<p>분할 패킷 중 마지막 패킷은 MF 비트를 0으로 지정하여 분할 패킷이 더 없음을 표시한다.</p>
</blockquote>
<blockquote>
<h3 id="span-stylecolorindianred4-fragment-offset분할-옵셋--span패킷-분할이-이루어지면-12비트의-fragment-offset-필드를-사용한다"><span style="color:indianred">4. Fragment Offset(분할 옵셋) : </span>패킷 분할이 이루어지면 12비트의 Fragment Offset 필드를 사용한다.</h3>
<p>저장되는 값은 분할된 패킷의 내용이 원래의 분할 전 데이터에서 위치하는 상대 주소 값이다.
값은 8비트의 배수이므로, Fragment Offset 값이 64라면 원래 데이터에서 64 × 8 = 512번째에 위치한다.</p>
</blockquote>
<hr>
<h2 id="📌-주소-관련-필드">📌 주소 관련 필드</h2>
<ul>
<li><p>Source Address는 송신 호스트의 IP 주소</p>
</li>
<li><p>Destination Address는 수신 호스트의 IP 주소</p>
</li>
<li><p>IP 주소 체계는 [그림 7-13]과 같이 크게 다섯 종류
<img src="https://velog.velcdn.com/images/mi_nini/post/e1687bb7-b654-4289-868a-5286531881ea/image.png" alt=""></p>
</li>
<li><p>클래스 A, B, C는 유니캐스팅에서 이용하고, 클래스 D는 멀티캐스팅에서 이용</p>
</li>
<li><p>클래스 E는 향후 새로운 응용 환경을 위하여 잠정적으로 예약된 클래스</p>
</li>
<li><p>클래스 A, B, C는 주소를 network와 host 필드로 구분해 관리함으로써, 클래스별로 네트워크 크기에 따라 주소 관리를 다르게 함</p>
<hr>
<p>[표 7-6]과 같은 IP 주소 값의 정보만으로 이 주소가 속한 클래스를 알 수 있음
<img src="https://velog.velcdn.com/images/mi_nini/post/0564b419-71d1-4e46-8ed8-b2859a528a58/image.png" alt=""></p>
</li>
</ul>
<blockquote>
<ul>
<li>network(네트워크): 네트워크 주소
전 세계적으로 유일한 번호가 모든 컴퓨터 네트워크에 할당
현재 이 주소의 할당은 NIC(Network Information Center)에서 담당</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>host(호스트): 네트워크 주소가 결정되면 하위의 호스트 주소를 의미하는 host 비트 값을 개별 네트워크의 관리자가 할당
클래스 A는 host 비트의 크기가 크기 때문에 규모가 큰 네트워크에서 사용하고, 클래스 C는 규모가 작은 네트워크에서 사용함</li>
</ul>
</blockquote>
<hr>
<h2 id="📌-기타-필드">📌 기타 필드</h2>
<ul>
<li>IP 프로토콜에서는 다음과 같은 다양한 필드를 정의<ul>
<li>Version Number(버전 번호), Header Length(헤더 길이), Packet Length(패킷 길이)</li>
<li>Time To Live(생존 시간), Transport(전송 프로토콜), Header Checksum(헤더 체크섬), Options(옵션), P adding(패딩)</li>
</ul>
</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/4cc7b512-8ae0-4e4b-bb10-6a6334f3f683/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/c10393aa-f68b-4465-8627-c1c002cb335f/image.png" alt=""></th>
</tr>
</thead>
</table>
<blockquote>
<h3 id="span-stylecolorindianredversion-number버전-번호--span"><span style="color:indianred">Version Number(버전 번호) : </span></h3>
<p>현재 인터넷 환경에서 사용하는 IP 프로토콜은 버전 4
IP 프로토콜의 새로운 버전인 IPv6과 구분하기 위해 기존 IP 프로토콜을 IPv4로 표현</p>
</blockquote>
<blockquote>
<h3 id="span-stylecolorindianredheader-length헤더-길이--span"><span style="color:indianred">Header Length(헤더 길이) : </span></h3>
<p>IP 프로토콜의 헤더 길이를 32비트 워드 단위로 표시
일반 패킷을 전송하는 경우에 헤더의 Options, Padding 필드가 빠지므로 IP 헤더의 최소 크기는 5</p>
</blockquote>
<blockquote>
<h3 id="span-stylecolorindianredpacket-length패킷-길이--span"><span style="color:indianred">Packet Length(패킷 길이) : </span></h3>
<p>IP 헤더를 포함하여 패킷의 전체 길이
필드의 크기가 16비트이므로 IP 프로토콜에서 지원하는 패킷의 최대 크기는 바이트
그러나 이는 이상적인 최댓값으로, IP 프로토콜에서 65,535바이트의 IP 패킷을 전송해도 대부분 데이터 링크 계층에서 분할해 전송
따라서 실제 환경에서 IP 프로토콜은 IP 패킷을 더 작은 단위로 만든다.
IP 패킷의 크기는 일반적으로 8,192바이트를 넘지 않는다.</p>
</blockquote>
<blockquote>
<h3 id="span-stylecolorindianredtime-to-live생존-기간--span"><span style="color:indianred">Time To Live(생존 기간) : </span></h3>
<p>패킷 전송 과정에서 패킷이 올바른 목적지를 찾지 못하면 수신 호스트에 제대로 도착하지 않고, 네트워크 내부에서 떠돈다.
이런 현상을 방지하려고 Time To Live 필드를 사용한다.
송신 호스트가 패킷을 전송하기 전에 네트워크에서 생존할 수 있는 시간을 지정하고, 각 라우터에서는 패킷이 지나갈 때마다 이 필드 값을 감소시키면서 패킷을 중개한다.
임의의 라우터에서 Time To Live 값이 0으로 감소하면 패킷은 자동으로 버려지고, 패킷 송신 호스트에 ICMP 오류 메시지가 전달된다.</p>
</blockquote>
<blockquote>
<h3 id="span-stylecolorindianredtransport전송-프로토콜-span"><span style="color:indianred">Transport(전송 프로토콜) :</span></h3>
<p>[그림 7-14]와 같이 IP 프로토콜에 데이터 전송을 요구한 전송 계층의 프로토콜을 가리킨다.
전송 계층의 TCP 세그먼트와 UDP 데이터그램, 네트워크 계층의 ICMP 패킷은 모두 IP 패킷의 데이터를 의미하는 페이로드(Payload) 부분에 캡슐화되어 전송된다.
왼쪽의 숫자는 Transport 필드 값을 의미하며, TCP는 6, UDP는 17, ICMP는 1의 값이 저장된다.
따라서 패킷 수신자는 페이로드 내부에 어느 프로토콜 정보가 있는지 판단할 수 있다.</p>
</blockquote>
<blockquote>
<h3 id="span-stylecolorindianredhead-checksum헤더-체크섬--span"><span style="color:indianred">Head Checksum(헤더 체크섬) : </span></h3>
<p>전송 과정에서 발생할 수 있는 헤더 오류를 검출하는 기능으로, 데이터 오류는 검출하지 않는다.
이와 달리 계층 4인 TCP, UDP 프로토콜의 헤더는 데이터와 헤더 모두에 대한 체크섬 정보를 제공하기 때문에 IP와 상호 보완적인 오류 검출 기능을 수행한다.</p>
</blockquote>
<blockquote>
<h3 id="span-stylecolorindianredoptions옵션--span"><span style="color:indianred">Options(옵션) : </span></h3>
<p>네트워크 관리나 보안처럼 특수 용도로 이용할 수 있다.</p>
</blockquote>
<blockquote>
<h3 id="span-stylecolorindianredpadding패딩--span"><span style="color:indianred">Padding(패딩) : </span></h3>
<p>IP 헤더의 크기는 32비트 워드의 크기가 배수가 되도록 설계되어 있다.
앞서 설명한 필드의 전체 크기가 이 조건에 맞지 않으면 이 필드를 사용해 조정할 수 있다.</p>
</blockquote>
<hr>
<h1 id="📌-분할의-필요성">📌 분할의 필요성</h1>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/995fa196-65a6-403c-a200-768261f47869/image.png" alt=""></p>
<ul>
<li><p>다양한 유형의 네트워크를 통해 패킷을 중개하려면, IP 프로토콜이 패킷을 각 네트워크에서 처리하기 편한 크기로 분할(Fragmentation)해야 함</p>
</li>
<li><p>상위 계층에서 더 큰 데이터 전송을 요구하면 IP 프로토콜에서 패킷 분할 과정을 먼저 수행해 전송</p>
</li>
<li><p>맨 밑에 위치한 데이터 링크 계층(계층 2) 프로토콜의 프레임은 크기가 프로토콜마다 다름</p>
</li>
<li><p>상위 계층에서 내려온 데이터를 계층 2의 프레임 틀에 담을 수 있도록 IP 프로토콜에서 분할 과정을 거친 후에 전송</p>
</li>
<li><p>수신 호스트에서는 이를 다시 합치는 병합 작업을 수행</p>
</li>
</ul>
<hr>
<blockquote>
<p>[그림 7-16]은 IP 프로토콜의 패킷 분할 과정의 예
<img src="https://velog.velcdn.com/images/mi_nini/post/7eaec34d-7128-4c40-abad-23cac3908d1b/image.png" alt=""></p>
</blockquote>
<ul>
<li><h3 id="ip-헤더를-제외한-전송-데이터의-크기는-380바이트-패킷은-최대-크기가-128바이트-가정">IP 헤더를 제외한 전송 데이터의 크기는 380바이트, 패킷은 최대 크기가 128바이트 가정</h3>
</li>
<li>먼저 8의 배수로 정의된 Fragment Offset 필드를 계산, 이 값에 8을 곱한 크기가 분할 전의 데이터 위치</li>
<li>패킷 전체의 최대 크기인 128바이트에서 헤더인 20바이트를 빼면 108바이트 분할 패킷에 보관할 수 있는 데이터의 최대 크기는 (108을 8로 나눈 몫(정수 값)) x 8=104바이트
분할된 패킷의 개수는 4개(=380을 104로 나눈 몫+1)
각 패킷의 Fragment Offset 필드 값은 0, 13, 26, 39</li>
</ul>
<blockquote>
<p>분할 패킷인 분할 1, 분할 2, 분할 3은 데이터 크기 104바이트에 헤더 크기 20바이트를 더해 124
패킷의 전체 크기 Packet Length=124바이트</p>
</blockquote>
<ul>
<li>마지막 분할 패킷은 전체 데이터의 크기 380에서 3개의 분할 패킷 크기 3 x 104를 빼면 68바이트
이 값에 헤더 크기인 20바이트를 더해 Packet Length = 88바이트</li>
</ul>
<blockquote>
<p>분할한 패킷의 Identification 필드에는 동일한 번호를 부여 그림에서는 임의로 1254번을 가정 MF 필드는 마지막 패킷을 제외하고 1을 지정해 분할 패킷이 이어지고 있음을 표시</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터과학_14_1]]></title>
            <link>https://velog.io/@mi_nini/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99141</link>
            <guid>https://velog.io/@mi_nini/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99141</guid>
            <pubDate>Mon, 02 Dec 2024 05:39:13 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-visualization-ggplot">📌 Visualization-ggplot</h1>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/828a0b96-bd78-4ed4-b3de-7e282cf2a1c1/image.png" alt=""></p>
<h2 id="ggplot2">ggplot2</h2>
<ul>
<li><p>ggplot()함수는 앞에서 설명한 고수준, 저수준 작도를 편리하게 사용할 수 있도록 개발된 패키지</p>
</li>
<li><p>Advantages of ggplot2
consistent underlying grammar of graphics (Wilkinson, 2005)
plot specification at a high level of abstraction
very flexible
theme system for polishing plot appearance
mature and complete graphics system
many users, active mailing list</p>
</li>
</ul>
<blockquote>
<h3 id="가본-syntax">가본 syntax</h3>
<p>library(ggplot2)
ggplot(df, aes(x=x축 데이터, y=y축 데이터)) + geom_함수</p>
</blockquote>
<ul>
<li>In ggplot land aesthetic means &quot;something you can see&quot;.<ul>
<li>geom_함수
geom_bar()
geom_line()
geom_point() 
geom_histogram()
labs()
facet_wrap()</li>
</ul>
</li>
</ul>
<hr>
<h2 id="ex">Ex</h2>
<pre><code class="language-py">data &lt;- read.csv(&quot;../mydata/경기도 화성시_관광통계_20231025.csv&quot;,fileEncoding=&quot;CP949&quot;)

data</code></pre>
<pre><code class="language-py"># ggplot 객체 생성
p &lt;- ggplot(data, aes(x = 번호, y = 공룡알화석산지))

# 점 추가
p &lt;- p + geom_point(fill = &#39;red&#39;, color = &#39;blue&#39;, shape = 21, size = 4)

# 최종 플롯 출력
p + geom_line(color=&#39;blue&#39;, linetype=2)</code></pre>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/f9bc1a05-a959-457a-9804-4c367fe7a11f/image.png" alt=""></p>
<h2 id="📌-막대그래프---빈도수를-높이로">📌 막대그래프- 빈도수를 높이로</h2>
<ul>
<li>aes(변수 1개)
cyl은 숫자변수로 연속형 - factor()로 범주형으로 변환</li>
<li>기본 barplot에서는 table()의 결과가 있었어야 함.</li>
<li>fill은 내부 색상</li>
<li>color는 테두리</li>
<li>width는 막대의 너비</li>
<li>linewidth는 선 두께</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/22ae1939-4709-4a46-83cb-af857d8a06af/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/8f33dbf7-820b-45d3-80a3-4cdd1b8aef18/image.png" alt=""></th>
</tr>
</thead>
</table>
<ul>
<li>fill=범주형:  범주형 자료의 값에 따라 다른 색상 – - - aes 안에서 지정</li>
<li>table(x, y)의 결과 필요 없음.</li>
<li>coord_flip() 좌표축 회전</li>
<li>다른 그래프에서 적용 가능</li>
<li>position=‘dodge’ 사용</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/26c0de2d-7693-4b01-8c25-a1c40575e346/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/1991806c-ed4b-4041-9686-762424902dd7/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/34cc9806-74ec-4677-919e-2393bb8a85e9/image.png" alt=""></th>
</tr>
</thead>
</table>
<pre><code class="language-py">```py
p &lt;- ggplot(mtcars, aes(factor(cyl), fill=factor(gear)))
p + geom_bar()</code></pre>
<pre><code class="language-py">p &lt;- ggplot(mtcars, aes(factor(cyl), fill=factor(gear)))
p &lt;- p + geom_bar()
p + coord_flip()</code></pre>
<pre><code class="language-py">p &lt;- ggplot(mtcars, aes(factor(cyl), fill=factor(gear)))
p &lt;- p + geom_bar(position = &#39;dodge&#39;)
p</code></pre>
<h2 id="📌-막대그래프---평균을-높이로-수직누적-막대그래프--두-그룹별-평균">📌 막대그래프 - 평균을 높이로, 수직누적 막대그래프- 두 그룹별 평균</h2>
<ul>
<li>그룹별 평균을 구할 때 tapply보다는 summaryBy를 이용(데이터프레임 필요)</li>
<li>aes(변수 1개)</li>
<li>막대그래프의 y축은 기본적으로 주어진 변수의 count(빈도수)</li>
<li>예제처럼  cyl에 따른 mpg의 평균을 높이로 지정할 때는 두 변수를 모두 지정하고, 옵션stat=‘identity’ 지정</li>
<li>데이터 mtcars에서 두 변수 cyl과 gear의 각 그룹별 평균 구하기</li>
<li>geom_bar()</li>
<li>stat=‘identity’ 옵션 사용</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/f940b578-771a-4ed6-965b-8e74b9d95d94/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/86c17dc5-ee8b-40a2-b646-c289909cc9b8/image.png" alt=""></th>
</tr>
</thead>
</table>
<pre><code class="language-py">library(doBy)
tbl &lt;- summaryBy(mpg ~ cyl, data=mtcars, FUN=mean)
tbl

p &lt;- ggplot(tbl, aes(factor(cyl), mpg.mean))
p + geom_bar(stat=&#39;identity&#39;, fill=&#39;gold&#39;, color=&#39;red&#39;)</code></pre>
<pre><code class="language-py">library(doBy)
tbl &lt;- summaryBy(mpg ~ cyl+gear, data=mtcars, FUN=mean)
tbl

p &lt;- ggplot(tbl, aes(factor(cyl), mpg.mean, fill=factor(gear)))
p + geom_bar(stat=&#39;identity&#39;)</code></pre>
<h2 id="수평누적-막대그래프">수평누적 막대그래프</h2>
<p>-데이터 mtcars에서 두 변수 cyl과 gear의 각 그룹별 평균 구하기</p>
<ul>
<li>geom_col() 사용</li>
<li>position=‘dodge’ 옵션 사용</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/b51b2bd9-bfea-4375-a6d5-9a18b83528ce/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/8b88640d-6551-4563-a449-2adb828c8ed3/image.png" alt=""></th>
</tr>
</thead>
</table>
<h1 id="📌-시계열-그래프_-geom_line">📌 시계열 그래프_ geom_line()</h1>
<h2 id="꺽은선-그래프--no-옵션">꺽은선 그래프 – no 옵션</h2>
<ul>
<li>aes(x, y) 순서로</li>
<li>geom_line(): 선추가</li>
<li>geom_point(): 점추가</li>
<li>color는 색상</li>
<li>shape: 점모양</li>
<li>size: 점 크기</li>
<li>linetype: 선모양</li>
<li>linewidth:선 굵기</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/602c5d2c-e6c3-4a42-95b2-4f3230ac6e20/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/523d81d5-6f2f-4977-be1d-ac5fb826bf07/image.png" alt=""></th>
</tr>
</thead>
</table>
<blockquote>
<h2 id="점모양">점모양</h2>
<p>shape = 번호 (plot에서는 pch)
<img src="https://velog.velcdn.com/images/mi_nini/post/02ede2e6-c450-4ae7-9e6f-e709610d2d05/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>선 모양: plot에서는 lty, ggplot에서는 linetype</p>
</blockquote>
<blockquote>
<table>
<thead>
<tr>
<th>인 수</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><code>linetype=0</code></td>
<td>투명선</td>
</tr>
<tr>
<td><code>linetype=1</code></td>
<td>실선</td>
</tr>
<tr>
<td><code>linetype=2</code></td>
<td>대시선</td>
</tr>
<tr>
<td><code>linetype=3</code></td>
<td>점선</td>
</tr>
<tr>
<td><code>linetype=4</code></td>
<td>점선과 대시선</td>
</tr>
<tr>
<td><code>linetype=5</code></td>
<td>긴 대시선</td>
</tr>
<tr>
<td><code>linetype=6</code></td>
<td>2개의 대시선</td>
</tr>
</tbody></table>
</blockquote>
<h1 id="💻-ex_여러-그래프를-한-화면에">💻 Ex_여러 그래프를 한 화면에</h1>
<pre><code class="language-py"># 데이터준비
library(dplyr)

data &lt;- read.csv(&quot;../mydata/도로교통공단_시군구별 월별 교통사고 통계_20231231.csv&quot;,
                 fileEncoding=&quot;CP949&quot;)

chungju &lt;- filter(data, 시군구==&quot;충주시&quot;)
cheongju &lt;- filter(data, 시군구==&quot;청주시&quot;)
jecheon &lt;- filter(data, 시군구==&quot;제천시&quot;)

chungju</code></pre>
<pre><code class="language-py">p &lt;- ggplot()
p &lt;- p + geom_line(data= chungju, aes(발생월, 사고건수), color=&#39;red&#39;) + 
    geom_point(data=chungju, aes(발생월, 사고건수), color=&#39;red&#39;)
p</code></pre>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/bc27ea0f-8698-4323-98ad-988722a8df8d/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/585baa60-975b-43ac-8e38-f7ef69836164/image.png" alt=""></th>
</tr>
</thead>
</table>
<h1 id="💻-ex_그룹-변수로-그래프-나누어-그리기">💻 EX_그룹 변수로 그래프 나누어 그리기</h1>
<pre><code class="language-py"># 데이터 준비
library(dplyr)

cb &lt;- data %&gt;%
    filter(시도==&#39;충북&#39;) %&gt;%
    filter(grepl(&#39;시$&#39;, 시군구)) %&gt;%
    select(발생월, 시군구, 사고건수)

head(cb)

table(cb$`시군구`)</code></pre>
<pre><code class="language-py"># 1번쨰 그림
library(dplyr)

cb &lt;- data %&gt;%
    filter(시도==&#39;충북&#39;) %&gt;%
    filter(grepl(&#39;시$&#39;, 시군구)) %&gt;%
    select(발생월, 시군구, 사고건수)

head(cb)

table(cb$`시군구`)

p &lt;- ggplot(cb, aes(발생월, 사고건수,
    color=시군구, shape=시군구, linetype=시군구))
p + geom_point() + geom_line()</code></pre>
<pre><code class="language-py"># 2번째 그림
gang &lt;- data %&gt;%
    filter(시도==&#39;서울&#39;) %&gt;%
    filter(grepl(&#39;^강&#39;, 시군구)) %&gt;%
    select(발생월, 시군구, 사고건수)

head(cb)
p &lt;- ggplot(gang, aes(발생월, 사고건수,
    color=시군구, shape=시군구, linetype=시군구))
p + geom_point() + geom_line()</code></pre>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/236e5855-5351-4ecc-82b1-ee9cbb73adc8/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/b8d5fd4b-9174-47ff-989c-21492c9122de/image.png" alt=""></th>
</tr>
</thead>
</table>
<h1 id="📌-산점도-그리기--geom_point">📌 산점도 그리기- geom_point()</h1>
<h2 id="데이터-mtcars--기본-작도">데이터 mtcars- 기본 작도</h2>
<ul>
<li>wt는 차의 무게</li>
<li>mpg는 연비</li>
<li>cyl는 실린더의 개수(연속형을 범주형으로 변환)</li>
<li>pch는 점의 모양</li>
<li>cex는 점의 크기</li>
<li>ggplot()으로 그림 준비</li>
<li>geom_point()로 점 그리기</li>
<li>color: 색상</li>
<li>size: 크기</li>
<li>shape: 점의 모양</li>
<li>변수의 값에 따라 지정하려면 aes() 안에</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/7c9823da-414a-45ad-949a-c4a9259ded44/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/e51f86f1-59ea-49d8-b0b5-d41a0d43088e/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/34229631-721d-45e5-a145-dec721b5636f/image.png" alt=""></th>
</tr>
</thead>
</table>
]]></description>
        </item>
        <item>
            <title><![CDATA[2024_국민체육진흥공단 공공데이터_3]]></title>
            <link>https://velog.io/@mi_nini/2024%EA%B5%AD%EB%AF%BC%EC%B2%B4%EC%9C%A1%EC%A7%84%ED%9D%A5%EA%B3%B5%EB%8B%A8-%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B03</link>
            <guid>https://velog.io/@mi_nini/2024%EA%B5%AD%EB%AF%BC%EC%B2%B4%EC%9C%A1%EC%A7%84%ED%9D%A5%EA%B3%B5%EB%8B%A8-%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B03</guid>
            <pubDate>Sat, 30 Nov 2024 11:14:03 GMT</pubDate>
            <description><![CDATA[<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/7d5b2e19-2ca4-4095-8971-d42d47dc57a6/image.jpg" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/5e94e1a6-e1fd-4dd6-86ce-a48c4d070bbd/image.jpg" alt=""></th>
</tr>
</thead>
</table>
<h1 id="📌-회의">📌 회의</h1>
<p>우리는 항상 화요일 4:30분부터 6:30분까지 학교 도서관에 있는 PBL룸을 빌려 회의를 진행했다. (HDMI케이블이 있어서 노트북과 연결해서 진행사항을 함께 보기도 수훨했고 칠판과 펜도 있어서 서로의 의견을 눈으로 직접 보기에도 좋았다) 우리는 한번 갈아 엎었고 .. 기본 index 페이지에서도 각자 맡아서 해온 결과물이 생각보다 좋지 않아서 어제인 11/29 한 결과까지만 하고 포기하기로했다. (시험기간에 다른 전공 프로젝트에 팀원들이 바쁘다고 하여.. 결정된것) 시작할 당시에는 약 1달하고 10일정도에 기간이 있어서 넉넉하게 잡고 천천히 준비했던거 같은데.. 정말 안타까운 마음밖에 없다. 혼자 했던 코드들을 들고 내가 한다고 해도 제출기간안에 끝낼 수 있다는 자신도 없어...포기를 했다. 정말 ...눈물이 나네</p>
<hr>
<h2 id="📌-실패요인-나의-생각">📌 실패요인 (나의 생각)</h2>
<ol>
<li><p>우리는 각자 해올일을 분담해서 섹션별로 개발을 진행하고 오류또는 디자인에 만족감을 얻을 때 까지 고치고 다시 고치고 반복하다 보니 처음에 생각했던 디자인과 후에 만들어진 결과가 너무 다른점이였다. 시간이 많았을 당시 이것도 해보고 저것도 해보고 마음에 안드니 다시하고를 반복하다보니 정확한 뼈대를 잡지 못하고 개발부터 들어가게 된것이 문제라고 생각한다.</p>
</li>
<li><p>서로의 일정이 바빠 만나기 힘들다는점이다. 우리는 같은학교에 같은학년으로 수업을 듣고있지만 전공수업이 겹치는건 1개뿐이고 나머지 방과후 시간은 각자 할일이 있어 만나는것에 있어서 자유롭지 못했다. 또한 주말동안 본가를 자주 가게되어 이곳에 집중하지 않고 바쁜 팀원 + 학생회 활동과 잡힌 약속이 있어 급하게 프로젝트를 끝내보려고 밤을 새워서 한 나의 잘못이다. 이것저것 파일정리도 안하고 진행하다보니까 오류를 잡았던 코드들도 어딘가에 사라져있었고 주석처리나 코드를 분류를 안하고 하다보니 눈도 아플지경이였다. 매우 아쉽다... 아쉬워</p>
</li>
<li><p>공유를 하지 않는점과 개인의 능력차가 컸다고 생각한다. 한사람이 자신이 맡은바를 다해오고 오면 다른 사람은 우리가 회의때 생각한 디자인과 다르게해서 다시 그쪽을 봐주고 또 하다보니 그사람과 생각이 달라서 서로 다른 결과물을 만들다 보니 어질어질했다. 깃허브에 서로 관리를 했더라면 좀더 나았을까 싶다.. (팀원에 실력차이는 당연히 있고 그점은 잘못되었다고 생각하지 않는다.)</p>
</li>
<li><p>마음가짐이다. 이 공모전을 시작하자고 했을때 모두는 공모전에 참여하여 이것저것 배우고 함께 하나의 프로젝트를 만들다보니 좋은 결과물이 나왔으면 좋겠다라고 생각했다. 하지만 공모전에 참여만으로는 나는 원하지 않았다. 열심히 한만큼, 하면서 배운만큼에 노력이 증명되는 것을 원했다. (입상하는것) 팀원들은 공모전에 참가에 의의를 뒀지만 결국에 결과물에 쫓겨서 하다보니 서로가 배운점이 없었다고 얘기한것이 매우 아쉬었다. 마음가짐을 좀만 달리해서 더 노력하고 핸드폰, 술먹는 시간을 줄였다면 더 나은 지금이 되었을텐데 말이다. </p>
</li>
</ol>
<h2 id="📌-배운점">📌 배운점</h2>
<ol>
<li>DB를 mysqlworkbench만 사용한 경험이 있엇다. 컴퓨터로컬에서 작업을 주로 하다보니 밖에 나가 함께 프로젝트에 진행도를 보여줄때 원격으로 집에있는 컴퓨터와 연결해 보여주곤했다. 이번에 아마존 RDS를 사용해서 내가 사용한 mysql과 버전을 맞춰 생성한 엔드포인트를 DBeaver 연결시켜서 사용했다. 그래서 나의 servername네임 값과 비밀번호를 안다면 누구나 바로 사용이 가능하다는점에서 아주아주...편리한 지식을 하나 쌓았다. <img src="https://velog.velcdn.com/images/mi_nini/post/6a07bd41-8ba4-4443-b76e-956cdb592180/image.png" alt=""></li>
</ol>
<blockquote>
<p><a href="https://leeborn.tistory.com/entry/AWS-AWS-RDS-%EC%83%9D%EC%84%B1-%EB%B0%8F-DBeaver%EB%A1%9C-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0">연결 참고자료 </a>
<img src="https://velog.velcdn.com/images/mi_nini/post/699b1931-7c16-41f4-a044-4b21624d3ca4/image.png" alt=""></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/f484ee6b-a738-4194-b68f-1b8038e7cec2/image.png" alt=""></p>
<ol start="2">
<li>나는 <a href="https://www.netlify.com/%EB%A5%BC">https://www.netlify.com/를</a> 이용해서 내 도메인을 관리하고 설정했었다. 하지만 netlify는 php를 지원하지 않아.. (다른 언어 쓸껄... 다음에는 다른걸로 해야지) 아마존에 있는 Elastic Beanstalk를 사용해서 배포하기로 했다. 프리티어로 설정하는 부분에서 여러가지도 사용해보고 아마존에 많이 지원해주는 기능이 많아서 아마존을 자주 사용하면 좋을거 같다. <blockquote>
<p>참고자료 : <a href="https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/GettingStarted.html">https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/GettingStarted.html</a></p>
</blockquote>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/4a277a2d-f5dc-435c-9e7d-108ac41be203/image.png" alt=""></p>
<ol start="3">
<li>공공데이터를 이용하는데에 좀더 익숙해지는거같다. csv파일을 받아서 나의 입맛대로 바꾸는점이 나에게 흥미를 불러오고 이부분에서 더 집중하고 재밌게 한거같았다. 여러 페이지들도 보고 여러시도도 해볼 수 있다는 점이 그래도 공모전을 준비하면서 좋은점도 있다고 생각이 드는 부분이다.<blockquote>
<p><a href="https://alvarotrigo.com/fullPage/ko/#page3">Fullpagejs</a> 
<a href="https://teddylee777.github.io/python/chatgpt-python-api/">챗봇</a>
<a href="https://flask-docs-kr.readthedocs.io/ko/latest/">플라스크</a>
<a href="https://docs.djangoproject.com/ko/5.1/">장고</a></p>
</blockquote>
</li>
</ol>
<hr>
<h1 id="-다른이야기">+ 다른이야기</h1>
<p>저번에 교통대학교에서 지원해준 adsp자격증 합격을 했다.. 운좋게도.. 강의 하루보고 2일정도 기출문제만 돌리고 개념외우고 한거같은데 운이 좋았던거 같다. (생각보다 전공내용에서도 겹치는 부분이 많았다) 다음기회에는 정보처리기사, 빅데이터분석기사 도전할 시간이 있으면 해보자 
<img src="https://velog.velcdn.com/images/mi_nini/post/2f198dde-196c-4637-b2e5-486854104d8c/image.jpg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터과학_13_2]]></title>
            <link>https://velog.io/@mi_nini/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99132</link>
            <guid>https://velog.io/@mi_nini/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99132</guid>
            <pubDate>Wed, 27 Nov 2024 01:03:27 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-data-visualiztion">📌 Data Visualiztion</h1>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/57f3da69-cead-4f08-8f8d-84c772131a39/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/ca125383-75b2-4158-ac2e-d8abb916bda5/image.png" alt=""></th>
</tr>
</thead>
</table>
<h3 id="tasks">Tasks</h3>
<ul>
<li><ol>
<li>기본 탐색 데이터 분석</li>
</ol>
</li>
<li><ol start="2">
<li>연구 질문에 대한 데이터 분석</li>
</ol>
</li>
<li><ol start="3">
<li>데이터 정리(전처리)</li>
</ol>
</li>
<li><ol start="4">
<li>프로토타입 모델(시험 모델링)</li>
</ol>
</li>
<li><ol start="5">
<li>시각화</li>
</ol>
</li>
</ul>
<hr>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/0ac95654-8c6a-4a8d-99d2-5c71b762984e/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/0e740d30-9735-4742-818a-f8950ede723d/image.png" alt=""></th>
</tr>
</thead>
</table>
<h3 id="8-best-data-visualization-tools-and-libraries-to-learn-in-2022">8 Best Data Visualization Tools and Libraries to Learn in 2022</h3>
<ul>
<li><ol>
<li>Tableau</li>
</ol>
</li>
<li><ol start="2">
<li>Microsoft Power BI</li>
</ol>
</li>
<li><ol start="3">
<li>QlikView</li>
</ol>
</li>
<li><ol start="4">
<li>QlikSense</li>
</ol>
</li>
<li><ol start="5">
<li>Excel</li>
</ol>
</li>
<li><ol start="6">
<li>Matplotlib - Python</li>
</ol>
</li>
<li><ol start="7">
<li>ggplot2 - R</li>
</ol>
</li>
<li><ol start="8">
<li>D3.js - Javascript</li>
</ol>
</li>
</ul>
<h2 id="📌-기본적인-그래프-함수">📌 기본적인 그래프 함수</h2>
<ul>
<li>barplot(범주형)
  막대그래프</li>
<li>pie(범주형)
  원그래프</li>
<li>hist(연속형)
  히스토그램</li>
<li>boxplot(연속형)
  상자그림</li>
<li>plot()
  기본적으로는 산점도
  자료의 형태에 따라 유동적</li>
</ul>
<hr>
<h1 id="📌-막대그래프---barplot">📌 막대그래프 - barplot()</h1>
<h2 id="barplot">barplot()</h2>
<ul>
<li><p>cyl의 빈도표(table)을 구하고, 이를 막대그래프로</p>
</li>
<li><p>col은 사각형 색상 지정</p>
</li>
<li><p>border는 테두리 색상 지정</p>
</li>
<li><p>그룹 별로 다른 색상 지정 가능</p>
</li>
<li><p>col=c( , , )</p>
</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/e589103f-061d-4828-bd93-9ec51bb4b259/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/7ec6079c-0e81-4eec-a959-2c980ba69b47/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/41aeb613-d4ac-45fc-a05e-cc48b7ec2414/image.png" alt=""></th>
</tr>
</thead>
</table>
<h2 id="📌-수직-수평-누적-막대그래프">📌 수직, 수평 누적 막대그래프</h2>
<ul>
<li><p>변수 cyl의 각 값에 대하여 gear의 비율만큼 다른 색상으로</p>
</li>
<li><p>table(변수1, 변수2)와 같이 2차원 교차표를 생성하여 막대그래프</p>
</li>
<li><p>변수 cyl의 각 값에 대하여 gear의 비율만큼 다른 색상으로</p>
</li>
<li><p>beside=T 옵션으로 수평으로</p>
</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/201457e6-283c-4482-ba11-0ff01b2c095d/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/1a8d6b33-eecb-47af-a4a6-7b183676853c/image.png" alt=""></th>
</tr>
</thead>
</table>
<h2 id="📌-가공된-데이터-막대그래프-그리기">📌 가공된 데이터 막대그래프 그리기</h2>
<p>-1차 가공된 데이터를 입력할 때는 벡터로 입력</p>
<ul>
<li>names()로 그룹 이름 부여하고, 이를 막대그래프로</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/4c88bc17-f186-4edd-a7d9-a6b3bf98c216/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/23e1f861-bb7e-4153-8f67-5b0db8dfa060/image.png" alt=""></th>
</tr>
</thead>
</table>
<h2 id="정리된-데이터-입력하기--2차원">정리된 데이터 입력하기 – 2차원</h2>
<ul>
<li><p>2차원 데이터를 입력할 때는 행렬 형태로 입력</p>
</li>
<li><p>열이름 -&gt; colnames</p>
</li>
<li><p>행이름 -&gt; rownames</p>
</li>
<li><p>행렬로 입력된 데이터를 이용하여 수직누적 막대그래프를 그릴 수 있다.</p>
</li>
<li><p>legend 추가 가능</p>
</li>
<li><p>행과 열 바꾸기</p>
</li>
<li><p>t(matrix) 전치행렬(행과 열을 바꾸는 기능)</p>
</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/0232afaf-2214-461d-9eba-1a043bf8240a/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/316f1c17-317a-4b9f-9101-e0a6c0f958ae/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/501bfa76-ab79-47bc-9cb4-c58769961971/image.png" alt=""></th>
</tr>
</thead>
</table>
<h2 id="그룹별-평균을-높이로">그룹별 평균을 높이로</h2>
<ul>
<li>tapply()를 적용하여 각 그룹별 평균을 구하고</li>
<li>그 결과를 barplot()을 이용하여 그린다.</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/79f8db5f-abc8-4ea1-abf5-aff838fa596a/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/f0f6c5a2-27bb-41bf-a985-53f6b0005433/image.png" alt=""></th>
</tr>
</thead>
</table>
<hr>
<h1 id="📌-원그래프---pie">📌 원그래프 - pie()</h1>
<h2 id="pie---원그래프">pie() - 원그래프</h2>
<ul>
<li><p>색상은 난수로 생성</p>
</li>
<li><p>pie(벡터, labels=표시내용)</p>
</li>
<li><p>벡터 pct는 비율(%) 계산</p>
</li>
<li><p>label: 이름(비율%) 만들기</p>
</li>
<li><p>옵션 labels 이용</p>
</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/16ab147d-8a7c-4d48-800b-743df7695150/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/784a6d9a-f397-4aaa-b358-4354d22aaa45/image.png" alt=""></th>
</tr>
</thead>
</table>
<h2 id="그룹별-합계를-높이로">그룹별 합계를 높이로</h2>
<ul>
<li><p>csv 파일의 인코딩 주의</p>
</li>
<li><p>tapply()를 적용하여 각 그룹별 합계를 구하고</p>
</li>
<li><p>그 결과를 barplot()을 이용하여 그린다.</p>
</li>
<li><p>tapply()를 적용하여 각 그룹별 평균을 구하고</p>
</li>
<li><p>그 결과를 barplot()을 이용하여 그린다.</p>
</li>
<li><p>paste0를 이용하여 가로축의 이름 변경</p>
</li>
</ul>
<pre><code class="language-py">data &lt;- read.csv(&quot;../mydata/도로교통공단_시군구별 월별 교통사고 통계_20231231.csv&quot;, fileEncoding = &quot;CP949&quot;)
head(data)</code></pre>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/73f187eb-34cc-41ad-8a6e-9990aeec7402/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/f88068f4-1440-4964-9f5c-b9f0ef887d71/image.png" alt=""></th>
</tr>
</thead>
</table>
<hr>
<h1 id="📌-히스토그램---hist">📌 히스토그램 - hist()</h1>
<table>
<thead>
<tr>
<th>명령어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><code>hist(연속형)</code></td>
<td>default 히스토그램</td>
</tr>
<tr>
<td><code>hist(x, prob=T)</code></td>
<td>y축을 상대도수로</td>
</tr>
<tr>
<td><code>hist(x, breaks=c())</code></td>
<td>지정한 숫자를 계급의 양끝으로</td>
</tr>
<tr>
<td><code>hist(x, breaks=10*(0:4))</code></td>
<td>구간 [0,10], (10,20], (20,30], (30,40]</td>
</tr>
<tr>
<td><code>hist(x, breaks=10*(0:4), right=FALSE)</code></td>
<td>구간 [0,10], [10,20), [20,30), [30,40)</td>
</tr>
</tbody></table>
<h2 id="hist연속형--디폴트">hist(연속형)- 디폴트</h2>
<ul>
<li><p>자동으로 계급 설정</p>
</li>
<li><p>breaks로 계급 직접 입력 가능</p>
</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/ff65559a-240d-4bb6-9806-cf0022385171/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/d1c7cf46-1c51-48ad-b806-85f1ecc27195/image.png" alt=""></th>
</tr>
</thead>
</table>
<hr>
<h1 id="📌-상자그림---boxplot">📌 상자그림 - boxplot()</h1>
<h2 id="boxplot연속형">boxplot(연속형)</h2>
<ul>
<li><p>아래/위는 최솟값/ 최댓값을 나타낸다.</p>
</li>
<li><p>상자의 가운데 굵은 선은 중앙값(median)</p>
</li>
<li><p>상자의 아래/위는 사분위수의 Q1과 Q3를 나타낸다.</p>
</li>
</ul>
<h2 id="boxplot연속형--범주형">boxplot(연속형 ~ 범주형)</h2>
<ul>
<li><p>cyl의 값에 따라 3그룹으로 분리하고, 각 그룹의 상자그림을 그린다.</p>
</li>
<li><p>색상을 1개만 지정하면 모두 같은 색</p>
</li>
<li><p>그룹별로 다르게 지정 가능</p>
</li>
<li><p>아래 동그라미는 이상점(outlier)</p>
</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/66ac802b-2654-4bd6-add5-10f97572c4f1/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/7bf6bc19-d004-48a5-86fc-19dd0e20ba79/image.png" alt=""></th>
</tr>
</thead>
</table>
<hr>
<h1 id="📌-산점도---plot">📌 산점도 - plot()</h1>
<h2 id="plotx-y">plot(x, y)</h2>
<ul>
<li>x, y는 모두 연속형 자료</li>
<li>데이터 cars</li>
<li>speed: 속력</li>
<li>dist: 제동거리</li>
<li>x, y 순서로 인식
<img src="https://velog.velcdn.com/images/mi_nini/post/a8c62365-248a-409e-aafc-68dc68673fca/image.png" alt=""></li>
</ul>
<pre><code class="language-py">data &lt;- read.csv(&quot;../mydata/도로교통공단_시군구별 월별 교통사고 통계_20231231.csv&quot;, fileEncoding = &quot;CP949&quot;)
jongro &lt;- subset(data, 시군구 ==&#39;종로구&#39;)
jongro</code></pre>
<h2 id="시계열-그래프">시계열 그래프</h2>
<ul>
<li>plot(시간, 연속형)</li>
<li>type=‘o’에서 ‘o&#39;는 소문자 오(o)
<img src="https://velog.velcdn.com/images/mi_nini/post/a1608c82-8eac-48d9-a1af-de50a5db1e21/image.png" alt=""></li>
</ul>
<hr>
<h1 id="📌-그래프-옵션">📌 그래프 옵션</h1>
<h2 id="📌-1-그래프-옵션--제목축">📌 (1) 그래프 옵션 – 제목/축</h2>
<table>
<thead>
<tr>
<th>인수</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><code>main=&quot;메인 제목&quot;</code></td>
<td>제목 설정</td>
</tr>
<tr>
<td><code>xlab=&quot;제목&quot;, ylab=&quot;제목&quot;</code></td>
<td>x, y축 제목</td>
</tr>
<tr>
<td><code>xlim=c(-10,10), ylim=c(-10,10)</code></td>
<td>x, y축 범위</td>
</tr>
<tr>
<td><code>axes=F</code></td>
<td>x, y축을 표시하지 않음</td>
</tr>
</tbody></table>
<h2 id="데이터-cars-speed-vs-dist">데이터 cars: speed vs dist</h2>
<ul>
<li>데이터 cars는 속력(speed)에 따른 제동 거리(dist)</li>
<li>기본 그래프</li>
<li>main=전체 그래프의 제목</li>
</ul>
<h2 id="제목붙이기">제목붙이기</h2>
<ul>
<li>xlab=x축 제목</li>
<li>ylab=y축 제목</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/957c8a7a-655f-4a80-bb00-a1e496e0ad2b/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/f41873fb-f4d4-42e5-b6fb-89c218e1f90f/image.png" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td>## x, y축의 범위</td>
<td></td>
</tr>
<tr>
<td>- x축의 범위는xlim=c(start, end)</td>
<td></td>
</tr>
<tr>
<td>- y축의 범위는ylim=c(start, end)</td>
<td></td>
</tr>
</tbody></table>
<h2 id="x-y-축의-눈금">x, y 축의 눈금</h2>
<ul>
<li>x, y축 눈금은 별도의 명령어 axis() 사용</li>
<li>side=1: 아래쪽 </li>
<li>side=2: 왼쪽</li>
<li>at: 표시할 위치</li>
<li>labels: 표시할 내용</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/fa9928da-1c36-4c72-8439-cdf6af902b05/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/mi_nini/post/550ebb4f-9776-43d4-b099-03829218b6e1/image.png" alt=""></th>
</tr>
</thead>
</table>
<h2 id="축지우기">축지우기</h2>
<ul>
<li>axes=F으로 축표시 제거
<img src="https://velog.velcdn.com/images/mi_nini/post/39bfb552-efcf-4a84-87eb-d4c98e208b3e/image.png" alt=""></li>
</ul>
<hr>
<h2 id="📌-2-그래프-옵션---그래프타입">📌 (2) 그래프 옵션 - 그래프타입</h2>
<table>
<thead>
<tr>
<th>인수</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><code>type=&quot;p&quot;</code></td>
<td>점 모양 그래프 (기본값)</td>
</tr>
<tr>
<td><code>type=&quot;l&quot;</code></td>
<td>선 모양 그래프 (꺾은선 그래프) - 소문자 l(엘)</td>
</tr>
<tr>
<td><code>type=&quot;b&quot;</code></td>
<td>점과 선 모양 그래프</td>
</tr>
<tr>
<td><code>type=&quot;c&quot;</code></td>
<td>&quot;b&quot;에서 점을 생략한 모양</td>
</tr>
<tr>
<td><code>type=&quot;o&quot;</code></td>
<td>점과 선을 중첩해서 그린 그래프</td>
</tr>
<tr>
<td><code>type=&quot;h&quot;</code></td>
<td>각 점에서 x축까지의 수직선 그래프</td>
</tr>
<tr>
<td><code>type=&quot;s&quot;</code></td>
<td>왼쪽 값을 기초로 계단 모양으로 연결한 그래프</td>
</tr>
<tr>
<td><code>type=&quot;S&quot;</code></td>
<td>오른쪽 값을 기초로 계단 모양으로 연결한 그래프</td>
</tr>
<tr>
<td><code>type=&quot;n&quot;</code></td>
<td>축만 그리고 그래프는 그리지 않는다</td>
</tr>
</tbody></table>
<hr>
<h2 id="📌-3-그래프-옵션----색선기호">📌 (3) 그래프 옵션  - 색/선//기호</h2>
<table>
<thead>
<tr>
<th>인수</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><code>col=1</code>, <code>col=&quot;blue&quot;</code></td>
<td>기호의 <strong>색 지정</strong>, 숫자로도 지정 가능<br>1-검정, 2-빨강, 3-초록, 4-파랑, 5-연파랑, 6-보라, 7-노랑, 8-회색</td>
</tr>
<tr>
<td><code>lty=숫자</code>, <code>lty=&quot;문자&quot;</code></td>
<td>선 종류</td>
</tr>
<tr>
<td><code>pch=0</code>, <code>pch=&quot;문자&quot;</code></td>
<td>점의 모양</td>
</tr>
<tr>
<td><code>bg=&quot;blue&quot;</code></td>
<td>그래프의 배경색</td>
</tr>
<tr>
<td><code>lwd=숫자</code></td>
<td>선의 굵기</td>
</tr>
<tr>
<td><code>cex=숫자</code></td>
<td>점이나 문자의 크기</td>
</tr>
<tr>
<td>### 📌 (3-1) 그래프 옵션 – 선 모양</td>
<td></td>
</tr>
<tr>
<td>인수</td>
<td>설명</td>
</tr>
<tr>
<td>-------------------------</td>
<td>--------------------</td>
</tr>
<tr>
<td><code>lty=0</code>, <code>lty=&quot;blank&quot;</code></td>
<td>투명선</td>
</tr>
<tr>
<td><code>lty=1</code>, <code>lty=&quot;solid&quot;</code></td>
<td>실선</td>
</tr>
<tr>
<td><code>lty=2</code>, <code>lty=&quot;dashed&quot;</code></td>
<td>대쉬선</td>
</tr>
<tr>
<td><code>lty=3</code>, <code>lty=&quot;dotted&quot;</code></td>
<td>점선</td>
</tr>
<tr>
<td><code>lty=4</code>, <code>lty=&quot;dotdash&quot;</code></td>
<td>점선과 대쉬선</td>
</tr>
<tr>
<td><code>lty=5</code>, <code>lty=&quot;longdash&quot;</code></td>
<td>긴 대쉬선</td>
</tr>
<tr>
<td><code>lty=6</code>, <code>lty=&quot;twodash&quot;</code></td>
<td>2개의 대쉬선</td>
</tr>
</tbody></table>
<h3 id="📌-3-2-그래프-옵션---점-모양">📌 (3-2) 그래프 옵션 - 점 모양</h3>
<blockquote>
<h3 id="div-aligncenterpch--번호div"><div align="center">pch = 번호</div></h3>
<p><img src="https://velog.velcdn.com/images/mi_nini/post/5561840b-c504-4a12-a18e-9dbb28a47546/image.png" alt=""></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>