<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Time Series | Sieun Kim Portfolio</title><link>https://siuunni.github.io/tags/time-series/</link><atom:link href="https://siuunni.github.io/tags/time-series/index.xml" rel="self" type="application/rss+xml"/><description>Time Series</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>ko-kr</language><lastBuildDate>Fri, 12 Dec 2025 00:00:00 +0000</lastBuildDate><image><url>https://siuunni.github.io/media/icon_hu_1c0e9cb08cfb822a.png</url><title>Time Series</title><link>https://siuunni.github.io/tags/time-series/</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/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></channel></rss>