Task2:数据分析
1. 数据分析的目的
-
EDA的价值主要在于熟悉数据集,了解数据集,对数据集进行验证来确定所获得数据集可以用于接下来的机器学习或者深度学习使用。
-
当了解了数据集之后我们下一步就是要去了解变量间的相互关系以及变量与预测值之间的存在关系。
-
引导数据科学从业者进行数据处理以及特征工程的步骤,使数据集的结构和特征集让接下来的预测问题更加可靠。
-
完成对于数据的探索性分析,并对于数据进行一些图表或者文字总结并打卡。
2.数据分析的步骤概览
- 载入各种数据科学以及可视化库:
- 数据科学库 pandas、numpy、scipy;
- 可视化库 matplotlib、seabon;
- 其他;
- 载入数据:
- 载入训练集和测试集;
- 简略观察数据(head()+shape);
- 数据总览:
- 通过describe()来熟悉数据的相关统计量
- 通过info()来熟悉数据类型
- 判断数据缺失和异常
- 查看每列的存在nan情况
- 异常值检测
- 了解预测值的分布
- 总体分布概况(*约翰逊分布等)
- 查看skewness and kurtosis
- 查看预测值的具体频数
- 特征分为类别特征和数字特征,并对类别特征查看unique分布
- 数字特征分析
- 相关性分析
- 查看几个特征得 偏度和峰值
- 每个数字特征得分布可视化
- 数字特征相互之间的关系可视化
- 多变量互相回归关系可视化
- 类型特征分析
- unique分布
- 类别特征箱形图可视化
- 类别特征的小提琴图可视化
- 类别特征的柱形图可视化类别
- 特征的每个类别频数可视化(count_plot)
- 用pandas_profiling生成数据报告
以上九个步骤中,总体来说我的基础完全缺乏5,6,7阶段
3. 实际操作流程与困难
1.载入各种数据科学以及可视化库
新知识点:warning过滤;missingno(python缺失值可视化处理,pip install missingno);养成看shape和head的习惯
2. 数据纵览,describe种有每列的统计量,个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以及最大值 看这个信息主要是瞬间掌握数据的大概的范围以及每个值的异常值的判断,比如有的时候会发现999 9999 -1 等值这些其实都是nan的另外一种表达方式,有的时候需要注意下, info 通过info来了解数据每列的type,有助于了解是否存在除了nan以外的特殊符号和异常。主要的目的在于 nan存在的个数是否真的很大,如果很小一般选择填充,如果使用lgb等树模型可以直接空缺,让树自己去优化,但如果nan存在的过多、可以考虑删掉
train里的缺失值
model 1 bodyType 4506 fuelType 8680 gearbox 5981
test里的缺失值
bodyType 1504 fuelType 2924 gearbox 1968
bodytype,fueltype和gearbox三项缺省最多,数值类型为float64,利用value counts观察了一下,发现这些值用平均值等普通填充方法不可行,删除又会丧失关键信息,有待进一步学习
但是没有注意到的是,notrepairedDamage 里的缺失值不是nan,而是' - ',把' - '替换成np.nan,再画图才能看到。
-关于处理缺失值的datawhale大佬解答
- 删除:当某个变量或者某个样本中缺失值占比过大时,那么我们可以认为这一变量或者样本没有意义,可以直接删除。
- 补全:(1)用平均值、中值、分位数、众数、随机值等替代。效果一般,因为等于人为增加了噪声。(2)用其他变量做预测模型来算出缺失变量,效果比方法(1)略好。有一个根本缺陷,如果其他变量和缺失变量无关,则预测的结果无意义。如果预测结果相当准确,则又说明这个变量是没必要加入建模的。(3)把变量映射到高维空间。比如性别,有男、女、缺失三种情况,则映射成3个变量:是否男、是否女、是否缺失。这样做的好处是完整保留了原始数据的全部信息,不用考虑缺失值和线性不可分之类的问题,缺点是计算量大大提升。
- 忽略:有一些模型如随机森林,人工神经网络,xgboost等,自身能够处理数据缺失的情况,在这种情况下不需要对缺失数据做任何的处理,这种做法的缺点是在模型的选择上有局限。
-****的缺失值异常值处理专题:https://blog.****.net/AvenueCyy/article/details/104354132
https://blog.****.net/weixin_40444270/article/details/108920646
3.了解预测值的分布
了解预测值分布的目的:要服从正态分布才能进行回归,如果不服从它必须进行转换。共有三种变换:
import scipy.stats as st
y = Train_data['price']
plt.figure(1); plt.title('Johnson SU')
sns.distplot(y, kde=False, fit=st.johnsonsu)
plt.figure(2); plt.title('Normal')
sns.distplot(y, kde=False, fit=st.norm)
plt.figure(3); plt.title('Log Normal')
sns.distplot(y, kde=False, fit=st.lognorm)
挑选一个拟合度最好的,本次选择的是Johnson SU
查看skewness and kurtosis:说明1:https://campus.datacamp.com/courses/introduction-to-portfolio-risk-management-in-python/univariate-investment-risk-and-returns?ex=9
说明2: https://www.cnblogs.com/wyy1480/p/10474046.html
4.特征分为类别特征和数字特征,并对类别特征查看unique分布
关于多变量之间的关系可视化:https://www.jianshu.com/p/6e18d21a4cad