회사에서는 당장 필요한 기술을 만들다 보니 모델을 공부하는 일들이 적어져, 개별적으로 공부 겸 다양한 데이터 사례도 다뤄볼 겸 오픈 소스 데이터를 활용해보기로 하였다. 오늘은 ML 예측 모델을 활용하여 오픈소스를 활용한 사례를 소개하고자한다. 오늘의 주제는 리튬이온 배터리의 SoC를 예측하는 것이다. 데이터는 캐글(Kaggle)에서 발췌하였다.

 

원본 데이터 : Kaggle 활용하기

https://www.kaggle.com/code/dhakalamrit/lithium-ion-battery-state-of-charge-estimation

 

Lithium ion Battery State of Charge estimation

Explore and run machine learning code with Kaggle Notebooks | Using data from LG 18650HG2 Li-ion Battery Data

www.kaggle.com

관련 실험은 캐나다의 McMaster University 대학의 Dr. Phillip Kollmeyer가 수행해주셨다고한다. 감사합니다 :-)

 

데이터 대상 : LG 18650 HG2

LG 18650HG2

 

데이터 분석을 하기 위해서는 사전 데이터 정보의 파악이 중요하다. Kaggle에 따르면, 해당 데이터는 LG 18650HG2의 리튬이온 배터리 데이터라고 하는데, 아래 그림과 같이 원통형 배터리이다. (대개의 경우, 자동차 배터리는 테슬라를 제외하고는 파우치 배터리를 사용하고 원통형 배터리의 경우 소형 가전에 주로 사용된다. 테슬라의 경우에는 원통형 배터리를 사용하기도한다. 18650일 경우 앞의 두자리가 직경인 18mm, 높이가 65mm이다. 18650은 가장 흔하게 구할 수 있는 원통형 배터리 중 하나일 것이다.)

 

배터리를 실험하려면, Chamber라는 갇힌 박스 같은 공간에서 소위 전선을 연결하여 계측되는데, 해당 테스트 장비로는 (Digatron Firing Circuits Universal Battery Tester)로, 전압과 전류 정확도는 최대 값의 0.1%라고 한다. ML 모델을 만들어도 해당 오차는 감안해야한다는 의미이다.

 

데이터 구성

데이터 파일은 아래와 같이 구성되어 있는데, 온도에 따라 실험한 데이터가 개별적으로 수행되어있다. 오늘의 주제는 배터리의 SoC(State of Charge)인 즉 충전 상태를 예측하는 것인데, 쉽게 설명하자면 배터리 회사에서 제조한 초기 정격 용량 이 배터리에서는 3Ah (Nominal Capacity) 대비 충전이 얼마나 되어있는지를 나타내는 지표라고 할 수 있다.

이러한 SoC는 온도에 민감하게 반응하는데, 이유는 배터리는 아주 전기화학적인 장치라 반응 속도와 내부 저항에 큰 영향을 미쳐 전압 및 용량 특성이 변화하기 때문이다. 따라서, 저온에서는 전압이 더욱 낮게 나타날 수 있으며, SoC가 실제보다 낮게 측정될 가능성이 있고, 고온에서도 SoC가 더 높게 측정될 가능성이 있다.

따라서, 향후 온도는 SoC를 예측모델을 만들기 위한 입력 변수가 될 것이다.

 

Kaggle 데이터 구성

 

본격적으로 데이터에 들어가기에 앞서 Readme에 적힌 데이터 열 정보와 시간 간격, 테스트 정보를 파악해보자.

데이터의 시간 간격은 테스트 별로 상이한데, 드라이브 사이클 등 중요한 테스트는 0.1초 시간 간격으로, 충전 및 대기 등 비교적 중요하지 않은 테스트는 더 낮은 데이터 속도로 저장되었다고 한다. 데이터 속도의 차이를 고려해 필요시 업샘플링을 수행해아할 수 있으며, 파일의 샘플링 속도는 가변적이므로 매개변수에 따라 시간 축을 사전에 전처리해야할 필요가 있어보인다.

