接着昨天的没写完的数据分析继续
7.矩阵分析
矩阵分析是指根据事物的两个重要属性作为分析依据进行关联分析,从而找出解决问题的方法。
举个例子,从人均月消费和人均月流量通过矩阵分析直观的看到领先的城市和相对低的城市
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
#点的标签
font=matplotlib.font_manager.FontProperties(fname='F:/SourceHanSansCN-Light.otf',size=10)
#坐标轴的标签
labelfont=matplotlib.font_manager.FontProperties(fname='F:/SourceHanSansCN-Light.otf',size=35)
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#点的颜色设置为蓝色,文本颜色设置为灰色
maincolor=(91/255,155/255,213/255,1)
fontcolor=(110/255,110/255,110/255,1)
#导入数据
data=pd.read_csv('D:/矩阵分析.csv',encoding='utf8')
我们先来看一下数据内容
我们想通过月消费和月流量两个方面进行矩阵分析,找到每个省的用户质量
开始矩阵分析
#数据分析部分,矩阵分析
#按照省份分组,对月消费进行均值统计
cost_agg=data.groupby(by='省份',as_index=False)['月消费(元)'].agg('mean')
#按照省份分组,对月流量进行均值统计
data_agg=data.groupby(by='省份',as_index=False)['月流量(MB)'].agg('mean')
#把两个统计结果结合起来
aggdata=cost_agg.merge(data_agg)
我们把各个省月消费和月流量的平均数据得到,并且整理为一个新的数据框aggdata,为了更直观的展示,这里我就先提前画了一下散点矩阵图,下次数据可视化的时候我也会仔细说说
#数据可视化部分
#绘制散点矩阵图
fig=plt.figure()
gap=0.01
#x轴范围
xmin=aggdata['月消费(元)'].min()*(1-gap)
xmax=aggdata['月消费(元)'].max()*(1+gap)
#y轴范围
ymin=aggdata['月流量(MB)'].min()*(1-gap)
ymax=aggdata['月流量(MB)'].max()*(1+gap)
plt.xlim(xmin,xmax)
plt.ylim(ymin,ymax)
plt.xticks([])
plt.yticks([])
#绘制散点
plt.scatter(aggdata['月消费(元)'],aggdata['月流量(MB)'],s=20,marker='o',color=maincolor)
#设置坐标轴标签
plt.xlabel('人均月消费(元)',color=fontcolor,fontproperties=labelfont)
plt.ylabel('人均月流量(MB)',color=fontcolor,fontproperties=labelfont)
#绘制均值分界线
plt.vlines(x=data['月消费(元)'].mean(),ymin=ymin,ymax=ymax,linewidth=1,color=maincolor)
plt.hlines(y=data['月流量(MB)'].mean(),xmin=xmin,xmax=xmax,linewidth=1,color=maincolor)
#添加象限标号
plt.text(xmax-1,ymax-5,'I',color=fontcolor,fontsize=20)
plt.text(xmin,ymax-5,'II',color=fontcolor,fontsize=20)
plt.text(xmin,ymin,'III',color=fontcolor,fontsize=20)
plt.text(xmax-1.1,ymin,'IV',color=fontcolor,fontsize=20)
#为每个省份的点添加上标签
for i,r in aggdata.iterrows():
plt.text(r['月消费(元)']+0.25,r['月流量(MB)']-1,r['省份'],color=fontcolor,fontproperties=font)
这样就可以清楚的通过图看出哪些省份用户质量高,哪些省份用户质量较低。
8.相关分析
某一数量的变化会影响另一数量的变化,且这种变化具有随机性。
我们通常用corr函数进行相关系数的计算,它有三个参数,pearson,kendall,spearman三种不同的相关系数,通常我们就用默认的pearson系数。
我们下面就来分析一下平均收入,文盲率,超市购物率,网上购物率和本科毕业率之间的相关系数。
import pandas as pd
#导入数据
data=pd.read_csv('D:/相关分析.csv',encoding='utf8')
#计算平均收入,文盲率,超市购物率,网上购物率和本科毕业率之间的相关系数
corrmatrix=data[['平均收入','文盲率','超市购物率','网上购物率','本科毕业率']].corr()
可以看出收入和学历有较高的相关性,也比较符合客观事实。
9.回归分析
回归分析是研究自变量和因变量之间数量变化关系的一种分析方法,通过建立自变量和因变量之间的回归模型来预测因变量发展趋势的一种分析方法。一般是以下几个步骤:
1.首先根据预测数据,确定自变量和因变量
2.绘制散点图,确定回归模型的类型
3.估计模型参数,建立回归模型
4.对建立的回归模型进行检验
5.检验无误后,利用回归模型进行预测
9.1简单的线性回归分析
下面来看一个简单的线性回归分析的例子
先上代码,再讲解
import pandas as pd
#修改matplotlibrc文件,或者使用下面的代码使中文不会出现乱码
#import matplotlib
#matplotlib.rcParams['font.sans-serif'] = ['SimHei']
#matplotlib.rcParams['font.family']='sans-serif'
#matplotlib.rcParams['axes.unicode_minus'] = False
#导入数据
data=pd.read_csv('D:/简单线性回归.csv',encoding='utf8')
#定义自变量和因变量
x=data[['广告费用(万元)']]
y=data[['销售额(万元)']]
#计算相关系数
corrnum=data['广告费用(万元)'].corr(data['销售额(万元)'])
#广告费用作为x轴,销售额作为y轴绘制散点图
data.plot('广告费用(万元)','销售额(万元)',kind='scatter')
#估计模型参数,建立回归模型
#可以使用机器学习中的回归模型,调用sklearn中的LinearRegression函数
from sklearn.linear_model import LinearRegression
#创建模型
model=LinearRegression()
#对构建的模型训练
model.fit(x,y)
beta=model.coef_
alpha=model.intercept_
#得到线性回归模型:y=alpha+beta*x
#计算模型的精度
score=model.score(x,y)
#使用建立的模型对自定义x进行y值的预测
#假设我们设定广告费用x为20(万元)
myx=pd.DataFrame({'广告费用(万元)':[20]})
pred_y=model.predict(myx)
首先导入数据后看下数据内容
确定广告费用为自变量,销售额为因变量,计算相关系数为
说明两个属性存在较强的相关性,于是开始绘制散点图
从散点图看得出数据比较符合线性关系,所以调用sklearn中的线性回归模型构建模型,并训练。训练完毕后得到了我们想要的模型,现在就要对现有的模型进行检验,用sklearn自带的score函数计算模型的精度,再用现有的数据带入让其计算,看看与真实值的偏差。
可以看到精度为0.88,预测值586.341与真实值587偏差也不大,所以模型还是比较好的,千万不要想着让模型预测值为100%准确,因为那样往往容易过拟合,我们需要的是具有泛化能力的模型。
最后用模型对我们自定义的x=20进行预测
从散点图可以看出x=20的点,y值大概在620到650之间,所以模型的预测值还是比较可取的
9.2多重线性回归分析
看完了上面简单的线性回归分析,可是在实际生活中,往往是多个因素共同影响因变量的变化,所以我们还需要建立多重线性回归模型。和刚才建立简单的线性回归模型的步骤一样,只不过这次我们多添加一个自变量。
import pandas as pd
#导入数据
data=pd.read_csv('D:/多重线性回归分析.csv',encoding='utf8')
#定义自变量x和因变量y
x=data[['广告费用(万元)','客流量(万人次)']]
y=data[['销售额(万元)']]
#计算相关系数
corrnum=[data['广告费用(万元)'].corr(data['销售额(万元)']),data['客流量(万人次)'].corr(data['销售额(万元)'])]
#绘制散点图,确定回归模型的类型
data.plot('广告费用(万元)','销售额(万元)',kind='scatter')
data.plot('客流量(万人次)','销售额(万元)',kind='scatter')
#估计模型参数,建立回归模型
#可以使用机器学习中的回归模型,调用sklearn中的LinearRegression函数
from sklearn.linear_model import LinearRegression
model=LinearRegression()
#使用x,y训练模型
model.fit(x,y)
beta=model.coef_
alpha=model.intercept_
#得到多重线性回归模型:y=alpha+beta[0]*x[0]+beta[1]*x[1]
#对模型进行检验
#计算模型的精度
score=model.score(x,y)
#用现有的x值让模型预测,看预测结果与真实y值的差距
datax=pd.DataFrame({'广告费用(万元)':[17],'客流量(万人次)':[7.6]})
predy=model.predict(datax)
#使用建立的模型对自定义x进行y值的预测
#假设我们设定广告费用x为20(万元)
myx=pd.DataFrame({'广告费用(万元)':[20],'客流量(万人次)':[5]})
pred_y=model.predict(myx)
我们把广告费用和客流量当作自变量,计算它们和销售额的相关系数,并绘制散点图
建立模型对现有数据预测,观察偏差
可以看到精度有90%,所以模型性能还是不错的,接下来就对自己设置的值预测,我设置的是20,5
预测值为571.557,从散点图上大致对比可以看出571.557也还是比较可靠的预测值。
总结
数据分析部分差不多就这些了,关键是要掌握这些分析方法和使用的环境,另外在需要的时候也可以运用一些机器学习的方法作为辅助,明天我会把数据分析的最后一步数据可视化讲讲,然后数据分析部分就算写完了。然后就要开始继续学flask和java了,碰到什么好玩有趣的我也会及时分享出来。对了,我的这些数据我会今天上传然后把网盘链接贴出来,想动手试试的小伙伴可以练练手哦。
数据下载地址:
链接:https://pan.baidu.com/s/1Ygy-SV4iyBOyfUlUuUY6EQ
提取码:fdk6