<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Datahaseo</title>
    <link>https://datahaseo.tistory.com/</link>
    <description>datahaseo 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Sun, 12 Apr 2026 11:25:01 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>datahaseo</managingEditor>
    <item>
      <title>UCI Wholesale 데이터로 보는 고객 세분화 &amp;amp; 채널 예측 태블로 대시보드 구현 (K-means, PCA, TabPy, AWS EC2 서버 연동)</title>
      <link>https://datahaseo.tistory.com/66</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0. 분석의 시작점&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;McKinsey &amp;amp; Company는 데이터 기반 의사결정을 내리는 기업이 그렇지 않은 기업보다 고객 유치 확률은 &lt;b data-index-in-node=&quot;63&quot; data-path-to-node=&quot;4&quot;&gt;23배&lt;/b&gt;, 수익성은 &lt;b data-index-in-node=&quot;73&quot; data-path-to-node=&quot;4&quot;&gt;19배&lt;/b&gt; 더 높다고 강조합니다. 특히 Bain &amp;amp; Company의 2025 소비자 제품 보고서에 따르면 글로벌 소비재(CPG) 판매 성장률이 둔화되고 있는 지금, 유통 기업들에게 데이터는 위기를 돌파할 가장 현실적인 열쇠가 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미 글로벌 유통 시장은 데이터를 통해 혁신을 만들어내고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;Sysco(시스코):&lt;/b&gt; 과거 구매 패턴을 AI로 분석해 '재구매 시점'을 선제적으로 제안하며 외식 수요 감소 위기를 돌파했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;Amazon(아마존):&lt;/b&gt; 주문 전 물품을 이동시키는 '예측 배송'으로 물류 패러다임을 전환했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;왜 도매(Wholesale) 분석에서 머신러닝이 필요한가?&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도매 유통 시장은 소매점(Retail)과 식당/카페(Horeca)라는 서로 다른 성격의 고객이 섞여 있는 복합적인 공간입니다. 단순히 과거의 매출 총액만 보는 방식으로는 변화무쌍한 고객의 니즈를 정확히 읽어내기 어렵습니다. 품목별 구매 데이터 속에 숨겨진 &lt;b data-index-in-node=&quot;176&quot; data-path-to-node=&quot;7&quot;&gt;고객의 페르소나를 정밀하게 이해&lt;/b&gt;하는 과정이 선행되어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8&quot;&gt;본 프로젝트는 예측 그 이상의 '가치'를 전달하기 위해 세 가지에 집중했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;&quot;왜?&quot;라는 질문에 답하기 (SHAP 분석):&lt;/b&gt; 머신러닝 결과가 단순한 '숫자'에 그치지 않도록, 4가지 모델의 SHAP 가치를 분석했습니다. AI가 어떤 근거로 판단했는지 투명하게 해석하여 현업에서 바로 활용할 수 있는 인사이트를 도출하고자 했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;분석의 경계를 허무는 도전 (AWS 실시간 연동):&lt;/b&gt; 로컬 환경에만 머물러 있는 분석 결과는 공유에 한계가 있었습니다. 이를 해결하기 위해 AWS EC2와 TabPy를 연동하여, 누구나 언제든 대시보드에서 실시간 AI 예측을 경험할 수 있는 클라우드 기반의 인프라 구축을 시도했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;데이터의 본질에 집중하기:&lt;/b&gt; UCI Wholesale Customer 데이터셋을 바탕으로 전처리부터 모델 학습, 그리고 태블로 시각화에 이르기까지 고민의 과정들을 차근차근 기록해 보았습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[출처 참고]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://www.apmac.ca/case-studies/transform-data-into-strategic-advantage/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.apmac.ca/case-studies/transform-data-into-strategic-advantage/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://www.bain.com/insights/consumer-products-report-2025-reclaiming-relevance-in-the-gen-ai-era/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.bain.com/insights/consumer-products-report-2025-reclaiming-relevance-in-the-gen-ai-era/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[목차]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 프로젝트 개요&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 데이터 탐색 및 전처리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;① 기초 통계량 확인&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;② 데이터 정제 및 변환&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;③ 상관관계 분석&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 머신러닝 기반 분석 프로세스 &lt;br /&gt;&amp;nbsp; &amp;nbsp; ① PCA 주성분 분석&lt;br /&gt;&amp;nbsp; &amp;nbsp; ② K-Means 클러스터링&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ③ 머신러닝 분류 모델 선정&lt;br /&gt;&amp;nbsp; &amp;nbsp; ④ 모델 해석 및 SHAP 분석&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;4. TabPy 연동&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 태블로 대시보드 구현&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://www.loom.com/share/5b574a84ef35461d98a1176424e7c0dc&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.loom.com/share/5b574a84ef35461d98a1176424e7c0dc&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1773465290182&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;video.other&quot; data-og-title=&quot;Tabpy | Wholesale customer data set | Tableau&quot; data-og-description=&quot; &quot; data-og-host=&quot;www.loom.com&quot; data-og-source-url=&quot;https://www.loom.com/share/5b574a84ef35461d98a1176424e7c0dc&quot; data-og-url=&quot;https://www.loom.com/share/5b574a84ef35461d98a1176424e7c0dc&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c98ZLk/dJMb87f42Je/YbwUpwE6lSKUlIGbFoYkV1/img.gif?width=1024&amp;amp;height=544&amp;amp;face=0_0_1024_544,https://scrap.kakaocdn.net/dn/b7I7Qf/dJMb9frD4gR/2KkQBkODvMiKahfkT0ddX0/img.jpg?width=1280&amp;amp;height=680&amp;amp;face=0_0_1280_680&quot;&gt;&lt;a href=&quot;https://www.loom.com/share/5b574a84ef35461d98a1176424e7c0dc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.loom.com/share/5b574a84ef35461d98a1176424e7c0dc&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c98ZLk/dJMb87f42Je/YbwUpwE6lSKUlIGbFoYkV1/img.gif?width=1024&amp;amp;height=544&amp;amp;face=0_0_1024_544,https://scrap.kakaocdn.net/dn/b7I7Qf/dJMb9frD4gR/2KkQBkODvMiKahfkT0ddX0/img.jpg?width=1280&amp;amp;height=680&amp;amp;face=0_0_1280_680');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Tabpy | Wholesale customer data set | Tableau&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.loom.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*대시보드 녹화 영상 링크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6. AWS EC2 클라우드 인프라 구축 &lt;br /&gt;7. 결론 및 비지니스 제언&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8. 분석을 마치며&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&amp;nbsp; 프로젝트 개요&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 본 분의 목적은 &lt;b data-index-in-node=&quot;90&quot; data-path-to-node=&quot;5&quot;&gt;UCI Wholesale Customer 데이터셋&lt;/b&gt;을 활용하여 다음 세 가지 질문에 답하는 것입니다. &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;고객 세분화:&lt;/b&gt; 고객은 어떤 구매 특성을 가진 그룹으로 나뉘는가? (K-Means)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;채널 예측:&lt;/b&gt; 신규 고객의 구매 패턴만으로 이들이 '호텔/레스토랑/카페 유형(Horeca)'인지 '소매 유형(Retail)'인지 판별할 수 있는가?&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;비즈니스 구현:&lt;/b&gt; 현업 담당자가 실시간으로 예측치를 확인할 수 있는 환경을 어떻게 구축할 것인가? (TabPy &amp;amp; Tableau)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #87a6c4; text-align: start;&quot;&gt;(출처: &lt;/span&gt;&lt;a href=&quot;https://www.kaggle.com/datasets/binovi/wholesale-customers-data-set&quot;&gt;https://www.kaggle.com/datasets/binovi/wholesale-customers-data-set&lt;/a&gt;&lt;span style=&quot;color: #87a6c4; text-align: start;&quot;&gt;)&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 데이터 탐색 및 전처리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터는 총 440개의 행과 8개의 변수(품목별 연간 구매액, 지역, 채널)로 구성되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 189px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.5658%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;컬럼명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.1473%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.2868%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.5658%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Channel &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.1473%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 유통 채널 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.2868%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 고객의 거래 채널. Horeca(호텔&amp;middot;레스토랑&amp;middot;카페) 또는 Retail(소매점) 구분에 사용됨 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.5658%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Region &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.1473%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 지역 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.2868%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 고객이 속한 지리적 지역 구분 변수. 특정 국가 내의 권역 정보 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.5658%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Fresh &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.1473%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 신선식품 구매액 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.2868%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 육류, 채소, 과일 등 신선식품 카테고리에 대한 연간 구매 금액 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.5658%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Milk &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.1473%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 유제품 구매액 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.2868%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 우유, 치즈, 요거트 등 유제품 카테고리에 대한 연간 구매 금액 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.5658%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Grocery &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.1473%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 식료품 구매액 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.2868%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 가공식품, 일반 식료품 등 장기 보관 식품 카테고리 구매 금액 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.5658%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Frozen &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.1473%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 냉동식품 구매액 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.2868%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 냉동 육류, 냉동 가공식품 등 냉동식품 카테고리 구매 금액 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.5658%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Detergents_Paper &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.1473%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 세제&amp;middot;종이류 구매액 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.2868%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 세제, 화장지, 키친타월 등 생활 소모품 구매 금액 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.5658%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Delicassen &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.1473%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 즉석&amp;middot;가공식품 구매액 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.2868%; height: 21px;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 즉석식품, 델리 식품, 가공 반찬류 등의 구매 금액 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-path-to-node=&quot;13&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;① &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 탐색 및 전처리 | 기초 통계량&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;[요약]&lt;/b&gt; 품목별 구매액의 편차가 매우 크고 우측으로 꼬리가 긴 분포(Skewed)를 확인했습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;describe 함수를 통한 기초 통계량 확인&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T9mrW/dJMcabQW2p1/1y38oodIJktr9p1ZlF9Nf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T9mrW/dJMcabQW2p1/1y38oodIJktr9p1ZlF9Nf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T9mrW/dJMcabQW2p1/1y38oodIJktr9p1ZlF9Nf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT9mrW%2FdJMcabQW2p1%2F1y38oodIJktr9p1ZlF9Nf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;852&quot; height=&quot;338&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;결측치 부재:&lt;/b&gt; 440개의 샘플 모두 결측치 없이 정제되어 있어 데이터 신뢰도가 높음을 확인했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;분산의 비대칭성:&lt;/b&gt; 모든 품목에서 평균(Mean)이 중앙값(Median)보다 높게 나타났으며, 특히 Max 값이 평균 대비 수십 배에 달하는 등 &lt;b data-index-in-node=&quot;80&quot; data-path-to-node=&quot;5,1,0&quot;&gt;소수 우량 고객에 의한 매출 쏠림 현상&lt;/b&gt;을 포착했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;seaborn 패키지 기반 시각화 | 히스토그램 / 박스 플럿&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1383&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cmd88/dJMcahp7t1L/kYxGXSL8SubSUMJ7fORm01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cmd88/dJMcahp7t1L/kYxGXSL8SubSUMJ7fORm01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cmd88/dJMcahp7t1L/kYxGXSL8SubSUMJ7fORm01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCmd88%2FdJMcahp7t1L%2FkYxGXSL8SubSUMJ7fORm01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1383&quot; height=&quot;343&quot; data-origin-width=&quot;1383&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/41gB2/dJMcagxWRjs/kJbr4eYkvTKWGOrQAeFGJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/41gB2/dJMcagxWRjs/kJbr4eYkvTKWGOrQAeFGJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/41gB2/dJMcagxWRjs/kJbr4eYkvTKWGOrQAeFGJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F41gB2%2FdJMcagxWRjs%2FkJbr4eYkvTKWGOrQAeFGJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1386&quot; height=&quot;350&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Hisplot 및 Boxplot 을 통해 모든 변수에서 우측의 긴 꼬리 (이상치)의 존재를 확인했습니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;z-score 기반 이상치와 왜도 점검&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA7W1Q/dJMcagLwvxW/e5mbZr5o6n3YJmdKDxuKNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA7W1Q/dJMcagLwvxW/e5mbZr5o6n3YJmdKDxuKNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA7W1Q/dJMcagLwvxW/e5mbZr5o6n3YJmdKDxuKNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA7W1Q%2FdJMcagLwvxW%2Fe5mbZr5o6n3YJmdKDxuKNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;283&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;283&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;Z-score(표준점수)는 해당 값이 평균에서 표준편차 몇 배만큼 떨어져 있는지를 나타내는 수치이며, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;|z| &amp;gt; 3을 이상치 기준으로 사용했습니다&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;이상치(Outliers) 판별:&lt;/b&gt; |z| &amp;gt; 3&amp;nbsp;기준을 적용했을 때 모든 품목에서 극단치가 존재함을 확인했습니다. 이를 방치할 경우 머신러닝 모델이 일반 고객이 아닌 특이 케이스(VVIP 등)에만 과적합(Overfitting)될 위험이 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;왜도 개선 확인:&lt;/b&gt; 원본 데이터의 높은 왜도를 확인한 후, 로그 변환 권장 지수(log_recommended)가 모든 품목에서 &lt;b data-index-in-node=&quot;70&quot; data-path-to-node=&quot;8,1,0&quot;&gt;True&lt;/b&gt;임을 도출했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; ② 데이터 탐색 및 전처리 | 전처리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;[요약]&amp;nbsp;&lt;/b&gt; 머신러닝 모델의 왜곡을 방지하기 위해 &lt;b data-index-in-node=&quot;26&quot; data-path-to-node=&quot;10,1,0&quot;&gt;Log Transformation&lt;/b&gt;을 수행하고, 변수 간 단위 차이를 맞추기 위해 &lt;b data-index-in-node=&quot;71&quot; data-path-to-node=&quot;10,1,0&quot;&gt;StandardScaler&lt;/b&gt;를 적용했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;seaborn 패키지 기반 시각화 | 히스토그램 / 박스 플럿&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kACqu/dJMcag5OHsd/HxJkMjLQsYt57kaRx47YHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kACqu/dJMcag5OHsd/HxJkMjLQsYt57kaRx47YHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kACqu/dJMcag5OHsd/HxJkMjLQsYt57kaRx47YHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkACqu%2FdJMcag5OHsd%2FHxJkMjLQsYt57kaRx47YHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;872&quot; height=&quot;247&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;Action:&lt;/b&gt; 억 단위와 백만 단위 구매액 사이의 거대한 간극을 로그 스케일로 압축했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;Value:&lt;/b&gt; 우측으로 길게 늘어진 꼬리 분포를 정규분포 형태로 변환함으로써, 모델이 모든 구매 구간의 패턴을 &lt;b data-index-in-node=&quot;61&quot; data-path-to-node=&quot;13,1,0&quot;&gt;고르게 학습&lt;/b&gt;할 수 있는 환경을 조성했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b data-path-to-node=&quot;15,1,0&quot; data-index-in-node=&quot;0&quot;&gt;StandardScaler 적용&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b59NDA/dJMcadgWvn9/880lybzhPiYEy0Z5Bg4ypk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b59NDA/dJMcadgWvn9/880lybzhPiYEy0Z5Bg4ypk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b59NDA/dJMcadgWvn9/880lybzhPiYEy0Z5Bg4ypk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb59NDA%2FdJMcadgWvn9%2F880lybzhPiYEy0Z5Bg4ypk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;949&quot; height=&quot;544&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;Action:&lt;/b&gt; 서로 다른 품목별 구매 단위(Unit)를 평균 0, 표준편차 1의 표준 정규분포로 스케일링했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;Selection Reason (왜 StandardScaler인가?):&lt;/b&gt; 본 프로젝트의 핵심인 &lt;b&gt;K-Means(거리 기반)&lt;/b&gt;와 &lt;b data-index-in-node=&quot;74&quot; data-path-to-node=&quot;15,1,0&quot;&gt;PCA(분산 기반)&lt;/b&gt; 알고리즘은 변수의 절대 수치에 민감합니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;금액대가 큰 '신선식품(Fresh)'에만 모델이 좌우되지 않도록, &lt;b data-index-in-node=&quot;37&quot; data-path-to-node=&quot;15,1,1,0,0&quot;&gt;'Detergents_Paper'처럼 금액은 적지만 채널 구분력이 높은 변수&lt;/b&gt;의 영향력을 동일한 가중치로 반영하기 위해 선택했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; ③ 데이터 탐색 및 전처리 | 상관분석&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;스피어만 상관관계&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;10&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-path-to-node=&quot;10,1,0&quot; data-index-in-node=&quot;0&quot;&gt;[요약]&amp;nbsp;&lt;/b&gt;&amp;nbsp;각 변수들간의 관련성을 파악&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 본격적인 모델링에 앞서 각 품목 간의 관련성을 파악하기 위해 상관분석을 실시했습니다. 이는 변수들이 서로 얼마나 정보를 공유하고 있는지 확인하여, 이후 &lt;b data-index-in-node=&quot;82&quot; data-path-to-node=&quot;5&quot;&gt;PCA(주성분 분석)를 통한 데이터 압축의 타당성&lt;/b&gt;을 검토하기 위함입니다. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ8SbM/dJMcafeNMNV/P5lrmhukpVP02c052F57jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ8SbM/dJMcafeNMNV/P5lrmhukpVP02c052F57jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ8SbM/dJMcafeNMNV/P5lrmhukpVP02c052F57jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ8SbM%2FdJMcafeNMNV%2FP5lrmhukpVP02c052F57jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;655&quot; height=&quot;503&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;[1] 분석 기법의 선택: 왜 Spearman인가?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반적으로 사용하는 피어슨(Pearson) 상관계수 대신 &lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;8&quot;&gt;스피어만(Spearman) 순위 상관계수&lt;/b&gt;를 채택했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;이유 1 (이상치 대응):&lt;/b&gt; 앞선 EDA에서 확인했듯 본 데이터는 이상치가 많아, 수치 자체에 민감한 피어슨 계수보다 순위를 기반으로 하는 스피어만이 더 안정적인 결과를 제공합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;이유 2 (비선형성):&lt;/b&gt; 품목 간의 관계가 반드시 선형적이지 않더라도, 구매액의 증가 추세(단조성)를 정확히 포착할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;신뢰성 확보:&lt;/b&gt; 모든 상관계수에 대해 p-value 검정을 실시하여, 도출된 관계가 통계적으로 유의미함을 확인했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;[2] 핵심 발견: Milk-Grocery-Detergents_Paper의 강력한 연결고리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;분석 결과, 특정 품목군 사이에서 매우 밀접한 상관관계가 관찰되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 72px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 변수 쌍 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 상관계수(Spearman) &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 관계 강도 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Grocery &amp;harr; Detergents_Paper&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.801&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매우 강함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Milk &amp;harr; Grocery&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.773&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매우 강함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Milk &amp;harr; Detergents_Paper&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.680&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;이 상관분석 결과는 다음 단계인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b data-path-to-node=&quot;16&quot; data-index-in-node=&quot;18&quot;&gt;PCA의 결정적 근거&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15&quot;&gt;[3] PCA 전 사전 확인의 필요성 (Bridge to PCA)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;정보의 중복 확인:&lt;/b&gt; 세 변수(Milk, Grocery, Detergents_Paper)가 강하게 묶여 있다는 것은, 이들을 각각 개별 변수로 다루기보다 가공 및 소모품 구매 성향'이라는 하나의 핵심 축으로 통합했을 때 데이터의 특징을 더 잘 설명할 수 있음을 시사합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;차원 축소의 정당성:&lt;/b&gt; 변수들이 서로 따로 놀지 않고 뭉쳐 있으므로, 정보를 적게 잃으면서도 적은 수의 주성분으로 압축할 수 있다&quot;는 확신을 가지고 PCA 단계로 진입할 수 있었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;15&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-path-to-node=&quot;15&quot; data-index-in-node=&quot;0&quot;&gt;[4] 상관관계의 신뢰성 검정 (P-value Verification) &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도출된 상관관계가 통계적으로 유의미한지 확인하기 위해 &lt;b data-index-in-node=&quot;76&quot; data-path-to-node=&quot;5&quot;&gt;유의수준(&amp;alpha;) 0.05&lt;/b&gt;를 기준으로 스피어만 순위 상관분석 기반의 가설 검정을 수행했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;귀무가설(H0):&lt;/b&gt; 두 변수 간에는 상관관계가 없다. (상관계수 = 0)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;대립가설(H1):&lt;/b&gt; 두 변수 간에는 유의미한 상관관계가 존재한다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;분석 결과: 대부분 품목 유의미한 상관관계 확인&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작성한 파이썬 코드를 통해 모든 변수 쌍의 p-value를 계산한 결과,&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;8&quot;&gt;상관계수가 높게 나타난 주요 변수 쌍들의 p-value가 모두 0.05보다 훨씬 작게&lt;/b&gt; 나타났습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wcjxZ/dJMcaiWOYtD/tkrkkvdAkjzJ9asn0rUMK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wcjxZ/dJMcaiWOYtD/tkrkkvdAkjzJ9asn0rUMK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wcjxZ/dJMcaiWOYtD/tkrkkvdAkjzJ9asn0rUMK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwcjxZ%2FdJMcaiWOYtD%2FtkrkkvdAkjzJ9asn0rUMK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;428&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;639&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;3. 머신러닝 프로세스&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;① PCA&amp;nbsp; 주성분 분석 | 고차원 데이터를 관통하는 핵심 축 도출&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;[1] PCA 개요: 6개의 복잡함을 3개의 핵심으로&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;정의:&lt;/b&gt; 여러 변수(품목) 간의 상관관계를 이용해 정보 손실을 최소화하며 데이터를 대표하는 &lt;b&gt;새로운 축(PC)을 생성&lt;/b&gt;하는 기법입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;분석 결과:&lt;/b&gt; &lt;b&gt;상위 3개의 주성분만으로 전체 변동의 약 81.9%를 설명 가능함을 확인&lt;/b&gt;했습니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,1,0,0&quot;&gt;PC1 (44.1%):&lt;/b&gt; 전체 데이터의 절반 가까운 흐름을 결정하는 가장 강력한 축&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,1,1,0&quot;&gt;PC2 (27.2%):&lt;/b&gt; 두 번째로 중요한 구매 패턴 형성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,1,2,0&quot;&gt;PC3 (10.7%):&lt;/b&gt; 특정 품목(델리 등)의 미세한 차이 설명&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FeBeD/dJMcaaR5iVF/35kRnYTUYZTs7O3rLQE1mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FeBeD/dJMcaaR5iVF/35kRnYTUYZTs7O3rLQE1mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FeBeD/dJMcaaR5iVF/35kRnYTUYZTs7O3rLQE1mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFeBeD%2FdJMcaaR5iVF%2F35kRnYTUYZTs7O3rLQE1mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;454&quot; height=&quot;166&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;[2] 로딩값(Loading) 분석: 주성분에 비즈니스 언어 입히기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로딩값은 각 품목이 주성분을 형성하는 데 기여한 '성적표'입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로딩값의 절댓값이 클수록 그 주성분의 성격을 많이 좌우하는 품목입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;PC1:&lt;/b&gt; Milk, Grocery, Detergents_Paper의 기여도가 압도적입니다. 가공식품과 생활용품 중심의 &lt;b data-index-in-node=&quot;83&quot; data-path-to-node=&quot;9,0,0&quot;&gt;대량 구매 성향&lt;/b&gt;을 나타냅니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;PC2 :&lt;/b&gt; Fresh, Frozen 품목의 기여도가 높습니다. 신선 식품과 냉동 식자재 중심의 &lt;b data-index-in-node=&quot;73&quot; data-path-to-node=&quot;9,1,0&quot;&gt;식당/호텔 구매 성향&lt;/b&gt;을 나타냅니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;PC3 :&lt;/b&gt; Delicassen 비중이 두드러지며, &lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;9,2,0&quot;&gt;고급 가공식품이나 특수 품목&lt;/b&gt;에 대한 선호도를 설명합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPb1L8/dJMcaaxLTNo/0fvFdxMG8dwDKioDeS8DEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPb1L8/dJMcaaxLTNo/0fvFdxMG8dwDKioDeS8DEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPb1L8/dJMcaaxLTNo/0fvFdxMG8dwDKioDeS8DEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPb1L8%2FdJMcaaxLTNo%2F0fvFdxMG8dwDKioDeS8DEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;588&quot; height=&quot;323&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-path-to-node=&quot;5&quot; data-index-in-node=&quot;0&quot;&gt;[3] &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-path-to-node=&quot;5&quot; data-index-in-node=&quot;0&quot;&gt;분석의 목적: Biplot 시각화를 통한 PCA 분석&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;6&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-path-to-node=&quot;6,0,0&quot; data-index-in-node=&quot;0&quot;&gt;차원 축소:&lt;/b&gt;&amp;nbsp;사람이 인지할 수 없는 6차원의 구매 데이터를 2차원 평면(PC1, PC2)으로 투영하여 시각적 분석 환경을 구축했습니다. (Biplot)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Biplot은 고객(점)과 품목(화살표)을 한 좌표계에 그려 채널의 특성을 시각적으로 증명합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;화살표 방향:&lt;/b&gt; 고객 점이 특정 품목 화살표 방향에 모여 있다면, 해당 품목의 구매 비중이 높은 그룹입니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,2,0&quot;&gt;화살표 각도:&lt;/b&gt; 화살표 사이의 각도가 좁을수록 두 품목은 함께 구매되는 경향이 강합니다. (예: Grocery-Detergents_Paper의 좁은 각도 = 높은 동시 구매율)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pFooD/dJMcaduqbsl/bMmN9UXynXsfgOK4JK18yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pFooD/dJMcaduqbsl/bMmN9UXynXsfgOK4JK18yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pFooD/dJMcaduqbsl/bMmN9UXynXsfgOK4JK18yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpFooD%2FdJMcaduqbsl%2FbMmN9UXynXsfgOK4JK18yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;371&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-path-to-node=&quot;16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;② K-Means 클러스터링&amp;nbsp; &amp;nbsp;| 5가지 고객 페르소나&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;[1] K-Means 알고리즘: 행동 데이터 기반의 고객 그룹화&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;K-Means 알고리즘이란?&lt;/b&gt;&amp;nbsp;구매 패턴이 유사한 고객들을 하나의 그룹으로 묶어주는 대표적인 비지도 학습 알고리즘입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;역할:&lt;/b&gt; 각 고객을 PCA 좌표계(PC1, PC2) 상의 점으로 표현하고, 그룹 내 응집도는 극대화하고 그룹 간 이질성은 확보하는 최적의 군집을 찾아냅니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;본 프로젝트의 활용:&lt;/b&gt; 440명의 고객을 단순한 '숫자'가 아닌, &lt;b data-index-in-node=&quot;36&quot; data-path-to-node=&quot;5,2,0&quot;&gt;5개의 전략적 세그먼트&lt;/b&gt;로 나누어 차별화된 마케팅 전략을 수립하는 데 활용했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;[2] 최적 군집 수(K) 결정: 과학적 근거 기반의 의사결정&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;임의적인 판단이 아닌 통계적 지표를 결합하여 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;7&quot;&gt;K=5&lt;/b&gt;를 도출했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;엘보우 방법 (Elbow Method):&lt;/b&gt; 군집 내 제곱거합(WCSS)의 감소 폭이 급격히 줄어드는 지점을 확인했습니다. K=5 이후 완만해지는 '팔꿈치' 지점을 포착하여 효율적인 군집 수를 결정했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;실루엣 스코어 (Silhouette Score):&lt;/b&gt; 각 데이터가 자신이 속한 군집과 얼마나 잘 어울리는지 나타내는 지표입니다. K=5에서 약 &lt;b data-index-in-node=&quot;78&quot; data-path-to-node=&quot;8,1,0&quot;&gt;0.2689&lt;/b&gt;를 기록, 현실 세계의 복잡한 유통 데이터에서 유의미한 분리도가 확보되었음을 검증했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r0TgJ/dJMcaiWOZJ0/ojDZFsygM1iMT3x1eSj5ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r0TgJ/dJMcaiWOZJ0/ojDZFsygM1iMT3x1eSj5ck/img.png&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;380&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.4864%; margin-right: 10px;&quot; data-widthpercent=&quot;36.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r0TgJ/dJMcaiWOZJ0/ojDZFsygM1iMT3x1eSj5ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr0TgJ%2FdJMcaiWOZJ0%2FojDZFsygM1iMT3x1eSj5ck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;766&quot; height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coeTAB/dJMcahczxzg/euGism1tAmZnstTpyBa1F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coeTAB/dJMcahczxzg/euGism1tAmZnstTpyBa1F0/img.png&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;443&quot; data-is-animation=&quot;false&quot; style=&quot;width: 31.3538%; margin-right: 10px;&quot; data-widthpercent=&quot;32.1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coeTAB/dJMcahczxzg/euGism1tAmZnstTpyBa1F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoeTAB%2FdJMcahczxzg%2FeuGism1tAmZnstTpyBa1F0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;789&quot; height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SBOhm/dJMcagkqn2P/nrK2hQKRDld9wejbBPVxC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SBOhm/dJMcagkqn2P/nrK2hQKRDld9wejbBPVxC0/img.png&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;491&quot; data-is-animation=&quot;false&quot; style=&quot;width: 30.8343%;&quot; data-widthpercent=&quot;31.57&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SBOhm/dJMcagkqn2P/nrK2hQKRDld9wejbBPVxC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSBOhm%2FdJMcagkqn2P%2FnrK2hQKRDld9wejbBPVxC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-path-to-node=&quot;19&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-path-to-node=&quot;6&quot; data-index-in-node=&quot;0&quot;&gt;[3] 군집 결과 시각화&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NiIL2/dJMb996GY2U/Q3JcbhmTUsJXGYswTroGY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NiIL2/dJMb996GY2U/Q3JcbhmTUsJXGYswTroGY1/img.png&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;570&quot; data-is-animation=&quot;false&quot; width=&quot;662&quot; height=&quot;371&quot; style=&quot;width: 60.4594%; margin-right: 10px;&quot; data-widthpercent=&quot;61.17&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NiIL2/dJMb996GY2U/Q3JcbhmTUsJXGYswTroGY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNiIL2%2FdJMb996GY2U%2FQ3JcbhmTUsJXGYswTroGY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1017&quot; height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ndGUr/dJMcadOI5cR/T0N52PON0KepmP2pv1Uvd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ndGUr/dJMcadOI5cR/T0N52PON0KepmP2pv1Uvd1/img.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;694&quot; data-is-animation=&quot;false&quot; width=&quot;569&quot; height=&quot;502&quot; style=&quot;width: 38.3778%;&quot; data-widthpercent=&quot;38.83&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ndGUr/dJMcadOI5cR/T0N52PON0KepmP2pv1Uvd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FndGUr%2FdJMcadOI5cR%2FT0N52PON0KepmP2pv1Uvd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 106px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 21.5505%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;페르소나&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.75974%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;고객 &lt;br /&gt;비중&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.52718%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;매출 &lt;br /&gt;비중&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.3179%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;평균 구매액&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6666%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;핵심 패턴 (평균 대비)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.1784%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;주요 전략&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5505%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; ① 대형 리테일&amp;middot;편의점형 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.75974%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;24.5%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.52718%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot; data-path-to-node=&quot;3,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,2,0&quot;&gt;40.3% (최고)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.3179%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;54,557 MU&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6666%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전 품목 평균 대비&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2배 이상 구매&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.1784%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전담 매니저배치, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대량 구매 전용 단가 정책&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5505%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; ② 신선&amp;middot;냉동 중심형 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.75974%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 28.2% (최다) &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.52718%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;29.2%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.3179%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;34,441 MU&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6666%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;신선식품(1.6배), 냉동식품(1.9배) 식자재 특화&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.1784%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;콜드체인 물류 강조, 정기 식자재 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구독 모델 및 시즌 패키지 제안&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5505%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; ③ 식료품&amp;middot;세제 강조형 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.75974%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;12.0%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.52718%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot; data-path-to-node=&quot;3,3,2,0&quot;&gt;12.5%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.3179%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;34,367 MU&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6666%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가공식품/세제 등 공산품 집중 (평균 2.5배)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.1784%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주력 품목 점유율 수성 타겟 할인, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인접 카테고리 교차 판매&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5505%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; ④ 소규모 균형형 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.75974%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;25.9%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.52718%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot; data-path-to-node=&quot;3,4,2,0&quot;&gt;14.0%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.3179%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;17,898 MU&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6666%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;품목 편중 없는 소량 다품목 구매 (안정적 기반)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.1784%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;미구매 품목 샘플링을 통한 장바구니 확대, 로열티 멤버십 운영&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5505%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; ⑤ 초소규모&amp;middot;냉동 위주형 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.75974%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;9.3%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.52718%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot; data-path-to-node=&quot;3,5,2,0&quot;&gt;4.1%&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.3179%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;14,506 MU&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6666%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;냉동 위주 목적성 구매, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기타 품목 저조&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.1784%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;진입 장벽 완화(최소 주문량 한시적 인하), 웰컴 프로모션 강화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;매출 기여도 기반 집중 관리:&lt;/b&gt; 전체 고객의 24.5%에 불과한 &lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;7,0,0&quot;&gt;'대형 리테일형'&lt;/b&gt; 그룹이 &lt;b&gt;전체 매출의 40%를 견인&lt;/b&gt;하고 있습니다. 이는 철저한 파레토 법칙(80:20)을 따르고 있으며, 이들에 대한 이탈 방지가 기업 수익성의 핵심임을 시사합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;성장 동력 발굴:&lt;/b&gt; '신선&amp;middot;냉동 중심형'은 고객 수와 매출 비중이 모두 균형 있게 높습니다. 이들의 신선식품 수요를 공산품(세제류 등)으로 전이시킬 수 있다면 추가적인 매출 성장의 기회가 될 것으로 보입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-path-to-node=&quot;19&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;③ 머신러닝 분류 모델 | 고객 채널(Horeca vs Retail) 자동 예측 &lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;어떤 채널인지 예측하기 위해 다양한 알고리즘을 비교 평가했습니다.&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-path-to-node=&quot;8&quot; data-index-in-node=&quot;0&quot;&gt;[1] 분석의 목적 : 왜 채널을 예측해야 하는가 ?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;타겟 마케팅 최적화:&lt;/b&gt; 신규 고객의 초기 구매 패턴만 보고도 이들이 호텔/레스토랑/카페 유형 (Horeca)인지 소매 유형 (Retail)인지 즉시 판별하여 맞춤형 카탈로그를 발송할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;영업 리소스 효율화:&lt;/b&gt; 영업 사원이 직접 방문하기 전에 채널을 예측함으로써, 우선순위가 높은 잠재 고객에게 인력을 집중 배치할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;데이터 기반의 자동화:&lt;/b&gt; 직관에 의존하던 고객 분류를 머신러닝 모델로 자동화하여 의사결정의 속도와 정확도를 동시에 높입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8&quot;&gt;[2] 입력 데이터 및 전처리 (Data Pipeline)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;분석의 일관성을 위해 앞선 클러스터링과 동일한 전처리 과정을 공유하도록 설계했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;타겟 변수(y):&lt;/b&gt; Channel (0: Horeca / 1: Retail)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;입력 변수(X):&lt;/b&gt; 6개 품목의 구매액 + 지역(Region) 정보&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,0&quot;&gt;주요 전처리:&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,1,0,0&quot;&gt;Log Transformation:&lt;/b&gt; 구매액의 거대한 편차를 줄여 모델이 패턴을 고르게 학습하도록 유도&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,1,1,0&quot;&gt;Standard Scaling:&lt;/b&gt; 모든 품목의 단위를 통일하여 '공정한 영향력' 부여&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,1,2,0&quot;&gt;One-Hot Encoding:&lt;/b&gt; '지역'과 같은 범주형 데이터를 컴퓨터가 인식할 수 있는 숫자 형태로 변환&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12&quot;&gt;[3] 모델 라인업 및 성능 검증&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터의 패턴을 가장 잘 찾아낼 모델을 찾기 위해 선형 모델부터 앙상블 기법까지 총 7가지의 알고리즘을 후보로 올렸습니다. 성능 평가는 임계값에 상관없이 모델의 분류 능력을 종합적으로 보여주는 &lt;b data-index-in-node=&quot;112&quot; data-path-to-node=&quot;5&quot;&gt;AUC(ROC-AUC)&lt;/b&gt; 지표를 기준으로 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 206px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 13.876%; text-align: center; height: 38px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 분류 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.4574%; text-align: center; height: 38px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 모델명 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 38px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; Train AUC&lt;br /&gt;(학습 데이터 성능)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 38px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; CV AUC&lt;br /&gt;(검증 데이터 성능)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 38px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; Gap(격차) &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 38px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 결과 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 13.876%; text-align: center; height: 42px;&quot; rowspan=&quot;2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;선형 모델&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.4574%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Logistic Regression&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.942&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.916&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.026&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;채택&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 19.4574%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SGD Classifier&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.940&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.908&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.032&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;채택&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 13.876%; text-align: center; height: 105px;&quot; rowspan=&quot;4&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앙상블&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.4574%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Random Forest&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.000&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.919&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.081&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;채택&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 19.4574%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;XGBoost&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.999&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.905&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.094&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;채택&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;width: 19.4574%; text-align: center; height: 42px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CatBoost&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 42px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.998&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 42px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.892&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 42px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.106&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 42px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제외&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(낮은 효율)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 19.4574%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Gradient Boosting&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.000&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.881&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.119&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제외 (과적합 경향)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 13.876%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;의사결정나무&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.4574%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Decision Tree&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.000&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.741&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.259&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제외 (과적합 경향)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8&quot;&gt;[4] 전략적 선별 기준: 왜 4개 모델만 채택했는가?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단순히 점수가 높은 모델이 아니라, '현업에서 배신하지 않을 안정성'을 기준으로 최종 4개 모델 (Logistic, SGD, RF, XGB)을 선발했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt;(1) 과적합(Overfitting) 모델의 과감한 배제&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Decision Tree와 Gradient Boosting은 Train AUC가 1.0(만점)에 가깝지만, 검증 점수(CV)와의 격차가 매우 큽니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 모델이 구매 패턴의 원리를 학습한 것이 아니라, &lt;b data-index-in-node=&quot;114&quot; data-path-to-node=&quot;11&quot;&gt;훈련 데이터 자체를 통째로 암기&lt;/b&gt;해버렸음을 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13&quot;&gt;(2) 일반화(Generalization) 성능 최우선&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종 채택된 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;14&quot;&gt;Logistic Regression&lt;/b&gt;과 &lt;b data-index-in-node=&quot;28&quot; data-path-to-node=&quot;14&quot;&gt;SGD&lt;/b&gt;는 Train과 CV의 격차가 약 0.03 내외로 매우 작습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 어떤 환경에서도 일관된 성능을 낼 수 있음을 암시합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14&quot;&gt;[채택된 4개 모델 성능 비교 | 핵심 성능 지표 이해하기]&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성능 지표 용어를 비즈니스 언어로 풀이하면 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0&quot;&gt;정확도(Accuracy):&lt;/b&gt; &quot;얼마나 많이 맞혔는가?&quot; (전체적인 예측 성공률)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&gt;정밀도(Precision):&lt;/b&gt; &quot;모델이 Retail이라고 한 고객 중, &lt;b data-index-in-node=&quot;39&quot; data-path-to-node=&quot;16,1,0&quot;&gt;진짜 Retail&lt;/b&gt;은 몇 명인가?&quot; (오발송 방지)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,2,0&quot;&gt;재현율(Recall):&lt;/b&gt; &quot;실제 Retail 고객들을 &lt;b data-index-in-node=&quot;29&quot; data-path-to-node=&quot;16,2,0&quot;&gt;하나도 놓치지 않고&lt;/b&gt; 다 찾아냈는가?&quot; (기회 손실 방지)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,3,0&quot;&gt;AUC (ROC-AUC):&lt;/b&gt; &quot;모델이 채널을 구분해내는 &lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;16,3,0&quot;&gt;순수한 실력&lt;/b&gt;은 어느 정도인가?&quot; (1에 가까울수록 좋은 모델)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 189px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.5272%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 모델 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.8062%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-path-to-node=&quot;16,0,0&quot; data-index-in-node=&quot;0&quot;&gt; 정확도&lt;br /&gt;(Accuracy) &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-path-to-node=&quot;16,1,0&quot; data-index-in-node=&quot;0&quot;&gt; 정밀도&lt;br /&gt;(Precision) &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-path-to-node=&quot;16,2,0&quot; data-index-in-node=&quot;0&quot;&gt; 재현율&lt;br /&gt;(Recall) &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.1318%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; AUC &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.2016%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 특징 및 활용 예시 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;width: 18.5272%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Logistic Regression&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.8062%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.90&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.90&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.77&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.1318%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;0.95&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.2016%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,1,5,0&quot;&gt;[균형형]&lt;/b&gt; 설명력이 가장 좋고 성능이 안정적임&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;width: 18.5272%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;XGBoost&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.8062%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.89&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 0.93 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.71&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.1318%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.93&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.2016%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,2,5,0&quot;&gt;[신중형]&lt;/b&gt; Retail 오탐을 최소화해야 할 때 유리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;width: 18.5272%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Random Forest&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.8062%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.90&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.90&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.77&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.1318%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.94&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.2016%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,3,5,0&quot;&gt;[안정형]&lt;/b&gt; 비선형 패턴까지 골고루 잘 잡아냄&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;width: 18.5272%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SGDClassifier&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.8062%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 0.91 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.86&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 0.86 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.1318%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0.93&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.2016%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,4,5,0&quot;&gt;[적극형]&lt;/b&gt; 잠재 고객을 놓치지 않고 다 찾아낼 때 유리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;19&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;④&lt;/span&gt; Feature Importance &amp;amp; SHAP 분석 | 모델의 '판단 근거' 파헤치기 &lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;[1]&amp;nbsp; AI의 블랙박스를 여는 두 가지 지표&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단순히 예측 점수가 높은 모델을 넘어, &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;5&quot;&gt;'왜(Why)'&lt;/b&gt; 그런 결과가 나왔는지 설명하기 위해 두 가지 지표를 활용했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;Feature Importance (특성 중요도):&lt;/b&gt; &quot;전체적으로 어떤 변수가 가장 강력한 영향력을 가졌는가?&quot;를 정량화합니다. (비즈니스 전략 수립 시 우선순위 결정에 유리)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;SHAP Value :&lt;/b&gt; &quot;특정 고객의 예측에서 각 변수가 확률을 얼마나 올리고 내렸는가?&quot;를 계산합니다. (개별 고객 맞춤형 마케팅 및 결과 설명에 유리)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;[2] Feature Importance | 채널 분류 핵심 변수는 &quot;Detergents_Paper ( 세제&amp;middot;종이류 )&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종 4개 모델을 분석한 결과, 공통적으로 세제&amp;middot;종이류(Detergents_Paper)가 채널(Retail vs Horeca)을 구분하는 압도적인 결정 병기임을 확인했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;현상:&lt;/b&gt; 모든 알고리즘에서 log_Detergents_Paper의 가중치가 1순위로 나타남.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;비즈니스적 의미:&lt;/b&gt; 도매 시장에서 유제품이나 식료품은 식당과 마트 모두 대량 구매할 수 있지만, &lt;b data-index-in-node=&quot;53&quot; data-path-to-node=&quot;6,1,0&quot;&gt;가정용 소모품인 세제와 종이류&lt;/b&gt;는 재판매를 목적으로 하는 소매점(Retail)에서 훨씬 압도적인 비중으로 구매한다는 사실이 데이터로 입증되었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 105px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 모델 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 1순위 변수 &lt;br /&gt;(가중치) &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.721%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2순위 변수 &lt;br /&gt;(가중치) &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.6976%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3순위 변수 &lt;br /&gt;(가중치) &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 데이터 해석 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Logistic Regression&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세제&amp;middot;종이류 (1.39)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.721%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;식료품 (0.88)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.6976%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유제품 (0.58)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,4,0&quot;&gt;[균형형 ]&lt;/b&gt; &lt;b data-index-in-node=&quot;37&quot; data-path-to-node=&quot;4,1,2,0&quot;&gt;가중치가 계층적으로 고르게 분포&lt;/b&gt;함. 가장 표준적인 판단을 내림.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;XGBoost&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세제&amp;middot;종이류 (0.64)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.721%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유제품 (0.09)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.6976%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;식료품 (0.07)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,4,0&quot;&gt;[신중형 ]&lt;/b&gt; 세제(0.64) 가중치가 2위(0.09)보다 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;4,2,2,0&quot;&gt;7배 이상 압도적&lt;/b&gt;임. 확실한 신호(세제류 대량구매)가 포착될 때만 날카롭게 반응함.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Random Forest&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세제&amp;middot;종이류 (0.37)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.721%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;식료품 (0.30)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.6976%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유제품 (0.14)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,3,4,0&quot;&gt;[안정형]&lt;/b&gt; 세제(0.37)와 식료품(0.30)의 &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;4,3,2,0&quot;&gt;중요도 격차가 가장 작음.&lt;/b&gt; 특정 품목 하나에 휘둘리지 않고 복합적인 패턴을 고려함.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 18.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SGDClassifier&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세제&amp;middot;종이류 (7.50)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.721%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;식료품 (2.54)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.6976%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;신선식품 (2.04)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.0698%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,4,4,0&quot;&gt;[적극형]&lt;/b&gt; 세제(7.50) 가중치가 매우 높고 &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;4,4,2,0&quot;&gt;모든 변수의 절댓값이 큼.&lt;/b&gt; 작은 구매 변화도 크게 확대 해석하여 타겟을 넓게 포착함.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-path-to-node=&quot;4&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-path-to-node=&quot;4&quot; data-index-in-node=&quot;0&quot;&gt;[3] SHAP Value 분석&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;(1) 왜 SHAP 분석이 필요한가?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단순히 &quot;이 변수가 중요하다&quot;는 정보만으로는 부족합니다. SHAP이 필요한 진짜 이유는 '설명 가능한 AI(XAI)'를 구현하기 위해서입니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;기존 방식 (Feature Importance):&lt;/b&gt; &quot;우리 모델은 전반적으로 세제 구매량을 중요하게 봐요&quot;라고 말하는 &lt;b data-index-in-node=&quot;65&quot; data-path-to-node=&quot;6,0,0&quot;&gt;전체적(Global)&lt;/b&gt; 경향성만 보여줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;SHAP 방식 (SHAP Value):&lt;/b&gt; &quot;이 고객은 세제는 많이 샀지만, 냉동식품 구매량이 워낙 압도적이라 최종적으로 Horeca로 분류되었습니다&quot;라고 말하는 &lt;b data-index-in-node=&quot;89&quot; data-path-to-node=&quot;6,1,0&quot;&gt;개별적(Local)&lt;/b&gt; 근거를 제시합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;비즈니스 가치:&lt;/b&gt; 블랙박스였던 AI의 판단에 '근거'를 부여함으로써, 마케팅 팀이 &quot;왜 이 고객에게 이 쿠폰을 줘야 하는가?&quot;라는 질문에 당당히 답할 수 있게 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;(2) SHAP Summary Plot 읽는 법: 데이터의 '힘'과 '방향' 읽기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SHAP 차트는 단순한 그래프가 아니라, 수천 가구의 구매 패턴이 부딪히며 만들어낸 '영향력의 지도'입니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;가로축 (SHAP Value): 영향력의 방향과 크기&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,1,0,0&quot;&gt;0을 기준&lt;/b&gt;으로 오른쪽(+)에 점이 찍히면 소매점(Retail)일 확률을 높이는 힘, 왼쪽(-)에 찍히면 호텔/레스토랑/카페(Horeca)일 확률을 높이는 힘으로 작용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중앙에서 멀리 떨어질수록 모델의 판단을 뒤흔드는 '강력한 증거'가 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;점의 색상 (Feature Value): 실제 데이터의 수치&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0,0&quot;&gt;빨간색 (High):&lt;/b&gt; 해당 품목의 구매액이 &lt;b data-index-in-node=&quot;24&quot; data-path-to-node=&quot;9,1,1,0,0&quot;&gt;높음&lt;/b&gt;을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,1,0&quot;&gt;파란색 (Low):&lt;/b&gt; 해당 품목의 구매액이 &lt;b data-index-in-node=&quot;23&quot; data-path-to-node=&quot;9,1,1,1,0&quot;&gt;낮음&lt;/b&gt;을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;점의 밀도 (분포): 데이터의 집중도&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;점이 수직으로 두껍게 쌓여 있다면, 해당 지점에 비슷한 특성을 가진 고객들이 많이 몰려 있다는 뜻입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Ⅰ. 로지스틱 회귀(Logistic Regression) 의 SHAP 분석 결과&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;① 모델의 핵심 메커니즘: &quot;연속적인 확률 변화의 반영&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;랜덤포레스트가 특정 선을 넘었는지 'O/X'로 단정 짓는다면, &lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;4&quot;&gt;로지스틱 회귀는 입력값의 변화에 따라 &quot;리테일일 확률&quot;을 0%에서 100%까지 부드럽게 연결하여 계산&lt;/b&gt;합니다. 이는 마치 물감에 물을 타듯, 구매액이 늘어날수록 확신의 농도를 서서히 높여가는 방식입니다. SHAP 차트에서 점들이 끊기지 않고 넓게 퍼진 &lt;b data-index-in-node=&quot;175&quot; data-path-to-node=&quot;4&quot;&gt;'안개형 그라데이션'&lt;/b&gt; 패턴이 나타나는 이유는, 입력값의 작은 변화조차 놓치지 않고 확률에 섬세하게 반영하기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5&quot;&gt;② SHAP 분석을 통해 입증된 로지스틱 회귀의 차별적 성능&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;부드러운 그라데이션 패턴 (Continuous Gradient):&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;점들이 뭉치지 않고 가로로 길게 늘어선 형태는 모델이 &lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;6,0,1,0,0&quot;&gt;데이터를 매우 입체적이고 연속적으로 관찰&lt;/b&gt;하고 있음을 보여줍니다. 특정 수치에서 판단이 급격하게 변하는 것이 아니라, 구매 금액이 쌓이는 만큼 비례해서 확신도를 조정하는 로지스틱만의 정직한 판단 로직이 드러납니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;변수 간의 조화로운 기여 (Balanced Weighting):&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특정 변수가 독주하기보다 여러 변수가 계층적으로 확률을 쌓아 올립니다. SHAP 차트 상단부터 하단까지 색상의 변화가 일정하게 나타나는 것은, 각 품목의 구매 데이터가 &lt;b data-index-in-node=&quot;94&quot; data-path-to-node=&quot;6,1,1,0,0&quot;&gt;서로의 확신을 탄탄하게 뒷받침하며 최종 확률을 완성&lt;/b&gt;해 나가는 구조임을 증명합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot; data-path-to-node=&quot;10&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[호텔/레스토랑/카페]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[소매 (리테일)]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VMr9a/dJMcajuGw9G/2c16SEntKdwAij5MtQiP01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VMr9a/dJMcajuGw9G/2c16SEntKdwAij5MtQiP01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VMr9a/dJMcajuGw9G/2c16SEntKdwAij5MtQiP01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVMr9a%2FdJMcajuGw9G%2F2c16SEntKdwAij5MtQiP01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;377&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 22.4418%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;주요 현상&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.7675%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;모델 특성 반영&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.186%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;비즈니스 해석&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;판단 방식&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 22.4418%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #1a5490; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-path-to-node=&quot;3,1,1,0&quot; data-index-in-node=&quot;0&quot;&gt;그라데이션형 안개&lt;/b&gt;&amp;nbsp;현상&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.7675%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #1a5490; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입력값에 비례해 확률이 변하는&amp;nbsp;&lt;b data-path-to-node=&quot;3,1,2,0&quot; data-index-in-node=&quot;17&quot;&gt;선형 결합&lt;/b&gt;&amp;nbsp;구조이기 때문&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.186%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #1a5490; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구매액 변화에 따라 채널 확률이 섬세하고 부드럽게 움직임&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;세제&amp;middot;종이류&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 22.4418%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파랑&amp;rarr;빨강으로&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 넓게 확산&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.7675%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;구매량이 늘어날수록 비례해서&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;확신을 가짐&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.186%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소매점(Retail) 여부를&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가르는 가장 정직한 나침반&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;식료품&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 22.4418%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세제류와 유사한&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;넓은 그라데이션&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.7675%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세제와 함께 움직이며&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;확률을 탄탄하게 받쳐줌&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.186%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리테일 채널임을 확신하게 만드는&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강력한 보조 엔진&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;유제품&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 22.4418%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중앙 근처에서 촘촘하게&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;색이 섞임&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.7675%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;크게 휘두르지 않고&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;미세하게 확률을 조정함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.186%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;판단을 급하게 바꾸지 않는 신중한&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보조 지표&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;냉동식품&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 22.4418%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;역방향 그라데이션&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(빨강이 왼쪽)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.7675%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 품목이 많아질수록&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리테일과는 거리가 멀어짐&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.186%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;식재료 비중이 높은 호레카(Horeca)만의 시그니처&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기타 지역 /&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Oporto 지역&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 22.4418%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;색은 나뉘나&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;좌우 폭이 매우 좁음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.7675%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고는 하되 대세를 바꿀&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;힘은 주지 않음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.186%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;어디 사느냐&quot;보다 &quot;무엇을 사느냐&quot;가 핵심임을 방증&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;즉석&amp;middot;가공식품&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 22.4418%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: center;&quot;&gt;중앙에서&amp;nbsp;&lt;/span&gt;미세한 색상의&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파동&lt;span style=&quot;color: #333333; text-align: center;&quot;&gt;&amp;nbsp;보임&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.7675%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아주 미묘한 차이가 있을 때만&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;확률 끝자리를 만짐&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.186%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단독 영향력은 작으나 패턴의&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;디테일을 완성함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.6047%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;신선식품&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 22.4418%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: center;&quot;&gt;점들이 완전히&amp;nbsp;&lt;/span&gt;수직으로&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;고착됨&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.7675%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 데이터는 채널 구분엔&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아무런 도움이 안 된다고 무시함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.186%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모든 업종의 필수품이라&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;변별력이 없는 공통 품목&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;③ 비즈니스 전략 가이드: &quot;정교한 확률 기반 타겟팅과 시뮬레이션&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;세밀한 등급별 마케팅 설계 (Probability Scoring):&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단순히 '리테일이다/아니다'를 넘어, &quot;이 고객은 85% 확률로 리테일이다&quot;라는 식의 &lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;8,0,1,0,0&quot;&gt;정밀한 확률 스코어링&lt;/b&gt;이 가능합니다. 따라서 확률 구간별로 혜택을 다르게 제공하는 등급제 프로모션을 설계하거나, 고객의 잠재력을 수치화하여 관리할 때 가장 효과적입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;정직한 변화 추적 및 예측 안정성:&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입력값이 조금 변하면 결과도 그만큼만 변하는 예측의 예측 가능성(Predictability)이 뛰어납니다. 대시보드 시뮬레이션 시 사용자가 수치를 조절함에 따라 확률 게이지가 부드럽게 움직이므로, 현업 담당자가 데이터 변화에 따른 결과의 추이를 가장 직관적으로 납득할 수 있는 환경을 제공합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Ⅱ.&lt;b&gt;XGBoost&amp;nbsp;&lt;/b&gt; 의 SHAP 분석 결과&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;① 모델의 핵심 메커니즘: &quot;오차 보정을 통한 단계적 정밀화&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로지스틱 회귀가 부드러운 안개처럼 확률을 뿌리고 랜덤포레스트가 한꺼번에 투표를 한다면, &lt;b data-index-in-node=&quot;49&quot; data-path-to-node=&quot;4&quot;&gt;XGBoost는 앞선 나무의 실수(오차)를 다음 나무가 계속해서 보완하며 정답을 찾아가는 정교한 방식&lt;/b&gt;을 취합니다. 이는 마치 사격 선수가 영점을 조절하며 과녁 중앙을 향해 점진적으로 다가가는 과정과 같습니다. SHAP 차트에서 특정 구간이 텅 비어 있는 현상은, 모델이 확실하지 않은 정보에는 침묵하고 명확한 단서가 잡힐 때만 날카롭게 반응하기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5&quot;&gt;② SHAP 분석을 통해 입증된 XGBoost의 차별적 성능&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;중앙이 비어 있는 양극화 현상 (Polarization Pattern):&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,1,0,0&quot;&gt;세제&amp;middot;종이류&lt;/b&gt;나 &lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;6,0,1,0,0&quot;&gt;식료품&lt;/b&gt; 변수에서 점들이 중앙(0)을 비워두고 좌우로 완전히 갈라진 형태를 보입니다. 이는 모델이 &quot;애매한 판단&quot;을 지양하고, 확실한 임계값을 넘는 순간 채널 정체성을 &lt;b data-index-in-node=&quot;101&quot; data-path-to-node=&quot;6,0,1,0,0&quot;&gt;스위치를 켜듯 단호하게 가려내고 있음&lt;/b&gt;을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;핵심 변수에 대한 선택과 집중 (Feature Focus):&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모든 변수에 골고루 반응하기보다, 채널을 결정짓는 결정적인 변수(세제류 등)에 모든 화력을 집중합니다. 이는 비주류 데이터의 소음(Noise)에 휘둘리지 않고, &lt;b data-index-in-node=&quot;90&quot; data-path-to-node=&quot;6,1,1,0,0&quot;&gt;가장 변별력이 높은 데이터만 골라내어 예측의 선명도를 극대화&lt;/b&gt;하는 XGBoost만의 효율적인 로직이 반영된 결과입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;10&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[호텔/레스토랑/카페]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[소매 (리테일)]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxkg1M/dJMcaio22PU/HmIFEURvymhteh14FIgEKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxkg1M/dJMcaio22PU/HmIFEURvymhteh14FIgEKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxkg1M/dJMcaio22PU/HmIFEURvymhteh14FIgEKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdxkg1M%2FdJMcaio22PU%2FHmIFEURvymhteh14FIgEKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;410&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 165px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;주요 현상&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5117%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;모델 특성 반영&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.9302%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;비즈니스 해석&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;판단 방식&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;극단적 양극화&amp;nbsp;현상&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5117%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;확실한 근거가 포착될 때만 날카롭게 반응하는&amp;nbsp;신중한 판단&amp;nbsp;기제&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.9302%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;애매한 중간 지대 없이&amp;nbsp;채널 정체성을&lt;br /&gt;칼같이 구분해냄&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;세제&amp;middot;종이류&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중앙(0)을 비워두고&amp;nbsp;좌우로&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;완전히 갈라짐&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5117%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;채널을 가르는&amp;nbsp;'스위치'&amp;nbsp;같은 변수로 인식하며 가장 높은 비중 부여&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.9302%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 품목의 구매액이 기준을 넘는 순간 무조건 소매점(Retail)으로 확신&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;식료품&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세제류와 마찬가지로&amp;nbsp;중앙이&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;텅 빈 형태&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5117%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세제류의 판단을 보강하는&amp;nbsp;최종 확인 사격용 변수로 활용&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.9302%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세제와 식료품이 동시에 높으면&amp;nbsp;오탐률 0%에 가까운 신뢰도&amp;nbsp;확보&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;유제품&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;좌우로 넓게 퍼지나&amp;nbsp;중앙&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;밀도도 높음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5117%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세제/식료품이 애매할 때&amp;nbsp;확률을 미세하게 보정하는 역할&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.9302%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리테일 판단의 완성도를 높여주는&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정밀한 보조 지표&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;신선식품&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;점들이 중앙에 뭉쳐 있으나&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;좌우 폭은 존재&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5117%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;채널 분류의 메인 근거는 아니지만&amp;nbsp;조합에 따라 가점을 부여&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.9302%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 모델보다 신선식품의 구매 패턴을&amp;nbsp;조금 더 예민하게 관찰함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;냉동식품&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;역방향&amp;nbsp;분포가 뚜렷하며&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상단에 위치&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5117%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;식자재 중심 고객(Horeca)을&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;걸러내는&amp;nbsp;강력한 '마이너스' 필터&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.9302%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;냉동식품 구매량이 일정 선을 넘으면&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;즉시 리테일 후보에서 제외&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;즉석&amp;middot;가공식품&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중앙(0) 근처에 점들이&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빽빽하게 수직 밀집&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5117%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아주 확실한 데이터가 아니면&amp;nbsp;판단 근거로 삼지 않는 신중함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.9302%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;틈새 구매 패턴이 명확한 고객에게만&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제한적으로 영향력 발휘&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;지역 변수&amp;nbsp;(기타/Oporto)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.2325%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;색상은 갈리나&amp;nbsp;중앙(0)에&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;완벽히 고정&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.5117%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지역적 요인은 채널 예측에&amp;nbsp;아무런 도움이 안 된다고 단정함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.9302%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;고객의 지역적 위치 보다는&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;'구매 품목'에 집중&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;③ 비즈니스 전략 가이드: &quot;고정밀 타겟팅과 오탐 리스크 관리&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;오탐률을 최소화한 정밀 타겟팅 (Precision 중심):&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;확실하지 않으면 리테일이라고 부르지 않겠다&quot;는 매우 신중한 태도를 보입니다. 따라서 틀린 예측으로 인한 비용 낭비를 줄여야 하거나, &lt;b data-index-in-node=&quot;75&quot; data-path-to-node=&quot;8,0,1,0,0&quot;&gt;가장 확실한 소매점 고객만을 골라내어 고효율 마케팅을 집행해야 하는 상황&lt;/b&gt;에 가장 최적화된 모델입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;강력한 '거름망' 역할 수행:&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,1,0,0&quot;&gt;냉동식품&lt;/b&gt;의 역방향 분포에서 보듯, 소매점이 아닐 가능성이 높은 신호를 즉각적으로 포착해냅니다. 이는 대시보드 시뮬레이션 시 부적합한 타겟을 빠르게 걸러내 주는 &lt;b data-index-in-node=&quot;89&quot; data-path-to-node=&quot;8,1,1,0,0&quot;&gt;강력한 필터링 엔진&lt;/b&gt;으로서 현업 담당자에게 매우 높은 신뢰감을 줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;Ⅲ.랜덤포레스트(Random Forest)&lt;/b&gt; 의 SHAP 분석 결과&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;① 모델의 핵심 메커니즘: &quot;다수결 기반의 합리적 판단&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로지스틱 회귀가 확률을 부드럽게 조정한다면, &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;4&quot;&gt;랜덤포레스트는 수백 개의 의사결정 나무가 각자의 기준대로 투표하여 '집단적 합의'를 통해 결론&lt;/b&gt;을 내립니다. 이는 여러 사람의 의견을 모아 최선의 답을 찾는 '집단지성' 원리와 같습니다. SHAP 차트에서 데이터가 선형으로 늘어지지 않고 특정 지점에 뭉쳐 있는 것은, 모델이 &quot;특정 임계값을 넘었는가?&quot;라는 질문에 다수가 동의하며 채널의 정체성을 명확히 구분 짓고 있다는 증거입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5&quot;&gt;② SHAP 분석을 통해 입증된 랜덤포레스트의 차별적 성능&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;데이터의 군집화 현상 (Clustering Pattern):&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;점들이 특정 지점에 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;6,0,1,0,0&quot;&gt;포도송이처럼 뭉쳐 있는 패턴&lt;/b&gt;은 개별 나무들이 공통된 판단 기준에 도달했음을 의미합니다. 이는 모델이 데이터를 단순히 수치로만 파악하는 것이 아니라, 유사한 특성을 가진 고객들을 하나의 그룹으로 묶어 안정적으로 분류하고 있음을 보여줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;변동성에 강한 예측 일관성 (Robustness):&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특정 변수 하나에 결과가 휘둘리지 않고 여러 변수의 조합을 고르게 고려합니다. 이는 수백 개의 나무가 서로의 오류를 상쇄함으로써, 일부 데이터에 비정상적인 수치가 섞여 있더라도 전체적인 &lt;b data-index-in-node=&quot;104&quot; data-path-to-node=&quot;6,1,1,0,0&quot;&gt;예측의 중심을 잃지 않는 랜덤포레스트만의 강점&lt;/b&gt;이 반영된 결과입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[호텔/레스토랑/카페]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[소매 (리테일)]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OgLh6/dJMb996HJFp/s5Ouv3S10SdylBJrgnMDUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OgLh6/dJMb996HJFp/s5Ouv3S10SdylBJrgnMDUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OgLh6/dJMb996HJFp/s5Ouv3S10SdylBJrgnMDUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOgLh6%2FdJMb996HJFp%2Fs5Ouv3S10SdylBJrgnMDUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;566&quot; height=&quot;340&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 286px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 구분 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.3953%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 주요 현상 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.9768%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 모델 특성 해석&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3721%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 비즈니스 해석 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt; 판단 방식 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.3953%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #1a5490; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,1,0&quot;&gt;포도송이형 뭉침&lt;/b&gt; 현상 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.9768%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #1a5490; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 수많은 나무가 특정 조건(임계값)에서 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #1a5490; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;4,1,2,0&quot;&gt;다수결 투표&lt;/b&gt;를 하기 때문 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3721%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #1a5490; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 특정 구매 구간에서 채널 정체성이 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #1a5490; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;매우 뚜렷&lt;/b&gt;하게 나타남 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 세제&amp;middot;종이류 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.3953%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파란 점이 왼쪽(-)에 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매우 두껍게 밀집&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.9768%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;안 사면 Horeca&quot;라는 강력한 규칙이 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다수의 나무에 공통 적용됨&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3721%; height: 42px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;생활용품 미구매는 Horeca 채널을 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가르는 가장 확실한 증거&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 63px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; text-align: center; height: 63px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 식료품 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.3953%; text-align: center; height: 63px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파란 점은 왼쪽, 빨간 점은 오른쪽으로 완벽히 분리&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.9768%; text-align: center; height: 63px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;의사결정 나무들이 '임계값'을 기준으로 소매점 여부를 가장 먼저 가려냄&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3721%; text-align: center; height: 63px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세제와 더불어 소매점(Retail)을 판별하는 가장 강력한 듀얼 엔진&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 유제품 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.3953%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;점들이 중앙에서 오른쪽&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;으로 촘촘하게 연결&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.9768%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다양한 나무들이 유제품 수치에 따라 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세밀하게 확률을 조정함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3721%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소매점(Retail) 판단을 위한 안정적인 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보조 지표로 활용됨&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 냉동식품 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.3953%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빨간 점이 왼쪽(-) 영역에 소폭 분포&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.9768%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일부 나무들이 냉동식품 대량 구매를 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;호레카의 신호로 포착함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3721%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;식재료 비중이 높은 고객군을 분류하는 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;섬세한 판단 로직 반영&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 43px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; text-align: center; height: 43px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 즉석&amp;middot;&lt;br /&gt;가공식품 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.3953%; text-align: center; height: 43px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중앙(0) 근처에 점들이 수직으로 겹쳐서 뭉침&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.9768%; text-align: center; height: 43px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;영향력은 작지만, 특정 수치를 넘을 때만 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;미세하게 점수를 조정함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3721%; text-align: center; height: 43px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단독 판단보다는 다른 품목과 조합될 때 보조적인 판단 근거로 활용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 44px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; text-align: center; height: 44px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 신선식품 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.3953%; text-align: center; height: 44px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중앙(0) 근처에 점들이 수직으로 겹쳐서 뭉침&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.9768%; text-align: center; height: 44px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;영향력은 작지만, 특정 수치를 넘을 때만&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;미세하게 점수를 조정함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3721%; text-align: center; height: 44px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단독 판단보다는 다른 품목과 조합될 때 보조적인 판단 근거로 활용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 13.2558%; text-align: center; height: 10px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 지역 변수 &lt;br /&gt;(기타/Oporto) &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.3953%; text-align: center; height: 10px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;점들이 좌우로 퍼지지 않고 중앙에 고정되어 있으며 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이진 변수&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.9768%; text-align: center; height: 10px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지역적 특성이 구매 품목 패턴보다 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;분류 기여도가 현저히 낮음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3721%; text-align: center; height: 10px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;색깔은 명확하게 나뉘어 있지만 그 영향력이 너무 작아서 &quot;확실하지만 힘이 없는 신호&quot;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;③ 비즈니스 전략 가이드: &quot;일관된 고객 분류와 리스크 관리&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;확고한 고객 정체성 확립 (Consistency):&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;이 고객은 확실히 리테일 그룹의 패턴을 따르고 있다&quot;는 식의 명확한 그룹핑이 가능합니다. 따라서 고객을 특정 채널로 정의하고 장기적인 관리 및 타겟팅 전략을 수립해야 하는 &lt;b data-index-in-node=&quot;97&quot; data-path-to-node=&quot;8,0,1,0,0&quot;&gt;안정 중심의 비즈니스 의사결정&lt;/b&gt;에 가장 적합한 모델입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;신뢰도 높은 기준점 제시:&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유통 데이터 특유의 불규칙한 구매 변동에도 예측값이 크게 요동치지 않습니다. 이는 대시보드 시뮬레이션 시 극단적인 수치가 입력되어도 모델이 판단의 중심을 유지해주므로, 현업 담당자에게 &lt;b data-index-in-node=&quot;103&quot; data-path-to-node=&quot;8,1,1,0,0&quot;&gt;흔들리지 않는 신뢰도 높은 판단 기준&lt;/b&gt;을 제공합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;Ⅳ. SGD 분류기(SGDClassifier)&amp;nbsp;&lt;/b&gt; 의 SHAP 분석 결과&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;① 모델의 핵심 메커니즘: &quot;데이터 반응성의 극대화&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로지스틱 회귀가 확률을 서서히 조정하고 랜덤포레스트가 집단 투표를 통해 결론을 내린다면, &lt;b data-index-in-node=&quot;50&quot; data-path-to-node=&quot;5&quot;&gt;SGD는 데이터의 아주 작은 차이도 날카롭게 포착해 이를 강력한 예측 신호로 전환&lt;/b&gt;합니다. 이는 모델이 학습 과정에서 정답을 찾기 위해 가중치를 매우 기민하게 업데이트하는 '경사 하강법'의 특성이 반영된 결과로, 다른 모델보다 데이터 변화에 훨씬 민감하게 반응합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;② SHAP 분석을 통해 입증된 SGD의 차별적 성능&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;압도적인 영향력 스케일 (Scale of Impact):&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SHAP 차트의 x축 범위를 보면 다른 모델(&amp;plusmn;3~5)보다 훨씬 넓은 &lt;b data-index-in-node=&quot;39&quot; data-path-to-node=&quot;7,0,1,0,0&quot;&gt;&amp;plusmn;20 내외의 분포&lt;/b&gt;를 보입니다. 이는 모델이 특정 조건을 만족하는 데이터를 발견했을 때, 주저하지 않고 해당 채널로 결론을 강하게 밀어붙이는 &lt;b data-index-in-node=&quot;118&quot; data-path-to-node=&quot;7,0,1,0,0&quot;&gt;과감한 판별력&lt;/b&gt;을 가졌음을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;소외된 변수의 적극적 활용 (Feature Sensitivity):&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 모델에서는 영향력이 낮았던 '신선식품'이나 '즉석&amp;middot;가공식품'이 SGD에서는 주요 기여 변수로 등장합니다. 이는 SGD가 &lt;b data-index-in-node=&quot;70&quot; data-path-to-node=&quot;7,1,1,0,0&quot;&gt;단순한 구매 총액뿐만 아니라, 데이터 속에 숨겨진 미세한 상관관계까지 놓치지 않고 학습에 반영&lt;/b&gt;하고 있음을 증명합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;7,1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;10&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;[호텔/레스토랑/카페]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[소매 (리테일)]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eri2Ep/dJMcaio22vp/ly1uK2RB1pis65A0EBrHs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eri2Ep/dJMcaio22vp/ly1uK2RB1pis65A0EBrHs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eri2Ep/dJMcaio22vp/ly1uK2RB1pis65A0EBrHs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feri2Ep%2FdJMcaio22vp%2Fly1uK2RB1pis65A0EBrHs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;654&quot; height=&quot;398&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 180px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 구분 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 주요 현상&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.349%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 모델 특성 반영&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.6279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 비즈니스 해석 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt; 판단 방식 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #1a5490; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,1,0&quot;&gt;광범위한 확산&lt;/b&gt; 현상 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.349%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #1a5490; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 가중치를 매우 크게 학습하여 &lt;br /&gt;&lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;4,1,2,0&quot;&gt;작은 차이도 민감하게 증폭&lt;/b&gt;시키기 때문 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.6279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #1a5490; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 아주 미세한 구매 변화도 놓치지 않고 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #1a5490; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;4,1,3,0&quot;&gt;공격적으로 타겟을 탐색&lt;/b&gt;함 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 세제&amp;middot;종이류 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SHAP 수치가 &amp;plusmn;20까지&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;넓게 뻗음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.349%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;확실한 변수에 압도적인 가중치(7.50)를 부여해 판단의 기점으로 삼음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.6279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소매점(Retail)을 발굴하는 데 있어 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 강력한 확성기 역할&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 식료품 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중앙에 밀집해 있으나 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;색 분리가 선명&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.349%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;세제류 다음으로 중요한 신호로 인식하며 빠르게 가중치를 부여함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.6279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;채널의 정체성을 확정 짓는 핵심적인 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보조 지표&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 신선식품 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다른 모델보다 상위권에 위치하며 확산됨&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.349%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;미세한 데이터 노이즈도 판단 근거로 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;적극 활용하려는 성향&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.6279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;신선식품 구매가 적은 고객군을 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매우 예민하게 걸러냄&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 유제품 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중앙 부근에서 색상 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그라데이션 뚜렷함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.349%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유제품 구매액 변화에 따라 기민하게 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;확률을 조정함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.6279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;채널 예측의 정밀도를 높여주는 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;섬세한 안테나 역할&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 냉동식품 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;역방향 (빨간 점이 왼쪽) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;흐름 뚜렷함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.349%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;냉동식품 비중이 높을 때 Horeca로 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강하게 밀어붙임&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.6279%; height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;식자재 중심 고객을 선별하는 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;강력하고 날카로운 필터&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 16.279%; height: 16px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 즉석&amp;middot;가공식품 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; height: 16px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;점들이 좌우로 고르게 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;퍼져 있음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.349%; height: 16px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;작은 구매 비중도 판단 근거에 적극 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;포함시키는 모델 성향&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.6279%; height: 16px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;패턴의 디테일을 끝까지 추적하여 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;분류 성능을 보강함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.279%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 지역 변수 &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;(Oporto/기타) &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7441%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;색상이 나뉘나 영향력은 매우 미미&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.349%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지리적 요인보다 구매 행동에만 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;집중하도록 학습됨&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.6279%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위치 정보에 휘둘리지 않는 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;객관적인 판단 유지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8&quot;&gt;③ 비즈니스 전략 가이드: &quot;적극적 타겟 탐색과 민감도 분석&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;잠재 고객 확보의 극대화 (Recall 중심):&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;소매점(Retail)의 특성이 조금이라도 보인다면 놓치지 않겠다&quot;는 적극적인 필터링 전략을 취합니다. 따라서 마케팅 초기 단계에서 &lt;b data-index-in-node=&quot;74&quot; data-path-to-node=&quot;9,0,1,0,0&quot;&gt;잠재 고객군을 최대한 넓게 확보해야 하는 재현율(Recall) 중심 전략&lt;/b&gt;에 가장 적합한 모델입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;역동적인 시뮬레이션 환경 제공:&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;높은 수치 반응성 덕분에 대시보드에서 값을 조금만 바꿔도 예측 결과가 드라마틱하게 변합니다. 이는 현업 담당자가 &lt;b data-index-in-node=&quot;63&quot; data-path-to-node=&quot;9,1,1,0,0&quot;&gt;어떤 품목이 결과에 가장 민감하게 작용하는지 테스트(Sensitivity Analysis)&lt;/b&gt; 하기에 최적의 환경을 제공합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-path-to-node=&quot;23&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. TabPy 연동&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모델 분석이 끝났다면, 이제 이 모델들을 태블로라는 '몸체'에 이식할 시간입니다. 이 과정은 크게 모델을 서빙할 준비(Python)와&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필요할 때 모델을 호출(Tableau)하는 두 단계로 나뉩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt; ① TabPy란? (Tableau Python Server)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;TabPy는 태블로가 외부 파이썬(Python) 코드를 호출하여, &lt;b data-index-in-node=&quot;37&quot; data-path-to-node=&quot;5&quot;&gt;머신러닝 예측 결과를 실시간으로 차트에 반영&lt;/b&gt;할 수 있게 해주는 엔진입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt; ② 동작 원리: 분석의 선순환 구조&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;서버 실행:&lt;/b&gt; 파이썬 환경에서 TabPy 서버를 가동합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;모델 배포:&lt;/b&gt; 학습된 머신러닝 모델(pkl)과 전처리 스케일러를 로딩한 후, 예측 함수를 작성하여 TabPy에 배포(deploy)합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;태블로 호출:&lt;/b&gt; 태블로의 계산 필드에서 SCRIPT_* 함수를 통해 배포된 파이썬 함수에 데이터를 전달합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,3,0&quot;&gt;실시간 응답:&lt;/b&gt; 사용자가 대시보드에서 매개변수를 조정하면, 서버가 즉시 결과를 반환하여 화면을 갱신합니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;③ 필수 환경 설정 (Setup Guide)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;성공적인 연동을 위해 다음의 인프라 설정을 완료했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;환경 구축:&lt;/b&gt; pip install tabpy 후 서버 실행.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;서비스 연결:&lt;/b&gt; 태블로의 [외부 서비스 연결 관리]에서 TabPy 서버 주소(localhost)와 포트(9004)를 등록. (기본 로컬 환경)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;모델 관리:&lt;/b&gt; 학습 시 사용한 StandardScaler 및 머신러닝 모델 4종을 TabPy 실행 경로에 배치하여 데이터 정합성 유지&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CJ1DY/dJMcaflxud4/XvX5US3BSuKwFUD4YNJMLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CJ1DY/dJMcaflxud4/XvX5US3BSuKwFUD4YNJMLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CJ1DY/dJMcaflxud4/XvX5US3BSuKwFUD4YNJMLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCJ1DY%2FdJMcaflxud4%2FXvX5US3BSuKwFUD4YNJMLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;368&quot; height=&quot;384&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13&quot;&gt; ④ 구현 코드 예시&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14&quot;&gt;[1] Python 측: 모델 배포 및 함수 정의&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파이썬에서는 태블로로부터 전달받은 8개의 데이터(품목 구매액, 지역, 모델 선택 등)를 가공하여 결과값을 돌려주는 함수를 정의합니다. 이때 핵심은 &lt;b data-index-in-node=&quot;82&quot; data-path-to-node=&quot;6&quot;&gt;데이터의 형태를 모델이 학습했던 상태(로그 변환 + 스케일링)로 복원&lt;/b&gt;하는 것입니다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773392219219&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 파이썬 모델 로딩 및 함수 배포 예시