데이터 열의 정보는 아래와 같다.

Name Description Units
Time 시간
TimeStamp 타임스탬프 MM/DD/YYYY HH:MM:SS AM 형식
Voltage 셀 단자 전압(배터리 단자에 직접 연결된 센스 리드로 측정) V
Current 전류 A
Ah 용량 (충전, 테스트, 또는 드라이브 사이클 후 초기화) Ah 
Wh 와트-시간(충전, 테스트, 또는 드라이브 사이클 후 초기화) Wh
Power 전력 W
Batter_Temp_degC 배터리 중간 케이스 온도(AD592 온도 센서로 ±1℃ 정확도로 측정)

 

파일은 매트랩으로 구성된 파일 .mat과 .csv 파일 모두 동일한 형식이며, 파일명의 테스트 번호와 설명이 라벨링되어 있어 참조할 수 있다. 예시로 "555_Dis_2C.csv"는 테스트번호 555 이며 2C 방전(Discharge)을 의미한다고 한다.

 

여기서 2C는 방전 속도를 의미하는데, 배터리 용량을 한번 풀 충전하는 속도를 C-rate로 표기한다. 배터리의 정격 용량이 3Ah인 배터리의 경우, 1C로 방전한다고 하면 3A의 전류로 방전할때 1시간이 걸린다는 의미이다. 즉, 2C의 경우에는 6A로 방전한다는 의미이고, 2C 속도에서 배터리를 완전히 방전하려면 이론적으로 0.5시간(30분)이 걸린다는 의미이다.

 

테스트 설명

테스트는 서로 다른 온도 조건에서 수행되었으며, 펄스 방전 HPPC 테스트, C/20 충방전 테스트, 방전테스트, 드라이브 사이클테스트, 혼합 드라이브 사이클 테스트, 온도별 테스트 등 다양한 테스트가 반복되었다. 이는 탐색적 데이터 분석 EDA(Exploration Data Analysis) 을 수행하며 보다 자세하게 다뤄보기로 한다.

 

 

관련 일을 시작하면서, 경험들이 하나 둘 씩 누적되기 시작하였다.

학위를 졸업하고

첫 번째 회사에서 일하면서,

그리고 현 직장에 이직을 하면서,

 

나는 줄곧 현재 내가 서있는 위치가 어디인지 되돌아보면서

앞으로의 행동을 계획할 필요가 있다.

 

틈틈히 내가 했던 프로젝트를 정리하고 관련 기술들을 정리하면서

부족한 기술이 무엇이며 회고를 하곤하는데

최근에는 막연하게 떠오르지않는 키워드들을

ChatGPT를 통해 키워드를 모색하거나,

Naptune AI를 통해서 이미지 시각화를 통해 도움을 받았다.

 

https://neptune.ai/

 

neptune.ai | Experiment tracker purpose-built for foundation models

Monitor thousands of per-layer metrics—losses, gradients, and activations—at any scale. Visualize them with no lag and no missed spikes. Drill down into logs and debug training issues fast.

neptune.ai

 

간단하게 Request Trail을 눌러보면, 일부 이미지를 체험판으로 제공받을 수 있다.

 

Neptune.AI를 활용한 키워드 시각화 예시

 

Python으로 API를 받아, 학습용 이미지 생성에도 활용할 수 있을 것으로 보이는데, 유료 서비스도 매력적인 아이템이 될 수 있을 것으로 보인다.

index = [
    ["group_01", [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10]],
    ["group_02", [ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]],
    ["group_03", [ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]]]
    
for i, Grouping in enumerate(index):
    print("i:",i,"Grouping : ", Grouping)

 

i: 0 Grouping : ['group_01', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]

i: 1 Grouping : ['group_02', [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]]

i: 2 Grouping : ['group_03', [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]]

