<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>variety._.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 30 Dec 2021 00:33:23 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. variety._.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/varieyty_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[AI반도체]]></title>
            <link>https://velog.io/@varieyty_/AI%EB%B0%98%EB%8F%84%EC%B2%B4</link>
            <guid>https://velog.io/@varieyty_/AI%EB%B0%98%EB%8F%84%EC%B2%B4</guid>
            <pubDate>Thu, 30 Dec 2021 00:33:23 GMT</pubDate>
            <description><![CDATA[<h1 id="ai반도체">AI반도체</h1>
<hr>
<ul>
<li>AI 서비스가 생활과 산업 전반에 확대됨에 따라 처리해야 하는 데이터양이 늘어나고 AI 데이터센터의 성능향상이 시급해졌다.</li>
<li>현재 대다수 기업은 기존 반도체(GPU)를 활용해 AI데이터 센터를 운영한다</li>
<li>그러나 GPU로는 속도의 한계와 비용의 문제가 발생한다.</li>
<li>이 문제를 해결하기 위해 AI반도체가 떠오르고있다, 이는 기존의 GPU보다 대규모 연산을 초고속&amp;저전력으로 실행할 수 있다.</li>
</ul>
<ul>
<li><p>국내에서는 SK텔레콤이 지난 해 첫 국산 AI반도체인 &#39;사피온 X220&#39;을 공개한바 있다.</p>
</li>
<li><p>이는 기존의 GPU와 비교해 전력 사용량은 80%, 연산 속도는 1.5배를 자랑했으며 또한 가격은 기존의 절반수준을 자랑했다.</p>
</li>
<li><p>KT 또한 최근 클라우드 기반의 GPU 인프라 제공 서비스 &#39;하이퍼스케일 AI컴퓨팅&#39;을 출시했다.</p>
</li>
<li><p>이를 계기로 2022년까지 소프트웨어 기반 클라우드 서비스를 강화하고 2023년 하반기에 전용 AI 반도체 칩을 제작하려 기획중이다.</p>
</li>
<li><p>이처럼 AI 반도체는 성장가능성이 높으나 현재까지 AI 반도체 시장을 선점한 업체는 없다</p>
</li>
</ul>
<p><a href="https://stibee.com/api/v1.0/emails/share/Pm1kKb8ZelOA-xYCcr-_E5mkTCuvRg==">기사 원문</a> - DAILY_BYTE</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴퓨터 네트워크 #2(네트워크의 기본 규칙)]]></title>
            <link>https://velog.io/@varieyty_/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-2%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EA%B7%9C%EC%B9%99</link>
            <guid>https://velog.io/@varieyty_/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-2%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EA%B7%9C%EC%B9%99</guid>
            <pubDate>Wed, 29 Dec 2021 15:34:49 GMT</pubDate>
            <description><![CDATA[<h1 id="컴퓨터-네트워크-2">컴퓨터 네트워크 #2</h1>
<hr>
<h1 id="네트워크의-기본-규칙">네트워크의 기본 규칙</h1>
<h4 id="introduction">Introduction</h4>
<p> ⚙세상이 질서있게 돌아가기 위해 우리들은 모두 특정한 규칙 하에 살아간다. 서로 다른 규칙, 약속하에 살아가게 되면 상당히 불편하고 소통도 되지 않을 것이다 ㅜㅜ.</p>
<ul>
<li>이와 마찬가지로 네트워크에서도 문제없이 통신을 하려면 규칙을 지켜야한다. 이 규칙에 대해 알아보자!</li>
</ul>
<hr>
<h4 id="프로토콜">프로토콜</h4>
<ul>
<li><p>위와 같이 컴퓨터간에도 모두 규칙을 정하였는데 이를 프로토콜이라 한다.</p>
</li>
<li><p><code>프로토콜</code> : 컴퓨터 간에 정보를 주고받을 때의 통신 방법에 대한 규칙이나 표준</p>
</li>
</ul>
<h4 id="osi-모델과-tcpip-모델">OSI 모델과 TCP/IP 모델</h4>
<blockquote>
<p>네트워크에서는 데이터를 주고받기 위한 통신 규격이 정해져있다. 이 통신규격은 무엇일까?</p>
</blockquote>
<ul>
<li>표준 규격을 정하는 여러단체 중 ISO(International Organization for Standardization)라는 국제표준화기구가 존재한다. 이 단체에서 OSI 모델이라는 표준 규격을 제정하였다.</li>
<li>OSI 모델 : 네트워크 기술의 기본이 되는 모델로써 7개의 레이어(계층)이 존재한다. 이는 아래 표와 같다</li>
</ul>
<table>
<thead>
<tr>
<th>계층</th>
<th>이름</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>7계층</td>
<td>응용계층</td>
<td>이메일 &amp; 파일전송, 웹 사이트 조회 등 애플리케이션에 대한 서비스를 제공</td>
</tr>
<tr>
<td>6계층</td>
<td>표현계층</td>
<td>문자코드, 압축, 암호화 등의 데이터를 변환</td>
</tr>
<tr>
<td>5계층</td>
<td>세션계층</td>
<td>세션 체결, 통신 방식을 결정</td>
</tr>
<tr>
<td>4계층</td>
<td>전송계층</td>
<td>신뢰할 수 있는 통신을 구현</td>
</tr>
<tr>
<td>3계층</td>
<td>네트워크 계층</td>
<td>다른 네트워크와 통신하기 위한 경로 설정 및 논리 주소를 결정</td>
</tr>
<tr>
<td>2계층</td>
<td>데이터 링크 계층</td>
<td>네트워크 기기 간의 데이터 전송 미 물리 주소를 결정</td>
</tr>
<tr>
<td>1계층</td>
<td>물리 계층</td>
<td>시스템 간의 물리적인 연결과 전기 신호를 변환 및 제어</td>
</tr>
</tbody></table>
<ul>
<li>통신할 때 데이터는 맨 위의 응용 계층에서 순차적으로 아래 계층으로 전달된다.</li>
<li>데이터를 전송하는 쪽(송신)은 상위 계층에서 하위 계층으로 전달하고 각 계층은 독립적이므로 데이터가 전달되는 동안에 다른 계층의 영향을 받지 않는다.</li>
<li>데이터는 받는 쪽(수신 측)은 하위 계층에서 상위 계층으로 각 계층을 통해 전달된 데이터를 받는다.</li>
</ul>
<h4 id="tcpip-모델">TCP/IP 모델</h4>
<ul>
<li>TCP/IP는 인터넷 네트워크의 핵심 프로토콜으로 OSI모델의 7계층을 4계층으로 바꿔서 이해하면 편하다.</li>
<li>(응용,표현,세션 =&gt; 응용), (전송 =&gt; 전송), (네트워크 =&gt; 인터넷), (데이터 링크, 물리 =&gt; 네트워크 엑세스)</li>
<li>OSI와 TCP/IP를 비교해보면 아래와 같다</li>
</ul>
<p><img src="https://t1.daumcdn.net/cfile/tistory/213F623C566BAE253B" alt="TCP/IP 4계층(TCP/IP 4 Layer)"></p>
<h4 id="캡슐화와-역캡슐화">캡슐화와 역캡슐화</h4>
<blockquote>
<p>데이터를 송수신할 때는 캡슐화와 역캡슐화가 이루어진다 이 것이 무엇일까?</p>
</blockquote>
<ul>
<li><p>정의는 아래와 같다</p>
</li>
<li><p><code>캡슐화(Encapsulation)</code> : 컴퓨터 통신에서 상위 곆층의 통신 규약 정보를 하위 통신 규약 프레임 사용자 정보 영역에 내장시켜 전송하는 기술. 복수의 프로토콜층에서 정보를 하나로 종합하여 통신망에 보내는 프로세스.</p>
</li>
<li><p>풀어쓰자면, 데이터를 송신할 때는 데이터 앞부분에 전송하는데 필요한 정보(헤더)를 붙여 다음 계층으로 보내는데 헤더를 붙여 나가는 것을 캡슐화라고하고 수신 측에서 헤더를 제거해 나가는 과정을 역캡슐화 라고 한다. </p>
<ul>
<li><code>헤더</code>: 데이터 전송에 필요한 정보</li>
<li><code>트레일러</code> : 데이터 전달 시, 데이터의 마지막에 추가하는 정보</li>
</ul>
</li>
<li><p>캡슐화, 역캡슐화의 과정은 아래와 같다.</p>
</li>
</ul>
<p><img src="https://media.vlpt.us/images/ej_shin/post/4c72ae08-75e2-4a48-8a46-8d90d7c17236/image.png" alt="img"></p>
<p>오늘은 낮에 책을 읽기만 하고 정리를 안했는데 정리하고 자는 나 칭찬해.... </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[네이버 5G 특화망 구축 & 기간통신사업자 승인]]></title>
            <link>https://velog.io/@varieyty_/%EB%84%A4%EC%9D%B4%EB%B2%84-5G-%ED%8A%B9%ED%99%94%EB%A7%9D-%EA%B5%AC%EC%B6%95-%EA%B8%B0%EA%B0%84%ED%86%B5%EC%8B%A0%EC%82%AC%EC%97%85%EC%9E%90-%EC%8A%B9%EC%9D%B8</link>
            <guid>https://velog.io/@varieyty_/%EB%84%A4%EC%9D%B4%EB%B2%84-5G-%ED%8A%B9%ED%99%94%EB%A7%9D-%EA%B5%AC%EC%B6%95-%EA%B8%B0%EA%B0%84%ED%86%B5%EC%8B%A0%EC%82%AC%EC%97%85%EC%9E%90-%EC%8A%B9%EC%9D%B8</guid>
            <pubDate>Wed, 29 Dec 2021 01:57:30 GMT</pubDate>
            <description><![CDATA[<h1 id="네이버-5g-특화망-1호-기업--기간통신사업자-승인">네이버, 5G 특화망 1호 기업 &amp; 기간통신사업자 승인</h1>
<hr>
<ul>
<li><p>네이버클라우드가 5G 이동통신 특화망 주파수 할당과 기간통신사업이 28일에 등록됐다고 밝혔다</p>
</li>
<li><p>이는 경기 성남시에 들어서는 네이버 제 2사옥 내에 5G 특화망을 구축할 예정이다</p>
<blockquote>
<p>아래는 기사 중 발췌내용이다.</p>
<p>네이버랩스가 개발한 자율주행 ‘브레인리스 로봇’을 운용하기 위해서다. 이 로봇은 상황 판단에 쓰인 내장 컴퓨팅 처리 장치가 없다. 대신 5G 초저지연 네트워크를 통해 클라우드를 로봇 두뇌로 쓴다. 제작 비용과 배터리 소모량이 적은 게 특징이다. 네이버는 브레인리스 로봇을 사옥 내 택배·음료 배달 등에 쓸 예정이다.</p>
</blockquote>
</li>
<li><p>통신사업자가 아닌 기업이 직접 5G망을 구축한다는 점에서 아주 놀랍다....</p>
<p>뉴스링크 : <a href="https://n.news.naver.com/mnews/article/015/0004645826?sid=105">https://n.news.naver.com/mnews/article/015/0004645826?sid=105</a></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴퓨터 네트워크 #1(네트워크 기본지식)]]></title>
            <link>https://velog.io/@varieyty_/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-1%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EB%B3%B8%EC%A7%80%EC%8B%9D</link>
            <guid>https://velog.io/@varieyty_/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-1%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EB%B3%B8%EC%A7%80%EC%8B%9D</guid>
            <pubDate>Tue, 28 Dec 2021 04:37:21 GMT</pubDate>
            <description><![CDATA[<h1 id="컴퓨터-네트워크">컴퓨터 네트워크</h1>
<h1 id="네트워크-기본지식">(네트워크 기본지식)</h1>
<hr>
<p><img src="https://images.velog.io/images/varieyty_/post/790fa64f-7267-4b71-85a4-33a7496a4a68/image.png" alt=""></p>
<h3 id="introduction">Introduction</h3>
<p>🧱🔨 아무것도 모르는 바보인 나는 오늘부터 컴퓨터 네트워크를 공부하기로 했다.</p>
<p>처음부터 전공서적을 보면 화가 나니 easy한 책으로 시작해보자!</p>
<p>읽을 책은 모두의 네트워크(미즈구치 카츠야 지음, 이승룡 옮김)이다!</p>
<hr>
<h4 id="컴퓨터-네트워크란">컴퓨터 네트워크란?</h4>
<ul>
<li>위키백과상에는 노드들이 자원을 공유할 수 있게 하는 디지털 전기통신망, 분산되어 있는 컴퓨터를 통신망으로 연결한 것을 말한다. 기술되어있다.</li>
</ul>
<blockquote>
<p>Q) 그럼 네트워크는 뭔데?</p>
<p>A) 많은 내용들을 정리해보면 결국 어떤 것들을 연결시키는 관계의 묶음이다.</p>
</blockquote>
<ul>
<li><p>즉, 컴퓨터 네트워크란 컴퓨터 간의 네트워크를 연결한 것이다.</p>
</li>
<li><p>네트워크를 통해 할 수 있는 것은?</p>
<ul>
<li>컴퓨터 간의 데이터 전송, 웹 사이트 열람, 메일 송수신 etc..</li>
<li>cf) 인터넷 : 전 세계의 모든 네트워크를 연결해 놓은 거대 네트워크</li>
</ul>
</li>
</ul>
<h4 id="패킷이란">패킷이란?</h4>
<blockquote>
<p>네트워크나 인터넷에서 데이터를 주고 받으려면 규칙이 있어야한다.</p>
</blockquote>
<ul>
<li><p>이 규칙에서 패킷(packet)을 사용</p>
</li>
<li><p>패킷의 정의</p>
<ul>
<li><p>네트워크를 통해 전송하기 쉽도록 자른 데이터의 전송단위이다.</p>
<blockquote>
<p>Q) 작게 자르는 이유는?
A) 큰 데이터를 그대로 보내게 되면 네트워크 대역폭을 많이 점유해서 다른 패킷의 흐름을 막을 위험이 발생한다. 이를 방지 위해 패킷을 작게 나누어서 전송한다.</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>그러나 작게 자른 패킷을 무작정 보내기만 하면 받았을 때 원본이 무엇인지 모르는 문제가 발생</p>
</li>
<li><p>따라서 목적지에서는 잘게 나누어서 온 패킷을 나누기 전 상태로 돌리는 작업이 필요함</p>
</li>
<li><p>=&gt; 송신측에서 수신 측으로 패킷을 보낼 때 각 패킷에 순서대로 번호를 붙여서 보냄</p>
</li>
<li><p>이는 디지털 데이터라 가능하다아아</p>
</li>
</ul>
<h4 id="디지털-데이터란">디지털 데이터란?</h4>
<ul>
<li>0과 1의 집합</li>
<li>0과 1의 정보를 나타내는 최소 단위를 비트(bit)라 한다.</li>
<li>이러한 비트를 8개를 모은 것을 바이트(byte)라고 한다.
(즉, 8비트 = 1바이트)</li>
<li>컴퓨터는 기본적으로 바이트 단위로 데이터를 읽고 쓴다.</li>
</ul>
<blockquote>
<p>Q) 0과 1로만 이루어져 있는 디지털 데이터로 문자등을 어떻게 입력할까?</p>
</blockquote>
<ul>
<li>숫자와 문자의 대응표를 미리 만들어놓았기 때문(문자코드, character code)</li>
<li>대표적으로 ASCII(아스키)코드가 있음.</li>
</ul>
<h4 id="lan-and-wan">LAN and WAN</h4>
<ul>
<li>네트워크는 접속할 수 있는 범위에 따라 크게 두 종류로 분류 가능<ul>
<li>LAN(Local Area Network) : 가정, 사무실같이 지리적으로 특정 지역을 범위로 하는 네트워크</li>
<li>WAN(Wide Area Network) : 지리적으로 넓은 범위에 구축된 네트워크</li>
</ul>
</li>
<li>WAN은 인터넷 서비스 제공자(ISP, Internet Service Provider)가 제공하는 서비스를 사용하여 구축된 네트워크라고도 말할 수 있음, 랜과 랜을 연결하는 것으로 생각해도 OK.</li>
</ul>
<blockquote>
<p>Q) ISP가 모에요? </p>
<p>A) 인터넷 상용 서비스 사업을 하고 있는 KT, U+, SK와 같은 사업자.</p>
</blockquote>
<table>
<thead>
<tr>
<th></th>
<th>LAN</th>
<th>WAN</th>
</tr>
</thead>
<tbody><tr>
<td>범위</td>
<td>좁다(건물이나 특정 지역)</td>
<td>넓다(랜과 랜 연결)</td>
</tr>
<tr>
<td>속도</td>
<td>빠름</td>
<td>느림</td>
</tr>
<tr>
<td>오류</td>
<td>적다</td>
<td>많다</td>
</tr>
</tbody></table>
<h4 id="가정에서-하는-랜-구성">가정에서 하는 랜 구성</h4>
<ul>
<li>가정에서 인터넷을 사용하기 위해서는 ISP, 인터넷 회선을 결정해야함</li>
<li>ISP(인터넷 서비스 제공자와 네트워크 연결을 위해서는 공유기가 필요!</li>
<li>인터넷 공유기를 통해 내부 인터넷망을 구성하고 다양한 기기를 연결하여 사용 가능<ul>
<li>연결방식은 랜케이블의 필요여부에 따라 유선과 무선으로 나뉨</li>
<li>이를 유선랜, 무선랜이라 칭함</li>
</ul>
</li>
</ul>
<h4 id="회사에서-하는-랜-구성">회사에서 하는 랜 구성</h4>
<ul>
<li>가정에서의 랜 구성과 다르게 DMZ라는 네트워크 영역이 추가 됨</li>
</ul>
<blockquote>
<p>Q) DMZ?</p>
<p>A) Demilitarized Zone의 약어로 외부에 공개하기 위한 네트워크, </p>
<p>주로 웹 서버, 메일 서버, DNS 서버를 공개 </p>
</blockquote>
<ul>
<li>회사에서 서버를 운영하기 위해서 서버를 사내에 설치하거나 데이터센터에 두거나 클라우드에 둘 수 있다.</li>
</ul>
<p><code>데이터 센터</code> : 대량의 데이터를 보관하기 위해 데이터 센터 서버나 네트워크 기기를 설치한 전용 시설</p>
<p><code>클라우드</code> : 인터넷을 통해 SW나 하드웨어 등의 컴퓨팅 서비스를 제공하는 것으로 인터넷에 접속하기만 하면 언제 어디서든 사용 가능</p>
<blockquote>
<p>사내 또는 데이터  센터에 서버를 두고 운영하는 것을 온프레미스(on-premise)라 칭함.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ]1747 소수&팰린드롬]]></title>
            <link>https://velog.io/@varieyty_/BOJ1747-%EC%86%8C%EC%88%98%ED%8C%B0%EB%A6%B0%EB%93%9C%EB%A1%AC</link>
            <guid>https://velog.io/@varieyty_/BOJ1747-%EC%86%8C%EC%88%98%ED%8C%B0%EB%A6%B0%EB%93%9C%EB%A1%AC</guid>
            <pubDate>Fri, 24 Dec 2021 05:45:13 GMT</pubDate>
            <description><![CDATA[<p>출처 : <a href="https://www.acmicpc.net/problem/1747">https://www.acmicpc.net/problem/1747</a></p>
<h3 id="문제">문제</h3>
<hr>
<blockquote>
<p>어떤 수와 그 수의 숫자 순서를 뒤집은 수가 일치하는 수를 팰린드롬이라 부른다. 예를 들어 79,197과 324,423 등이 팰린드롬 수이다.</p>
</blockquote>
<h3 id="입력">입력</h3>
<hr>
<blockquote>
<p>어떤 수 N (1 ≤ N ≤ 1,000,000)이 주어졌을 때, N보다 크거나 같고, 소수이면서 팰린드롬인 수 중에서, 가장 작은 수를 구하는 프로그램을 작성하시오.</p>
</blockquote>
<h3 id="소스코드">소스코드</h3>
<pre><code class="language-python">n = int(input())
arr = [True] * (1004001)
arr[0] = False
arr[1] = False
for i in range(2, int(1004000 ** 0.5) + 1):
    if arr[i] == True:
        j = 2
        while i * j &lt;= 1004000 :
            arr[i * j] = False
            j += 1

for i in range(n, 1004000):
    if (arr[i] == True) and (str(i) == str(i)[::-1]):
        print(i)
        break
</code></pre>
<p> 해당 문제는 소수판별, 팰린드롬여부 두가지를 체크해야한다.</p>
<p>📌소수의 판별여부는 2중 for문을 사용하는 법, n의 제곱근까지의 범위내에서 판별하는 법 등이 있지만 시간복잡도가 가장 낮은에라토스테네스의 체를 사용하여 판별하였다. </p>
<p>📌 팰린드롬 check : 뒤집었을 때 원래 문자와 똑같으면 팰린드롬이라 하는데 파이썬의 경우 [::-1]을 사용하면 문자가 거꾸로 뒤집혀 이를 사용하였다.</p>
<p>⏰ 회고 : 처음엔 문제의 제한 범위인 1&lt;=n&lt;=1,000,000을 보고 백만까지만 리스트를 생성하였는데 계속틀렸다길래 맞왜틀 시전했는데 입력은 100만까지여도 n보다 큰 소수 출력이 목표이기에 백만보다 큰 소수의 범위까지 리스트 생성을 해줘야한다 ! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[마이데이터 사업]]></title>
            <link>https://velog.io/@varieyty_/%EB%A7%88%EC%9D%B4%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%82%AC%EC%97%85</link>
            <guid>https://velog.io/@varieyty_/%EB%A7%88%EC%9D%B4%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%82%AC%EC%97%85</guid>
            <pubDate>Fri, 03 Dec 2021 00:32:22 GMT</pubDate>
            <description><![CDATA[<hr>
<h2 id="마이데이터💰">마이데이터💰</h2>
<p>마이데이터 사업이란 ? </p>
<ul>
<li>&#39;본인신용정보관리업&#39;으로 개인이 본인의 데이터를 관리하고 주체적으로 이용할 수 있께 한 제도이다.</li>
<li>즉, 이제부터는 개인이 자신의 어떤 데이터를 제공할지 선택이 가능하다.</li>
<li>이전까지는 기업이 고객의 ID/PW를 통해 금융기관에 대신 접속해 데이터를 얻었지만 마이데이터 사업이 시작되면서 허가를 받은 기업만 API형태로 가져오는 방식으로 개인 정보가 기업에 제공된다.</li>
<li>12/1일부터 은행, 금융사, 카드사, 핀테크 회사 등이 마이데이터 사업을 시작했으며 주로 맞춤형 금융 서비스에 집중하여있다.</li>
</ul>
<h2 id="민간인증서">민간인증서</h2>
<blockquote>
<p> 마이데이터 사업에는 인증서가 필수 ! </p>
</blockquote>
<ul>
<li>마이데이터 서비스는 공동인증서를 제외한 1개이상의 민간인증서를 연동해야한다.</li>
<li>따라서 민간인증서 시장도 커질 전망인데, 현재 네이버가 가장 두각을 드러내고 있다.</li>
</ul>
<h2 id="정리">정리</h2>
<blockquote>
<p>내년부터는 국세청, 행안부, 건강보험공단 등 공공기관의 데이터도 마이데이터 사업자들에게 제공될 계획이다, 점점 더 많은 데이터들이 모일텐데 어떤 차별화된 서비스가 제공될지 기대해보는 것도 재미있을 것 같다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Basic of Regression]]></title>
            <link>https://velog.io/@varieyty_/Basic-of-Regression</link>
            <guid>https://velog.io/@varieyty_/Basic-of-Regression</guid>
            <pubDate>Tue, 30 Nov 2021 05:42:06 GMT</pubDate>
            <description><![CDATA[<h1 id="회귀-기초">회귀 기초</h1>
<hr>
<ul>
<li>아래는 일반적인 문제해결 절차이다</li>
</ul>
<p><img src="https://images.velog.io/images/varieyty_/post/04687235-d290-4f60-9c0f-dcd2491d13f9/image.png" alt=""></p>
<ul>
<li>기반이 데이터라면?</li>
</ul>
<p><img src="https://images.velog.io/images/varieyty_/post/b82d66e6-0ce9-427a-a568-b33ce5ee390e/image.png" alt=""></p>
<ul>
<li>모델 스스로 데이터를 기반으로 변화에 대응가능</li>
</ul>
<p><img src="https://images.velog.io/images/varieyty_/post/d58ebf31-92b5-4137-9005-ff728afa81d8/image.png" alt=""></p>
<ul>
<li>심지어 머신러닝을 통해 우리가 배울수도 있다!</li>
</ul>
<p><img src="https://images.velog.io/images/varieyty_/post/dd780327-b8f8-431e-b481-d4981147612a/image.png" alt=""></p>
<blockquote>
<p>만약 주택의 넓이와 가격이라는 데이터가 있고 주택가격을 예측한다면?</p>
</blockquote>
<p>=&gt; 학습데이터에 라벨이 있으므로 지도학습이고, 주택 가격을 연속된 값으로 예측하는 것이므로 회귀(Regression)문제임.</p>
<ul>
<li>입력변수 x가 하나인 경우, 선형회귀(Linear Regression)문제는 주어진 학습데이터와 가장 잘 맞는 Hypothesis 함수 h를 찾는 문제가 됨.</li>
</ul>
<h2 id="ols">OLS</h2>
<p>OLS : Ordinary Linear Least Square</p>
<ul>
<li><p>Y = AX를 풀어서 구함</p>
</li>
<li><p>n by n 매트릭스가 아닌경우 그냥 트랜스포즈된걸 곱함.(곱해서 n by n 으로 사이즈 맞춰주려고)</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/varieyty_/post/98406906-9291-451b-b7cc-53e54c7858a0/image.png" alt=""></p>
<ul>
<li>성능은 E(error)를 사용해 파악가능.</li>
</ul>
<pre><code class="language-python">import pandas as pd
import statsmodels.formula.api as smf

data = {&#39;x&#39; : [1, 2, 3, 4, 5], &#39;y&#39;:[1, 3, 4, 6, 5]}
df = pd.DataFrame(data)

lm_model = smf.ols(formula=&#39;y ~ x&#39;, data=df).fit()
# &#39;y ~ x&#39;  : y=ax+b 

lm_model.params
# output : 
Intercept    0.5
x            1.1
dtype: float64

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

plt.figure(figsize=(12,10))
sns.lmplot(x=&#39;x&#39;, y=&#39;y&#39;, data=df);
plt.xlim([0, 5])</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/4fe63e73-5240-4914-b2b4-f8cacd3a3233/image.png" alt=""></p>
<h3 id="잔차-평가residue">잔차 평가(residue)</h3>
<ul>
<li>잔차는 평균이 0인 정규분포를 따르는 것이어야함</li>
<li>잔차 평가는 잔차의 평균이 0이고 정규분포를 따르는지 확인</li>
</ul>
<pre><code class="language-python">resid = lm_model.resid
resid
# output : 
0   -0.6
1    0.3
2    0.2
3    1.1
4   -1.0</code></pre>
<h3 id="결정계수-r-squared">결정계수 R-Squared</h3>
<p><img src="https://images.velog.io/images/varieyty_/post/e8624d6a-51d5-4fee-910e-ed3f4fcbddd9/image.png" alt=""></p>
<ul>
<li><p>초록선이 평균 (mu)</p>
</li>
<li><p>y_hat은 예측된 값</p>
</li>
<li><p>예측 값과 실제 값(y)가 일치하면 결정계수는 1이 됨(즉, 결정계수가 높을 수록 좋은 모델)</p>
<pre><code class="language-python">import numpy as np
</code></pre>
</li>
</ul>
<p>mu = np.mean(df[&#39;y&#39;])</p>
<p>y_hat = lm_model.predict()
np.sum((y_hat -mu) ** 2) / np.sum((y - mu) ** 2)</p>
<h1 id="라이브러리-사용">라이브러리 사용</h1>
<p>lm_model.rsquared
sns.distplot(resid, color=&#39;black&#39;)</p>
<pre><code>
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[하이퍼 파라미터 튜닝]]></title>
            <link>https://velog.io/@varieyty_/%ED%95%98%EC%9D%B4%ED%8D%BC-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-%ED%8A%9C%EB%8B%9D</link>
            <guid>https://velog.io/@varieyty_/%ED%95%98%EC%9D%B4%ED%8D%BC-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-%ED%8A%9C%EB%8B%9D</guid>
            <pubDate>Tue, 30 Nov 2021 05:34:10 GMT</pubDate>
            <description><![CDATA[<h1 id="하이퍼파라미터-튜닝">하이퍼파라미터 튜닝</h1>
<hr>
<h3 id="교차검증">교차검증</h3>
<ul>
<li><p>고정된 train, test set을 가지고 모델을 학습시키는 과정을 반복하면 결국 오버피팅이 일어난다</p>
</li>
<li><p>이를 해결하고자 train set을 다시 train+validaion으로 분리 후 validation set을 이용해 검증한다</p>
</li>
<li><p>장점</p>
<ul>
<li>모든 데이터셋을 훈련에 활용할 수 있다</li>
<li>모든 데이터셋을 평가에 활용할 수 있다, 즉 데이터의 편중 방지 가능</li>
</ul>
</li>
<li><p>단점</p>
<ul>
<li>반복회수가 많아 모델의 훈련/평가 시간이 오래 걸린다.</li>
</ul>
</li>
</ul>
<p>(단순히 train, test로만 데이터를 나누는건 hold out이라함)</p>
<p><img src="https://images.velog.io/images/varieyty_/post/45d3aa0a-d026-482c-aa00-47a2572bcc79/image.png" alt=""></p>
<ul>
<li>train data를 k등분해서 k-1개로 train하고 1개로 validation하고 평균을 취함</li>
</ul>
<pre><code class="language-python">import numpy as np
from sklearn.model_selection import KFold

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
kf = KFold(n_split=2)

print(kf.get_n_splitx(X))
print(kf)
for train_idx, test_idx in kf.split(X):
    print(&#39;Train idx : &#39;, train_idx) # 2,3 번인덱스를 처음 그다음 0, 1 
    print(&#39;Test idx : &#39;, test_idx)
    print(&#39;-----train data-----&#39;)
    print(X[train_idx])
    print(&#39;-----validation data-----&#39;)
    print(X[test_idx])</code></pre>
<ul>
<li>와인데이터로 K-fold! </li>
</ul>
<pre><code class="language-python">import pandas as pd
red_wine = pd.read_csv(&#39;./data/winequality-red.csv&#39;, sep=&#39;;&#39;)
white_wine = pd.read_csv(&#39;./data/winequality-white.csv&#39;, sep=&#39;;&#39;)
red_wine[&#39;color&#39;] = 1
white_wine[&#39;color&#39;] = 0
wine = pd.concat([red_wine, white_wine])

wine[&#39;taste&#39;] = [1. if grade&gt;5 else 0 for grade in wine[&#39;quality&#39;]]
X = wine.drip([&#39;taste&#39;, &#39;quality&#39;], axis=1)
y = wine[&#39;taste&#39;]</code></pre>
<pre><code class="language-python">from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

X_train, X_test, y_train, y_test = train_test_split(X_mms_pd, y, test_size=0.2, random_state=42)
wine_tree = DecisionTreeClassifier(max_depth=2, random_state=42)
wine_tree.fit(X_train, y_train)

y_pred_tr = wine_tree.predict(X_train)
y_pred_test = wine_tree.predict(X_test)

print(&#39;Train Acc : &#39;, accuracy_score(y_train, y_pred_tr))
print(&#39;Train Acc : &#39;, accuracy_score(y_test, y_pred_test))</code></pre>
<blockquote>
<p> 데이터를 이렇게 분리하는게 최선인가? 저 정확도를 어떻게 신뢰할 수 있는가?</p>
</blockquote>
<pre><code class="language-python">from sklearn.model_selection import KFold

kfold = KFold(n_split=5)
wine_tree_cv = DecisionTreeClassifier(max_daepth=2, random_state=42)
# KFold는 인덱스를 반환함

for train_idx, test_idx in kfold.split(X):
    print(len(train_idx), len(test_idx))

cv_accuracy = []
for train_idx, test_idx in kfold.split(X):
    X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
    y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
    wine_tree_cv.fit(X_train, y_train)
    pred = wine_tree_cv.predict(X_test)
    cv_acvvuracy.append(accuracy_score(y_test, pred))

cv_accuracy</code></pre>
<ul>
<li>각 acc의 분산이 크지 않다면 평균을 대표값으로 한다</li>
</ul>
<pre><code class="language-python">np.mean(cv_accuracy)

from sklearn.model_selection from StratifiedKFold
skfold = StratifiedKFold(n_splits=5)
wine_tree_cv = DecisionTreeClassifier(max_daepth=2, random_state=42)

cv_accuracy = []
# 어떤걸 기준으로 stratified하는지 설정해야함 여기서는 y
for train_idx, test_idx in skfold.split(X, y):
    X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
    y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
    wine_tree_cv.fit(X_train, y_train)
    pred = wine_tree_cv.predict(X_test)
    cv_acvvuracy.append(accuracy_score(y_test, pred))</code></pre>
<ul>
<li>cross validation을 보다 간편히 하는 법!</li>
</ul>
<pre><code class="language-python">from sklearn.model_selection import cross_val_score

skfold = StratifiedKFold(n_solits=5)
wine_tree_cv = DecisionTreeClassifier(max_depth=2, random_state=42)

cross_val_score(wine_tree_cv, X, y, scoring=None, cv=skfold)</code></pre>
<ul>
<li>train score와 함께 보고 싶다면</li>
</ul>
<pre><code class="language-python">from sklearn.model_selection import cross_validate
cross_validate(wine_tree_cv, X, y, scoring=None, cv=skfod, return_train_score=True)</code></pre>
<h3 id="하이퍼파라미터-튜닝-1">하이퍼파라미터 튜닝</h3>
<p><img src="https://images.velog.io/images/varieyty_/post/25885d76-f6c7-44ce-adc6-c4575eee07f7/image.png" alt=""></p>
<ul>
<li><p>모델의 성능을 확보하기 위해 조절하는 설정 값</p>
</li>
<li><p>GridSearchCV : 결과를 확인하고 싶은 파라미터만 정의하면 됨 </p>
</li>
</ul>
<pre><code class="language-python">from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassfier

prarams = {&#39;max_depth&#39; : [2, 4, 7, 10]}
wine_tree = DecisionTreeClassifier(max_depth=2, random_state=42)

# train_test_split도 알아서 해줌
gridsearch = GridSearchCV(estimator=wine_tree, param_grid=params, cv=5)
gridsearch.fit(X, y)</code></pre>
<pre><code class="language-python"># GridSearchCV의 결과
import pprint

pp = pprint.PrettyPrinter(indent=4)
pp.pprint(gridsearch.cv_results_)</code></pre>
<pre><code class="language-python"># 최적의 성능을 가진 모델은?
gridsearch.best_estimator_
# 최고의 정확도는?
gridsearch.best_score_
# 최고의 파라미터는?
gridsearch.best_params_</code></pre>
<ul>
<li>만약 pipeline을 적용한 모델에 GridSearch를 적용하고 싶으면?</li>
</ul>
<pre><code class="language-python">from sklearn.pipeline import Pipeline
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import StandardScaler

estimators = [(&#39;scaler&#39;, StandardScaler()),
             (&#39;clf&#39;, DecisionTreeClassifier())]
pipe = Pipeline(estimators)

param_grid = [{&#39;max__depth&#39; : [2, 4, 7, 10]}]
Gridsearch = GridSearchCV(estimator=pipe, param_grid=param_grid, cv=5)
Gridsearch.fit(X, y)</code></pre>
<ul>
<li>표로 성능 확인해보자</li>
</ul>
<pre><code class="language-python">import pandas as pd

score_df = pd.DataFrame(GridSearch.cv_results_)
score_df[&#39;params&#39;, &#39;rank_test_score&#39;, &#39;mean_test_score&#39;, &#39;std_test_score&#39;]</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[모델평가]]></title>
            <link>https://velog.io/@varieyty_/%EB%AA%A8%EB%8D%B8%ED%8F%89%EA%B0%80</link>
            <guid>https://velog.io/@varieyty_/%EB%AA%A8%EB%8D%B8%ED%8F%89%EA%B0%80</guid>
            <pubDate>Wed, 17 Nov 2021 02:52:21 GMT</pubDate>
            <description><![CDATA[<hr>
<blockquote>
<p>우리가 만든 모델은 얼마나 좋은 것일까?</p>
</blockquote>
<ul>
<li><p>데이터 수집/가공/변환 ↔ 모델학습/예측 ↔ 평가</p>
</li>
<li><p>모델을 좋다, 그저그렇다, 나쁘다 등으로 평가할 방법은 없다.</p>
</li>
<li><p>대부분 다양한 모델, 다양한 파라미터를 두고, 상대적으로 비교한다.</p>
</li>
<li><p>회귀모델들은 실제 값과의 error를 가지고 계산</p>
</li>
<li><p>분류 모델은 평가 항목이 조금 많음</p>
</li>
</ul>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>오차행렬</td>
<td>Confusion Matrix</td>
</tr>
<tr>
<td>정밀도</td>
<td>Precision</td>
</tr>
<tr>
<td>재현율</td>
<td>Recall</td>
</tr>
<tr>
<td>F1 score</td>
<td>-</td>
</tr>
<tr>
<td>ROC AUC</td>
<td>-</td>
</tr>
</tbody></table>
<ul>
<li>이진 분류 모델의 평가</li>
</ul>
<p><img src="https://images.velog.io/images/varieyty_/post/33d12f52-323d-495a-8fdc-e9280c23db51/image-20211116133327113.png" alt=""></p>
<ul>
<li>FP는 type 1 error FN은 type 2 error이고 정확도는 아래와 같다. (전체 데이터 중 맞게 예측한 것의 비율)</li>
</ul>
<p>$$
accuracy = {TP + TN \over \ TP + TN + FP + FN}
$$</p>
<ul>
<li>Precision : 양성이라고 예측한 것 중에서 실제 양성의 비율<ul>
<li>정밀도를 높이려면 확실할 때만 정답이라고 하면 됨</li>
<li>Threshold를 높게 설정하면됨</li>
<li>대표적 예시 : 중요한메일을 스팸메일이라고  예측하면 안됨, 그럴 떄 봐야하는게 Precision</li>
</ul>
</li>
</ul>
<p>$$
 precision = {TP\over\ TP + FP}
$$</p>
<ul>
<li><p>Recall(TPR, True Positive Ratio, sensitivity) : 참인 데이터들 중에서 참이라고 예측한 것 </p>
<ul>
<li><p>싹다 참이라고 말하면 올라감</p>
</li>
<li><p>Threshold를 낮게 설정하면됨</p>
</li>
<li><p>대표적 예시 : 암인 환자를 암이라 맞출확률을 볼 때 </p>
</li>
</ul>
</li>
</ul>
<p>$$
Recall = {TP\over\ TP + FN}
$$</p>
<ul>
<li>Fall-Out(FPR, False position ratio) : 실제 양성이 아닌데, 양성이라고 잘못 예측한 경우</li>
</ul>
<p>$$
fallout = {FP \over \ FP+TN}
$$</p>
<blockquote>
<p>분류모델은 그 결과를 속할 비율(확률)을 반환한다</p>
</blockquote>
<ul>
<li>predict_prob는 0.5를 기준으로 작으면 0 크면 1을 반환</li>
<li>기준이되는 0.5를 threshold라고 함.</li>
<li>Recall과 Precision은 서로 영향을 주기 때문에 한 쪽을 극단적으로 높게 설정하면 안됨.</li>
</ul>
<h3 id="f1--score">F1- Score</h3>
<p><img src="https://images.velog.io/images/varieyty_/post/7f845433-cf50-409f-98a1-ed57f804756c/image-20211116140340834.png" alt=""></p>
<ul>
<li>조화평균임 ! </li>
</ul>
<h3 id="roc-와-auc">ROC 와 AUC</h3>
<ul>
<li>ROC 곡선</li>
</ul>
<p><img src="https://images.velog.io/images/varieyty_/post/e29ec89a-ffdb-4823-8d30-fb0c743a0467/image-20211116140609217.png" alt=""></p>
<ul>
<li>fall-out이 여러개라면 recall값이 작은걸 선택해서 그림</li>
<li>완벽하게 분류했다면 아래와 같은 곡선을 그림, AUC는 그래프의 면적을 뜻함</li>
</ul>
<p><img src="https://images.velog.io/images/varieyty_/post/f1db65c5-51c7-4116-8602-fb8e72016890/image-20211116140834755.png" alt=""></p>
<ul>
<li>적당히 맞췄다면 아래와 같은 곡선이 나타난다
<img src="https://images.velog.io/images/varieyty_/post/946debba-f93c-4670-b5f2-f07dbdfd4271/image-20211116140941955.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Pipeline]]></title>
            <link>https://velog.io/@varieyty_/Pipeline</link>
            <guid>https://velog.io/@varieyty_/Pipeline</guid>
            <pubDate>Sun, 14 Nov 2021 15:47:01 GMT</pubDate>
            <description><![CDATA[<hr>
<blockquote>
<p>지금까지 불편한 점은?</p>
</blockquote>
<ul>
<li>코드를 하나씩 실행하다보면 혼돈이 크다</li>
<li>Jupyter Notebook 상황에서 데이터의 전처리와 여러 알고리즘의 반복실행, 하이퍼 파라미터의 튜닝을 과정을 번갈아 하다 보면 코드의 실행 순서에 혼돈이 있을 수 있다.</li>
<li>이런 경우 Class로 만들어 진행해도 되지만 sklearn에는 Pipeline이라는 기능이 있다.</li>
</ul>
<pre><code class="language-python">import pandas as pd

red_wine = pd.read_csv(&#39;./data/winequality-red.csv&#39;, sep=&#39;;&#39;)
white_wine = pd.read_csv(&#39;./data/winequality-white.csv&#39;, sep=&#39;;&#39;)

red_wine[&#39;color&#39;] = 1
white_wine[&#39;color&#39;] = 0

wine = pd.concat([red_wine, white_wine])

X = wine.drop([&#39;color&#39;], axis=1)
y= wine[&#39;color&#39;]</code></pre>
<blockquote>
<p>레드/화이트 와인 분류기의 동작 Process</p>
</blockquote>
<p><img src="https://images.velog.io/images/varieyty_/post/1a456089-31b3-4595-8dd4-57584b624997/image.png" alt=""></p>
<ul>
<li><p>여기서 test_train_split은 Pipeline 내부가 아니다.</p>
<blockquote>
<p>이 Pipeline을 코드로 구현한다면?</p>
</blockquote>
</li>
</ul>
<pre><code class="language-python">from sklearn.pipeline import Pipeline
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import StandardScaler

estimators = [(&#39;scaler&#39;, StandardScaler()),
             (&#39;clf&#39;, DecisionTreeClassifier())]
pipe = Pipeline(estimators)</code></pre>
<pre><code class="language-python">pipe.steps

#output:
[(&#39;scaler&#39;, StandardScaler()), (&#39;clf&#39;, DecisionTreeClassifier())]

# setparams를 이용해 파라미터를 바꿀 수 있다

pipe.set_params(clf__max_depth=2)
pipe.set_params(clf__random_state=42)

# &#39;스탭이름&#39; + __(언더바 2개) + 속성이름 </code></pre>
<ul>
<li>Pipeline을 이용한 분류기 구성</li>
</ul>
<pre><code class="language-python">from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)

pipe.fit(X_train, y_train)

from sklearn.metrics import accuracy_score

y_pred_tr = pipe.predict(X_train)
y_pred_test = pipe.predict(X_test)

print(&#39;Train Acc : &#39;, accuracy_score(y_train, y_pred_tr))
print(&#39;Test Acc : &#39;, accuracy_score(y_test, y_pred_test))

# output: 
    Train Acc :  0.9545891860688859
    Test Acc :  0.9584615384615385</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Decision Tree를 이용한 와인데이터 분석]]></title>
            <link>https://velog.io/@varieyty_/Decision-Tree%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%99%80%EC%9D%B8%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@varieyty_/Decision-Tree%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%99%80%EC%9D%B8%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Sun, 14 Nov 2021 15:21:19 GMT</pubDate>
            <description><![CDATA[<hr>
<h3 id="wine">Wine</h3>
<ul>
<li>분류 문제에서 많이 사용하는 iris만큼 알려지지는 않았지만, 그래도 많이 사용함!</li>
<li>인류 역사에서 최초의 술로 알려져 있다</li>
<li>플라톤이 와인 짱 좋아함</li>
</ul>
<table>
<thead>
<tr>
<th>fixed acidity : 고정산도</th>
<th>total sulfur dioxide : 총 이산화황</th>
</tr>
</thead>
<tbody><tr>
<td>volatile acidity : 휘발성산도</td>
<td>density : 밀도</td>
</tr>
<tr>
<td>citric acid : 시트르산</td>
<td>pH</td>
</tr>
<tr>
<td>residual sugar : 잔류 당분</td>
<td>sulphates : 황산염</td>
</tr>
<tr>
<td>chlorides : 염화물</td>
<td>alcohol</td>
</tr>
<tr>
<td>free sulfur dioxide : 자유 이산화황</td>
<td>quality : 0~10 (높을수록 좋은 품질)</td>
</tr>
</tbody></table>
<pre><code class="language-python">import pandas as pd

red_wine = pd.read_csv(&#39;./data/winequality-red.csv&#39;, sep=&#39;;&#39;)
white_wine = pd.read_csv(&#39;./data/winequality-white.csv&#39;, sep=&#39;;&#39;)

# 레드와인과 화이트와인 합치기
red_wine[&#39;color&#39;] = 1
white_wine[&#39;color&#39;] = 0

wine = pd.concat([red_wine, white_wine])
wine[&#39;quality&#39;].unique()
#output : 
    array([5, 6, 7, 4, 8, 3, 9], dtype=int64)

# 퀄리티를 기준으로 개수를 알아보자     
import plotly.express as px
fig = px.histogram(wine, x=&#39;quality&#39;)
fig.show()    </code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/031d0157-28ce-4a47-9839-133762e65e55/image-20211115001018805.png" alt=""></p>
<pre><code class="language-python"># 레드, 화이트 각각 봐보자

fig = px.histogram(wine, x=&#39;quality&#39;, color=&#39;color&#39;)
fig.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/0afad45e-0219-41bc-a752-c484dea634b6/image-20211115001038838.png" alt=""></p>
<pre><code class="language-python"># 라벨 분리
X = wine.drop([&#39;color&#39;], axis=1)
y = wine[&#39;color&#39;]

# 데이터셋 분리
from sklearn.model_selection import train_test_split
import numpy as np

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 42)
np.unique(y_train, return_counts=True)

# output:
(array([0, 1], dtype=int64), array([3939, 1258], dtype=int64))

# 훈련용과 테스트용이 레드/화이트 와인에 따라 어느정도 구분됐는지 확인
import plotly.graph_objects as go

fig = go.Figure()
fig.add_trace(go.Histogram(x=X_train[&#39;quality&#39;], name=&#39;Train&#39;))
fig.add_trace(go.Histogram(x=X_test[&#39;quality&#39;], name=&#39;Test&#39;))

fig.update_layout(barmode=&#39;overlay&#39;) #두개 겹쳐그린다
fig.update_traces(opacity=0.75) # 투명도
fig.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/fc25f968-9e0b-4d2c-be80-8d4611b4e175/image-20211115001131002.png" alt=""></p>
<pre><code class="language-python">from sklearn.tree import DecisionTreeClassifier

wine_tree = DecisionTreeClassifier(max_depth=2, random_state=42)
wine_tree.fit(X_train, y_train)

# 결과는 ?
from sklearn.metrics import accuracy_score

y_pred_tr = wine_tree.predict(X_train)
y_pred_test = wine_tree.predict(X_test)

print(&#39;Train Acc : &#39;, accuracy_score(y_train, y_pred_tr))
print(&#39;Test Acc : &#39;, accuracy_score(y_test, y_pred_test))
# output : 
Train Acc :  0.957475466615355
Test Acc :  0.9476923076923077</code></pre>
<h3 id="데이터-전처리---minmaxsscaler-와--standardscaler">데이터 전처리 - MinMAxsScaler 와  StandardScaler</h3>
<ul>
<li><p>근데 사실 Decision Tre에서는 영향 없음 </p>
</li>
<li><p>주로 Cost Function을 최적화할 때 유효할 때가 있음.</p>
</li>
<li><p>어떤 스케일러가 좋은지는 해봐야 안다</p>
</li>
</ul>
<pre><code class="language-python">fig = go.Figure()
fig.add_trace(go.Box(y=X[&#39;fixed acidity&#39;], name=&#39;fixed acidity&#39;))
fig.add_trace(go.Box(y=X[&#39;chlorides&#39;], name=&#39;chlorides&#39;))
fig.add_trace(go.Box(y=X[&#39;quality&#39;], name=&#39;quality&#39;))
fig.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/31247488-300e-497f-b2a9-6209d0c9a1c2/image-20211115001243627.png" alt=""></p>
<ul>
<li>이렇게 피쳐들 사이의 범위 격차가 크면 ML에선 학습이 안될 수도 있음, 안된다는건 아님 </li>
</ul>
<pre><code class="language-python">from sklearn.preprocessing import MinMaxScaler, StandardScaler

MMS= MinMaxScaler()
SS = StandardScaler()

SS.fit(X)
MMS.fit(X)

X_ss = SS.transform(X)
X_mms = MMS.transform(X)

X_ss_pd = pd.DataFrame(X_ss, columns=X.columns)
X_mms_pd = pd.DataFrame(X_mms, columns=X.columns)

fig = go.Figure()
fig.add_trace(go.Box(y=X_ss_pd[&#39;fixed acidity&#39;], name=&#39;fixed acidity&#39;))
fig.add_trace(go.Box(y=X_ss_pd[&#39;chlorides&#39;], name=&#39;chlorides&#39;))
fig.add_trace(go.Box(y=X_ss_pd[&#39;quality&#39;], name=&#39;quality&#39;))
fig.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/4c9bf9e6-dcbe-4719-a23e-8c38feba131b/image-20211115001330537.png" alt=""></p>
<ul>
<li>근데 어차피 결정나무에서는 이런 전처리 효과가 거의 없다, 그냥 해봄!</li>
</ul>
<blockquote>
<p>레드와인과 화이트와인을 구분하는 중요한 특성은 무엇일까?</p>
</blockquote>
<pre><code class="language-python">dict(zip(X_train.columns, wine_tree.feature_importances_))
# output : 
{&#39;fixed acidity&#39;: 0.0,
 &#39;volatile acidity&#39;: 0.0,
 &#39;citric acid&#39;: 0.0,
 &#39;residual sugar&#39;: 0.0,
 &#39;chlorides&#39;: 0.23383167646371428,
 &#39;free sulfur dioxide&#39;: 0.0,
 &#39;total sulfur dioxide&#39;: 0.7661683235362857,
 &#39;density&#39;: 0.0,
 &#39;pH&#39;: 0.0,
 &#39;sulphates&#39;: 0.0,
 &#39;alcohol&#39;: 0.0,
 &#39;quality&#39;: 0.0}</code></pre>
<blockquote>
<p>맛의 이진분류를 하고 quality 컬럼을 이진화 해보자!</p>
</blockquote>
<pre><code class="language-python">wine[&#39;taste&#39;] = [1. if grade&gt;5 else 0 for grade in wine[&#39;quality&#39;]]

X = wine.drop([&#39;taste&#39;], axis=1)
y = wine[&#39;taste&#39;]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

wine_tree = DecisionTreeClassifier(max_depth=2, random_state=42)
wine_tree.fit(X_train, y_train)

y_pred_tr = wine_tree.predict(X_train)
y_pred_test = wine_tree.predict(X_test)

print(&#39;Train Acc : &#39;, accuracy_score(y_train, y_pred_tr))
print(&#39;Train Acc : &#39;, accuracy_score(y_test, y_pred_test))

# output :
    Train Acc :  1.0
    Train Acc :  1.0</code></pre>
<blockquote>
<p>100%가 나오면 의심해봐야한다, 왜 이렇게 나왔을까?</p>
</blockquote>
<pre><code class="language-python">import matplotlib.pyplot as plt
import sklearn.tree as tree
plt.figure(figsize=(12, 8))
tree.plot_tree(wine_tree, feature_names=X.columns);</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/9cfa23cb-b010-49e8-b69f-6b8c84b44f8d/image-20211115001556705.png" alt=""></p>
<blockquote>
<ul>
<li>이진분류를 퀄리티 기준으로 했는데 정작 데이터프레임에 그 기준이 된 퀄리티가 남아있었고, 그걸로 학습시켜서 백프로가 됨</li>
</ul>
</blockquote>
<pre><code class="language-python">X = wine.drop([&#39;taste&#39;, &#39;quality&#39;], axis=1)
y = wine[&#39;taste&#39;]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

wine_tree = DecisionTreeClassifier(max_depth=2, random_state=42)
wine_tree.fit(X_train, y_train)

y_pred_tr = wine_tree.predict(X_train)
y_pred_test = wine_tree.predict(X_test)

print(&#39;Train Acc : &#39;, accuracy_score(y_train, y_pred_tr))
print(&#39;Train Acc : &#39;, accuracy_score(y_test, y_pred_test))
# output: 
    Train Acc :  0.7383105637868
    Train Acc :  0.7084615384615385
</code></pre>
<blockquote>
<p>그럼 어떤 와인을 맛있다고 한걸까?</p>
</blockquote>
<pre><code class="language-python">plt.figure(figsize=(12, 8))
tree.plot_tree(wine_tree, feature_names=X.columns,
              rounded=True,
               filled=True,
              );</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/25b46c3a-0357-43a3-90a2-3f613d6a8c69/image-20211115001713127.png" alt=""></p>
<ul>
<li>알콜 도수로 가오부려땅<del>~</del></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Encoder and Scaler]]></title>
            <link>https://velog.io/@varieyty_/encoder-and-scaler</link>
            <guid>https://velog.io/@varieyty_/encoder-and-scaler</guid>
            <pubDate>Sun, 14 Nov 2021 13:26:57 GMT</pubDate>
            <description><![CDATA[<hr>
<h2 id="label-encoder">Label-encoder</h2>
<ul>
<li>사이킷런에서 라벨은 숫자여야함</li>
<li>label Encoder란?</li>
<li>문자를 숫자로 바꿔줌</li>
</ul>
<pre><code class="language-python">import pandas as pd
df = pd.DataFrame({
    &#39;A&#39; : [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;a&#39;, &#39;b&#39;], 
    &#39;B&#39;: [1, 2, 2, 1, 0]
})

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit(df[&#39;A&#39;])
# df 의 A컴럼기준으로 fit

le.classes_
le.transform(df[&#39;A&#39;])

# output : array([0, 1, 2, 0, 1])

df[&#39;le_A&#39;] = le.transform(df[&#39;A&#39;])</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/d4aa67d3-5833-4fb8-bf89-ae2cf227c5e2/image.png" alt=""></p>
<ul>
<li>fit과 transform을 한번에 실행</li>
</ul>
<pre><code class="language-python">le.fit_transform(df[&#39;A&#39;])

&gt; output : array([0, 1, 2, 0, 1])

# 해당 문자가 어떻게 바뀌었는지 알려줌
le.transform([&#39;a&#39;])

# output : array([0])

# 역으로 원래 라벨을 보여줌
le.inverse_transform(df[&#39;B&#39;])
&gt; output : array([&#39;b&#39;, &#39;c&#39;, &#39;c&#39;, &#39;b&#39;, &#39;a&#39;], dtype=object)</code></pre>
<h3 id="min-max-scaler">min-max scaler</h3>
<ul>
<li><p>min-max scaling 이란?</p>
<p>서로 다른 크기를 통일하기 위해 크기를 변환하는 개념, 여기는 최소를 0 최대를 1로 변환</p>
<p>원데이터 분포를 유지하면서 정규화, outlier에 대응 잘 안됨</p>
<blockquote>
<p>$$
x&#39; = {x - min(x)\over \max(x) - min(x)}
$$
의미 : 전체길이로 나눠준다 ! </p>
</blockquote>
</li>
</ul>
<p>💍 레이텍 분수 사용법 {X\over\Y} </p>
<pre><code class="language-python">df = pd.DataFrame({
    &#39;A&#39;:[10, 20, -10, 0 ,25],
    &#39;B&#39;:[1, 2, 3, 1, 0]
})

from sklearn.preprocessing import MinMaxScaler
mms = MinMaxScaler()
mms.fit(df)

df_mms = mms.transform(df)
df_mms

# output : 
array([[0.57142857, 0.33333333],
       [0.85714286, 0.66666667],
       [0.        , 1.        ],
       [0.28571429, 0.33333333],
       [1.        , 0.        ]])

# 역변환
mms.inverse_transform(df_mms)

# output:
array([[ 10.,   1.],
       [ 20.,   2.],
       [-10.,   3.],
       [  0.,   1.],
       [ 25.,   0.]])

# 한번에 적용
mms.fit_transform(df)</code></pre>
<h3 id="standard-scaler">Standard Scaler</h3>
<ul>
<li>표준정규분포를 사용하여 표준화 시킴!</li>
</ul>
<pre><code class="language-python">from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
ss.fit(df)

# 평균과 표준편차
ss.mean_, ss.scale_
# transform
df_ss = ss.transform(df)
df_ss
# output :
array([[ 0.07808688, -0.39223227],
       [ 0.85895569,  0.58834841],
       [-1.48365074,  1.56892908],
       [-0.70278193, -0.39223227],
       [ 1.2493901 , -1.37281295]])

# 한번에 하기
ss.fit_transfrom(df)
</code></pre>
<h3 id="robust-scaler">Robust Scaler</h3>
<ul>
<li>중간값(median)과 사분위수를 이용한 스케일 방법</li>
<li>이상치에 강하게 대응 가능!</li>
</ul>
<p>$$
{x_i - Q_2 \over \ Q_3 - Q_1}
$$</p>
<pre><code class="language-python">df = pd.DataFrame({
    &#39;A&#39;:[-0.1, 0., 0.1, 0.2, 0.3, 0.4, 1.0, 1.1, 5.0]
})

# 해당 df를 다 스케일 해보자!
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler
mm = MinMaxScaler()
ss = StandardScaler()
rs = RobustScaler()

df_scaler = df.copy()
df_scaler[&#39;MinMax&#39;] = mm.fit_transform(df)
df_scaler[&#39;Standard&#39;] = ss.fit_transform(df)
df_scaler[&#39;Robust&#39;] = rs.fit_transform(df)

df_scaler
</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/c35a8c83-f6c9-4830-9cbd-c2d936e588c3/image.png" alt=""></p>
<ul>
<li>MinMax는 이상치에 많은 영향을받아 이상치가 있는 데이터에 적합하진 않음</li>
<li>Standard도 ...</li>
<li>Robust는 이상치에 잘 대응 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[머신러닝(타이타닉 생존자 예측)]]></title>
            <link>https://velog.io/@varieyty_/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%ED%83%80%EC%9D%B4%ED%83%80%EB%8B%89-%EC%83%9D%EC%A1%B4%EC%9E%90-%EC%98%88%EC%B8%A1</link>
            <guid>https://velog.io/@varieyty_/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%ED%83%80%EC%9D%B4%ED%83%80%EB%8B%89-%EC%83%9D%EC%A1%B4%EC%9E%90-%EC%98%88%EC%B8%A1</guid>
            <pubDate>Fri, 12 Nov 2021 05:07:21 GMT</pubDate>
            <description><![CDATA[<h2 id="타이타닉-생존자-예측">타이타닉 생존자 예측</h2>
<ul>
<li>머신러닝에서 거의 연습문제 1번같은 느낌</li>
<li>타이타닉배는 1910년대 당시 최대 여객선이고 영국에서 미국 뉴욕으로 가던 국제선</li>
<li>아래는 해당 데이터 칼럼의 의미이다.</li>
</ul>
<table>
<thead>
<tr>
<th>plcass</th>
<th>객실 등급</th>
</tr>
</thead>
<tbody><tr>
<td>survived</td>
<td>생존 유무</td>
</tr>
<tr>
<td>sex</td>
<td>성별</td>
</tr>
<tr>
<td>age</td>
<td>나이</td>
</tr>
<tr>
<td>sibsp</td>
<td>형제 혹은 부부의 수</td>
</tr>
<tr>
<td>parch</td>
<td>부모 혹은 자녀의 수</td>
</tr>
<tr>
<td>fare</td>
<td>지불한 요금</td>
</tr>
<tr>
<td>boat</td>
<td>탈출을 했다면 탑승한 보트의 번호</td>
</tr>
</tbody></table>
<h2 id="타이타닉-생존자분석-eda">타이타닉 생존자분석 (EDA)</h2>
<pre><code class="language-python">import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
tatanic = pd.read_excel(&#39;./data/titanic.xls&#39;)
tatanic.head()

# 생존자 비율의 파이그래프, autopic : 숫자를 보여줌, shoadow : 그림자, explode : 구분되게 조금 띄어놓음 

# 1행에 2열 생성, ax는 subplot에서 반환받은거
f ,ax = plt.subplots(1, 2, figsize=(16, 8))
tatanic[&#39;survived&#39;].value_counts().plot.pie(ax=ax[0], autopct=&#39;%1.1f%%&#39;, shadow=True, explode =[0, 0.05]);
ax[0].set_title(&#39;Pie plot - survived&#39;)
ax[0].set_ylabel(&#39;&#39;)

sns.countplot(x=&#39;survived&#39;, data=titanic, ax=ax[1])
ax[1].set_title(&#39;Count plot - survived&#39;)
plt.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/f4978e1d-8b0b-4c17-a6ba-8d17c343a358/image.png" alt=""></p>
<ul>
<li>성별에 따른 생존 현황</li>
</ul>
<pre><code class="language-python">f ,ax = plt.subplots(1, 2, figsize=(16, 8))
sns.countplot(x=&#39;sex&#39;, data=titanic, ax=ax[0])
ax[0].set_title(&#39;Count of passengers of sex&#39;)
ax[0].set_ylabel(&#39;&#39;)

sns.countplot(x=&#39;sex&#39;, data=titanic,hue=&#39;survived&#39;, ax=ax[1])
ax[1].set_title(&#39;Sex : Survived and Unservived&#39;)
plt.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/3c672e0a-0f1f-4414-a231-7b1cb3ec7c9a/image.png" alt=""></p>
<ul>
<li>남성의 생존 가능성이 더 낮음, 거의 1/4만 살아남음</li>
</ul>
<pre><code class="language-python"># 경제력 대비 생존률
# crosstab : 첫 번째는 인덱스, 두번째는 컬럼으로 생성해줌, margins: 합계
pd.crosstab(titanic[&#39;pclass&#39;], titanic[&#39;survived&#39;], margins=True)</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/ac1ab9a2-81cf-4bd2-8f9e-2d92e9e5c81e/image.png" alt=""></p>
<ul>
<li><p>1등실의 생존률이 다른 두군데보다 매우 높음</p>
</li>
<li><p>그럼 1등실에는 여성이 많이 타고 있나?</p>
</li>
</ul>
<pre><code class="language-python">grid = sns.FacetGrid(titanic, row=&#39;pclass&#39;, col=&#39;sex&#39;, heigt=3, aspect =1)
grid.map(plt.his, &#39;age&#39;, alpha=0.8, bins=20)
grid.add_legend()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/6c1cf9a7-6026-4d46-8b2f-99caa2eab853/image-20211112101336760.png" alt=""></p>
<ul>
<li>3등실에 남성이 많았음, 특히 20대</li>
<li>나이별 승객 현황 확인</li>
</ul>
<pre><code class="language-python">import plotly.express as px
fig = px.histogram(titanic, x=&#39;age&#39;)
fig.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/5ce33ac8-d230-4796-9429-c2ca234bdd08/image-20211112101521211.png" alt=""></p>
<ul>
<li>등실별 생존률 확인</li>
</ul>
<pre><code class="language-python">grid = sns.FacetGrid(titanic, row=&#39;pclass&#39;, col=&#39;survived&#39;, height=3, aspect=1)
grid.map(plt.his, &#39;age&#39;, alpha=0.5, bins=20)
gird.add_legend();</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/d7901a0d-a1e5-444b-a3f4-06e9455f6a81/image-20211112103151627.png" alt=""></p>
<ul>
<li>선실 등급이 높으면 생존률이 높은 경향을 보인다</li>
<li>나이를 5단계로 정리하기</li>
</ul>
<pre><code class="language-python">titanicp[&#39;age_catg&#39;] = pd.cut(titanic[&#39;age&#39;], bins=[0, 7, 15, 30, 60, 100],
                             include_lowest=True,
                             labels = [&#39;baby&#39;, &#39;teen&#39;, &#39;young&#39;, &#39;adult&#39;, &#39;old&#39;])</code></pre>
<ul>
<li>나이, 성별, 등급별 생존자 수를 한번에 파악 하기</li>
</ul>
<pre><code class="language-python">plt.figure(figsize=(12, 4))
plt.subplot(131)
sns.barplot(&#39;pclass&#39;, &#39;survived&#39;, data=titanic)
plt.subplot(132)
sns.barplot(&#39;age_catg&#39;, &#39;survived&#39;, data=titanic)
plt.subplot(133)
sns.barplot(&#39;sex&#39;, &#39;survived&#39;, data=titanic)
# 신뢰구간
plt.subplots_adjus(top=1, bottom=0.1, left=0.1, right=1, hspace=0.5, wspace=0.5)</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/b750e187-e527-432d-9cbe-73ab5b8434f1/image-20211112103712336.png" alt=""></p>
<ul>
<li>과연 어리고 여성이고 1등실일수록 생존하기 유리했을까?</li>
<li>남/여 나이별 생존 상황을 살펴보자</li>
</ul>
<pre><code class="language-python">fig, axes = flt.subplots(nrows=1, ncols=2, figsize=(14, 6))

women = titanic[titanic[&#39;sex&#39;]==&#39;female&#39;]
men = titanic[titanic[&#39;sex&#39;]==&#39;men&#39;]

# bins가 다를 때 높이가 다르다고 다른거 아님, 구간에 맞춰서 합해야함
ax = sns.distplot(women[women[&#39;survived&#39;]==1][&#39;age&#39;], bins=20,label=&#39;survived&#39;, ax=axes[0], kde=False)
ax = sns.distplot(women[women[&#39;survived&#39;]==0][&#39;age&#39;], bins=40, label=&#39;not survived&#39;, ax=axes[0], kde=False)
ax.legend(); ax.set_title(&#39;Female&#39;)

ax = sns.distplot(men[men[&#39;survived&#39;]==1][&#39;age&#39;], bins=18, label=&#39;survived&#39;, ax=axes[1], kde=False)
ax = sns.distplot(men[men[&#39;survived&#39;]==0][&#39;age&#39;], bins=40, label=&#39;not survived&#39;, ax=axes[1], kde=False)
ax.legend(); ax.set_title(&#39;Male&#39;)</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/50c0bd0f-6f3b-4ea8-9f60-af3e67341360/image-20211112105244764.png" alt=""></p>
<ul>
<li>계급층에 따라 알아보자!</li>
</ul>
<pre><code class="language-python">import re
title = []
for idx, dataset in tatanic.itterrowsd():
    tmp = dataset[&#39;name&#39;]
    title.append(re.search(&quot;\,\s\w+(\s\w+)?\.&quot;, tmp).group()[2:-1])
    # ,로 시작하고 한칸띄우고 어떤 글자들이 나오다가 단어가 몇개일지는 모르고 .로 마침
titanic[&#39;title&#39;] = title

pd.crosstab(titanic[&#39;title&#39;], titanic[&#39;sex&#39;])

# 계급이 여러개라 이름을 합침, MLLe, Ms, Mme는 Miss랑 똑같은거라 이름 바꿈
titanic[&#39;title&#39;] = titanic[&#39;title&#39;].replace(&#39;Mlle&#39;, &#39;Miss&#39;)
titanic[&#39;title&#39;] = titanic[&#39;title&#39;].replace(&#39;Ms&#39;, &#39;Miss&#39;)
titanic[&#39;title&#39;] = titanic[&#39;title&#39;].replace(&#39;Mme&#39;, &#39;Miss&#39;)
Rare_f = [&#39;Dona&#39;, &#39;Lady&#39;, &#39;the Countess&#39;]
Rare_m = [&#39;Capt&#39;, &#39;Col&#39;, &#39;Don&#39;, &#39;Major&#39;, &#39;Rev&#39;, &#39;Sir&#39;, &#39;Dr&#39;, &#39;Master&#39;, &#39;Jonkheer&#39;]

for each in Rare_f:
    titanic[&#39;title&#39;] = titanic[&#39;title&#39;].replace(each, &#39;Rare_f&#39;)
for each in Rare_m:
    titanic[&#39;title&#39;] = titanic[&#39;title&#39;].replace(each, &#39;Rare_m&#39;)

titanic[[&#39;title&#39;, &#39;survived&#39;]].groupby([&#39;title&#39;], as_index=False).mean()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/f993b8e7-4218-4636-83ad-5b6f24685af5/image-20211112110342125.png" alt=""></p>
<ul>
<li>평민남성 -&gt; 귀족남성 -&gt; 평민여성 -&gt; 귀족여성 순으로 생존률이 높음</li>
</ul>
<h2 id="머신-러닝을-이용한-생존자-예측">머신 러닝을 이용한 생존자 예측</h2>
<ul>
<li>머신러닝을 하려면 데이터가 숫자여야한다, 그러나 성별이 숫자가 아님 -&gt; 변경필요</li>
</ul>
<pre><code class="language-python">from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
le.fit(titanic[&#39;sex&#39;])
# le.classes_ 하면 클래스 나옴
titanic[&#39;gender&#39;] = le.transfor(titanic[&#39;sex&#39;])

# 결측치는 그냥 패쓰
titanic = titanic[titanic[&#39;age&#39;].notnull()]
titanic = titanic[titanic[&#39;fare&#39;].notnull()]

# 상관관계
correlation_matrix = titanic.corr().round(1)
sns.heatmap(data=correlation_matrix, annot=True, cmap=&#39;bwr&#39;)
</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/548202dc-ee91-467a-8269-a57c34c562d4/image-20211112112221797.png" alt=""></p>
<pre><code class="language-python">titanic.columns

from sklearn.model_selection import train_test_split

x = titanic[[&#39;pclass&#39;, &#39;age&#39;, &#39;sibsp&#39;, &#39;parch&#39;, &#39;fare&#39;, &#39;gender&#39;]]
y = titanic[[&#39;survived&#39;]]
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.8, random_state=42)

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

dt = DecisionTreeClassifier(max_depth=4, random_state=42)
dt.fit(X_train, y_train)
pred = dt.predict(X_test)
print(accuracy_score(y_test, pred))

# 디카프리오와 윈슬릿의 생존가능 확률은?

import numpy as np
# 클래스 : [[&#39;pclass&#39;, &quot;age&quot;, &#39;sibsp&#39;, &#39;parch&#39;, &#39;fare&#39;, &#39;gender&#39;]] 
dicaprio = np.array([3, 18, 0, 0, 5, 1])
print(&#39;Dicaprio :&#39;, dt.predict_proba(dicaprio)[0][1])

# 윈슬릿은?
winslet = np.array([[1, 16, 1, 1, 100, 0]])
print(&#39;Winslet :&#39;, dt.predict_proba(winslet)[0][1])</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/70deb0ee-022b-4c44-8505-db969b2af669/image-20211112112757288.png" alt=""></p>
<p>윈슬릿은 100% ! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[머신러닝(IRIS데이터 예측)]]></title>
            <link>https://velog.io/@varieyty_/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9DIRIS%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%98%88%EC%B8%A1</link>
            <guid>https://velog.io/@varieyty_/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9DIRIS%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%98%88%EC%B8%A1</guid>
            <pubDate>Fri, 12 Nov 2021 02:54:45 GMT</pubDate>
            <description><![CDATA[<h3 id="머신러닝이란-">머신러닝이란 ?</h3>
<ul>
<li>명시적으로 프로그래밍하지 않고도 컴퓨터에 학습할 수 있는 능력을 부여하는 학문</li>
<li>즉, 명시적인 프로그램에 의해서가 아니라 기계가 주어진 데이터를 통해 규칙을 찾는 것.</li>
</ul>
<ul>
<li>IRIS 데이터 분류<ul>
<li>꽃잎, 꽃받침의 길이/너비를 이용해서 품종구분이 가능할까?</li>
</ul>
</li>
<li>데이터 관찰</li>
</ul>
<pre><code class="language-python">from sklearn.datasets import load_iris
iris = load_iris()

iris.keys()
# 데이터 설명들
print(iris[&quot;DESCR&quot;])

print(iris[&#39;target&#39;])
print(iris[&#39;target_names&#39;])

# 차례대로 0번째가 setosa, 1이 versicolor, 2가 virginica를 의미</code></pre>
<ul>
<li>먼저 상황을 파악해야한다 ! ex) 품종 구분을 위한 특성공부</li>
</ul>
<pre><code class="language-python">import pandas as pd
iris_pd =pd.DataFrame(iris.data, columns=iris[&#39;feature_names&#39;])
iris_pd[&#39;species&#39;] = iris.target

import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(12,6))
sns.boxplot(x=&#39;sepal length (cm)&#39;, y=&#39;species&#39;, data=iris_pd, orient=&#39;h&#39;)
# orient : 수평바로 그려라 

sns.pairplot(iris_pd, hue=&#39;species&#39;)

plt.figure(figsize=(12,6))
sns.scatterplot(x=&#39;petal length (cm)&#39;, y=&#39;petal width (cm)&#39;, data=iris_pd, hue=&#39;species&#39;, palette=&#39;Set2&#39;);</code></pre>
<ul>
<li><p>품종을 구분하는 선을 어떻게 그을까? </p>
</li>
<li><p>첫번째 setosa 구분은 너무 잘 되니 두번째 선을 어떻게 그을까?</p>
</li>
</ul>
<h3 id="decision-tree">Decision Tree</h3>
<pre><code class="language-python"># 데이터 변경
iris_12 = iris_pd[iris_pd[&#39;species&#39;]!=0]
sns.scatterplot(x=&#39;petal length (cm)&#39;, y=&#39;petal width (cm)&#39;, data=iris_12, hue=&#39;species&#39;, palette=&#39;Set2&#39;);

# 과연이제 어떻게 선을 정할 것인가?</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/aabb33b7-deb8-4f22-8c21-33cc25600ddd/image.png" alt=""></p>
<h4 id="decision-tree의-분할-기준split-criterion">Decision Tree의 분할 기준(Split Criterion)</h4>
<ul>
<li><p>Decision Tree : 분류, 회귀 모두 가능한 지도 학습 모델 중 하나. 스무고개처럼 질문을 이어가며 학습</p>
</li>
<li><p>정보 획득(Information Gain)</p>
<ul>
<li>정보의 가치를 반환하는 데 발생하는 사전의 확률이 작을수록 정보의 가치는 커진다.</li>
<li>정보 이득이란 어떡 속성을 선택함으로 인해서 데이터를 더 잘 구분하게 되는 것 </li>
</ul>
</li>
<li><p>엔트로피 : 불순도를 수치화한 지표 중 하나, 확률 변수의 불확실성을 수치로 나타낸 것 </p>
</li>
<li><p>엔트로피가 큰쪽에서 낮은쪽으로 이동해야함(무질서도를 낮춰야 함)</p>
</li>
</ul>
<pre><code class="language-python"># p:해당 데이터가 해당 클래스에 속할 확률
# 어떤 확률 분포로 일어나는 사건을 표현하는데 필요한 정보의 양이며 이 값이 커질수록 확률 분포의 불확실성이 커지며 결과에 대한 예측이 어려워짐
import numpy as np
p = np.arange(0.001, 1, 0.001)
plt.plot(p, -p*np.log2(p))

# 엔트로피는 이확률들의 합
# 그러다 계산이 어려워서 지니계수라는 것이 등장</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/34b8f3d5-0e0c-41b3-a119-bd1cf1e7fb41/image.png" alt=""></p>
<h3 id="scikit-learn">Scikit Learn</h3>
<ul>
<li>현재 파이썬에서 가장 유명한 기계학습 오픈소스 라이브러리</li>
</ul>
<pre><code class="language-python">from sklearn.tree import DecisionTreeClassifier
iris_tree = DecisionTreeClassifier()
iris_tree.fit(iris.data[:, 2:], iris.target)

# 성능확인
from sklearn.metrics import accuracy_score
y_pred_tr = iris_tree.predict(iris.data[:, 2:])
accuracy_score(iris.target, y_pred_tr)</code></pre>
<h3 id="과적합overfiting">과적합(Overfiting)</h3>
<pre><code class="language-python"># 트리보기 
from sklearn.tree import plot_tree
plt.figure(figsize=(12,8))
plot_tree(iris_tree)

# 결정경계
from mlxtend.plotting import plot_decision_regions

plt.figure(figsize=(14,8))
plot_decision_regions(X=iris.data[:,2:], y=iris.target, clf=iris_tree, legend=2)
plt.show()</code></pre>
<ul>
<li>plot_tree</li>
</ul>
<p><img src="https://images.velog.io/images/varieyty_/post/88d1df34-6576-4923-8728-e266b65e3e72/image.png" alt=""></p>
<ul>
<li>plot_decision_regions</li>
</ul>
<p><img src="https://images.velog.io/images/varieyty_/post/b0d80d58-d7d0-49a6-a81e-bce60473b25e/image.png" alt=""></p>
<ul>
<li><p>Accuracy가 높다고 과연 믿을 수 있을까?</p>
</li>
<li><p>내가 가진 데이터를 벗어나서 일반화할 수 있을까?</p>
</li>
<li><p>어차피 얻은 데이터는 유한하고 내가 얻은 데이터를 이용해서 일반화를 추구하게 된다.</p>
</li>
<li><p>이때 복잡한 경계면은 모델의 성능을 결국 나쁘게 한다. </p>
</li>
</ul>
<h3 id="데이터-분리">데이터 분리</h3>
<ul>
<li>훈련, 검증, 테스트 데이터로 분리해서 오버피팅을 방지해야함. </li>
</ul>
<pre><code class="language-python"># 데이터를 훈련/ 테스트로 분리
from sklearn.datasets import load_iris
iris = load_iris()

from sklearn.model_selection import train_test_split
features = iris.data[:, 2:]
labels = iris.target
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=13)

# 훈련용/테스트용이 잘 분리 되었을까?
import numpy as np
np.unique(y_test, return_counts=True)

-&gt; 고르게 분포 안됨

# 고르게 나눠주는 옵션 : stratify
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, stratify=labels, random_state=13)

# 위에 처럼 다시 train 데이터만 대상으로 결정나무 모델 생성
# 학습할 때 마다 일관성을 위해 random_state고정, 모델 단순화를 위해 max_depth조정
from sklearn.tree import DecisionTreeClassifier
iris_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
iris_tree.fit(X_train, y_train)

plt.figure(figsize=(12,8))
plot_tree(iris_tree)

# 정확도 계산
y_pred_tr = iris_tree.predict(iris.data[:, 2:])
accuracy_score(iris.target, y_pred_tr)
# 결정경계 확인
from mlxtend.plotting import plot_decision_regions
plt.figure(figsize=(14,8))
plot_decision_regions(X=x_train, y=y_train, clf=iris_tree, legend=2)
plt.show()
# 정확도 측정
y_pred_tr = iris_tree.predict(X_test)
accuracy_score(y_test, y_pred_tr)

scatter_highlight_kwargs = {&#39;s&#39;:150, &#39;label&#39;:&#39;Test data&#39;, &#39;alpha&#39;:0.9}
scatter_kwargs = {&#39;s&#39;:120, &#39;edgecolor&#39;:None, &#39;alpha&#39;:0.9}
plt.figure(figsize=(12,8))
plot_decision_regions(X=features, y=labels, X_highlight=X_test, clf=iris_tree,legend=2
                     ,scatter_highlight_kwargs=scatter_highlight_kwargs,
                     scatter_kwargs = scatter_kwargs,
                     contourf_kwargs={&#39;alpha&#39;:0.2})
# 아래처럼하면 라벨이 바로 나오는 효오과
iris.target_names[iris_tree.predict(test_data)]
# 주요 특성 확인
iris_tree.feature_importances_
dict(zip(iris.feature_names, iris_tree.feature_importances_))</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹크롤링(네이버 영화 평점 사이트 분석)]]></title>
            <link>https://velog.io/@varieyty_/%EC%9B%B9%ED%81%AC%EB%A1%A4%EB%A7%81%EB%84%A4%EC%9D%B4%EB%B2%84-%EC%98%81%ED%99%94-%ED%8F%89%EC%A0%90-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@varieyty_/%EC%9B%B9%ED%81%AC%EB%A1%A4%EB%A7%81%EB%84%A4%EC%9D%B4%EB%B2%84-%EC%98%81%ED%99%94-%ED%8F%89%EC%A0%90-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Tue, 02 Nov 2021 15:19:25 GMT</pubDate>
            <description><![CDATA[<h1 id="웹크롤링">웹크롤링</h1>
<hr>
<h2 id="네이버-영화-평점-사이트-분석">네이버 영화 평점 사이트 분석</h2>
<ul>
<li>영화랭킹에서 평점순(현재상영영화) 선택</li>
<li>접근 URL 확인</li>
<li>웹 페이지의 주소에 많은 정보가 담겨있음, 원하는 정보를 얻기 위해 변화시켜야하는 주소의 규칙이 보이기도 함</li>
<li>이 경우 날짜 정보를 변경해주면 해당 페이지에 접근이 가능하다</li>
</ul>
<pre><code class="language-python">import pandas as pd
from bs4 import BeautifulSoup
from urllib.request import urlopen

url =&quot;https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=cur&amp;date=20180315&quot;
page = urlopen(url)

soup = BeautifulSoup(page, &quot;html.parser&quot;)
# soup</code></pre>
<ul>
<li>매 페이지마다 가져오는 영화의 갯수가 다르다, 따라서 end 변수에 한 페이지의 영화제목 갯수를 넣고 0 부터 갯수만큼 for을 돌려준다.</li>
</ul>
<pre><code class="language-python"># 영화 제목 태그, 클래스
end = len(soup.find_all(&quot;div&quot;, &quot;tit5&quot;))
movie_name = [soup.find_all(&quot;div&quot;, &quot;tit5&quot;)[n].a.text for n in range(0, end)]
movie_name

end = len(soup.find_all(&quot;td&quot;, &quot;point&quot;))
movie_point = [soup.find_all(&quot;td&quot;, &quot;point&quot;)[n].string for n in range(0, end)]
movie_point</code></pre>
<h4 id="영화-평점-데이터-확보">영화 평점 데이터 확보</h4>
<ul>
<li>pandas의 date_range를 이용해 날짜를 쉽게 생성가능(freq=&quot;D&quot; : day가 주기)</li>
</ul>
<pre><code class="language-python">date = pd.date_range(&quot;2017.12.01&quot;, periods=100, freq=&quot;D&quot;)
date</code></pre>
<ul>
<li>날짜형 데이터들은 원하는 형태로 출력이 가능하다</li>
</ul>
<pre><code class="language-python">date[0]
output : Timestamp(&#39;2017-12-01 00:00:00&#39;, freq=&#39;D&#39;)
date[0].strftime(&quot;%Y-%m-%d&quot;)
output : &#39;2017-12-01&#39;
date[0].strftime(&quot;%Y.%m..%d&quot;)
output : &#39;2017.12..01&#39;</code></pre>
<pre><code class="language-python">for today in tqdm_notebook(date):
    html =&quot;https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=cur&amp;date={date}&quot;
    response = urlopen(html.format(date=today.strftime(&quot;%Y%m%d&quot;)))
    soup = BeautifulSoup(response, &quot;html.parser&quot;)

    end = len(soup.find_all(&quot;td&quot;, &quot;point&quot;))

    movie_date.extend([today for _ in range(0, end)])
    movie_name.extend([soup.find_all(&quot;div&quot;, &quot;tit5&quot;)[n].a.string for _ in range(0, end)])
    movie_point.extend([soup.find_all(&quot;td&quot;, &quot;point&quot;)[n].string for _ in range(0, end)])

    #sleep 안주면 속도 너무 빨라서 서버에서 차단당할 수도 있음 ㅜㅜ
    time.sleep(0.5)</code></pre>
<ul>
<li>데이터프레임으로 만들기, 이 데이터가 raw data가 된다.</li>
</ul>
<pre><code class="language-python">movie = pd.DataFrame({
    &quot;data&quot;: movie_date,
    &quot;name&quot;: movie_name,
    &quot;point&quot;: movie_point
})
movie.head()
movie.info()</code></pre>
<ul>
<li>point가 숫자가 아니라 object 타입!</li>
</ul>
<pre><code class="language-python">movie[&quot;point&quot;] = movie[&quot;point&quot;].astype(float)
movie.info()</code></pre>
<h4 id="영화-평점-데이터-정리">영화 평점 데이터 정리</h4>
<pre><code class="language-python">import numpy as np
import pandas as pd

movie = pd.read_csv(&quot;./data/04_naver_movie_raw_data.csv&quot;)
movie.head()</code></pre>
<ul>
<li>영화 이름으로 인덱스를 잡고 점수의 합산을 구함, 100일 간 네이버 영화 평점 합산기준 베스트 10</li>
</ul>
<pre><code class="language-python">movie_unique = pd.pivot_table(movie, index=[&quot;name&quot;], aggfunc=np.sum)
movie_best = movie_unique.sort_values(by=&quot;point&quot;, ascending=False)
movie_best.head(10)
</code></pre>
<ul>
<li>아래처럼 쓸 때 큰따옴표(&quot; &quot;), 작은따옴표(&#39; &#39;) 를 안과 밖 서로 다르게 구분해서 줘야 오류안생김</li>
</ul>
<pre><code class="language-python">tmp = movie.query(&#39;name ==[&quot;1987&quot;]&#39;)
tmp
#더블인덱스 제거
movie_pivot = pd.pivot_table(movie, index=[&quot;date&quot;], columns=[&quot;name&quot;], values=[&quot;point&quot;])
movie_pivot.columns = movie_pivot.columns.droplevel()movie_pivot.head()</code></pre>
<h4 id="시각화">시각화</h4>
<pre><code class="language-python">
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
from matplotlib import rc

rc(&quot;font&quot;, family=&quot;Malgun Gothic&quot;)
%matplotlib inline

plt.figure(figsize=(20, 8))
plt.plot(tmp[&quot;date&quot;], tmp[&quot;point&quot;]);
plt.title(&quot;날짜별 평점&quot;)
plt.xlabel(&quot;날짜&quot;)
plt.ylabel(&quot;평점&quot;)
plt.xticks(rotation=&quot;vertical&quot;)
plt.legend(labels=[&#39;평점추이&#39;], loc=&quot;best&quot;)
plt.show()</code></pre>
<pre><code class="language-python">target_col = [&quot;12 솔져스&quot;, &quot;1987&quot;, &quot;50가지 그림자: 해방&quot;]
plt.figure(figsize=(20, 8))
plt.title(&quot;날짜별 평점&quot;)
plt.xlabel(&quot;날짜&quot;)
plt.ylabel(&quot;평점&quot;)
plt.xticks(rotation=&quot;vertical&quot;)
# 조금 더 보기 편하게 선이 생김
plt.tick_params(bottom=&quot;off&quot;, labelbottom=&quot;off&quot;)
plt.plot(movie_pivot[target_col])
plt.legend(target_col, loc=&quot;best&quot;)
plt.grid(True)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹크롤링]]></title>
            <link>https://velog.io/@varieyty_/%EC%9B%B9%ED%81%AC%EB%A1%A4%EB%A7%81</link>
            <guid>https://velog.io/@varieyty_/%EC%9B%B9%ED%81%AC%EB%A1%A4%EB%A7%81</guid>
            <pubDate>Tue, 02 Nov 2021 15:15:49 GMT</pubDate>
            <description><![CDATA[<hr>
<h3 id="위키백과-문서정보-가져오기">위키백과 문서정보 가져오기</h3>
<ul>
<li><p>한글이 포함된 웹페이지(URL)을 복사해 메모장이나 주피터셀에 복붙하면 이상하게 바뀌어서 나타난다, 웹주소는 UTF-8로 인코딩되어야 한다. =&gt; 구글에 URL Decode 검색해서 사용 또는 아래처럼 포맷팅!  </p>
</li>
<li><p>스트링에서 중괄호( {} ),로 감싸주면 변수취급된다.  </p>
</li>
<li><p>quote : 한글로된걸 UTF-8로 변환해줌</p>
</li>
</ul>
<pre><code class="language-python">import urllib
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen

html = &quot;https://ko.wikipedia.org/wiki/{search_words}&quot;
req = Request(html.format(search_words=urllib.parse.quote(&quot;여명의_눈동자&quot;)))

response = urlopen(req)

soup = BeautifulSoup(response, &quot;html.parser&quot;)
soup</code></pre>
<p>인물정보 찾기</p>
<p>replace() : 특정문자열을 내가 원하는대로 변경해줌</p>
<pre><code class="language-python">n = 0
for each in soup.find_all(&quot;ul&quot;):
    print(&quot;=&gt;&quot; + str(n) + &quot;====================&quot;)
    print(each.get_text())
    n += 1

soup.find_all(&quot;ul&quot;)[15].text.strip().replace(&quot;\xa0&quot;,&quot;&quot;).replace(&quot;\n&quot;,&quot;&quot;)</code></pre>
<h4 id="list-데이터형">List 데이터형</h4>
<ul>
<li>List 형은 대괄호로 생성한다 </li>
<li>.extend() : 제일 뒤에 다수의 자료를 추가</li>
<li>insert() : 원하는 위치에 자료를 삽입</li>
<li>isinstance(data, type) : 자료형 True/False로 확인해줌</li>
</ul>
<pre><code class="language-python">colors = [&#39;red&#39;, &#39;blue&#39;, &#39;green&#39;]
b = colors    #주소값 참조한거라 b내용을 변경하면 colors 내용도 바뀜
b[1] = &#39;black&#39;
colors
# deep copy
c = colors.copy()

# in 연산자 사용
if &#39;black&#39; in colors:
    print(&quot;True&quot;)

colors.extend([&#39;pink&#39;, &#39;yellow&#39;])

colors.insert(1, &quot;purple&quot;)

isinstance(colors, list)
ouput : True</code></pre>
<h4 id="시카고-맛집-데이터-분석">시카고 맛집 데이터 분석</h4>
<ul>
<li>총 51개의 페이지에서 각 가게의 정보를 가져온다<ul>
<li>가게이름, 대표메뉴, 대표메뉴의 가격, 가게주소</li>
</ul>
</li>
</ul>
<pre><code class="language-python">from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
from fake_useragent import UserAgent
# http에서 https로 바껴서 오류생김, 의존성 추가하면 됨
import ssl
context = ssl._create_unverified_context()

url_base = &quot;https://www.chicagomag.com&quot;
url_sub = &quot;/Chicago-Magazine/November-2012/Best-Sandwiches-Chicago/&quot;
url = url_base + url_sub

ua = UserAgent()
ua.ie

req = Request(url, headers={&quot;User-Agent&quot; : ua.ie})

response = urlopen(req, context=context)
response.status

soup = BeautifulSoup(response, &quot;html.parser&quot;)

# print(soup.prettify())</code></pre>
<ul>
<li>bs4.elment.Tag 타입이면 find 명령을 사용할 수 있다는 의미</li>
</ul>
<pre><code class="language-python">tmp_one = soup.find_all(&quot;div&quot;, &quot;sammy&quot;)[0]
type(tmp_one)</code></pre>
<pre><code class="language-python">tmp_one.find(class_=&quot;sammyRank&quot;)

tmp_one.find(class_=&quot;sammyRank&quot;).get_text()

tmp_one.find(class_=&quot;sammyListing&quot;).get_text()
tmp_one.find(&quot;a&quot;)[&quot;href&quot;]

output:&#39;/Chicago-Magazine/November-2012/Best-Sandwiches-in-Chicago-Old-Oak-Tap-BLT/&#39;
# 연결되는 홈페이지 주소가 상대경로임 </code></pre>
<pre><code class="language-python">import re
tmp_string = tmp_one.find(class_=&quot;sammyListing&quot;).get_text()
re.split((&quot;\n|\r\n&quot;),tmp_string)

output : [&#39;BLT&#39;, &#39;Old Oak Tap&#39;, &#39;Read more &#39;]</code></pre>
<pre><code class="language-python"># 상대주소 절대주소 대응을 위한 모듈
from urllib.parse import urljoin

url_base = &quot;http://www.chicagomag.com&quot;

rank = []
main_menu = []
cafe_name = []
url_add = []    
#필요한 내용을 담을 빈 리스트를 준비 리스트로 하나씩 컬럼만들어 DataFrame으로 합칠예정

list_soup = soup.find_all(&quot;div&quot;, &quot;sammy&quot;)

#urljoin : 두번째 항목이 절대주소면 url_base를 붙이지 않고 상대주소면 붙임 
for item in list_soup:
    rank.append(item.find(class_=&quot;sammyRank&quot;).get_text())
    tmp_string = item.find(class_=&quot;sammyListing&quot;).get_text()
    main_menu.append(re.split((&quot;\n|\r\n&quot;), tmp_string)[0])
    cafe_name.append(re.split((&quot;\n|\r\n&quot;), tmp_string)[1])
    url_add.append(urljoin(url_base, item.find(&quot;a&quot;)[&quot;href&quot;]))
</code></pre>
<ul>
<li>데이터프레임으로 합치기</li>
</ul>
<pre><code class="language-python">import pandas as pd

data = {&quot;Rank&quot;: rank, &quot;Menu&quot;:main_menu, &quot;Cafe&quot;:cafe_name, &quot;URL&quot;: url_add}
df = pd.DataFrame(data)
df.head()

df = pd.DataFrame(data, columns=[&quot;Rank&quot;, &quot;Cafe&quot;, &quot;Menu&quot;, &quot;URL&quot;])
df.head()
# 칼럼 순서 변경

# 저장
df.to_csv(
    &quot;./data/03. best_sandwiches_list_chicago.csv&quot;,
    sep=&quot;,&quot;,
    encoding=&quot;UTF-8&quot;
)</code></pre>
<h4 id="하위페이지-분석">하위페이지 분석</h4>
<pre><code class="language-python">df[&quot;URL&quot;][0]

req = Request(df[&quot;URL&quot;][0], headers={&quot;User-Agent&quot; : &quot;Chrome&quot;})
html = urlopen(req, context=context).read()
soup_tmp = BeautifulSoup(html, &quot;html.parser&quot;)
print(soup_tmp.find(&quot;p&quot;, &quot;addy&quot;))

output : &lt;p class=&quot;addy&quot;&gt;
&lt;em&gt;$10. 2109 W. Chicago Ave., 773-772-0406, &lt;a href=&quot;http://www.theoldoaktap.com/&quot;&gt;theoldoaktap.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</code></pre>
<ul>
<li>가격만 가져오고 싶은데 주소랑 같이 있음 =&gt; Regular Expression 사용</li>
</ul>
<table>
<thead>
<tr>
<th>.x</th>
<th>임의의 한 문자를 표현(x가 마지막으로 끝)</th>
</tr>
</thead>
<tbody><tr>
<td>x+</td>
<td>x가 1번이상 반복</td>
</tr>
<tr>
<td>x?</td>
<td>x가 존재하거나 존재하지 않음</td>
</tr>
<tr>
<td>x*</td>
<td>x가 0번이상 반복</td>
</tr>
<tr>
<td>x|y</td>
<td>x 또는 y를 찾음(or 연산자)</td>
</tr>
</tbody></table>
<pre><code class="language-python">price_tmp = soup_tmp.find(&quot;p&quot;, &quot;addy&quot;).get_text()
price_tmp

import re

re.split(&quot;.,&quot;, price_tmp)

price_tmp = re.split(&quot;.,&quot;, price_tmp)[0]
price_tmp

tmp = re.search(&quot;\$\d+\.(\d+)?&quot;, price_tmp).group()
price_tmp[len(tmp) + 2:]
#$가 반드시 와야하고 d+ : 숫자가 여러개 있을 수 있고 꼭 .을 만나고 그 뒤에 숫자가 있을수도 있고 아닐수도 있다
#가격이 끝나는 지점의 위치를 이용해서 그 뒤는 주소로 생각한다</code></pre>
<ul>
<li>for 문을 사용할 때 이게 동작중인지 시간이 얼마 남은건지 모를 떄 =&gt; TQDM</li>
</ul>
<pre><code class="language-python">from tqdm import tqdm
price = []
address = []

for idx, row in df.iterrows():
    req = Request(row[&quot;URL&quot;], headers={&quot;User-Agent&quot; : &quot;Chrome&quot;})
    html = urlopen(req, context=context).read()

    soup_tmp = BeautifulSoup(html, &quot;html.parser&quot;)

    gettings = soup_tmp.find(&quot;p&quot;, &quot;addy&quot;).get_text()

    price_tmp = re.split(&quot;.,&quot;, gettings)[0]
    tmp = re.search(&quot;\$\d+\.(\d+)?&quot;, price_tmp).group()

    price.append(tmp)
    address.append(price_tmp[len(tmp) + 2 :])
    print(idx)</code></pre>
<ul>
<li>데이터프레임 정리</li>
</ul>
<pre><code class="language-python">df[&quot;Price&quot;] = price
df[&quot;Address&quot;] = address
df = df.loc[:,[&quot;Rank&quot;, &quot;Cafe&quot;, &quot;Menu&quot;, &quot;Price&quot;, &quot;Address&quot;]]
df.set_index(&quot;Rank&quot;, inplace=True)
df.head()</code></pre>
<h4 id="시카고-맛집-데이터-지도-시각화">시카고 맛집 데이터 지도 시각화</h4>
<pre><code class="language-python">import folium
import pandas as pd
import googlemaps
import numpy as np
from tqdm import tqdm

df = pd.read_csv(&quot;./data/03. best_sandwiches_list_chicago2.csv&quot;, index_col=0)
df.head()</code></pre>
<pre><code class="language-python">gmaps_key = &quot;key 값&quot;
gmaps = googlemaps.Client(key=gmaps_key)

lat = []
lng = []
for idx, row in tqdm(df.iterrows()):
    if not row[&quot;Address&quot;] == &quot;Multiple location&quot;:
        target_name = row[&quot;Address&quot;] + &quot;, &quot; + &quot;Chicago&quot;
        gmaps_output = gmaps.geocode(target_name)
        location_output = gmaps_output[0].get(&quot;geometry&quot;)
        lat.append(location_output[&quot;location&quot;][&quot;lat&quot;])
        lng.append(location_output[&quot;location&quot;][&quot;lng&quot;])
    else:
        lat.append(np.nan)
        lng.append(np.nan)
df[&quot;lat&quot;] = lat
df[&quot;lng&quot;] = lng
df.head()
mapping = folium.Map(location=[41.895558, -87.679967], zoom_start=11)
for idx, row in df.iterrows():
    if not row[&quot;Address&quot;] == &quot;Multiple location&quot;:
        folium.Marker([row[&quot;lat&quot;], row[&quot;lng&quot;]], popup=row[&quot;Cafe&quot;]).add_to(mapping)
mapping</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[파이썬(텍스트 파일 처리)]]></title>
            <link>https://velog.io/@varieyty_/%ED%8C%8C%EC%9D%B4%EC%8D%AC%ED%85%8D%EC%8A%A4%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@varieyty_/%ED%8C%8C%EC%9D%B4%EC%8D%AC%ED%85%8D%EC%8A%A4%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Fri, 22 Oct 2021 07:51:53 GMT</pubDate>
            <description><![CDATA[<h1 id="텍스트-파일">텍스트 파일</h1>
<hr>
<ul>
<li>open(), read(), write(), close() 를 이용해 텍스트 파일을 다룬다.</li>
<li>각각 이름 그대로 열기, 읽기, 쓰기, 닫기 역할을 수행한다.</li>
</ul>
<h3 id="open을-통해-파일을-다양한-방식으로-열-수-있다">open()을 통해 파일을 다양한 방식으로 열 수 있다.</h3>
<blockquote>
<p>&#39;w&#39; : 쓰기전용(파일이 있으면 덮어씌움)</p>
<p>&#39;a&#39; : 쓰기전용(파일이 있으면 덧붙임)</p>
<p>&#39;x&#39; : 쓰기전용(파일이 있으면 에러 발생)</p>
<p>&#39;r&#39; : 읽기전용(파일이 없으면 에러발생)</p>
</blockquote>
<h3 id="write를-통해-파일-쓰기">write()를 통해 파일 쓰기</h3>
<pre><code class="language-python">file = open(&#39;C:/pythonTxt/test.txt&#39;, &#39;w&#39;)

# write는 글자개수를 int형으로 반환
# w모드는 기존에 있던 글 새로 덮어버림 
strCnt = file.write(&#39;Hello world~&#39;)
print(f&quot;strCnt : {strCnt}&quot;)

# 외부자원 연결 해제 
file.close()</code></pre>
<h3 id="read를-통해-파일-읽기">read()를 통해 파일 읽기</h3>
<pre><code class="language-python">file = open(&#39;C:/pythonTxt/test.txt&#39;, &#39;r&#39;)
str = file.read()
print(f&quot;str : {str}&quot;)
file.close()</code></pre>
<ul>
<li>strftime 을 통해 간단하게 형식 맞출 수 있음</li>
<li>%H를 하면 13시처럼 24시 기준, %I를 하면 오전, 오후 12시간을 기준으로 출력</li>
</ul>
<pre><code class="language-python">import time

lt = time.localtime()
# p : AM/PM 
dateStr = time.strftime(&#39;%Y-%m-%d %H:%M:%S %p&#39;)
dateStr</code></pre>
<h3 id="with--as-문">with ~ as 문</h3>
<ul>
<li>with ~ as 문을 이용하면 파일 닫기(close)를 생략할 수 있다.</li>
</ul>
<pre><code class="language-python">uri = &quot;C:/pythonTxt/&quot;

file = open(uri + &#39;hello.txt&#39;, &#39;a&#39;)
file.write(&quot;Hello&quot;)
file.close()

# 위의 내용을 with ~ as로 변경

with open(uri + &quot;hello.txt&quot;, &#39;a&#39;) as f:
    f.write(&quot;안뇽~~&quot;)</code></pre>
<h3 id="writelines">writelines()</h3>
<ul>
<li>반복 가능한 자료형의 데이터를 파일에 쓰자!</li>
</ul>
<pre><code class="language-python">uri = &quot;C:/pythonTxt/&quot;

languages = [&quot;c/c++&quot;, &quot;java&quot;, &quot;c#&quot;, &quot;python&quot;, &quot;javascript&quot;]

for item in languages:
    with open(uri + &#39;languages.txt&#39;, &#39;a&#39;) as f:
        f.write(item)
        f.write(&#39;\n&#39;)

# for문 대신 writelines()를 사용!        

with open(uri + &#39;languages.txt&#39;, &#39;a&#39;) as f:
    f.writelines(languages)
# 개행 추가    
with open(uri + &#39;languages.txt&#39;, &#39;a&#39;) as f:
    f.writelines(item + &#39;\n&#39; for item in languages)
</code></pre>
<pre><code class="language-python"># 아래처럼 하면 score가 그대로 입력됨
score = {&quot;kor&quot; : 85, &quot;eng&quot; : 90}
with open(uri + &quot;score.txt&quot;, &#39;a&#39;) as f:
    print(score, file=f)</code></pre>
<h3 id="readlines-readlinse">readlines(), readlinse()</h3>
<ul>
<li>여러줄 읽기와 한 줄 읽기</li>
<li>readlines() : 파일의 모든 데이터를 읽어서 리스트 형태로 반환한다.</li>
<li>readline() : 한 행을 읽어서 문자열로 반환 한다.</li>
</ul>
<pre><code class="language-python">uri = &quot;C:/pythonTxt/&quot;

with open(uri + &quot;lans.txt&quot;, &#39;r&#39;) as f:
    lanList = f.readlines()
print(f&quot;lanList : {lanList}&quot;)</code></pre>
<p>아래는 텍스트파일, 파이썬 실행결과 순이다</p>
<p><img src="https://images.velog.io/images/varieyty_/post/6577fc02-ea47-4492-a652-096c04b60185/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/varieyty_/post/9a817611-c148-4887-9c15-e0c8a76d6fd7/image.png" alt=""></p>
<pre><code class="language-python">uri = &quot;C:/pythonTxt/&quot;

with open(uri + &quot;lans.txt&quot;, &#39;r&#39;) as f:
    line = f.readline()

    while line != &#39;&#39;:
        print(f&quot;line : {line}&quot;)
        line = f.readline()</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Web Data(BeautifulSoup)]]></title>
            <link>https://velog.io/@varieyty_/Web-DataBeautifulSoup</link>
            <guid>https://velog.io/@varieyty_/Web-DataBeautifulSoup</guid>
            <pubDate>Sun, 17 Oct 2021 15:03:35 GMT</pubDate>
            <description><![CDATA[<h3 id="html">HTML</h3>
<p>HTML(Hyper Text Markup Language) : 웹 문서를 만들기 위하여 사용하는 기본적인 웹 언어의 한 종류.
인터넷에서 웹을 통해 접근되는 대부분의 웹 페이지들은 HTML로 작성된다. 각종 태그들로 이루어져있으며 요새는 HTML5 표준을 사용! </p>
<p>HEAD tag : 눈에 보이진 않지만 문서에 필요한 헤더 정보를 보관<br> title : 탭 제목<br>BODY tag: 눈에 보이는 정보를 보관<br>  p(paragraph) : 문장<br> </p>
<p>html태그는 아래와 같이 이루어져있다.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;Very Simple HTML Code By ZeroBase&lt;/title&gt; 
    &lt;/head&gt;
    &lt;body&gt;
        &lt;div&gt;
            &lt;p class=&quot;inner-text first-item&quot; id=&quot;first&quot;&gt;
                Happy ZeroBase.
                &lt;a href=&quot;http://www.pinkwink.kr&quot; id=&quot;pw-link&quot;&gt;PinkWink&lt;/a&gt;
            &lt;/p&gt;
            &lt;p class=&quot;inner-text second-item&quot;&gt;
                Happy Data Science.
                &lt;a href=&quot;https://www.python.org&quot;target=&quot;_blink&quot; id=&quot;py-link&quot;&gt;Python&lt;/a&gt;
            &lt;/p&gt;
        &lt;/div&gt;
        &lt;p class=&quot;outer-text first-item&quot; id=&quot;second&quot;&gt;
            &lt;b&gt;Data Sience if funny.&lt;/b&gt;
        &lt;/p&gt;
        &lt;p class=&quot;outer-text&quot;&gt;
            &lt;i&gt;All I need is Love&lt;/i&gt;
        &lt;/p&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre>
<h4 id="beautifulsoup">BeautifulSoup</h4>
<ul>
<li>HTML, XML 문서를 구조적으로 분석하여 원하는 데이터를 쉽게 추출하게 도와주는 모듈</li>
<li>open : 파일명과 함께 읽기(r), 쓰기(w) 속성을 지정</li>
<li>html.parser : BeautifulSoup의 html을 읽는 엔진 중 하나, 더 빠른 lxml도 사용가능</li>
<li>prettify() : html 출력을 예쁘게 만들어 줌</li>
</ul>
<pre><code class="language-python">from bs4 import BeautifulSoup
page = open(&quot;./data/03. test_first.html&quot;,&quot;r&quot;).read()
soup = BeautifulSoup(page,&quot;html.parser&quot;)
print(soup.prettify())</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/2b78f7ab-c2ef-4de6-add9-23b340bdda34/image.png" alt=""></p>
<p>.body : body태그가 속한 부분을 반환</p>
<ul>
<li><p>특정 태그 찾기 </p>
<ul>
<li><p>find(&quot;찾을 태그, 속성&quot;) : 가장 먼저 찾은 태그 하나를  출력<br>  id의 경우 HTML 내에 하나만 존재한다!</p>
</li>
<li><p>find_all(&quot;찾을 태그, 속성&quot;) : 찾은 태그 모두를 출력, id나 클래스(class_=&quot;찾을클래스&quot;)처럼 지정가능, list형태로 반환함</p>
</li>
<li><p>select_one : find와 같은 기능</p>
</li>
<li><p>select : find_all과 같은기능, &gt;를 이용해 내부 1단계 뎁스에서 찾기 가능, .을 이용해 클래스찾기 가능</p>
<blockquote>
<p>soup.select(&quot;head &gt; title&quot;)</p>
<p>soup.selet(&quot;.value&quot;)</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<pre><code class="language-python">soup.p
soup.find(&quot;p&quot;)
soup.find(&quot;p&quot;, class_=&quot;inner-text first-item&quot;)
soup.find(&quot;p&quot;,{&quot;class&quot;:&quot;outer-text first-item&quot;, &quot;id&quot;:&quot;first&quot;})</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/0d4e022b-3fda-49f6-a3e9-e779d2732bb7/image.png" alt=""></p>
<ul>
<li><p>텍스트 부분 출력</p>
<ul>
<li>.text()</li>
<li>.get_text()</li>
</ul>
</li>
<li><p>태그에서 속성 출력</p>
<ul>
<li>.get(&quot;속성명&quot;)</li>
<li>[&quot;속성&quot;] 으로도 접근 가능!</li>
</ul>
</li>
</ul>
<pre><code class="language-python">soup.find_all(&quot;a&quot;)

soup.find_all(&quot;a&quot;)[0].get(&quot;href&quot;)

soup.find_all(&quot;a&quot;)[0][&quot;href&quot;]</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/c9523ca6-2f9d-4d86-b4f9-4c22ec706d4b/image.png" alt=""></p>
<pre><code class="language-python">for each in soup.find_all(&quot;a&quot;):
    href = each.get(&quot;href&quot;)
    text = each.get_text()
    print(text + &quot; =&gt; &quot; + href)</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/6c29fad1-e796-4a89-8f73-3b74b7b2a00d/image.png" alt=""></p>
<h3 id="크롬-개발자-도구">크롬 개발자 도구</h3>
<p>크롬설정 - 도구 - 도구더보기 - 개발자도구 또는 ctrl  + shift + i 또는 F12를 사용해 실행가능.</p>
<p>선택을 이용해 특정 html위치 찾기 용이</p>
<h4 id="환율정보-가져오기">환율정보 가져오기</h4>
<p>urllib.request : 웹주소(URL)에 접근할 때 필요한 모듈 </p>
<pre><code class="language-python">from urllib.request import urlopen
from bs4 import BeautifulSoup

url = &quot;https://finance.naver.com/marketindex/&quot;
page = urlopen(url)
# response, res라는 변수명도 많이 사용 !, page.status를 사용해 http상태코드 출력가능 
soup = BeautifulSoup(page, &quot;html.parser&quot;)
print(soup.prettify)

# 환율 정보를 찾기
soup.find_all(&quot;span&quot;,class_=&quot;value&quot;)  
# class 생략해도 됨
soup.find_all(&quot;span&quot;,&quot;value&quot;)</code></pre>
<pre><code class="language-python">import requests
url = &quot;https://finance.naver.com/marketindex/&quot;
response = requests.get(url)
response  #request 모듈은 바로 http 상태코드 출력됨
soup = BeautifulSoup(response.text,&quot;html.parser&quot;)

# id =&gt; # 
# class =&gt; . </code></pre>
<pre><code class="language-python">exchangeList = soup.select(&quot;#exchangeList &gt; li&quot;)

#내부에 알고싶은 정보를 찾기
title = exchangeList[0].select_one(&quot;.h_lst&quot;).text
exchange = exchangeList[0].select_one(&quot;.value&quot;).text
change = exchangeList[0].select_one(&quot;.change&quot;).text
updown = exchangeList[0].select_one(&quot;div.head_info&gt; .blind&quot;).text
baseUrl = &quot;https://finace.naver.com&quot;
baseUrl + exchangeList[0].select_one(&quot;a&quot;).get(&quot;href&quot;)
# 띄어쓰기는 클래스 속성값 2개가 있다로 생각하면됨, 그래서 . 으로 써줘야됨</code></pre>
<pre><code class="language-python">import pandas as pd

exchange_datas = []
baseUrl = &quot;https://finace.naver.com&quot;

for item in exchangeList:
    data = {
        &quot;title&quot;:item.select_one(&quot;.h_lst&quot;).text,
        &quot;exchange&quot;:item.select_one(&quot;.value&quot;).text,
        &quot;change&quot;:item.select_one(&quot;.change&quot;).text,
        &quot;updown&quot;:item.select_one(&quot;div.head_info&gt; .blind&quot;).text,
        &quot;link&quot; : baseUrl + item.select_one(&quot;a&quot;).get(&quot;href&quot;)
    }
    exchange_datas.append(data)
df = pd.DataFrame(exchange_datas)
df.to_excel(&quot;./naverfiance.xlsx&quot;,encoding=&quot;utf-8&quot;)</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/7b474869-ad10-4603-ae29-fa664779b183/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[서울시 범죄 데이터 분석(with folium)]]></title>
            <link>https://velog.io/@varieyty_/%EC%84%9C%EC%9A%B8%EC%8B%9C-%EB%B2%94%EC%A3%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9Dwith-folinium</link>
            <guid>https://velog.io/@varieyty_/%EC%84%9C%EC%9A%B8%EC%8B%9C-%EB%B2%94%EC%A3%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9Dwith-folinium</guid>
            <pubDate>Sun, 17 Oct 2021 14:41:39 GMT</pubDate>
            <description><![CDATA[<h3 id="서울시-범죄현황-데이터-시각화">서울시 범죄현황 데이터 시각화</h3>
<pre><code class="language-python">sns.pairplot(data=crime_anal_norm, vars=[&#39;살인&#39;,&#39;강도&#39;,&#39;폭력&#39;],kind=&#39;reg&#39;, height=3)
# reg : regression,</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/f465c616-498d-4e33-bdc4-59b21515a09c/image.png" alt=""></p>
<ul>
<li>인구수,CCTV와 살인,강도의 상관관계 확인</li>
</ul>
<pre><code class="language-python">def drawGraph():
    sns.pairplot(
        data=crime_anal_norm,
        x_vars=[&#39;인구수&#39;,&#39;CCTV&#39;], 
        y_vars=[&#39;살인&#39;,&#39;강도&#39;],
        kind=&quot;reg&quot;,
        height=4
    )
    plt.show()</code></pre>
<ul>
<li>인구수, CCTV와 살인검거율,폭력검거율 상관관계 확인</li>
</ul>
<pre><code class="language-python">def drawGraph():
    sns.pairplot(
        data=crime_anal_norm,
        x_vars=[&#39;인구수&#39;,&#39;CCTV&#39;], 
        y_vars=[&#39;살인검거율&#39;,&#39;폭력검거율&#39;],
        kind=&quot;reg&quot;,
        height=4
    )
    plt.show()</code></pre>
<ul>
<li>검거율 heatmap, &#39;검거&#39; 컬럼을 기준으로 정렬</li>
</ul>
<pre><code class="language-python">def drawGraph():
    target_col = [&#39;강간검거율&#39;, &#39;강도검거율&#39;, &#39;살인검거율&#39;, &#39;절도검거율&#39;, &#39;폭력검거율&#39;,&#39;검거&#39;]

    crime_anal_norm_sort = crime_anal_norm.sort_values(by=&#39;검거&#39;, ascending =False)

    plt.figure(figsize=(10, 10))
    sns.heatmap(crime_anal_norm_sort[target_col],
                annot=True,
                fmt=&#39;f&#39;,
                linewidths=0.5, #간격설정
                cmap=&quot;RdPu&quot;
    )
    plt.title(&quot;범죄 검거 비율 (정규화된 검거의 합으로 정렬)&quot;)
    plt.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/d014cc3c-5f8c-4d9f-a2a6-6c0b2e6a1ad1/image.png" alt=""></p>
<h2 id="지도-시각화-folium">지도 시각화 (Folium)</h2>
<ul>
<li>현재 사용의 편의성이나 활발한 기능 개선 등으로 Folium이 만족도가 높은 편</li>
<li>기본적으로 크롬에서 원활하게 동작함 </li>
</ul>
<p>기본적으로 그냥 위도, 경도를 알려주면 동작한다. (구글지도에서 우클릭시 위도,경도 나옴)</p>
<p>기본 지도 그리기 : folium.Map(location = [위도, 경도], zoom_size = 크기, tiles=&quot;option&quot;)</p>
<pre><code class="language-python"># 지도를 html로 저장가능하다.
지도.svae(&quot;./경로/뭐뭐.html&quot;)</code></pre>
<p>tiles option : 지도의 스타일 옵션 선택</p>
<blockquote>
<h3 id="tiles-option">tiles option</h3>
<pre><code>- &quot;OpenStreetMap&quot;
- &quot;Mapbox Bright&quot; (Limited levels of zoom for free tiles)
- &quot;Mapbox Control Room&quot; (Limited levels of zoom for free tiles)
- &quot;Stamen&quot; (Terrain, Toner, and Watercolor)
- &quot;Cloudmade&quot; (Must pass API key)
- &quot;Mapbox&quot; (Must pass API key)
- &quot;CartoDB&quot; (positron and dark_matter)</code></pre></blockquote>
<pre><code class="language-python">import folium
import pandas as pd
import json

m = folium.Map(location = [37.54, 127.05],
               zoom_start = 15,
               tiles=&quot;OpenStreeMap&quot;,) 
#0~18 까지를 권장, 0이 가장 큼
folium.Marker(location=(37.547123, 127.047219169),
              popup = &quot;Subway&quot;,
             tooltip = &quot;성수역&quot;,
             icon =folium.Icon(color=&quot;black&quot;, 
                               icon_color = &quot;green&quot;,
                               icon = &#39;bookmark&#39;,angle = 50, prefix=&#39;fa&#39;) ).add_to(m)
m</code></pre>
<h3 id="foliummarker">folium.Marker()</h3>
<ul>
<li>Marker  : 지도에서 지정한 위치에 마커를 표시해줌</li>
<li>folium.Marker(location,popup=option,tooltip=option,icon=option,draggable=option,**kwargs)<br> popup : 마커를 누르면 말풍선마냥 팝업창으로 뜸, html문법 적용가능<br> tooltip : 마커에 갖다내면 설정문구 뜸, html문법 적용가능<br> icon : 마커 아이콘의 꾸밈가능(색깔, 안의 모양) , <a href="https://fontawesome.com/v5.15/icons?d=gallery&amp;p=2&amp;m=free">font-awesome</a>홈피 들어가서 icon탭 - free에서 보이는 것들은 prefix=&#39;fa&#39; 설정해줘야 됨<br></li>
</ul>
<pre><code class="language-python">m = folium.Map(
    location=[37.544564958079896, 127.05582307754338], # 성수역 
    zoom_start=14,
    tiles=&quot;OpenStreetMap&quot;
) # 0 ~ 18 

# tooltip 
folium.Marker(
    location=[37.544564958079896, 127.05582307754338],
    popup=&quot;&lt;b&gt;Subway&lt;/b&gt;&quot;,
    tooltip=&quot;&lt;i&gt;성수역&lt;/i&gt;&quot;
).add_to(m)

# html  
folium.Marker(
    location=[37.54558642069953, 127.05729705810472],
    popup=&quot;&lt;a href=&#39;https://zero-base.co.kr/&#39; target=_&#39;blink&#39;&gt;제로베이스&lt;/a&gt;&quot;,
    tooltip=&quot;&lt;i&gt;Zerobase&lt;/i&gt;&quot;
).add_to(m)

# Icon custom 
folium.Marker(
    location=[37.54035903907497, 127.06913328776446], # 건대입구역
    popup=&quot;건대입구역&quot;,
    tooltip=&quot;Icon custom&quot;,
    icon=folium.Icon(
        color=&quot;purple&quot;,
        icon_color=&quot;white&quot;,
        icon=&quot;glyphicon glyphicon-cloud&quot;,
        angle=50,
        prefix=&quot;glyphicon&quot;) # glyphicon
).add_to(m)
m</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/3fe6a68b-314c-4983-9130-71b642f938ec/image.png" alt=""></p>
<ul>
<li>ClickForMarker() : 지도위에 마우스를 클릭했을 때 마커를 생성해 줌, 안에 popup 옵션 설정가능 없으면 위도,경도 반환</li>
</ul>
<pre><code class="language-python">m = folium.Map(location = [37.54, 127.05],
               zoom_start = 15,
               tiles=&quot;OpenStreetMap&quot;)
m.add_child(folium.ClickForMarker())</code></pre>
<p>LatLngPopup() : 지도를 마우스로 클릭했을 때 위도, 경도 반환</p>
<pre><code class="language-python">m = folium.Map(location = [37.54, 127.05],
               zoom_start = 15,
               tiles=&quot;OpenStreetMap&quot;)
m.add_child(folium.LatLngPopup())</code></pre>
<ul>
<li>folium.Circle(), folium.CircleMarker()</li>
</ul>
<p>Circle() : </p>
<blockquote>
<p>fill : 안에 색 채우기 여부, color picker로 색깔 고를 수 있음</p>
</blockquote>
<pre><code class="language-python">m = folium.Map(location = [37.54, 127.05],
               zoom_start = 15,
               tiles=&quot;OpenStreetMap&quot;)
folium.Circle(location=[37.5417,127.0444],
             radius=100,
             fill=True,
             color=&quot;#eb9e34&quot;,
              fill_color=&quot;red&quot;,
              popup=&quot;circle&quot;,
              tooltip=&quot;circle&quot;
             ).add_to(m)
m</code></pre>
<p>CircleMarker() : radius가 조금 다르고 나머진 Circle이랑 똑같음</p>
<h3 id="foliumchoropleth">folium.Choropleth</h3>
<p>Choropleth() : </p>
<pre><code class="language-python">import json 
state_data = pd.read_csv(&quot;./data/02. US_Unemployment_Oct2012.csv&quot;)
m = folium.Map([43, -102], zoom_start=3)

folium.Choropleth(
    geo_data=&quot;./data/02. us-states.json&quot;, # 경계선 좌표값이 담긴 데이터
    data=state_data, # Series or DataFrame 
    columns=[&quot;State&quot;, &quot;Unemployment&quot;], # DataFrame columns 
    key_on=&quot;feature.id&quot;, #json 파일 까봐야함!
    fill_color=&quot;BuPu&quot;,
    fill_opacity=0.5, # 0~1 
    line_opacity=0.2, # 0~1
    legend_name=&quot;Unemployment rate (%)&quot;    
).add_to(m)

m</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/642914a7-21de-4079-9b18-e1b5adbf7f23/image.png" alt=""></p>
<h2 id="지도-시각화">지도 시각화</h2>
<pre><code class="language-python">import json
import folium
import pandas as pd 
crime_anal_norm = pd.read_csv(&quot;./data/02. crime_in_Seoul_final.csv&quot;, index_col=0, encoding=&quot;utf-8&quot;)
geo_path = &quot;./data/02. skorea_municipalities_geo_simple.json&quot;
geo_str = json.load(open(geo_path, encoding=&quot;utf-8&quot;))</code></pre>
<pre><code class="language-python">my_map = folium.Map(location=[37.5502, 126.982], zoom_start=11, tiles=&quot;Stamen Toner&quot;)

my_map.choropleth(geo_data=geo_str,
                 data=crime_anal_norm[&quot;살인&quot;],
                 columns=[crime_anal_norm.index, crime_anal_norm[&quot;살인&quot;],],
                 fill_color=&quot;PuRd&quot;,
                 key_on=&quot;feature.id&quot;,
                 fill_opacity=0.7,
                 line_opacity=0.2,
                 legend_name=&quot;정규화된 살인 발생 건수&quot;)
my_map</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/febd76bb-3048-401f-b870-bb61c56a45ae/image.png" alt=""></p>
<pre><code class="language-python"># 인구 대비 범죄 발생 건수 시각화

tmp_criminal = crime_anal_norm[&quot;범죄&quot;] / crime_anal_norm[&quot;인구수&quot;]

my_map = folium.Map(location=[37.5502, 126.982], zoom_start=11, tiles=&quot;Stamen Toner&quot;)

my_map.choropleth(geo_data=geo_str,
                 data=tmp_criminal,
                 columns=[crime_anal_norm.index, tmp_criminal],
                 fill_color=&quot;PuRd&quot;,
                 key_on=&quot;feature.id&quot;,
                 fill_opacity=0.7,
                 line_opacity=0.2,
                 legend_name=&quot;인구 대비 범죄 발생 건수&quot;)
my_map</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/efe385ca-40a5-4e9e-a770-c7c77a067b06/image.png" alt=""></p>
<pre><code class="language-python"># 경찰서별 정보를 가지고 범죄발생과 함께 정리

crime_anal_station = pd.read_csv(&quot;./data/02. crime_in_Seoul_1st.csv&quot;, index_col=0, encoding=&quot;utf-8&quot;)
col = [&quot;살인검거&quot;, &quot;강도검거&quot;, &quot;강간검거&quot;, &quot;절도검거&quot;, &quot;폭력검거&quot;]
tmp = crime_anal_station[col] / crime_anal_station[col].max()
crime_anal_station[&quot;검거&quot;] = np.mean(tmp, axis=1)  # numpy 에서 axis=1은 행(가로), pandas에서는 열(세로)
crime_anal_station.head()</code></pre>
<pre><code class="language-python"># 경찰서 위치를 지도에 표시
my_map = folium.Map(location=[37.5502, 126.982], zoom_start=11)

for idx, rows in crime_anal_station.iterrows():
    folium.Marker([rows[&quot;lat&quot;], rows[&quot;lng&quot;]]).add_to(my_map)</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/5481030d-f81f-40ba-a15f-32c553a5850c/image.png" alt=""></p>
<pre><code class="language-python"># 검거율로 동그라미! 
my_map = folium.Map(location=[37.5502, 126.982], zoom_start=11)

for idx, rows in crime_anal_station.iterrows():
    folium.CircleMarker(
        [rows[&quot;lat&quot;], rows[&quot;lng&quot;]],
        radius=rows[&quot;검거&quot;] * 50,
        popup=rows[&quot;구분&quot;] + &quot; : &quot; + &quot;%.2f&quot; % rows[&quot;검거&quot;],
        color=&quot;#3186cc&quot;,
        fill=True,
        fill_color=&quot;#3186cc&quot;).add_to(my_map)
my_map</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/9eea1d38-ddcc-46c0-b786-e69e4c3034b5/image.png" alt=""></p>
<pre><code class="language-python">my_map = folium.Map(location=[37.5502, 126.982], zoom_start=11)
my_map.choropleth(geo_data=geo_str,
                 data=crime_anal_norm[&quot;범죄&quot;],
                 columns=[crime_anal_norm.index, crime_anal_norm[&quot;범죄&quot;]],
                 fill_color=&quot;PuRd&quot;,
                 key_on=&quot;feature.id&quot;,
                 fill_opacity=0.7,
                 line_opacity=0.2)
for idx, rows in crime_anal_station.iterrows():
    folium.CircleMarker(
        [rows[&quot;lat&quot;], rows[&quot;lng&quot;]],
        radius=rows[&quot;검거&quot;] * 50,
        popup=rows[&quot;구분&quot;] + &quot; : &quot; + &quot;%.2f&quot; % rows[&quot;검거&quot;],
        color=&quot;#3186cc&quot;,
        fill=True,
        fill_color=&quot;#3186cc&quot;).add_to(my_map)

my_map</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/8987b6f6-b440-4b06-8465-ac0d5194fedb/image.png" alt=""></p>
<ul>
<li>강남의 범죄 발생이 많은 것은 혹시 유흥업소의 밀집과 관련이 있지 않을까?</li>
<li>확인을 위해 최초 받았던 장소별 데이터를 읽어보자 </li>
</ul>
<pre><code class="language-python">crime_loc_raw = pd.read_csv(&quot;./data/02. crime_in_Seoul_location.csv&quot;, thousands=&quot;,&quot;, encoding=&quot;euc-kr&quot;)
crime_loc = crime_loc_raw.pivot_table(crime_loc_raw, index=[&quot;장소&quot;], columns=[&quot;범죄명&quot;], aggfunc=[np.sum])
crime_loc.columns = crime_loc.columns.droplevel([0, 1])
crime_loc.head()

# 정규화
col = [&quot;살인&quot;, &quot;강도&quot;, &quot;강간&quot;, &quot;절도&quot;, &quot;폭력&quot;]
crime_loc_norm = crime_loc / crime_loc.max()
crime_loc_norm.head()

crime_loc_norm[&quot;종합&quot;] = np.mean(crime_loc_norm, axis=1)
crime_loc_norm.tail(2)</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/3a813126-6ee0-42db-b0df-d9a20a48389f/image.png" alt=""></p>
<pre><code class="language-python">crime_loc_norm_sort = crime_loc_norm.sort_values(by=&quot;종합&quot;, ascending=False)

def drawGraph():
    plt.figure(figsize=(10, 10))
    sns.heatmap(crime_loc_norm_sort, annot=True, fmt=&quot;f&quot;, linewidth=0.5, cmap=&quot;RdPu&quot;)
    plt.title(&quot;범죄와 발생 장소&quot;)
    plt.show()

drawGraph()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/3fc0b117-fa03-4ae5-8e07-cd4e673f374c/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[서울시 범죄 데이터 분석(with seaborn)]]></title>
            <link>https://velog.io/@varieyty_/%EC%84%9C%EC%9A%B8%EC%8B%9C-%EB%B2%94%EC%A3%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9Dwith-seaborn</link>
            <guid>https://velog.io/@varieyty_/%EC%84%9C%EC%9A%B8%EC%8B%9C-%EB%B2%94%EC%A3%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9Dwith-seaborn</guid>
            <pubDate>Sun, 17 Oct 2021 14:35:47 GMT</pubDate>
            <description><![CDATA[<h2 id="seaborn">seaborn</h2>
<p>matplotlib같은 시각화 도구 라이브러리</p>
<pre><code class="language-python">import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
get_ipython().run_line_magic(&quot;matplotlib&quot;,&quot;inline&quot;)</code></pre>
<ul>
<li>seaborn은 import하는 것만으로도 효과가 있음</li>
</ul>
<pre><code class="language-python">x = np.linspace(0, 14, 100)
y1 = np.sin(x)
y2= 2 * np.sin(x + 0.5)
y2= 3 * np.sin(x + 1.0)
y2= 4 * np.sin(x + 1.5)
plt.figure(figsize=(10, 6))
plt.plot(x, y1, x, y2, x, y3, x, y4)
plt.show()</code></pre>
<ul>
<li>set_style : 바탕색 지정</li>
<li>despint(offest=size) : 왼쪽과 아래쪽 테두리만 생성, offset하면 왼쪽아래가 조금 떨어짐</li>
</ul>
<pre><code class="language-python">sns.set_style(&quot;white&quot;)
plt.figure(figsize=(10, 6))
plt.plot(x, y1, x, y2, x, y3, x, y4)
sns.despine()
plt.show()</code></pre>
<ul>
<li>seaborn 에는 실습용 데이터 몇 개가 내장되어있다. tips, flights, iris 등..<ul>
<li>boxplot</li>
</ul>
</li>
</ul>
<pre><code class="language-python">tips = sns.load_dataset(&quot;tips&quot;)
plt.figure(figsize=(8, 6))
sns.boxplot(x=tips[&quot;total_bill&quot;])
plt.show()
tips.head()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/e7498a9d-16cc-41fe-8719-c23818ee50dd/image.png" alt=""></p>
<p>hue : 컬럼지정시 구분지어줌</p>
<p>palette : 색상</p>
<pre><code class="language-python">plt.figure(figsize=(8, 6))
sns.boxplot(x=&#39;day&#39;, y=&#39;total_bill&#39;, hue=&#39;smoker&#39;, data=tips, palette=&#39;Set3&#39;)
plt.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/fb50dbb4-1c2a-41d1-acac-446d216e79b3/image.png" alt=""></p>
<ul>
<li>swarmplot</li>
</ul>
<pre><code class="language-python"># swarmplot 
# color: 0~1 사이 검은색부터 흰색 사이 값을 조절 
plt.figure(figsize=(8, 6))
sns.swarmplot(x=&quot;day&quot;, y=&quot;total_bill&quot;, data=tips, color=&quot;0.5&quot;) 
plt.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/ccc406af-e5d4-4a6f-bc19-96d6dd4b2a81/image.png" alt=""></p>
<ul>
<li>lmplot : 직선으로 표현</li>
</ul>
<pre><code class="language-python"># lmplot: total_bil과 tip 사이 관계 파악 
sns.set_style(&quot;darkgrid&quot;)
sns.lmplot(x=&#39;total_bill&#39;,y=&quot;tip&quot;, data=tips, height=7)
plt.show()</code></pre>
<ul>
<li>hue 옵션을 준 직선 그래프</li>
</ul>
<pre><code class="language-python"># hue option 

sns.set_style(&quot;darkgrid&quot;)
sns.lmplot(x=&quot;total_bill&quot;, y=&quot;tip&quot;, data=tips, height=7, hue=&quot;smoker&quot;)
plt.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/f4592408-e528-4e67-8629-0c8a00e777dd/image.png" alt=""></p>
<ul>
<li>heatmap을 이용하면 전체 경향을 알 수 있다</li>
</ul>
<pre><code class="language-python">flights = sns.load_dataset(&quot;flights&quot;)
flights.head()
flights = sns.load_dataset(&quot;flights&quot;)
flights.head()
</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/29b6446c-2740-461e-9505-6c38ce889f42/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/varieyty_/post/cdf554a8-b846-4145-9390-b188ae41db58/image.png" alt=""></p>
<ul>
<li><p>annot : 안에 내용 적어줌</p>
</li>
<li><p>fmt : d는 정수,f는 실수</p>
</li>
</ul>
<pre><code class="language-python"># heatmap 
plt.figure(figsize=(10, 8))
sns.heatmap(flights, annot=True, fmt=&quot;d&quot;, cmap=&quot;YlGnBu&quot;)
plt.show()</code></pre>
<ul>
<li>pariplot : 다수의 컬럼 비교</li>
</ul>
<pre><code class="language-python">sns.set(style=&#39;ticks&#39;)   # 격자? 같은거 생성
iris = sns.load_dataset(&quot;iris&quot;)
sns.pariplot(iris)
plt.show()</code></pre>
<pre><code class="language-python"># hue option 

sns.pairplot(iris, hue=&quot;species&quot;)
plt.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/4598bc63-ff81-45ef-8895-2f14f8c2b0b4/image.png" alt="">
원하는 컬럼만 pariplot</p>
<pre><code class="language-python"># 원하는 컬럼만 pairplot 
sns.pairplot(iris, 
             x_vars=[&quot;sepal_width&quot;, &quot;sepal_length&quot;], 
             y_vars=[&quot;petal_width&quot;, &quot;petal_length&quot;])
plt.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/b2d06d6f-ece9-4c91-bcdc-768c57275608/image.png" alt=""></p>
<pre><code class="language-python">anscombe = sns.load_dataset(&quot;anscombe&quot;)
sns.set_style(&quot;darkgrid&quot;)
sns.lmplot(x=&#39;x&#39;, y=&#39;y&#39;, data=anscombe.query(&quot;dataset == &#39;I&#39;&quot;), ci=None, size=7)
plt.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/778c40f0-da7e-4f29-9127-1942b663c8ec/image.png" alt=""></p>
<ul>
<li><p>order : 점에 따라 함수order 바꿈</p>
</li>
<li><p>robust : 경향에서 많이 벗어난 아웃라이어는 무시</p>
</li>
<li><p>ci : 신뢰구간선택 옵션</p>
</li>
</ul>
<pre><code class="language-python">anscombe = sns.load_dataset(&quot;anscombe&quot;)
sns.set_style(&quot;darkgrid&quot;)
sns.lmplot(x=&#39;x&#39;, y=&#39;y&#39;, data=anscombe.query(&quot;dataset == &#39;II&#39;&quot;), ci=None,scatter_kws={&quot;s&quot;:80},order=2, robust = True, size=7)
plt.show()</code></pre>
<p><img src="https://images.velog.io/images/varieyty_/post/6abd770e-2daa-482c-9cb4-fd84fd1a8a1a/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>