def get_channel_proba(fresh, milk, grocery, frozen, detergents, delicassen, region, model_name):
    X_raw = np.column_stack([fresh, milk, grocery, frozen, detergents, delicassen])
    X_scaled = scaler.transform(np.log1p(X_raw)) # 로그변환 + 스케일링
    
    # 모델명 매개변수에 따라 다른 모델 호출
    clf = MODELS.get(model_name[0], clf_logistic)
    proba = clf.predict_proba(X_final)[:, 1] # Retail(1)일 확률 반환
    return proba.tolist()

client.deploy('get_channel_proba', get_channel_proba, 'Retail 채널 확률 반환', override=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17&quot;&gt;[2] Tableau 측: SCRIPT 스크립트 활용&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;태블로의 계산 필드에서는 SCRIPT_REAL 함수를 사용하여 파이썬에 명령을 내립니다. 여기서 각 _arg는 태블로 화면에 있는 합계(SUM) 값이나 사용자가 조절하는 매개변수와 일대일로 대응됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773392234579&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// [Channel_Proba_Retail] 계산 필드 예시
SCRIPT_REAL(
&quot;return tabpy.query('get_channel_proba', _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7, _arg8)['response']&quot;,
SUM([Fresh]), SUM([Milk]), SUM([Grocery]), SUM([Frozen]), 
SUM([Detergents_Paper]), SUM([Delicassen]), INT([Region]), [Select ML Model]
)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위의 스트립트 형식을 기반으로 총 15개의 함수를 만들어 파이썬에 배포하였고, 관련 값들을 받기 위해 태블로에 계산된 필드들을 만들었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 292px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;함수 이름&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.71324%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;카테고리&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.1085%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;입력&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;출력&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; calculate_spearman &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.71324%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;통계&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.1085%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 두 지출 항목 리스트 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Spearman 상관계수&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 두 변수 간 Spearman 상관계수 계산 후 입력 길이만큼 반복 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; get_cluster &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.71324%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;군집분석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.1085%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 6개 구매 컬럼 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 군집 ID 리스트 (0~4) &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; KMeans 모델로 고객 군집 예측 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; get_pca_coords &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.71324%; height: 61px;&quot; rowspan=&quot;4&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;차원축소&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.1085%; height: 61px;&quot; rowspan=&quot;4&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 6개 구매 컬럼&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; PCA 좌표 리스트 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; PCA 변환 결과 (PC1, PC2, PC3 등) 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; get_pca1 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; PC1 리스트 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; PCA 첫 번째 주성분 점수 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 10px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; get_pca2 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 10px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; PC2 리스트 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 10px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; PCA 두 번째 주성분 점수 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; get_pca3 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; PC3 리스트 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; PCA 세 번째 주성분 점수 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; get_biplot_pc1_loadings &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.71324%; height: 34px;&quot; rowspan=&quot;2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PCA 해석&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.1085%; height: 34px;&quot; rowspan=&quot;2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Feature 이름 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; PC1 loading 값 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 변수별 PC1 기여도 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; get_biplot_pc2_loadings &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; PC2 loading 값 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 변수별 PC2 기여도 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 23px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 23px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; get_channel &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.71324%; height: 40px;&quot; rowspan=&quot;2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;분류&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.1085%; height: 40px;&quot; rowspan=&quot;2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 6개 구매 + Region + ModelName &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 23px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 채널 예측 (0/1) 리스트 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 23px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 선택된 ML 모델로 고객 채널 예측 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; get_channel_proba &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 채널1 확률 리스트 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 채널이 1일 확률 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 34px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; get_feature_importance &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.71324%; height: 34px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 모델 해석 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.1085%; height: 34px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ModelName &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 34px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 중요도 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 34px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 모델별 Feature Importance 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Get_ROC_TPR &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.71324%; height: 68px;&quot; rowspan=&quot;4&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모델 평가&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.1085%; height: 17px;&quot; rowspan=&quot;4&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; ModelName &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; TPR 리스트 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; ROC Curve의 TPR 값 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Get_ROC_AUC &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; AUC 값 리스트 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; ROC Curve AUC 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Get_Confusion_Matrix &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; TN, FP, FN, TP 리스트 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 모델별 confusion matrix 값 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.5504%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Get_CM_Live &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; TN, FP, FN, TP 리스트 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.2946%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; CSV 기반 confusion matrix 반환 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12&quot;&gt;구현 시 주의할 점&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;데이터 타입의 일치:&lt;/b&gt; 태블로에서 넘겨주는 값은 기본적으로 &lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;13,0,0&quot;&gt;리스트(List)&lt;/b&gt; 형태입니다. 파이썬 함수 내부에서 model_choice[0]처럼 인덱싱을 해주는 이유는 태블로가 넘겨준 리스트에서 실제 값 하나를 꺼내기 위함입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;집계 데이터 전달:&lt;/b&gt; 태블로는 행 단위가 아닌 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;13,1,0&quot;&gt;집계(SUM, AVG 등)&lt;/b&gt; 데이터를 파이썬으로 보냅니다. 따라서 계산 필드 작성 시 반드시 SUM()이나 ATTR() 같은 집계 함수를 사용해야 오류가 나지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot;&gt;성능 최적화:&lt;/b&gt; tabpy.query는 실시간으로 통신하므로, 너무 많은 행을 한꺼번에 계산하기보다는 대시보드에서 &lt;b data-index-in-node=&quot;63&quot; data-path-to-node=&quot;13,2,0&quot;&gt;'현재 보고 있는 시나리오'&lt;/b&gt; 하나에 집중하여 결과를 뿌려줄 때 가장 속도가 빠릅니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21&quot;&gt;TabPy 연동의 장점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22&quot;&gt;(1)&amp;nbsp; 실시간 예측 및 시뮬레이션&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;과거 데이터의 사후 분석에 그치지 않고, 대시보드 상에서 &lt;b&gt;신규 고객의 구매 데이터를 입력하거나 필터를 조정하는 즉시 &quot;이 고객은 85%의 확률로 Retail 고객입니다&quot;라는 예측 결과를 받아볼 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;24&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24&quot;&gt;(2) 모델 간 비교 분석 (Model Comparison)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Select ML Model 매개변수를 통해 사용자가 직접 &lt;b data-index-in-node=&quot;33&quot; data-path-to-node=&quot;25&quot;&gt;로지스틱 회귀, XGBoost, 랜덤 포레스트&lt;/b&gt;를 갈아 끼우며 예측 결과가 어떻게 달라지는지, 어떤 모델이 현재 상황에 더 적합한지&lt;b data-index-in-node=&quot;106&quot; data-path-to-node=&quot;25&quot;&gt;&amp;nbsp;판단&lt;/b&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-path-to-node=&quot;23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;5. 태블로 대시보드 구현&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1300&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwYB8j/dJMcaakeqJ9/hK6DQrYsU3ioFru4Z5pBck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwYB8j/dJMcaakeqJ9/hK6DQrYsU3ioFru4Z5pBck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwYB8j/dJMcaakeqJ9/hK6DQrYsU3ioFru4Z5pBck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwYB8j%2FdJMcaakeqJ9%2FhK6DQrYsU3ioFru4Z5pBck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1300&quot; height=&quot;634&quot; data-origin-width=&quot;1300&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;채널. 지역 항목을 클릭하면 우측 박스 플럿에도 필터가 적용됩니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;771&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bToH1o/dJMcaadtqps/eBWDVQkeb4J3sZLUpmHEX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bToH1o/dJMcaadtqps/eBWDVQkeb4J3sZLUpmHEX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bToH1o/dJMcaadtqps/eBWDVQkeb4J3sZLUpmHEX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbToH1o%2FdJMcaadtqps%2FeBWDVQkeb4J3sZLUpmHEX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1296&quot; height=&quot;771&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;771&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;K-means 클러스터링을 통해 분류된 5개의 군집의 페르소나 특징을 확인할 수 있습니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FiIWN/dJMcagxXoMv/g71fgUIA1HMRutPRe4H4gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FiIWN/dJMcagxXoMv/g71fgUIA1HMRutPRe4H4gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FiIWN/dJMcagxXoMv/g71fgUIA1HMRutPRe4H4gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFiIWN%2FdJMcagxXoMv%2Fg71fgUIA1HMRutPRe4H4gK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;834&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;좌측 그래프의 붉은 점은 상단 매개변수 슬라이드를 통해 설정된 데이터를 가진 가상의 고객의 포지셔닝을 나타냅니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 설정된 변수들을 기반으로 학습된 ML 모델이 Retail / Hereca Channel 중 예측합니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NEG4y/dJMcacPSO4G/Nqk41NFJHg8ym0YR48kYPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NEG4y/dJMcacPSO4G/Nqk41NFJHg8ym0YR48kYPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NEG4y/dJMcacPSO4G/Nqk41NFJHg8ym0YR48kYPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNEG4y%2FdJMcacPSO4G%2FNqk41NFJHg8ym0YR48kYPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1288&quot; height=&quot;710&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;상단 시뮬레이션 메뉴에서 선택된 ML 모델의 성능 지표를 확인할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6MbE9/dJMcaio2pz7/i7YNvS78HIpGJeMIeiHvkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6MbE9/dJMcaio2pz7/i7YNvS78HIpGJeMIeiHvkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6MbE9/dJMcaio2pz7/i7YNvS78HIpGJeMIeiHvkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6MbE9%2FdJMcaio2pz7%2Fi7YNvS78HIpGJeMIeiHvkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1275&quot; height=&quot;477&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WM70M/dJMcahwT1bG/NYdyN0QrHZMFsGJxksbHL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WM70M/dJMcahwT1bG/NYdyN0QrHZMFsGJxksbHL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WM70M/dJMcahwT1bG/NYdyN0QrHZMFsGJxksbHL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWM70M%2FdJMcahwT1bG%2FNYdyN0QrHZMFsGJxksbHL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1296&quot; height=&quot;529&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대시보드에서 언급된 모델, 지표 등에 대한 부연 설명을 추가하였습니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1773465340831&quot; contenteditable=&quot;false&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c98ZLk/dJMb87f42Je/YbwUpwE6lSKUlIGbFoYkV1/img.gif?width=1024&amp;amp;height=544&amp;amp;face=0_0_1024_544,https://scrap.kakaocdn.net/dn/b7I7Qf/dJMb9frD4gR/2KkQBkODvMiKahfkT0ddX0/img.jpg?width=1280&amp;amp;height=680&amp;amp;face=0_0_1280_680&quot; data-og-url=&quot;https://www.loom.com/share/5b574a84ef35461d98a1176424e7c0dc&quot; data-og-source-url=&quot;https://www.loom.com/share/5b574a84ef35461d98a1176424e7c0dc&quot; data-og-host=&quot;www.loom.com&quot; data-og-description=&quot;&quot; data-og-title=&quot;Tabpy | Wholesale customer data set | Tableau&quot; data-og-type=&quot;video.other&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://www.loom.com/share/5b574a84ef35461d98a1176424e7c0dc&quot; data-source-url=&quot;https://www.loom.com/share/5b574a84ef35461d98a1176424e7c0dc&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tabpy | Wholesale customer data set | Tableau&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;www.loom.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6. AWS EC2를 활용한 '상시 가동' 분석 인프라 구축 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;① 문제 상황: &quot;로컬 환경의 한계, 나만 볼 수 있는 대시보드&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;처음 구축한 TabPy 환경은 제 로컬 컴퓨터에서만 작동했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;제가 컴퓨터를 끄거나 자리를 비우면, 다른 사용자들은 대시보드의 핵심 기능인 '실시간 예측'을 사용할 수 없는 반쪽짜리 대시보드였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5&quot;&gt;② 한계: &quot;무료 버전의 제약과 서버의 부재&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;태블로 퍼블릭의 제약:&lt;/b&gt; 무료 공유 플랫폼인 태블로 퍼블릭은 보안 및 서버 구조상의 이유로 TabPy가 포함된 워크북의 업로드를 지원하지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;접근성의 벽:&lt;/b&gt; 고가의 태블로 서버나 온라인 구독 없이는 외부 사용자를 내 로컬 TabPy에 접속하게 만드는 것이 기술적으로 매우 까다롭고 보안상 위험했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;③ 해결 과정: &quot;클라우드 서버(AWS EC2)로 옮긴 분석 엔진&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이러한 물리적 한계를 극복하기 위해,&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내 컴퓨터 대신 24시간 깨어 있는 &lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;8&quot;&gt;클라우드 서버&lt;/b&gt;를 구축하여 '예측 엔진'을 외부로 독립시키기로 했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;1) AWS EC2란? (나만의 클라우드 컴퓨터)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;EC2(Elastic Compute Cloud)는 아마존의 데이터 센터에 있는 가상 컴퓨터를 빌려 쓰는 서비스입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내 노트북을 꺼도 이 서버는 계속 작동하므로, 전 세계 어디서든 대시보드가 내린 명령을 처리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt;2) 서버 환경 및 인스턴스 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;운영체제 (Ubuntu):&lt;/b&gt; 개발 편의성이 높은 리눅스 기반의 Ubuntu 환경을 선택했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;인스턴스 유형 (t2.xlarge):&lt;/b&gt; 4개 머신러닝 모델의 복잡한 연산과 실시간 요청을 지연 없이 처리하기 위해 넉넉한 CPU와 메모리 사양을 갖춘 t2.xlarge를 할당했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u6m6S/dJMcadnGZcN/PxYyVCAppMTK6bfJM3JkYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u6m6S/dJMcadnGZcN/PxYyVCAppMTK6bfJM3JkYk/img.png&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;752&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.6483%; margin-right: 10px;&quot; data-widthpercent=&quot;51.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u6m6S/dJMcadnGZcN/PxYyVCAppMTK6bfJM3JkYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu6m6S%2FdJMcadnGZcN%2FPxYyVCAppMTK6bfJM3JkYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1866&quot; height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GWxiF/dJMcafFQ2Hk/aMqAIhWaDOkXAGg8vVygRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GWxiF/dJMcafFQ2Hk/aMqAIhWaDOkXAGg8vVygRk/img.png&quot; data-origin-width=&quot;1799&quot; data-origin-height=&quot;762&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;48.76&quot; style=&quot;width: 48.1889%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GWxiF/dJMcafFQ2Hk/aMqAIhWaDOkXAGg8vVygRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGWxiF%2FdJMcafFQ2Hk%2FaMqAIhWaDOkXAGg8vVygRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1799&quot; height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12&quot;&gt;3) 보안 그룹 설정 (9004 포트 개방)&lt;/b&gt; 클라우드 서버는 기본적으로 모든 외부 접속을 차단합니다. 태블로가 서버에 접속해 데이터를 주고받을 수 있도록 '인바운드 규칙'을 설정했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;TabPy 전용 포트:&lt;/b&gt; 통신 통로인 &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;13,0,0&quot;&gt;9004번 포트&lt;/b&gt;를 개방하여 외부의 태블로 클라이언트가 서버 내부의 파이썬 엔진에 접근할 수 있게 했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;SSH 포트:&lt;/b&gt; 서버 관리를 위한 22번 포트를 열어 내 컴퓨터에서 원격 제어가 가능하게 세팅했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1905&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crb0Yi/dJMcagdHxqy/YoN6eSkoSyQbNA8kwcn9x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crb0Yi/dJMcagdHxqy/YoN6eSkoSyQbNA8kwcn9x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crb0Yi/dJMcagdHxqy/YoN6eSkoSyQbNA8kwcn9x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcrb0Yi%2FdJMcagdHxqy%2FYoN6eSkoSyQbNA8kwcn9x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1905&quot; height=&quot;676&quot; data-origin-width=&quot;1905&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14&quot;&gt;4) 서버 내부 환경 구축 (가상 환경 및 라이브러리)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서버 내부에서도 로컬과 동일한 분석 환경을 재현하기 위해 다음 과정을 거쳤습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;가상 환경(venv) 구축:&lt;/b&gt; 서버 시스템 환경과 분리된 독립적인 파이썬 방을 만들어 라이브러리 간 충돌을 방지했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;필수 패키지 설치:&lt;/b&gt; TabPy, Scikit-learn, Pandas 등 분석에 필요한 모든 라이브러리를 다시 설치하고, 학습 시 사용했던 전처리 스케일러를 복원했습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGPBWB/dJMcach3OQV/MqTlsK5LhecJhlsNwZm9Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGPBWB/dJMcach3OQV/MqTlsK5LhecJhlsNwZm9Yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGPBWB/dJMcach3OQV/MqTlsK5LhecJhlsNwZm9Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGPBWB%2FdJMcach3OQV%2FMqTlsK5LhecJhlsNwZm9Yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1106&quot; height=&quot;498&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16&quot;&gt;5) nohup으로 영속성 부여 (무중단 운영)&lt;/b&gt; 일반적으로 서버 접속 창(터미널)을 닫으면 실행 중인 프로그램도 종료됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 nohup 명령어를 사용하면 터미널을 종료해도 프로그램이 백그라운드에서 계속 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;명령어:&lt;/b&gt; nohup tabpy &amp;amp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;효과:&lt;/b&gt; 관리자가 접속해 있지 않아도 서버는 24시간 내내 태블로의 예측 요청을 기다리는 상태가 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;yes | nohup tabpy --config=tabpy.conf &amp;gt; tabpy_background.log 2&amp;gt;&amp;amp;1 &amp;amp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1807&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVnzGM/dJMcac3oFuM/0FCROkl18SHl9FPu9a8Z51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVnzGM/dJMcac3oFuM/0FCROkl18SHl9FPu9a8Z51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVnzGM/dJMcac3oFuM/0FCROkl18SHl9FPu9a8Z51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVnzGM%2FdJMcac3oFuM%2F0FCROkl18SHl9FPu9a8Z51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1807&quot; height=&quot;391&quot; data-origin-width=&quot;1807&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18&quot;&gt;④ 결과 및 운영 전략: &quot;비용과 효율의 균형&quot;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 제 노트북이 꺼져 있어도,&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;누구나 제 태블로 파일(twb)을 열기만 하면 AWS 서버와 통신하며 실시간 AI 예측 결과를 확인할 수 있게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다만, t2.xlarge와 같은 고성능 서버는 운영 비용이 발생하므로, 현재는 &lt;b data-index-in-node=&quot;44&quot; data-path-to-node=&quot;20&quot;&gt;'온디맨드(On-demand)'&lt;/b&gt; 방식을 취하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #781b33; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;u&gt;즉, 실제 시연이나 협업이 필요한 시점에만 서버를 활성화하여 불필요한 리소스 낭비를 막는 전략적 운영을 실천하고 있습니다.&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7. 결과 해석 및 비지니스 제언&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;① 5대 페르소나별 데이터 특징 및 타겟팅 전략&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;머신러닝 클러스터링을 통해 도출된 5가지 페르소나와 SHAP 분석의 가중치를 결합하여 다음과 같은 맞춤형 전략을 제안합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 122px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 22.0542%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 페르소나 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.3566%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 데이터 특징 (구매 패턴) &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.5891%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 비즈니스 대응 가이드라인 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 22.0542%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 1. 대형 리테일&amp;middot;편의점형 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.3566%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 전 품목 평균 대비 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;6,1,1,0&quot;&gt;2배 이상&lt;/b&gt;, 세제류 최고 가중치 기록 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.5891%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,2,0&quot;&gt;[VIP 집중 관리]&lt;/b&gt; 매출의 40.3%를 견인하는 핵심 그룹입니다. 전담 매니저 배치 및 대량 구매 전용 단가 정책을 통해 이탈 방지에 총력을 기울여야 합니다. &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 22.0542%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 2. 신선&amp;middot;냉동 중심형 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.3566%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 신선(1.6배), 냉동(1.9배) 중심의 식자재 특화 패턴 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.5891%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,2,0&quot;&gt;[물류 신뢰도 강화]&lt;/b&gt; 가장 많은 고객(28.2%)이 속한 그룹입니다. 콜드체인 물류 시스템의 강점을 홍보하고, 정기 식자재 구독 모델을 통해 안정적인 매출을 확보하는 전략이 유효합니다. &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 22.0542%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 3. 식료품&amp;middot;세제 강조형 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.3566%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 가공식품 및 세제류(공산품) 집중 구매 (평균 2.5배) &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.5891%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,3,2,0&quot;&gt;[점유율 수성 및 교차 판매]&lt;/b&gt; 주력 품목에 대한 타겟 할인을 제공하여 충성도를 높이고, 인접 카테고리로의 구매 확장을 유도하는 프로모션이 효과적일 수 있습니다. &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 22.0542%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 4. 소규모 균형형 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.3566%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 품목 편중 없는 소량 다품목 구매 (안정적 기반) &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.5891%; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,4,2,0&quot;&gt;[장바구니 확대]&lt;/b&gt; 구매 비중이 낮은 품목의 샘플링을 제공하여 미구매 카테고리로의 진입을 유도하고, 로열티 멤버십 운영을 통해 방문 빈도를 높이는 방안을 검토할 수 있습니다. &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 22.0542%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 5. 초소규모&amp;middot;냉동 위주형 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.3566%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 냉동 위주 목적성 구매, 기타 품목 구매 저조 &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.5891%; height: 17px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,5,2,0&quot;&gt;[진입 장벽 완화]&lt;/b&gt; 초기 거래 활성화를 위해 최소 주문량(MOQ)을 한시적으로 인하하거나, 웰컴 프로모션을 통해 타 품목으로의 구매 전이를 시도해 볼 수 있습니다. &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt; ② 대시보드 활용 방안&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AWS EC2와 TabPy로 연동된 대시보드는 담당자가 실시간으로 데이터를 조절하며 의사결정을 내릴 수 있는 도구가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12&quot;&gt;[1]&amp;nbsp; 실시간 고객 페르소나 및 채널 진단&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;영업 담당자가 신규 고객 상담 시 예상 구매 수치를 대시보드 슬라이더에 입력합니다. 모델이 실시간으로 계산한 결과(예: Retail 확률 92%)를 통해 해당 고객이 &lt;b data-index-in-node=&quot;93&quot; data-path-to-node=&quot;13&quot;&gt;5개 페르소나 중 어느 유형에 가장 가까운지&lt;/b&gt; 현장에서 즉각 진단하고, 그에 맞는 맞춤형 제안서(카탈로그)를 즉시 제시할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14&quot;&gt;[2] 구매 패턴 변화 모니터링 및 선제적 대응&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존 고객의 최신 데이터를 대시보드에 대입하여 예측 확률의 변화 추이를 관찰합니다. 만약 '대형 리테일' 페르소나 고객의 세제류 구매가 줄고 냉동식품 비중이 높아진다면, 고객의 업종 변화나 경쟁사로의 품목 이탈 가능성을 시사하므로 &lt;b data-index-in-node=&quot;129&quot; data-path-to-node=&quot;15&quot;&gt;영업 담당자의 선제적인 방문 및 방어 영업&lt;/b&gt;의 근거가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;8. 분석을 마치며&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이전까지 Looker Studio와 GA4를 활용해 이커머스 데이터를 분석할 때마다 늘 마음 한구석에 풀리지 않는 갈증이 있었습니다. 단순히 '총 매출액'이나 '평균값'만으로는 포착하기 힘든 &lt;b data-index-in-node=&quot;107&quot; data-path-to-node=&quot;5&quot;&gt;고객 간의 거대한 간극&lt;/b&gt; 때문이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특히 고급 주얼리 브랜드 데이터를 다룰 때, 20~30만 원대 제품을 구매하는 일반 고객과 500만 원 이상의 초고가 라인을 구매하는 VIP 고객의 구매 패턴을 단순히 '평균'이라는 숫자로 묶는 것이 과연 타당한지에 대해 깊이 고민했습니다. 이상치(Outlier)를 단순히 제거해야 할 오류로 볼 것인가, 아니면 별도의 전략이 필요한 핵심 세그먼트로 볼 것인가에 대한 답을 찾고 싶었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;PCA와 비지도 학습: 사람이 보지 못하는 패턴의 발견&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 프로젝트에서 PCA(주성분 분석)를 통해 여러 품목의 변수를 하나의 축으로 응축하고, &lt;b data-index-in-node=&quot;55&quot; data-path-to-node=&quot;8&quot;&gt;K-Means 군집화&lt;/b&gt;를 통해 5개의 페르소나를 도출해 본 과정은 제게 매우 큰 의미가 있었습니다. 사람이 눈으로 확인할 수 없는 고차원의 데이터를 머신러닝의 힘을 빌려 시각화하고, 이를 통해 &lt;b data-index-in-node=&quot;162&quot; data-path-to-node=&quot;8&quot;&gt;'대형 리테일'부터 '초소규모 냉동 위주' 고객까지&lt;/b&gt; 선명하게 구분해낼 수 있었기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;분석을 넘어 '서비스'를 고민하다: TabPy와 AWS&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;분석 결과가 내 컴퓨터 안에서만 머물지 않고, 타인과 소무통할 수 있는 '살아있는 서비스'가 되기를 원했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 이를 위해 처음으로 &lt;b data-index-in-node=&quot;74&quot; data-path-to-node=&quot;10&quot;&gt;TabPy&lt;/b&gt; 라이브러리를 활용해 태블로와 파이썬을 연결하고, &lt;b data-index-in-node=&quot;107&quot; data-path-to-node=&quot;10&quot;&gt;AWS EC2 서버&lt;/b&gt;를 구축하여 실시간 연동 환경을 만든 과정은 매우 신기한 경험이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;물론 처음 접하는 AWS 인프라와 백그라운드 서버 가동(nohup) 과정에서 시행착오도 많았고, 비효율적인 동선으로 인해 작업을 처음부터 다시 고쳐야 했던 순간들도 있었습니다. 하지만 그 과정에서 AI의 도움을 받으며 어려운 고비를 하나씩 넘길 때마다 지식이 더 확장되는 즐거움을 느꼈습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12&quot;&gt;SHAP 분석: AI의 '이유'를 이해하다&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;무엇보다 좋았던 점은 &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;13&quot;&gt;SHAP 분석&lt;/b&gt;을 통해 &quot;머신러닝이 왜 이런 결과를 도출했는가?&quot;에 대해 상세히 이해할 수 있었다는 것입니다. AI를 단순히 결과만 뱉어내는 '블랙박스'로 두지 않고, 비즈니스 언어로 번역하여 근거를 제시할 수 있게 되어 뜻깊은 분석이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;긴 글 읽어주셔서 진심으로 감사드립니다 :)&lt;/span&gt;&lt;/p&gt;</description>
      <category>빅데이터 국비 교육</category>
      <author>datahaseo</author>
      <guid isPermaLink="true">https://datahaseo.tistory.com/66</guid>
      <comments>https://datahaseo.tistory.com/66#entry66comment</comments>
      <pubDate>Fri, 13 Mar 2026 13:19:02 +0900</pubDate>
    </item>
    <item>
      <title>[아이티윌 빅데이터 52기] 비지도 학습 | 군집분석 | K MEANS 개요 | Iris 붓꽃 분류</title>
      <link>https://datahaseo.tistory.com/65</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;비지도 학습 &amp;gt; 군집분석 &amp;gt; KMEANS &amp;gt; Iris 붓꽃 데이터 세트 활용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;STEP 1. 데이터 세트 확인&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nEeob/dJMcacWauZm/pVP8iGmvMPaAgFBlofkBIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nEeob/dJMcacWauZm/pVP8iGmvMPaAgFBlofkBIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nEeob/dJMcacWauZm/pVP8iGmvMPaAgFBlofkBIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnEeob%2FdJMcacWauZm%2FpVP8iGmvMPaAgFBlofkBIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;658&quot; height=&quot;506&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;STEP 2 . 데이터 전처리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;군집&amp;nbsp;분석은&amp;nbsp;종속&amp;nbsp;변수가&amp;nbsp;존재하지&amp;nbsp;않으므로,&amp;nbsp;종속변수를&amp;nbsp;제외하여&amp;nbsp;데이터&amp;nbsp;추출 &lt;br /&gt;-&amp;nbsp;만약&amp;nbsp;군집분석&amp;nbsp;후&amp;nbsp;나눠진&amp;nbsp;군집을&amp;nbsp;기존의&amp;nbsp;종속변수와&amp;nbsp;비교하려는&amp;nbsp;시도는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 로지스틱 회귀 분석으로 통계량이 제공되는 과정이 더 나을수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1768880321575&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df= origin.drop('Species' , axis=1)
df.head()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLTwpK/dJMcahJXXlO/N48kkjmztxcW3V9G4G88rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLTwpK/dJMcahJXXlO/N48kkjmztxcW3V9G4G88rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLTwpK/dJMcahJXXlO/N48kkjmztxcW3V9G4G88rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLTwpK%2FdJMcahJXXlO%2FN48kkjmztxcW3V9G4G88rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;466&quot; height=&quot;192&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;STEP 3.K Means 의 하이퍼 파라미터&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TFwEn/dJMcahiTfNA/gUHt3iacPkYKTkRgD8N5s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TFwEn/dJMcahiTfNA/gUHt3iacPkYKTkRgD8N5s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TFwEn/dJMcahiTfNA/gUHt3iacPkYKTkRgD8N5s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTFwEn%2FdJMcahiTfNA%2FgUHt3iacPkYKTkRgD8N5s1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;186&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(1) Inertia : K MEANS 의 성능 평가 지표&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;각&amp;nbsp;데이터가&amp;nbsp;자신의&amp;nbsp;군집&amp;nbsp;중심까지&amp;nbsp;떨어진&amp;nbsp;거리의&amp;nbsp;제곱합 &lt;br /&gt;-&amp;nbsp;즉,&amp;nbsp;이&amp;nbsp;이너셔&amp;nbsp;값이&amp;nbsp;작을수록&amp;nbsp;각&amp;nbsp;데이터&amp;nbsp;포인트의&amp;nbsp;군집의&amp;nbsp;중심점을&amp;nbsp;기준으로&amp;nbsp;잘&amp;nbsp;뭉쳐있음을&amp;nbsp;의미 &lt;br /&gt;-&amp;nbsp;군집&amp;nbsp;내부&amp;nbsp;응집도&amp;nbsp;(군집&amp;nbsp;내부&amp;nbsp;압축&amp;nbsp;정도를&amp;nbsp;수치로&amp;nbsp;표현) &lt;br /&gt;-&amp;nbsp;하지만&amp;nbsp;이너셔는&amp;nbsp;K&amp;nbsp;를&amp;nbsp;늘리면&amp;nbsp;무조건&amp;nbsp;줄어들기&amp;nbsp;떄문에&amp;nbsp;이녀셔가&amp;nbsp;작지만&amp;nbsp;K&amp;nbsp;가&amp;nbsp;너무&amp;nbsp;많지&amp;nbsp;않은&amp;nbsp;타협점을&amp;nbsp;찾아야하고,&amp;nbsp;그것이&amp;nbsp;엘보우&amp;nbsp;기법&amp;nbsp;(초반에는&amp;nbsp;급격하게&amp;nbsp;떨어지다가&amp;nbsp;어느순간&amp;nbsp;완만하게&amp;nbsp;줄어드는&amp;nbsp;지점을&amp;nbsp;찾아야함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4bYxv/dJMcaajKZ2r/CLxGqa8kkwKRO9gBsUz9X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4bYxv/dJMcaajKZ2r/CLxGqa8kkwKRO9gBsUz9X0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4bYxv/dJMcaajKZ2r/CLxGqa8kkwKRO9gBsUz9X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4bYxv%2FdJMcaajKZ2r%2FCLxGqa8kkwKRO9gBsUz9X0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;913&quot; height=&quot;318&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(2) k 의 변화에 따른 Inertia 값의 변화 시각화&lt;/h4&gt;
&lt;pre id=&quot;code_1768880514511&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;klist = list(range(2,11))
inertia = [] # inertia 값을 저장할 리스트

for k in klist:
  estimator = KMeans(n_clusters = k , random_state=0)
  estimator.fit(X=df)
  inertia.append(estimator.inertia_)


inertia&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1768880521165&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1) 그래프 초기화
width_px = 1280              # 그래프 가로 크기
height_px = 720              # 그래프 세로 크기
rows = 1                     # 그래프 행 수
cols = 1                     # 그래프 열 수
my_dpi=200

figsize = (width_px / my_dpi, height_px / my_dpi)
fig, ax = plt.subplots(rows, cols, figsize=figsize, dpi=my_dpi)

# 2) Scatter Plot 그리기
sb.lineplot(x=klist, y=inertia, linestyle =':',marker ='o',markerfacecolor ='#0066ff' , markeredgecolor='#ffffff')

# 3) 그래프 꾸미기
ax.grid(True)                 # 배경 격자 표시/숨김

# 4) 출력
plt.tight_layout()            # 여백 제거
plt.show()                    # 그래프 화면 출력
plt.close()                   # 그래프 작업 종료&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnSlVr/dJMcacPqsrz/E5LfMcJi05knmSNTkct9n0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnSlVr/dJMcacPqsrz/E5LfMcJi05knmSNTkct9n0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnSlVr/dJMcacPqsrz/E5LfMcJi05knmSNTkct9n0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnSlVr%2FdJMcacPqsrz%2FE5LfMcJi05knmSNTkct9n0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;849&quot; height=&quot;473&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;STEP 4. 엘보우 포인트로 적절한 k 값 찾아내기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-k&amp;nbsp;증가에&amp;nbsp;따른&amp;nbsp;이너셔&amp;nbsp;추세를&amp;nbsp;시각화하여&amp;nbsp;감소&amp;nbsp;폭이&amp;nbsp;급격&amp;nbsp;-&amp;gt;&amp;nbsp;완만으로&amp;nbsp;바뀌는&amp;nbsp;지점 &lt;br /&gt;이&amp;nbsp;지점이&amp;nbsp;최적의&amp;nbsp;k&amp;nbsp;값이&amp;nbsp;된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;KneeLocator 라이브러리 활용&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WDHpF/dJMcabwceOR/30QARebv9ZNmZ00zeEgkG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WDHpF/dJMcabwceOR/30QARebv9ZNmZ00zeEgkG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WDHpF/dJMcabwceOR/30QARebv9ZNmZ00zeEgkG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWDHpF%2FdJMcabwceOR%2F30QARebv9ZNmZ00zeEgkG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;274&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1768880658069&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#y 값이 감소하는 방향에서, 감소하는 볼록
kl = KneeLocator(klist,inertia,curve='convex',direction='decreasing')

best_k = kl.elbow   #최적의 k 값 출력
best_y=kl.elbow_y   #최적의 inertia 값 출력

print('found elbow' , best_k)
print('found y:' , best_y)&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;Kneed&amp;nbsp;라이브러리의&amp;nbsp;KneeLocator&amp;nbsp;를&amp;nbsp;써서&amp;nbsp;ELBOW&amp;nbsp;지점을&amp;nbsp;자동으로&amp;nbsp;찾아주는&amp;nbsp;방법 &lt;br /&gt;-&amp;nbsp;klist&amp;nbsp;와&amp;nbsp;inertia&amp;nbsp;를&amp;nbsp;입력하면&amp;nbsp;최적의&amp;nbsp;k&amp;nbsp;와&amp;nbsp;그때의&amp;nbsp;inertia&amp;nbsp;값을&amp;nbsp;출력함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;STEP 5. 클러스터링 시각화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클러스터링 된 값을 컬럼으로 추가해줌&lt;/p&gt;
&lt;pre id=&quot;code_1768880709105&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;estimator = KMeans(n_clusters=best_k)  #모델 객체 생성
estimator.fit(df) #모델 학습

cluster =estimator.predict(df)  #예측
df['ClusterID'] = cluster
df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 군집별로 색상을 칠해 경계선을 만들어주고, 각 군집의 중심점을 표현해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;nbsp;군집들이&amp;nbsp;겹쳐져&amp;nbsp;있는&amp;nbsp;이유&amp;nbsp;:&amp;nbsp;군집&amp;nbsp;분석&amp;nbsp;시&amp;nbsp;고려했던&amp;nbsp;컬럼&amp;nbsp;수는&amp;nbsp;4개인데,&amp;nbsp;현재&amp;nbsp;그래프는&amp;nbsp;2차원이다&amp;nbsp;보니&amp;nbsp;다른&amp;nbsp;변수들간의&amp;nbsp;관계가&amp;nbsp;보이지&amp;nbsp;않는것&lt;/p&gt;
&lt;pre id=&quot;code_1768880741864&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vdf = df.copy()
hue_field ='ClusterID'
x_field ='Sepal.Length'
y_field = 'Sepal.Width'

# 1) 그래프 초기화
width_px = 1280              # 그래프 가로 크기
height_px = 720              # 그래프 세로 크기
rows = 1                     # 그래프 행 수
cols = 1                     # 그래프 열 수
my_dpi=200

figsize = (width_px / my_dpi, height_px / my_dpi)
fig, ax = plt.subplots(rows, cols, figsize=figsize, dpi=my_dpi)


#데이터 산점도
sb.scatterplot (data=vdf , x=x_field , y=y_field , hue=hue_field)



# 군집별 값의 종류별로 반복문 실행
for c in vdf[hue_field].unique():
  #값의 종류별로 데이터 프레임 구분
  df_c = vdf.loc[vdf[hue_field] == c , [x_field,y_field]]

  try:
    #외각선 좌표 계산
    hull = ConvexHull(df_c)

    #마지막 좌표 이후에 첫번쨰 좌표를 연결
    points = np.append(hull.vertices,hull.vertices[0])

    ax.plot( #type:ignore
      df_c.iloc[points,0] , df_c.iloc[points,1] , linewidth = 0.5 , linestyle =':'
      )
    
    ax.fill(df_c.iloc[points,0] , df_c.iloc[points ,1], alpha =0.1)


  except:
    pass

#군집별 중심점 표시
ax.scatter(
  estimator.cluster_centers_[:,0],
  estimator.cluster_centers_[:,1],
  marker='x',
  c='red',
  alpha=1,
  s=40
)


ax.grid(True ,alpha =0.3) #배경 격자 표시
plt.tight_layout()
plt.show()
plt.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ogtTp/dJMb996dYU9/Dk3oxRD5KgKN2J1Xs61o7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ogtTp/dJMb996dYU9/Dk3oxRD5KgKN2J1Xs61o7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ogtTp/dJMb996dYU9/Dk3oxRD5KgKN2J1Xs61o7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FogtTp%2FdJMb996dYU9%2FDk3oxRD5KgKN2J1Xs61o7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;473&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>datahaseo</author>
      <guid isPermaLink="true">https://datahaseo.tistory.com/65</guid>
      <comments>https://datahaseo.tistory.com/65#entry65comment</comments>
      <pubDate>Tue, 20 Jan 2026 12:46:08 +0900</pubDate>
    </item>
    <item>
      <title>[아이티윌 빅데이터 52기] 비지도 학습 | 군집분석 | K MEANS 개요</title>
      <link>https://datahaseo.tistory.com/64</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;*&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199; color: #222222; text-align: start;&quot;&gt;모든 자료의 저작권은 아이티윌 이광호 강사님&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;K means 개요&lt;/h2&gt;
&lt;h3 data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size23&quot;&gt;[1] 비지도 학습&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 종속변수 없이 컴퓨터가 데이터의 패턴/규칙을 찾아내는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 분석가의 주관 개입이 많음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 학습이 끝난 후 평가가 어려움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;[2] KMeans 클러스터링&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 군집의 평균을 활용하여 k 개의 클러스터로 묶는 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 전처리 단계에서 라벨링을 위해 사용하기도 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;[3] 기본 아이디어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 같은 군집 내부 데이터는 서로 가깝게 위치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서로 다른 군집 간 데이터는 멀리 위치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 거리 기준으로 보통 유클리드 거리 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;[4] KMeans 의 수행 절차&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1) 초기 클러스터링의 수 k 를 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2) k 개의 클러스터의 가상의 중심점들을 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ERyOo/dJMcabiFSYw/tH6bNjq7zHw86yVDqISqDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ERyOo/dJMcabiFSYw/tH6bNjq7zHw86yVDqISqDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ERyOo/dJMcabiFSYw/tH6bNjq7zHw86yVDqISqDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FERyOo%2FdJMcabiFSYw%2FtH6bNjq7zHw86yVDqISqDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;281&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3) 각 측정값을 가장 가까운 중심점의 클러스터에 할당&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F2DsR/dJMcabiFSYB/4NMfBknikibik4KZh8MPJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F2DsR/dJMcabiFSYB/4NMfBknikibik4KZh8MPJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F2DsR/dJMcabiFSYB/4NMfBknikibik4KZh8MPJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF2DsR%2FdJMcabiFSYB%2F4NMfBknikibik4KZh8MPJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;304&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;4) 새로운 클러스터의 중심 계산&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rMKTk/dJMcabiFSY4/XPukUIKwqbBV0SjCUEQFA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rMKTk/dJMcabiFSY4/XPukUIKwqbBV0SjCUEQFA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rMKTk/dJMcabiFSY4/XPukUIKwqbBV0SjCUEQFA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrMKTk%2FdJMcabiFSY4%2FXPukUIKwqbBV0SjCUEQFA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;279&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;5) 클러스터 재분류 , 경계가 변경되지 않을때까지 반복하여 종료&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K7EAn/dJMcabiFSZj/zmjaOOcvWCNPgbjV4lD1Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K7EAn/dJMcabiFSZj/zmjaOOcvWCNPgbjV4lD1Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K7EAn/dJMcabiFSZj/zmjaOOcvWCNPgbjV4lD1Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK7EAn%2FdJMcabiFSZj%2FzmjaOOcvWCNPgbjV4lD1Sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;321&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;[5] k평균 클러스터링의 특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 거리 기반 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 유클리디안 거리의 측정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 중심점과의 거리 최소화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 반복 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 초기에 잘못 병합된 경우를 보완함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 여러 번 반복 수행하여 초기 오류를 회복함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 여러 번 반복의 결과로 최적의 결과를 만들어 냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;[6] 장점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 짧은 계산 시간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 간단한 알고리즘으로 계싼 시간 최소화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대규모 시스템에 적용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 탐색적 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 도메인 지식이 없어도 탐색 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 새로운 자료에 대해 탐색을 하며 의미있는 자료를 찾아낼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대용량 데이터에 대한 탐색적인 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 다양한 데이터에 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 거의 모든 형태의 데이터에 대해 적용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 관찰한 데이터 간의 거리를 데이터형에 맞게만 정의하면 분석 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 분석방법의 적용이 쉬움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사전에 특정 변수에 대한 역할 정의가 필요하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 관찰할 데이터 간의 거리만이 분석에 필요한 값임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[7] 단점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가중치와 거리 정의 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 초기 클러스터링 수 결정 필요 (초기 설정값이 적합하지 않으면 결과에 영향을 줌)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 결과 해석이 어려움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[8] 활용 에시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EDA 데이터 탐색용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 고객 세분화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 지역 입지 유형 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[9] 실무의 주의점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수 스케일 차이가 크면 반드시 표준화 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- K 선택시 Elbow ,Silhouette 지표 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예측 목적이나 결론을 내기보다는 구조 탐색 용도로 사용&lt;/p&gt;</description>
      <category>Machine Learning</category>
      <author>datahaseo</author>
      <guid isPermaLink="true">https://datahaseo.tistory.com/64</guid>
      <comments>https://datahaseo.tistory.com/64#entry64comment</comments>
      <pubDate>Tue, 20 Jan 2026 11:06:08 +0900</pubDate>
    </item>
    <item>
      <title>[아이티윌 빅데이터 52기] Data Analysis Basic | Lab 01 | NumPy Library</title>
      <link>https://datahaseo.tistory.com/61</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;[아이티윌&amp;nbsp;빅데이터&amp;nbsp;52기]&amp;nbsp;Data&amp;nbsp;Analysis&amp;nbsp;Basic&amp;nbsp;|&amp;nbsp;Lab&amp;nbsp;01&amp;nbsp;|&amp;nbsp;NumPy&amp;nbsp;Library&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&lt;span style=&quot;background-color: #f6e199;&quot;&gt;모든 자료의 저작권은 아이티윌 이광호 강사님&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;학습 내용&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- NumPy 시작하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-ndarray 의 주요 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-그 밖의 ndarray 형태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-ndarray 형태 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. NumPy 시작하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NumPy 는 파이썬으로 할 수있는 수치 계산도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C 를 파이썬으로 감싸고 있기 때문에 속도 처리가 빠름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 중요한 점은 리스트의 단점을 보완하고 있다는 점 (효율성)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w4crE/dJMcaf5Z15C/YMXOK31Cl93bKxgkPK95S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w4crE/dJMcaf5Z15C/YMXOK31Cl93bKxgkPK95S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w4crE/dJMcaf5Z15C/YMXOK31Cl93bKxgkPK95S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw4crE%2FdJMcaf5Z15C%2FYMXOK31Cl93bKxgkPK95S0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;305&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;NumPy 의 핵심 자료 구조는 ndarray&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ndarray 는 리스트 처럼 생긴 배열, 일반 리스트와의 차이는 규칙적인 데이터들의 묶음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;리스트는 데이터 타입에 제약이 없지만 배열은 같은 타입만 넣을 수 있음&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;n 차원의 객체로 평균 행렬 연산 등을 한번에 수행할 수 있음&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FIVbT/dJMcagcLFkQ/KBPkSQr0rTHnUIidUW5EEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FIVbT/dJMcagcLFkQ/KBPkSQr0rTHnUIidUW5EEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FIVbT/dJMcagcLFkQ/KBPkSQr0rTHnUIidUW5EEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFIVbT%2FdJMcagcLFkQ%2FKBPkSQr0rTHnUIidUW5EEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;572&quot; height=&quot;230&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NumPy 연습 문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;라이브러리&amp;nbsp;참조하기&lt;/h4&gt;
