数据分析(EDA)学习总结!

本文详细介绍了在数据分析(EDA)过程中,如何利用Python进行数据探索,包括数据读取、长度分布分析、类别信息探究等。通过Pandas、numpy和seaborn等工具,对文本数据进行统计描述、直方图绘制和同分布验证,揭示了训练集和测试集的长度分布特征。此外,还探讨了数据的类别分布不均衡问题,以及字符分布情况,提出将长度和句子个数作为特征用于机器学习模型训练。
摘要由CSDN通过智能技术生成

↑↑↑关注后"星标"Datawhale

每日干货 & 每月组队学习,不错过

 Datawhale干货 

作者:张永泰,北京工业大学,Datawhale优秀学习者

探索性数据分析(Exploratory Data Analysis,EDA)是一种探索数据的结构和规律的一种数据分析方法。其主要的工作包含:对数据进行清洗,对数据进行描述(描述统计量,图表),查看数据的分布,比较数据之间的关系,培养对数据的直觉和对数据进行总结。

EDA可以帮助我们找到适合的数据模型,本文针对文本数据,将进行具体的数据探索性分析讲解。

一、数据及背景

https://tianchi.aliyun.com/competition/entrance/531810/information(阿里天池-零基础入门NLP赛事)

二、实验环境

导入需要使用的包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
import seaborn as sns
import scipy
from collections import Counter

三、数据探索

首先,利用Pandas对数据进行读取。

df_train = pd.read_csv(train_path, sep='\t')
df_test = pd.read_csv(test_path, sep='\t')

3.1 简单查看数据

df_train.head(), len(df_train)

发现text域的数据是字符串。我们想要得到整数序列。可以用字符串分割split()。

print(len(df_train['text'][0]), type(df_train['text'][0]))
df_train.head()

3.2 长度分布

3.2.1 describe

这里与教程中的方法有所不同。vectorize是numpy中很方便的函数,作用和pandas中apply差不多。用法:

np.vectorize(function)(array)

输入待处理的array,以及逐元素处理函数function,返回经过处理后的ndarray。原来的array则不受影响。

当前我使用的函数split_df负责将一行数据按空格切分成整数列表,然后计算该列表的长度。

def split_df(df_row):
    return len(str(df_row).split())
len_dist = np.vectorize(split_df)(df_train['text'])
len_test_dist = np.vectorize(split_df)(df_test['text'])

使用describe函数查看训练集和测试集中的数据长度分布

print(pd.Series(len_dist).describe())

print(pd.Series(len_test_dist).describe())

通过数据描述可以看到:

  • 训练集共200,000条新闻,每条新闻平均907个字符,最短的句子长度为2,最长的句子长度为57921,其中75%以下的数据长度在1131以下。

  • 测试集共50,000条新闻,每条新闻平均909个字符,最短句子长度为14,最长句子41861,75%以下的数据长度在1133以下。

  • 训练集和测试集就长度来说似乎是同一分布。

3.2.2 直方图

绘制直方图查看训练集和测试集中的数据长度分布

fig, ax = plt.subplots(1,1,figsize=(12,6))


ax = plt.hist(x=len_dist, bins=100)
ax = plt.hist(x=len_test_dist, bins=100)


plt.xlim([0, max(max(len_dist), max(len_test_dist))])
plt.xlabel("length of sample")
plt.ylabel("number of sample")
plt.legend(['train_len','test_len'])


plt.show()

使用seaborn绘制更好的图。seaborn计算的纵坐标是频率,而不是出现次数。由于训练集和测试集的数据量不一样,因此用频率更加科学、更能看出是否符合同一分布。

plt.figure(figsize=(15,5))
ax = sns.distplot(len_dist, bins=100)
ax = sns.distplot(len_test_dist, bins=100)
plt.xlim([0, max(max(len_dist), max(len_test_dist))])
plt.xlabel("length of sample")
plt.ylabel("prob of sample")
plt.legend(['train_len','test_len'])

通过直方图,我们能直观感受到训练集和测试集的长度分布都属于右偏分布。按理说分析到这份儿上就该停了。

3.2.3 同分布验证

import scipy
scipy.stats.ks_2samp(len_dist, len_test_dist)
Ks_2sampResult(statistic=0.004049999999999998, pvalue=0.5279614323123156)

P值为0.52,比指定的显著水平(假设为5%)大,我们认为二者同分布。

3.2.4 截断位置

在输入模型进行训练之前,我们要把所有的数据长度统一化,数据肯定要截断。但是在什么位置截断合适呢?

考虑到数据长度分布是长尾分布,log一下看看是不是正态分布,如果是正态分布,使用3sigma法则作为截断的参考。如果不是,则就只能瞎猜了

测量拟合分布的均值和方差sigma原则:

  • 原则:数值分布在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值