<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>지노의 빈노트</title>
    <link>https://jinhonote.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 8 Oct 2026 18:36:17 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>sjh4253</managingEditor>
    <image>
      <title>지노의 빈노트</title>
      <url>https://tistory1.daumcdn.net/tistory/5046295/attach/618cf50f15a442f79f8ea5a194abd8f3</url>
      <link>https://jinhonote.tistory.com</link>
    </image>
    <item>
      <title>SKN Family AI 캠프 14주차 회고</title>
      <link>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-14%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 지금까지 만든 모델이 실제로 얼마나 잘 작동하는지 확인하는 방법부터 배웠다. 정해진 기준으로 자동으로 채점하는 방법, 사람 대신 다른 모델이 답변 품질을 평가하게 만드는 방법, 검색 기반 답변이 근거를 제대로 찾아서 답했는지 확인하는 방법까지 배웠는데, 모델을 잘 만드는 것 못지않게 잘 만들었는지 검증하는 것도 중요한 과정이라는 걸 다시 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주 중반부터는 텍스트뿐 아니라 이미지와 영상까지 함께 다루는 내용으로 넘어갔다. 이미지와 텍스트를 같은 기준으로 비교하는 방법을 배우고, 이걸로 사진을 보고 설명 문장을 만들거나 질문에 답하는 실습을 했다. 이후에는 영상에서 프레임을 여러 장 뽑아내고, 각 장면을 설명하는 문장을 만들어서 저장해두고, 나중에 원하는 장면을 검색해서 찾아내는 실습까지 이어졌다. 텍스트만 다루다가 이미지, 영상까지 다루려니 새롭게 익혀야 할 게 많았지만, 결과물을 눈으로 바로 확인할 수 있어서 재미있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주 후반에는 이미지를 직접 생성하는 방법을 배웠다. 서로 경쟁하며 학습하는 방식부터, 노이즈를 점점 걷어내며 이미지를 만들어내는 방식, 그리고 이미 만들어진 서비스로 손쉽게 이미지를 생성하는 방법까지 비교해서 배웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이번 주에는 3차 프로젝트가 진행됐다. 지난주에 정한 주제로 팀원들과 본격적으로 작업을 시작한 한 주였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배운 내용의 폭이 넓어서 하나하나를 깊게 파고들 시간은 부족했지만, 그래도 어떤 방식들이 있는지 전체적인 그림은 그릴 수 있었던 것 같다. 프로젝트도 병행해야 해서 앞으로 시간 관리에 좀 더 신경 써야겠다.&lt;/p&gt;</description>
      <category>SKN_AI_33/회고</category>
      <author>sjh4253</author>
      <guid isPermaLink="true">https://jinhonote.tistory.com/43</guid>
      <comments>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-14%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0#entry43comment</comments>
      <pubDate>Mon, 7 Sep 2026 16:41:02 +0900</pubDate>
    </item>
    <item>
      <title>SKN Family AI 캠프 13주차 회고</title>
      <link>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-13%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 모델 전체를 다시 학습시키는 대신, 일부만 가볍게 학습시켜서 원하는 방향으로 바꾸는 방법을 배운 한 주였다. 개념을 먼저 정리하고, 파라미터 일부만 효율적으로 학습시키는 방식을 배운 뒤, 뉴스 데이터를 직접 준비해서 실제로 학습을 돌려보는 실습까지 진행했다. 이어서 모델을 더 가볍게 만든 상태에서 학습을 얹는 방식과, 아예 다른 방식으로 필요한 부분만 학습시키는 방법도 비교해서 배웠다. 방식마다 장단점이 달라서 언제 어떤 걸 써야 하는지 감을 잡는 데 시간이 좀 걸렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주 후반에는 이렇게 만든 모델을 로컬 환경에서 직접 돌려보고, API 서버처럼 사용하는 방법을 배웠다. 미리 준비된 모델뿐 아니라 이번 주에 직접 학습시킨 결과물을 변환해서 로컬로 서빙까지 이어 붙여봤는데, 처음부터 끝까지 한 사이클을 다 돌려본 느낌이라 배운 내용들이 자연스럽게 연결되는 게 좋았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이번 주에는 3, 4차 프로젝트 팀원이 결정돼서 회의를 통해 주제를 정하고 본격적으로 프로젝트를 시작하게 됐다. 1, 2차 때 아쉬웠던 부분들을 떠올리면서 이번엔 좀 더 잘해봐야겠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배운 내용을 실습으로 직접 이어 붙여보는 과정이 많아서 뿌듯했던 한 주였다. 다음 주부터는 프로젝트도 병행해야 해서, 시간 배분을 잘 해가면서 진행해야겠다는 생각이 든다.&lt;/p&gt;</description>
      <category>SKN_AI_33/회고</category>
      <author>sjh4253</author>
      <guid isPermaLink="true">https://jinhonote.tistory.com/42</guid>
      <comments>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-13%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0#entry42comment</comments>
      <pubDate>Mon, 31 Aug 2026 09:52:10 +0900</pubDate>
    </item>
    <item>
      <title>SKN Family AI 캠프 12주차 회고</title>
      <link>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-12%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 하나의 도우미가 아니라 여러 단계와 역할을 나눠서 움직이는 구조를 배운 한 주였다. 대화 흐름을 그림처럼 그려서 단계별로 제어하는 방법부터 시작해서, 도구를 호출하는 과정을 직접 만들어보고, 이전 대화를 기억하게 만들고, 중간에 사람이 개입해서 확인하고 넘어가는 방식까지 하나씩 배웠다. 처음엔 복잡하게 느껴졌는데, 작은 예제부터 하나씩 직접 만들어보니 흐름이 눈에 들어오기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에는 역할을 하나가 아니라 여러 개로 나눠서 서로 협업하게 만드는 방법을 배웠다. 순서대로 일을 넘기는 방식, 한쪽이 다른 쪽을 관리하는 방식, 팀 단위로 묶어서 위계를 두는 방식까지 다양한 패턴을 배웠고, 이걸 실제 업무에 적용해서 보고서를 자동으로 만들어보는 실습도 했다. 배운 걸 실무에 가까운 형태로 써보니 왜 이런 구조가 필요한지 좀 더 와닿았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 여러 도구를 표준화된 방식으로 연결하는 방법을 배우고, 직접 서버를 만들어서 연결해보는 실습도 했다. 마지막에는 처음으로 API가 아니라 직접 GPU 서버를 빌려서 모델을 올리고 돌려보는 실습을 했는데, 지금까지는 이미 만들어진 서비스만 가져다 썼다면 이번엔 직접 환경을 세팅하는 것부터 해봐서 색다른 경험이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수요일에는 오전 수업만 듣고 오후에 조퇴해서 AI 관련 행사에 다녀왔다. 요즘 업계에서는 어떤 걸 중요하게 보고 있는지 흐름을 살펴볼 수 있는 시간이었다. 그리고 주말에는 SQLD 자격증 시험도 봤다. 평일에는 수업 따라가기도 벅찼던 터라 시험 준비가 많이 부족했던 것 같은데, 일단 본 것에 의의를 두려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 배운 내용도 많고 개인적으로 챙길 일도 많아서 유독 정신없이 지나간 느낌이다. 다음 주부터는 다시 페이스를 되찾아서 밀린 복습부터 차근차근 해봐야겠다.&lt;/p&gt;</description>
      <category>SKN_AI_33/회고</category>
      <author>sjh4253</author>
      <guid isPermaLink="true">https://jinhonote.tistory.com/41</guid>
      <comments>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-12%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0#entry41comment</comments>
      <pubDate>Tue, 25 Aug 2026 11:26:41 +0900</pubDate>
    </item>
    <item>
      <title>SKN Family AI 캠프 11주차 회고</title>
      <link>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-11%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 지난주에 이어서 여러 기능을 연결해 쓰는 프레임워크를 더 깊게 배운 한 주였다. 여러 단계를 하나로 이어 붙이는 방법과, 필요한 정보를 찾아서 답변에 활용하는 방법, 상황에 맞게 도구를 골라 쓰는 방법까지 순서대로 배웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중반에는 원하는 자료를 미리 저장해두고 질문이 들어오면 그 안에서 답을 찾아오는 방식을 배우고, 이걸로 와인을 추천해주는 도우미를 직접 만들어보는 실습을 했다. 처음부터 끝까지 직접 만들어보니 이론으로만 들었을 때보다 훨씬 이해가 잘 됐다. 이후에는 검색 결과를 더 정확하게 뽑아내는 여러 방법들을 배웠는데, 검색 방식을 조합하거나 순서를 재조정하거나 조건을 걸어 필터링하는 등 같은 목표를 다양한 방식으로 풀어내는 게 흥미로웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주 후반에는 표 형태가 아니라 관계로 연결된 데이터베이스를 다루는 법을 배우고, 이걸 앞서 배운 검색 방식과 결합해서 쓰는 방법까지 배우면서 마무리됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주도 다룬 내용이 많고 하나하나가 이전 내용을 응용하는 방식이라, 앞부분을 제대로 이해하지 못하면 뒤로 갈수록 헷갈리는 느낌이었다. 배운 걸 실습으로 직접 만들어보는 과정이 가장 도움이 됐던 것 같아서, 다음에도 이론만 보고 넘어가지 말고 직접 만들어보면서 복습해야겠다는 생각이 들었다.&lt;/p&gt;</description>
      <category>SKN_AI_33/회고</category>
      <author>sjh4253</author>
      <guid isPermaLink="true">https://jinhonote.tistory.com/40</guid>
      <comments>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-11%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0#entry40comment</comments>
      <pubDate>Tue, 18 Aug 2026 12:42:27 +0900</pubDate>
    </item>
    <item>
      <title>SKN Family AI 캠프 10주차 회고</title>
      <link>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-10%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 지난주에 이어서 새로운 모델 구조들을 배우고, 이걸 실제로 활용하는 방법까지 배운 한 주였다. 번역 같은 문제를 푸는 모델부터 시작해서, 최근 많이 쓰이는 모델들의 핵심 원리가 되는 구조까지 순서대로 배웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중반부터는 이 구조를 기반으로 만들어진 모델을 실제로 가져다 쓰는 방법을 배웠는데, 이론만 배울 때보다 직접 써보니 훨씬 감이 잡히는 느낌이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주 후반에는 요즘 많이 쓰는 언어 모델을 실제로 다루는 법을 배웠다. 원하는 대로 답을 얻어내는 프롬프트 작성법부터 시작해서, 음성으로 변환하거나 음성을 텍스트로 바꾸는 기능, 필요한 정보를 검색하거나 위험한 내용을 걸러내는 기능까지 하나씩 실습해봤고, 이걸 다 엮어서 하나의 상담 도우미를 만들어보는 실습도 했다. 그리고 모델을 원하는 말투나 목적에 맞게 다시 학습시키는 방법과, 여러 기능을 연결해서 쓸 수 있게 도와주는 프레임워크까지 배우면서 마무리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 주 동안 다룬 범위가 워낙 넓어서 머릿속에서 아직 다 정리되지는 않은 느낌이다. 특히 초반에 배운 구조 쪽은 이번 주 안에 완전히 소화하기엔 벅찼던 것 같아서, 다음에 시간 내서 다시 한번 짚고 넘어가야겠다는 생각이 들었다.&lt;/p&gt;</description>
      <category>SKN_AI_33/회고</category>
      <author>sjh4253</author>
      <guid isPermaLink="true">https://jinhonote.tistory.com/39</guid>
      <comments>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-10%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0#entry39comment</comments>
      <pubDate>Mon, 10 Aug 2026 11:17:56 +0900</pubDate>
    </item>
    <item>
      <title>SKN Family AI 캠프 9주차 회고</title>
      <link>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-9%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 자연어처리(NLP)를 본격적으로 배운 한 주였다. 토큰화, 정제와 정규화, 어간&amp;middot;표제어 추출, 정규표현식, 정수 인코딩과 패딩, 원-핫 인코딩까지 텍스트를 모델에 넣기 전 다듬는 전처리 과정을 쭉 훑었고, 이어서 BoW&amp;middot;TF-IDF 같은 빈도 기반 벡터화부터 단어 간 의미 관계를 담는 Word2Vec, 미등록 단어 문제를 보완하는 FastText까지 벡터화 방법들을 배웠다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;3:1-3:375;218-592&quot; data-ke-size=&quot;size16&quot;&gt;중반부터는 토큰 순서를 반영하지 못하는 벡터화의 한계를 넘어서기 위해 RNN을 배우고, 장기 의존성 문제를 해결하는 LSTM과 더 가벼운 구조인 GRU까지 이어서 배웠다. 배운 내용을 묶어서 한국어 감성 분류(NSMC) 파이프라인을 직접 구현해보는 실습도 했는데, 형태소 토큰화부터 정수 인코딩, BiGRU 모델까지 전체 흐름을 한 번에 엮어보니 그동안 따로따로 배운 개념들이 조금씩 연결되는 느낌이었다. 이어서 Naive Bayes, LSTM, 멀티레이블 분류, TextCNN까지 여러 방식으로 텍스트 분류를 실습했고, 주 후반에는 SentencePiece와 BERT의 WordPiece 같은 서브워드 토큰화, N-gram과 NNLM 같은 언어 모델 개념까지 다뤘다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;5:1-5:171;594-764&quot; data-ke-size=&quot;size16&quot;&gt;한 주 동안 다룬 내용이 워낙 많고 낯선 개념도 많아서 따라가기 벅찬 순간이 많았다. 지난주부터 느꼈던 것처럼 배운 내용을 완전히 내 것으로 만들려면 복습 시간이 꼭 필요하다는 걸 다시 한번 느꼈고, 시작한 스터디 시간을 활용해서 이번 주에 배운 NLP 개념들을 한 번 더 정리해봐야겠다는 생각이 들었다.&lt;/p&gt;</description>
      <category>SKN_AI_33/회고</category>
      <author>sjh4253</author>
      <guid isPermaLink="true">https://jinhonote.tistory.com/38</guid>
      <comments>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-9%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0#entry38comment</comments>
      <pubDate>Mon, 3 Aug 2026 11:05:40 +0900</pubDate>
    </item>
    <item>
      <title>SKN Family AI 캠프 8주차 회고</title>
      <link>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-8%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 화요일과 수요일에 팀 프로젝트가 있어서 시간이 빨리 간 주간이었다. 첫 번째 프로젝트도 그렇고 이번 프로젝트도 과정과 결과 모두 마음에 들지는 않았다. 부족한 게 많았고 순조롭지 않았다. 3, 4차 프로젝트는 이어지는 프로젝트라 팀원이 그대로 유지된다고 들었는데, 그때는 1, 2차 때 부족했던 부분들을 생각해서 잘 해내볼 생각이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주부터는 스터디도 시작했다. 첫 스터디를 마치고 다른 주제의 스터디 두 개에 추가로 참여하기로 했다. 공부할 게 다양하고 많은 만큼, 여러 스터디에 참여하면서 추가적인 공부를 해볼 생각이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬슬 취업 관련 걱정도 들기 시작한다. 이제 두 달쯤 뒤면 파이널 프로젝트도 시작하는데, 지금까지 배운 내용으로 새로운 업무로 취업을 할 수 있을지 걱정이 된다. 배울 것도 많고 공부할 것도 너무 많은데 시간은 부족하고 몸도 피곤해서, 컨디션 관리를 잘해야 할 것 같다.&lt;/p&gt;</description>
      <category>SKN_AI_33/회고</category>
      <author>sjh4253</author>
      <guid isPermaLink="true">https://jinhonote.tistory.com/37</guid>
      <comments>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-8%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0#entry37comment</comments>
      <pubDate>Mon, 27 Jul 2026 09:46:09 +0900</pubDate>
    </item>
    <item>
      <title>SKN Family AI 캠프 7주차 회고</title>
      <link>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-7%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 목요일 휴가, 금요일 공휴일로 3일만 교육장에 나왔고 지난주 금요일에 이어서 딥러닝 수업을 계속 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;월요일에는 드디어 2차 미니 프로젝트 팀원이 결정됐다. 딱히 불만 사항이 없을 만큼 다들 열심히 하는 사람들로 구성된 팀이라, 1차 때에 비해 별문제 없이 프로젝트를 진행할 수 있을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수업을 들으면서는 이후에 복습할 시간이 좀 필요하겠다는 걸 느꼈다. 이전 수업들에 비해 처음 배우는 내용이나 까먹었던 내용이 많았고, 완벽하게 이해하고 사용할 수 있을지는 모르겠다는 느낌이 들었다. 그래서 다음 주부터는 시간 될 때마다 남아서 공부하고 복습하고, 같이 공부할 사람들을 모아 스터디도 진행해볼 예정이다.&lt;/p&gt;</description>
      <category>SKN_AI_33/회고</category>
      <author>sjh4253</author>
      <guid isPermaLink="true">https://jinhonote.tistory.com/36</guid>
      <comments>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-7%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0#entry36comment</comments>
      <pubDate>Mon, 20 Jul 2026 09:39:40 +0900</pubDate>
    </item>
    <item>
      <title>SKN Family AI 캠프 6주차 회고</title>
      <link>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-6%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주에는 머신러닝을 마저 배우고 딥러닝 관련 내용을 배우기 시작했다. 중간에는 여러 모델을 검증하고 평가하는 과정도 다뤘는데, 뭔가 본격적으로 기초를 다지는 시간이었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이번 주는 정말 바빴다. 참여하는 해커톤의 서류 제출 마감일이 있어서, 제출 직전까지 매일 서류 관련으로 좀 복잡한 날들이었다. 다행히 어느 정도 아이디어도 정리하고 팀원들과의 회의로 방향이 잘 결정돼서, 생각한 시간 안에 서류를 마무리하고 제출할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 이번 주는 사용하고 있는 Claude랑 Codex에도 변화가 있던 시기라, 이것저것 만들어보고 테스트도 해보면서 작업 환경에 맞게 설정을 다시 손봤다. 덕분에 이전보다 활용도가 좀 더 높아질 수 있었던 한 주였던 것 같다.&lt;/p&gt;</description>
      <category>SKN_AI_33/회고</category>
      <author>sjh4253</author>
      <guid isPermaLink="true">https://jinhonote.tistory.com/35</guid>
      <comments>https://jinhonote.tistory.com/entry/SKN-Family-AI-%EC%BA%A0%ED%94%84-6%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0#entry35comment</comments>
      <pubDate>Mon, 13 Jul 2026 10:03:21 +0900</pubDate>
    </item>
    <item>
      <title>05_EDA_Titanic실습</title>
      <link>https://jinhonote.tistory.com/entry/05EDATitanic%EC%8B%A4%EC%8A%B5</link>
      <description>&lt;h1 data-heading=&quot;EDA 실습 &amp;mdash; Titanic 생존 데이터&quot;&gt;EDA 실습 &amp;mdash; Titanic 생존 데이터&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Titanic 데이터셋을 대상으로 EDA 10단계를 직접 적용한 실습 노트. 코드보다 &lt;b&gt;각 단계에서 무엇을 판단했는지&lt;/b&gt;에 집중.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습 파일: ~/Desktop/SKN/SKN_33/05_data_analysis/04_eda/02_eda_titanic.ipynb&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;핵심 분석 질문&quot; data-ke-size=&quot;size26&quot;&gt;핵심 분석 질문&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EDA를 시작하기 전에 질문을 먼저 정해야 함.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Titanic 승객의 생존 여부는 어떤 변수와 관련이 있어 보이는가?&lt;/li&gt;