&lt;pre id=&quot;code_1762738853657&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배열&amp;nbsp;생성하기&amp;nbsp;:&amp;nbsp;리스트를&amp;nbsp;통한&amp;nbsp;1차원&amp;nbsp;배열&amp;nbsp;만들기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762738897240&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#리스트를 파라미터로 전달하여 ndarray 객체 생성
arr = np.array([1,3,5,7,9])
print(type(arr))
arr&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CEKAO/dJMcahQhroa/AqKlSS7jibIoQ6nNyRwEO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CEKAO/dJMcahQhroa/AqKlSS7jibIoQ6nNyRwEO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CEKAO/dJMcahQhroa/AqKlSS7jibIoQ6nNyRwEO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCEKAO%2FdJMcahQhroa%2FAqKlSS7jibIoQ6nNyRwEO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;453&quot; height=&quot;95&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배열의 크기&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;len()&amp;nbsp;함수를&amp;nbsp;사용하면&amp;nbsp;배열의&amp;nbsp;크기를&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762738913641&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr = np.array([10,30,50,70,90])
size=len(arr)
print(&quot;배열의 원소는 %d 개 입니다&quot; %size)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctsQ9y/dJMcahQhrn8/y5oPkJEejjGADf9XSVf09K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctsQ9y/dJMcahQhrn8/y5oPkJEejjGADf9XSVf09K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctsQ9y/dJMcahQhrn8/y5oPkJEejjGADf9XSVf09K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctsQ9y%2FdJMcahQhrn8%2Fy5oPkJEejjGADf9XSVf09K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;409&quot; height=&quot;50&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배열의 인덱싱과 슬라이싱&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;기본&amp;nbsp;특성은&amp;nbsp;리스트와&amp;nbsp;동일하기&amp;nbsp;때문에&amp;nbsp;리스트처럼&amp;nbsp;인덱싱과&amp;nbsp;슬라이싱이&amp;nbsp;가능하다&lt;/p&gt;
&lt;pre id=&quot;code_1762738928632&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mydata = np.array([5,10,15,20,25])

