전력 소비 데이터 전처리 및 통계 분석
이 문서는 200명 사용자의 일별 전력 소비량(KWH) 데이터를 대상으로 다양한 통계 처리를 수행하는 Python 코드 예제입니다. pandas와 numpy를 활용하여 데이터 정제, 변환, 통계 계산 과정을 단계별로 구현합니다.
1. 데이터 구조 변환
원본 데이터는 사용자별로 일별 데이터가 행 단위로 저장되어 있습니다. 이를 사용자 번호를 인덱스로, 날짜를 컬럼으로 갖는 피벗 구조로 변환합니다.
import pandas as pd
# 데이터 로드 및 날짜 형식 변환
df = pd.read_csv('electricity_data.csv', encoding='gbk')
df['DATA_DATE'] = pd.to_datetime(df['DATA_DATE'])
# 피벗 테이블 생성
processed_data = df.pivot_table(
values='KWH',
index='CONS_NO',
columns='DATA_DATE'
)
2. 결측치 및 이상치 처리
데이터 정제 단계에서 결측치는 선형 보간법으로 대체하고, 이상치는 3σ 원칙을 적용하여 탐지합니다.
# 결측치 보간
df['KWH'] = df['KWH'].interpolate(method='linear')
# 이상치 탐지
mean = df['KWH'].mean()
std = df['KWH'].std()
outliers = df[(df['KWH'] > mean + 3*std) | (df['KWH'] < mean - 3*std)]
3. 기본 통계량 계산
각 사용자의 전력 소비량에 대한 8종 통계량을 계산하는 함수를 구현합니다.
def calculate_stats(dataframe):
stats = {
'최소값': dataframe.min(),
'최대값': dataframe.max(),
'평균값': dataframe.mean(),
'중앙값': dataframe.median(),
'총합': dataframe.sum(),
'분산': dataframe.var(),
'왜도': dataframe.skew(),
'첨도': dataframe.kurtosis()
}
return pd.DataFrame(stats).T
user_stats = calculate_stats(processed_data)
4. 일일 차분 데이터 분석
전력 소비량의 일일 변화량을 계산하고 동일 통계량을 적용합니다.
daily_diff = processed_data.diff(axis=1)
diff_stats = calculate_stats(daily_diff.iloc[:, 1:]) # 첫날 제외
5. 백분위수 계산
각 사용자의 전력 소비량에 대한 5% 백분위수를 계산합니다.
percentile_5 = processed_data.quantile(0.05, axis=1)
6. 주간 집계 데이터 분석
년도별 분리된 주간 단위로 데이터를 집계하고 차분을 계산합니다.
# 주간 집계
df['week'] = df['DATA_DATE'].dt.to_period('W')
weekly_sum = df.groupby(['CONS_NO', 'week'])['KWH'].sum().unstack()
# 주간 차분
weekly_diff = weekly_sum.diff(axis=1)
weekly_stats = calculate_stats(weekly_diff.iloc[:, 1:])
7. 최대값 90% 이상 기록 횟수
사용자의 최대 전력 소비량의 90%를 초과하는 일수를 계산합니다.
threshold = processed_data.max(axis=1) * 0.9
exceed_days = (processed_data > threshold[:, None]).sum(axis=1)
8. 최대/최소값이 가장 많은 월 추출
각 사용자의 최대/최소 전력 소비량이 가장 많이 발생한 월을 식별합니다.
# 월별 최대값 발생 빈도
df['month'] = df['DATA_DATE'].dt.to_period('M')
max_values = df.loc[df.groupby('CONS_NO')['KWH'].idxmax()]['month']
# 월별 최소값 발생 빈도
min_values = df.loc[df.groupby('CONS_NO')['KWH'].idxmin()]['month']
9. 계절별 전력 소비량 비율 계산
7-8월(여름)과 3-4월(봄)의 전력 소비량 비율을 계산합니다.
# 계절 필터링 함수
def filter_season(data, months):
return data[data['DATA_DATE'].dt.month.isin(months)]
summer = filter_season(df, [7,8])
spring = filter_season(df, [3,4])
# 계절별 집계
summer_total = summer.groupby('CONS_NO')['KWH'].sum()
spring_total = spring.groupby('CONS_NO')['KWH'].sum()
# 비율 계산
season_ratio = summer_total / spring_total
10. 특성 통합
계산된 모든 통계 특성을 하나의 데이터프레임으로 통합합니다.
combined_features = pd.concat([
user_stats,
diff_stats.add_suffix('_diff'),
weekly_stats.add_suffix('_weekly'),
percentile_5.to_frame(name='5%_percentile'),
exceed_days.to_frame(name='90%_exceed_days'),
season_ratio.to_frame(name='summer_spring_ratio')
], axis=1)