一周内容回顾(10.18-10.22)
day01
缺失值处理
1. df.isnull
2. df.notnull
3. df.fillna
4. df.dropna
统计每个数据项是否有缺失
df.isnull()
统计列字段下是否含有缺失
df.isnull().any(axis = 0)
计算各列数据的缺失比例
df.isnull().sum(axis=0)/df.shape[0]
在实际工作中针对缺失值的填充要结合实际情况 不同类型的数据应该采取不同的填充策略
eg:
年龄的缺失填充可以使用平均值(mean)
性别的缺失值填充可以使用众数(mod)
薪资的缺失值填充可以使用中位数(median)
df.fillna(value = { 'gender':data05.gender.mode()[0], 'age':data05.age.mean(), 'income':data05.income.median() }, inplace = True)
透视表功能
# 将一张表格数据按照一定的条件制作成另外一张表
pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
通过groupby方法,指定分组变量
import numpy as np
grouped = df.groupby(by = ['',''])
对分组变量进行统计汇总
result = grouped.aggregate({'color':np.size, 'carat':np.min,
'price':np.mean, 'table':np.max})
分析NBA各球队冠军次数及球员FMVP次数
res = pd.read_html('https://baike.baidu.com/item/NBA%E6%80%BB%E5%86%A0%E5%86%9B/2173192?fr=aladdin') # 返回的是一个列表
type(res)
res
# 获取有效数据
champion = res[0]
champion
处理列字段名称
champion.columns = champion.iloc[0]
champion.drop(index=0,inplace=True)
champion
获取每个球队的夺冠次数
res1 = champion.groupby(by='冠军').aggregate({'冠军':np.size})
res1
获取每个球队的夺冠次数和球员FMVP
# res2 = champion.groupby(['冠军','FMVP']).size()
res2 = champion.groupby(['冠军','FMVP']).aggregate({'冠军':np.size})
res2
获取各组冠军次数(升序/降序)
champion.groupby('冠军').size().sort_values(ascending=False)
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None)
1.纵向合并
将多张表按照字段一一对应纵向合并
pd.concat([df1,df2]
小结论
concat行合并,数据源的变量名称需完全相同
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'))
matplotlib简介
是一个强大的python绘图和数据可视化工具包,数据可视化也是我们数据分析重要环节之一,可以帮助我们分析出很多价值信息,也是数据分析的最后一个可视化阶段
饼图的绘制
# 主要用于展示有限数据项之间的占比情况 import matplotlib.pyplot as plt plt.pie() plt.show()
条形图的绘制
对于条形图而言,对比的是柱形的高低,柱体越高,代表的数值越大,能够使人们一眼看出各个数据的大小,易于比较数据之间的差别 # 1.图形弹出展示 %matplotlib # 2.解决中文乱码 固定的代码 plt.bar() .text(x,y,data)
day02
-
-
交叉条形图
-
散点图与气泡图
-
热力图
-
箱线图
-
# 关键字barh 主要用于展示排序后的数据
交叉条形图
# 关键字bar 主要用于展示多组离散型变量的大小
直方图
# 关键字hist 用来展示数据的分布形态一般与核密度图搭配使用,能更加清晰地展示数据的分布特征
箱线图
# 关键字boxplot 用来展示数据的分布形态,通过该图得知数据的下须值、上下四分位数,中位数等,也能发现数据的异常点
折线图
# 关键字plot 表中数据含有时间序列的就可以使用该图,用来反映一个趋势
双折线图
# 关键字plot 通过第三个离散性变量对折线图进行分组处理
散点图
# 关键字scatter 显示两个数值型变量的线性关系,可以是正反向或者是非线性关系
气泡图
# 关键字scatter 通过第三个数值型变量来控制每个散点的大小,需要用到参数s
热力图
# 关键字heatmap 又称为交叉填充图,用来展示离散性变量之间的组合关系
组合图
将绘制的多个图形组合到一个大图框内
图形可视化模块
1.matplotlib 2.seaborn 3.ds.js 4.highcharts 5.echarts
day03
- 数据清洗的概念
- 数据清洗实战案例
数据清洗
专业定义
数据清洗是从记录表、表格、数据库中检测、纠正或者删除损坏或不准确记录的过程
脏数据
没有经过处理自身含有一定问题的数据
干净数据
经过处理完全符合规范要求的数据
流程及常用方法
1.读取外部数据
read_csv/read_excel/read_sql/read html
2.数据概览
index/columns/head/tail/shape/describe/info/dtypes
3.简单处理
移除字段名首尾空格,大小写转换...
4.重复值处理
duplicated() # 查看是否含有重复数据
drop_deplicates() # 删除重复数据
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')
思路
1.查看前五条数据,掌握个大概
2.查看表的行列总数
3.查看所有的列字段
# 发现列字段有一些是有空格的
4.查看数据整体信息
# 发现去程时间和回程时间是字符串类型需要做日期类型转换
5.快速统计
列字段处理
1.删除无用列字段
df.drop(columns='Unnamed:0',axis=1,inplace=True)
2.获取列字段发现字段名内有空格
cols = df.columns.values
3.利用for循环依次取出列字段首尾空格
# 方法一
ccs = []
for col in cols:
ccs.append(col.strip())
print(ccs)
# 方法二
利用列表生成式
df.columns = [col.strip() for col in cols]
重复值处理
1.重复数据查找
df.duplicated()
2.简单看一下重复数据的模样,通过布尔值索引
3.对于重复的数据,最常见的处理方式就是删除
df.drop_duplicates(inplace=True)
df.shape # 确认是否一删除
4.删除之后发现原数据的行索引不会自动重置
5.解决措施就是先获取表的行索引值,在右侧加上赋值符号就是修改行索引
df.index
df.index = range(0,df.shape[0])
df.tail()
补充
"""MySQL中如何快速判断某列是否含有重复的数据"""
# 思路
就是统计某个字段下数据的个数载利用去重操作,两者结合判断
如果两者数字相同表示name列没有重复的数据,不同表示含有重复的数据
sql语句
select count(name) from userinfo;
select count(distinct(name)) from userinfo;
异常值处理
1.可以先通过快速统计的方法筛选出可能有异常数据的字段
df.describe()
# 发现价格小于节省,那么可能是价格或节省有问题
2.利用固定的算法公式去求证我们的猜想
# 判断的标准
sd = (df['价格'] - df['价格'].mean()) / df['价格'].std()
# 利用逻辑索引筛选数据
df[(sd > 3)|(sd < -3)]
# 别忘了要移除正负号
df[abs(sd) > 3] # abs就是绝对值的意思
3.同理也可以筛选出节省的异常数据项(不一定要使用)
# 另一种更快的筛选节省异常数据的方式
df[df['节省'] > df['价格']]
4.删除价格和节省都有异常的数据
# 方式一
res = pd.concat([df[df['节省'] > df['价格']],df[abs(sd) > 3]])
# 获取要删除的行数据 索引值
del_index = res.index
# 根据索引删除数据
df.drop(index=del_index,inplace=True)
# 再次重置索引
df.index = range(0,df.shape[0])
# 方式2 得出一个结果就删一个
出发地缺失值处理
1.查找具有缺失值得字段列名称
2.利用布尔值索引筛选出出发地有缺失的数据
3.获取出发地缺失的数据的路线数据
4.利用字符串切割替换出发地缺失数据
for i in res['路线名'].values:
print(i.split('-')[0])
5.形成列表生成式简写上面的操作
并利用isnull方法查看出发地字段内是否有缺失数据
df.loc[df.出发地.isnull(),'出发地'] = [i.split('-')[0] for i in df.loc[df.出发地.isnull(),'路线名'].values]
总结
# 针对缺失值的处理
1.采用数学公式依据其他数据填充
2.缺失值可能在其他单元格中含有
3.如果缺失值数量展示很小可删除
目的地缺失值处理
1.利用布尔值索引筛选出出发地有缺失的数据
2.获取目的地缺失的路线数据
3.利用正则筛选出目的地
# 案例演示 reg_exp = '-(.*?)\d' # res = re.findall(reg_exp,'深圳-秦皇岛3天2晚 | 入住大连黄金山大酒店 + 南方航空/东海往返机票')
代码
import re
for i in df.loc[df.目的地.isnull(),'路线名'].values:
print(re.findall('-(.*?)\d',i)[0])
4.形成列表生成式简写上面的操作
并利用isnull方法查看出发地字段内是否有缺失数据
df.loc[df.目的地.isnull(),'目的地'] = [re.findall('-(.*?)\d',i) for i in df.loc[df.目的地.isnull(),'路线名'].values]
df[df['目的地'].isnull()]
价格与节省缺失值处理
1.筛选出所有价格缺失的数据
2.直接利用价格的均值填充缺失数据
df['价格'].mean()
round(df['价格'].mean(),1)
df['价格'].fillna(round(df['价格'].mean(),1),inplace=True)
3.同理针对节省的数据也做中位数填充
df['节省'].fillna(round(df['节省'].mean(),1),inplace=True)
# 验证
df.isnull().sum()
day04
- 一元线性回归模型与多元线性回归模型
- 训练集与测试集
- 哑变量
- 自定义哑变量
因变量
函数关系式中,某些特定的数会随另一个(或另几个)会变动的数的变动而变动,就称为因变量
自变量
在数学等式中能够影响其他变量的一个变量叫做自变量
线性回归模型
线性回归模型是一种确定变量之间的相关关系的一种数学回归模型
分类:
1.一元线性回归模型
2.多元线性回归模型
如何判断两个变量之间是否存在线性关系与非线性关系
1.散点图
2.公式计算
大于等于0.8表示高度相关
绝对值大于等于0.5小于等于0.8表示中度相关
绝对值大于等于0.3小于0.5表示弱相关
绝对值小于0.3表示几乎没有线性关系
公式代码
#均值 XMean = numpy.mean(X) YMean = numpy.mean(Y) #标准差 XSD = numpy.std(X) YSD = numpy.std(Y) #z分数 ZX = (X-XMean)/XSD ZY = (Y-YMean)/YSD # 相关系数 r = numpy.sum(ZX*ZY)/(len(X)) r
3.numpy中的corrcoef方法
4.pandas中的corr方法
一元线性回归模型
# 主要用来解决影响某个事物变化的元素只有一种条件的情况
y = a + bx + 误差项
"""
y是因变量 a是截距项 b是斜率项 x是自变量 误差项用于描述无法解释的部分
"""
描点划线:尽可能多的让点落在直线上 其他点到直线的距离的平方和一定要最小
多元线性回归
# 主要用来解决影响某个事物变化的因素有多种条件的情况
y = a + b1x2 + b2x2 + b3x3 + ... + 误差项
训练集与测试集
# 训练集
用于模型的训练创建
# 测试集
用于模型的测试检验
"""一般情况下训练集占总数据的80%、测试集占总数的20%"""
哑变量
数学模型的构建只能是数字类型的数据参与
非数字类型的数据如果要参与构建需要先转换成数字类型(该过程称之为构造哑变量)
哑变量构造完成后还需要确保多个哑变量之间不存在多种共线性
# 构造哑变量 >>> C(State)
自定义哑变量
# 生成由State变量衍生的哑变量 dummies = pd.get_dummies(Profit.State) # 将哑变量与原始数据集水平合并 Profit_New = pd.concat([Profit,dummies], axis = 1) # 删除State变量和California变量(因为State变量已被分解为哑变量,New York变量需要作为参照组) Profit_New.drop(labels = ['State','New York'], axis = 1, inplace = True) # 拆分数据集Profit_New train, test = model_selection.train_test_split(Profit_New, test_size = 0.2, random_state=1234) # 建模 model2 = sm.formula.ols('Profit~RD_Spend+Administration+Marketing_Spend+Florida+California', data = train).fit() print('模型的偏回归系数分别为:\n', model2.params)
day05
-
-
岭回归与Lasso回归
-
Logistic回归模型
-
决策树与随机森林
-
提出原假设(正向验证)和备择假设(反向验证),之后计算统计量与理论值,最后比较大小,如果统计量的值大于理论值,则模型是合理的
T检验
model.summary() # 绝对值越小影响越大
# F检验与T检验的区别
F检验主要检验的是模型是否合理
T检验更加侧重于检验模型的各个参数是否合理
补充:
1.自变量的个数大于样本量
2.自变量之间存在多重共线性
1.岭回归模型
在线性回归模型的基础之上添加一个l2惩罚项(平方项、正则项)
通过凸优化等价推导该模型最终转变成求解圆柱体与椭圆抛物线的焦点问题
将所有数据都参与到模型的构建和测试中,最后生成多个模型
再从多个模型中筛选出得分最高(准确度)的模型
岭回归的交叉验证法
RidgeCV()
2.Lasso回归模型
在线性回归模型的基础之上添加一个l1惩罚项(绝对值项、正则项)
通过凸优化等价推导该模型最终转变成求解正方体与椭圆抛物线的焦点问题
Lasso回归的交叉验证法
LassoCV()
岭回归与Lasso回归的区别
1.惩罚项不一样,一个是平方项一个是绝对值项
2.相较于岭回归降低了模型的复杂度
将线性回归模型的公式做Logit变换
# 特点
将预测问题变成了0到1之间的概率问题
准确率:表示正确预测的正负例样本数与所有样本数量的⽐值,即(A+D)/(A+B+C+D)
正例覆盖率:表示正确预测的正例数在实际正例数中的⽐例,即D/(B+D)
负例覆盖率:表示正确预测的负例数在实际负例数中的⽐例,即A/(A+C)
正例命中率:表示正确预测的正例数在预测正例数中的⽐例,即D/(C+D)
1.F检验
2.T检验
3.ROC曲线
通过计算AUC阴影部分的面积来判断模型是否合理(通常大于0.8表示OK)
4.KS曲线
通过计算两条折现之间最大距离来衡量模型是否合理(通常大于0.4表示OK)
LogisticRegression()
树其实是一种计算机底层的数据结构,与现实不同
计算机里面的树都是自上而下的生长
决策树
是算法模型中的一种概念
有三个主要部分
1.根节点
2.枝节点
3.叶子节点
# 根节点与枝节点用于存放条件 叶子节点存放真正的数据结果
决策树节点字段的选择
1.信息熵
⽤来表示信息量的⼤⼩,信息量越⼤,对应的熵值就越⼤,反之亦然
eg:
信息熵小相当于红绿灯情况
信息熵大相当于买彩票中奖情况
2.条件熵
条件熵其实就是由信息熵再次细分而来
按一个新的变量的每个值对原变量进行分类
3.信息增益
信息增益可以反映出某个条件是否对最终的分类有决定性的影响
ps:在构建决策树时根节点与枝节点所放的条件按照信息增益由大到小排
4.信息增益率
决策树中的ID3算法使⽤信息增益指标实现根节点或中间节点的字段选择,但是该指标存在⼀个⾮常明显的缺点,即信息增益会偏向于取值较多的字段
为了克服信息增益指标的缺点,提出了信息增益率的概念,它的思想很简单,就是在信息增益的基础上进⾏相应的惩罚
基尼指数
可以让模型解决预测问题
基尼指数增益
与信息增益类似,还需要考虑⾃变量对因变量的影响程度,即因变量的基尼指数下降速度的快慢,下降得越快,⾃变量对因变量的影响就越强
小结论
默认情况下解决分类问题(买与不买、带与不带、走与不走)
也可以切换算法解决预测问题(具体数值多少)
决策树模型函数
DecisionTreeClassifier()
随机森林中每颗决策树都不限制节点字段选择
由多棵树组成的随机森林在解决分类问题的时候采用投票法,
解决预测问题的时候采用均值法
随机森林模型函数
RandomForestClassifier()
思想:根据位置样本点周边K个邻居样本完成预测或者分类
K值的选择
1.先猜测待测试的不同K值
2.交叉验证
3.作图选择最合理的k值
准确率(越大越好) MSE(越小越好)
过拟合
在统计模型中,由于使用的参数过多而导致模型对观测数据过度拟合,以至于用该模型来预测其他测试样本输出的时候与实际输出或者期望值相差很大的现象
欠拟合
由于统计模型使用的参数过少,以至于得到的模型难以拟合观测数据的现象
距离
1.欧式距离
两点之间的直线距离
2.曼哈顿距离
默认两点直接有障碍物
3.余弦相似度
通过计算两个向量的夹角余弦值来评估他们的相似度(论文查重)
K近邻模型函数
neighbors.KNeighborsClassifier()

浙公网安备 33010602011771号