#인덱싱을 사용한 원소 접근

print(mydata[0])
print(mydata[3])
print(mydata[4])


#슬라이싱을 사용한 구간 추출도 가능
print(mydata[1:4])
print(mydata[-4:-1])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/creUrZ/dJMcabbstQI/NtjRXdcT2IJTMaOgEN8ka1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/creUrZ/dJMcabbstQI/NtjRXdcT2IJTMaOgEN8ka1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/creUrZ/dJMcabbstQI/NtjRXdcT2IJTMaOgEN8ka1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcreUrZ%2FdJMcabbstQI%2FNtjRXdcT2IJTMaOgEN8ka1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;425&quot; height=&quot;118&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;반복문을 통한 활용&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;리스트와&amp;nbsp;동일하게&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762738940627&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mydata = np.array([100,110,120,130,140])

for i,v in enumerate(mydata):
  print(&quot;%d 번쨰 원소 &amp;gt;&amp;gt; %d&quot;%(i,v))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7Ml4Q/dJMcadUEgZm/EORK7QpkgfjkGKjUBKg9R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7Ml4Q/dJMcadUEgZm/EORK7QpkgfjkGKjUBKg9R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7Ml4Q/dJMcadUEgZm/EORK7QpkgfjkGKjUBKg9R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7Ml4Q%2FdJMcadUEgZm%2FEORK7QpkgfjkGKjUBKg9R0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;432&quot; height=&quot;109&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ndarray 의 특성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;list&amp;nbsp;의&amp;nbsp;경우&amp;nbsp;다른&amp;nbsp;데이터&amp;nbsp;타입의&amp;nbsp;원소를&amp;nbsp;허용하지만,&amp;nbsp;ndarray&amp;nbsp;의&amp;nbsp;경우&amp;nbsp;가장&amp;nbsp;포괄적인&amp;nbsp;데이터&amp;nbsp;타입으로&amp;nbsp;변환한다 &lt;br /&gt;-&amp;nbsp;정수형은&amp;nbsp;&quot;100.&quot;&amp;nbsp;형태로,&amp;nbsp;boolean&amp;nbsp;은&amp;nbsp;False&amp;nbsp;는&amp;nbsp;0,&amp;nbsp;True&amp;nbsp;는&amp;nbsp;1로&amp;nbsp;반환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762738957822&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mylist =[100,3.14,True]