&lt;li&gt;결측치나 이상값 때문에 전처리가 필요한 컬럼은 무엇인가?&lt;/li&gt;
&lt;li&gt;모델링을 한다면 어떤 파생변수를 만들 수 있는가?&lt;/li&gt;
&lt;li&gt;최종적으로 어떤 인사이트를 보고서에 쓸 수 있는가?&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;01. 데이터 로드&quot; data-ke-size=&quot;size26&quot;&gt;01. 데이터 로드&lt;/h2&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import seaborn as sns
import platform

# 한글 폰트 설정 (Windows: Malgun Gothic)
font_candidates = {
    &quot;Windows&quot;: [&quot;Malgun Gothic&quot;, &quot;NanumGothic&quot;],
    &quot;Darwin&quot;: [&quot;AppleGothic&quot;, &quot;NanumGothic&quot;],
    &quot;Linux&quot;: [&quot;NanumGothic&quot;],
}
available_fonts = {font.name for font in fm.fontManager.ttflist}
for font_name in font_candidates.get(platform.system(), []):
    if font_name in available_fonts:
        plt.rcParams[&quot;font.family&quot;] = font_name
        break

plt.rcParams[&quot;axes.unicode_minus&quot;] = False   # 마이너스 기호 깨짐 방지
sns.set_theme(style=&quot;whitegrid&quot;)

