<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Project | Sieun Kim Portfolio</title><link>https://siuunni.github.io/projects/</link><atom:link href="https://siuunni.github.io/projects/index.xml" rel="self" type="application/rss+xml"/><description>Project</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>ko-kr</language><lastBuildDate>Sun, 19 May 2024 00:00:00 +0000</lastBuildDate><image><url>https://siuunni.github.io/media/icon_hu_1c0e9cb08cfb822a.png</url><title>Project</title><link>https://siuunni.github.io/projects/</link></image><item><title>배터리 전압·온도 시계열 기반 이상 셀 탐지</title><link>https://siuunni.github.io/projects/battery-anomaly-cell/</link><pubDate>Fri, 12 Dec 2025 00:00:00 +0000</pubDate><guid>https://siuunni.github.io/projects/battery-anomaly-cell/</guid><description>&lt;div style="display:grid;grid-template-columns:130px 1fr;gap:1rem 1.5rem;margin-bottom:2rem;"&gt;
&lt;div style="font-weight:700;"&gt;개요&lt;/div&gt;
&lt;div&gt;배터리팩 충전 과정의 &lt;strong&gt;전압 및 온도&lt;/strong&gt; 시계열을 함수형 데이터로 변환하고, 데이터 특성에 맞춰 FPCA와vd-FPCA로 차원을 줄인 뒤, GMM 기반 등각 예측(Conformal Prediction)으로 통계적으로 보장된 이상 탐지 기준을 설계한 프로젝트입니다.&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;연구 기간&lt;/div&gt;
&lt;div&gt;2024.05~2025.03&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;데이터&lt;/div&gt;
&lt;div&gt;KAMP 「전기차 배터리 충전 실험 데이터(품질보증)」 — 셀 176개(16 모듈 × 11 셀) 전압, 온도 측정점 32개(모듈당 2개). 학습은 정상만, 테스트는 정상,이상 혼합&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기술 스택&lt;/div&gt;
&lt;div&gt;Python,R,scikit-fda, scikit-learn,&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;성과&lt;/div&gt;
&lt;div&gt;전압·온도 이상을 &lt;strong&gt;위양성 없이 전수 식별&lt;/strong&gt;(실제,시뮬레이션 데이터 모두 F1 ≈ 1), 유의수준 $\alpha=0.01$ 에서 통계적으로 보장된 커버리지 달성&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="문제-정의"&gt;문제 정의&lt;/h2&gt;
&lt;p&gt;제조 현장의 이상 탐지는 두 가지 제약이 있습니다. &lt;strong&gt;① 이상 데이터를 얻기 어렵고, ② 라벨을 얻기는 더 어렵습니다.&lt;/strong&gt; 이 배터리팩 데이터도 같은 상황이었습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;학습 데이터:&lt;/strong&gt; 전부 &lt;strong&gt;정상&lt;/strong&gt; 상태의 충전 과정만 수집 — 176개 셀 전압 + 32개 온도&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;테스트 데이터:&lt;/strong&gt; 정상·이상이 섞여 있지만, 이상 샘플엔 &lt;strong&gt;이상 발생 시점과 &amp;ldquo;이상이다&amp;quot;라는 이진 라벨만&lt;/strong&gt; 제공. 이상의 &lt;strong&gt;구체적 유형(온도/전압)은 알려주지 않음&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;판정 규칙:&lt;/strong&gt; 전압이든 온도든 한쪽이라도 이상이면 그 배터리팩 전체를 이상으로 분류&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉 정상 데이터만으로 정상의 분포를 학습하고, 새 샘플이 그 분포를 벗어나는지를 판단하는 &lt;strong&gt;단일 클래스(novelty) 탐지&lt;/strong&gt; 문제로 접근했습니다. 그리고 &amp;ldquo;몇 % 신뢰수준에서 이상이다&amp;quot;라고 말할 수 있도록, 통계적 보장이 있는 판정 기준이 필요했습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="배터리팩-계층-구조"&gt;배터리팩 계층 구조&lt;/h2&gt;
&lt;p&gt;배터리팩은 계층적으로 구성됩니다. 팩 1개 = &lt;strong&gt;모듈 16개&lt;/strong&gt;, 모듈 1개 = &lt;strong&gt;셀 11개&lt;/strong&gt;, 따라서 팩 전체는 &lt;strong&gt;176개 셀&lt;/strong&gt;입니다. 온도는 모듈마다 센서 2개가 달려 총 32개 측정점을 갖습니다. 이 &lt;strong&gt;셀–모듈–팩 계층&lt;/strong&gt;을 그대로 분석 단위에 반영했습니다(온도는 모듈당 2개 센서를 평균내 모듈 대표 온도로 사용).&lt;/p&gt;
&lt;figure style="margin:1.5rem auto;max-width:560px;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/battery_pack.png"
alt="전기 자동차용 배터리 팩-모듈-셀"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
배터리 팩은 여러 개의 모듈로 구성되며, 각 모듈은 다수의 셀로 이루어진 계층적 구조를 가졌습니다.[사진 출처: 삼성 SDI]
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="데이터-전처리"&gt;데이터 전처리&lt;/h2&gt;
&lt;p&gt;함수형 데이터 분석은 모든 곡선이 같은 충전 사이클을 담고 있어야 합니다. 그래서 전처리의 핵심은 실제 충전 구간만 정확히 절단하는 것이었습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① 기본 절단.&lt;/strong&gt; 각 곡선에서 전압 및 온도의 &lt;strong&gt;최솟값 인덱스를 충전 시작점, 최댓값 인덱스를 충전 완료점&lt;/strong&gt;으로 잡아 완전한 충전 사이클을 추출했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② 변화점 탐지로 정밀 절단.&lt;/strong&gt; 그런데 일부 데이터는 충전 초반에 &lt;strong&gt;최저 전압이 한동안 평평하게 유지&lt;/strong&gt;되는 구간이 있었습니다. 단순히 최솟값의 첫 인덱스를 시작점으로 잡으면, 충전 전 평형 상태까지 끌려 들어가는 문제가 생겼습니다. 그래서 이런 경우에만 선택적으로 &lt;strong&gt;변화점 탐지(ruptures 라이브러리)&lt;/strong&gt; 를 적용해, 감지된 변화점 중 &lt;strong&gt;가장 이른 시점&lt;/strong&gt;을 실제 충전 시작점으로 삼았습니다. 모든 데이터에 적용하면 계산 비용이 크기 때문에, &lt;strong&gt;문제가 되는 곡선에만 선택 적용&lt;/strong&gt;해 효율적으로 처리했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;③ 길이 통일.&lt;/strong&gt; 곡선마다 측정 길이가 달라, 모두 &lt;strong&gt;1초 단위 격자로 선형보간&lt;/strong&gt;하고, 가장 긴 곡선을 기준으로 짧은 곡선은 마지막 값을 연장해 길이를 맞췄습니다. 다만 &lt;strong&gt;온도는 센서별 변화 양상이 너무 달라&lt;/strong&gt; 같은 방식으로 늘리면 본래 패턴이 손상되고 탐지 성능이 떨어졌습니다. 그래서 온도에는 &lt;strong&gt;가변 도메인 함수형 주성분 분석(vd-FPCA)&lt;/strong&gt; 을 적용했습니다. vd-FPCA는 길이가 다른 곡선을 공통 격자로 억지로 맞추지 않고, &lt;strong&gt;도메인 길이를 변수로 한 삼변량 평활(penalized thin-plate spline)로 공분산을 추정하고 길이에 조건부로 고유분해&lt;/strong&gt;하는 방법입니다(
). 덕분에 측정 길이가 제각각인 온도 곡선의 고유한 패턴을 보존하면서 차원을 줄일 수 있었습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="함수형-분석"&gt;함수형 분석&lt;/h2&gt;
&lt;p&gt;전압과 온도는 데이터 성격이 달랐습니다. 전압은 곡선 길이가 비교적 일정해 일반 FPCA를 적용했고, 온도는 센서마다 측정 길이가 제각각이라 길이 차이를 다룰 수 있는 vd-FPCA를 적용했습니다.&lt;/p&gt;
&lt;h3 id="전압--fpca--mahalanobis-거리"&gt;전압 — FPCA + Mahalanobis 거리&lt;/h3&gt;
&lt;p&gt;먼저 데이터를 &lt;strong&gt;팩 단위 5:5로 Train / Calibration 으로 분할&lt;/strong&gt;한 뒤, 모든 전압 곡선을 함수형 데이터로 변환했습니다. Train 세트에서 &lt;strong&gt;FPCA&lt;/strong&gt;를 학습해 고유함수(eigenfunction) 집합을 추정하고, Calibration,Test 곡선은 같은 함수공간으로 &lt;strong&gt;정사영&lt;/strong&gt;해 2차원 FPCA 점수 공간에 표현했습니다.&lt;/p&gt;
&lt;p&gt;이어 Train 세트에서 모듈 안 셀들의 전압 벡터로 평균 벡터와 공분산 행렬을 추정했습니다. 팩 $i$, 모듈 $j$, 셀 $k$의 전압 벡터를 $y_{ijk}$ 라 하면 모듈 단위 평균은&lt;/p&gt;
$$\bar{y}_{ij} = \frac{1}{K} \sum_{k=1}^{K} y_{ijk},$$&lt;p&gt;Train 세트 공분산 행렬 $\Sigma$ 는&lt;/p&gt;
$$\Sigma = \frac{1}{|D_{\mathrm{tr}}|}\sum_{i \in D_{\mathrm{tr}}} \sum_{j=1}^{M}\frac{1}{K} \sum_{k=1}^{K}(y_{ijk} - \bar{y}_{ij})(y_{ijk} - \bar{y}_{ij})^{\top}.$$&lt;p&gt;이 평균과 공분산 통해 각 셀이 모듈 분포에서 얼마나 벗어났는지를 &lt;strong&gt;Mahalanobis 거리&lt;/strong&gt;로 측정해, 셀 단위 이상 점수를 정의했습니다. 셀–모듈 계층을 반영하므로, 팩이 이상으로 판정됐을 때 &lt;strong&gt;어느 셀이 원인인지까지 해석&lt;/strong&gt;할 수 있습니다.&lt;/p&gt;
&lt;h3 id="온도--vd-fpca"&gt;온도 — vd-FPCA&lt;/h3&gt;
&lt;p&gt;온도 곡선엔 vd-FPCA를 적용한 후 GMM을 통해 정상 집단과 이상 집단을 군집화했습니다. 주성분 공간에서 온도 이상 데이터는 정상 군집과 멀리 떨어진 $(-25,\,26)$ 부근에 &lt;strong&gt;고립되어 나타났습니다.&lt;/strong&gt; 이런 뚜렷한 분리는 &lt;strong&gt;vd-FPCA가 길이가 다른 온도 곡선의 정상·이상 패턴 차이를 효과적으로 포착&lt;/strong&gt;했음을 보여줍니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem auto;max-width:560px;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/battery_temp.png"
alt="온도 vd-FPCA 주성분 점수 공간"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
온도 vd-FPCA 점수 공간. 정상(train·cal·test_temp_ok)은 한 군집을 이루고, 온도 이상(test_temp_ng)은 $(-25,26)$ 부근에 고립됩니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="등각-예측"&gt;등각 예측&lt;/h2&gt;
&lt;p&gt;차원을 줄인 점수 공간 위에서, &lt;strong&gt;등각 예측(Conformal Prediction)&lt;/strong&gt; 으로 이상을 판정했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;왜 등각 예측인가.&lt;/strong&gt; 이 데이터는 이상 샘플이 적고 라벨도 부족합니다. 등각 예측은 점 예측 대신 예측 집합(prediction set)을 내놓는데, 교환가능성(exchangeability)이라는 최소한의 가정만으로 불확실성을 정량화합니다. 핵심은 &lt;strong&gt;모델의 유효성과 무관하게 예측 집합이 참값을 포함할 확률이 설정한 수준 이상으로 유지된다&lt;/strong&gt;는 점입니다. 덕분에 분포 가정을 강하게 두기 어렵고 데이터 수가 적은 이번 같은 상황에서도 유효하게 작동하고, &amp;ldquo;$\alpha$ 수준에서 정상을 이상으로 잘못 볼 확률&amp;quot;을 통제할 수 있습니다.&lt;/p&gt;
&lt;p&gt;적합성 점수와 예측 집합 구성 방식이 다른 &lt;strong&gt;세 가지 임계값 설정 방법&lt;/strong&gt;을 모두 적용해 강건성을 검증했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;정상 테스트 데이터&lt;/strong&gt; — 세 방법 모두에서 예측 영역 &lt;strong&gt;내부&lt;/strong&gt;에 위치해 정상으로 올바르게 분류&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이상 데이터&lt;/strong&gt; — 세 방법 모두에서 예측 영역을 &lt;strong&gt;명확히 벗어나&lt;/strong&gt; 이상으로 정확히 식별. 특히 한 이상 샘플은 정상 군집에서 상당히 멀리 떨어져, 높은 신뢰도로 탐지됨&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;위양성(false positive) 0건&lt;/strong&gt; — 세 방법 모두에서 완벽한 분류&lt;/li&gt;
&lt;/ul&gt;
&lt;figure style="margin:1.5rem auto;max-width:600px;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/battery_voltage.png"
alt="전압 적합성 점수 분포와 1% 임계값"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
전압 적합성 점수 분포. 정상(ok)은 낮은 값에 모이고 이상(test_ng)은 큰 값으로 퍼지며, $\alpha=0.01$ 임계값(26.65)을 기준으로 이상이 분리됩니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;→ 전압·온도 양쪽 모두에서 $\alpha=0.01$ 수준의 &lt;strong&gt;통계적으로 보장된 커버리지를 유지하면서&lt;/strong&gt;, 실제·시뮬레이션 데이터 모두 &lt;strong&gt;F1 ≈ 1&lt;/strong&gt; 의 높은 정확도를 달성했습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="시뮬레이션-검증"&gt;시뮬레이션 검증&lt;/h2&gt;
&lt;p&gt;실제 이상 데이터가 적어, 평균 이동·최댓값/최솟값 이동·시간가변 이동 등 다양한 이상 시나리오를 시뮬레이션으로 생성해 방법론의 강건성을 검증했습니다. 대부분의 시나리오에서 &lt;strong&gt;Accuracy·F1·MCC가 0.94~0.99 수준&lt;/strong&gt;으로 안정적이었습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/battery_sim.png"
alt="시뮬레이션 데이터 성능 요약 표"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
시뮬레이션 이상 시나리오별 성능 요약 (Accuracy·Precision·Recall·F1·MCC).
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="핵심-요약"&gt;핵심 요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;라벨 없는 제조 데이터에 맞춘 설계:&lt;/strong&gt; 정상만으로 분포를 학습하는 novelty 탐지로 접근하고, 셀–모듈–팩 계층 구조를 분석 단위에 반영했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;전압·온도를 특성에 맞게:&lt;/strong&gt; 길이가 일정한 전압엔 FPCA + Mahalanobis 거리를, 길이가 제각각인 온도엔 vd-FPCA를 적용해 각 신호의 패턴을 살렸습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;통계적으로 보장된 판정:&lt;/strong&gt; GMM 기반 등각 예측으로 세 가지 임계값 방법 모두에서 &lt;strong&gt;위양성 없이&lt;/strong&gt; 이상을 전수 식별(F1 ≈ 1)했고, $\alpha=0.01$ 의 커버리지 보장을 확보했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="참고문헌"&gt;참고문헌&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Johns, J. T., Crainiceanu, C., Zipunnikov, V., &amp;amp; Gellar, J. (2019).
. &lt;em&gt;Journal of Computational and Graphical Statistics&lt;/em&gt;, 28(4), 993–1006.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="출처"&gt;출처&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;배터리 팩 사진
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>다이캐스팅 공정데이터 이상 탐지</title><link>https://siuunni.github.io/projects/diecasting-anomaly/</link><pubDate>Wed, 10 Dec 2025 00:00:00 +0000</pubDate><guid>https://siuunni.github.io/projects/diecasting-anomaly/</guid><description>&lt;div style="display:grid;grid-template-columns:130px 1fr;gap:1rem 1.5rem;margin-bottom:2rem;"&gt;
&lt;div style="font-weight:700;"&gt;개요&lt;/div&gt;
&lt;div&gt;다이캐스팅 공정의 시계열 패턴을 기반으로 불량을 예측하고, SHAP·CCF로 불량의 주요 원인을 해석한 제조데이터 분석 프로젝트입니다.&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;대회&lt;/div&gt;
&lt;div&gt;제4회 K-인공지능 제조데이터 분석 경진대회 (KAMP, 2024)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기간&lt;/div&gt;
&lt;div&gt;2024.10~2024.11(약 2주)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;데이터&lt;/div&gt;
&lt;div&gt;다이캐스팅 공정 시계열 2,852,465 cells (92,015 rows × 31 columns)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기술 스택&lt;/div&gt;
&lt;div&gt;Python · pandas · NumPy · scikit-learn · XGBoost · SHAP · Matplotlib&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;성과&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Accuracy 0.9970 · Recall 0.9501 · Precision 0.9794 · F1 0.9646&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="문제-정의"&gt;문제 정의&lt;/h2&gt;
&lt;p&gt;다이캐스팅은 금형(Die)에 녹인 금속을 고압으로 주입해 제품을 만드는 주조 공법으로, &lt;strong&gt;압력·속도·시간·온도&lt;/strong&gt; 4대 조건을 일정하게 유지하는 것이 중요합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;주요 변수의 &lt;strong&gt;시계열적 특성이 크게 변동&lt;/strong&gt;하거나 일정 패턴을 벗어날 때 불량이 빈번하게 발생합니다.&lt;/li&gt;
&lt;li&gt;현장 관리자는 변수의 실시간 변동은 볼 수 있지만, &lt;strong&gt;그 패턴이 불량에 어떤 영향을 미치는지&lt;/strong&gt; 구체적으로 파악하기 어렵습니다.&lt;/li&gt;
&lt;li&gt;특히 중소기업은 설비 운영이 작업자 경험에 의존해 체계적 관리가 어렵습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ &lt;strong&gt;시계열 패턴이 불량에 기여하는 정도를 정량적으로 설명&lt;/strong&gt;하는 모델이 필요합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="접근-방법"&gt;접근 방법&lt;/h2&gt;
&lt;p&gt;불량(수율 영향인자)을 &lt;strong&gt;다섯 가지 관점&lt;/strong&gt;으로 나누어 시계열 특성을 반영했습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;현재 상태&lt;/strong&gt; — 변수의 현재 값이 불량에 미치는 즉각적 영향&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;변동성&lt;/strong&gt; — 일정 기간의 변동성이 품질에 미치는 영향&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;변화 추세&lt;/strong&gt; — 이동평균 기반 장기적 변화 방향의 누적 영향&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;계절성&lt;/strong&gt; — 연중 시기에 따른 품질 변화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;시간대&lt;/strong&gt; — 하루 중 밤/낮 변화&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="데이터-전처리--파생변수"&gt;데이터 전처리 &amp;amp; 파생변수&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;롤링 윈도우(window=5)&lt;/strong&gt; 로 각 공정 변수의 이동평균과 이동 변동계수를 생성했습니다. 변수 특성에 따라 금형코드·가열로 단위로 그룹화하여 계산했습니다.&lt;/li&gt;
&lt;li&gt;시계열 특성을 위해 연중 며칠째인지(계절성)와 하루 중 시간대의 주기성을 나타내는 파생변수를 추가했습니다.&lt;/li&gt;
&lt;li&gt;유효 범위 외 이상치는 결측 처리 후 평균으로 대체하여 일관성을 유지했고, 데이터 &lt;strong&gt;완전성·정확성·무결성 품질지수 100&lt;/strong&gt;을 달성했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;T-검정 결과 모든 파생변수의 p-value &amp;lt; 0.05&lt;/strong&gt; 로, 생성 변수가 품질에 유의한 영향을 미침을 확인했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="ccf-분석--시차를-고려한-영향력-검증"&gt;CCF 분석 — 시차를 고려한 영향력 검증&lt;/h2&gt;
&lt;p&gt;교차상관함수(Cross-Correlation Function)로 각 공정 변수가 &lt;strong&gt;지연 시간(lag)&lt;/strong&gt; 에 따라 불량 판정에 미치는 상관관계를 분석했습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem auto;max-width:560px;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/diecast_ccf.png"
alt="변수의 지연시간에 따른 CCF"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
변수의 지연시간(lag)에 따른 CCF. CCF가 양수면 변수 증가 시 불량 확률 증가, 음수면 정상 확률 증가를 의미합니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="예측-모델--xgboost"&gt;예측 모델 — XGBoost&lt;/h2&gt;
&lt;p&gt;금형코드·가열로 같은 범주형 변수와 비선형 상호작용이 많은 제조데이터 특성에 강점이 있는 &lt;strong&gt;XGBoost&lt;/strong&gt;를 채택했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;클래스 불균형 처리:&lt;/strong&gt; 불량 비율이 낮은 문제를 보정하기 위해 불량 클래스에 더 높은 가중치를 부여했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 분할:&lt;/strong&gt; 클래스 비율을 유지하며 학습·검증·테스트로 분할했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;모델&lt;/th&gt;
&lt;th style="text-align: center"&gt;Accuracy&lt;/th&gt;
&lt;th style="text-align: center"&gt;Recall&lt;/th&gt;
&lt;th style="text-align: center"&gt;Precision&lt;/th&gt;
&lt;th style="text-align: center"&gt;F1 Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Random Forest&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.9965&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.9377&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.9817&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.9592&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;AdaBoost&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.9936&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.8928&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.9572&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.9239&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Decision Tree&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.9957&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.9327&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.9664&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.9492&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;XGBoost&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.9970&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.9501&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.9794&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.9646&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="xai--shap-기반-불량-원인-해석"&gt;XAI — SHAP 기반 불량 원인 해석&lt;/h2&gt;
&lt;p&gt;SHAP(Shapley Additive Explanations)로 각 변수가 불량 발생에 기여하는 정도를 정량화했습니다. 각 변수를 현재상태/변화추세/변동성 특성으로 나누어 합산했습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/diecast_shap_combined.png"
alt="요인별 품질 기여도 및 주요 변수별 SHAP 통합 그래프"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
요인별 품질 기여도(좌)와 변수별 종합 영향(우). 빨간색은 품질 저하 요인, 파란색은 개선 요인. &lt;strong&gt;lower_mold_temp1, upper_mold_temp2&lt;/strong&gt; 등 금형 온도 변수가 주요 불량 인자로 나타났습니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="개별-생산품-진단-예시"&gt;개별 생산품 진단 예시&lt;/h3&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/diecast_shap_abnormal.png"
alt="비정상으로 분류된 11번 생산품 SHAP 분석"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
&lt;strong&gt;불량 생산품(11번):&lt;/strong&gt; 현재 상태와 변동성이 큰 품질 저하 요인. upper_mold_temp1·lower_mold_temp1의 온도 현재 상태가 불량에 강하게 기여.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/diecast_shap_normal.png"
alt="정상으로 분류된 4번 생산품 SHAP 분석"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
&lt;strong&gt;정상 생산품(4번):&lt;/strong&gt; 대부분 변수가 품질 개선에 기여. molten_temp가 일부 저하 요인이나 다른 변수가 이를 상쇄.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="기대-효과"&gt;기대 효과&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;체계적 공정관리:&lt;/strong&gt; 제품 생산 시점마다 공정 변수의 현재 상태·변동성을 평가해 품질 저하 요인을 즉시 조정할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비용 절감:&lt;/strong&gt; 가벼운 트리 기반 모델로 고성능 컴퓨팅 자원 없이 수 분 내 분석 및 해석이 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;확장성:&lt;/strong&gt; 온도 및 습도를 다루는 다른 제조 공정(예: 레진 도포, 경화)으로도 확장 가능하며, 불균형한 범주형 데이터에서 &lt;strong&gt;F1 0.980&lt;/strong&gt;의 높은 예측력을 보였습니다.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>시계열 센서 데이터 기반 자동차 엔진 이상 탐지</title><link>https://siuunni.github.io/projects/ford-engine-anomaly/</link><pubDate>Tue, 09 Dec 2025 00:00:00 +0000</pubDate><guid>https://siuunni.github.io/projects/ford-engine-anomaly/</guid><description>&lt;div style="display:grid;grid-template-columns:130px 1fr;gap:1rem 1.5rem;margin-bottom:2rem;"&gt;
&lt;div style="font-weight:700;"&gt;개요&lt;/div&gt;
&lt;div&gt;500개 센서의 시계열 데이터로 자동차 엔진의 정상/이상을 판별하고, Grad-CAM·SHAP로 모델의 판단 근거를 해석한 딥러닝 이상 탐지 프로젝트입니다.&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;수업&lt;/div&gt;
&lt;div&gt;심층신경망특론 기말 프로젝트 (인하대학교 통계데이터사이언스학)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기간&lt;/div&gt;
&lt;div&gt;2024.10 ~ 2024.12&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;데이터&lt;/div&gt;
&lt;div&gt;Ford 오픈 데이터셋 — 4,921개 시계열 샘플 × 500개 센서 (학습 3,601 / 테스트 1,320, 정상 1 / 이상 −1)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기술 스택&lt;/div&gt;
&lt;div&gt;Python · TensorFlow/Keras · scikit-learn · XGBoost · SHAP · NumPy&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;성과&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;1D-CNN 정확도 94.69% · AUC 0.95&lt;/strong&gt; 로 세 모델 중 최고 성능 달성&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="문제-정의"&gt;문제 정의&lt;/h2&gt;
&lt;p&gt;엔진은 자동차 동력의 심장과도 같아서, 이상이 생기면 곧바로 안전 문제로 이어집니다. 실제로 최근 5년간 접수된 자동차 결함 신고에서 &lt;strong&gt;엔진 관련 문제가 가장 큰 비중&lt;/strong&gt;을 차지했습니다. 그래서 엔진에 부착된 센서를 실시간으로 들여다보며 이상 징후를 미리 잡아내는 일이 점점 더 중요해지고 있습니다.&lt;/p&gt;
&lt;p&gt;저희는 이 문제를 &lt;strong&gt;이진 분류&lt;/strong&gt;로 풀기로 했습니다. 한 시점에서 측정된 센서 값들을 보고 그 순간 엔진이 정상인지 아닌지를 가려내는 것입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;입력:&lt;/strong&gt; 특정 시점 $t$ 에 측정된 500개 센서 값&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;타깃:&lt;/strong&gt; 그 시점의 엔진 상태 — 정상(1) / 이상(−1)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;목표:&lt;/strong&gt; 500개 센서만으로 현재 엔진 이상 여부를 정확히 판별&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="데이터-탐색"&gt;데이터 탐색&lt;/h2&gt;
&lt;p&gt;어떤 모델을 쓸지 정하기 전에, 데이터가 &lt;strong&gt;시간적으로, 또 센서 간 공간적으로 어떤 구조를 갖는지&lt;/strong&gt;부터 살펴봤습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① 시간적으로는 거의 무관했습니다.&lt;/strong&gt; ACF/PACF를 보니 &lt;strong&gt;lag 1 이후로는 시간적 상관이 사라져&lt;/strong&gt;, 타깃이 사실상 백색잡음(white noise)처럼 움직였습니다. 이는 과거 시점을 길게 기억하는 RNN 계열의 장점이 여기서는 작동하지 않는다는 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② 반면 센서끼리는 강하게 얽혀 있었습니다.&lt;/strong&gt; 센서 사이에는 뚜렷한 선형 상관 클러스터가 보였고, 특히 &lt;strong&gt;번호가 가까운 센서일수록 상관이 강했습니다&lt;/strong&gt;(예: 10–13번 구간은 음의 상관, 1–3번 구간은 양의 상관). 즉 이상을 가르는 단서는 시간이 아니라 &lt;strong&gt;가까이 붙은 센서들이 함께 만드는 국소 패턴&lt;/strong&gt;에 있었습니다. PCA로 약 66개 주성분까지 줄여도 봤지만 성능이 오히려 떨어져서, &lt;strong&gt;500개 센서를 그대로 쓰기로&lt;/strong&gt; 했습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ford_sensor_corr.png"
alt="센서 간 2D·3D 상관관계 시각화"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
센서 간 0.6 이상 강한 상관관계 (좌: 2D, 우: 3D). 번호가 인접한 센서끼리 선형 클러스터를 형성합니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;→ 이 두 가지를 종합해 &lt;strong&gt;&amp;ldquo;시간보다 인접 센서의 국소 패턴이 더 중요하다&amp;rdquo;&lt;/strong&gt; 는 가설을 세웠고, 그런 패턴을 잡아내는 데 강한 &lt;strong&gt;1D-CNN&lt;/strong&gt;을 가장 유력한 후보로 두었습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="데이터-전처리"&gt;데이터 전처리&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;시계열 누수 막기:&lt;/strong&gt; 클래스별 80% 지점 중 더 뒤쪽 시점을 공통 기준으로 잡아 나눴습니다. 이렇게 해야 미래 데이터가 학습에 새어드는 &lt;strong&gt;시간적 누수(leakage)&lt;/strong&gt; 를 막을 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;클래스 비율 유지:&lt;/strong&gt; 정상/이상 비율을 그대로 유지하며 나눠 한쪽으로 치우치지 않게 했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;정규화:&lt;/strong&gt; Standard와 Min-Max Scaler를 비교해, 센서마다 다른 단위,범위를 같은 스케일로 맞췄습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="후보-모델--최적화"&gt;후보 모델 &amp;amp; 최적화&lt;/h2&gt;
&lt;p&gt;접근 방식이 서로 다른 세 모델을 같은 데이터 위에서 나란히 비교해봤습니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;관점&lt;/th&gt;
&lt;th style="text-align: left"&gt;모델&lt;/th&gt;
&lt;th style="text-align: left"&gt;설계 의도&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;트리 기반&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;XGBoost&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;센서별 중요도 기반 분류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;순환 신경망&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;LSTM&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;게이트로 시간 의존성 학습&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;합성곱 신경망&lt;/td&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;1D-CNN&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;인접 센서의 국소 패턴 추출&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;XGBoost.&lt;/strong&gt; grid search로 하이퍼파라미터를 맞춰봤지만, Train Loss는 떨어지는데 &lt;strong&gt;Validation Loss는 제자리&lt;/strong&gt;인 전형적인 과적합 양상을 보였습니다. AUC도 0.75에 머물렀습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LSTM.&lt;/strong&gt; 정규화 방식과 유닛 수를 바꿔가며 세 번 돌려보았고, 그중 &lt;strong&gt;유닛을 256개로 키운 설정&lt;/strong&gt;이 정확도 92.88%로 가장 좋았습니다. AUC 0.93으로 성능은 높았지만 과적합 기미가 조금 있었고, 무엇보다 &lt;strong&gt;학습에 1시간이 넘게&lt;/strong&gt; 걸렸습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1D-CNN.&lt;/strong&gt; 데이터 탐색에서 본 &amp;ldquo;좌우 15개 안팎의 센서가 강하게 얽힌다&amp;quot;는 특징을 그대로 설계에 반영했습니다. 첫 레이어 커널을 &lt;strong&gt;30&lt;/strong&gt;으로 넓게 잡아 큰 패턴부터 보고, 이후 &lt;strong&gt;15 → 7 → 3&lt;/strong&gt; 으로 좁혀가며 국소 패턴을 단계적으로 잡도록 했습니다. 각 Conv 블록에는 BatchNorm과 Dropout(0.2)을 넣어 과적합을 눌렀습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="모델링-결과"&gt;모델링 결과&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;모델&lt;/th&gt;
&lt;th style="text-align: center"&gt;Test Accuracy&lt;/th&gt;
&lt;th style="text-align: center"&gt;Test Loss&lt;/th&gt;
&lt;th style="text-align: center"&gt;AUC&lt;/th&gt;
&lt;th style="text-align: center"&gt;Confusion (TP·TN·FP·FN)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;XGBoost&lt;/td&gt;
&lt;td style="text-align: center"&gt;74.92%&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.5521&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.75&lt;/td&gt;
&lt;td style="text-align: center"&gt;470 · 519 · 162 · 169&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;LSTM&lt;/td&gt;
&lt;td style="text-align: center"&gt;92.88%&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.2973&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.93&lt;/td&gt;
&lt;td style="text-align: center"&gt;567 · 659 · 22 · 72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;1D-CNN&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;94.69%&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.1338&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.95&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;608 · 643 · 38 · 31&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;결과적으로 &lt;strong&gt;1D-CNN이 정확도·안정성·속도 어느 쪽으로 봐도 가장 좋았습니다.&lt;/strong&gt; Train과 Validation Loss가 나란히 수렴해 과적합이 없었고, 학습 시간도 약 10분으로 LSTM(1시간+)의 6분의 1 수준이었습니다. 데이터 탐색에서 세운 &amp;ldquo;시간보다 국소 공간 패턴이 중요하다&amp;quot;는 가설이 성능으로 확인되었습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ford_cnn_arch.png"
alt="최종 1D-CNN 아키텍처"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
최종 1D-CNN 아키텍처. 4개 Conv1D 블록(BatchNorm·ReLU·Dropout) → Global Average Pooling → Dense.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="xai--모델은-무엇을-보고-판단했나"&gt;XAI — 모델은 무엇을 보고 판단했나&lt;/h2&gt;
&lt;p&gt;정확도가 높다고 해서 모델을 곧바로 믿을 수는 없습니다. 따라서 &lt;strong&gt;Grad-CAM&lt;/strong&gt;과 &lt;strong&gt;SHAP&lt;/strong&gt;로 &amp;ldquo;CNN이 대체 어디를 보고 이상이라 판단했는지&amp;quot;를 들여다봤습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grad-CAM:&lt;/strong&gt; 이상일 때 센서 활성화 값이 약 0.25, 정상일 때 약 0.12로 갈렸습니다. 모델이 &lt;strong&gt;이상이라고 볼 때 센서 신호를 훨씬 또렷하게 잡아낸다&lt;/strong&gt;는 뜻입니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SHAP:&lt;/strong&gt; 두 방법 모두에서 &lt;strong&gt;번호가 서로 가까운 센서들&lt;/strong&gt;(Grad-CAM은 472·428, SHAP은 471·429)이 핵심으로 꼽혔습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure style="margin:1.5rem auto;max-width:440px;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ford_shap.png"
alt="센서 번호별 SHAP 중요도"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
센서 번호별 SHAP 중요도. 인접 센서가 함께 중요 특징으로 나타납니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ford_gradcam.png"
alt="단일 샘플 및 전체 샘플 센서 중요도"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
(좌) 단일 샘플의 센서별 중요도 (우) 전체 샘플에서 중요도 0.8 이상인 센서의 빈도.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;→ 두 해석 결과가 &lt;strong&gt;상당히 겹쳤고&lt;/strong&gt;, 모두 인접 센서의 선형 패턴을 가리켰습니다. 처음 EDA에서 세운 가설을 모델이 실제로 그렇게 작동하고 있다는 것을 확인할 수 있었습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="핵심-요약"&gt;핵심 요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터를 보고 모델을 골랐다:&lt;/strong&gt; &amp;ldquo;시간 상관은 약하고 인접 센서의 공간 상관이 강하다&amp;quot;는 EDA 결과를 근거로 1D-CNN을 택했고, 성능이 그 판단을 뒷받침했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;세 모델을 비교했다:&lt;/strong&gt; XGBoost(0.75) &amp;lt; LSTM(0.93) &amp;lt; &lt;strong&gt;1D-CNN(0.95, 정확도 94.69%)&lt;/strong&gt; — 성능도 속도도 앞선 CNN을 최종 모델로 채택했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;왜 맞췄는지까지 확인했다:&lt;/strong&gt; Grad-CAM과 SHAP가 같은 결론을 내, 인접 센서의 선형 패턴이 이상 판별의 핵심이라는 점을 분명히 했습니다.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>텍스트 기반 이미지 색채화 품질 개선</title><link>https://siuunni.github.io/projects/image-colorization/</link><pubDate>Mon, 08 Dec 2025 00:00:00 +0000</pubDate><guid>https://siuunni.github.io/projects/image-colorization/</guid><description>&lt;div style="display:grid;grid-template-columns:130px 1fr;gap:1rem 1.5rem;margin-bottom:2rem;"&gt;
&lt;div style="font-weight:700;"&gt;개요&lt;/div&gt;
&lt;div&gt;텍스트 설명을 따라 흑백 이미지를 색채화하는 생성형 AI 프로젝트입니다. 여러 공개 색채화 모델을 비교하고, 텍스트 의미를 반영하는 추론 파이프라인을 구축했습니다.&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;대회&lt;/div&gt;
&lt;div&gt;2025 INHA AI Challenge, 대학원생 부문 3위&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기간&lt;/div&gt;
&lt;div&gt;2025.06 ~ 2025.07(약 1달ㄴ)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;과제&lt;/div&gt;
&lt;div&gt;텍스트(캡션) 조건부 흑백→컬러 이미지 생성, 텍스트 의미 일치도 기반 Score 평가&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기술 스택&lt;/div&gt;
&lt;div&gt;Python, PyTorch, Diffusers, SAM(Segment Anything), OpenCLIP, NumPy&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;성과&lt;/div&gt;
&lt;div&gt;최종 &lt;strong&gt;Score 0.70&lt;/strong&gt; 달성 (베이스라인 대비 약 17~32% 향상)&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="문제-정의"&gt;문제 정의&lt;/h2&gt;
&lt;p&gt;텍스트 설명을 입력으로 받아 흑백 이미지를 색채화하되, 결과 색상이 텍스트 의미와 일치해야 하는 과제입니다. &amp;ldquo;빨간 셔츠를 입은 사람&amp;quot;이라는 설명이 있으면 실제로 그 셔츠가 빨갛게 칠해져야 점수를 받습니다.&lt;/p&gt;
&lt;p&gt;핵심은 어떤 모델을 쓰느냐보다, 어떤 모델과 추론 전략의 조합이 텍스트 의미를 더 잘 반영하느냐를 실험으로 찾는 것이었습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-공개-모델-비교"&gt;1. 공개 모델 비교&lt;/h2&gt;
&lt;p&gt;먼저 색채화 분야의 주요 사전학습 모델들을 같은 데이터와 환경에서 비교했습니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;모델&lt;/th&gt;
&lt;th style="text-align: center"&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Unicolor&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;ControlNet&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;ControlColor&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;COCO-LC&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;L-CAD (튜닝 후 최종)&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.70&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;같은 조건에서 L-CAD가 가장 좋았고, 이를 메인 모델로 삼아 최적화에 집중했습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-추론-파라미터-튜닝"&gt;2. 추론 파라미터 튜닝&lt;/h2&gt;
&lt;p&gt;초기 실험에서 두 가지 문제가 있었습니다. 같은 입력인데도 랜덤 시드에 따라 색이 달라졌고, 텍스트 의미와 맞지 않는 색이 나오기도 했습니다.&lt;/p&gt;
&lt;p&gt;디퓨전 모델의 결과는 모델 구조만큼이나 추론 설정에 좌우됩니다. 그래서 주요 추론 파라미터를 조정하며 결과의 안정성과 의미 일관성을 확인했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DDIM Steps&lt;/strong&gt; — 샘플링 단계 수에 따른 품질, 안정성 변화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guidance Scale&lt;/strong&gt; — 텍스트 조건을 얼마나 강하게 반영할지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strength&lt;/strong&gt; — 원본 구조를 얼마나 보존할지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-Attention Guidance(SAG)&lt;/strong&gt; — 생성 결과의 일관성 보정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여러 차례 실험을 거쳐, 성능을 떨어뜨리지 않으면서 결과 변동성을 줄이는 설정을 찾았습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-객체-단위-앙상블"&gt;3. 객체 단위 앙상블&lt;/h2&gt;
&lt;p&gt;단일 모델의 한계를 확인하기 위해, 객체별로 더 나은 모델 결과를 골라 합치는 앙상블을 설계했습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SAM(Segment Anything)&lt;/strong&gt; 으로 이미지 안의 객체를 분리&lt;/li&gt;
&lt;li&gt;각 객체에 대해 COCO-LC와 L-CAD 결과를 모두 생성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenCLIP&lt;/strong&gt; 이미지–텍스트 유사도로 객체마다 텍스트 의미에 더 맞는 결과를 선택해 합성&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이 방식은 COCO-LC 단일 모델(0.60) 대비 0.686까지 점수를 올렸지만, 최적화한 L-CAD 단일 모델(0.70)에는 못 미쳤습니다. 객체 경계를 합성하는 과정에서 생기는 부자연스러움이 앙상블의 이점을 상쇄한 것으로 보입니다.&lt;/p&gt;
&lt;p&gt;결국 앙상블보다 L-CAD 단일 모델의 추론 최적화가 더 효과적이어서, 이를 최종 제출안으로 택했습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;div style="display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;align-items:start;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/colorization_input.png" alt="흑백 입력 이미지"
style="display:block;width:100%;height:auto;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;box-sizing:border-box;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/colorization_lcad_2.png" alt="L-CAD 색채화 결과 1"
style="display:block;width:100%;height:auto;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;box-sizing:border-box;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/colorization_lcad_1.png" alt="L-CAD 색채화 결과 2"
style="display:block;width:100%;height:auto;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;box-sizing:border-box;"&gt;
&lt;/div&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
최종 L-CAD 색채화 결과. 좌측 흑백 입력을 텍스트 의미에 맞게 자연스럽게 색채화한 모습입니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="결과"&gt;결과&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;단계&lt;/th&gt;
&lt;th style="text-align: center"&gt;Score&lt;/th&gt;
&lt;th style="text-align: left"&gt;비고&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;최고 베이스라인 (COCO-LC)&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.60&lt;/td&gt;
&lt;td style="text-align: left"&gt;공개 모델 비교 1위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;SAM + OpenCLIP 객체 앙상블&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.686&lt;/td&gt;
&lt;td style="text-align: left"&gt;단일 모델보다 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;L-CAD 단일 최적화 (최종)&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.70&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;최종 채택&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;최저 베이스라인(ControlNet 0.53) 대비 약 32%, COCO-LC(0.60) 대비 약 17% 향상&lt;/li&gt;
&lt;li&gt;2025 INHA AI Challenge 대학원생 부문 3위&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="핵심-요약"&gt;핵심 요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;모델 비교로 메인 선정:&lt;/strong&gt; Unicolor, ControlNet, ControlColor, COCO-LC, L-CAD를 같은 조건에서 비교해 L-CAD를 메인 모델로 정했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;추론 최적화:&lt;/strong&gt; DDIM, Guidance, SAG 등 추론 파라미터를 조정해 의미 일관성을 유지하면서 변동성을 줄였습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;앙상블 검증:&lt;/strong&gt; SAM과 OpenCLIP으로 객체 단위 앙상블을 설계해 비교한 결과, 이 과제에서는 단일 모델 최적화가 더 나았고 최종 Score 0.70을 달성했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>전기차 주행가능거리 기반 충전소 추천 시스템</title><link>https://siuunni.github.io/projects/ev-solution/</link><pubDate>Fri, 05 Dec 2025 00:00:00 +0000</pubDate><guid>https://siuunni.github.io/projects/ev-solution/</guid><description>&lt;div style="display:grid;grid-template-columns:130px 1fr;gap:1rem 1.5rem;margin-bottom:2rem;"&gt;
&lt;div style="font-weight:700;"&gt;개요&lt;/div&gt;
&lt;div&gt;전기차의 실시간 &lt;strong&gt;BMS(배터리 관리 시스템)&lt;/strong&gt; 데이터로 주행가능거리를 예측하고, 실제 주행 경로 위에서 도달 가능한 충전소를 실시간 추천하는 시스템입니다.&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기간&lt;/div&gt;
&lt;div&gt;2024.03 ~ 2024.06(알파프로젝트)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;담당 역할&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;주행가능거리 예측 모델링 · 경로 추천 알고리즘 구현 · GUI 개발&lt;/strong&gt;&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;데이터&lt;/div&gt;
&lt;div&gt;전기차(BMW i3) BMS 주행 로그 — 배터리 전압·전류, SoC, 속도, 거리, 온도 등&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기술 스택&lt;/div&gt;
&lt;div&gt;Python · pandas · NumPy · LSTM(TensorFlow/Keras) · Selenium · BeautifulSoup · Naver Map API · Arduino·ESP(IoT)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;성과&lt;/div&gt;
&lt;div&gt;주행가능거리 예측 &lt;strong&gt;MAE 0.03 · MSE 0.005&lt;/strong&gt; 달성&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="문제-정의"&gt;문제 정의&lt;/h2&gt;
&lt;p&gt;전기차 운전자는 &amp;ldquo;지금 배터리로 어디까지 갈 수 있고, 그 안에 충전소가 있는가&amp;quot;를 늘 신경 써야 합니다. 여기엔 두 가지 어려움이 있었습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;배터리 잔량만으로는 주행가능거리 예측이 어렵다.&lt;/strong&gt; 동일한 SoC라도 주행 환경·운전 습관·도로 조건에 따라 실제 갈 수 있는 거리가 크게 달라집니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;방향 정보가 없으면 엉뚱한 충전소를 추천한다.&lt;/strong&gt; 실시간 GPS·경로 정보가 없으면, 주행 방향과 반대편에 있는 충전소를 추천하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그래서 &lt;strong&gt;① BMS 데이터로 주행가능거리를 예측 → ② 실제 주행 경로 위에서 도달 가능한 충전소를 추천&lt;/strong&gt;하는 흐름을 설계했습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-주행가능거리--1차-계산"&gt;1. 주행가능거리 — 1차 계산&lt;/h2&gt;
&lt;p&gt;BMS에서 들어오는 &lt;strong&gt;배터리 전압 및 전류&lt;/strong&gt;로 실시간 전력을 구하고, 누적 에너지 소비와 회생제동(에너지 회수)까지 반영해 주행가능거리를 계산했습니다. 배터리 전류가 음수면 회생제동으로 에너지를 회수하는 상태로 간주했습니다.&lt;/p&gt;
$$P_{[kW]} = \frac{V_{\text{batt}} \times I_{\text{batt}}}{1000}, \qquad \text{소비율}_{[kWh/km]} = \frac{E_{[kWh]}}{\text{거리}_{[km]}}$$$$\text{주행가능거리} = \frac{\dfrac{SoC}{100}\times C_{\text{batt}} + (E_{\text{회수}} \cdot \mathbb{1}[P&lt;0])}{\max(|P|,\,0.1)}$$&lt;p&gt;(BMW i3 배터리 용량 $C_{\text{batt}} = 42.2\,\text{kWh}$ 기준)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;한계 진단 — SoC 상관분석.&lt;/strong&gt; 계산한 주행가능거리가 타당한지 SoC를 비롯한 변수들과의 상관관계로 검증했습니다. 그 결과 &lt;strong&gt;주행가능거리와 SoC의 상관(≈0.35)이 낮았고&lt;/strong&gt;, 아래 산점도처럼 같은 배터리 잔량(SoC)에서도 추정 주행거리가 크게 퍼져 &lt;strong&gt;단순 계산식만으로는 한계&lt;/strong&gt;가 있음을 확인했습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;div style="display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem;align-items:start;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ev_soc_corr_1.png"
alt="변수들 간 Heat map"
style="display:block;width:100%;height:auto;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;box-sizing:border-box;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ev_soc_corr_2.png"
alt="배터리 잔량(SoC)과 추정 주행거리의 상관계수"
style="display:block;width:100%;height:auto;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;box-sizing:border-box;"&gt;
&lt;/div&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
배터리 잔량(SoC)과 추정 주행거리의 상관계수가 0.35로 두 변수간에 선형적인 특징이 매우 약하다는 것을 알 수 있습니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ev_soc_scatter.png"
alt="배터리 잔량(SoC)과 추정 주행거리의 괴리"
style="width:80%;display:block;margin:0 auto;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
배터리 SoC(%) vs 추정 주행거리(km). 같은 잔량에서도 주행거리가 넓게 퍼져 있어, 잔량만으로는 정확한 예측이 어렵다는 것을 보여줍니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="2-주행가능거리--동적-소비율-보정--lstm-예측"&gt;2. 주행가능거리 — 동적 소비율 보정 + LSTM 예측&lt;/h2&gt;
&lt;p&gt;단순 계산식의 한계를 넘기 위해, 주행 데이터의 변동성과 비선형 패턴을 반영하는 두 단계를 추가했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;동적 소비율 보정:&lt;/strong&gt; 주행 중 변동성을 반영하도록 &lt;strong&gt;가중 이동 평균 소비율(MAAEC)&lt;/strong&gt; 과 &lt;strong&gt;보정식(AAEC)&lt;/strong&gt; 을 설계해, 순간적인 가속·회생제동에 휘둘리지 않는 안정적인 소비율을 산출했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LSTM 시계열 예측:&lt;/strong&gt; 보정된 소비율 위에 &lt;strong&gt;LSTM 기반 시계열 모델&lt;/strong&gt;을 결합해, 주행 환경·운전 습관에 따른 &lt;strong&gt;비선형 주행 패턴&lt;/strong&gt;을 학습했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 그 결과 주행가능거리 예측에서 &lt;strong&gt;MAE 0.03, MSE 0.005&lt;/strong&gt; 의 높은 성능을 달성해, 1차 계산식의 한계를 크게 개선했습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-경로-기반-충전소-추천"&gt;3. 경로 기반 충전소 추천&lt;/h2&gt;
&lt;p&gt;방향을 무시한 추천 문제를 해결하기 위해, &lt;strong&gt;실제 주행 경로&lt;/strong&gt;를 반영한 추천 알고리즘을 구현했습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;네이버 길찾기 API&lt;/strong&gt; 로 현재 위치에서 후보 충전소까지의 실제 주행 경로(도달 거리)를 계산&lt;/li&gt;
&lt;li&gt;예측된 &lt;strong&gt;주행가능거리와 연동&lt;/strong&gt;해, 도달 가능한 충전소만 필터링&lt;/li&gt;
&lt;li&gt;그 안에서 &lt;strong&gt;최소 거리&lt;/strong&gt; 충전소를 추천하고, 네이버 지도를 실시간 크롤링한 충전소 정보(개방·충전 속도·이용 가능 대수 등)와 함께 &lt;strong&gt;GUI로 시각화&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ev_recommend_gui.png"
alt="실시간 전기차 충전소 추천 GUI"
style="width:80%;display:block;margin:0 auto;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
실시간 충전소 추천 GUI — 현재 위치와 도달 가능한 충전소 위치를 지도에 함께 표시
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;데이터 수집:&lt;/strong&gt; 충전소 현황은 GPS 위치를 기준으로 &lt;strong&gt;네이버 지도를 Selenium·BeautifulSoup으로 크롤링&lt;/strong&gt;해 이름·거리·개방 여부·충전 속도·이용 가능 대수를 수집하고 DataHub에 저장했습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="4-사용자-대시보드--데모-시스템"&gt;4. 사용자 대시보드 &amp;amp; 데모 시스템&lt;/h2&gt;
&lt;p&gt;운전자가 한눈에 보도록 &lt;strong&gt;실시간 대시보드&lt;/strong&gt;(주행가능거리·배터리 잔량·배터리 온도·주변 충전소 목록)를 구성했습니다. 실제 전기차 대신 &lt;strong&gt;Arduino·ESP 기반 모형 전기차&lt;/strong&gt;로 BMS-유사 데이터를 클라우드로 전송해 전체 흐름을 시연했습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ev_dashboard_1.png"
alt="전기차 충전 최적화 대시보드"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/ev_dashboard_2.png"
alt="전기차 충전소 추천 대시보드"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
EV charging optimization 및 충전소 추천 대시보드 — 주행가능거리,배터리 잔량,온도,주변 충전소 현황을 실시간 표시
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="핵심-요약"&gt;핵심 요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;예측 모델링:&lt;/strong&gt; 단순 계산식의 한계(SoC 상관 ≈0.35)를 진단하고, 동적 소비율 보정(MAAEC·AAEC) + LSTM 시계열 모델로 &lt;strong&gt;MAE 0.03 · MSE 0.005&lt;/strong&gt; 달성.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;경로 추천 알고리즘:&lt;/strong&gt; 네이버 길찾기 API로 실제 주행 경로를 계산해, 예측 주행가능거리와 연동한 &lt;strong&gt;방향까지 고려한 충전소 추천&lt;/strong&gt;을 구현.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;End-to-end:&lt;/strong&gt; 데이터 수집(크롤링) → 주행가능거리 예측 → 경로 기반 추천 → 대시보드·모형 전기차 데모까지 전 과정을 완성.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --- --&gt;
&lt;!--
## 링크
- [GitHub — N4 AIoT Project](https://github.com/statjhw/N4-AIot-Project) --&gt;</description></item><item><title>지역별 태양광 발전량 예측 및 운영 솔루션</title><link>https://siuunni.github.io/projects/solar-ev-solution/</link><pubDate>Fri, 05 Dec 2025 00:00:00 +0000</pubDate><guid>https://siuunni.github.io/projects/solar-ev-solution/</guid><description>&lt;div style="display:grid;grid-template-columns:130px 1fr;gap:1rem 1.5rem;margin-bottom:2rem;"&gt;
&lt;div style="font-weight:700;"&gt;개요&lt;/div&gt;
&lt;div&gt;전국 17개 지역의 태양광 발전량을 예측하고, 패널 상태 진단 및 수익 예측을 제공하는 운영 솔루션을 개발한 프로젝트입니다.&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;대회·과정&lt;/div&gt;
&lt;div&gt;K-Software Empowerment BootCamp (KSEB) 3기 — 신세계 I&amp;C 기업협력 프로젝트 (팀 5명)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;담당 역할&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;팀장(PM) · 모델링 총괄&lt;/strong&gt; — 일정,역할 관리부터 전체 예측 모델링(날씨·발전량·패널 분류) 설계·구현을 담당&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;데이터&lt;/div&gt;
&lt;div&gt;전국 17개 지역 태양광 발전량·날씨 관측·예보 데이터 (2017–2023, 공공데이터포털·기상자료개방포털)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기술 스택&lt;/div&gt;
&lt;div&gt;Python · LightGBM · scikit-learn · TensorFlow/Keras · FastAPI · Streamlit · MySQL · AWS(EC2·RDS)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;성과&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;발전량 예측 RMSE ~10% 개선&lt;/strong&gt;, &lt;strong&gt;패널 상태 분류 정확도 85%&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="문제-정의"&gt;문제 정의&lt;/h2&gt;
&lt;p&gt;태양광 발전은 효율이 약 12%로 수력(80 ~ 90%),화력(45 ~ 50%),원자력(30 ~ 40%)에 비해 낮고, &lt;strong&gt;일사·일조·적운·적설 등 날씨에 크게 좌우&lt;/strong&gt;되어 발전량이 일정하지 않습니다. 재생에너지 3020 정책으로 발전소가 급증하는 가운데, 안정적 운영과 전력 거래를 위해서는 &lt;strong&gt;지역별 발전량 예측&lt;/strong&gt;이 필수적입니다.&lt;/p&gt;
&lt;p&gt;이 프로젝트는 전국 17개 지역의 태양광 발전량을 예측하고, 패널 상태 진단를 제공하는 운영 솔루션을 목표로 했습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="시스템-구조"&gt;시스템 구조&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;왜 날씨를 먼저 예측하고, 그 예측값으로 발전량을 예측했나?&lt;/strong&gt;
태양광 발전량은 일사량·일조시간 같은 &lt;strong&gt;관측 날씨&lt;/strong&gt;에 의해 결정됩니다. 그런데 우리가 알고 싶은 건 &lt;em&gt;미래&lt;/em&gt;의 발전량이고, 미래의 관측 날씨는 아직 존재하지 않습니다. 따라서 &lt;strong&gt;① 기상 예보로 미래의 관측 날씨를 먼저 예측 → ② 예측된 날씨로 미래 발전량을 예측&lt;/strong&gt;하는 2단계 구조를 설계했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;왜 패널 상태 분류까지 만들었나?&lt;/strong&gt;
발전량을 아무리 정확히 예측해도, 현장의 패널이 먼지,새똥,손상 등으로 제대로 관리되지 않으면 실제 발전량은 예측을 따라가지 못합니다. 따라서 예측을 &lt;strong&gt;운영·관리 시스템의 일부&lt;/strong&gt;로 완성하기 위해, 발전량이 예측보다 낮을 때 혹은 미리 패널 상태를 진단해 관리할 수 있도록 패널 상태 분류 모델을 함께 만들었습니다.&lt;/p&gt;
&lt;p&gt;이 두 가지 이유로 아래 &lt;strong&gt;3단계 파이프라인&lt;/strong&gt;을 설계했습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;날씨 예측&lt;/strong&gt; — 기상 예보 데이터로 미래의 관측 날씨(일사·일조 등)를 예측&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;발전량 예측&lt;/strong&gt; — 예측된 관측 날씨로 지역별 태양광 발전량을 예측&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;패널 상태 분류&lt;/strong&gt; &lt;em&gt;(관리)&lt;/em&gt; — 발전량이 예측보다 낮을 때 패널 상태를 진단해 원인을 파악&lt;/li&gt;
&lt;/ol&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/solar_pipeline.png"
alt="예측 파이프라인 다이어그램"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
예보 → 관측 날씨 예측 → 발전량 예측으로 이어지는 파이프라인 (패널 상태 분류는 관리·진단)
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="1-날씨-예측-모델"&gt;1. 날씨 예측 모델&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;목표:&lt;/strong&gt; 전날 17시에 발표되는 기상 예보를 입력으로, 다음날의 실제 &lt;strong&gt;관측 날씨&lt;/strong&gt;(일사,일조,습도,지면온도,기온,풍속 등)를 예측합니다. 발전량 예측의 입력이 되는 단계라 정확도가 전체 파이프라인의 토대가 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;기상청 매칭 &amp;amp; 변수 선별.&lt;/strong&gt; 발전소마다 위치가 다르므로, &lt;strong&gt;설비용량으로 가중한 위·경도&lt;/strong&gt;를 계산해 각 지역에서 가장 가까운 기상청을 매칭했습니다. 이후 발전량과 상관계수 절댓값 0.2 이상인 날씨 변수만 선별하고, 결측은 Random Forest 기반 반복 대치(Iterative Imputer)로, 전부 결측인 경우는 인접한 날짜 데이터로 보완했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 — 일사·일조량이 없는 지역의 직접 계산 + 구름 가중치 파생변수.&lt;/strong&gt;
일부 지역(울산,세종,경북 등)은 일사량 및 일조시간이 관측되지 않아, 발전량 예측의 가장 중요한 입력이 비어 있는 문제가 있었습니다. 이를 인접 지역 값으로 대체하면 정확도가 크게 떨어졌습니다. 그래서 &lt;strong&gt;물리적으로 직접 계산하는 방식&lt;/strong&gt;을 설계했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;위·경도 + 시간으로 이론적 일사량 계산:&lt;/strong&gt; 태양의 고도 및 방위는 위경도와 시각으로 결정되므로, 이를 이용해 &lt;em&gt;맑은 하늘 기준&lt;/em&gt; 이론적 일사량과 일조시간을 직접 산출했습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;구름 가림을 가중치로 반영:&lt;/strong&gt; 실제로는 구름이 햇빛을 가리므로, 그날의 하늘 상태를 가중치로 곱해 보정했습니다. 예보의 하늘 상태 코드별로 가중치를 부여했습니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;하늘 상태&lt;/th&gt;
&lt;th style="text-align: center"&gt;매우 맑음&lt;/th&gt;
&lt;th style="text-align: center"&gt;맑음&lt;/th&gt;
&lt;th style="text-align: center"&gt;구름 조금&lt;/th&gt;
&lt;th style="text-align: center"&gt;구름 많음&lt;/th&gt;
&lt;th style="text-align: center"&gt;흐림&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;가중치&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;1.0&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.8&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.5&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.3&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;→ &lt;strong&gt;조정된 일사량 = 이론적 일사량 × 하늘 상태 가중치&lt;/strong&gt; 로 파생변수를 생성해, 관측값이 없는 지역에서도 발전량 예측에 쓸 수 있는 입력을 확보했습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;모델 선택.&lt;/strong&gt; LSTM·LightGBM·XGBoost·Random Forest를 같은 데이터로 비교한 결과(서울 기준 RMSE), 기온,습도,일사량처럼 특성이 다른 변수들의 상호작용을 안정적으로 처리하는 &lt;strong&gt;Random Forest&lt;/strong&gt;가 가장 우수해 최종 채택했습니다. 학습에 한 번도 쓰지 않은 3일치 데이터에서도 일사 RMSE 0.1, 일조 RMSE 0.06으로 안정적인 성능을 보였습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/solar_weather_forecast.png"
alt="Random Forest 날씨 예측 결과 — 일사·일조·습도·지면온도·기온·풍속"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
학습에 사용하지 않은 기간의 날씨 변수별 실제(True) vs 예측(Predicted) 비교.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="2-태양광-발전량-예측-모델"&gt;2. 태양광 발전량 예측 모델&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;입력 설계.&lt;/strong&gt; 1단계에서 예측한 관측 날씨에, 태양광이 시계열 특성을 갖는다는 점을 반영해 피처를 추가했습니다. 날짜 피처(연.월.일.요일)에 더해, 발전량이 전날의 발전량·날씨에 영향받는다는 사실을 담은 &lt;strong&gt;과거 발전량(lag)·이동평균&lt;/strong&gt; 시계열 피처를 생성했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;왜 군집화 후 군집별로 모델을 만들었나.&lt;/strong&gt; 같은 전국 데이터라도 일사량·일조시간 수준에 따라 발전 패턴이 크게 달라집니다. 하나의 모델로 전 구간을 학습하면 평균적인 패턴에 묻혀 버리므로, 발전에 영향이 큰 &lt;strong&gt;일사량·일조시간을 기준으로 K-means 군집화&lt;/strong&gt;(Elbow로 군집 수를 3개로 최적화)한 뒤 &lt;strong&gt;각 군집마다 별도의 LightGBM&lt;/strong&gt;을 학습시켜, 발전 강도대별로 특화된 예측이 가능하도록 했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;왜 LightGBM인가.&lt;/strong&gt; 대규모 데이터에서도 학습이 빠르고, 결측 처리와 다양한 변수의 비선형 상호작용에 강하며, 과적합 방지에 장점이 있어 복잡한 시계열 특성을 가진 태양광 발전량 예측에 적합했습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/solar_cluster_result.png"
alt="군집별 LightGBM 발전량 예측 결과 (Cluster 0·1·2)"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
일사·일조 수준으로 나눈 3개 군집(Cluster 0·1·2) 각각에 LightGBM을 적용한 실제(Actual) vs 예측(Predicted) 결과. 발전 강도대별로 특화 학습해 각 구간에서 예측이 실제를 잘 따라갑니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;결과 — 데이터 품질에 따라 예측 성능이 갈렸다.&lt;/strong&gt; 시계열 피처와 군집별 모델 적용으로 서울시 기준 &lt;strong&gt;RMSE 0.57 → 0.52, MAE 0.38 → 0.33&lt;/strong&gt; 로 예측력이 약 &lt;strong&gt;10% 향상&lt;/strong&gt;됐고, 강원도(RMSE 18.62 → 15.67, MAE 12.26 → 10.04) 등 다른 지역에서도 비슷한 개선을 확인했습니다. 다만 &lt;strong&gt;대전처럼 데이터 품질이 낮은(일사 및 일조량이 관측되지 않아 인접 지역 값으로 대체한) 지역에서는 모델이 충분히 학습하지 못해 예측 성능이 낮았습니다.&lt;/strong&gt; 즉 같은 모델이라도 입력 데이터의 품질이 예측 정확도를 좌우했으며, 이 한계가 1단계에서 일사량을 직접 계산·보정한 이유와 직접 연결됩니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;div style="display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;align-items:start;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/solar_forecast_good.png"
alt="데이터 품질이 좋은 지역의 발전량 예측"
style="display:block;width:100%;height:auto;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.4rem;box-sizing:border-box;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/solar_forecast_mid.png"
alt="중간 품질 지역의 발전량 예측"
style="display:block;width:100%;height:auto;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.4rem;box-sizing:border-box;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/solar_forecast_bad.png"
alt="데이터 품질이 낮은 지역의 발전량 예측"
style="display:block;width:100%;height:auto;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.4rem;box-sizing:border-box;"&gt;
&lt;/div&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
학습에 사용하지 않은 기간의 실제(파랑) vs 예측(빨강) 발전량. &lt;strong&gt;데이터 품질이 좋을수록 예측이 실제와 거의 일치&lt;/strong&gt;하고, 품질이 낮은 지역일수록 오차가 커졌습니다.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="3-태양광-패널-상태-분류"&gt;3. 태양광 패널 상태 분류&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;왜 만들었나.&lt;/strong&gt; 발전량을 정확히 예측해도, 패널이 먼지,새똥,손상 등으로 관리되지 않으면 실제 발전량은 예측을 따라가지 못합니다. 그래서 &lt;strong&gt;&amp;ldquo;예측 발전량 vs 실제 발전량&amp;quot;의 괴리를 진단하는 관리 도구&lt;/strong&gt;로, 패널 상태를 분류하는 모델을 만들었습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;모델.&lt;/strong&gt; 패널 이미지를 &lt;strong&gt;DenseNet121&lt;/strong&gt;로 6개 상태(정상,새똥,먼지,전기적 결함,물리적 손상,눈 덮임)로 분류했습니다. 적은 데이터에서도 잘 작동하는 구조라 선택했고, 데이터 증강으로 다양한 상황에 강건하도록 학습했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;결과.&lt;/strong&gt; 전체 정확도 &lt;strong&gt;75% → (정제 테스트셋) 85%&lt;/strong&gt; 를 달성했으며, 눈 덮임(Snow-Covered) 클래스는 F1 0.93으로 특히 높은 성능을 보였습니다. 학습 곡선에서 Loss가 안정적으로 수렴해 과적합 없이 학습이 잘 이뤄졌습니다.&lt;/p&gt;
&lt;div style="display:grid;grid-template-columns:1fr 1fr;gap:1.25rem;align-items:stretch;margin:1.5rem 0;max-width:760px;"&gt;
&lt;figure style="margin:0;display:flex;flex-direction:column;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/solar_panel_training.png"
alt="DenseNet121 학습 곡선 (Training Loss &amp; Accuracy)"
style="display:block;width:100%;height:auto;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;box-sizing:border-box;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
학습 곡선 — Loss 안정 수렴
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class="compact-table"&gt;
&lt;style&gt;
.compact-table { display: flex; }
.compact-table table { margin: 0; font-size: .82rem; height: 100%; width: 100%; }
.compact-table th, .compact-table td { padding: .15rem .5rem !important; line-height: 1.25 !important; border: none !important; }
.compact-table tbody tr { border: none !important; }
&lt;/style&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;클래스&lt;/th&gt;
&lt;th style="text-align: center"&gt;P&lt;/th&gt;
&lt;th style="text-align: center"&gt;R&lt;/th&gt;
&lt;th style="text-align: center"&gt;F1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Bird-drop&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.68&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.85&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.76&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Clean&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.72&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.74&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Dusty&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.81&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.55&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.66&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Electrical-damage&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.71&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.79&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Physical-Damage&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.70&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.54&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Snow-Covered&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.89&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.96&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.93&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;Accuracy&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.75&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Macro avg&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.75&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.74&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.74&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Weighted avg&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.75&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.75&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.74&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="4-서비스화--배포"&gt;4. 서비스화 &amp;amp; 배포&lt;/h2&gt;
&lt;p&gt;예측 모델을 실제 사용 가능한 웹 솔루션으로 구현했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;백엔드:&lt;/strong&gt; FastAPI + SQLAlchemy로 MySQL(AWS RDS)과 연동, 하루 한 번 &lt;strong&gt;배치 처리&lt;/strong&gt;로 지역별 예측을 미리 계산·저장&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;프론트엔드:&lt;/strong&gt; Streamlit으로 17개 지역 지도·발전량 그래프·기간별 예측 제공&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;수익 예측:&lt;/strong&gt; 예상 발전량에 SMP(계통한계가격)·REC(신재생에너지공급인증서)를 곱해 &lt;strong&gt;예상 수익 = (SMP + REC) × 발전량&lt;/strong&gt; 산출&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;배포:&lt;/strong&gt; AWS EC2(백엔드+Streamlit 통합 호스팅), RDS(MySQL)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="pm으로서의-기여"&gt;PM으로서의 기여&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;모델링 총괄:&lt;/strong&gt; 날씨 예측 → 발전량 예측 → 패널 분류로 이어지는 전체 ML 파이프라인을 직접 설계·구현했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;일정·역할 관리:&lt;/strong&gt; 프론트엔드·백엔드·도메인 조사로 나뉜 5인 팀의 작업을 조율하고, 모델·서비스·배포가 한 흐름으로 통합되도록 관리했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;확장 비전:&lt;/strong&gt; IoT·디지털 트윈과 결합한 AIoT 생태계로의 확장 방향을 제시했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- ---
## 링크
- [GitHub — AI/모델링](https://github.com/white9812/notimportant_ai)
- [GitHub — Web](https://github.com/statjhw/SunForecastWeb) --&gt;</description></item><item><title>LG Aimers 6기: 난임 시술 임신 성공률 예측</title><link>https://siuunni.github.io/projects/lg-aimers/</link><pubDate>Sat, 06 Dec 2025 00:00:00 +0000</pubDate><guid>https://siuunni.github.io/projects/lg-aimers/</guid><description>&lt;div style="display:grid;grid-template-columns:130px 1fr;gap:1rem 1.5rem;margin-bottom:2rem;"&gt;
&lt;div style="font-weight:700;"&gt;개요&lt;/div&gt;
&lt;div&gt;난임 환자 시술 데이터로 임신 성공을 예측하는 LG Aimers 6기 해커톤 프로젝트입니다. 예선과 본선의 평가 방식 차이에 맞춰 모델 전략을 다르게 설계했습니다.&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;대회&lt;/div&gt;
&lt;div&gt;LG Aimers 6기 — 난임 환자 대상 임신 성공 예측 AI 온라인 해커톤 (팀 간지포s)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기간&lt;/div&gt;
&lt;div&gt;2024.01 ~ 2024.05&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;데이터&lt;/div&gt;
&lt;div&gt;난임 환자 IVF(체외수정) 시술 데이터 (배아·난자 상태, 연령, 시술 이력 등)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기술 스택&lt;/div&gt;
&lt;div&gt;Python · CatBoost · LightGBM · AutoGluon · Optuna · scikit-learn · pandas&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;성과&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;예선 0.70 → 0.74&lt;/strong&gt;로 본선 진출, &lt;strong&gt;본선 0.64 → 0.66&lt;/strong&gt; 개선, &lt;strong&gt;최종 7위&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="문제-정의"&gt;문제 정의&lt;/h2&gt;
&lt;p&gt;난임 환자의 IVF 시술 데이터를 바탕으로 &lt;strong&gt;임신 성공&lt;/strong&gt;을 예측하는 과제입니다. 정밀한 예측은 의료진의 임상 의사결정과 환자 상담을 보조할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;예선과 본선의 예측 대상(target)과 평가 방식이 달라&lt;/strong&gt;, 이에 맞춰 모델링 전략을 완전히 다르게 가져갔습니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;&lt;/th&gt;
&lt;th style="text-align: left"&gt;예선&lt;/th&gt;
&lt;th style="text-align: left"&gt;본선&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;예측 대상&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;임신 성공 &lt;strong&gt;여부 (0 또는 1)&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;임신 성공 &lt;strong&gt;확률 (0~1 연속값)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;문제 유형&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;이진 분류&lt;/td&gt;
&lt;td style="text-align: left"&gt;확률 회귀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;평가 지표&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;ROC-AUC&lt;/td&gt;
&lt;td style="text-align: left"&gt;Weighted Brier + F1 혼합 Score&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;핵심 전략&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;CatBoost + AutoGluon 앙상블&lt;/td&gt;
&lt;td style="text-align: left"&gt;가중치 손실 설계 + Stacking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="공통--데이터-전처리--파생변수"&gt;공통 — 데이터 전처리 &amp;amp; 파생변수&lt;/h2&gt;
&lt;p&gt;두 라운드 모두 의미 있는 파생변수 설계에 집중했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;문자열 → 수치 변환:&lt;/strong&gt; &lt;code&gt;&amp;quot;0회&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;1-5회&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;&amp;gt;20&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;6회 이상&amp;quot;&lt;/code&gt; 같은 범위형 문자열을 중앙값 추정 또는 기준값+1 방식으로 수치화했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;결측치 처리:&lt;/strong&gt; NaN을 대체하고 결측 존재 여부 플래그를 추가했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비율·상호작용 변수:&lt;/strong&gt; 단순 수치 대신 의미 있는 파생변수를 생성했습니다.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;배아 관련:&lt;/strong&gt; 배아 이식 비율, ICSI(미세주입) 배아 비율, 배아 저장 비율, 배아 품질 지표&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;난자 관련:&lt;/strong&gt; 난자 수정시도 비율, 난자 배아 생성 성공률, 신선/해동 난자 여부&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;시술·연령 관련:&lt;/strong&gt; 이전 시술 총 횟수, 시술 경험 점수, 고위험 연령군, 연령 가중치, 이식 후 적정기간&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;상관관계 분석으로 임신 성공에 유의미한 핵심 변수를 선별했습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/lg_correlation.png"
alt="임신 성공 확률과 상관관계가 높은 상위 30개 변수"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
임신 성공 확률과의 상관계수 상위 30개 변수 (초록: 양의 상관, 빨강: 음의 상관)
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="예선--임신-성공-여부-이진-분류"&gt;예선 — 임신 성공 여부 (이진 분류)&lt;/h2&gt;
&lt;p&gt;예선은 임신 성공을 &lt;strong&gt;0/1 이진 분류&lt;/strong&gt;로 예측하고 &lt;strong&gt;ROC-AUC&lt;/strong&gt;로 평가했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CatBoost + Optuna:&lt;/strong&gt; 범주형 변수 처리에 강한 CatBoost를 사용하고, Optuna로 8개 하이퍼파라미터를 Stratified 5-Fold 교차검증 기반으로 튜닝했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AutoGluon:&lt;/strong&gt; TabularPredictor로 다양한 모델을 자동 탐색(HPO)해 예측 확률을 얻었습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weighted mean 앙상블:&lt;/strong&gt; 두 모델의 예측을 가중평균해 최종 확률을 산출했습니다.&lt;/li&gt;
&lt;/ul&gt;
$$\hat{y} = \frac{\text{CatBoost} + 2 \times \text{AutoGluon}}{3}$$&lt;p&gt;→ 단일 모델 대비 앙상블로 &lt;strong&gt;점수 0.70에서 0.74로 향상&lt;/strong&gt;, 본선에 진출했습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="본선--임신-성공-확률-회귀"&gt;본선 — 임신 성공 확률 (회귀)&lt;/h2&gt;
&lt;p&gt;본선은 임신 성공을 &lt;strong&gt;0~1 사이 연속 확률&lt;/strong&gt;로 예측해야 했고, &lt;strong&gt;평가 지표 자체가 바뀌었습니다.&lt;/strong&gt; 단순 정밀도가 아니라 &lt;strong&gt;확률 정확도(Weighted Brier)와 이진 분류 성능(F1)을 절반씩 섞은 점수&lt;/strong&gt;였습니다.&lt;/p&gt;
$$\text{Score} = 0.5 \times \left(1 - \frac{\sum w_i (y_i - \hat{y}_i)^2}{\sum w_i}\right) + 0.5 \times \frac{2TP}{2TP + FP + FN}$$&lt;p&gt;이 지표에 맞춰 두 가지 전략을 새로 설계했습니다.&lt;/p&gt;
&lt;h3 id="1-가중치-기반-손실-설계"&gt;1. 가중치 기반 손실 설계&lt;/h3&gt;
&lt;p&gt;평가식의 가중치 $w_i = 1 + 4y_i + (0.5 - y_i)^2$ 를 학습 손실에 반영해, &lt;strong&gt;임상적으로 중요한 임신 성공(희귀 클래스) 케이스에 더 민감하게&lt;/strong&gt; 반응하도록 유도했습니다. 예측값은 확률로 출력 가능하도록 Calibration 친화적인 모델을 사용했습니다.&lt;/p&gt;
&lt;h3 id="2-catboost--lightgbm-stacking"&gt;2. CatBoost + LightGBM Stacking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stage 1:&lt;/strong&gt; CatBoost로 예측값과 잔차(residual)를 계산&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stage 2:&lt;/strong&gt; CatBoost 출력값 + 잔차를 LightGBM의 입력으로 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CatBoost의 범주형 처리·일반화 능력에 더해, LightGBM이 예측 오류 영역을 보완하도록 했습니다. 마지막으로 Stacking 예측을 CatBoost 단독 예측으로 보정하는 Ensemble 비율을 실험적으로 탐색해 &lt;strong&gt;최적 비율(n=3)&lt;/strong&gt; 을 도출했습니다.&lt;/p&gt;
$$\hat{y}_{final} = \frac{n \cdot \hat{y}_{stacking} + \hat{y}_{catboost}}{n + 1}, \quad n = 3$$&lt;p&gt;→ 본선 &lt;strong&gt;점수 0.64에서 0.66으로 개선&lt;/strong&gt;, &lt;strong&gt;최종 7위&lt;/strong&gt;를 달성했습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="핵심-요약"&gt;핵심 요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;평가 방식에 맞춘 모델 설계:&lt;/strong&gt; 예선(이진 분류·ROC-AUC)과 본선(확률 회귀·가중 혼합 Score)의 차이를 정확히 반영해 전략을 분리했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;본선의 핵심 기여:&lt;/strong&gt; 평가식의 가중치를 손실 함수에 직접 반영하고, CatBoost+LightGBM Stacking으로 예측 성능과 안정성을 동시에 확보했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;해석 가능성:&lt;/strong&gt; 의학적 맥락에 맞춘 비율·상호작용 파생변수로 해석 가능한 예측 구조를 설계했습니다.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>대구 빅데이터 분석 경진대회: IT/SW 기업 성장성 판단</title><link>https://siuunni.github.io/projects/daegu-bigdata/</link><pubDate>Thu, 04 Dec 2025 00:00:00 +0000</pubDate><guid>https://siuunni.github.io/projects/daegu-bigdata/</guid><description>&lt;div style="display:grid;grid-template-columns:130px 1fr;gap:1rem 1.5rem;margin-bottom:2rem;"&gt;
&lt;div style="font-weight:700;"&gt;개요&lt;/div&gt;
&lt;div&gt;기업의 성장 잠재력을 정량적으로 파악해 전략적 기업 대출(여신) 기준을 제안한 빅데이터 분석 프로젝트입니다.&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;대회&lt;/div&gt;
&lt;div&gt;제5회 대구 빅데이터 분석 경진대회 — &lt;strong&gt;우수상 수상&lt;/strong&gt;&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기간&lt;/div&gt;
&lt;div&gt;2023.05~2023.08&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;데이터&lt;/div&gt;
&lt;div&gt;IT/SW기업 생태계 실태조사, 대구·경북 ITSW기업, 현대카드·대구BC카드 매출, 시장금리(KOSIS)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기술 스택&lt;/div&gt;
&lt;div&gt;Python · R · pandas · NumPy · scikit-learn · statsmodels · missingpy&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;성과&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Random Forest 회귀 RMSE 0.0269&lt;/strong&gt; 달성&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="문제-정의"&gt;문제 정의&lt;/h2&gt;
&lt;p&gt;대구·경북 지역 예금은행의 기업 대출은 특정 서비스업에 집중되어, 성장 잠재력이 높은 IT/SW·벤처 기업에 자금이 충분히 공급되지 못하는 &lt;strong&gt;자금 배분 비효율&lt;/strong&gt; 문제가 있었습니다.&lt;/p&gt;
&lt;p&gt;기존 여신 심사는 최근 3개년 재무제표·담보 중심이라 &lt;strong&gt;미래 성장 잠재력을 반영하지 못합니다.&lt;/strong&gt; 본 프로젝트는 신용 서류에 드러나지 않는 요인까지 반영해 &lt;strong&gt;성장 잠재력 기반의 새로운 여신 기준&lt;/strong&gt;을 제안합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="접근-방법"&gt;접근 방법&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;카드 매출 분석&lt;/strong&gt; — 현대카드·대구BC카드 데이터로 IT/비IT 산업의 매출액 증감률을 시장금리와 함께 분석해 산업 성장성을 파악합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;성장 업종 추출&lt;/strong&gt; — 한국 산업 평균 증감률보다 높은 업종(정보통신업, 전문·과학·기술 서비스업)을 선별합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;성장 잠재력 예측 모델&lt;/strong&gt; — 기업 데이터를 통합해 &lt;em&gt;매출액 대비 연구개발비 투자금액&lt;/em&gt; 파생변수를 종속변수로, 성장성 관련 요인을 독립변수로 하는 회귀 모델을 구축합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="카드-데이터-분석--산업별-매출-성장성"&gt;카드 데이터 분석 — 산업별 매출 성장성&lt;/h2&gt;
&lt;p&gt;5년간(2017–2021) 카드 매출을 월별로 집계해 IT/비IT 산업의 매출액 증감률을 시장금리 추세와 비교했습니다. 팬데믹 이후 두 산업 모두 매출이 감소했으나, &lt;strong&gt;비IT 산업(관광·여가)의 감소폭이 더 컸습니다.&lt;/strong&gt;&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/daegu_sales_growth.png"
alt="IT산업과 비IT산업의 매출액 증감률 및 시장금리 추세"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
IT산업·비IT산업의 매출액 증감률과 시장금리 추세 (2017–2021)
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="데이터-전처리--파생변수"&gt;데이터 전처리 &amp;amp; 파생변수&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터 통합:&lt;/strong&gt; 사업자등록번호를 기준으로 여러 기업 데이터를 병합하고, 범주형·논리형 자료를 정수형으로 처리했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;결측치 대치:&lt;/strong&gt; 무응답·결측이 많은 변수를 &lt;strong&gt;MissForest&lt;/strong&gt;(Random Forest 기반 반복 대치)로 보완했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;종속변수 설계:&lt;/strong&gt; 기업가치평가의 가중평균자본비용(WACC) 개념을 차용해, &lt;em&gt;매출액 대비 연구개발비 투자금액&lt;/em&gt;의 연도별 변화율에 가중치(0.4 / 0.6)를 부여한 성장성 지표를 만들었습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;독립변수:&lt;/strong&gt; 기업부설 연구소 유무, 특허 등록·출원 건수, SW 융합 기술 분야별 시장 전망 등 신용 서류에 없는 변수를 활용했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="차원-축소--적합성-검정"&gt;차원 축소 &amp;amp; 적합성 검정&lt;/h2&gt;
&lt;p&gt;변수 구조를 단순화하기 위해 &lt;strong&gt;주성분 분석(PCA)&lt;/strong&gt; 과 &lt;strong&gt;요인 분석&lt;/strong&gt;을 수행했습니다. 누적 분산 설명력이 약 99%에 도달하는 지점을 참고해 차원을 결정했습니다.&lt;/p&gt;
&lt;figure style="margin:1.5rem 0;"&gt;
&lt;img src="https://siuunni.github.io/uploads/papers/daegu_pca_scree.png"
alt="PCA scree plot과 누적 분산 설명력"
style="width:100%;border-radius:8px;border:1px solid rgba(148,163,184,.25);background:#fff;padding:.5rem;"&gt;
&lt;figcaption style="font-size:.8rem;color:#94a3b8;margin-top:.5rem;text-align:center;"&gt;
PCA scree plot(좌)과 누적 분산 설명력(우)
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;요인 분석 적합성은 &lt;strong&gt;Bartlett 검정&lt;/strong&gt;(p-value ≈ 0.0)과 &lt;strong&gt;KMO 검정&lt;/strong&gt;(≈ 0.66)으로 확인해, 요인 분석이 적합하다는 결론을 얻었습니다. 요인 적재량을 기준으로 특허 관련, 데이터 산업, 기기·차량 산업, 연구소, 의료 산업 등 &lt;strong&gt;5개의 해석 가능한 feature&lt;/strong&gt;를 도출했습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="회귀-모델"&gt;회귀 모델&lt;/h2&gt;
&lt;p&gt;도출한 5개 feature를 독립변수로, &lt;em&gt;매출액 대비 연구개발비 투자금액&lt;/em&gt;을 종속변수로 하여 여러 회귀 방법을 비교했습니다. &lt;strong&gt;Random Forest 회귀&lt;/strong&gt;가 가장 우수했습니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center"&gt;n_estimators&lt;/th&gt;
&lt;th style="text-align: center"&gt;max_features&lt;/th&gt;
&lt;th style="text-align: center"&gt;max_depth&lt;/th&gt;
&lt;th style="text-align: center"&gt;RMSE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;10&lt;/td&gt;
&lt;td style="text-align: center"&gt;2&lt;/td&gt;
&lt;td style="text-align: center"&gt;10&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.0292&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;strong&gt;0.0269&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;1000&lt;/td&gt;
&lt;td style="text-align: center"&gt;2&lt;/td&gt;
&lt;td style="text-align: center"&gt;50&lt;/td&gt;
&lt;td style="text-align: center"&gt;0.0306&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;최적 모델은 검증 데이터에서 &lt;strong&gt;RMSE 약 0.0269&lt;/strong&gt; 로 가장 낮은 오차를 보였습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="기대-효과"&gt;기대 효과&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;객관적 성장성 평가:&lt;/strong&gt; 재무 상태가 약하지만 성장 잠재력이 높은 기업을 정량 지표로 발굴해, 은행이 투명·안전하게 자금을 공급할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;지역 경제 활성화:&lt;/strong&gt; R&amp;amp;D 프로젝트의 잠재 가치를 반영한 기업 맞춤형 대출로 산업 발전과 혁신을 촉진합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;윈-윈 구조:&lt;/strong&gt; 기업은 자금을 확보해 성장하고, 은행은 신규 고객 확보·신용평가 개선·장기 투자 수익을 얻습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>가짜연구소 인과추론 팀 10기 — 실무 인과추론 기법 학습·적용</title><link>https://siuunni.github.io/projects/causal-10/</link><pubDate>Tue, 02 Dec 2025 00:00:00 +0000</pubDate><guid>https://siuunni.github.io/projects/causal-10/</guid><description>&lt;div style="display:grid;grid-template-columns:130px 1fr;gap:1rem 1.5rem;margin-bottom:2rem;"&gt;
&lt;div style="font-weight:700;"&gt;개요&lt;/div&gt;
&lt;div&gt;『실무로 배우는 인과추론 with Python』을 함께 공부하며, 인과추론 핵심 기법을 Synthetic 데이터와 실무형 예제로 직접 구현·비교한 스터디 프로젝트입니다.&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;활동&lt;/div&gt;
&lt;div&gt;가짜연구소 10기 인과추론 팀 (오픈소스 협업 스터디)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기간&lt;/div&gt;
&lt;div&gt;2025.03~2025.08&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;담당 역할&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;대안적 실험설계 파트 발표 · 분석 코드 제작 및 업로드&lt;/strong&gt; (기여도 15%)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기술 스택&lt;/div&gt;
&lt;div&gt;Python · pandas · NumPy · scikit-learn · CausalML · Git/GitHub&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;성과&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;가짜연구소 10기 Project of the Season 수상&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="무엇을-왜-했나"&gt;무엇을, 왜 했나&lt;/h2&gt;
&lt;p&gt;상관관계만으로는 &amp;ldquo;이 처치가 정말 결과를 바꿨는가&amp;quot;를 답할 수 없습니다. 인과추론은 바로 그 질문에 답하기 위한 방법론으로, 마케팅·의료·정책 등 실무에서 의사결정의 근거가 됩니다. 다만 이론서만으로는 실제 데이터에 적용했을 때의 감을 잡기 어렵기 때문에, &lt;strong&gt;이론을 공부하는 데 그치지 않고 직접 데이터에 적용해 실용성을 확인&lt;/strong&gt;하는 것을 목표로 삼았습니다.&lt;/p&gt;
&lt;p&gt;저는 책의 &lt;strong&gt;대안적 실험설계&lt;/strong&gt; 파트를 맡아 발표했고, 주요 기법들의 분석 코드를 직접 작성해 공유했습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="다룬-기법"&gt;다룬 기법&lt;/h2&gt;
&lt;p&gt;처치효과를 추정하는 서로 다른 접근들을 하나씩 구현하며, 어떤 상황에 어떤 방법이 맞는지를 비교했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Synthetic 데이터 실습:&lt;/strong&gt; 정답(true effect)을 아는 가상 데이터를 만들어, 각 기법이 실제 인과효과를 얼마나 잘 복원하는지 검증했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uplift Tree:&lt;/strong&gt; 처치에 대한 &lt;strong&gt;고객 반응 차이&lt;/strong&gt;를 세분화해, 처치가 효과적인 집단과 그렇지 않은 집단을 구분했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CEVAE:&lt;/strong&gt; 관측되지 않은 &lt;strong&gt;잠재 교란 변수&lt;/strong&gt;를 보정하는 인과 추론 모델을 실습했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;도구변수(IV)·2SLS:&lt;/strong&gt; 내생성 문제가 있을 때 도구변수와 2단계 최소제곱법으로 인과효과를 추정했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meta-learner 비교:&lt;/strong&gt; S·T·X-learner 등 메타러너 계열의 처치효과 추정 성능을 비교했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DragonNet vs Meta-learner:&lt;/strong&gt; 신경망 기반 DragonNet과 메타러너의 추정 성능을 정량적으로 비교 분석했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="핵심-요약"&gt;핵심 요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;이론 → 적용:&lt;/strong&gt; 책으로 배운 인과추론 기법을 Synthetic·실무형 데이터에 직접 적용해 실용성을 확인했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;다양한 기법 비교:&lt;/strong&gt; Uplift Tree·CEVAE·IV/2SLS·Meta-learner·DragonNet을 한 흐름 안에서 비교해, 상황별 적합한 방법을 정리했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;오픈소스 기여:&lt;/strong&gt; 대안적 실험설계 파트 발표와 분석 코드 업로드로 팀 결과물에 기여했고, &lt;strong&gt;10기 Project of the Season&lt;/strong&gt;을 수상했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>가짜연구소 인과추론 팀 11기 — Python DiD 코드집 배포</title><link>https://siuunni.github.io/projects/causal-11/</link><pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate><guid>https://siuunni.github.io/projects/causal-11/</guid><description>&lt;div style="display:grid;grid-template-columns:130px 1fr;gap:1rem 1.5rem;margin-bottom:2rem;"&gt;
&lt;div style="font-weight:700;"&gt;개요&lt;/div&gt;
&lt;div&gt;흩어져 있던 다양한 DiD(이중차분) 방법론을 Python 코드로 통합·정리해, 누구나 바로 따라 쓸 수 있는 인과추론 코드집으로 만들어 배포한 프로젝트입니다.&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;활동&lt;/div&gt;
&lt;div&gt;가짜연구소 11기 인과추론 팀 (오픈소스 코드집 제작·배포)&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;활동&lt;/div&gt;
&lt;div&gt;2025.09~2025.12&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;담당 역할&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;DiD 파트 코드 제작 (기여도 85%) · 팀원 코드 리뷰 (15%)&lt;/strong&gt;&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기술 스택&lt;/div&gt;
&lt;div&gt;Python · pandas · NumPy · statsmodels · linearmodels · DoubleML · LightGBM · Git/GitHub&lt;/div&gt;
&lt;div style="font-weight:700;"&gt;기대 효과&lt;/div&gt;
&lt;div&gt;R 중심이던 인과추론 학습을 &lt;strong&gt;Python으로 확장&lt;/strong&gt;하고, 여러 DiD 방법을 한곳에 통합해 재현성·학습 효율 향상&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="무엇을-왜-했나"&gt;무엇을, 왜 했나&lt;/h2&gt;
&lt;p&gt;DiD(Difference-in-Differences)는 정책·처치의 효과를 추정하는 대표적인 인과추론 방법이지만, 막상 공부하려 하면 &lt;strong&gt;자료가 대부분 R 중심&lt;/strong&gt;이라 Python 사용자에게는 진입 장벽이 높았습니다. 게다가 Basic DiD부터 최신 Staggered DiD·머신러닝 DiD까지 방법론이 흩어져 있어, 한눈에 비교하며 배우기 어려웠습니다.&lt;/p&gt;
&lt;p&gt;그래서 &lt;strong&gt;다양한 DiD 방법론을 Python으로 일관되게 구현하고, 한 저장소에 통합해 배포&lt;/strong&gt;하기로 했습니다. 저는 그중 &lt;strong&gt;DiD 파트 코드 제작을 주도&lt;/strong&gt;했습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="작업-내용"&gt;작업 내용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;데이터 준비:&lt;/strong&gt; 지역 단위 패널데이터를 전처리하고, 처치 전후 구간을 구분해 모든 방법론이 공통으로 쓸 수 있는 형태로 정리했습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DiD 방법론 구현·비교:&lt;/strong&gt; 아래 방법들을 같은 데이터 위에서 구현해 결과를 비교했습니다.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Basic DiD&lt;/strong&gt; — 가장 기본적인 2×2 이중차분&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;회귀 기반 DiD&lt;/strong&gt; — 회귀식으로 표현한 DiD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TWFE&lt;/strong&gt; — 양방향 고정효과 모형&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DRDiD&lt;/strong&gt; — 이중 강건(Doubly Robust) DiD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Staggered DiD&lt;/strong&gt; — 처치 시점이 집단마다 다른 경우를 보정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event Study&lt;/strong&gt; — 처치 전후 시점별 동적 효과 추정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DoubleML&lt;/strong&gt; — 머신러닝으로 교란을 통제하는 이중 머신러닝&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LightGBM 기반 ML DiD&lt;/strong&gt; — 부스팅 모델을 결합한 DiD&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;코드 리뷰·배포:&lt;/strong&gt; DiD 파트 코드를 제작하고 팀원 코드를 리뷰한 뒤, Python 인과추론 코드집으로 정리해 GitHub에 공개 배포했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="핵심-요약"&gt;핵심 요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python으로의 확장:&lt;/strong&gt; R 위주이던 인과추론 학습 자료를 Python으로 옮겨, Python 사용자의 진입 장벽을 낮췄습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;방법론 통합:&lt;/strong&gt; Basic·TWFE·Staggered·DoubleML·ML DiD까지 8가지 방법을 한 저장소에 모아, 재현성과 학습 효율을 높였습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주도적 기여:&lt;/strong&gt; DiD 파트 코드 제작(85%)을 주도하고 팀원 코드를 리뷰해, 배포 가능한 오픈소스 코드집으로 완성했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>