print(&quot;리스트에는 다양한 형태의 데이터가 들어올 수 있어요&quot;,mylist)

myarray =np.array(mylist)
print(&quot;배열은 다양한 형태의 데이터가 들어올 수 없어요&quot;,myarray)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q226m/dJMcaa4GUfQ/8ox7s6g8PqXVYRoOqpdxqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q226m/dJMcaa4GUfQ/8ox7s6g8PqXVYRoOqpdxqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q226m/dJMcaa4GUfQ/8ox7s6g8PqXVYRoOqpdxqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq226m%2FdJMcaa4GUfQ%2F8ox7s6g8PqXVYRoOqpdxqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;537&quot; height=&quot;58&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. ndarray 의 주요 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762742674500&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#numpy 라이브러리를 np 라는 이름으로 사용하도록 import
import numpy as np&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ndarray 의 특성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;list&amp;nbsp;의&amp;nbsp;경우&amp;nbsp;다른&amp;nbsp;데이터&amp;nbsp;타입의&amp;nbsp;원소를&amp;nbsp;허용하지만,&amp;nbsp;ndarray&amp;nbsp;의&amp;nbsp;경우&amp;nbsp;가장&amp;nbsp;포괄적인&amp;nbsp;데이터&amp;nbsp;타입으로&amp;nbsp;변환한다 &lt;br /&gt;-&amp;nbsp;정수형은&amp;nbsp;&quot;100.&quot;&amp;nbsp;형태로,&amp;nbsp;boolean&amp;nbsp;은&amp;nbsp;False&amp;nbsp;는&amp;nbsp;0,&amp;nbsp;True&amp;nbsp;는&amp;nbsp;1로&amp;nbsp;반환된다.&lt;/p&gt;
&lt;pre id=&quot;code_1762742679435&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mylist1 = [100.12,3.14,1.5]
myarr1=np.array(mylist1,dtype=&quot;int&quot;)   #float 형태의 데이터들을 강제로 int 로 바꿔주니 소수점을 다 버림 
myarr1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djKvvy/dJMcaihlRd3/txiiOxrXC9Ap2eArODRnnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djKvvy/dJMcaihlRd3/txiiOxrXC9Ap2eArODRnnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djKvvy/dJMcaihlRd3/txiiOxrXC9Ap2eArODRnnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjKvvy%2FdJMcaihlRd3%2FtxiiOxrXC9Ap2eArODRnnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;275&quot; height=&quot;49&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;49&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문자열이 포함된 경우의 형변환&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;모든&amp;nbsp;프로그래밍&amp;nbsp;언어에서&amp;nbsp;문자열은&amp;nbsp;표현&amp;nbsp;범위가&amp;nbsp;가장&amp;nbsp;넓은&amp;nbsp;데이터&amp;nbsp;타입이다 &lt;br /&gt;-&amp;nbsp;만약&amp;nbsp;배열로&amp;nbsp;변환하려는&amp;nbsp;리스트에&amp;nbsp;문자열이&amp;nbsp;하나라도&amp;nbsp;포함되어&amp;nbsp;있을&amp;nbsp;경우&amp;nbsp;모든&amp;nbsp;원소가&amp;nbsp;문자열이&amp;nbsp;된다 &lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762742685481&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mylist2 = [1.2,3,True,'4']
myarr2 = np.array(mylist2)
myarr2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uR8wC/dJMcaihlRea/L5QZNRnGjuKG38MakmVoDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uR8wC/dJMcaihlRea/L5QZNRnGjuKG38MakmVoDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uR8wC/dJMcaihlRea/L5QZNRnGjuKG38MakmVoDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuR8wC%2FdJMcaihlRea%2FL5QZNRnGjuKG38MakmVoDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;461&quot; height=&quot;51&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;51&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;리스트 타입으로 역변환&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;ndarray&amp;nbsp;와&amp;nbsp;list&amp;nbsp;는&amp;nbsp;서로&amp;nbsp;호환이&amp;nbsp;가능하다 &lt;br /&gt;-&amp;nbsp;만약&amp;nbsp;어떤&amp;nbsp;함수에서&amp;nbsp;파라미터로&amp;nbsp;리스트를&amp;nbsp;전송해야하면,&amp;nbsp;그&amp;nbsp;떄&amp;nbsp;ndarray&amp;nbsp;를&amp;nbsp;쓸&amp;nbsp;수&amp;nbsp;도&amp;nbsp;있다&lt;/p&gt;
&lt;pre id=&quot;code_1762742691645&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mylist3 =[10,20,30,40,50]
myarr3 = np.array(mylist3)   #리스트를 np.array 로 감싸주면 ndarray 타입이 된다
print(type(myarr3),myarr3)   


