Python教程

python数据分析与挖掘期末复习

本文主要是介绍python数据分析与挖掘期末复习,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、简答题

1.数据挖掘的基本任务

包括利用分类与预测、聚类分析、关联规则、时序模式、偏差检测、智能推荐等方法,帮助企业提取数据中蕴含的商业价值,提高企业的竞争力。

2.数据挖掘建模的过程

目标定义——》数据采集——》数据整理——》构建模型——》模型评价——》模型发布

3.五种非结构化数据

网页、文本、图像、视频、语音、图和网格数据

4.五种常见脏数据

缺失值、异常值、不一致的数据、重复数据、特殊符号(如#*等)数据

5.常用的数据挖掘方法

线性回归模型、逻辑回归模型、决策树、神经网络、关联规则、聚类分析、随机森林、装袋法等。

6.在二元变量的相关分析中,三种常用的相关系数

皮尔森相关系数、斯皮尔曼相关系数、肯德尔相关系数

7.标准差标准化转换及公式中符号含义

标准差标准化也称零-均值规范化,经过处理的数据的均值为0,标准差为1。
标准差公式:\sigma =\sqrt{\frac{1}{n}(xi-\bar{x})^{2}}

标准化转换公式为:x^{*}=\frac{x-\bar{x}}{\sigma }

\sigma:标准差,n:数据个数,xi:数据,\bar{x}:数据平均值

8.最大最小规范化转换及公式中符号含义

最小-最大规范化也称为离散标准化,是对原始数据的线性变换,将数据值映射到[0, 1]之间。

标准化转换公式为:x^{*}=\frac{x-min}{max-min}

min:最小值,max:最大值

9.Apriori算法实现的两个过程

(1)找出所有的频繁项集(支持度必须大于等于给定的最小支持度阈值),在这个过程中连接步和剪枝步相互融合,最终得到最大频繁项集。

(2)由频繁项集产生强关联规则。

10.ID3的算法流程

(1)对当前样本集合,计算所有属性的信息增益。

(2)选择信息增益最大的属性作为测试属性,把测试属性取值相同的样本划分为同一样本集。

(3)若子样本集的类别属性只含有单个属性,则分支为叶子节点,判断其属性值并标上相应的符号,然后返回调用处;否则对子样本集递归调用本算法。

二、计算题

1.计算四分位极差

Q1:上四分位数,Q2:中四分位数,Q3:下四分位数

a:上四分位位置,b:中四分为位置,c:下四分位位置

a=(n+1)/4            b=2(n+1)/4           c=3(n+1)/4

举例说明:

n=7,则a=2,b=4,c=6,

则Q1=x*1+x*0,Q2=x4 *1+x5 *0,Q3=x6 *1+x7 *0

n=8,则a=2.25,b=4.5,c=6.75,

则Q1=x*0.75+x*0.25,Q2=x4 *0.5+x5 *0.5,Q3=x6 *0.25+x7 *0.75

n=9,则a=2.5,b=5,c=7.5,

则Q1=x*0.5+x*0.5,Q2=x5 *1+x6 *0,Q3=x7 *0.5+x8 *0.5

n=10,则a=2.75,b=5.5,c=8.25,

则Q1=x*0.25+x*0.75,Q2=x5 *0.5+x6 *0.5,Q3=x8 *0.75+x9 *0.25

2.对数据进行最大最小规范化、标准差规范化、科学定标法

最大最小规范化:x^{*}=\frac{x-min}{max-min}

标准差规范化:x^{*}=\frac{x-\bar{x}}{\sigma }\sigma =\sqrt{\frac{1}{n}(xi-\bar{x})^{2}}

小数点定标法:x^{*}=\frac{x}{10^{k}}

(小数点定标法:通过移动小数点的位数,将属性值映射到[-1,1]之间,移动的小数点位数取决于属性值绝对值的最大值。)

3.计算变异系数,并进行比较

变异系数:CV=\frac{\sigma }{\bar{x}}

\sigma为标准差,\bar{x}为平均值)

