目录
第1章 数据分析基础
1.1 数据分析、数据处理、数据预处理
数据分析是将数学、统计学理论结合科学的统计分析方法(如线性回归分析、聚类分析、方差分析、时间序列分析等)对数据库中的数据、Excel数据、收集的大量数据、网页抓取的数据等进行分析,从中提取有价值的信息形成结论并进行展示的过程。(P2)
数据处理主要包括数据规约、数据清洗、数据加工等处理方法。(P9)
数据规约:在接近或保持原始数据完整性的同时将数据集规模减小,以提高数据处理的速度。
数据清洗:在获取到原始数据后,可能其中的很多数据都不符合数据分析的要求,那么需要按照步骤进行处理。
数据加工。
1.2 监督学习、非监督学习
(1)监督学习
机器学习算法决策的过程可以从已有的数据、知识和经验中得来。 而有些情况下,没有任何经验可循。根据这种学习方式,可以将模型分为监督学习模型、非监督学习模型和强化学习模型。
监督学习(Supervised Learning)是使用已有的数据进行学习的机器学习方法。已有的数据是成对的——输入数据和对应的输出数据所组成的数据对。算法通过自动分析,找到输入和输出数据之间的关系。此 后对于新数据,算法也能够自动给出判断结果。
(2)非监督学习
与监督学习相对的是非监督学习(Unsupervised Learning),也称为无监督学习。非监督学习直接对没有标记的训练数据进行建模学习。
与监督学习的最基本的区别是建模的数据没有标签。
非监督学习算法中,没有经验数据可供学习。算法可以在缺乏经验数 据的情况下使用,可以用于认识新问题、探索新领域。因此一直是人工 智能的一个重要研究方向。
1.3 分类方法
(1)基于距离的分类方法
(2) 贝叶斯分类
贝叶斯决策理论方法是统汁模型决策中的一个基本方法,基本思想如下: ①已知类条件概率密度参数表达式和先验概率。 ②利用贝叶斯公式转换成后验概率。③根据后验概率大小进行决策分类。
第2章 NumPy模块实现数值计算
2.1 NumPy的数据类型
2.2 NumPy模块中数组的基本操作
(1)内置的数组创建方法(P16)
①zeros()函数
import numpy as np
a = np.zeros(4) #用Zeros创建一维的全0数组(1行4列)
#a.dtype=float64,默认为浮点型,a=[0. 0. 0. 0. 0.]
#a.shape=(4,)
#a.dim=1,一维
b = np.zeros((3,3)) #二维全0数组,3行3列
#zero()函数括号中是一个元组,里面仍需一个括号,所以有两个括号
#还有一个与zeros()类似的ones()函数,用于创建元素全为1的数组
②arange()函数(注意不是单词arrange)
import numpy as np
a=np.arange(1,10,2)
#生成1到10之间,步长为2的数组。
#a=[1,3,5,7,9]
③linspace()函数
import numpy as np
a=np.linspace(1, 5, 5)
#生成1到5之间的5个数。第3个参数若不设则默认为50,即生成50个数
#a=[1. 2. 3. 4. 5.],默认浮点型
④logspace()函数
import numpy as np
a=np.logspace(0,4, 5, base=2)
#生成2^0到2^4共5个数的等比数列,这里是左闭右闭
#base若不设则默认为10,即以10为底
⑤eye()函数
import numpy as np
a=np.eye(3)
#生成3*3的单位矩阵,对角线元素为1,其余元素均为0
#默认浮点型
⑥diag()函数
import numpy as np
a=np.diag([1,2,3,4,5])
#生成5*5的指定对角元素值的对角矩阵,其余元素均为0
(2) 生成随机数 (P19)
①rand()函数
import numpy as np
a = np.random.rand(2,3)
#生成2行3列的随机数组,数组的元素取自0~1的均分布
b = np.random.rand(2,3,2)
#生成两个3行2列的随机数组,b.dim=3
②randint()函数
import numpy as np
a = np.random.randint(0,10,(2,2))
#数组元素为0到10的整数,2行2列
b = np.random.randint(0,10,size=(2,2,3))
#两个2行3列,b.shape=(2,2,3)
③random()函数
import numpy as np
a = np.random.random((2,3))
#注意,有两个括号
#2行3列,元素为取自0~1的浮点型随机数
④uniform()函数
import numpy as np
d =np.random.uniform(1,2,(2,3))
#元素为[1,2)的均匀分布,2行3列
(3)切片和索引(P20)
(4)修改数组形状(P21)
(5)组合数组(P22)
①hstack()函数和vstack()函数
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
c = np.hstack((a,b)) # 横向组合数组,将b接到a的右边
d = np.vstack((a,b)) # 纵向组合数组,将b接到a的下面
②concatenate()函数
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
c = np.concatenate((a,b)) #默认组合,将b接到a的下面
d = np.concatenate((a,b),axis=1) #默认axis=0,修改axis=1,将b接到a的右边
(6)数组分割(P24)
①hsplit()函数
import numpy as np # 导入numpy模块
a = np.arange(9).reshape(3,3) # 创建形状3*3的数组
b = np.hsplit(a,3) # 水平分割,即将数组按列分开
②vsplit()函数
import numpy as np # 导入numpy模块
a = np.arange(9).reshape(3,3) # 创建形状3*3的数组
b = np.vsplit(a,3) # 垂直分割,即将数组按行分开
2.3 NumPy模块中函数的应用(P25)
2.4 广播机制 (P31)
广播(Broadcast)机制只有在实现两个形状不同的数组计算时才会触发。
import numpy as np
c = np.array([10,20,30])
d = np.array([[1,1,1],[2,2,2],[3,3,3]])
print('数组c和d相乘的结果为:\n',c*d)
第3章 pandas模块实现统计分析
3.1 pandas数据结构(P35)
pandas的数据结构中有两大核心,分别是Series与DataFrame。
(1)Series对象
import pandas as pd
index = ['a','b','c']
data = ['A','B','C']
series = pd.Series(data,index=index)
#这里修改了索引,不修改默认为0、1、2......
print('索引为:',series.index)
print('元素为:',series.values)
#输出索引和元素
print(series)
series[['a','b','c']] = ['X','Y','Z']
#指定多个索引修改对应元素
print(series)
(2)DataFrame对象
import pandas as pd
data = {'A':[1,2,3,4,5],'B':[6,7,8,9,10],'C':[11,12,13,14,15]}
#大括号中为字典对象
index = ['a','b','c','d','e']
#自定义索引
data_frame = pd.DataFrame(data,index = index)
#创建时指定索引
3.2 读、写数据(P40)
读写Excel文件。
import pandas as pd
data = pd.read_excel('产品销售数据表.xlsx')
data.head(5) #前5行
data.to_excel('产品销售数据表_1.xlsx',columns=['员工编号','销售员'],index=False)
3.3 数据操作
(1)数据的增、删、改、查(P44)
①增添数据
import pandas as pd
data = pd.read_excel('产品销售数据表_1.xlsx')
data['销售数量'] = [8,12,6,4,10] #按照新的列名增加一列数据
data.loc[5]=['CC806','关羽',60] #按照新的索引增加一行数据
data.head(6) #前6行
#增加列直接data['列名'],增加行data.loc['索引'](注意默认索引从0开始)
②删除数据
import pandas as pd
data = pd.read_excel('产品销售数据表_1.xlsx')
data.drop([0],inplace = True) #指定索引删除数据 (删除第1行)
data.drop(labels=range(1,3),axis=0,inplace=True) #指定索引范围删除数据(删除索引为1、2的行)
data.drop(labels='销售员',axis=1,inplace=True) #指定列名删除数据
③修改数据
import pandas as pd
data = pd.read_excel('产品销售数据表_1.xlsx')
data['销售员'][0] = '梁朝伟' #通过赋值修改数据,先列后行
data['员工编号'] = ['DD801','DD802','DD803','DD804','DD805'] #修改某列所有元素
data.rename(columns={'销售员':'新销售员'},inplace=True) #修改列名
data.rename({0:'新索引'},inplace=True) #修改索引,不写columns默认修改索引
#data.rename(index={0:'新索引'},columns={'列名':'新列名'})
#也可以如上一起修改索引和列名
#data.columns=['列名1','列名2','列名3']暴力修改列名
④查询数据
import pandas as pd
data = pd.read_excel('产品销售数据表_1.xlsx')
data['员工编号'] #指定列名查找
data[0:3] #指定行索引范围查找
data['销售员'][2] #同时指定列名和行索引查找数据
(2)NaN数据处理(P47)
import pandas as pd
import numpy
data = pd.read_excel('产品销售数据表-part.xlsx')
data.loc[0,'单价'] = numpy.nan #赋值方式修改元素为NaN
data.isnull().sum() #统计每列空缺值数量
data.notnull().sum() #统计每列非空缺值数量
data[data['单价'].isnull()] #显示'单价'为空缺值的数据
data.dropna(how='all',axis=1,inplace=True) #删除所有元素为NaN的列
data.dropna(axis=0,inplace=True) #默认how='any',即将包含NaN的整行/列数据删除
data.loc[2,'销售数量'] = numpy.nan
data.fillna({'单价':1,'销售数量':data['销售数量'].mean(),'销售总额':3},inplace=True)
#将不同列NaN元素修改为不同值
(3)时间数据的处理(P51)
pandas模块提供了一个to_datetime()函数,用于实现将不规范的时间数据转换为标准的datetime类型数据。
import pandas as pd
format = pd.to_datetime('2022/1/2 00:00:00')
print('标准化后的时间数据:',format)
3.4 数据的分组与聚合
(1)分组数据(P53)
import pandas as pd
df = pd.read_excel('日常费用统计表.xlsx')
group = df.groupby('费用项目') #将“项目费用”这一列的值一样的行分到一起
group.groups #查看分组后的数据信息
group.ngroups #查看分组总数
for group_name,group_data in group: #提取分组后的数据
print(group_name, '\n',group_data)
group.sum() #分组求和
#将金额这一列按照费用项目分组group = df['金额(元)"].groupby(df["费用项目"])
#group = df.groupby(['费用项目';'说明'])
#根据多个Key进行分组,Key全相同才会被分到一类
方法名 | 方法说明 |
---|---|
size() | 返回每组的大小,其中包含NaN值 |
count() | 统计分组的数量,其中不包含NaN值 |
max() | 返回每组中最大的值 |
min() | 返回每组中最小的值 |
median() | 返回每组中的中位数 |
mean() | 返回每组的平均值 |
sum() | 返回每组的和 |
std() | 返回每组的标准差 |
(2)聚合数据(P55)
import pandas as pd
df = pd.read_excel('学生成绩.xlsx')
df.groupby('学校').agg(['max','median','min'])
#分组并聚合,按“学校”分组后(这一列相同的行分到一起),每一列都求最大值、中位数、最小值
#多个操作用列表
df.groupby('学校').agg({'数学':'max'})
#分组后对某列聚合,用字典
df.groupby('学校').agg({'数学':'max','英语':['max','min'],'语文':'median'})
#分组后对某不同列不同聚合,用字典
def mean(data):
return data.mean()
df.groupby('学校').agg('mean') #通过自定义的函数实现分组聚合
3.5 数据的预处理(P56)
第4章 Matplotlib模块实现数据可视化
4.1 pyplot子模块的常用语法(P65)
函数名称 | 描述 |
---|---|
pyplot.figure() | 创建一个空白的画布 |
figure.add_subplot() | 在画布中添加子图,可以指定子图的行数、列数和图表的编号。例如在add_subplot()函数中填写221代表将画布分割成2行2列,图表画在从左到右从上到下的第1块 |
pyplot.subplots() | 实现分图展示,就是在一个绘图窗体中显示多个图像,例如在subplots()函数中填写121代表在画布中绘制1行2列的图表1 |
pyplot.subplot2grid() | 实现非等分画布形式的图形展示,通过设置subplot2grid()函数中rowspan和colspan参数可以让子图跨越固定网格布局的多个行和列,实现不同的子图布局 |
4.2 绘制常用图表
(1)条形图(P66)
pyplot.bar()
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams[ 'font.sans-serif']=['SimHei']
plt.rcParams[ 'axes.unicode_minus' ]=False
#这两句的作用是避免中文乱码
data = pd.read_excel('笔记本销售数据.xlsx')
df = pd.DataFrame(data)
group = df.groupby('地址')['购买人数'].sum()
x = group.index
y = group.values
plt.bar(x,y,width=0.5,alpha=0.5)
plt.xlabel('地址')
plt.ylabel('购买人数')
plt.title('城市购买人数条形图')
plt.ylim([0,22000])
for x, y in enumerate (y):
plt.text(x,y+500,'%s' %y+'人',ha='center')
plt.show()
(2)折线图(P69)
pyplot.plot()
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams[ 'font.sans-serif']=['SimHei']
plt.rcParams[ 'axes.unicode_minus' ]=False
#这两句的作用是避免中文乱码
data = pd.read_excel('笔记本销售数据.xlsx')
df = pd.DataFrame(data)
group1 = df.groupby('地址')['购买人数'].sum()
group2 = df.groupby('地址')['商品价格'].mean()
group = pd.concat([group1,group2],sort=True,axis=1)
group = group.sort_values(by='商品价格')
print(group)
x = group['商品价格']
y = group['购买人数']
plt.plot(x, y, linewidth=3, linestyle='-.',color='g', marker='o',markerfacecolor='red', markersize=8)
plt.xlabel('商品价格')
plt.ylabel('购买人数')
plt.title('商品价格购买人数走势图')
plt.grid()
plt.show()
(3)散点图(P70)
pyplot.scatter()
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams[ 'font.sans-serif']=['SimHei']
plt.rcParams[ 'axes.unicode_minus' ]=False
#这两句的作用是避免中文乱码
data = pd.read_excel('笔记本销售数据.xlsx')
df = pd.DataFrame(data)
print(df)
x = df['商品价格']
y = df['购买人数']
plt.scatter(x,y,c='y')
plt.xlabel('商品价格')
plt.ylabel('购买人数')
plt.show()
(4)饼图(P71)
pyplot.pie()
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams[ 'font.sans-serif']=['SimHei']
plt.rcParams[ 'axes.unicode_minus' ]=False
#这两句的作用是避免中文乱码
data = pd.read_excel('笔记本销售数据.xlsx')
df = pd.DataFrame(data)
group1 = df.groupby('地址')['购买人数'].sum()
group2 = df.groupby('地址')['商品价格'].mean()
group = pd.concat([group1,group2],sort=True,axis=1)
group = group.sort_values(by='商品价格')
print(group)
x = group['商品价格']
y = group['购买人数']
labels = group.index
explode = [0.1,0,0,0,0.1,0,0,0.1]
plt.pie(group['购买人数'],explode=explode, labels=labels,autopct='%1.1f%%')
plt.title('各城市购买人数饼图')
plt.legend(loc="upper right", fontsize=10, bbox_to_anchor=(1.3,1.1))
plt.show()
(5)箱形图 (P73)
pyplot.boxplot()
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams[ 'font.sans-serif']=['SimHei']
plt.rcParams[ 'axes.unicode_minus' ]=False
#这两句的作用是避免中文乱码
data = pd.read_excel('笔记本销售数据.xlsx')
df = pd.DataFrame(data)
group1 = df.groupby('地址')['购买人数'].sum()
group2 = df.groupby('地址')['商品价格'].mean()
group = pd.concat([group1,group2],sort=True,axis=1)
group = group.sort_values(by='商品价格')
print(group)
data = [group['商品价格'],group['购买人数']]
labels = ['商品价格','购买人数']
plt.boxplot(data,labels = labels)
plt.title('均价和购买人数箱形图')
plt.show()
4.3 3D绘图 (P78)
Matplotlib模块不仅仅能绘制2D图表,实际上在Matplotlib模块中还内置了一个mplot3d模块,通过该子模块即可实现绘制3D图表。
第5章 客户价值分析
5.1 分析方法
(1)RFM模型(P87)
R=数据采集时间-最近一次消费时间
F=总消费次数/(采样时间-首次消费)
M=总消费金额/(采样时间-首次消费)
(2)k-means聚类算法(P88)
k-means聚类是著名的划分聚类的算法,由于简洁和高效使得它在所有的聚类算法中应用最为广泛。k-means聚类是给定一个数据点集合和需要的聚类数目k,k由用户指定,k-means算法根据某个距离函数反复把数据分入k个聚类中。
算法伪代码:(重要)
创建k个点作为起始质心,可以随机选择(位于数据边界内)
当任意一个点的簇分配结果发生改变时
对数据集中的每个点
对每个质心
计算质心和数据点之间的距离
将数据点分配到距其最近的簇
对每一个簇,计算簇中所有点的均值并将均值作为质心
5.2 sklearn模块(P89)
sklearn模块(全称scikit-learn)是Python第三方模块,它是机器学习领域当中知名的Python模块之一,它对常用的机器学习算法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)和聚类(Clustering)四大机器学习算法。
from sklearn.cluster import KMeans
第6章 销售收入分析与预测
6.1 分析方法
(1)线性回归(P97)
要对样本点进行线性拟合,求得使预测尽可能准确的函数,这个过程就是线性回归。线性回归是对一个或多个自变量和因变量之间的关系进行建模的一种回归分析方法,它包括一元线性回归和多元线性回归。
一元线性回归:当只有一个自变量和一个因变量,且二者的关系可用一条直线近似表示,称为一元线性回归。
多元线性回归:当自变量有两个或多个时,研究因变量Y和多个自变量1X、2X,···,nX之间的关系,则称为多元线性回归。
(2)最小二乘法(P98)
线性回归是数据挖掘中的基础算法之一,线性回归的思想其实就是解一组方程,得到回归函数,不过在出现误差项之后,方程的解法就存在了改变,一般使用最小二乘法进行计算,所谓“二乘”就是平方的意思,最小二乘法也成最小平方和,其目的是通过最小化误差的平方和,使得预测值与真实值无限接近。
6.2 Excel日期数据处理
(1)按日期筛选数据(P101)
import pandas as pd
aa = r'TB201812.xls'
df = pd.DataFrame(pd.read_excel(aa)) # r的作用是去除转义字符
df1 = df[['订单付款时间','买家会员名','联系手机','买家实际支付金额']]
df1 = df1.set_index('订单付款时间') # 将date设置为index
print(df1['2018']) # 获取2018年的数据
print(df1['2017':'2018']) # 获取2017至2018年的数据
print(df1['2018-11']) # 获取某月的数据
print(df1['2018-11-06':'2018-11-06']) # 获取具体某天的数据
print(df1['2018-11-01':'2018-11-15']) # 获取某个区间的数据
(2)按日期显示数据(P101)
df2 = df1.to_period('M') #按月显示数据
df2 = df1.to_period('Q') #按季度显示数据
df2 = df1.to_period('A') #按年度显示数据
(3)按日期统计数据(P102)
df1.resample('w').sum() #按周统计数据
df1.resample('M').sum() #按月统计数据
df1.resample('Q').sum() #按季度统计数据
df1.resample('A').sum() #按年统计数据
df1.resample('A').sum().to_period('A') #按年统计并显示数据
df1.resample('Q').sum().to_period('Q') #按季度统计并显示数据
df1.resample('M').sum().to_period('M') #按月统计并显示数据
第7章 二手房数据分析预测系统
7.1 加载datasets子模块中的数据集
本地加载数据:sklearn.datasets.load_<name>
远程加载数据:sklearn.datasets.fetch_<name>
构造数据集:sklearn.datasets.make_<name>