대상 : 2021년 다소비업체 전력사용량 산업부문 데이터 : 한전 실시간 데이터, 에너지사용량신고 데이터

In [2]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
In [3]:
plt.rcParams['figure.figsize'] = (14, 9)
plt.rcParams['font.family'] = 'Malgun Gothic'
plt.rcParams['font.size'] = 12
plt.rcParams['axes.unicode_minus']
Out[3]:
True
In [4]:
df_b = pd.read_pickle('industry_site.pkl')
df_b
Out[4]:
kemc_oldx_code_tite ente dt(날짜) tm(시간) 전력사용량(kWh)
0 금속 10529 2021-01-01 0 2437.92
1 금속 10529 2021-01-01 1 2397.60
2 금속 10529 2021-01-01 2 2433.12
3 금속 10529 2021-01-01 3 2454.24
4 금속 10529 2021-01-01 4 2312.16
... ... ... ... ... ...
16170955 화공 59290 2021-12-31 19 2690.40
16170956 화공 59290 2021-12-31 20 2688.96
16170957 화공 59290 2021-12-31 21 2660.64
16170958 화공 59290 2021-12-31 22 2961.60
16170959 화공 59290 2021-12-31 23 2957.76

16170960 rows × 5 columns

In [5]:
def basic_graph(data, sector):
    grp_day = data.groupby('dt(날짜)')['전력사용량(kWh)'].sum() / 1000 # 시간 데이터->일 데이터 변환
    #print(grp_day)

    grp_day.plot()
    plt.ylabel('전력소비량(kWh)')
    plt.xlabel('일(day)')
    plt.suptitle(f'{sector}부문 일일 전력소비량(MWh)')
    plt.grid()
    plt.show()

    # 전체를 날짜, 시간으로 구분 후 요일 및 주 추가
    grp_hour = data.groupby(['dt(날짜)', 'tm(시간)'])['전력사용량(kWh)'].sum() / 1000
    grp_hour = grp_hour.reset_index()
    grp_hour['weekday'] = grp_hour['dt(날짜)'].dt.weekday
    grp_hour['weekofyear'] = grp_hour['dt(날짜)'].dt.weekofyear

    # 시간대별 전력소비량을 산포도 형태의 그래프로 그림
    sns.pairplot(grp_hour, x_vars=['tm(시간)'], y_vars='전력사용량(kWh)', hue='tm(시간)', height=5, plot_kws={'alpha':0.1, 'linewidth':0})
    plt.ylabel('전력소비량(MWh)')
    plt.xlabel('시간')
    plt.suptitle(f'{sector}부문 시간대별 전력소비량(MWh) 분포')
    plt.grid()
    plt.xticks(np.arange(24), labels=list(range(1, 25)))
    plt.show()

    # 요일별 전력소비량을 산포도 형태의 그래프로 그림
    sns.pairplot(grp_hour, x_vars=['weekday'], y_vars='전력사용량(kWh)', hue='tm(시간)', height=5, plot_kws={'alpha':0.1, 'linewidth':0})
    plt.ylabel('전력소비량(MWh)')
    plt.suptitle(f'{sector}부문 요일별/시간대별 전력소비량(MWh) 분포(월-금, 토, 일')
    plt.grid()
    plt.xticks(np.arange(7), labels=['월', '화', '수', '목', '금', '토', '일'])
    plt.show()

    # 주/시간별 전력소비량을 산포도 형태의 그래프로 그림
    sns.pairplot(grp_hour, x_vars=['weekofyear'], y_vars='전력사용량(kWh)', hue='tm(시간)', height=5, plot_kws={'alpha':0.1, 'linewidth':0})
    plt.ylabel('전력소비량(MWh)')
    plt.suptitle(f'{sector}부문 주별/시간대별 전력소비량(MWh) 분포')
    plt.grid()
    plt.show()