(变异系数主要用来比较两个或多个具有不同单位或不同波动幅度的数据集的离中趋势。)

4.计算均值、标准差

均值:x‾ = 1/n Σ(xi)

标准差:\sigma =\sqrt{\frac{1}{n}(xi-\bar{x})^{2}}

三、应用题

1.利用一元线性回归函数,预测未来的值,要求写出代码实现

示例代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号


# 计算截距和斜率
df = pd.read_excel('tax.xlsx', index_col='年份')
x = np.array(df.iloc[:, 1]).reshape([-1, 1]) # 国民生产总值
y = np.array(df.iloc[:, 0]).reshape([-1,1]) # 税收
reg = LinearRegression().fit(x, y)
a0=str(reg.coef_)[2:-2]
a1=str(reg.intercept_)[1:-1]
print("斜率k的值为:",a0)
print("截距b的值为:",a1)


# 绘制散点图和直线图
plt.figure()
plt.plot(np.reshape(x, (-1,1)), reg.predict(np.reshape(x, (-1,1))))  # 直线图
plt.scatter(df.iloc[:,1], df.iloc[:,0], c='r', marker='o')  # 散点图
plt.xlabel('国民生产总值')
plt.ylabel('税收')
plt.title('税收与国民生产总值')
plt.show()

运行结果如下:

斜率k的值为: 0.18732251

截距b的值为: -2546.73626617

2.计算某项集的支持度和置信度

(1)支持度:项集A、B同时发生的概率称为关联度规则的支持度(也称为相对支持度)。

支持度计算公式:Support(A⇒B)=P(A∪B)=(A、B同时发生的事务个数)/(所有事务的个数)

(2)置信度:项集A发生,则项集B发生的概率为关联规则的置信度。

置信度计算公式:Confidence(A⇒B)=P(B|A)=(A、B同时发生的事务个数)/(A发生的事务个数)

(3)最小支持度和最小置信度的设置:最小支持度表示项目集在统计意义上的最低重要性,最小置信度表示关联规则的最低可靠性。

同时满足最小支持度阈值和最小置信度阈值的规则称为强规则。

示例代码如下:

import pandas as pd
from apriori import *  # 导入自行编写的apriori函数
inputfile = 'menu_orders.xlsx'  # 数据导入文件
outputfile = 'apriori_rules.xlsx'  # 结果导出文件
data = pd.read_excel(inputfile, header = None)


ct = lambda x : pd.Series(1, index = x[pd.notnull(x)])  # 转换0-1矩阵的过渡函数
b = map(ct, data.values)  # 用map方式执行
newdata = pd.DataFrame(list(b)).fillna(0)  # 实现矩阵转换,空值用0填充


support = 0.2       # 设定最小支持度
confidence = 0.5      # 设定最小置信度
ms = '---'    # 连接符,默认'--',用来区分不同元素,如A--B。
find_rule(newdata, support, confidence, ms).to_excel(outputfile)    # 保存结果

运行结果如下:

3.写出拟合优度R²公式,并解析

R²=ESS/TSS=(TSS-RSS)/TSS=1-RSS/TSS=1-∑(yi-yˆ)²/∑(yi-y‾)²

yˆ为预测值,y‾为平均值,R越接近1,拟合度越高,越接近0,拟合度越低。

部分示例代码如下:

from sklearn.metrics import r2_score
x = np.array(df.iloc[:, 1]).reshape([-1, 1]) # 国民生产总值
y_pred = reg.predict(np.reshape(x, (-1,1)))
print("r^2 = ", r2_score(y, y_pred))

四、综合题

1.决策树模型

示例代码如下:

