数据模型第二次总结
数据模型第二次总结
- pandas其他补充操作
- 透视表
- 分组与聚合
- 数据的合并纵向和横向
- 可视化模块matplotlib模块
- 饼图绘制
- 条形图绘制
- 交叉条形图
- 直方图
- 箱线图
- 折线图
- 散点图和气泡图
- 热力图
- 可视化相关模块
- 数据清洗
- 实战案例
- 新增列
- 重要名词解释
- 判断线性关系
- 一元线性回归模型
- 多元线性回归模型
pandas其他补充操作
缺失值的识别与处理
1. df.isnull # 判断是否为空 2. df.fillna # 填充空格 3. df.dropna # 删除空格
具体问题具体分析
在实际工作中,对不同数据进行不同措施 eg: 年龄的缺失用平均值填充 性别用众数填充 薪资用中位数填充
透视表
透视表功能
语法:
pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All' )
参数介绍
data:指定需要构造透视表的数据集 values:指定需要拉入“数值”框的字段列表 index:指定需要拉入“行标签”框的字段列表 columns:指定需要拉入“列标签”框的字段列表 aggfunc:指定数值的统计函数,默认为统计均值,也可以指定numpy模块中的其他统计函数 fill_value:指定一个标量,用于填充缺失值 margins:bool类型参数,是否需要显示行或列的总计值,默认为False dropna:bool类型参数,是否需要删除整列为缺失的字段,默认为True margins_name:指定行或列的总计名称,默认为All
分组与聚合
调用模块
import numpy as np
分组
语法:
变量名.groupby(by = [参数])
聚合函数的运用
语法:
变量.aggregate({'索引单位':处理函数})
调整变量名顺序(了解)
语法:
pd.DataFrame(变量, columns=[参数排序])
数据集重命名
语法:
变量.rename(columns={'原名':'新名', '原名':'新名'}, inplace=True)
数据的合并
纵向合并
语法:
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None)
参数介绍
objs:指定需要合并的对象,可以是序列、数据框或面板数据构成的列表 axis:指定数据合并的轴,默认为0,表示合并多个数据的行,如果为1,就表示合并多个数据的列 join:指定合并的方式,默认为outer,表示合并所有数据,如果改为inner,表示合并公共部分的数据 join_axes:合并数据后,指定保留的数据轴 ignore_index:bool类型的参数,表示是否忽略原数据集的索引,默认为False,如果设为True,就表示忽略原索引并生成新索引 keys:为合并后的数据添加新索引,用于区分各个数据部分
去除某列数据
语法:
变量.drop(columns='列标签')
纵向合并注意
''' 数据源的变量名称完全相同(变量名顺序没有要求),列数没有要求 '''
横向合并
语法:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'))
参数:
left:指定需要连接的主 right:指定需要连接的辅表 how:指定连接方式,默认为inner内连,还有其他选项,如左连left、右连right和外连outer on:指定连接两张表的共同字段 left_on:指定主表中需要连接的共同字段 right_on:指定辅表中需要连接的共同字段 left_index:bool类型参数,是否将主表中的行索引用作表连接的共同字段,默认为False right_index:bool类型参数, 是否将辅表中的行索引用作表连接的共同字段, 默认为False sort:bool类型参数,是否对连接后的数据按照共同字段排序,默认为False suffixes:如果数据连接的结果中存在重叠的变量名,则使用各自的前缀进行区分
matplotlib模块
简介
是一个强大的python绘图和数据可视化工具包,数据可视化也是我们数据分析重要环节之一,也是数据分析的最后一个可视化阶段
模块下载
python开发环境下
pip3 install matplotlib -i 网络地址
anaconda环境下
conda install matplotlib -i 网络地址 ''' anaconda已经下载好了数据分析相关的模块,无需再下载 '''
模块导入
import matplotlib.pyplot as plt
饼图概念
仅排列在工作表的一列或一行中的数据可以绘制到饼图中。 饼图显示一个数据系列 中各项的大小与各项总和的比例。饼图中的数据点 (数据点:在图表中绘制的单个值,这些值由条形、柱形、折线、饼图或圆环图的扇面、圆点和其他被称为数据标记的图形表示。相同颜色的数据标记组成一个数据系列。)显示为整个饼图的百分比。
语法:
pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, labeldistance=1.1)
参数:
x:指定绘图的数据 explode:指定饼图某些部分的突出显示,即呈现爆炸式 labels:为饼图添加标签说明,类似于图例说明 colors:指定饼图的填充色 autopct:自动添加百分比显示,可以采用格式化的方法显示 pctdistance:设置百分比标签与圆心的距离 labeldistance:设置各扇形标签(图例)与圆心的距离
- 轴标签过长。
- 显示的数值是持续型的。
- 数据差异大
语法:
bar(x, y, width=0.8, bottom=None, color=None, edgecolor=None, tick_label=None, label = None, ecolor=None)
参数:
x:传递数值序列,指定条形图中x轴上的刻度值 y:传递数值序列,指定条形图y轴上的高度 width:指定条形图的宽度,默认为0.8 bottom:用于绘制堆叠条形图 color:指定条形图的填充色 edgecolor:指定条形图的边框色 tick_label:指定条形图的刻度标签 label:指定条形图的标签,一般用以添加图例
- 轴标签过长。
- 显示的数值是持续型的。
- 数据差异大
语法:
bar(x, y, width=0.8, bottom=None, color=None, edgecolor=None, tick_label=None, label = None, ecolor=None)
参数:
x:传递数值序列,指定条形图中x轴上的刻度值 y:传递数值序列,指定条形图y轴上的高度 width:指定条形图的宽度,默认为0.8 bottom:用于绘制堆叠条形图 color:指定条形图的填充色 edgecolor:指定条形图的边框色 tick_label:指定条形图的刻度标签 label:指定条形图的标签,一般用以添加图例
如何取消%matplotlib效果
运行方法与matplotlib一样
%matplotlib inline
水平条形图
概念
擅长对比差异不大或水平值过多的离散型变量
对于条形图而言,对比的是柱形的高低,柱体越高,代表的数值越大,反之亦然
语法:
bar(x, height, width=0.8, bottom=None, color=None, edgecolor=None, tick_label=None, label = None, ecolor=None)
参数:
x:传递数值序列,指定条形图中x轴上的刻度值 height:传递数值序列,指定条形图y轴上的高度 width:指定条形图的宽度,默认为0.8 bottom:用于绘制堆叠条形图 color:指定条形图的填充色 edgecolor:指定条形图的边框色 tick_label:指定条形图的刻度标签 label:指定条形图的标签,一般用以添加图例
交叉条图形
概念与条形图一致,使用模块也基本一致
绘图
# 绘制图 pic_num.plot( # 设置x轴名字 x = 'City', # 设置y轴名字 y = [2016,2017], # 设置图形样式 kind = 'bar', # 颜色 color = ['red', 'green'], # 用于旋转x轴刻度标签的角度,0表示水平显示刻度标签 rot = 45, # 图形宽度 width = 0.5, title = '近两年5个城市亿万资产家庭数比较') # 加y轴标签 plt.ylabel('亿万资产家庭数') # 显示内容 plt.show()
直方图
概念
主要用于观察数据分布,x轴代表数值的均匀分段,y轴代表每个段内的观测数量
直方图都会与核密度图搭配使用,可以掌握数据的分布特征
语法:
plt.hist(x, bins=10, normed=False, orientation='vertical', color=None, label=None)
参数:
x:指定要绘制直方图的数据。 bins:指定直方图条形的个数。 normed:是否将直方图的频数转换成频率 orientation:设置直方图的摆放方向,默认为垂直方向 color:设置直方图的填充色 edgecolor:设置直方图边框色 label:设置直方图的标签,可通过legend展示其图例
箱型图
语法:
plt.boxplot(x, vert=None, whis=None, patch_artist=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None)
参数:
x:指定要绘制箱线图的数据
vert:是否需要将箱线图垂直摆放,默认垂直摆放
whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差
patch_artist:bool类型参数,是否填充箱体的颜色;默认为False
meanline:bool类型参数,是否用线的形式表示均值,默认为False
showmeans:bool类型参数,是否显示均值,默认为False
showcaps:bool类型参数,是否显示箱线图顶端和末端的两条线(即上下须),默认为True showbox:bool类型参数,是否显示箱线图的箱体,默认为True
showfliers:是否显示异常值,默认为True
boxprops:设置箱体的属性,如边框色,填充色等
labels:为箱线图添加标签,类似于图例的作用
filerprops:设置异常值的属性,如异常点的形状、大小、填充色等
medianprops:设置中位数的属性,如线的类型、粗细等
meanprops:设置均值的属性,如点的大小、颜色等
capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等
whiskerprops:设置须的属性,如颜色、粗细、线的类型等
折线图
概念
对于时间序列数据而言,一般都会使用折线图反映数据背后的趋势。
通常折线图的横坐标指代日期数据,纵坐标代表某个数值型变量,当然还可以使用第三个离散变量对折线图进行分组处理;
语法:
plt.plot(x, y, linestyle, linewidth, color, marker, markersize, markeredgecolor, markerfactcolor, markeredgewidth, label, alpha)
参数:
x:指定折线图的x轴数据
y:指定折线图的y轴数据
linestyle:指定折线的类型,可以是实线、虚线、点虚线、点点线等,默认为实线
linewidth:指定折线的宽度
marker:可以为折线图添加点,该参数是设置点的形状
markersize:设置点的大小
markeredgecolor:设置点的边框色
markerfactcolor:设置点的填充色
markeredgewidth:设置点的边框宽度
label:为折线图添加标签,类似于图例的作用
散点图和气泡图
概念
散点图: 如果需要研究两个数值型变量之间是否存在某种关系,例如正向的线性关系,或者是趋势性的非线性关系,那么散点图将是最佳的选择; 气泡图: 气泡图的实质就是通过第三个数值型变量控制每个散点的大小,点越大,代表的第三维数值越高,反之亦然; 气泡图的绘制,使用的仍然是scatter函数,区别在于函数的s参数被赋予了具体的数值型变量;
语法:
scatter(x, y, s=20, c=None, marker='o', alpha=None, linewidths=None, edgecolors=None)
参数
x:指定散点图的x轴数据
y:指定散点图的y轴数据
s:指定散点图点的大小,默认为20,通过传入其他数值型变量,可以实现气泡图的绘制
c:指定散点图点的颜色,默认为蓝色,也可以传递其他数值型变量,通过cmap参数的色阶表示数值大小
marker:指定散点图点的形状,默认为空心圆
alpha:设置散点的透明度
linewidths:设置散点边界线的宽度
edgecolors:设置散点边界线的颜色
热力图
概念
热力图也称为交叉填充表,图形最典型的用法就是实现列联表的可视化,即通过图形的方式展现两个离散变量之间的组合关系;
语法:
# matplotlib绘制热力图不太方便需要借助于seaborn模块 sns.heatmap(data, cmap=None, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor ='white')
参数
data:指定绘制热力图的数据集
cmap:指定一个colormap对象,用于热力图的填充色
annot:指定一个bool类型的值或与data参数形状一样的数组,如果为True,就在热力图的每个单元上显示数值
fmt:指定单元格中数据的显示格式
annot_kws:有关单元格中数值标签的其他属性描述,如颜色、大小等
linewidths:指定每个单元格的边框宽度
linecolor:指定每个单元格的边框颜色
组合图的绘制
存在的原因
工作中往往会根据业务需求,将绘制的多个图形组合到一个大图框内,形成类似仪表板的效果;
语法:
plt.subplot2grid(shape, loc, rowspan=1, colspan=1, **kwargs)
参数:
shape:指定组合图的框架形状,以元组形式传递,如2×3的矩阵可以表示成(2,3)
loc:指定子图所在的位置,如shape中第一行第一列可以表示成(0,0)
rowspan:指定某个子图需要跨几行
colspan:指定某个子图需要跨几列
数据清洗
数据分析流程
需求分析——获取数据——数据清洗——探索数据——建模分析——撰写分析报告+数据可视化
什么是数据清洗
从记录表、表格、数据库中检测、纠正或删除损坏或不准确记录的过程
专业名词
脏数据:没有经过处含有一定问题的数据,如:缺失、异常、重复...
干净数据:经过处理完全符合规范要求的数据
数据清理使用方法
1.读取外部数据
read_csv:读取txt和csv文件,read_excel:读取excel文件, read_sql:读取数据库,read_html:读取网页
2.数据概览
index 行索引值,columns 列索引,head 前头5个数据,tail 尾部5个数据,shape 表格行数和列数,describe 显示快速统计数据,info 查看数据整体信息,dtypes 看数据类型
3.简单处理
移除首尾空格 大小写转换...
4.重复值处理
duplicated()查看是否含有重复数据
drop_duplicates()删除重复数据
5.缺失值处理
删除缺失值、填充缺失值
6.异常值处理
删除异常值、修正异常值(当作缺失值处理)
7.字符串处理
切割、筛选...
8.时间格式处理
将时间字符串转换为时间格式 Y m d H M S
实战案例
获取数据
# 调用模块 import numpy as np import pandas as pd import matplotlib.pyplot as plt # 获取数据 df = pd.read_csv(r'qunar_freetrip.csv')
删除无用列字段
df.drop(['Unnamed: 0'],axis=1,inplace=True)
for循环依次取出,列字段首位的空格
# 申明变量 css=[] # 循环获取 for col in df.columns: # 去除空格 css.append(col.strip()) # 修改数据 df.columns=css
针对重复的数据一般情况下都是直接删除的
df.drop_duplicates(inplace=True)
df[df.duplicated()].count()
修改行索引
df.index=range(0,df.shape[0])
拼接索引值,再删除
# 造变量 res=[] # 纵向合并数据 res=pd.concat([df[df['节省']>df['价格']],sd]) del_index=res.index # 删除数据 df.drop(index=del_index,inplace=True)
1.占比过小可以直接删除 2.利用均值、统一值直接填充 3.根据不同的情况采用不同的计算公式填充 常用的四个方法 isnull 判断 notnull 判断 fillna 填充 dropna 删除 保留几位小数 round(数据,保留几位)
删除’价格‘为空的数据
# 获取价格空的索引值 wroin=df[df['价格'].isnull()].index # 删除 df.drop(index=wroin,inplace=True)
删除’节省‘为空的数据
# 获取节省空的索引值 wroless=df[df['节省'].isnull()].index # 删除 df.drop(index=wroless,inplace=True)
重置行索引值
df.index = range(0,df.shape[0])
出发地缺失数据值处理
发现有数据缺失
# 利用布尔值索引筛选出出发地有缺失的数据 df[df.出发地.isnull()]
使用正则
# 调用模块 import re # 利用正则重路线中获取出发地址 df.loc[df.出发地.isnull(),'出发地']=[re.findall('(.*?)-',i) for i in df.loc[df.出发地.isnull(),'路线名'].va
针对缺失值的处理
''' 1.操作数据的列字段需要使用loc方法 2.采用数学公式依据其他数据填充 3.缺失值可能在其他单元格中含有 4.如果缺失值数量展示很小可删除 '''
使用正则
# 调用模块 import re # 利用正则重路线中获取出发地址 df.loc[df.目的地.isnull(),'目的地']=[re.findall('-(.*?)\d',i) for i in df.loc[df.目的地.isnull(),'路线名']
重要名词解释
离散型
离散型数据就是非数字类型
数据符号网站
网址:http://www.fhdq.net/sx/14.html
因变量与自变量
Y=f(X)。此式表示为:Y随X的变化而变化。Y是因变量,X是自变量。
因变量也叫函数值。函数关系式中,某些特定的数会随另一个(或另几个)会变动的数的变动而变动,就称为因变量。
自变量是被操纵的变量,而因变量是被测定或被记录的变量。也就是说自变量是“原因”,而因变量就是“结果”。
哑变量
虚拟变量 ( Dummy Variables) 又称虚设变量、名义变量或哑变量,用以反映质的属性的一个人工变量,是量化了的自变量,通常取值为0或1。
训练集与测试集
训练集用于模型的训练创建 测试集用于模型的测试检验
一般情况下训练集占总数据的80%、测试集占总数占20%
判断线性关系
如何判断两个变量之间是否存在线性关系与非线性关系
1.散点图
2.公式计算
绝对值大于等于0.8表示高度相关 绝对值大于等于0.5小于等于0.8表示中度相关 绝对值大于等于0.3小于0.5表示弱相关 绝对值小于0.3表示几乎不相关(需要注意这里的不相干指的是没有线性关系 可能两者之间有其他关系)
数据准备
# 调用模块 import numpy import pandas # 申明变量 X = [52,19,7,33,2] Y = [162,61,22,100,6]
方法2:numpy中的corrcoef方法直接计算
t=numpy.corrcoef(X,Y)
方法3: pandas中的corr方法直接计算
data = pandas.DataFrame({'X':X,'Y':Y}) t2=data.corr()
一元线性回顾模型
一元线性回归模型公式
Y=a+bX+ε
Y为因变量,X为自变量,a为截距,b为斜率,ε为误差项。
ε是为了平衡等号两边的值,通常被称为模型⽆法解释的部分;
参数a和b的求解思路
1.如果拟合线能够精确地捕捉到每⼀个点(即所有散点全部落在拟 合线上),那么对应的误差项ε应该为0;
2.模型拟合的越好,则误差项ε应该越⼩
模型应用
调用模块
import statsmodels.api as sm sm.ols(formula, data, subset=None, drop_cols=None)
参数
formula:以字符串的形式指定线性回归模型的公式,如'y~x'就表示简单线性回归模型
data:指定建模的数据集
多元线性回归模型
公式:
Yi=β0+β1X1i+β2X2i+…+βkXki+ε
模型假设检验(F与T)
F检验概念
提出问题的原假设和备择假设,在原假设的条件下,构造统计量F,根据样本信息,计算统计量的值,对⽐统计量的值和理论F分布的值,当统计量值超过理论值时,拒绝原假设,否则接受原假设
T假设
T检验更加侧重于检验模型的各个参数是否合理
主要看P>|t|列,其余变量都没有通过系数的显著性检验,在模型中变量不影响利润的重要因素
岭回归模型、Lasso回归模型和交叉模型
线性回归模型的短板
- 自变量的个数大于样本量
- 自变量之间存在多重共线性
为了解决这些短板就诞生了:岭回归和Lasso模型
岭回归模型
在线性回归模型的基础之上添加一个l2惩罚项(平方项、正则项)
'''该模型最终转变成求解圆柱体与椭圆抛物线的焦点问题'''
Lasso回归模型
在线性回归模型的基础之上添加一个l1惩罚项(绝对值项、正则项)
相较于岭回归降低了模型的复杂度
'''该模型最终转变成求解正方体与椭圆抛物线的焦点问题'''
交叉验证
将所有数据都参与到模型的构建和测试中 最后生成多个模型
再从多个模型中筛选出得分最高(准确度)的模型
将线性回归模型的公式做Logit变换即为Logistic回归模型
将预测问题变成了0到1之间的概率问题
事件发生比为:e的β1次方
混淆矩阵
A:表示正确预测负例的样本个数,⽤TN表示。
B:表示预测为负例但实际为正例的个数,⽤FN表示。
C:表示预测为正例但实际为负例的个数,⽤FP表示。
D:表示正确预测正例的样本个数,⽤TP表示。
准确率:表示正确预测的正负例样本数与所有样本数量的⽐值,即(A+D)/(A+B+C+D)。
正例覆盖率:表示正确预测的正例数在实际正例数中的⽐例,即D/(B+D)。
负例覆盖率:表示正确预测的负例数在实际负例数中的⽐例,即A/(A+C)。
正例命中率:表示正确预测的正例数在预测正例数中的⽐例,即D/(C+D),
模型评估方法
1.ROC曲线
主要计算折线下的⾯积,这个⾯积称为AUC。AUC的值越⼤越好,通常情况下, 当AUC在0.8以上时,模型就基本可以接受了。
2.KS曲线
通过两条曲线很难对模型的好坏做评估,选⽤最⼤的KS值作为衡量指标。KS的计算公式为: KS= Sensitivity-(1- Specificity)= Sensitivity+ Specificity-1。对于KS值⽽⾔,也是希望越⼤越好,通常 情况下,当KS值⼤于0.4时,模型可以接受。
决策树和决策森林
概念
""" 决策树与随机森林的功能 默认情况下解决分类问题(买与不买、带与不带、走与不走) 也可以切换算法解决预测问题(具体数值多少) """
树其实是一种计算机底层的数据结构,计算机里面的树都是自上而下的生长
决策树则是算法模型中的一种概念 有三个主要部分:
根节点、枝节点、叶子节点
# 根节点与枝节点用于存放条件 叶子节点存放真正的数据结果
1.信息熵
⽤来表示信息量的⼤⼩。 信息量越⼤(分类越不“纯净”),对应的熵值就越⼤,反之亦然。
eg:信息熵小相当过马路时为红灯情况,信息熵大相当于买彩票中奖情况
2.条件熵
条件熵其实就是由信息熵再次细分而来
eg:比如有九个用户购买了商品五个没有购买 那么条件熵就是继续从购买不购买的用户中再选择一个条件(比如按照性别计算男和女的熵)
3.信息增益
信息增益可以反映出某个条件是否对最终的分类有决定性的影响
在构建决策树时根节点与枝节点所放的条件按照信息增益由大到小排
4.信息增益率
决策树中的ID3算法使⽤信息增益指标实现根节点或中间节点的字段选择,但是该指标存在⼀个⾮常明显的缺
点,即信息增益会偏向于取值较多的字段。
为了克服信息增益指标的缺点,提出了信息增益率的概念,它的思想很简单,就是在信息增益的基础上进⾏相
应的惩罚。
决策树函数
DecisionTreeClassifier(criterion='gini', splitter='best',
max_depth=None,min_samples_split=2,
min_samples_leaf=1,max_leaf_nodes=None,
class_weight=None)
随机森林思想
随机森林中每颗决策树都不限制节点字段选择,有多棵树组成的随机森林
在解决分类问题的时候采用投票法、解决预测问题的时候采用均值法
随机森林函数
RandomForestClassifier(n_estimators=10, criterion='gini', max_depth=None,
min_samples_split=2, min_samples_leaf=1,
max_leaf_nodes=None, bootstrap=True, class_weight=None)
K近邻模型
概念
思想:根据位置样本点周边K个邻居样本完成预测或者分类
K值选择
1.先猜测
2.交叉验证
3.作图选择最合理的k值,准确率(越大越好) MSE(越小越好)
如果k值过小,会导致模型过拟合,反之,又会时模型欠拟合
距离
欧式距离:两点之间的直线距离
曼哈顿距离:默认两点直接有障碍物
余弦相似度:eg:论文查重
K近邻模型函数
neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform',
p=2, metric='minkowski',p=2)