In [6]:
basic_graph(df_b, '산업')
In [27]:
df_p = pd.read_pickle('industry_pivot.pkl')
df_p
Out[27]:
tm(시간) kemc_oldx_code_tite ente dt(날짜) 0 1 2 3 4 5 6 ... 14 15 16 17 18 19 20 21 22 23
0 금속 10529 2021-01-01 2437.92 2397.60 2433.12 2454.24 2312.16 2252.16 2194.56 ... 2057.76 2066.40 2034.72 2014.08 2088.96 2196.48 2252.64 2297.28 2274.24 2199.36
1 금속 10529 2021-01-02 2211.36 2186.40 2248.32 2338.56 2379.84 2316.48 2038.08 ... 2051.52 2041.92 2008.80 2056.32 2005.92 1952.16 1911.84 1881.12 1756.80 1790.40
2 금속 10529 2021-01-03 1808.64 1783.68 1771.68 1789.92 1822.56 1801.92 1868.64 ... 1893.12 1839.84 1791.84 1738.08 1692.96 1683.36 1723.20 1724.16 1694.88 1738.56
3 금속 10529 2021-01-04 1723.20 1672.32 1668.96 1703.52 1719.84 1707.36 1714.08 ... 2649.60 2308.32 2337.12 2273.76 2218.08 2198.40 2449.92 2606.40 2127.84 2108.64
4 금속 10529 2021-01-05 2062.56 2000.64 2085.60 2104.80 2078.40 2078.40 2092.32 ... 2395.20 2388.00 2391.84 2383.20 2326.56 2339.04 2555.04 2314.56 2280.48 2319.36
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
673785 화공 59290 2021-12-27 2991.36 3064.80 3036.00 3010.08 3027.84 2975.52 2981.76 ... 2993.76 3082.56 3170.40 3147.84 3083.04 3048.48 3043.20 2979.84 3054.72 3083.04
673786 화공 59290 2021-12-28 3033.12 3106.08 3057.60 3108.48 3052.80 2977.92 2919.84 ... 3023.52 3077.76 3064.32 3109.44 3119.04 3119.04 3099.36 3078.72 3041.28 3031.20
673787 화공 59290 2021-12-29 3000.48 3078.24 3080.16 3075.84 3063.84 2958.24 2913.12 ... 2966.40 3096.96 3050.88 3055.20 3017.76 3080.16 3094.08 3108.48 3076.32 3074.88
673788 화공 59290 2021-12-30 3059.52 3090.72 3128.64 3119.52 3074.40 3033.60 2947.68 ... 3048.00 3116.16 2982.72 2898.72 2846.88 2897.28 2892.96 2881.44 2896.32 2908.80
673789 화공 59290 2021-12-31 2856.00 2916.00 3007.20 2987.52 3006.24 3000.96 2753.28 ... 2652.96 2804.64 2771.52 2760.00 2636.16 2690.40 2688.96 2660.64 2961.60 2957.76

673790 rows × 27 columns

In [8]:
def load_profile(df_pivot, sector):
    # 시간별 전력소비량만 정규화
    df_pivot.iloc[:, 3:27] = df_pivot.iloc[:, 3:27].apply(lambda x : x/x.max(), axis=1)
    df_pivot['weekday'] = df_pivot['dt(날짜)'].dt.dayofweek # 요일 컬럼 추가
    #print(df_pivot.head())

    df_wk = df_pivot[df_pivot['weekday'] <= 4] # 주중
    df_wn = df_pivot[df_pivot['weekday'] > 4] # 주말

    # 전체, 주중, 주말 데이터 도출
    grp_all = df_pivot.groupby('kemc_oldx_code_tite')[list(range(0, 24))].mean() * 100
    grp_wk = df_wk.groupby('kemc_oldx_code_tite')[list(range(0, 24))].mean() * 100
    grp_wn = df_wn.groupby('kemc_oldx_code_tite')[list(range(0, 24))].mean() * 100

    grp_all.T.plot()
    plt.ylabel('소비량(정규화)')
    plt.title(f'{sector}부문 업종별 부하패턴 : 전체')
    plt.legend(loc='best')
    plt.grid(which='both')
    plt.xticks(np.arange(24), labels=list(range(1, 25)))
    plt.show()

    grp_wk.T.plot()
    plt.ylabel('소비량(정규화)')
    plt.title(f'{sector}부문 업종별 부하패턴 : 주중')
    plt.legend(loc='best')
    plt.grid(which='both')
    plt.xticks(np.arange(24), labels=list(range(1, 25)))
    plt.show()

    grp_wn.T.plot()
    plt.ylabel('소비량(정규화)')
    plt.title(f'{sector}부문 업종별 부하패턴 : 주말')
    plt.legend(loc='best')
    plt.grid(which='both')
    plt.xticks(np.arange(24), labels=list(range(1, 25)))
    plt.show()