import pandas as pd
from sklearn.tree import DecisionTreeClassifier as DTC  # 导入决策树分类器
from sklearn.tree import export_graphviz  # 导入可视化决策树
data = pd.read_excel('sales_data.xlsx', index_col = '序号')  # 导入数据
data.shape
data.head(10)
data[data == '好'] = 1
data[data == '是'] = 1
data[data == '高'] = 1
# data[data == '坏'] = 0
# data[data == '否'] = 0
# data[data == '低'] = 0
data[data != 1] = -1
data.head(10)
X = data.iloc[:,:3].astype(int)
Y = data.iloc[:,3].astype(int)
dtc = DTC(criterion='entropy')  # 建立决策树模型,基于信息熵
dtc.fit(X, Y)    #训练模型
x = pd.DataFrame(X)
with open('tree.dot', 'w', encoding="utf-8") as f:
    export_graphviz(dtc, feature_names=x.columns, out_file=f)
    f.close()

运行结果文件内容如下:

2.K-Means聚类算法

K-Means聚类算法过程如下:

(1)从n个样本数据中心随机选取k个对象作为初始的聚类中心。

(2)分别计算每个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中。

(3)所有对象分配完成后,重新计算k个聚类的中心。

(4)与前一次计算得到的k个聚类中心比较,如果聚类中心发生变化,转到步骤2,未转移则继续。

(5)当质心不发生变化时,停止输出聚类结果。

注:由于聚类的结果可能依赖初始聚类中心的随机选择,使结果偏离全局最优分类,故在实践中,通常选择不同的初始聚类中心,多次运行K-Means算法。

示例代码如下:

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号 


k = 5  # 设置聚类的类别
iteration = 500  # 聚类最大循环次数
data = pd.read_excel('consumption_data.xlsx', index_col = 'Id')  # 读取数据
data_ye=data.iloc[:,[0,1]]  #获取第1列和第2列数据


# KMeans 内部会自己做归一化处理
kms = KMeans(n_clusters = k,max_iter = iteration,random_state=1234)  # 分为k类,并发数4
kms.fit(data_ye)  # 开始聚类
label_pred = kms.labels_        #获取每个样本点对应的类别
x0=data_ye[label_pred==0]
x1=data_ye[label_pred==1]
x2=data_ye[label_pred==2]
x3=data_ye[label_pred==3]
x4=data_ye[label_pred==4]
r1 = pd.Series(kms.labels_).value_counts()  # 统计各个类别的数目
r2 = pd.DataFrame(kms.cluster_centers_)  # 找出聚类中
print("各个聚类中心:\n",r2)


#根据聚类结果进行可视化显示(散点图)
plt.figure(figsize=(10,6))
plt.scatter(x0.iloc[:,0],x0.iloc[:,1],marker='o',c="c",label='label0')  # c为淡蓝色
plt.scatter(x1.iloc[:,0],x1.iloc[:,1],marker='v',c="g",label='label1')  # g为绿色
plt.scatter(x2.iloc[:,0],x2.iloc[:,1],marker='o',c="k",label='label2')  # k为黑色
plt.scatter(x3.iloc[:,0],x3.iloc[:,1],marker='*',c="r",label='label3')  # r为红色
plt.scatter(x4.iloc[:,0],x4.iloc[:,1],marker='*',c="b",label='label4')  # b为深蓝色
plt.scatter(r2.iloc[:,0],r2.iloc[:,1],marker='o',c="m",label='聚类中心')  # m为紫色
plt.legend()
plt.show() 

运行结果如下:

3.多元线性回归,逻辑分类算法

示例代码1如下:

import pandas as pd
from sklearn.linear_model import LogisticRegression as LR  # 导入逻辑回归模型
from sklearn.model_selection import train_test_split  # 导入拆分数据集函数
df=pd.read_excel('bankloan.xlsx')  # 导入数据集
X=df.iloc[:,0:8]  # 分离自变量x
Y=df.iloc[:,8]  # 分离因变量y
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.3)  # 拆分训练集(0.7)和测试集(0.3)


