数据可视化(EDA)

1、对数据集进行EDA是什么?

1、对数据集进行EDA是什么?

  • EDA是一种用于分析数据集以概括其主要特征的方法,通常使用统计图形和其它数据可视化方法,是理解和准备用于任何数据集分析或机器学习项目的关键步骤。

2、要达成的主要目标是什么?

  • 了解数据集的整体结构和分布。
  • 识别数据中的异常值或错误。
  • 发现数据中的模式和趋势。
  • 为进一步的分析做好准备。

3、EDA常用的方法有哪些?

  • 统计描述:使用统计量,例如均值、中位数、标准差来描述数据集的基本特征。
  • 数据可视化:使用图标和图形来直观的展示数据,如直方图、箱线图、散点图等。
  • 相关性分析:考察不同变量之间的关系。
  • 降维:将高维数据降维到低维空间以便于分析。

4、数据分析技巧

  • 检查数据的基本特征
    • 检查数据表的前几行:head()
    • 检查数据类型和缺失值:df.info()
    • 查看统计信息:df.describe()
  • 处理缺失值、异常值和重复项
    • 对缺失值使用插补等技术
    • 适当的识别和处理异常值
    • 如果有必要直接删除某些样本
  • 数据可视化
    • 创建可视化图表以深入洞察数据
    • 对数据特征使用直方图和箱线图
    • 对类别特征使用条形图
    • 通过相关矩阵和散点图来理解变量间的关系
  • 特征分析
    • 探究分类和异常检测中特征于目标变量之间的关系
    • 通过可视化方法来展示特征在不同类型和类别键的差异和变化
    • 利用箱线图、提琴图或蜂窝状堆积图来比较特征分布

5、数据EDA的例子

  • 以UBC数据集为例子
  • 原始数据集长这样
    • 一个csv文件包含图像名字和标签以及该图像大小等信息
    • 一个文件夹里有对应名字的图像

5.1 显示每个类别有多少训练数据

1
2
3
4
5
6
7
8
9
train_df['label'].value_counts():
label
HGSC 222
EC 124
CC 99
LGSC 47
MC 46
Name: count, dtype: int64
(538, 5)

饼形图显示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 查看所有标签类在数据集中所占的比例

# 先将每个不同标签提取出来
HGSC = train_df[train_df['label']=="HGSC"]
EC = train_df[train_df['label']=="EC"]
CC = train_df[train_df['label']=="CC"]
LGSC = train_df[train_df['label']=="LGSC"]
MC = train_df[train_df['label']=="MC"]

# 设置图像大小
plt.figure(figsize=(20, 6))

# 设置字体大小
plt.rcParams['font.size'] = 14

# 设置颜色
colors = ['lightgreen', 'lightblue', 'purple', 'blue', 'yellow']

# 开始绘制饼图
plt.subplot(1, 1, 1) # 创建一个子图
plt.pie([len(HGSC), len(EC), len(CC), len(LGSC), len(MC)], labels=['HGSC', 'EC', 'CC', 'LGSC', 'MC'], autopct='%1.1f%%', colors=colors)
plt.title('Training Set')

# 添加整个图像的主标题
plt.suptitle('Distribution of HGSC, EC, CC, LGSC and MC Image in the Training data', fontsize=20, y=1.05)

# 显示这个表
plt.show()

5.2查看缺失值

1
2
train = pd.read_csv('train.csv')
pd.isnull(train).values.any()

5.3查看每个特征中有哪些不同的值

  • 比如性别有男女,年龄有很多种等
    1
    2
    3
    4
    5
    6
    7
    # 先提取保存不同的特征及其所不同的类别
    feature_uniques = []
    for cat in features:
    feature_uniques.append(len(train[cat].unique()))

    uniq_values_in_categories = pd.DataFrame.from_items([('name', features), ('unique_values', uniques)])

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fig, (ax1, ax2) = plt.subplots(1,2)
fig.set_size_inches(16,5)
ax1.hist(uniq_values_in_categories.unique_values, bins=50)
ax1.set_title('Amount of categorical features with X distinct values')
ax1.set_xlabel('Distinct values in a feature')
ax1.set_ylabel('Features')
ax1.annotate('A feature with 326 vals', xy=(322, 2), xytext=(200, 38), arrowprops=dict(facecolor='black'))

ax2.set_xlim(2,30)
ax2.set_title('Zooming in the [0,30] part of left histogram')
ax2.set_xlabel('Distinct values in a feature')
ax2.set_ylabel('Features')
ax2.grid(True)
ax2.hist(uniq_values_in_categories[uniq_values_in_categories.unique_values <= 30].unique_values, bins=30)
ax2.annotate('Binary features', xy=(3, 71), xytext=(7, 71), arrowprops=dict(facecolor='black'))

特征之间的相关性

1
2
3
plt.subplots(figsize=(16,9))
correlation_mat = train[cont_features].corr()
sns.heatmap(correlation_mat, annot=True)