In [28]:
load_profile(df_p.copy(), '산업')
In [32]:
def load_factor(data, sector):
    # 일자별 부하율 계산
    data['LF'] = data.drop(['ente'], axis=1).mean(axis=1) / data.drop(['ente'], axis=1).max(axis=1) * 100
    
    # 용도별/월별 부하율 계산
    data['month'] = data['dt(날짜)'].dt.month
    pivot_lf = pd.pivot_table(data, index='kemc_oldx_code_tite', columns='month', values='LF', aggfunc=np.mean)
    
    pivot_lf.T.plot()
    plt.ylabel('부하율(%)')
    plt.title(f'{sector}부문 업종별/월별 부하율')
    plt.legend(loc='best')
    plt.grid(which='both')
    plt.show()

    sns.boxplot(x='month', y='LF', data=data)
    plt.ylabel('부하율(%)')
    plt.title(f'{sector}부문 업종별/월별 부하율 4분위')
    plt.grid(which='both')
    plt.show()
In [33]:
load_factor(df_p.copy(), '산업')
In [12]:
def detail_type(data):
    #print(data.head())

    for idx in data['kemc_oldx_code_tite'].unique():
        btype = data[data['kemc_oldx_code_tite'] == idx].copy() # 용도별 구분

        btype.iloc[:, 3:27] = btype.iloc[:, 3:27].apply(lambda x : x/x.max(), axis=1) # 정규화

        btype_site = btype.groupby('ente')[list(range(0, 24))].mean() # 용도의 시간별 평균 계산
        btype_site_mean = btype_site.mean()

        btype_site.T.plot(alpha=0.7, linewidth=0.7)
        btype_site_mean.plot(linewidth=3)

        plt.grid()
        plt.legend().remove()
        plt.xlabel('시간')
        plt.ylabel('전력소비량(정규화)')
        plt.title(f'{idx} 개별 사업장 및 평균 부하곡선')
        plt.xticks(np.arange(24), labels=list(range(1, 25)))
        plt.show()
In [13]:
detail_type(df_p)
In [14]:
def peak_hour(data):
    #print(data.head())
    grp_type = data.groupby(['kemc_oldx_code_tite', 'dt(날짜)'])[list(range(0, 24))].sum()
    grp_type = grp_type.reset_index()

    grp_type['peak'] = grp_type[list(range(0, 24))].idxmax(axis=1) # 하루 중 피크인 시간대 도출
    #print(grp_type)

    bar_type = grp_type.groupby('kemc_oldx_code_tite')['peak'].value_counts() # 시간대별 피크인 사업장수 도출
    bar_type = bar_type.unstack().fillna(0)
    bar_type.iloc[:, :] = bar_type.iloc[:, :].apply(lambda x: x / x.sum(), axis=1) * 100

    bar_type_stack = bar_type.stack()
    bar_type_stack = bar_type_stack.reset_index()
    bar_type_stack.columns = ['type', 'hour', 'peak']
    bar_type_stack['hour'] = bar_type_stack['hour'] + 1
    sns.barplot(data=bar_type_stack, x='hour', y='peak', hue='type')
    
    plt.grid()
    plt.legend()
    plt.xlabel('시간')
    plt.ylabel('비중(%)')
    plt.title('용도별 피크시간 비중')
    plt.show()
In [15]:
peak_hour(df_p)
In [ ]: