Datawhale 零基础入门数据挖掘-数据分析
一、名词概念
1.数据分析
数据分析就是使用统计和概率来计算数据集中的趋势。 从海量数据中找出“真正的”趋势。
数据分析的三条法则
1.观察已有的数据,就要分析的内容和方向提出一定假设。比如想要证明pyhton是数据分析语言中最常用的编程语言。
2.根据假设选择一些可以用以辅助证明的数值或数值变化趋势。想证明1中的假设,可以分析目前主流数据分析比赛中各类编程语言使用频率的平均值。
3. 考虑中心趋势的例外情况。 比如你发现Python的使用频率确实是最高的,但是数据分析比赛中有几场比赛限定了只能使用Python进行编程,那种情况下Python编程语言的使用频率的平均值就要进行某些调整了。
2.EDA(Exploratory Data Analysis)
“所谓探索性数据分析(EDA),是指对已有的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索,通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。"
也就是说EDA是对数据进行初步分析,主要通过探索性分析,辨析数据的模式与特点,从而选择合适的分析模型,找出数据的某些潜在规律。
3.脱敏数据
数据脱敏又称数据去隐私化或数据变形,是在给定的规则、策略下对敏感数据进行变换、修改的技术机制,能够在很大程度上解决敏感数据在非可信环境中使用的问题。根据数据保护规范和脱敏策略.对业务数据中的敏感信息实施自动变形.实现对敏感信息的隐藏。
二、实际操作
图片来源 数据挖掘:探索性数据分析(EDA)
后面的代码基本上是按照图片中步骤进行分析的。
1.初步数据处理
以下代码均来自于Datawhale 零基础入门数据挖掘-Task2 数据分析一文。
A.载入各种数据科学以及可视化库,数据:
数据科学库 pandas、numpy、scipy;
可视化库 matplotlib、seabon;
其他;
pandas 官网 手册
numpy 官网 手册
各个库之间的关系参见 Numpy、Pandas、SciPy、Scikit-Learn、Matplotlib的关系以及学习资料
!!!!: 这里说一下作为一个小白遇到的一个问题。在 jupyter上我是直接把代码复制过去的,运行的时候碰到一个报错。于是我在报错的前面加了注释。如下图所示:
接着我就去查遇到 Module Not Found Error报错怎么办。按照提示我就打开了cmd 去使用 “ pip install ”安装。然后就发现报错了,如下图:
是我完全不懂Python安错了地方。
实际要打开的是
安装成功,问题解决。
#coding:utf-8
#导入warnings包,利用过滤器来实现忽略警告语句。
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno
path = './sj/'
Train_data = pd.read_csv(path+'used_car_train_20200313.csv', sep=' ')
Test_data = pd.read_csv(path+'used_car_testA_20200313.csv', sep=' ')
这里的 path = ‘./sj/’ 中的 ./sj/ 是指你在jupyter中存放你上传的数据的文件夹的名称。 这个知识点来自我们 挖数据搬砖头
小队中大佬的指点。
B.查看数据
1.简单查看数据是否正常导入
##2) 简略观察数据(head()+shape)
Train_data.head(3).append(Train_data.tail(3))
Train_data.shape
这里说一下上面语句中的函数,分别是 .head() .append() .tail()
.head()读取数据前几行 默认5行,括号内输入几就显示几行
.tail()读取数据最后几行 默认5行,括号内输入几就显示几行
.append() 拼接数据
上个代码块中的 pd.read_csv(filename):从CSV文件导入数据
df.shape():查看行数和列数
2.总览数据概况
## 1) 通过describe()来熟悉数据的相关统计量
Train_data.describe()
## 2) 通过info()来熟悉数据类型
Train_data.info()
describe()
生成描述性统计,总结数据集分布的中心趋势,分散和形状,不包括NaN值。
info()
查看索引、数据类型 参考info()函数的细节
3.数据分类
下图为本次分析的数据的类型:
SaleID int64
name int64
regDate int64
model float64
brand int64
bodyType float64
fuelType float64
gearbox float64
power int64
kilometer float64
notRepairedDamage object
regionCode int64
seller int64
offerType int64
creatDate int64
price int64
v_0 ~ v_14 float64
dtypes: float64(20), int64(10), object(1)
数据按类型可分为:数值数据(连续数据),分类数据和有序数据。
数值数据:如年龄,工资等。
分类数据:如种族,性别等。
有序数据:如军衔,教育程度等。
其中有序数据和分类数据归结为离散数据。
C.判断数据缺失和异常
## 1) 查看每列的存在nan情况
Train_data.isnull().sum()
# nan可视化
missing = Train_data.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()
# 可视化看下缺省值
msno.matrix(Train_data.sample(250))
isnull()用来判断缺失值 Python pandas库中的isnull()函数
sort_values()将数据集依照某个字段中的数据进行排序,该函数即可根据指定列数据也可根据指定行的数据排序。Pandas-排序函数sort_values()
plot.bar() 直方图
matrix(Train_data.sample(250)) 取250个样本制图,以便快速直观地看到数据集的完整性情况。 具体生成图如下:
Python可视化查看数据集完整性: missingno库(用于数据分析前的数据检查)
msno.bar(Test_data.sample(1000))
柱状图的方式进行数据检查
## 2) 查看异常值检测
Train_data.info()
## 3)显示类型为 object 的 notRepairedDamage 的所有值
Train_data['notRepairedDamage'].value_counts()
## 4)将涉及到的 — 替换为 nan(空值)
Train_data['notRepairedDamage'].replace('-', np.nan, inplace=True)
对特征严重倾斜的类别类别进行删除操作(数据清理)
2.了解预测值的分布
Train_data['price']
Train_data['price'].value_counts()
## 1) 总体分布概况(无界约翰逊分布等)
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)
上面的代码是观察预测值的总体分布情况,再判断通过哪些手段使数据符合正态分布。使用统计分析方法时,我们总是先设定数据符合正态分布,再通过其他手段验证是否符合正态分布。
常用函数介绍请参考 pandas官网参考手册 或者 pandas常用功能与函数介绍
从这里开始不在粘贴代码了,后续的步骤集中在对预测值数据进行分析。
A.数据分析
数据分析分为两个方面,一是统计汇总,二是可视化。
我们这次所要分析的数据类型已经在 B 查看数据中给出。要预测的交易价格为数值数据(连续数据)。我们就先从数值数据的分析入手。
1.数值数据分析
从统计方面入手
一、描述一个数据,可从三个方面入手:
1.集中趋势:均值,中位数,众数。对于正态分布的数据,均值的效果比较好,而对于有偏数据,因为存在极值,所有会对均值产生影响,此时,用中位数去进行集中趋势的描述。
2.离散程度:方差和标准差。这两个用哪个都可,不过标准差是具有实际意义的。另外,还可以用极差,平均差,四分位差,离散系数(针对多组数据离散程度的对比)。
3.分布形状:偏度skew(),衡量数据偏斜情况。峰度kurt(),衡量数据分布的平坦度。峰度和偏度
二、检验数据正态性。手段:绘制P-P图,Q-Q图。计算偏度,峰度进行判断等。
三、数据转化。一般在 特征工程 中进行。
四、游程检验。判断数据是否是随机出现的。
从可视化方面入手
直方图。
箱线图。
## 2) 类别特征箱形图可视化
# 因为 name和 regionCode的类别太稀疏了,这里我们把不稀疏的几类画一下
categorical_features = ['model',
'brand',
'bodyType',
'fuelType',
'gearbox',
'notRepairedDamage']
for c in categorical_features:
Train_data[c] = Train_data[c].astype('category')
if Train_data[c].isnull().any():
Train_data[c] = Train_data[c].cat.add_categories(['MISSING'])
Train_data[c] = Train_data[c].fillna('MISSING')
def boxplot(x, y, **kwargs):
sns.boxplot(x=x, y=y)
x=plt.xticks(rotation=90)
f = pd.melt(Train_data, id_vars=['price'], value_vars=categorical_features)
g = sns.FacetGrid(f, col="variable", col_wrap=2, sharex=False, sharey=False, size=5)
g = g.map(boxplot, "value", "price")
散点图。
2.离散数据分析
离散型数据主要看数据的结构。看哪类数据出现的最多。利用value_counts()函数,查看各个类别出现的次数。可视化一般使用饼图及柱形图。
B.二手车交易金额数据分析
1.特征分为类别特征和数字特征,并对类别特征查看unique分布
2.数字特征分析
a.相关性分析
b.查看预测数据特征得 偏度和峰值
c.每个数字特征的分布可视化
d.数字特征相互之间的关系可视化
e.多变量互相回归关系可视化
3.类型特征分析
a.unique分布
b.类别特征可视化:箱形图/小提琴图/柱形图可视化
c.特征的每个类别频数可视化(count_plot)