raw_df = pd.read_csv(&quot;data/titanic.csv&quot;)
df = raw_df.copy()   # 원본 유지, 복사본으로 작업
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;02. 데이터 구조&quot; data-ke-size=&quot;size26&quot;&gt;02. 데이터 구조&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;크기&lt;/b&gt;: 891행 &amp;times; 12열&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한 행 의미&lt;/b&gt;: Titanic 탑승 승객 1명&lt;/li&gt;
&lt;li&gt;&lt;b&gt;타깃&lt;/b&gt;: Survived (0=사망, 1=생존)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;컬럼 타입 의미&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PassengerId&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;승객 고유 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Survived&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;생존 여부 (타깃)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pclass&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;객실 등급 (1&amp;middot;2&amp;middot;3, 숫자이지만 범주형)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;str&lt;/td&gt;
&lt;td&gt;이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sex&lt;/td&gt;
&lt;td&gt;str&lt;/td&gt;
&lt;td&gt;성별&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Age&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;나이 (결측치 있음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SibSp&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;형제&amp;middot;배우자 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parch&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;부모&amp;middot;자녀 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ticket&lt;/td&gt;
&lt;td&gt;str&lt;/td&gt;
&lt;td&gt;티켓 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fare&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;요금&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cabin&lt;/td&gt;
&lt;td&gt;str&lt;/td&gt;
&lt;td&gt;객실 번호 (결측치 많음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embarked&lt;/td&gt;
&lt;td&gt;str&lt;/td&gt;
&lt;td&gt;탑승 항구 (S&amp;middot;C&amp;middot;Q)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;print(df.shape)              # (891, 12)
print(df.columns.tolist())
df.info()
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;03. 기술 통계&quot; data-ke-size=&quot;size26&quot;&gt;03. 기술 통계&lt;/h2&gt;
&lt;h3 data-heading=&quot;수치형 요약 (describe().T)&quot; data-ke-size=&quot;size23&quot;&gt;수치형 요약 (describe().T)&lt;/h3&gt;
&lt;p&gt;컬럼 평균 중앙값 주목할 점&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Survived&lt;/td&gt;
&lt;td&gt;0.38&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;생존율 약 38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Age&lt;/td&gt;
&lt;td&gt;29.7&lt;/td&gt;
&lt;td&gt;28.0&lt;/td&gt;
&lt;td&gt;결측치로 714개만 집계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fare&lt;/td&gt;
&lt;td&gt;32.2&lt;/td&gt;
&lt;td&gt;14.5&lt;/td&gt;
&lt;td&gt;평균 &amp;gt; 중앙값 &amp;rarr; 오른쪽 치우침&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-heading=&quot;범주형 요약&quot; data-ke-size=&quot;size23&quot;&gt;범주형 요약&lt;/h3&gt;
&lt;p&gt;컬럼 최빈값 고유값 수&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sex&lt;/td&gt;
&lt;td&gt;male (577)&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embarked&lt;/td&gt;
&lt;td&gt;S (644)&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;891 (모두 고유)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cabin&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;df.describe().T
df.describe(include=[&quot;object&quot;]).T

# 타깃 클래스 비율
df[&quot;Survived&quot;].value_counts(normalize=True) * 100
# &amp;rarr; 사망 61.6%, 생존 38.4%
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;04. 결측치&amp;middot;중복&amp;middot;이상값&quot; data-ke-size=&quot;size26&quot;&gt;04. 결측치&amp;middot;중복&amp;middot;이상값&lt;/h2&gt;
&lt;h3 data-heading=&quot;결측치 요약&quot; data-ke-size=&quot;size23&quot;&gt;결측치 요약&lt;/h3&gt;
&lt;p&gt;컬럼 결측 수 결측률 처리 전략&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cabin&lt;/td&gt;
&lt;td&gt;687&lt;/td&gt;
&lt;td&gt;&lt;b&gt;77.1%&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;원본 제거 &amp;rarr; HasCabin 파생변수 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Age&lt;/td&gt;
&lt;td&gt;177&lt;/td&gt;
&lt;td&gt;&lt;b&gt;19.9%&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;성별&amp;middot;등급별 중앙값으로 대체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embarked&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0.2%&lt;/td&gt;
&lt;td&gt;최빈값(S)으로 대체&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;roboconf&quot;&gt;&lt;code&gt;missing_summary = pd.DataFrame({
    &quot;missing_count&quot;: df.isna().sum(),
    &quot;missing_rate&quot;: (df.isna().sum() / df.shape[0]) * 100,
}).sort_values(&quot;missing_count&quot;, ascending=False)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-heading=&quot;중복&quot; data-ke-size=&quot;size23&quot;&gt;중복&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 중복 행: &lt;b&gt;0개&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;PassengerId 중복: &lt;b&gt;0개&lt;/b&gt; &amp;rarr; 식별자로 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-heading=&quot;이상값 (IQR 기준)&quot; data-ke-size=&quot;size23&quot;&gt;이상값 (IQR 기준)&lt;/h3&gt;
&lt;p&gt;컬럼 이상값 후보 수 해석&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Age&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;매우 나이 많은 승객. 오류보다 실제값 가능성 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fare&lt;/td&gt;
&lt;td&gt;116&lt;/td&gt;
&lt;td&gt;고가 티켓. 1등급 특성. 로그 변환 고려&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;for col in [&quot;Age&quot;, &quot;Fare&quot;]:
    q1 = df[col].quantile(0.25)
    q3 = df[col].quantile(0.75)
    iqr = q3 - q1
    lower, upper = q1 - 1.5 * iqr, q3 + 1.5 * iqr
    outlier_count = ((df[col] &amp;lt; lower) | (df[col] &amp;gt; upper)).sum()
    print(f&quot;{col}: 이상값 후보 {outlier_count}개&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;05 &amp;amp; 06. 분포 시각화 + 변수 간 관계&quot; data-ke-size=&quot;size26&quot;&gt;05 &amp;amp; 06. 분포 시각화 + 변수 간 관계&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 범주형 4개 분포 한 번에
fig, axes = plt.subplots(2, 2, figsize=(12, 8), constrained_layout=True)
axes = axes.ravel()   # 2D &amp;rarr; 1D

for ax, (col, title) in zip(axes, [
    (&quot;Survived&quot;, &quot;생존 여부&quot;), (&quot;Pclass&quot;, &quot;객실 등급&quot;),
    (&quot;Sex&quot;, &quot;성별&quot;), (&quot;Embarked&quot;, &quot;탑승 항구&quot;)
]):
    sns.countplot(data=df, x=col, ax=ax, hue=col, palette=&quot;Set2&quot;, legend=False)
    ax.set_title(title)

plt.show()

# 성별&amp;middot;등급&amp;middot;항구별 생존율
fig, axes = plt.subplots(1, 3, figsize=(15, 4), constrained_layout=True)
for ax, col in zip(axes, [&quot;Sex&quot;, &quot;Pclass&quot;, &quot;Embarked&quot;]):
    sns.barplot(data=df, x=col, y=&quot;Survived&quot;, errorbar=None, ax=ax)
    ax.set_ylim(0, 1)
    ax.set_title(f&quot;{col}별 생존율&quot;)

plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;07. 상관관계 및 교차분석&quot; data-ke-size=&quot;size26&quot;&gt;07. 상관관계 및 교차분석&lt;/h2&gt;
&lt;h3 data-heading=&quot;수치형 상관계수 (주목할 관계)&quot; data-ke-size=&quot;size23&quot;&gt;수치형 상관계수 (주목할 관계)&lt;/h3&gt;
&lt;p&gt;변수 조합 상관계수 해석&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pclass &amp;harr; Fare&lt;/td&gt;
&lt;td&gt;-0.55&lt;/td&gt;
&lt;td&gt;등급 낮을수록 요금 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Survived &amp;harr; Pclass&lt;/td&gt;
&lt;td&gt;-0.34&lt;/td&gt;
&lt;td&gt;등급 높을수록 생존율 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Survived &amp;harr; Fare&lt;/td&gt;
&lt;td&gt;0.26&lt;/td&gt;
&lt;td&gt;요금 높을수록 생존율 약간 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;corr_cols = [&quot;Survived&quot;, &quot;Pclass&quot;, &quot;Age&quot;, &quot;SibSp&quot;, &quot;Parch&quot;, &quot;Fare&quot;]
corr_mat = df[corr_cols].corr(numeric_only=True)
sns.heatmap(corr_mat, annot=True, fmt=&quot;.2f&quot;, cmap=&quot;coolwarm&quot;, center=0)
plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-heading=&quot;범주형 교차표&quot; data-ke-size=&quot;size23&quot;&gt;범주형 교차표&lt;/h3&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;# normalize='index': 행 기준 비율 (각 그룹 내 생존율)
pd.crosstab(df[&quot;Sex&quot;], df[&quot;Survived&quot;], normalize=&quot;index&quot;).round(3)
pd.crosstab(df[&quot;Pclass&quot;], df[&quot;Survived&quot;], normalize=&quot;index&quot;).round(3)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;성별 생존율&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;female&lt;/td&gt;
&lt;td&gt;&lt;b&gt;74.2%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;male&lt;/td&gt;
&lt;td&gt;&lt;b&gt;18.9%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;객실 등급 생존율&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1등급&lt;/td&gt;
&lt;td&gt;&lt;b&gt;63.0%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2등급&lt;/td&gt;
&lt;td&gt;47.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3등급&lt;/td&gt;
&lt;td&gt;&lt;b&gt;24.2%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;08. 전처리 실습&quot; data-ke-size=&quot;size26&quot;&gt;08. 전처리 실습&lt;/h2&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;eda_df = raw_df.copy()   # 원본 유지!

# Cabin: 결측 여부 파생변수
eda_df[&quot;HasCabin&quot;] = eda_df[&quot;Cabin&quot;].notna().astype(int)

# Age: 성별&amp;middot;등급별 중앙값으로 대체 (transform: 그룹 크기 유지)
age_median = eda_df.groupby([&quot;Sex&quot;, &quot;Pclass&quot;])[&quot;Age&quot;].transform(&quot;median&quot;)
eda_df[&quot;AgeFilled&quot;] = eda_df[&quot;Age&quot;].fillna(age_median)

# Embarked: 최빈값으로 대체
embarked_mode = eda_df[&quot;Embarked&quot;].mode()[0]   # mode()[0]: 최빈값 첫 번째
eda_df[&quot;EmbarkedFilled&quot;] = eda_df[&quot;Embarked&quot;].fillna(embarked_mode)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;groupby().transform(): 그룹별 계산 후 원본 DataFrame과 같은 인덱스로 반환. fillna()와 함께 쓰기 좋음.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;09. Feature Engineering 실습&quot; data-ke-size=&quot;size26&quot;&gt;09. Feature Engineering 실습&lt;/h2&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;# 가족 규모
eda_df[&quot;FamilySize&quot;] = eda_df[&quot;SibSp&quot;] + eda_df[&quot;Parch&quot;] + 1

# 단독 탑승 여부
eda_df[&quot;IsAlone&quot;] = (eda_df[&quot;FamilySize&quot;] == 1).astype(int)

# 나이 구간화
eda_df[&quot;AgeGroup&quot;] = pd.cut(
    eda_df[&quot;AgeFilled&quot;],
    bins=[0, 12, 18, 35, 60, eda_df[&quot;AgeFilled&quot;].max()],
    labels=[&quot;Child&quot;, &quot;Teen&quot;, &quot;YoungAdult&quot;, &quot;Adult&quot;, &quot;Senior&quot;],
    include_lowest=True   # 가장 왼쪽 경계값 포함
)

# 로그 변환 (Fare 치우침 완화)
eda_df[&quot;LogFare&quot;] = np.log1p(eda_df[&quot;Fare&quot;])   # log(1+x)

# 원-핫 인코딩
model_ready_df = pd.get_dummies(
    eda_df[[&quot;Survived&quot;, &quot;Pclass&quot;, &quot;AgeFilled&quot;, &quot;FamilySize&quot;,
            &quot;IsAlone&quot;, &quot;LogFare&quot;, &quot;HasCabin&quot;, &quot;Sex&quot;, &quot;EmbarkedFilled&quot;]],
    columns=[&quot;Sex&quot;, &quot;EmbarkedFilled&quot;],
    dtype=int
)
# 결과: Sex_female, Sex_male, EmbarkedFilled_C, EmbarkedFilled_Q, EmbarkedFilled_S 생성
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;10. 최종 인사이트&quot; data-ke-size=&quot;size26&quot;&gt;10. 최종 인사이트&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;전체 생존율은 약 &lt;b&gt;38.4%&lt;/b&gt;로 사망자 비율이 더 높음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;여성 생존율(74.2%)이 남성(18.9%)보다 훨씬 높음&lt;/b&gt; &amp;rarr; Sex는 가장 관련 큰 변수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;객실 등급이 높을수록 생존율이 높음&lt;/b&gt; (1등급 63%, 3등급 24%)&lt;/li&gt;
&lt;li&gt;Cabin 결측률이 77%로 원본 컬럼 사용 어려움 &amp;rarr; HasCabin 파생변수 활용&lt;/li&gt;
&lt;li&gt;Age 결측률 20% &amp;rarr; 성별&amp;middot;등급별 중앙값으로 대체 전략 선택&lt;/li&gt;
&lt;li&gt;Fare는 오른쪽 치우침 + 이상값 후보 116개 &amp;rarr; LogFare 변환 고려&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다음 단계&lt;/b&gt;: 결측치 처리 &amp;rarr; 인코딩 &amp;rarr; Feature/Target 분리 &amp;rarr; 머신러닝 모델 학습&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;자주 쓴 코드 패턴&quot; data-ke-size=&quot;size26&quot;&gt;자주 쓴 코드 패턴&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 결측치 요약표
pd.DataFrame({
    &quot;missing_count&quot;: df.isna().sum(),
    &quot;missing_rate&quot;: (df.isna().sum() / len(df)) * 100,
}).sort_values(&quot;missing_count&quot;, ascending=False)

# 그룹별 교차표 (비율)
pd.crosstab(df[&quot;Sex&quot;], df[&quot;Survived&quot;], normalize=&quot;index&quot;).round(3)

# 여러 subplot + ravel
fig, axes = plt.subplots(2, 2, figsize=(12, 8), constrained_layout=True)
axes = axes.ravel()
for ax, col in zip(axes, col_list):
    sns.countplot(data=df, x=col, ax=ax)

# 그룹별 변환 후 fillna
age_fill = df.groupby([&quot;Sex&quot;, &quot;Pclass&quot;])[&quot;Age&quot;].transform(&quot;median&quot;)
df[&quot;AgeFilled&quot;] = df[&quot;Age&quot;].fillna(age_fill)

&lt;/code&gt;&lt;/pre&gt;</description>
      <category>SKN_AI_33/Data_Analysis</category>
      <author>sjh4253</author>
      <guid isPermaLink="true">https://jinhonote.tistory.com/34</guid>
      <comments>https://jinhonote.tistory.com/entry/05EDATitanic%EC%8B%A4%EC%8A%B5#entry34comment</comments>
      <pubDate>Mon, 6 Jul 2026 08:57:06 +0900</pubDate>
    </item>
  </channel>
</rss>