빅데이터분석기사를 준비하면서, 새로워진 작업 3 유형의 t-test를 연습해보고자하였다.

작업 3유형을 공부한다면, 아래 데이터와 문제를 활용해서 한번 연습해보는 것을 추천한다.

기사를 공부하는 이들에게 도움이 되고자 작성한다. 아래는 예제와 풀이이다.

 

데이터 다운로드

blood_pressure.csv
0.00MB


 

 

문제

 

주어진 데이터(data/blood_pressure.csv)에 고혈압 환자 120명의 치료 전후의 혈압이 저장되어 있다. 
해당 치료가 효과가 있는지 (즉, 치료 후의 혈압이 감소했는지) 쌍체표본 t-검정(paried t-test)를 통해 답하고자 한다.

가설은 아래와 같다.
Ud (치료 후 혈압 – 치료 전 혈압)의 평균
H0 : Ud >=0
H1 : Ud < 0

bp_before : 치료전 혈압
bp_after : 치료 후 혈압

1) Ud의 표본 평균을 입력하시오. (반올림하여 소수점 둘째자리까지 계산)
2) 위의 가설을 검정하기 위한 검정통계량을 입력하시오. (반올림하여 소수 넷째자리까지 계산)
3) 위의 통계량에 대한 p-값을 구하여 입력하시오.(반올림하여 소수 넷째자리까지 계산)
4) 유의수준 0.05 하에서 가설검정의 결과를 (채택/기각) 중 하나를 선택하여 입력하시오.

 

 

풀이 방향

0) 귀무가설에서 확인해야할 점을 문제에 표시함

1) 가설 검정이에서 쌍체 표본 t-검정이 나오면 scipy.stats 내에있는 ttest_rel 함수로 풀수 있음

2) 귀무가설의 부호 방향을 확인할 것 : Ud가 0 이상이므로 좌측 검정을 실시해야함, 귀무가설의 부호로부터 검정방향을 확인할 수 있음, alternative='less'

3)  데이터 입력 순서 : 귀무가설 Ud >=0 이라는 것은 bp_after >= be_before 를 검정하는 것과 동일함

ttest_rel(bp_after,bp_before)  좌항부터 순차적으로 넣어줄 것

 

 

코드

import pandas as pd
import numpy as np
import scipy.stats as stats

df = pd.read_csv('data/blood_pressure.csv', index_col = 0)
# 데이터 정보 확인
print(df.info())

# 1. Ud 표본 평균 입력
d = df['bp_after']-df['bp_before']
ud = d.mean(axis=0)
ud = np.round(ud,2)
print(f"1) Ud의 표본 평균 : {ud}")

# 2. 검정통계량 계산
## 확인 필수! 귀무가설을 기준으로 결정하면됨, 귀무가설 부등호가 이상인 경우 좌측 검정
# alternative 'less' : 좌측검정
# alternative 'greatest' :우측검정
# alternative 'two-sided' : 양쪽검정

## 3. 쌍측 t-검정 : 두 집단이 변화하였는지
tstat, pval = stats.ttest_rel(df['bp_after'],df['bp_before'],alternative='less')
# 만약에 오류가 날 경우, 받아오는 변수 값이 4개인지 확인해보자. scipy 버전에 따라 상이함
# tstat, pval, _, _ = stats.ttest_rel(df['bp_after'],df['bp_before'],alternative='less')

tstat = np.round(tstat,4)
print(f"2) 검정통계량 : {tstat}")
pval = np.round(pval,4)
print(f"3) P-val : {pval}")

## 4. 가설검정
alpha = 0.05 #유의수준
if pval >=alpha :
	print("4) H0 Accepted - 귀무가설 채택")
else :
	print("4) H0 Reject - 귀무가설 기각")

 

답안)

1) Ud의 표본 평균 : -5.09
2) 검정통계량 : -3.3372
3) P-val : 0.0006
H0 Reject - 귀무가설 기각​

 

+ Recent posts