# 模型训练测试
lr = LR()  # 建立逻辑回归模型
model = lr.fit(X_train, Y_train)  # 用训练集训练模型
print("模型回归系数为:",model.coef_)     #显示模型回归系数
print("模型截距为:",model.intercept_)
ceshi=model.score(X_test, Y_test)   #利用测试集检验模型
print("相关系数为:",ceshi)


# 模型应用
xnew = pd.DataFrame([[20,3,2,10,100,6,8,6]], columns=['年龄','教育','工龄','地址','收入','负债率','信用卡负债','其他负债'])
print("待计算信息为:",xnew)
ynew=lr.predict(xnew)
xnew['违约'] = ynew
if(int(xnew['违约'])==1):
    print("根据计算概率得:该用户违约的可能性较大")
else:
    print("根据计算概率得:该用户违约的可能性较小")

运行结果如下:

 

示例代码2如下:

# 绘制散点图,确定模型
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
df = pd.read_excel('tax_all.xlsx', index_col='年份')
# 绘制各关系子图作可视化分析
y = df.iloc[:,0]
x1 = df.iloc[:,1]
x2 = df.iloc[:,2]
x3 = df.iloc[:,3]
plt.figure(figsize=(14,4))  # 设置图框大小尺寸
plt.subplot(1,3,1)
plt.plot(x1, y, 'ob')
plt.legend(['GDP'])
plt.subplot(1,3,2)
plt.plot(x2, y, 'xr')
plt.legend(['expand'])
plt.subplot(1,3,3)
plt.plot(x3, y, 'sk')
plt.legend(['CPI'])
plt.show()
#绘制各关系图作数据可视化分析
plt.figure(figsize=(6,4))  # 设置图框大小尺寸
plt.plot(x1, y, color='r', linewidth=1.5, linestyle='-', label='GDP')
plt.plot(x2, y, color='b', linewidth=1.5, linestyle='--', label='expand')
plt.plot(x3, y, color='k', linewidth=1.5, linestyle='-.', label='CPI')
plt.legend()
plt.show()
#模型训练
x = df.iloc[:,1:4]   #GDP, expand, CPI
y = df.iloc[:,0]     #tax
X_train,X_test,y_train,y_test = train_test_split(x,y,test_size=0.2, random_state=42)  #拆分训练集和测试集
model = LinearRegression()  #实例化线性回归模型
reg = model.fit(X_train,y_train) #训练模型 print([reg.coef_, reg.intercept_])
#模型预测
pre_value = reg.predict(X_test) # print(pre_value)
#模型评价
result = reg.score(X_test,y_test)# print(result)
#模型拟合可视化
plt.figure(figsize=(6,4))
plt.plot(range(len(y_test)),y_test)
plt.plot(range(len(y_test)),pre_value)
plt.show()
#查看拟合优度
# 用训练集进行拟合优度,验证回归方程是否合理
def get_lr_stats(x, y, model):     
    message0 = ('多元线性回归方程为: '+'y' + '=' + str(model.intercept_) + ' + ' +str(model.coef_[0]) + ' * GDP'
                ' + ' +str(model.coef_[1]) + ' * expand' ' + ' +str(model.coef_[2]) + ' * CPI')
    from scipy import stats 
    n = len(x)
    y_prd = model.predict(x)
    Regression = sum((y_prd - np.mean(y))**2) # 回归平方和
    Residual  = sum((y - y_prd)**2)     # 残差平方和
    total = sum((y-np.mean(y))**2) #总体平方和
    R_square  = 1-Residual / total # 相关性系数R^2
    message1 = ('相关系数(R^2): ' + str(R_square) + ';' + '\n'+ '总体平方和(TSS): ' + str(total) + ';' + '\n')
    message2 = ('回归平方和(RSS): ' + str(Regression) + ';' + '\n残差平方和(ESS): ' + str(Residual) + ';' + '\n')
    return print(message0 +'\n' +message1 + message2 )
# get_lr_stats(X_train,y_train,reg)  # 该式有误
get_lr_stats(X_test,y_test,reg)

运行结果如下:

这篇关于python数据分析与挖掘期末复习的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!