原文阅读链接:https://linklearner.com/activity/12/2/9
学习目的:EDA技巧及ABM基础理论与搭建
EDA分析
基础性探索分析
基础探索性分析包括:缺失值统计、常用统计指标、异常值统计分析、数据整体分布,对于所有数据类任务都应该进行。
缺失值统计可以使用pandas的info或isna结合sum的方法进行分析,对应有前项填充、后项填充、均值填充等方法进行缺失值处理
常用指标统计一般使用pandas的describe方法进行快速查看,本文章中使用以下方法:
- 中心趋势
- 均值:
df[feature].mean()
- 中位数
df[feature].median()
- 最大值
df[feature].max()
- 最小值
df[feature].min()
- 众数
df[feature].mode()
- 均值:
- 变异程度
- 标准差
df[feature].std()
- 极差
df[feature].apply(lambda x: x.max() - x.min())
- 四分位数
df[feature].quantile([0.25, 0.5, 0.75])
- 变异系数
df[feature].std()/df[feature].mean()
- 偏度和峰度
df[feature].skew()
,df[feature].kurtosis()
- 标准差
- 变化率:
df[feature].pct_change()
计算公式为 x 2 − x 1 x 1 \dfrac{x_2-x_1}{x_1} x1x2−x1
异常值统计可通过分析常用指标统计与统计分布进行初步判断,发现异常值后进行对于查询和处理
数据整体分布一般通过绘制条形图查看,对应使用matplotlib.pyplot的hist或者pandas中的hist方法进行绘制,本文章使用seaborn函数进行绘制,相较于前两项拥有更丰富的图形显示能力,原码如下(设置dke值):
# 使用 Seaborn 库绘制总负荷数值的分布图
# sns.displot(...) 函数用于绘制数据的分布图
ax = sns.displot(
electricity_price, # 输入数据,包含绘制所需的列
x="demand", # 指定绘图的列,这里是 "demand" 列
aspect=1.5, # 图形的宽高比,1.5 表示宽度是高度的 1.5 倍
height=5, # 图形的高度设置为 5 英寸
kde=True # 启用核密度估计(KDE),用于绘制数据的平滑概率密度曲线
)
# 设置图形的标题
ax.set(title="总负荷数值分布")
时序数据分析
本文章使用数据为时序数据,因此目标值可能与时间周期相关,包括小时、天、周、月、年等不同尺度,pandas的datetime格式能方便的对相应的时间进行提取:
# 从 DataFrame 的索引中提取时间信息,并添加为新的列
# 假设索引为 DatetimeIndex 类型
# 提取小时信息,并创建一个新列 "hour"
electricity_price["hour"] = electricity_price.index.hour
# 提取月份信息,并创建一个新列 "month"
electricity_price["month"] = electricity_price.index.month
# 提取日期信息,并创建一个新列 "day"
electricity_price["day"] = electricity_price.index.day
# 提取星期几的信息(0 = 周一, 6 = 周日),并创建一个新列 "weekday"
electricity_price["weekday"] = electricity_price.index.weekday
# 提取年份信息,并创建一个新列 "year"
electricity_price["year"] = electricity_price.index.year
文章中还结合透视表与seaborn绘制热力图,对数据能有更加直观的体现:
# 创建一个透视表,计算不同月份和时间下的电价
pivot = pd.pivot_table(
electricity_price, # 输入的 DataFrame
values="price", # 透视表中要填充的值,这里是 "price"
index="month", # 设置行索引为月份
columns="hour" # 设置列索引为小时
)
# 将透视表中的数据类型转换为整数
pivot = pivot.astype(int)
# 创建一个图形,大小为 17x10 英寸
plt.figure(figsize=(17, 10))
# 绘制热图,显示不同月份和时间下的电价
sns.heatmap(
pivot, # 透视表数据
cmap="coolwarm", # 使用 "coolwarm" 调色板,显示热图的颜色
linewidths=0.5, # 设置单元格之间的分隔线宽度为 0.5
annot=True, # 启用单元格值的注释
fmt=".0f", # 注释的格式为整数
annot_kws={"size": 12, # 注释文本的大小设置为 12
"weight": "bold", # 注释文本的字体加粗
"color": "black"} # 注释文本的颜色为黑色
)
# 设置图形的标题
plt.title("不同月份和时间下的电价")
自定义分析
对负电价与高电价进行具体的探索性分析
对demand与price两边量进行相关性分析,使用corr方法计算相关系数,使用seaborn绘制两量变的散点分布图,其中设置lowess能直观的拟合数据间关系
:
# 创建一个图形,大小为 8x10 英寸
plt.figure(figsize=(8, 10))
# 绘制回归图(散点图及拟合线)
sns.regplot(
data=electricity_price.loc["2022"], # 选择2022年的数据
x="demand", # x 轴的变量为 "demand"
y="price", # y 轴的变量为 "price"
scatter_kws={ # 设置散点图的样式
"s": 0.5, # 散点的大小设置为 0.5
"alpha": 0.6, # 散点的透明度设置为 0.6
"color": "black" # 散点的颜色设置为黑色
},
color="red", # 拟合线的颜色设置为红色
lowess=True # 启用局部加权回归(Lowess)以拟合数据
)