mylist3_1 = list(myarr3) #ndarray 타입을 list() 함수로 감사주면 리스트 타입이 된다
print(type(mylist3_1),mylist3_1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MZkQB/dJMcahbFYRL/j1P3cwzkW9byfPH3cjsyzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MZkQB/dJMcahbFYRL/j1P3cwzkW9byfPH3cjsyzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MZkQB/dJMcahbFYRL/j1P3cwzkW9byfPH3cjsyzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMZkQB%2FdJMcahbFYRL%2Fj1P3cwzkW9byfPH3cjsyzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;68&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;연산자를 사용한 ndarray 연산&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;-&amp;nbsp;리스트에서는&amp;nbsp;리스트를&amp;nbsp;더하면&amp;nbsp;[a,a,a,b,b,b]&amp;nbsp;이렇게&amp;nbsp;뒤에&amp;nbsp;이어지는&amp;nbsp;형태였지만&amp;nbsp;ndarray&amp;nbsp;에서는&amp;nbsp;원소의&amp;nbsp;위치에&amp;nbsp;대응되어&amp;nbsp;더해진다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762742697861&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr1 = np.array([10,15,20,25,30])
arr2 = np.array([2,3,4,5,6])

print(arr1)
print(arr2)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1762742703024&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#  더하기
a=arr1+arr2
print(&quot;arr+arr2 &amp;gt; &quot;, a)

# 뺴기

b=arr1-arr2
print(&quot;arr-arr2 &amp;gt; &quot;,b)

# 곱하기
c=arr1*arr2
print(&quot;arr*arr2 &amp;gt; &quot;,c)


# 나누기
d=arr1/arr2
print(&quot;arr/arr2 &amp;gt; &quot;,d)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oPu25/dJMcacVJU2z/Osc57ya1QGp6f1HbqaqASK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oPu25/dJMcacVJU2z/Osc57ya1QGp6f1HbqaqASK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oPu25/dJMcacVJU2z/Osc57ya1QGp6f1HbqaqASK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoPu25%2FdJMcacVJU2z%2FOsc57ya1QGp6f1HbqaqASK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;388&quot; height=&quot;95&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;NumPy 의 함수를 사용한 연산&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;연산자를&amp;nbsp;사용한&amp;nbsp;경우와&amp;nbsp;동일한&amp;nbsp;결과를&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;내장&amp;nbsp;함수가&amp;nbsp;존재한다&lt;/p&gt;
&lt;pre id=&quot;code_1762742709600&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr1 = np.array([10,15,20,25,30])
arr2 = np.array([2,3,4,5,6])

print(arr1)
print(arr2)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1762742715007&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#  더하기
a=np.add(arr1,arr2)
print(&quot;arr+arr2 &amp;gt; &quot;, a)

# 뺴기

b=np.subtract(arr1,arr2)
print(&quot;arr-arr2 &amp;gt; &quot;,b)

# 곱하기
c=np.multiply(arr1,arr2)
print(&quot;arr*arr2 &amp;gt; &quot;,c)


# 나누기
d=np.divide(arr1,arr2)
print(&quot;arr/arr2 &amp;gt; &quot;,d)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4co5o/dJMcad1pRQN/Q19KRjJpBPjlcnQx2WD561/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4co5o/dJMcad1pRQN/Q19KRjJpBPjlcnQx2WD561/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4co5o/dJMcad1pRQN/Q19KRjJpBPjlcnQx2WD561/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4co5o%2FdJMcad1pRQN%2FQ19KRjJpBPjlcnQx2WD561%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;374&quot; height=&quot;98&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;조건에 맞는 위치의 원소 추출&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;특정&amp;nbsp;배열에서&amp;nbsp;True&amp;nbsp;에&amp;nbsp;해당하는&amp;nbsp;값만&amp;nbsp;추출할&amp;nbsp;수도&amp;nbsp;있다&lt;/p&gt;
&lt;pre id=&quot;code_1762742722912&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;grade = np.array([82,77,91,88])
print(&quot;점수 리스트는&quot; ,grade)


#추출하고자 하는 원본과 같은 사이트의 배열을 생성해서 True 와 False 로 구분해준다
bool_array = np.array([True,False,True,False])
print(&quot;구별 리스트는&quot; , bool_array)


#True 에 해당하는 원소만 추출
result1 = grade[bool_array]
print(&quot;점수 리스트에서 True 에 해당한 원소들은&quot;,result1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/odbBf/dJMcacOYnQJ/YqlDK6iK7oqfqGY8LLr5N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/odbBf/dJMcacOYnQJ/YqlDK6iK7oqfqGY8LLr5N0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/odbBf/dJMcacOYnQJ/YqlDK6iK7oqfqGY8LLr5N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FodbBf%2FdJMcacOYnQJ%2FYqlDK6iK7oqfqGY8LLr5N0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;442&quot; height=&quot;88&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;조건식에 따른 원소 추출&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위의&amp;nbsp;예제처럼&amp;nbsp;True&amp;nbsp;에&amp;nbsp;해당하는&amp;nbsp;항목만&amp;nbsp;추출할&amp;nbsp;수&amp;nbsp;있었던&amp;nbsp;것처럼,&amp;nbsp;특정&amp;nbsp;조건에&amp;nbsp;해당하는&amp;nbsp;원소들만&amp;nbsp;추출하도록&amp;nbsp;조건을&amp;nbsp;세부화할&amp;nbsp;수&amp;nbsp;있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762742729167&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 80점 이상인 원소만 추출해보기

mypoint = np.array([82,77,91,88])
ge80 = mypoint[mypoint&amp;gt;=80]

print(&quot;80점이 넘는 원소들의 모음&quot;,ge80)



#2개 이상의 조건을 and 로 묶어줄 떄 쓸 수 있는 np.logical_and 함수

ge90and90 = mypoint[np.logical_and(mypoint&amp;gt;=80,mypoint&amp;lt;=90)]
print(&quot;80점 이상이면서 90점 이하인 점수&quot; , ge90and90)


#2개 이상의 조건을 or 로 묶어줄 떄 쓸 수 있는 np.logical_or 함수
ge90or90 = mypoint[np.logical_or(mypoint&amp;lt;80,mypoint&amp;gt;90)]
print(&quot;80점보다 적거나 90점을 넘은점수&quot; , ge90or90)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pjr1u/dJMcagw4pN9/c1olXj28jWRSpKTBKTtYVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pjr1u/dJMcagw4pN9/c1olXj28jWRSpKTBKTtYVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pjr1u/dJMcagw4pN9/c1olXj28jWRSpKTBKTtYVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpjr1u%2FdJMcagw4pN9%2Fc1olXj28jWRSpKTBKTtYVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;421&quot; height=&quot;88&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Numpy 조건 연산&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;sql&amp;nbsp;의&amp;nbsp;if()&amp;nbsp;함수와&amp;nbsp;동일한&amp;nbsp;결과를&amp;nbsp;만들고,&amp;nbsp;파생&amp;nbsp;변수를&amp;nbsp;만들&amp;nbsp;때&amp;nbsp;유용한&amp;nbsp;npl.where&amp;nbsp;함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762742736127&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;exam = np.array([60,83,75,92,86])

#np.where 의 첫 파라미터로 주어진 조건이 참이면 합격, 아니면 불합격
result = np.where (exam&amp;gt;=80,&quot;합격&quot;,&quot;불합격&quot;)
result&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnPutg/dJMcagw4pOd/wrN8NHnilkKDJqG3xBWWJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnPutg/dJMcagw4pOd/wrN8NHnilkKDJqG3xBWWJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnPutg/dJMcagw4pOd/wrN8NHnilkKDJqG3xBWWJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnPutg%2FdJMcagw4pOd%2FwrN8NHnilkKDJqG3xBWWJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;47&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;47&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;여러 조건 한번에 처리하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762742741632&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;exam = np.array ([60,85,51,79,94,88])


#학점을 부여하기 위한 점수의 구건을 설정하는 조건들을 리스트로 설정
conditions = [ (exam &amp;gt;= 90),
               (exam &amp;gt;= 80),
               (exam &amp;gt;=70)
]

#조건에 따라 부여될 학점
value = [&quot;A&quot;,&quot;B&quot;,&quot;C&quot;]


result = np.select(conditions,value,default='F') #기본 값을 F 로 설정
result&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmmyX8/dJMcagw4pOg/klHRi1SJfYWy5N8Mxzg0fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmmyX8/dJMcagw4pOg/klHRi1SJfYWy5N8Mxzg0fK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmmyX8/dJMcagw4pOg/klHRi1SJfYWy5N8Mxzg0fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmmyX8%2FdJMcagw4pOg%2FklHRi1SJfYWy5N8Mxzg0fK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;35&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. 그 밖의 ndarray 형태&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;2차원 배열&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차원&amp;nbsp;리스트를&amp;nbsp;ndarray&amp;nbsp;로&amp;nbsp;변환한다.&amp;nbsp;(&amp;nbsp;배열의&amp;nbsp;정보를&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;프로퍼티가&amp;nbsp;포함된다)&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;차원의&amp;nbsp;크기&amp;nbsp;:&amp;nbsp;ndim&lt;br /&gt;-&amp;nbsp;차원별&amp;nbsp;원소수&amp;nbsp;:&amp;nbsp;shape&lt;br /&gt;-&amp;nbsp;원소의&amp;nbsp;데이터&amp;nbsp;타입&amp;nbsp;:&amp;nbsp;dtype&lt;/p&gt;
&lt;pre id=&quot;code_1762746451125&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;myarray = np.array([
  [98,72,80,64],
  [88,90,80,72],
  [92,88,92,76]

])


print(myarray)

print(&quot;차원 크기:&quot;, myarray.ndim)
print(&quot;차원별 원소수:&quot;, myarray.shape)
print(&quot;원소의 데이터 타입:&quot;, myarray.dtype)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwGRYH/dJMcadAlug8/ZMI5BXVb39TBCZjOY49p71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwGRYH/dJMcadAlug8/ZMI5BXVb39TBCZjOY49p71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwGRYH/dJMcadAlug8/ZMI5BXVb39TBCZjOY49p71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwGRYH%2FdJMcadAlug8%2FZMI5BXVb39TBCZjOY49p71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;135&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;boolean 타입으로 인덱싱&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건에&amp;nbsp;맞는&amp;nbsp;원소를&amp;nbsp;1차원&amp;nbsp;배열로&amp;nbsp;반환한다&lt;/p&gt;
&lt;pre id=&quot;code_1762746459288&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1) Boolean 인덱싱: 조건에 맞는 항목만 1차원으로 추출
bool_array = np.array([
    [True,  False, True,  False],
    [True,  True,  True,  False],
    [True,  True,  True,  False]
])


#True 에 해당하는 원소만 출력되고, 조회한 형태는 2차원 데이터더라도 결과는 1차원으로 추출된다
result1 = myarray[bool_array]
print(&quot;result1:&quot;, result1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cT3Nol/dJMcadf2EwZ/qtiEw22aIKew7Q7N2bRko1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cT3Nol/dJMcadf2EwZ/qtiEw22aIKew7Q7N2bRko1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cT3Nol/dJMcadf2EwZ/qtiEw22aIKew7Q7N2bRko1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcT3Nol%2FdJMcadf2EwZ%2FqtiEw22aIKew7Q7N2bRko1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;358&quot; height=&quot;46&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;46&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;비교식에 의한 검색&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;조건에&amp;nbsp;맞는&amp;nbsp;원소를&amp;nbsp;1차우너&amp;nbsp;배열로&amp;nbsp;반환하고,&amp;nbsp;여기서도&amp;nbsp;and&amp;nbsp;와&amp;nbsp;or&amp;nbsp;조건을&amp;nbsp;활용할&amp;nbsp;수&amp;nbsp;있다&lt;/p&gt;
&lt;pre id=&quot;code_1762746476851&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;result2 = myarray[myarray &amp;gt;=80]
print(&quot;점수가 80점 이상인 원소들이 1차원 배열로 출력됩니다 : &quot;,result2)


#and 조건은 logical_and()
result3=myarray[np.logical_and(myarray&amp;gt;=80,myarray &amp;lt;=90)]
print(&quot;점수가 80점 이상 이면서 90점 이하인 경우는 다음과 같습니다:&quot;,result3)


#or 조건은 logical_or()
result4=myarray[np.logical_or(myarray &amp;lt;80,myarray &amp;gt;90)]
print(&quot;점수가 80점 미만이거나 90점을 초과한 경우는 다음과 같습니다&quot;,result4)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdljtM/dJMcadf2Ew1/m03FxKkvO8LsXo3q9RPh2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdljtM/dJMcadf2Ew1/m03FxKkvO8LsXo3q9RPh2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdljtM/dJMcadf2Ew1/m03FxKkvO8LsXo3q9RPh2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdljtM%2FdJMcadf2Ew1%2Fm03FxKkvO8LsXo3q9RPh2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;638&quot; height=&quot;79&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정형화된 특수한 형태의 배열 생성하기&lt;/h4&gt;
&lt;pre id=&quot;code_1762746483532&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#모든 원소가 0인 배열
np.zeros([3,4])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762746488505&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#모든 원소가 1인 배열
np.ones([3,4])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762746494251&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#모든 원소가 특정 값인 배열
np.full([3,4],10)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762746499155&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#단위 행렬 (대각선 원소가 모두 1이고 그 외는 모두 0인 배열)
np.eye(4)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/no2TZ/dJMcadNSFdX/AUw99gOy9ofUfJku0n11DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/no2TZ/dJMcadNSFdX/AUw99gOy9ofUfJku0n11DK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/no2TZ/dJMcadNSFdX/AUw99gOy9ofUfJku0n11DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fno2TZ%2FdJMcadNSFdX%2FAUw99gOy9ofUfJku0n11DK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;799&quot; height=&quot;703&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;랜덤 배열&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;0부터&amp;nbsp;1&amp;nbsp;범위에서&amp;nbsp;균등하게&amp;nbsp;추출하여&amp;nbsp;N&amp;nbsp;차원&amp;nbsp;랜덤&amp;nbsp;배열&amp;nbsp;생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762746504839&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#10개의 값을 갖는 1차원 배열
np.random.rand(10)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762746511253&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 4행 3열인 2차원 랜덤 배열 생성 (첫 파라미터는 행, 두번쨰 파라미터는 열)
np.random.rand(4,3)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSDdfo/dJMcadNSFd6/3hlKXC8O9lEsGiBcFKG8Fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSDdfo/dJMcadNSFd6/3hlKXC8O9lEsGiBcFKG8Fk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSDdfo/dJMcadNSFd6/3hlKXC8O9lEsGiBcFKG8Fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSDdfo%2FdJMcadNSFd6%2F3hlKXC8O9lEsGiBcFKG8Fk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;815&quot; height=&quot;340&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주어진 범위 안에서 정수값을 갖는 랜덤 배열&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;특정&amp;nbsp;범위를&amp;nbsp;지정해줄&amp;nbsp;수도&amp;nbsp;있다&lt;/p&gt;
&lt;pre id=&quot;code_1762746518130&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 0-9 사이의 랜덤값 10개의 원소를 갖는 1차원 배열
np.random.randint(0,9,10)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1762746522411&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#0-9 사이틔 랜덤값을 갖는 3행 4열의 2차 배열
np.random.randint(0,9,(3,4))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPuhQJ/dJMcahQhs5v/hCgc4yMIqRmWLzFQfZPE80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPuhQJ/dJMcahQhs5v/hCgc4yMIqRmWLzFQfZPE80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPuhQJ/dJMcahQhs5v/hCgc4yMIqRmWLzFQfZPE80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPuhQJ%2FdJMcahQhs5v%2FhCgc4yMIqRmWLzFQfZPE80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;311&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;랜덤 시드 고정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762746528120&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;np.random.seed(1234)
np.random.normal(0,1,(4,3))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDBqaU/dJMcacBrbV4/lOHbSCKoBk820q7BY9LMO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDBqaU/dJMcacBrbV4/lOHbSCKoBk820q7BY9LMO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDBqaU/dJMcacBrbV4/lOHbSCKoBk820q7BY9LMO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDBqaU%2FdJMcacBrbV4%2FlOHbSCKoBk820q7BY9LMO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;204&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;표준 정규 분포를 따르는 랜덤 배열&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;rand&amp;nbsp;뒤에&amp;nbsp;n&amp;nbsp;이&amp;nbsp;붙어있는&amp;nbsp;메서드를&amp;nbsp;사용하면&amp;nbsp;표준&amp;nbsp;정규&amp;nbsp;분포를&amp;nbsp;따르는&amp;nbsp;형태로&amp;nbsp;숫자가&amp;nbsp;랜덤&amp;nbsp;부여된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762746534390&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;np.random.randn(10)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1762746539174&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;np.random.randn(4,3)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4BTL2/dJMcacBrbVY/WudMZLj38D1pxlKbODi5Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4BTL2/dJMcacBrbVY/WudMZLj38D1pxlKbODi5Z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4BTL2/dJMcacBrbVY/WudMZLj38D1pxlKbODi5Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4BTL2%2FdJMcacBrbVY%2FWudMZLj38D1pxlKbODi5Z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;314&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. ndarray 형태 변환&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;1573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW1LdW/dJMcac2vyec/kVKw4INjywpyS9rpnakXik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW1LdW/dJMcac2vyec/kVKw4INjywpyS9rpnakXik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW1LdW/dJMcac2vyec/kVKw4INjywpyS9rpnakXik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW1LdW%2FdJMcac2vyec%2FkVKw4INjywpyS9rpnakXik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;989&quot; height=&quot;1573&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;1573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;1399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF5sAT/dJMcaeeW9Yj/NRLNY2FYG7606YeIWixFQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF5sAT/dJMcaeeW9Yj/NRLNY2FYG7606YeIWixFQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF5sAT/dJMcaeeW9Yj/NRLNY2FYG7606YeIWixFQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF5sAT%2FdJMcaeeW9Yj%2FNRLNY2FYG7606YeIWixFQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;982&quot; height=&quot;1399&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;1399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;1477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/97ewc/dJMcaiuS4As/xwqbu0rqKtlzyK0B7pqmL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/97ewc/dJMcaiuS4As/xwqbu0rqKtlzyK0B7pqmL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/97ewc/dJMcaiuS4As/xwqbu0rqKtlzyK0B7pqmL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F97ewc%2FdJMcaiuS4As%2Fxwqbu0rqKtlzyK0B7pqmL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;987&quot; height=&quot;1477&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;1477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zj08l/dJMcafkC0UJ/mKyTzTq05KumFVLMnaRnuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zj08l/dJMcafkC0UJ/mKyTzTq05KumFVLMnaRnuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zj08l/dJMcafkC0UJ/mKyTzTq05KumFVLMnaRnuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzj08l%2FdJMcafkC0UJ%2FmKyTzTq05KumFVLMnaRnuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;986&quot; height=&quot;344&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>빅데이터 국비 교육</category>
      <author>datahaseo</author>
      <guid isPermaLink="true">https://datahaseo.tistory.com/61</guid>
      <comments>https://datahaseo.tistory.com/61#entry61comment</comments>
      <pubDate>Mon, 10 Nov 2025 09:45:33 +0900</pubDate>
    </item>
    <item>
      <title>[아이티윌 빅데이터 52기] LAB 13 | 웹 페이지 데이터 수집하기</title>
      <link>https://datahaseo.tistory.com/60</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;[아이티윌&amp;nbsp;빅데이터&amp;nbsp;52기]&amp;nbsp;LAB&amp;nbsp;13&amp;nbsp;|&amp;nbsp;웹&amp;nbsp;페이지&amp;nbsp;데이터&amp;nbsp;수집하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;*모든 자료 저작권은 아이티윌 이광호 강사님&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 스크래핑과 데이터 크롤링의 개념 차이&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDk1fd/dJMcacBqo3L/PUwKKHkSwdFmoItSI7EHfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDk1fd/dJMcacBqo3L/PUwKKHkSwdFmoItSI7EHfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDk1fd/dJMcacBqo3L/PUwKKHkSwdFmoItSI7EHfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDk1fd%2FdJMcacBqo3L%2FPUwKKHkSwdFmoItSI7EHfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;485&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTML 의 이해&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctyAQb/dJMcabvKt6p/Yq5zVmRARLQJ9gat5oez3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctyAQb/dJMcabvKt6p/Yq5zVmRARLQJ9gat5oez3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctyAQb/dJMcabvKt6p/Yq5zVmRARLQJ9gat5oez3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctyAQb%2FdJMcabvKt6p%2FYq5zVmRARLQJ9gat5oez3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;487&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CSS 선택자 개요&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pIGrL/dJMcaaKnkox/qw4FNkgo7pLNs7rUfGTRdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pIGrL/dJMcaaKnkox/qw4FNkgo7pLNs7rUfGTRdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pIGrL/dJMcaaKnkox/qw4FNkgo7pLNs7rUfGTRdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpIGrL%2FdJMcaaKnkox%2Fqw4FNkgo7pLNs7rUfGTRdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;407&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;css selector 예제&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 라이브러리 참조하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 웹 페이지의 모든 소스코드 가져오기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 수신 결과 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 응답 결과에 대한 Beautifulsoup 객체 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. HTML 태그에 의한 추출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 클래스에 의한 추출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. ID 에 의한 추출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 복합 선택자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 속성 선택자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 라이브러리 참조하기&lt;/h4&gt;
&lt;pre id=&quot;code_1762504325061&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 웹 페이지의 모든 소스코드 가져오기&lt;/h4&gt;
&lt;pre id=&quot;code_1762504329958&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#웹에 데이터 요청하기
with requests.Session() as session:

  #세션 객체에 웹 브라우저 정보 (UserAgent) 주입 (웹서버가 파이썬 프로그램을 정상적인 웹 브라우저로 여기도록)
  session.headers.update({&quot;User-Agent&quot;:&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36&quot;
                          })
  


  url = &quot;https://data.hossam.kr/py/sample.html&quot;
  r=session.get(url)    #get 메서드로 접근하고, 파라미터 값 쿼리 스트링 형태로 전달
  print(r.url)
  

  if r.status_code !=200:
    msg =&quot;[%d Error] %s 에러가 발생함&quot; % (r.status_code,r.reason)
    raise Exception(msg)

print(r) # HTTP 통신 상태 확인&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 수신 결과 확인&lt;/h4&gt;
&lt;pre id=&quot;code_1762504335529&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;r.encoding ='utf-8' 
print(type(r.text))
r.text&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cT3AH1/dJMcabvKuff/JktIgkQdgEdDCPgFT1amF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cT3AH1/dJMcabvKuff/JktIgkQdgEdDCPgFT1amF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cT3AH1/dJMcabvKuff/JktIgkQdgEdDCPgFT1amF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcT3AH1%2FdJMcabvKuff%2FJktIgkQdgEdDCPgFT1amF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;934&quot; height=&quot;196&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4. 응답 결과에 대한 Beautifulsoup 객체 생성&lt;/h4&gt;
&lt;pre id=&quot;code_1762504340150&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;soup =BeautifulSoup(r.text)
print(type(soup))
soup&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D7Sic/dJMcabvKufn/0rZjjIw7u55QSQZa5jT5y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D7Sic/dJMcabvKufn/0rZjjIw7u55QSQZa5jT5y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D7Sic/dJMcabvKufn/0rZjjIw7u55QSQZa5jT5y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD7Sic%2FdJMcabvKufn%2F0rZjjIw7u55QSQZa5jT5y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;215&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;5. HTML 태그에 의한 추출&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;select()&amp;nbsp;메서드의&amp;nbsp;리턴&amp;nbsp;타입은&amp;nbsp;항상&amp;nbsp;리스트&amp;nbsp;타입 &lt;br /&gt;-&amp;nbsp;따라서&amp;nbsp;리스트&amp;nbsp;원소에&amp;nbsp;접근하여&amp;nbsp;html&amp;nbsp;태그&amp;nbsp;객체를&amp;nbsp;추출해야한다 &lt;br /&gt;-&amp;nbsp;객체로부터&amp;nbsp;텍스트만&amp;nbsp;추출할&amp;nbsp;떄는&amp;nbsp;&amp;nbsp;tag.text.strip()&lt;/p&gt;
&lt;pre id=&quot;code_1762504357474&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;myselect = soup.select(&quot;h1&quot;)
print(type(myselect))
myselect

===========
mytag=myselect[0]
print(type(mytag))
mytag

===========
mytext = mytag.text.strip()
mytext&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF2kTG/dJMcajAx99w/i4NItsxMEScV1wISWWhowk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF2kTG/dJMcajAx99w/i4NItsxMEScV1wISWWhowk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF2kTG/dJMcajAx99w/i4NItsxMEScV1wISWWhowk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF2kTG%2FdJMcajAx99w%2Fi4NItsxMEScV1wISWWhowk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;661&quot; height=&quot;515&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;6. 클래스에 의한 추출&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;클래스&amp;nbsp;속성은&amp;nbsp;여러&amp;nbsp;항목에&amp;nbsp;공통적으로&amp;nbsp;부여될&amp;nbsp;수&amp;nbsp;있어&amp;nbsp;복수로&amp;nbsp;존재하며,&amp;nbsp;추출된&amp;nbsp;결과는&amp;nbsp;반복문을&amp;nbsp;통해&amp;nbsp;처리가&amp;nbsp;필요하다 &lt;br /&gt;-&amp;nbsp;select()&amp;nbsp;메서르도&amp;nbsp;추출한&amp;nbsp;요소의&amp;nbsp;하위&amp;nbsp;요소를&amp;nbsp;추가적으로&amp;nbsp;추출할&amp;nbsp;수&amp;nbsp;있다&lt;/p&gt;
&lt;pre id=&quot;code_1762504386643&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;myselect=soup.select(&quot;.myclass&quot;)
myselect


===================


for i,v in enumerate(myselect):
  print(&quot;%d 번째 요소 : %s&quot;%(i,v.text.strip()))
  
  
===================

myli = myselect[2].select(&quot;li&quot;)
myli

===================
for i in myli:
  print(i.text.strip())&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m7aIp/dJMcacnS9B9/h7rqcDlUKlAscc8MoPbBKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m7aIp/dJMcacnS9B9/h7rqcDlUKlAscc8MoPbBKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m7aIp/dJMcacnS9B9/h7rqcDlUKlAscc8MoPbBKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm7aIp%2FdJMcacnS9B9%2Fh7rqcDlUKlAscc8MoPbBKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;635&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;635&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;7. ID 에 의한 추출&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;id&amp;nbsp;속성은&amp;nbsp;페이지에서&amp;nbsp;고유한&amp;nbsp;요소임을&amp;nbsp;의미한다 &lt;br /&gt;-&amp;nbsp;단&amp;nbsp;하나만&amp;nbsp;존재하기&amp;nbsp;때문에&amp;nbsp;반복문으로&amp;nbsp;탐색할&amp;nbsp;필요가&amp;nbsp;없다&lt;/p&gt;
&lt;pre id=&quot;code_1762504401499&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;myselect = soup.select(&quot;#myid&quot;)
myselect
====================
print(myselect[0].text.strip())
====================&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwjHQU/dJMcacnS9Cc/VzTBNb4fMM3BPOxkqpV2Ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwjHQU/dJMcacnS9Cc/VzTBNb4fMM3BPOxkqpV2Ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwjHQU/dJMcacnS9Cc/VzTBNb4fMM3BPOxkqpV2Ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwjHQU%2FdJMcacnS9Cc%2FVzTBNb4fMM3BPOxkqpV2Ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;299&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;8. 복합 선택자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;-&amp;nbsp;자식&amp;nbsp;선택자가&amp;nbsp;바로&amp;nbsp;하위에&amp;nbsp;존재할때는&amp;nbsp;&amp;gt;&amp;nbsp;를&amp;nbsp;쓰고,&amp;nbsp;하위&amp;nbsp;중&amp;nbsp;어딘가에&amp;nbsp;존재할&amp;nbsp;때는&amp;nbsp;띄어쓰기로&amp;nbsp;값을&amp;nbsp;추출할&amp;nbsp;수&amp;nbsp;있다&lt;/p&gt;
&lt;pre id=&quot;code_1762504411572&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;soup.select(&quot;.syllabus &amp;gt; .myclass&quot;)


soup.select(&quot;.part1 .myclass&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yAD09/dJMcajtMDuf/zuTm9oox0CLNknQ40LIM5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yAD09/dJMcajtMDuf/zuTm9oox0CLNknQ40LIM5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yAD09/dJMcajtMDuf/zuTm9oox0CLNknQ40LIM5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyAD09%2FdJMcajtMDuf%2FzuTm9oox0CLNknQ40LIM5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;285&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;285&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;9. 속성 선택자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;href&amp;nbsp;속성을&amp;nbsp;갖는&amp;nbsp;요소를&amp;nbsp;추출하는&amp;nbsp;방법&lt;/p&gt;
&lt;pre id=&quot;code_1762504421269&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;myselect = soup.select(&quot;a[href]&quot;)
myselect


====================
# 속성값은 각 태그요소의 attrs 프로퍼티로 접근 가능 --&amp;gt; dict 형태
for i, v in enumerate(myselect):
    print(&quot;----[%d]----&quot; % i)
    print(v.attrs)

# 딕셔너리에 대한 in 연산자는 key의 존재 여부를 판별
if &quot;href&quot; in v.attrs:
    print(&quot;%d번째의 href속성값 : %s&quot; % (i, v.attrs[&quot;href&quot;]))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYDopL/dJMcakzssqH/ZEc0SKSyUPj8xLhuYzToH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYDopL/dJMcakzssqH/ZEc0SKSyUPj8xLhuYzToH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYDopL/dJMcakzssqH/ZEc0SKSyUPj8xLhuYzToH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYDopL%2FdJMcakzssqH%2FZEc0SKSyUPj8xLhuYzToH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;845&quot; height=&quot;503&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>빅데이터 국비 교육</category>
      <author>datahaseo</author>
      <guid isPermaLink="true">https://datahaseo.tistory.com/60</guid>
      <comments>https://datahaseo.tistory.com/60#entry60comment</comments>
      <pubDate>Fri, 7 Nov 2025 17:36:02 +0900</pubDate>
    </item>
    <item>
      <title>[아이티윌 빅데이터 52기] LAB 13 | 웹 페이지 데이터 수집하기 (연구과제)</title>
      <link>https://datahaseo.tistory.com/59</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;[아이티윌 빅데이터 52기] LAB 13 | 웹 페이지 데이터 수집하기&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;*모든 자료 저작권은 아이티윌 이광호 강사님&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYmADd/dJMcad1o25X/X4zTerCCjSuxWpuT0hEKSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYmADd/dJMcad1o25X/X4zTerCCjSuxWpuT0hEKSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYmADd/dJMcad1o25X/X4zTerCCjSuxWpuT0hEKSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYmADd%2FdJMcad1o25X%2FX4zTerCCjSuxWpuT0hEKSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;519&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;작업 순서&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;STEP 1. 라이브러리 불러오기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;STEP 2. 데이터 요청하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;STEP 3. 데이터 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;STEP 4. 불러온 데이터에 대해 객체 생성하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;STEP 5. 메뉴명, 메뉴 설명, 메뉴 이미지 데이터 가져오기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;STEP 6. 데이터 프레임 생성을 위해 데이터 정제하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;STEP 7. 데이터 프레임 생성하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;STEP 8. 이미지 다운을 위한 파일 다운로드 함수 정의하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;STEP 9. 비동기식으로 다운로드 처리하기&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;========================================&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP 1. 라이브러리 불러오기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1762502650780&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from bs4 import BeautifulSoup
from pandas import DataFrame&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP 2. 데이터 요청하기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1762502655414&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#웹에 데이터 요청하기
with requests.Session() as session:

  #세션 객체에 웹 브라우저 정보 (UserAgent) 주입 (웹서버가 파이썬 프로그램을 정상적인 웹 브라우저로 여기도록)
  session.headers.update({&quot;User-Agent&quot;:&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36&quot;
                          })
  


  url = &quot;https://data.hossam.kr/py/myfood.html&quot;
  r=session.get(url,stream=True)    #이미지 파일 다운로드를 위해 stream=True 설정
  print(r.url)
  

  if r.status_code !=200:
    msg =&quot;[%d Error] %s 에러가 발생함&quot; % (r.status_code,r.reason)
    raise Exception(msg)

print(r) # HTTP 통신 상태 확인&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP 3. 데이터 확인하기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1762502661580&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;r.encoding ='utf-8' 
print(type(r.text))
r.text&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmxvYI/dJMcabWOQTV/vQByqEIMIYkb0UHv2j5vf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmxvYI/dJMcabWOQTV/vQByqEIMIYkb0UHv2j5vf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmxvYI/dJMcabWOQTV/vQByqEIMIYkb0UHv2j5vf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmxvYI%2FdJMcabWOQTV%2FvQByqEIMIYkb0UHv2j5vf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;195&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP 4. 불러온 데이터에 대해 객체 생성하기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1762502670730&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;soup =BeautifulSoup(r.text)
print(type(soup))
soup&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1454a/dJMcacVI888/mvlDKBLKCY2z4aa9xNRew0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1454a/dJMcacVI888/mvlDKBLKCY2z4aa9xNRew0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1454a/dJMcacVI888/mvlDKBLKCY2z4aa9xNRew0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1454a%2FdJMcacVI888%2FmvlDKBLKCY2z4aa9xNRew0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;541&quot; height=&quot;209&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP 5. 메뉴명, 메뉴 설명, 메뉴 이미지 데이터 가져오기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1762502714814&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;food_title =soup.select(&quot;h2&quot;)
food_title



titles=[]
for title in food_title:
  a=title.text.strip()
  titles.append(a)

titles


===================
food_desc =soup.select(&quot;div.food-content p&quot;)
food_desc


descriptions=[]
for description in food_desc:
  a=description.text.strip()
  descriptions.append(a)

descriptions

====================

food_img =soup.select(&quot;div.img-wrapper img&quot;)
food_img


images=[]
for image in food_img:
  a=image.get(&quot;src&quot;)
  # print(image.get(&quot;src&quot;))

  images.append(a)

print(images)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pXYtW/dJMcafx9jHG/wKcKNzNPKBzRf6yXtYgVQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pXYtW/dJMcafx9jHG/wKcKNzNPKBzRf6yXtYgVQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pXYtW/dJMcafx9jHG/wKcKNzNPKBzRf6yXtYgVQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpXYtW%2FdJMcafx9jHG%2FwKcKNzNPKBzRf6yXtYgVQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;658&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP 6. 데이터 프레임 생성을 위해 데이터 정제하기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1762502735866&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;overview=[]
for i in range(0,len(titles)-1):
  overall = {&quot;title&quot;:titles[i],&quot;descriptions&quot;:descriptions[i],&quot;images&quot;:images[i]}
  print(overall)
  overview.append(overall)

print(overview)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpWJK6/dJMcadty6jO/bStjTgClijKtZr63nrWpPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpWJK6/dJMcadty6jO/bStjTgClijKtZr63nrWpPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpWJK6/dJMcadty6jO/bStjTgClijKtZr63nrWpPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpWJK6%2FdJMcadty6jO%2FbStjTgClijKtZr63nrWpPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1009&quot; height=&quot;216&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP 7. 데이터 프레임 생성하기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1762502749450&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df = DataFrame(overview)
df.to_excel(&quot;html 연구과제.xlsx&quot;)
df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vPCH6/dJMcabJhGBx/Wnb32fjfvKK5fBDYknYyK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vPCH6/dJMcabJhGBx/Wnb32fjfvKK5fBDYknYyK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vPCH6/dJMcabJhGBx/Wnb32fjfvKK5fBDYknYyK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvPCH6%2FdJMcabJhGBx%2FWnb32fjfvKK5fBDYknYyK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;991&quot; height=&quot;316&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP 8. 이미지 다운을 위한 파일 다운로드 함수 정의하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-여기서&amp;nbsp;download&amp;nbsp;함수는&amp;nbsp;url&amp;nbsp;에&amp;nbsp;있는&amp;nbsp;파일을&amp;nbsp;get&amp;nbsp;해와서,&amp;nbsp;target&amp;nbsp;으로&amp;nbsp;항는&amp;nbsp;파일&amp;nbsp;디렉토리에&amp;nbsp;저장하는&amp;nbsp;역할을&amp;nbsp;수행 &lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762502760751&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def download(url,target):

  session.headers.update({&quot;User-Agent&quot;:&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36&quot;
                          })
  
  try:
    #이미지를 웹 서버에 요청
    r=session.get(url,stream=True)
    r.encoding = 'utf-8'

    #서버가 보낸 그림 데이터를 가져와서 저장. 글자가 아닌 이미지 데이터기 떄문에 wb 모드로 저장
    with open(target,&quot;wb&quot;) as f:
      f.write(r.raw.read())
      print(target, &quot;가 저장되었습니다&quot;)

  #예외처리
  except Exception:
    print(target,&quot;저장 실패&quot;, e)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP 9. 비동기식으로 다운로드 처리하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp;현재&amp;nbsp;시각으로&amp;nbsp;된&amp;nbsp;새&amp;nbsp;폴더를&amp;nbsp;만든다. &lt;br /&gt;-&amp;nbsp;ThreadPoolExecutor로&amp;nbsp;스레드&amp;nbsp;풀을&amp;nbsp;열어&amp;nbsp;동시에&amp;nbsp;여러&amp;nbsp;다운로드&amp;nbsp;작업을&amp;nbsp;실행한다. &lt;br /&gt;-&amp;nbsp;overview에&amp;nbsp;담긴&amp;nbsp;각&amp;nbsp;아이템에서&amp;nbsp;이미지&amp;nbsp;URL을&amp;nbsp;꺼내&amp;nbsp;파일&amp;nbsp;경로를&amp;nbsp;만들고,&amp;nbsp;download(url,&amp;nbsp;path)를&amp;nbsp;비동기&amp;nbsp;제출한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762502767816&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import datetime as dt

#비동기 처리 기능을 제공하는 모듈
from concurrent import futures

#다운로드 결과가 저장될 폴더 생성하기 (폴더 이름은 현재 시간으로 생성)
dirname = dt.datetime.now().strftime(&quot;%Y%m%d-%H%M%S&quot;)
os.mkdir(dirname)


#비동기 작업 내에서 이미지 다운로드 받기 - 비동기 병렬 작업을 시작 (여러개의 스레드를 만들어 여러 작업을 동시에 실행하는 역할)
with futures.ThreadPoolExecutor() as executor:


  #이미지 정보를 하나씩 꺼내서 해당 이미지에 대한 파일 이름을 만들고, 해당 파일 경로를 기준으로 파일을 저장하는 download 함수를 실행 (함수와 그 함수에 필요한 파라미터를 전송하여 비동기 처리 되도록 함)
  for i,v in enumerate(overview):

    #저장될 파일 경로 문자열 생성
    file_path = os.path.join(dirname, &quot;%d.jpg&quot; %i)

    # 비동기 다운로드 요청
    executor.submit(download,v['images'],file_path)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byae0D/dJMcajgfomJ/Mn6x771ND9tZThG83asyPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byae0D/dJMcajgfomJ/Mn6x771ND9tZThG83asyPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byae0D/dJMcajgfomJ/Mn6x771ND9tZThG83asyPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyae0D%2FdJMcajgfomJ%2FMn6x771ND9tZThG83asyPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;372&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>빅데이터 국비 교육</category>
      <author>datahaseo</author>
      <guid isPermaLink="true">https://datahaseo.tistory.com/59</guid>
      <comments>https://datahaseo.tistory.com/59#entry59comment</comments>
      <pubDate>Fri, 7 Nov 2025 15:05:32 +0900</pubDate>
    </item>
    <item>
      <title>[아이티윌 빅데이터 52기] LAB 13 | 파이썬 파이널 과제 |  OpenAPI 연동 실습 (개인 작성 버전)</title>
      <link>https://datahaseo.tistory.com/58</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;[아이티윌&amp;nbsp;빅데이터&amp;nbsp;52기]&amp;nbsp;LAB&amp;nbsp;13&amp;nbsp;|&amp;nbsp;파이썬&amp;nbsp;파이널&amp;nbsp;과제&amp;nbsp;|&amp;nbsp;&amp;nbsp;OpenAPI&amp;nbsp;연동&amp;nbsp;실습&amp;nbsp;(개인&amp;nbsp;작성&amp;nbsp;버전)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;모든 과제에 대한 저작권은 아이티윌 이광호 강사님께 있습니다&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEqabx/dJMcagqhYSy/bJnKpOsCQZrz0te7n5kHA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEqabx/dJMcagqhYSy/bJnKpOsCQZrz0te7n5kHA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEqabx/dJMcagqhYSy/bJnKpOsCQZrz0te7n5kHA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEqabx%2FdJMcagqhYSy%2FbJnKpOsCQZrz0te7n5kHA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;698&quot; height=&quot;487&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;활용할 데이터 셋&lt;/h4&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.vworld.kr/dev/v4dv_geocoderguide2_s002.do&quot;&gt;브이월드 API레퍼런스&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://data.seoul.go.kr/dataList/OA-12035/S/1/datasetView.do&quot;&gt;서울교통공사_역주소 및 전화번호&amp;gt; 데이터셋&amp;gt; 공공데이터 | 서울열린데이터광장&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1762487949090&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;열린데이터광장 메인&quot; data-og-description=&quot;데이터분류,데이터검색,데이터활용&quot; data-og-host=&quot;data.seoul.go.kr&quot; data-og-source-url=&quot;https://data.seoul.go.kr/dataList/OA-12035/S/1/datasetView.do&quot; data-og-url=&quot;https://data.seoul.go.kr&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bL747p/hyZNbHBbOa/Vj1z01zH3Xmw9Y1UqPU6Kk/img.jpg?width=740&amp;amp;height=291&amp;amp;face=158_21_189_228,https://scrap.kakaocdn.net/dn/bv4dLl/hyZNaIFVAx/R6F2bXHzQSz5fleEvfwVn1/img.jpg?width=740&amp;amp;height=291&amp;amp;face=0_0_740_291&quot;&gt;&lt;a href=&quot;https://data.seoul.go.kr/dataList/OA-12035/S/1/datasetView.do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://data.seoul.go.kr/dataList/OA-12035/S/1/datasetView.do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bL747p/hyZNbHBbOa/Vj1z01zH3Xmw9Y1UqPU6Kk/img.jpg?width=740&amp;amp;height=291&amp;amp;face=158_21_189_228,https://scrap.kakaocdn.net/dn/bv4dLl/hyZNaIFVAx/R6F2bXHzQSz5fleEvfwVn1/img.jpg?width=740&amp;amp;height=291&amp;amp;face=0_0_740_291');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;열린데이터광장 메인&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;데이터분류,데이터검색,데이터활용&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;data.seoul.go.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;작성 순서&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #6796e6;&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; 서울 열린 데이터 광장 OPEN API 활용 | 서울교통공사_역주소 및 전화번호 데이터 가져오기&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6796e6;&quot;&gt;2.&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; 국토교통부 V WORLD OPEN API 활용 | 주소를 좌표로 변환해보기&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6796e6;&quot;&gt;3.&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; pandas의 조인 문법 활용, 주소를 기준으로 하나의 데이터 프레임 형태로 만들기&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;선생님 풀이와 차이가 있었던 부분&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 데이터 작업 : 서울교통공사 데이터를 가져올 때, 본인은 open api 활용 , 선생님은 csv 다운 후 open()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;함수 활용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 예외 처리에서의 디테일 : 본인은 국토교통부에 주소지를 위도/경도로 바꾸는 작업에서 주소 타입을 한 가지에 대해서만 처리하면서 데이터에 결측치가 발생했으나, 선생님 풀이는 try~except 를 통해 두 가지 타입에 대해 모두 커버하며 결측치 가능성 최소화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 속도 처리: 선생님 풀이는 비동기 방식을 통해 1분 20초 걸리던 작업을 20초 이내로 단축&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;*선생님 풀이 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://datahaseo.com/57&quot;&gt;https://datahaseo.com/57&lt;/a&gt;&lt;/p&gt;</description>
      <category>빅데이터 국비 교육</category>
      <author>datahaseo</author>
      <guid isPermaLink="true">https://datahaseo.tistory.com/58</guid>
      <comments>https://datahaseo.tistory.com/58#entry58comment</comments>
      <pubDate>Fri, 7 Nov 2025 13:03:09 +0900</pubDate>
    </item>
    <item>
      <title>[아이티윌 빅데이터 52기] LAB 13 | 파이썬 파이널 과제 |  OpenAPI 연동 실습 (선생님 버전)</title>
      <link>https://datahaseo.tistory.com/57</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;[아이티윌&amp;nbsp;빅데이터&amp;nbsp;52기]&amp;nbsp;LAB&amp;nbsp;13&amp;nbsp;|&amp;nbsp;파이썬&amp;nbsp;파이널&amp;nbsp;과제&amp;nbsp;|&amp;nbsp;&amp;nbsp;OpenAPI&amp;nbsp;연동&amp;nbsp;실습&amp;nbsp;(선생님&amp;nbsp;버전)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;모든 과제에 대한 저작권은 아이티윌 이광호 강사님께 있습니다&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpg7Uj/dJMcajN5eLt/c11bkWzRdUVqfmq3sa3cO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpg7Uj/dJMcajN5eLt/c11bkWzRdUVqfmq3sa3cO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpg7Uj/dJMcajN5eLt/c11bkWzRdUVqfmq3sa3cO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdpg7Uj%2FdJMcajN5eLt%2Fc11bkWzRdUVqfmq3sa3cO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;578&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;활용할 데이터 셋&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.vworld.kr/dev/v4dv_geocoderguide2_s002.do&quot;&gt;브이월드 API레퍼런스&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://data.seoul.go.kr/dataList/OA-12035/S/1/datasetView.do&quot;&gt;서울교통공사_역주소 및 전화번호&amp;gt; 데이터셋&amp;gt; 공공데이터 | 서울열린데이터광장&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;풀이 순서&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;STEP1. 패키지 참조&lt;/b&gt;&lt;br /&gt;&lt;b&gt;STEP2. CSV 파일 읽어오기 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;STEP 3. Open API 데이터 요청 스펙 확인 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;STEP4. 위경도를 조회하는 함수 정의 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;STEP.5-1 위경도 변환하기 | 동기 방식 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;STEP.5-2 위경도 변환하기 | 비동기 방식 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;STEP.6 변환 결과 저장하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP1. 패키지 참조&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1762487171500&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from pandas import DataFrame
from concurrent import futures&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;STEP2. CSV 파일 읽어오기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1762487176233&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#서울 열린 데이터 광장 - 서울 교통공사 역주소 및 전화번호 최근 데이터셋을 다운받아 r 읽기 모드로 데이터를 가져온다
with open(&quot;서울교통공사_역주소 및 전화번호_20250318.csv&quot;,&quot;r&quot;,encoding='euc-kr') as f:
  #데이터 세트 객체를 한 행씩 읽는 readlines() 메서드를 활용하고, 해당 결과를 csv_list 에 담는다
  csv_list=f.readlines()

print(csv_list[:5])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP 3. Open API 데이터 요청 스펙 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;OPEN&amp;nbsp;API&amp;nbsp;를&amp;nbsp;연결할&amp;nbsp;때의&amp;nbsp;작업&amp;nbsp;항목들&amp;nbsp;살펴보면, &lt;br /&gt;OPEN&amp;nbsp;API&amp;nbsp;요청&amp;nbsp;정보를&amp;nbsp;확인하고,&amp;nbsp;SESSION&amp;nbsp;객체로&amp;nbsp;URL&amp;nbsp;에&amp;nbsp;접속하여&amp;nbsp;데이터를&amp;nbsp;가져오는&amp;nbsp;것. &lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762487190422&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#요청 url
url = &quot;https://api.vworld.kr/req/address?&quot;
key = &quot;생략&quot;

#요청 파라미터 (명세서 확인)
params = {
	&quot;service&quot;: &quot;address&quot;,
	&quot;request&quot;: &quot;getcoord&quot;,
	&quot;crs&quot;: &quot;epsg:4326&quot;,
	&quot;address&quot;: &quot;판교로 242&quot;,
	&quot;format&quot;: &quot;json&quot;,
	&quot;type&quot;: &quot;road&quot;,
	&quot;key&quot;: key
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1762487198659&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#웹에 데이터 요청하기
with requests.Session() as session:

  #세션 객체에 웹 브라우저 정보 (UserAgent) 주입 (웹서버가 파이썬 프로그램을 정상적인 웹 브라우저로 여기도록)
  session.headers.update({&quot;User-Agent&quot;:&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36&quot;
                          })
  

  r=session.get(url,params=params)    #get 메서드로 접근하고, 파라미터 값 쿼리 스트링 형태로 전달
  print(r.url)

  if r.status_code !=200:
    msg =&quot;[%d Error] %s 에러가 발생함&quot; % (r.status_code,r.reason)
    raise Exception(msg)

print(r) # HTTP 통신 상태 확인&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1762487203444&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#요청 테스트 확인
mydict = r.json()
mydict&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HPNqZ/dJMb995LMqA/oQmNriOK6MzA2KfcnKY70k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HPNqZ/dJMb995LMqA/oQmNriOK6MzA2KfcnKY70k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HPNqZ/dJMb995LMqA/oQmNriOK6MzA2KfcnKY70k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHPNqZ%2FdJMb995LMqA%2FoQmNriOK6MzA2KfcnKY70k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;732&quot; height=&quot;506&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1762487211183&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#위도와 경도 추출

point=mydict[&quot;response&quot;][&quot;result&quot;][&quot;point&quot;]
print(point[&quot;x&quot;],point[&quot;y&quot;])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bicNwR/dJMcai9tI0z/GKBpHfRAbdZzhmFhQM85WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bicNwR/dJMcai9tI0z/GKBpHfRAbdZzhmFhQM85WK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bicNwR/dJMcai9tI0z/GKBpHfRAbdZzhmFhQM85WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbicNwR%2FdJMcai9tI0z%2FGKBpHfRAbdZzhmFhQM85WK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;162&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP4. 위경도를 조회하는 함수 정의&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;위경도를&amp;nbsp;조회하는&amp;nbsp;함수&amp;nbsp;정의 &lt;br /&gt;위에서&amp;nbsp;테스트로&amp;nbsp;확인한&amp;nbsp;과정을&amp;nbsp;함수로&amp;nbsp;정의&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762487219342&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def get_point(addr,type =&quot;road&quot;):
  #요청 url
  url = &quot;https://api.vworld.kr/req/address?&quot;
  key = &quot;1C1C7AC9-4A35-3854-BFE7-D91FAEDD655E&quot;

  #요청 파라미터 (명세서 확인)
  params = {
    &quot;service&quot;: &quot;address&quot;,
    &quot;request&quot;: &quot;getcoord&quot;,
    &quot;crs&quot;: &quot;epsg:4326&quot;,
    &quot;address&quot;: addr,
    &quot;format&quot;: &quot;json&quot;,
    &quot;type&quot;: type,
    &quot;key&quot;: key
  }


#웹에 데이터 요청하기
  with requests.Session() as session:

    #세션 객체에 웹 브라우저 정보 (UserAgent) 주입 (웹서버가 파이썬 프로그램을 정상적인 웹 브라우저로 여기도록)
    session.headers.update({&quot;User-Agent&quot;:&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36&quot;
                            })
    

    r=session.get(url,params=params)    #get 메서드로 접근하고, 파라미터 값 쿼리 스트링 형태로 전달
    print(r.url)

    if r.status_code !=200:
      msg =&quot;[%d Error] %s 에러가 발생함&quot; % (r.status_code,r.reason)
      raise Exception(msg)

    mydict = r.json()
    point=mydict[&quot;response&quot;][&quot;result&quot;][&quot;point&quot;]
      
    return (point[&quot;x&quot;],point[&quot;y&quot;])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ0Y53/dJMcajUQPn5/gWBxb0eDlgHO61CwnSD3B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ0Y53/dJMcajUQPn5/gWBxb0eDlgHO61CwnSD3B1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ0Y53/dJMcajUQPn5/gWBxb0eDlgHO61CwnSD3B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ0Y53%2FdJMcajUQPn5%2FgWBxb0eDlgHO61CwnSD3B1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;375&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP.5-1 위경도 변환하기 | 동기 방식&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;-&amp;nbsp;OPEN&amp;nbsp;API&amp;nbsp;를&amp;nbsp;활용하기&amp;nbsp;위해서는&amp;nbsp;주소지&amp;nbsp;정보를&amp;nbsp;넣어&amp;nbsp;경도와&amp;nbsp;위도&amp;nbsp;값을&amp;nbsp;반환해야하고, &lt;br /&gt;해당&amp;nbsp;과정을&amp;nbsp;get_point()&amp;nbsp;라는&amp;nbsp;함수로&amp;nbsp;정의한&amp;nbsp;상황.&amp;nbsp;이&amp;nbsp;함수를&amp;nbsp;쓰려면&amp;nbsp;주소&amp;nbsp;정보를&amp;nbsp;get_point()&amp;nbsp;함수에&amp;nbsp;파라미터로&amp;nbsp;전달해야&amp;nbsp;하므로,&amp;nbsp;우선&amp;nbsp;csv_list&amp;nbsp;에서&amp;nbsp;주소&amp;nbsp;정보를&amp;nbsp;추출한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt; &lt;br /&gt;-&amp;nbsp;추출한&amp;nbsp;주소&amp;nbsp;정보를&amp;nbsp;get_point()&amp;nbsp;함수에&amp;nbsp;넣으면&amp;nbsp;경도와&amp;nbsp;위도&amp;nbsp;정보가&amp;nbsp;나오는데,&amp;nbsp;만약&amp;nbsp;기본값으로&amp;nbsp;세팅한&amp;nbsp;type=road&amp;nbsp;에서&amp;nbsp;변환이&amp;nbsp;되지&amp;nbsp;않았다면&amp;nbsp;,&amp;nbsp;지번&amp;nbsp;주소로&amp;nbsp;재시도&amp;nbsp;하는&amp;nbsp;예외&amp;nbsp;처리를&amp;nbsp;걸어준다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt; &lt;br /&gt;-&amp;nbsp;만약&amp;nbsp;지번&amp;nbsp;주소에서도&amp;nbsp;예외로&amp;nbsp;처리되면&amp;nbsp;그때는&amp;nbsp;위도와&amp;nbsp;경도에&amp;nbsp;None&amp;nbsp;값을&amp;nbsp;넣어준다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt; &lt;br /&gt;-&amp;nbsp;기존에&amp;nbsp;존재하던&amp;nbsp;csv_list&amp;nbsp;데이터의&amp;nbsp;각&amp;nbsp;항목들에&amp;nbsp;위도와&amp;nbsp;경도를&amp;nbsp;추가해주고,&amp;nbsp;이&amp;nbsp;결과를&amp;nbsp;비워진&amp;nbsp;리스트&amp;nbsp;resultset에&amp;nbsp;넣어주면&amp;nbsp;리스트&amp;nbsp;내에&amp;nbsp;각&amp;nbsp;데이터들이&amp;nbsp;또&amp;nbsp;다른&amp;nbsp;리스트&amp;nbsp;형태로&amp;nbsp;존재하는&amp;nbsp;2차원&amp;nbsp;구조의&amp;nbsp;데이터가&amp;nbsp;완성된다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762487225738&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;size = len(csv_list)
resultset=[]
for i,v in enumerate(csv_list[1:]): #제목을 건너뛰기 위해 1부터
  print(&quot;%d/%d 진행중...&quot;%(i+1,size))
  items=v.strip().split(&quot;,&quot;)

  try:
    lat,lon = get_point(items[5])
  
  except Exception as e :
    try:
      lat,lon =get_point(items[6],type=&quot;parcel&quot;)

    except Exception as e2:
      lat =None
      lon=None

  items.append(lat)
  items.append(lon)
  resultset.append(items)


resultset&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tw2ii/dJMcagqhYJT/ukKSA2Me0M9ohITzMkLoyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tw2ii/dJMcagqhYJT/ukKSA2Me0M9ohITzMkLoyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tw2ii/dJMcagqhYJT/ukKSA2Me0M9ohITzMkLoyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftw2ii%2FdJMcagqhYJT%2FukKSA2Me0M9ohITzMkLoyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;274&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;201&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crUBRK/dJMcai2H68k/pZt5KrSZDnTc6sqXbTQRHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crUBRK/dJMcai2H68k/pZt5KrSZDnTc6sqXbTQRHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crUBRK/dJMcai2H68k/pZt5KrSZDnTc6sqXbTQRHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrUBRK%2FdJMcai2H68k%2FpZt5KrSZDnTc6sqXbTQRHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;201&quot; height=&quot;74&quot; data-origin-width=&quot;201&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP.5-2 위경도 변환하기 | 비동기 방식&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;- 비동기식 작업은 반복해서 실행해야하는 함수가 정의되어 있으면, worker 들이 스레드에서 해당 함수 작업을 하는 프로세스를 빈 리스트에 넣어주고, 나중에 그 프로세스들에 대한 결과 for 구문으로 탐색해면 빠르게 작업된 결과물들에 접근할 수 있게 된다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt; &lt;br /&gt;-&amp;nbsp;여기서는&amp;nbsp;위에서&amp;nbsp;정의한&amp;nbsp;get_point&amp;nbsp;함수를&amp;nbsp;일거리로&amp;nbsp;보내주고,&amp;nbsp;그&amp;nbsp;작업을&amp;nbsp;processes&amp;nbsp;리스트에&amp;nbsp;넣어준다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt; &lt;br /&gt;-&amp;nbsp;processes&amp;nbsp;리스트를&amp;nbsp;result()&amp;nbsp;메서드로&amp;nbsp;탐색하면&amp;nbsp;결과값을&amp;nbsp;lat&amp;nbsp;과&amp;nbsp;lon&amp;nbsp;으로&amp;nbsp;받아온다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt; &lt;br /&gt;-&amp;nbsp;새롭게&amp;nbsp;추가된&amp;nbsp;lat&amp;nbsp;과&amp;nbsp;lon&amp;nbsp;은&amp;nbsp;csv_list&amp;nbsp;문자열을&amp;nbsp;요소별로&amp;nbsp;items&amp;nbsp;리스트로&amp;nbsp;만든&amp;nbsp;다음&amp;nbsp;해당&amp;nbsp;리스트에&amp;nbsp;append&amp;nbsp;해주고,&amp;nbsp;append&amp;nbsp;된&amp;nbsp;리스트&amp;nbsp;결과를&amp;nbsp;resultset&amp;nbsp;에&amp;nbsp;하나씩&amp;nbsp;차곡차곡&amp;nbsp;쌓아준다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762487233337&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;size = len(csv_list)
resultset=[]
processes=[] # 비동기 작업 프로세스를 저장할 리스트


with futures.ThreadPoolExecutor(max_workers=30) as executor:

  for i,v in enumerate(csv_list[1:]):     #제목을 건너뛰기 위해 1부터
    print(&quot;%d/%d 진행중...&quot;%(i+1,size))
    items=v.strip().split(&quot;,&quot;)

    pro=executor.submit(get_point,items[5])
    processes.append(pro)   #위에서 준비한 리스트에 저장


  for i,p in enumerate(processes) :   #비동기 프로세스가 실행되는 동안 발생하는 예외에 대비하기 위한 처리 

    try:
      lat,lon = p.result()
    
    except Exception as e :
      try:
        lat,lon =get_point(items[6],type=&quot;parcel&quot;)

      except Exception as e2:
        lat =None
        lon=None

    items=csv_list[i+1].strip().split(&quot;,&quot;)
    items.append(lat)
    items.append(lon)
    resultset.append(items)


resultset&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyWdhq/dJMcagcKN1S/AFAC0W0iBSJho2xwtlijk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyWdhq/dJMcagcKN1S/AFAC0W0iBSJho2xwtlijk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyWdhq/dJMcagcKN1S/AFAC0W0iBSJho2xwtlijk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyWdhq%2FdJMcagcKN1S%2FAFAC0W0iBSJho2xwtlijk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;277&quot; height=&quot;90&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STEP.6 변환 결과 저장하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;-&amp;nbsp;리스트&amp;nbsp;안에&amp;nbsp;리스트&amp;nbsp;형식으로&amp;nbsp;각&amp;nbsp;행들이&amp;nbsp;쌓여져&amp;nbsp;있는&amp;nbsp;상황,resultset&amp;nbsp;리스트를&amp;nbsp;탐색해주고,&amp;nbsp;각&amp;nbsp;리스들의&amp;nbsp;값을&amp;nbsp;순서대로&amp;nbsp;딕셔너리에&amp;nbsp;반복해서&amp;nbsp;넣어준다.&amp;nbsp;이&amp;nbsp;딕셔너리를&amp;nbsp;비워져있는&amp;nbsp;리스트에&amp;nbsp;넣고,&amp;nbsp;해당&amp;nbsp;결과물을&amp;nbsp;데이터&amp;nbsp;프레임으로&amp;nbsp;바꿔주면&amp;nbsp;엑셀&amp;nbsp;형태로&amp;nbsp;다운받을&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;된다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762487240973&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new_resultset = []

for r in resultset:
    item_dict = {
        &quot;역번&quot;: r[0],
        &quot;역번호&quot;: r[1],
        &quot;호선&quot;: r[2],
        &quot;역명&quot;: r[3],
        &quot;역전화번호&quot;: r[4],
        &quot;도로명주소&quot;: r[5],
        &quot;지번주소&quot;: r[6],
        &quot;위도&quot;: r[7],
        &quot;경도&quot;: r[8]
    }

    new_resultset.append(item_dict)

df = DataFrame(new_resultset)
df.to_excel(&quot;지하철역.xlsx&quot;)
df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bccCtl/dJMcadAkCPW/zYB6nEIc60p2qYGy6ZI6A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bccCtl/dJMcadAkCPW/zYB6nEIc60p2qYGy6ZI6A0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bccCtl/dJMcadAkCPW/zYB6nEIc60p2qYGy6ZI6A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbccCtl%2FdJMcadAkCPW%2FzYB6nEIc60p2qYGy6ZI6A0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;609&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>빅데이터 국비 교육</category>
      <author>datahaseo</author>
      <guid isPermaLink="true">https://datahaseo.tistory.com/57</guid>
      <comments>https://datahaseo.tistory.com/57#entry57comment</comments>
      <pubDate>Fri, 7 Nov 2025 12:51:30 +0900</pubDate>
    </item>
    <item>
      <title>[아이티윌 빅데이터 52기] LAB 12 | 웹 데이터 수집하기 | 네이버 트렌드 데이터 API</title>
      <link>https://datahaseo.tistory.com/56</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;[아이티윌&amp;nbsp;빅데이터&amp;nbsp;52기]&amp;nbsp;LAB&amp;nbsp;12&amp;nbsp;|&amp;nbsp;웹&amp;nbsp;데이터&amp;nbsp;수집하기&amp;nbsp;|&amp;nbsp;네이버&amp;nbsp;트렌드&amp;nbsp;데이터&amp;nbsp;API&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;네이버 API 데이터 사전 준비&lt;/h3&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;STEP 1. 네이버 개발자 사이트에 들어와 로그인 한다&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;STEP 2. 키 발급을 위해 앱 생성창에 필요한 정보를 입력&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;STEP 3. &lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;등록 후 개인 CLIENT 키 확인&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;STEP 4.&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;&amp;nbsp;Documents 메뉴 &amp;gt; 통합 검색어 트렌드 &amp;gt;&amp;nbsp; API&amp;nbsp; 레퍼런스 에서&amp;nbsp; 기본 url 및 관련 명세서 확인&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;STEP 1. 네이버 개발자 사이트에 들어와 로그인 한다&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QZYDV/dJMcaacwMHE/DgTwhSgN3AnE3nPk3xqakk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QZYDV/dJMcaacwMHE/DgTwhSgN3AnE3nPk3xqakk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QZYDV/dJMcaacwMHE/DgTwhSgN3AnE3nPk3xqakk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQZYDV%2FdJMcaacwMHE%2FDgTwhSgN3AnE3nPk3xqakk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;926&quot; height=&quot;591&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;STEP 2. 키 발급을 위해 앱 생성창에 필요한 정보를 입력&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;881&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdvITq/dJMcaezesgk/7SQprKHRdWsBVnaXi7hwek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdvITq/dJMcaezesgk/7SQprKHRdWsBVnaXi7hwek/img.png&quot; data-alt=&quot;\&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdvITq/dJMcaezesgk/7SQprKHRdWsBVnaXi7hwek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdvITq%2FdJMcaezesgk%2F7SQprKHRdWsBVnaXi7hwek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;938&quot; height=&quot;881&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;881&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;\&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;STEP 3. 등록 후 개인 CLIENT 키 확인&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MQ03U/dJMcaboYg8u/GJ6osEMwYr65llH0xk5xzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MQ03U/dJMcaboYg8u/GJ6osEMwYr65llH0xk5xzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MQ03U/dJMcaboYg8u/GJ6osEMwYr65llH0xk5xzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMQ03U%2FdJMcaboYg8u%2FGJ6osEMwYr65llH0xk5xzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;831&quot; height=&quot;399&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;STEP 4. Documents 메뉴 &amp;gt; 통합 검색어 트렌드 &amp;gt;&amp;nbsp; API&amp;nbsp; 레퍼런스 에서&amp;nbsp; 기본 url 및 관련 명세서 확인&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5KwaP/dJMb99LstS8/QCAIEkobu9bBqLdnQur861/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5KwaP/dJMb99LstS8/QCAIEkobu9bBqLdnQur861/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5KwaP/dJMb99LstS8/QCAIEkobu9bBqLdnQur861/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5KwaP%2FdJMb99LstS8%2FQCAIEkobu9bBqLdnQur861%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;869&quot; height=&quot;383&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IDHc2/dJMcad1osFc/cyYSU98Kq6qpy4Dp7FEYB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IDHc2/dJMcad1osFc/cyYSU98Kq6qpy4Dp7FEYB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IDHc2/dJMcad1osFc/cyYSU98Kq6qpy4Dp7FEYB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIDHc2%2FdJMcad1osFc%2FcyYSU98Kq6qpy4Dp7FEYB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;802&quot; height=&quot;630&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;============================================================&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;네이버 검색어 API 데이터 가져오기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STEP 1. 라이브러리 참조하기&lt;br /&gt;STEP 2. 요청 정보 확인 및 구성&lt;br /&gt;STEP 3. 웹 데이터 요청하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STEP 4. 응답 결과 1차 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STEP 5 1차 결과 재구성 (2차원 구조를 1차원 구조로 전처리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STEP 6 최종 데이터 세트를 데이터 프레임으로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 1. 라이브러리 참조하기&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;요청&amp;nbsp;파라미터를&amp;nbsp;json&amp;nbsp;형식으로&amp;nbsp;전달하기&amp;nbsp;위해서&amp;nbsp;json&amp;nbsp;라이브러리를&amp;nbsp;추가한다&lt;/p&gt;
&lt;pre id=&quot;code_1762332813899&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
import json
import datetime as dt
from pandas import DataFrame&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;STEP 2. 요청 정보 확인 및 구성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필수 전달 요소들로는 startDate, endDate, timeUnit,keywordGroups 등이 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 기본 요청 url 과 인증키 등을 변수로 만든 다음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜 객체를 사용하여 오늘 날짜 taday, 그리고 거기서 365일을 뺀 1년 전의 날짜 데이터를 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keywordGroups 의 경우 array(json) 이라고 써져 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 배열 안에 딕셔너리가 있고, 또 그 안에 리스트 형태의 데이터가 있음을 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;위의 전달 파라미터들을 명세서의 요청사항에 따라 json 형식 으로, 즉 딕셔너리로 전달한다&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCKh7R/dJMcahpbMkD/Z0Iwz4YyBB26gvzjxK0yG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCKh7R/dJMcahpbMkD/Z0Iwz4YyBB26gvzjxK0yG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCKh7R/dJMcahpbMkD/Z0Iwz4YyBB26gvzjxK0yG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCKh7R%2FdJMcahpbMkD%2FZ0Iwz4YyBB26gvzjxK0yG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;840&quot; height=&quot;666&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHkqcB/dJMcagqhrch/gpvaW6kZq6AKj9UOhldds1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHkqcB/dJMcagqhrch/gpvaW6kZq6AKj9UOhldds1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHkqcB/dJMcagqhrch/gpvaW6kZq6AKj9UOhldds1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHkqcB%2FdJMcagqhrch%2FgpvaW6kZq6AKj9UOhldds1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;655&quot; height=&quot;152&quot; data-origin-width=&quot;655&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762332864073&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#요청 url
url = &quot;https://openapi.naver.com/v1/datalab/search&quot;


#네이버 인증키
clientId = &quot;생략&quot;
clientSecret =&quot;생략&quot;


#필수 파라미터인 날짜 변수 생성(오늘 날짜와 1년 전 날짜)

now = dt.datetime.now()
today = now.strftime(&quot;%Y-%m-%d&quot;)
startDateDelta = now -dt.timedelta(days=365)
startDate = startDateDelta.strftime(&quot;%Y-%m-%d&quot;)


data = {
    &quot;startDate&quot;: startDate,          # 검색 시작일
    &quot;endDate&quot;: today,                # 검색 종료일
    &quot;timeUnit&quot;: &quot;date&quot;,              # date: 일간, week: 주간, month: 월간
    &quot;keywordGroups&quot;: [
        {
            &quot;groupName&quot;: &quot;Benz&quot;,     # 검색주제
            # 주제와 관련된 검색어
            &quot;keywords&quot;: [&quot;벤츠&quot;, &quot;e클래스&quot;, &quot;s클래스&quot;, &quot;c클래스&quot;, &quot;벤츠 cls&quot;]
        },
        {
            &quot;groupName&quot;: &quot;BMW&quot;,
            &quot;keywords&quot;: [&quot;BMW&quot;, &quot;5시리즈&quot;, &quot;x5&quot;, &quot;x7&quot;, &quot;x3&quot;]
        },
        {
            &quot;groupName&quot;: &quot;AUDI&quot;,
            &quot;keywords&quot;: [&quot;아우디&quot;, &quot;a6&quot;, &quot;e트론&quot;, &quot;a7&quot;, &quot;q5&quot;]
        }
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;STEP 3. 웹 데이터 요청하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명세서의 요구에 따라 헤더에&amp;nbsp; client-id 와 secret 항목을 추가한다 (위에서 변수 생성 완료)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 post 형식으로 웹 서버와 통신한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(get 형식은 url 길이 제한도 있고, 복잡한 구조에는 한계가 있기 떄문에, post 가 단순 데이터 저장 목적이 아닌, 복잡한 데이터를 본문에 담아 보내는 역할로 post 형식이 쓰인 것)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1521&quot; data-start=&quot;1482&quot;&gt;&lt;b&gt;GET은 데이터를 &amp;ldquo;주소(URL)&amp;rdquo;에만 붙여서 보냅니다.&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1521&quot; data-start=&quot;1482&quot;&gt;특징:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;627&quot; data-start=&quot;532&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;562&quot; data-start=&quot;532&quot;&gt;URL에 모든 정보가 노출됨 (누구나 볼 수 있음)&lt;/li&gt;
&lt;li data-end=&quot;577&quot; data-start=&quot;563&quot;&gt;Body(본문)가 없음&lt;/li&gt;
&lt;li data-end=&quot;627&quot; data-start=&quot;578&quot;&gt;주소가 길면 한계에 걸릴 수 있음 (브라우저, 서버마다 보통 2KB ~ 4KB 제한)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1570&quot; data-start=&quot;1522&quot;&gt;&lt;b&gt;POST는 데이터를 &amp;ldquo;요청 본문(body)&amp;rdquo;에 JSON이나 form 형식으로 담아서 보냅니다&lt;/b&gt;.&lt;/li&gt;
&lt;li data-end=&quot;1014&quot; data-start=&quot;991&quot;&gt;특징:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1014&quot; data-start=&quot;901&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;916&quot; data-start=&quot;901&quot;&gt;URL은 짧고 깔끔함&lt;/li&gt;
&lt;li data-end=&quot;950&quot; data-start=&quot;917&quot;&gt;실제 내용(JSON)은 &amp;ldquo;본문(body)&amp;rdquo;에 들어있음&lt;/li&gt;
&lt;li data-end=&quot;990&quot; data-start=&quot;951&quot;&gt;URL에는 아무것도 안 보이지만, 서버는 body를 읽어서 처리&lt;/li&gt;
&lt;li data-end=&quot;1014&quot; data-start=&quot;991&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;대용량, 복잡한 데이터도 전달 가능&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G5MJs/dJMcacVIxzQ/Zd9FH8ZSnq2xx97yCmeRN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G5MJs/dJMcacVIxzQ/Zd9FH8ZSnq2xx97yCmeRN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G5MJs/dJMcacVIxzQ/Zd9FH8ZSnq2xx97yCmeRN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG5MJs%2FdJMcacVIxzQ%2FZd9FH8ZSnq2xx97yCmeRN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;255&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CMhHE/dJMcaihktPn/rk19BGJbeUBxTum0DPte4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CMhHE/dJMcaihktPn/rk19BGJbeUBxTum0DPte4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CMhHE/dJMcaihktPn/rk19BGJbeUBxTum0DPte4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCMhHE%2FdJMcaihktPn%2Frk19BGJbeUBxTum0DPte4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;461&quot; height=&quot;94&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1762333205383&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with requests.Session() as session:
    session.headers.update({
        &quot;User-Agent&quot;: &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36&quot;,
        &quot;X-Naver-Client-Id&quot;: clientId,
        &quot;X-Naver-Client-Secret&quot;: clientSecret
    })

    r = session.post(url, data=json.dumps(data))

    if r.status_code != 200:
        msg = &quot;[%d Error] %s 에러가 발생함&quot; % (r.status_code, r.reason)
        raise Exception(msg)

print(r)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp; r = session.post(url, data=json.dumps(data))&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 4. 응답 결과 1차 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차적으로 가져와진 데이터 형태는 리스트로 딕셔너리가 감싸져 있고, 또 그 안에 data 키는 또 다른 리스트와 딕셔너리로 감싸져 있음. 우리가 필요한 ratio 데이터를 가져오기 위해서는 2차원 데이터를 1차원으로 전처리를 해줘야함&lt;/p&gt;
&lt;pre id=&quot;code_1762333655926&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;r.encoding =&quot;utf-8&quot;
mydict = r.json()
mydict[&quot;results&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnOjVT/dJMcag4SYL3/woyAGGjOxUoJntfuBiRw5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnOjVT/dJMcag4SYL3/woyAGGjOxUoJntfuBiRw5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnOjVT/dJMcag4SYL3/woyAGGjOxUoJntfuBiRw5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnOjVT%2FdJMcag4SYL3%2FwoyAGGjOxUoJntfuBiRw5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;670&quot; height=&quot;360&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 5 1차 결과 재구성 (2차원 구조를 1차원 구조로 전처리)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 위의 결과가&amp;nbsp; mydict[&quot;results&quot;] 였으니, 우선 1차적으로 해당 항목의 리스트를 풀어주면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762333923522&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#mydict[&quot;results&quot;]


[{'title': 'Benz',
  'keywords': ['벤츠', 'e클래스', 's클래스', 'c클래스', '벤츠 cls'],
  'data': [{'period': '2024-11-05', 'ratio': 48.51157},
   {'period': '2024-11-06', 'ratio': 46.14799},
   {'period': '2024-11-07', 'ratio': 46.34048},
   {'period': '2024-11-08', 'ratio': 46.30019},
   {'period': '2024-11-09', 'ratio': 51.06763},
   {'period': '2024-11-10', 'ratio': 49.85003},
   {'period': '2024-11-11', 'ratio': 50.4454},
   {'period': '2024-11-12', 'ratio': 50.13653},
   {'period': '2024-11-13', 'ratio': 49.97985},
   {'period': '2024-11-14', 'ratio': 63.47643},
   {'period': '2024-11-15', 'ratio': 49.86346},
   {'period': '2024-11-16', 'ratio': 51.58243},&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762333901797&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#1차 반복문으로 풀어진 결과 즉, item 은 이런 형태

{'title': 'AUDI', 
'keywords': ['아우디', 'a6', 'e트론', 'a7', 'q5'], 
'data': [{'title': 'AUDI', 'period': '2024-11-05', 'ratio': 24.74595}, 
{'title': 'AUDI', 'period': '2024-11-06', 'ratio': 22.61515}, 
{'title': 'AUDI', 'period': '2024-11-07', 'ratio': 22.92403}, 
{'title': 'AUDI', 'period': '2024-11-08', 'ratio': 22.90165}, 
{'title': 'AUDI', 'period': '2024-11-09', 'ratio': 24.16401}, {'title': 'AUDI', 'period': '2024-11-10', 'ratio': 24.27592}, {'title': 'AUDI', 'period': '2024-11-11', 'ratio': 24.09239}, {'title': 'AUDI', 'period': '2024-11-12', 'ratio': 26.91257}, {'title': 'AUDI', 'period': '2024-11-13', 'ratio': 25.37266}, {'title': 'AUDI', 'period': '2024-11-14', 'ratio': 24.24907}, {'title': 'AUDI', 'period': '2024-11-15', 'ratio': 23.09861}, {'title': 'AUDI', 'period': '2024-11-16', 'ratio': 23.16128}, {'title': 'AUDI', 'period': '2024-11-17', 'ratio': 25.18913}, {'title': 'AUDI', 'period': '2024-11-18', 'ratio': 26.09785}, {'title': 'AUDI', 'period': '2024-11-19', 'ratio': 25.07274}, {'title': 'AUDI', 'period': '2024-11-20', 'ratio': 24.47289}, {'title': 'AUDI', 'period': '2024-11-21', 'ratio': 23.64474}, {'title': 'AUDI', 'period': '2024-11-22', 'ratio': 23.17919}, {'title': 'AUDI', 'period': '2024-11-23', 'ratio': 22.01083}, {'title': 'AUDI', 'period': '2024-11-24', 'ratio': 22.40923}, {'title': 'AUDI', 'period': '2024-11-25', 'ratio': 23.62684}, {'title': 'AUDI', 'period': '2024-11-26', 'ratio': 22.90165}, {'title': 'AUDI', 'period': '2024-11-27', 'ratio': 23.48359}, {'title': 'AUDI', 'period': '2024-11-28', 'ratio': 24.36993}, {'title': 'AUDI', 'period': '2024-11-29', 'ratio': 23.56864}, {'title': 'AUDI', 'period': '2024-11-30', 'ratio': 22.46295}, {'title': 'AUDI', 'period': '2024-12-01', 'ratio': 23.75665}, {'title': 'AUDI', 'period': '2024-12-02', 'ratio': 23.30005}, {'title': 'AUDI', 'period': '2024-12-03', 'ratio': 21.97502}, {'title': 'AUDI', 'period': '2024-12-04', 'ratio': 19.45924}, {'title': 'AUDI', 'period': '2024-12-05', 'ratio': 21.84072}, {'title': 'AUDI', 'period': '2024-12-06', 'ratio': 21.02153}, {'title': 'AUDI', 'period': '2024-12-07', 'ratio': 20.69474}, {'title': 'AUDI', 'period': '2024-12-08', 'ratio': 21.05286}, {'title': 'AUDI', 'period': '2024-12-09', 'ratio': 21.59899}, {'title': 'AUDI', 'period': '2024-12-10', 'ratio': 20.89619}, {'title': 'AUDI', 'period': '2024-12-11', 'ratio': 22.16303}, {'title': 'AUDI', 'period': '2024-12-12', 'ratio': 23.60893}, {'title': 'AUDI', 'period': '2024-12-13', 'ratio': 25.23389}, {'title': 'AUDI', 'period': '2024-12-14', 'ratio': 23.53731}, {'title': 'AUDI', 'period': '2024-12-15', 'ratio': 24.52213}, {'title': 'AUDI', 'period': '2024-12-16', 'ratio': 26.68427}, {'title': 'AUDI', 'period': '2024-12-17', 'ratio': 24.31174}, {'title': 'AUDI', 'period': '2024-12-18', 'ratio': 25.24284}, {'title': 'AUDI', 'period': '2024-12-19', 'ratio': 25.6323}, {'title': 'AUDI', 'period': '2024-12-20', 'ratio': 24.17297}, {'title': 'AUDI', 'period': '2024-12-21', 'ratio': 23.17471}, {'title': 'AUDI', 'period': '2024-12-22', 'ratio': 23.77904}, {'title': 'AUDI', 'period': '2024-12-23', 'ratio': 23.37615}, {'title': 'AUDI', 'period': '2024-12-24', 'ratio': 23.55969}, {'title': 'AUDI', 'period': '2024-12-25', 'ratio': 24.18192}, {'title': 'AUDI', 'period': '2024-12-26', 'ratio': 23.65817}, {'title': 'AUDI', 'period': '2024-12-27', 'ratio': 22.26599}, {'title': 'AUDI', 'period': '2024-12-28', 'ratio': 22.97327}, {'title': 'AUDI', 'period': '2024-12-29', 'ratio': 22.23913}, {'title': 'AUDI', 'period': '2024-12-30', 'ratio': 26.38435}, {'title': 'AUDI', 'period': '2024-12-31', 'ratio': 24.90711}, {'title': 'AUDI', 'period': '2025-01-01', 'ratio': 24.39231}, {'title': 'AUDI', 'period': '2025-01-02', 'ratio': 23.29558}, {'title': 'AUDI', 'period': '2025-01-03', 'ratio': 22.57039}, {'title': 'AUDI', 'period': '2025-01-04', 'ratio': 22.0153}, {'title': 'AUDI', 'period': '2025-01-05', 'ratio': 21.56766}, {'title': 'AUDI', 'period': '2025-01-06', 'ratio': 22.44057}, {'title': 'AUDI', 'period': '2025-01-07', 'ratio': 23.02251}, {'title': 'AUDI', 'period': '2025-01-08', 'ratio': 21.1782}, {'title': 'AUDI', 'period': '2025-01-09', 'ratio': 21.2364}, {'title': 'AUDI', 'period': '2025-01-10', 'ratio': 21.66614}, {'title': 'AUDI', 'period': '2025-01-11', 'ratio': 21.9392}, {'title': 'AUDI', 'period': '2025-01-12', 'ratio': 23.39854}, {'title': 'AUDI', 'period': '2025-01-13', 'ratio': 25.94565}, {'title': 'AUDI', 'period': '2025-01-14', 'ratio': 25.87403}, {'title': 'AUDI', 'period': '2025-01-15', 'ratio': 24.06553}, {'title': 'AUDI', 'period': '2025-01-16', 'ratio': 24.07001}, {'title': 'AUDI', 'period': '2025-01-17', 'ratio': 22.39133}, {'title': 'AUDI', 'period': '2025-01-18', 'ratio': 23.40749}, {'title': 'AUDI', 'period': '2025-01-19', 'ratio': 23.16576}, {'title': 'AUDI', 'period': '2025-01-20', 'ratio': 23.52388}, {'title': 'AUDI', 'period': '2025-01-21', 'ratio': 23.09861}, {'title': 'AUDI', 'period': '2025-01-22', 'ratio': 24.52661}, {'title': 'AUDI', 'period': '2025-01-23', 'ratio': 24.44155}, {'title': 'AUDI', 'period': '2025-01-24', 'ratio': 22.75392}, {'title': 'AUDI', 'period': '2025-01-25', 'ratio': 22.11379}, {'title': 'AUDI', 'period': '2025-01-26', 'ratio': 26.09337}, {'title': 'AUDI', 'period': '2025-01-27', 'ratio': 24.51765}, {'title': 'AUDI', 'period': '2025-01-28', 'ratio': 23.51492}, {'title': 'AUDI', 'period': '2025-01-29', 'ratio': 25.90089}, {'title': 'AUDI', 'period': '2025-01-30', 'ratio': 25.99937}, {'title': 'AUDI', 'period': '2025-01-31', 'ratio': 25.56963}, {'title': 'AUDI', 'period': '2025-02-01', 'ratio': 26.49626}, {'title': 'AUDI', 'period': '2025-02-02', 'ratio': 24.96083}, {'title': 'AUDI', 'period': '2025-02-03', 'ratio': 23.5194}, {'title': 'AUDI', 'period': '2025-02-04', 'ratio': 22.53458}, {'title': 'AUDI', 'period': '2025-02-05', 'ratio': 22.18989}, {'title': 'AUDI', 'period': '2025-02-06', 'ratio': 22.02873}, {'title': 'AUDI', 'period': '2025-02-07', 'ratio': 22.70021}, {'title': 'AUDI', 'period': '2025-02-08', 'ratio': 21.77805}, {'title': 'AUDI', 'period': '2025-02-09', 'ratio': 22.61515}, {'title': 'AUDI', 'period': '2025-02-10', 'ratio': 24.13715}, {'title': 'AUDI', 'period': '2025-02-11', 'ratio': 22.90165}, {'title': 'AUDI', 'period': '2025-02-12', 'ratio': 23.38958}, {'title': 'AUDI', 'period': '2025-02-13', 'ratio': 24.24011}, {'title': 'AUDI', 'period': '2025-02-14', 'ratio': 23.33139}, {'title': 'AUDI', 'period': '2025-02-15', 'ratio': 26.64846}, {'title': 'AUDI', 'period': '2025-02-16', 'ratio': 30.67281}, {'title': 'AUDI', 'period': '2025-02-17', 'ratio': 26.31272}, {'title': 'AUDI', 'period': '2025-02-18', 'ratio': 28.48829}, {'title': 'AUDI', 'period': '2025-02-19', 'ratio': 27.61538}, {'title': 'AUDI', 'period': '2025-02-20', 'ratio': 25.58306}, {'title': 'AUDI', 'period': '2025-02-21', 'ratio': 26.0889}, {'title': 'AUDI', 'period': '2025-02-22', 'ratio': 25.52486}, {'title': 'AUDI', 'period': '2025-02-23', 'ratio': 24.76386}, {'title': 'AUDI', 'period': '2025-02-24', 'ratio': 24.39679}, {'title': 'AUDI', 'period': '2025-02-25', 'ratio': 25.7084}, {'title': 'AUDI', 'period': '2025-02-26', 'ratio': 23.73427}, {'title': 'AUDI', 'period': '2025-02-27', 'ratio': 24.4147}, {'title': 'AUDI', 'period': '2025-02-28', 'ratio': 25.24732}, {'title': 'AUDI', 'period': '2025-03-01', 'ratio': 24.92054}, {'title': 'AUDI', 'period': '2025-03-02', 'ratio': 25.09512}, {'title': 'AUDI', 'period': '2025-03-03', 'ratio': 23.00908}, {'title': 'AUDI', 'period': '2025-03-04', 'ratio': 23.66712}, {'title': 'AUDI', 'period': '2025-03-05', 'ratio': 25.21598}, {'title': 'AUDI', 'period': '2025-03-06', 'ratio': 28.27342}, {'title': 'AUDI', 'period': '2025-03-07', 'ratio': 24.69224}, {'title': 'AUDI', 'period': '2025-03-08', 'ratio': 27.90635}, {'title': 'AUDI', 'period': '2025-03-09', 'ratio': 25.8606}, {'title': 'AUDI', 'period': '2025-03-10', 'ratio': 25.16227}, {'title': 'AUDI', 'period': '2025-03-11', 'ratio': 23.16576}, {'title': 'AUDI', 'period': '2025-03-12', 'ratio': 24.32517}, {'title': 'AUDI', 'period': '2025-03-13', 'ratio': 23.00013}, {'title': 'AUDI', 'period': '2025-03-14', 'ratio': 21.68852}, {'title': 'AUDI', 'period': '2025-03-15', 'ratio': 23.47911}, {'title': 'AUDI', 'period': '2025-03-16', 'ratio': 25.63677}, {'title': 'AUDI', 'period': '2025-03-17', 'ratio': 24.47289}, {'title': 'AUDI', 'period': '2025-03-18', 'ratio': 25.78002}, {'title': 'AUDI', 'period': '2025-03-19', 'ratio': 23.48359}, {'title': 'AUDI', 'period': '2025-03-20', 'ratio': 24.82653}, {'title': 'AUDI', 'period': '2025-03-21', 'ratio': 27.16773}, {'title': 'AUDI', 'period': '2025-03-22', 'ratio': 26.36196}, {'title': 'AUDI', 'period': '2025-03-23', 'ratio': 26.32615}, {'title': 'AUDI', 'period': '2025-03-24', 'ratio': 23.77456}, {'title': 'AUDI', 'period': '2025-03-25', 'ratio': 23.27319}, {'title': 'AUDI', 'period': '2025-03-26', 'ratio': 22.74049}, {'title': 'AUDI', 'period': '2025-03-27', 'ratio': 23.09414}, {'title': 'AUDI', 'period': '2025-03-28', 'ratio': 33.43927}, {'title': 'AUDI', 'period': '2025-03-29', 'ratio': 25.15779}, {'title': 'AUDI', 'period': '2025-03-30', 'ratio': 23.64027}, {'title': 'AUDI', 'period': '2025-03-31', 'ratio': 22.82107}, {'title': 'AUDI', 'period': '2025-04-01', 'ratio': 21.8631}, {'title': 'AUDI', 'period': '2025-04-02', 'ratio': 23.16128}, {'title': 'AUDI', 'period': '2025-04-03', 'ratio': 22.99118}, {'title': 'AUDI', 'period': '2025-04-04', 'ratio': 21.88996}, {'title': 'AUDI', 'period': '2025-04-05', 'ratio': 23.89542}, {'title': 'AUDI', 'period': '2025-04-06', 'ratio': 21.59004}, {'title': 'AUDI', 'period': '2025-04-07', 'ratio': 22.08245}, {'title': 'AUDI', 'period': '2025-04-08', 'ratio': 22.44505}, {'title': 'AUDI', 'period': '2025-04-09', 'ratio': 24.06105}, {'title': 'AUDI', 'period': '2025-04-10', 'ratio': 22.82107}, {'title': 'AUDI', 'period': '2025-04-11', 'ratio': 21.96606}, {'title': 'AUDI', 'period': '2025-04-12', 'ratio': 23.17471}, {'title': 'AUDI', 'period': '2025-04-13', 'ratio': 23.49254}, {'title': 'AUDI', 'period': '2025-04-14', 'ratio': 25.43533}, {'title': 'AUDI', 'period': '2025-04-15', 'ratio': 26.58131}, {'title': 'AUDI', 'period': '2025-04-16', 'ratio': 26.15604}, {'title': 'AUDI', 'period': '2025-04-17', 'ratio': 27.93321}, {'title': 'AUDI', 'period': '2025-04-18', 'ratio': 27.33783}, {'title': 'AUDI', 'period': '2025-04-19', 'ratio': 25.00559}, {'title': 'AUDI', 'period': '2025-04-20', 'ratio': 24.24011}, {'title': 'AUDI', 'period': '2025-04-21', 'ratio': 26.12471}, {'title': 'AUDI', 'period': '2025-04-22', 'ratio': 25.16674}, {'title': 'AUDI', 'period': '2025-04-23', 'ratio': 24.24459}, {'title': 'AUDI', 'period': '2025-04-24', 'ratio': 23.03594}, {'title': 'AUDI', 'period': '2025-04-25', 'ratio': 22.63753}, {'title': 'AUDI', 'period': '2025-04-26', 'ratio': 20.96333}, {'title': 'AUDI', 'period': '2025-04-27', 'ratio': 21.38412}, {'title': 'AUDI', 'period': '2025-04-28', 'ratio': 20.86933}, {'title': 'AUDI', 'period': '2025-04-29', 'ratio': 22.66887}, {'title': 'AUDI', 'period': '2025-04-30', 'ratio': 24.05658}, {'title': 'AUDI', 'period': '2025-05-01', 'ratio': 27.06029}, {'title': 'AUDI', 'period': '2025-05-02', 'ratio': 25.58306}, {'title': 'AUDI', 'period': '2025-05-03', 'ratio': 25.30551}, {'title': 'AUDI', 'period': '2025-05-04', 'ratio': 23.882}, {'title': 'AUDI', 'period': '2025-05-05', 'ratio': 25.95908}, {'title': 'AUDI', 'period': '2025-05-06', 'ratio': 25.6323}, {'title': 'AUDI', 'period': '2025-05-07', 'ratio': 27.9153}, {'title': 'AUDI', 'period': '2025-05-08', 'ratio': 27.41841}, {'title': 'AUDI', 'period': '2025-05-09', 'ratio': 26.36196}, {'title': 'AUDI', 'period': '2025-05-10', 'ratio': 27.11849}, {'title': 'AUDI', 'period': '2025-05-11', 'ratio': 26.90362}, {'title': 'AUDI', 'period': '2025-05-12', 'ratio': 28.45248}, {'title': 'AUDI', 'period': '2025-05-13', 'ratio': 28.7345}, {'title': 'AUDI', 'period': '2025-05-14', 'ratio': 28.01378}, {'title': 'AUDI', 'period': '2025-05-15', 'ratio': 26.79618}, {'title': 'AUDI', 'period': '2025-05-16', 'ratio': 25.57858}, {'title': 'AUDI', 'period': '2025-05-17', 'ratio': 25.41743}, {'title': 'AUDI', 'period': '2025-05-18', 'ratio': 25.82031}, {'title': 'AUDI', 'period': '2025-05-19', 'ratio': 26.07994}, {'title': 'AUDI', 'period': '2025-05-20', 'ratio': 26.51864}, {'title': 'AUDI', 'period': '2025-05-21', 'ratio': 27.86606}, {'title': 'AUDI', 'period': '2025-05-22', 'ratio': 27.65566}, {'title': 'AUDI', 'period': '2025-05-23', 'ratio': 26.0307}, {'title': 'AUDI', 'period': '2025-05-24', 'ratio': 26.49626}, {'title': 'AUDI', 'period': '2025-05-25', 'ratio': 25.02797}, {'title': 'AUDI', 'period': '2025-05-26', 'ratio': 28.94489}, {'title': 'AUDI', 'period': '2025-05-27', 'ratio': 27.02448}, {'title': 'AUDI', 'period': '2025-05-28', 'ratio': 24.23564}, {'title': 'AUDI', 'period': '2025-05-29', 'ratio': 24.67881}, {'title': 'AUDI', 'period': '2025-05-30', 'ratio': 24.08791}, {'title': 'AUDI', 'period': '2025-05-31', 'ratio': 23.85066}, {'title': 'AUDI', 'period': '2025-06-01', 'ratio': 24.90711}, {'title': 'AUDI', 'period': '2025-06-02', 'ratio': 25.76212}, {'title': 'AUDI', 'period': '2025-06-03', 'ratio': 22.83898}, {'title': 'AUDI', 'period': '2025-06-04', 'ratio': 22.61515}, {'title': 'AUDI', 'period': '2025-06-05', 'ratio': 24.98321}, {'title': 'AUDI', 'period': '2025-06-06', 'ratio': 22.40476}, {'title': 'AUDI', 'period': '2025-06-07', 'ratio': 24.29383}, {'title': 'AUDI', 'period': '2025-06-08', 'ratio': 24.36993}, {'title': 'AUDI', 'period': '2025-06-09', 'ratio': 24.73253}, {'title': 'AUDI', 'period': '2025-06-10', 'ratio': 24.01181}, {'title': 'AUDI', 'period': '2025-06-11', 'ratio': 23.58655}, {'title': 'AUDI', 'period': '2025-06-12', 'ratio': 25.28313}, {'title': 'AUDI', 'period': '2025-06-13', 'ratio': 24.9474}, {'title': 'AUDI', 'period': '2025-06-14', 'ratio': 23.83275}, {'title': 'AUDI', 'period': '2025-06-15', 'ratio': 26.6977}, {'title': 'AUDI', 'period': '2025-06-16', 'ratio': 25.05931}, {'title': 'AUDI', 'period': '2025-06-17', 'ratio': 25.04588}, {'title': 'AUDI', 'period': '2025-06-18', 'ratio': 25.95013}, {'title': 'AUDI', 'period': '2025-06-19', 'ratio': 25.54277}, {'title': 'AUDI', 'period': '2025-06-20', 'ratio': 25.03245}, {'title': 'AUDI', 'period': '2025-06-21', 'ratio': 25.91879}, {'title': 'AUDI', 'period': '2025-06-22', 'ratio': 24.95187}, {'title': 'AUDI', 'period': '2025-06-23', 'ratio': 24.63404}, {'title': 'AUDI', 'period': '2025-06-24', 'ratio': 26.09337}, {'title': 'AUDI', 'period': '2025-06-25', 'ratio': 25.74421}, {'title': 'AUDI', 'period': '2025-06-26', 'ratio': 24.77729}, {'title': 'AUDI', 'period': '2025-06-27', 'ratio': 24.17744}, {'title': 'AUDI', 'period': '2025-06-28', 'ratio': 22.94641}, {'title': 'AUDI', 'period': '2025-06-29', 'ratio': 23.35825}, {'title': 'AUDI', 'period': '2025-06-30', 'ratio': 23.73875}, {'title': 'AUDI', 'period': '2025-07-01', 'ratio': 29.59398}, {'title': 'AUDI', 'period': '2025-07-02', 'ratio': 28.97622}, {'title': 'AUDI', 'period': '2025-07-03', 'ratio': 27.94664}, {'title': 'AUDI', 'period': '2025-07-04', 'ratio': 28.97175}, {'title': 'AUDI', 'period': '2025-07-05', 'ratio': 27.37365}, {'title': 'AUDI', 'period': '2025-07-06', 'ratio': 31.71135}, {'title': 'AUDI', 'period': '2025-07-07', 'ratio': 28.04959}, {'title': 'AUDI', 'period': '2025-07-08', 'ratio': 29.75513}, {'title': 'AUDI', 'period': '2025-07-09', 'ratio': 27.50346}, {'title': 'AUDI', 'period': '2025-07-10', 'ratio': 26.42016}, {'title': 'AUDI', 'period': '2025-07-11', 'ratio': 26.0889}, {'title': 'AUDI', 'period': '2025-07-12', 'ratio': 28.9628}, {'title': 'AUDI', 'period': '2025-07-13', 'ratio': 29.93419}, {'title': 'AUDI', 'period': '2025-07-14', 'ratio': 28.45248}, {'title': 'AUDI', 'period': '2025-07-15', 'ratio': 26.60369}, {'title': 'AUDI', 'period': '2025-07-16', 'ratio': 26.65293}, {'title': 'AUDI', 'period': '2025-07-17', 'ratio': 26.58579}, {'title': 'AUDI', 'period': '2025-07-18', 'ratio': 28.35847}, {'title': 'AUDI', 'period': '2025-07-19', 'ratio': 28.47038}, {'title': 'AUDI', 'period': '2025-07-20', 'ratio': 27.31993}, {'title': 'AUDI', 'period': '2025-07-21', 'ratio': 27.59299}, {'title': 'AUDI', 'period': '2025-07-22', 'ratio': 26.26796}, {'title': 'AUDI', 'period': '2025-07-23', 'ratio': 26.4873}, {'title': 'AUDI', 'period': '2025-07-24', 'ratio': 26.87228}, {'title': 'AUDI', 'period': '2025-07-25', 'ratio': 28.43009}, {'title': 'AUDI', 'period': '2025-07-26', 'ratio': 28.75688}, {'title': 'AUDI', 'period': '2025-07-27', 'ratio': 28.50172}, {'title': 'AUDI', 'period': '2025-07-28', 'ratio': 27.46765}, {'title': 'AUDI', 'period': '2025-07-29', 'ratio': 28.49724}, {'title': 'AUDI', 'period': '2025-07-30', 'ratio': 28.42114}, {'title': 'AUDI', 'period': '2025-07-31', 'ratio': 25.09512}, {'title': 'AUDI', 'period': '2025-08-01', 'ratio': 25.72183}, {'title': 'AUDI', 'period': '2025-08-02', 'ratio': 27.06925}, {'title': 'AUDI', 'period': '2025-08-03', 'ratio': 25.39504}, {'title': 'AUDI', 'period': '2025-08-04', 'ratio': 28.33609}, {'title': 'AUDI', 'period': '2025-08-05', 'ratio': 28.91355}, {'title': 'AUDI', 'period': '2025-08-06', 'ratio': 28.69421}, {'title': 'AUDI', 'period': '2025-08-07', 'ratio': 29.63874}, {'title': 'AUDI', 'period': '2025-08-08', 'ratio': 27.90635}, {'title': 'AUDI', 'period': '2025-08-09', 'ratio': 27.51689}, {'title': 'AUDI', 'period': '2025-08-10', 'ratio': 27.65119}, {'title': 'AUDI', 'period': '2025-08-11', 'ratio': 27.76758}, {'title': 'AUDI', 'period': '2025-08-12', 'ratio': 33.48851}, {'title': 'AUDI', 'period': '2025-08-13', 'ratio': 36.63548}, {'title': 'AUDI', 'period': '2025-08-14', 'ratio': 32.42311}, {'title': 'AUDI', 'period': '2025-08-15', 'ratio': 29.66113}, {'title': 'AUDI', 'period': '2025-08-16', 'ratio': 29.59398}, {'title': 'AUDI', 'period': '2025-08-17', 'ratio': 28.05407}, {'title': 'AUDI', 'period': '2025-08-18', 'ratio': 29.29853}, {'title': 'AUDI', 'period': '2025-08-19', 'ratio': 29.49102}, {'title': 'AUDI', 'period': '2025-08-20', 'ratio': 29.2851}, {'title': 'AUDI', 'period': '2025-08-21', 'ratio': 30.72653}, {'title': 'AUDI', 'period': '2025-08-22', 'ratio': 29.39254}, {'title': 'AUDI', 'period': '2025-08-23', 'ratio': 28.46143}, {'title': 'AUDI', 'period': '2025-08-24', 'ratio': 29.43283}, {'title': 'AUDI', 'period': '2025-08-25', 'ratio': 30.82053}, {'title': 'AUDI', 'period': '2025-08-26', 'ratio': 30.37289}, {'title': 'AUDI', 'period': '2025-08-27', 'ratio': 31.34876}, {'title': 'AUDI', 'period': '2025-08-28', 'ratio': 29.19557}, {'title': 'AUDI', 'period': '2025-08-29', 'ratio': 27.29755}, {'title': 'AUDI', 'period': '2025-08-30', 'ratio': 26.85885}, {'title': 'AUDI', 'period': '2025-08-31', 'ratio': 26.4112}, {'title': 'AUDI', 'period': '2025-09-01', 'ratio': 26.34406}, {'title': 'AUDI', 'period': '2025-09-02', 'ratio': 28.09436}, {'title': 'AUDI', 'period': '2025-09-03', 'ratio': 30.09534}, {'title': 'AUDI', 'period': '2025-09-04', 'ratio': 28.63154}, {'title': 'AUDI', 'period': '2025-09-05', 'ratio': 25.98594}, {'title': 'AUDI', 'period': '2025-09-06', 'ratio': 26.61712}, {'title': 'AUDI', 'period': '2025-09-07', 'ratio': 26.60817}, {'title': 'AUDI', 'period': '2025-09-08', 'ratio': 26.89019}, {'title': 'AUDI', 'period': '2025-09-09', 'ratio': 26.57236}, {'title': 'AUDI', 'period': '2025-09-10', 'ratio': 24.92949}, {'title': 'AUDI', 'period': '2025-09-11', 'ratio': 26.8678}, {'title': 'AUDI', 'period': '2025-09-12', 'ratio': 26.36196}, {'title': 'AUDI', 'period': '2025-09-13', 'ratio': 25.39504}, {'title': 'AUDI', 'period': '2025-09-14', 'ratio': 27.04239}, {'title': 'AUDI', 'period': '2025-09-15', 'ratio': 25.81583}, {'title': 'AUDI', 'period': '2025-09-16', 'ratio': 24.99664}, {'title': 'AUDI', 'period': '2025-09-17', 'ratio': 25.01007}, {'title': 'AUDI', 'period': '2025-09-18', 'ratio': 23.98495}, {'title': 'AUDI', 'period': '2025-09-19', 'ratio': 24.2804}, {'title': 'AUDI', 'period': '2025-09-20', 'ratio': 26.91705}, {'title': 'AUDI', 'period': '2025-09-21', 'ratio': 26.42016}, {'title': 'AUDI', 'period': '2025-09-22', 'ratio': 25.2697}, {'title': 'AUDI', 'period': '2025-09-23', 'ratio': 23.5955}, {'title': 'AUDI', 'period': '2025-09-24', 'ratio': 22.49429}, {'title': 'AUDI', 'period': '2025-09-25', 'ratio': 23.25529}, {'title': 'AUDI', 'period': '2025-09-26', 'ratio': 22.46295}, {'title': 'AUDI', 'period': '2025-09-27', 'ratio': 22.35104}, {'title': 'AUDI', 'period': '2025-09-28', 'ratio': 23.02699}, {'title': 'AUDI', 'period': '2025-09-29', 'ratio': 22.91508}, {'title': 'AUDI', 'period': '2025-09-30', 'ratio': 22.20332}, {'title': 'AUDI', 'period': '2025-10-01', 'ratio': 22.78973}, {'title': 'AUDI', 'period': '2025-10-02', 'ratio': 22.24808}, {'title': 'AUDI', 'period': '2025-10-03', 'ratio': 23.10309}, {'title': 'AUDI', 'period': '2025-10-04', 'ratio': 23.0628}, {'title': 'AUDI', 'period': '2025-10-05', 'ratio': 23.10309}, {'title': 'AUDI', 'period': '2025-10-06', 'ratio': 26.86333}, {'title': 'AUDI', 'period': '2025-10-07', 'ratio': 24.80863}, {'title': 'AUDI', 'period': '2025-10-08', 'ratio': 25.50248}, {'title': 'AUDI', 'period': '2025-10-09', 'ratio': 26.30377}, {'title': 'AUDI', 'period': '2025-10-10', 'ratio': 25.65916}, {'title': 'AUDI', 'period': '2025-10-11', 'ratio': 23.71189}, {'title': 'AUDI', 'period': '2025-10-12', 'ratio': 24.31174}, {'title': 'AUDI', 'period': '2025-10-13', 'ratio': 23.54626}, {'title': 'AUDI', 'period': '2025-10-14', 'ratio': 23.18366}, {'title': 'AUDI', 'period': '2025-10-15', 'ratio': 22.2257}, {'title': 'AUDI', 'period': '2025-10-16', 'ratio': 22.11826}, {'title': 'AUDI', 'period': '2025-10-17', 'ratio': 21.98397}, {'title': 'AUDI', 'period': '2025-10-18', 'ratio': 22.35104}, {'title': 'AUDI', 'period': '2025-10-19', 'ratio': 22.05559}, {'title': 'AUDI', 'period': '2025-10-20', 'ratio': 22.48533}, {'title': 'AUDI', 'period': '2025-10-21', 'ratio': 22.06455}, {'title': 'AUDI', 'period': '2025-10-22', 'ratio': 21.03048}, {'title': 'AUDI', 'period': '2025-10-23', 'ratio': 21.91235}, {'title': 'AUDI', 'period': '2025-10-24', 'ratio': 22.13169}, {'title': 'AUDI', 'period': '2025-10-25', 'ratio': 21.41993}, {'title': 'AUDI', 'period': '2025-10-26', 'ratio': 22.3779}, {'title': 'AUDI', 'period': '2025-10-27', 'ratio': 21.95263}, {'title': 'AUDI', 'period': '2025-10-28', 'ratio': 22.06455}, {'title': 'AUDI', 'period': '2025-10-29', 'ratio': 21.46917}, {'title': 'AUDI', 'period': '2025-10-30', 'ratio': 21.81834}, {'title': 'AUDI', 'period': '2025-10-31', 'ratio': 21.51842}, {'title': 'AUDI', 'period': '2025-11-01', 'ratio': 20.73056}, {'title': 'AUDI', 'period': '2025-11-02', 'ratio': 20.69922}, {'title': 'AUDI', 'period': '2025-11-03', 'ratio': 20.64103},&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 우리가 필요한 데이터인 ratio 에 접근하기 위해서 data key 에 enumerate 로 접근한다&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 위에서 title 이란 변수에 각 키워드 이름을 넣어준 상태이니,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;period 와 ratio 만 각 딕셔너리에서 키값으로 접근을 해주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비워져있는 resultset 리스트에 해당 행을 하나씩 extend 해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0 번쨰 {'title': 'AUDI', 'period': '2024-11-05', 'ratio': 24.74595},&amp;nbsp; &lt;br /&gt;1 번쨰 {'title': 'AUDI', 'period': '2024-11-06', 'ratio': 22.61515},&amp;nbsp; &lt;br /&gt;2 번쨰 {'title': 'AUDI', 'period': '2024-11-07', 'ratio': 22.92403},&amp;nbsp; &lt;br /&gt;3 번째{'title': 'AUDI', 'period': '2024-11-08', 'ratio': 22.90165}, ....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;최종 입력 코드&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762333782338&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;resultset = []

for item in mydict[&quot;results&quot;]:
    title = item[&quot;title&quot;]
    data = item[&quot;data&quot;]

    for i, v in enumerate(data):
        new_data = {&quot;title&quot;: title, &quot;period&quot;: v[&quot;period&quot;], &quot;ratio&quot;: v[&quot;ratio&quot;]}
        data[i] = new_data

    resultset.extend(data)

resultset&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 6 최종 데이터 세트를 데이터 프레임으로 변환&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 과정을 걸쳐 2차원 데이터를 1차원으로 풀어서 한줄씩 넣어준 항목&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 title(키워드 이름) period ratio 을 데이터 프레임으로 생성해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762334226828&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df = DataFrame(resultset)
df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxLsE/dJMcabCvsUE/Sd3C5eXlyW8KgkHKOZHOH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxLsE/dJMcabCvsUE/Sd3C5eXlyW8KgkHKOZHOH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxLsE/dJMcabCvsUE/Sd3C5eXlyW8KgkHKOZHOH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxLsE%2FdJMcabCvsUE%2FSd3C5eXlyW8KgkHKOZHOH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;746&quot; height=&quot;411&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>빅데이터 국비 교육</category>
      <author>datahaseo</author>
      <guid isPermaLink="true">https://datahaseo.tistory.com/56</guid>
      <comments>https://datahaseo.tistory.com/56#entry56comment</comments>
      <pubDate>Wed, 5 Nov 2025 17:46:41 +0900</pubDate>
    </item>
    <item>
      <title>[아이티윌 빅데이터 52기] LAB 12 | 웹 데이터 수집하기 | 카카오 개발자 API | 책 검색 결과 수집 2 | 반복문으로 전체 데이터/표지 이미지 가져오기</title>
      <link>https://datahaseo.tistory.com/55</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;[아이티윌&amp;nbsp;빅데이터&amp;nbsp;52기]&amp;nbsp;LAB&amp;nbsp;12&amp;nbsp;|&amp;nbsp;웹&amp;nbsp;데이터&amp;nbsp;수집하기&amp;nbsp;|&amp;nbsp;카카오&amp;nbsp;검색&amp;nbsp;결과&amp;nbsp;수집&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;카카오의 도서 검색 결과를 모두 가져오기 위해서는 어떻게 해야할까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청 url 에서 page 파라미터를 통해 도서 검색 결과 페이지의 쪽수를 컨트롤 할 수있었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값들을 최대치인 50까지 모두 다 가져오기 위해서 반복문을 결합해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;STEP 1. 라이브러리 참조하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;STEP 2. 요청 정보 확인&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;STEP 3. 웹 데이터 요청하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;STEP 4. 데이터 저장하기&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 1. 라이브러리 참조하기&lt;/h4&gt;
&lt;pre id=&quot;code_1762323038721&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
from pandas import DataFrame&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 2. 요청 정보 확인&lt;/h4&gt;
&lt;pre id=&quot;code_1762323043587&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#요청 URL
url =&quot;https://dapi.kakao.com/v3/search/book&quot;


#QueryString 요청 변수
query =&quot;파이썬&quot;
page =1
size =50


#header 에 포함할 키
key = &quot;ba2b91a53d05dab15c540eff6f1c5565&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 3. 웹 데이터 요청하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;page&amp;nbsp;값을&amp;nbsp;전달하는&amp;nbsp;파라미터&amp;nbsp;부분에&amp;nbsp;반복문으로&amp;nbsp;1-&amp;nbsp;50&amp;nbsp;까지&amp;nbsp;i&amp;nbsp;를&amp;nbsp;전환시키고, &lt;br /&gt;이떄&amp;nbsp;오류가&amp;nbsp;발생하더라도&amp;nbsp;중단되지&amp;nbsp;않도록&amp;nbsp;continue&amp;nbsp;예외&amp;nbsp;처리를&amp;nbsp;걸어준다. &lt;br /&gt;만약&amp;nbsp;웹&amp;nbsp;통신이&amp;nbsp;정상적으로&amp;nbsp;200&amp;nbsp;처리가&amp;nbsp;되었다면,&amp;nbsp;생성해둔&amp;nbsp;비워진&amp;nbsp;리스트&amp;nbsp;resultset&amp;nbsp;에&amp;nbsp;결과&amp;nbsp;mydict&amp;nbsp;을&amp;nbsp;extend&amp;nbsp;해서&amp;nbsp;이어&amp;nbsp;붙이고,&amp;nbsp;이&amp;nbsp;작업을&amp;nbsp;반복한다&lt;/p&gt;
&lt;pre id=&quot;code_1762323051425&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#요청 결과를 저장하기 위한 리스트
resultset =[]


with requests.Session() as session:
  session.headers.update({
    &quot;User-Agent&quot;:&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36&quot;,
    &quot;Authorization&quot; : &quot;KakaoAK %s&quot; %key
                                             
                          })
  
for i in range(1,51):
  r=session.get(url,params={&quot;query&quot;:query,&quot;page&quot;:i,&quot;size&quot;:size})    #반복문을 통해 i 가 1-50으로 바뀐다
  
  if r.status_code !=200:
    msg =&quot;[%d Error] %s 에러가 발생함&quot; % (r.status_code,r.reason)
    # 기존에는 HTTP 상태값이 200이 아니면 강제로 에러를 발생시켜 코드를 중단시켰지만 &amp;gt;&amp;gt; raise Exception (msg)  
    print(msg)
    continue    # 이제는 에러가 발생해도 메세지 로그는 남기지만 건너뛰고 계속 진행


  print(&quot;%d page 데이터 수신 완료 &amp;gt;&amp;gt; %s&quot; % (i,r))

  r.encoding =&quot;utf-8&quot;
  mydict = r.json()
  resultset.extend(mydict['documents'])


print(&quot;총 %d 건의 데이터가 수집되었습니다&quot; % len(resultset))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mwvoe/dJMcadG5DFP/BxLC00HhrTqjxRnJhVInTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mwvoe/dJMcadG5DFP/BxLC00HhrTqjxRnJhVInTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mwvoe/dJMcadG5DFP/BxLC00HhrTqjxRnJhVInTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmwvoe%2FdJMcadG5DFP%2FBxLC00HhrTqjxRnJhVInTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;763&quot; height=&quot;330&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 4. 데이터 저장하기&lt;/h4&gt;
&lt;pre id=&quot;code_1762323059135&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df = DataFrame(resultset)
df.to_excel(&quot;카카오 책 검색(%s) - 전체 데이터 .xlsx&quot; % query)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daW5kY/dJMb995LbN8/DRxhxz3G57WdhUNINti991/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daW5kY/dJMb995LbN8/DRxhxz3G57WdhUNINti991/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daW5kY/dJMb995LbN8/DRxhxz3G57WdhUNINti991/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaW5kY%2FdJMb995LbN8%2FDRxhxz3G57WdhUNINti991%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;879&quot; height=&quot;602&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 표지 이미지들을 다운받아보자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수집된 데이터 중 임의의 한 건을 확인해보면, thumnail 이라는 key 에 책 표지 이미지가 맵핑되어 있다&lt;/p&gt;
&lt;pre id=&quot;code_1762328676134&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#수집된 데이터 중 임의의 한 건을 확인해보면, thumnail 이라는 key 에 책 표지 이미지가 멥핑되어 있다
print(resultset[0])&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1762328729122&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{'authors': ['박응용'], 'contents': '개정 2판으로 새롭게 태어났다!
챗GPT를 시작으로 펼쳐진 생성 AI 시대에 맞춰 설명과 예제를 다듬고, 
최신 경향과 심화 내용을 보충했다. 또한 이번 개정 2판도 50만 코딩 
유튜버인 조코딩과 협업을 통해 유튜브 동영상을 제공해 파이썬을 더 쉽게 
공부할 수 있다.  8년 연속 베스트셀러! ',
'datetime': '2023-06-15T00:00:00.000+09:00', 
'isbn': '1163034738 9791163034735', 
'price': 22000, 'publisher': '이지스퍼블리싱', 
'sale_price': 19800, 'status': '정상판매', 
'thumbnail': 'https://search1.kakaocdn.net/thumb/R120x174.q85/?fname=http%3A%2F%2Ft1.daumcdn.net%2Flbook%2Fimage%2F6361131%3Ftimestamp%3D20250709143830', 
'title': 'Do it! 점프 투 파이썬', 'translators': [], 
'url': 'https://search.daum.net/search?w=bookpage&amp;amp;bookId=6361131&amp;amp;q=Do+it%21+%EC%A0%90%ED%94%84+%ED%88%AC+%ED%8C%8C%EC%9D%B4%EC%8D%AC'}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;파일 다운로드 함수 정의&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 url 은 url, 다운 받으려는 이미지 항목은 target&amp;nbsp; 파라미터로 받아올 함수 download 를 정의.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤더에는 open api 접근을 위한 유저 에이전트 항목 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 항목 다운로드 중 에러 발생 가능성 방지를 위해 try-except 로 감싸줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;try 구문에서는 세션 객체에 url 정보를 읽어온 정보를 r 에 담고, 이때 대용량 파일 다운로드 시 메모리 절약을 위해 데이터를 스트리밍으로 받아오는 옵션을 True 로 해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 target 으로 정의된 다운받을 항목을 바이너리(이미지) 형식으로 읽어 기록해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762328761746&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 파일 다운로드 함수 정의
def download(url,target):
  session.headers.update({
    &quot;User-Agent&quot;:&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36&quot;


  })

  try :
      r=session.get(url,stream=True)
      r.encoding = &quot;utf-8&quot;
  
      with open(target,&quot;wb&quot;) as f:
         f.write(r.raw.read())
         print(target, &quot;가 저장되었습니다&quot;)


  except Exception as e:
     print(target, &quot;저장 실패&quot;,e)


print(r)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;[동기식] 반복문을 통해 수집된 결과 내의 표지 이미지 다운로드 받기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 라이브러리 임포트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 결과 폴더 이름 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- dirname 를 통해 매번 실행될 때마다 고유한 폴더명이 생겨 이전 다운로드와 겹치지 않도록 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 폴더 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 루프 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 파일 경로 문자열 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- os.path.join()은 운영체제에 맞게 경로를 합쳐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Windows &amp;rarr; &quot;20251105-143021\\0.jpg&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 다운로드 함수 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1762328820059&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import datetime as dt


#다운로드 결과가 저장될 폴더 생성하기

dirname = dt.datetime.now().strftime(&quot;%Y%m%d-%H%M%S&quot;)
os.mkdir(dirname)


#수집 데이터 내에서 반복문 수행
for i ,v in enumerate(resultset):
  file_path = os.path.join(dirname,&quot;%d.jpg&quot; %i)


  download(v[&quot;thumbnail&quot;],file_path)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pJhjR/dJMcaeTxczH/FHt658ExZZn7k93gxoTZu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pJhjR/dJMcaeTxczH/FHt658ExZZn7k93gxoTZu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pJhjR/dJMcaeTxczH/FHt658ExZZn7k93gxoTZu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpJhjR%2FdJMcaeTxczH%2FFHt658ExZZn7k93gxoTZu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;756&quot; height=&quot;488&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;[비동기식] 파일 다운로드&lt;/h4&gt;
&lt;pre id=&quot;code_1762328978944&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#비동기 처리 기능을 제공하는 모듈
from concurrent import futures

#다운로드 결과가 저장될 폴더 생성하기
dirname = dt.datetime.now().strftime(&quot;%Y%m%d-%H%M%S&quot;)
os.mkdir(dirname)

#비동기 작업 내에서 이미지 다운로드 받기
with futures.ThreadPoolExecutor() as executor:
  #수집 데이터 내에서 반복문 수행
  for i,v in enumerate(resultset):

    #저장될 파일 경로 문자열 생성
    file_path = os.path.join(dirname,&quot;%d.jpg&quot; %i)
    #비동기 다운로드 요청
    executor.submit(download,v['thumbnail'],file_path)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx93hw/dJMcaap3XHM/mlYBaegS2Il7JJW2lTT901/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx93hw/dJMcaap3XHM/mlYBaegS2Il7JJW2lTT901/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx93hw/dJMcaap3XHM/mlYBaegS2Il7JJW2lTT901/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx93hw%2FdJMcaap3XHM%2FmlYBaegS2Il7JJW2lTT901%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;749&quot; height=&quot;387&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>빅데이터 국비 교육</category>
      <author>datahaseo</author>
      <guid isPermaLink="true">https://datahaseo.tistory.com/55</guid>
      <comments>https://datahaseo.tistory.com/55#entry55comment</comments>
      <pubDate>Wed, 5 Nov 2025 15:11:49 +0900</pubDate>
    </item>
  </channel>
</rss>