以下可视化的数据来源为名为“”的Excel文件,它有六列,分别是Id、SepalLengthCm、SepalWidthCm、PetalLengthCm、PetalWidthCm、Species。基于这个数据表,进行数据处理和可视化操作:
一、散点图
散点图是指在 回归分析 中,数据点在直角坐标系平面上的 分布图 ,散点图表示因变量随 自变量 而 变化 的大致趋势,据此可以选择合适的函数 对数 据点进行 拟合 。 用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
代码如下:
1. import pandas as pd 2. import matplotlib.pyplot as plt 3. plt.rcParams['font.sans-serif']=['SimHei'] 4. plt.rcParams['axes.unicode_minus']=False 5. df = pd.read_csv("iris.csv") 6. SepalLengthCm = df["SepalLengthCm"] 7. SepalWidthCm = df["SepalWidthCm"] 8. PetalLengthCm = df["PetalLengthCm"] 9. PetalWidthCm = df["PetalWidthCm"] 10. x = [i for i in range(1,len(PetalWidthCm)+1)] 11. color = ['c', 'b', 'g', 'r', 'm', 'y', 'k', 'w'] 12. def func(label,num,name): 13. plt.scatter(x,label, c=color[num], edgecolors='r') 14. plt.title(f"{name}散点图") 15. plt.savefig(f"{name}散点图.png") 16. plt.show() 17. 18. func(SepalLengthCm,0,"SepalLengthCm") 19. func(SepalWidthCm,1,"SepalWidthCm") 20. func(PetalLengthCm,2,"PetalLengthCm") 21. func(PetalWidthCm,3,"PetalWidthCm")
效果如下:
二、热力图
热力图是一种特殊的图表,它是一种通过对色块着色来显示数据的统计图表,在绘图时,需要指定每个颜色映射的规则(一般以颜色的强度或色调为标准);比如颜色越深的表示数值越大、程度越深;颜色越亮的数值越大、程度越深。 热力图适合用于查看总体的情况、观察特殊值或者显示多个变量之间的差异性、检测它们之间是否存在相关性等等。
代码如下:
1. import pandas as pd 2. import seaborn as sns 3. import matplotlib.pyplot as plt 4. plt.rcParams['font.sans-serif']=['SimHei'] 5. plt.rcParams['axes.unicode_minus']=False 6. data = pd.read_csv('iris.csv',usecols=["SepalLengthCm","SepalWidthCm","PetalLengthCm","PetalWidthCm"]) 7. df = pd.DataFrame(data) 8. cor = data.corr(method='pearson') 9. sns.heatmap(cor, 10. annot=True, # 显示相关系数的数据 11. center=0.5, # 居中 12. fmt='.2f', # 只显示两位小数 13. linewidth=0.5, # 设置每个单元格的距离 14. linecolor='blue', # 设置间距线的颜色 15. vmin=0, vmax=1, # 设置数值最小值和最大值 16. xticklabels=True, yticklabels=True, # 显示x轴和y轴 17. square=True, # 每个方格都是正方形 18. cbar=True, # 绘制颜色条 19. cmap='coolwarm_r', # 设置热力图颜色 20. ) 21. plt.title("四列属性热力图") 22. plt.savefig("四列属性热力图.png",dpi=600)#保存图片,分辨率为600 23. plt.show() #显示图片
效果如下:
三、回归分析图
在统计学中,回归分析(regression analysis)指的是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。 回归分析按照涉及的变量的多少,分为一元回归和 多元回归分析 ;按照因变量的多少,可分为简单回归分析和多重回归分析;按照自变量和因变量之间的关系类型,可分为线性回归分析和 非线性回归分析 。
代码如下:
1. from sklearn.model_selection import train_test_split 2. from sklearn.linear_model import LinearRegression 3. import pandas as pd 4. import matplotlib.pyplot as plt 5. import numpy as np 6. 7. plt.rcParams['font.sans-serif']=['SimHei'] 8. plt.rcParams['axes.unicode_minus']=False 9. df = pd.read_csv("iris.csv") 10. Species = df["Species"] 11. PetalLengthCm = df["PetalLengthCm"] 12. PetalWidthCm = df["PetalWidthCm"] 13. PetalLengthCm_Iris_setosa = df.loc[df["Species"]=="Iris-setosa",["PetalLengthCm"]] 14. PetalLengthCm_Iris_versicolor = df.loc[df["Species"]=="Iris-versicolor",["PetalLengthCm"]] 15. PetalLengthCm_Iris_virginica = df.loc[df["Species"]=="Iris-virginica",["PetalLengthCm"]] 16. PetalWidthCm_Iris_setosa = df.loc[df["Species"]=="Iris-setosa",["PetalWidthCm"]] 17. PetalWidthCm_Iris_versicolor = df.loc[df["Species"]=="Iris-versicolor",["PetalWidthCm"]] 18. PetalWidthCm_Iris_virginica = df.loc[df["Species"]=="Iris-virginica",["PetalWidthCm"]] 19. pd_data = pd.read_csv("iris.csv") # 可用read_csv导入数据 20. 21. def func(type_A,type_B,color,all_type): 22. # 划分x,y 23. exam_X = type_A 24. exam_Y = type_B 25. # 将原数据集拆分训练集和测试集 26. X_train, X_test, Y_train, Y_test = train_test_split(exam_X, exam_Y, train_size=.8) 27. model = LinearRegression() # 线性回归模型 28. model.fit(X_train, Y_train) # 模型的成员函数fit(X,y)以数组X和y为输入 29. a = model.intercept_ # 截距 判断是否有截据,如果没有则直线过原点 30. b = model.coef_ # 回归系数 模型的成员变量,存储线性模型的系数 31. # 训练数据预测值 32. y_train_pred = model.predict(X_train) # 预测 33. score = model.score(X_test, Y_test) # 可决系数 返回对于以X为samples,以y为target的预测效果评分 34. # 绘制最佳拟合线:标签用的是训练数据的预测值y_train_pred 35. plt.plot(X_train, y_train_pred, color='black', linewidth=3) 36. # 测试数据散点图 37. plt.scatter(X_test, Y_test, color=color) 38. plt.scatter(X_train, Y_train, color=color, label=all_type) 39. # 添加图标标签 40. plt.legend(loc=2) 41. 42. def run(): 43. func(PetalLengthCm_Iris_setosa,PetalWidthCm_Iris_setosa,'green',"Iris-setosa") 44. func(PetalLengthCm_Iris_versicolor,PetalWidthCm_Iris_versicolor,"red","Iris-versicolor") 45. func(PetalLengthCm_Iris_virginica,PetalWidthCm_Iris_virginica,"blue","Iris-virginica") 46. plt.gcf().set_facecolor(np.ones(3) * 240 / 255) # 生成画布的大小 47. plt.grid() # 生成网格 48. plt.xlabel("PetalLengthCm") 49. plt.ylabel("PetalWidthCm") 50. plt.title("PetalLengthCm与PetalWidthCm回归分析图") 51. plt.savefig("PetalLengthCm与PetalWidthCm回归分析图.png") 52. plt.show() 53. run()
效果如下:
四、 K-means聚类分析图
k均值聚类算法(k-means clustering algorithm)是一种 迭代 求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。
代码如下:
1. import numpy as np 2. import matplotlib.pyplot as plt 3. from sklearn.cluster import KMeans 4. from sklearn.preprocessing import StandardScaler 5. import pandas as pd 6. plt.rcParams['font.sans-serif']=['SimHei'] 7. plt.rcParams['axes.unicode_minus']=False 8. df = pd.read_csv("iris.csv") 9. Species = df["Species"] 10. PetalLengthCm = df["PetalLengthCm"] 11. PetalWidthCm = df["PetalWidthCm"] 12. fin_list = [] 13. for i in range(0,len(PetalWidthCm)): 14. fin_list.append([PetalLengthCm[i],PetalWidthCm[i]]) 15. n_samples = len(PetalWidthCm) 16. X = np.array(fin_list) 17. X = StandardScaler().fit_transform(X) #标准化 18. Kmeans=KMeans(n_clusters=3,random_state=170) 19. Kmeans.fit(X) 20. plt.figure(figsize=(8,6)) 21. plt.scatter(X[:,0],X[:,1],c=Kmeans.labels_) 22. plt.title("K-means聚类分析数据图") 23. plt.savefig("K-means聚类分析数据图.png") 24. plt.show()
效果如下:
五、决策树分类图
分类树(决策树)是一种十分常用的分类方法。 它是一种监督学习,所谓监督学习就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分类器,这个分类器能够对新出现的对象给出正确的分类。 这样的机器学习就被称之为监督学习
代码如下:
1. import pandas as pd 2. import numpy as np 3. import matplotlib.pyplot as plt 4. from sklearn.model_selection import train_test_split 5. from sklearn.tree import DecisionTreeClassifier 6. from mlxtend.plotting import plot_decision_regions 7. plt.rcParams['font.sans-serif']=['SimHei'] 8. plt.rcParams['axes.unicode_minus']=False 9. df = pd.read_csv("iris.csv") 10. Species = df["Species"] 11. PetalLengthCm = df["PetalLengthCm"] 12. PetalWidthCm = df["PetalWidthCm"] 13. fin_list = [] 14. label_list = [] 15. for i in range(0,len(PetalWidthCm)): 16. fin_list.append([PetalLengthCm[i],PetalWidthCm[i]]) 17. n_samples = len(PetalWidthCm) 18. X = np.array(fin_list) 19. for i in range(0,len(PetalWidthCm)): 20. if Species[i] == "Iris-setosa": 21. label_list.append(0) 22. elif Species[i] == "Iris-versicolor": 23. label_list.append(1) 24. else: 25. label_list.append(2) 26. y = np.array(label_list) 27. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y) 28. clf_tree = DecisionTreeClassifier(criterion='gini', max_depth=4, random_state=1) 29. clf_tree.fit(X_train, y_train) 30. X_combined = np.vstack((X_train, X_test)) 31. y_combined = np.hstack((y_train, y_test)) 32. fig, ax = plt.subplots(figsize=(6, 6)) 33. plot_decision_regions(X_combined, y_combined, clf=clf_tree) 34. plt.legend(loc='upper left') 35. plt.title("决策树分类器绘制分类结果") 36. plt.tight_layout() 37. plt.savefig("决策树分类器绘制分类结果.png") 38. plt.show()
效果如下:
六、总结
①绘制四列属性SepalWidth、SepalLength、PetalWidth以及PetalLength的散点图:
- 绘制散点图第一想法是用plt.scatter来绘制,以SepalWidth为例:x为1-len(SepalWidth)+1的序列,y即为SepalWidth每个值。
- 因为这里要绘出四个属性的散点图,所以这里定义了一个函数func,参数为label:为四个属性;num:作为color列表的索引,使每个图都有不同的颜色,更加美观也便于区别;name:属性的名称,在最后出图的时候作为标题和图标的名称。
- 用pandas库将文件读取出来,再分别读取四个属性所在的列,因为四个属性的长度都是一样的,所以这里只需要定义一个x序列,再定义一个color列表。
- 函数func封装代码,起到画散点图的作用,最后再传入不同的实参,绘制四列属性SepalWidth、SepalLength、PetalWidth以及PetalLength的散点图。
②绘制四列属性SepalWidth、SepalLength、PetalWidth以及PetalLength的热力图:
- 绘制热力图,要求相关系数,想到用seaborn里面的sns.heatmap,需要设置相关系数的计算方法、位置、是否显示数字、颜色、最大最小值、方框形状等参数。
- 在读取数据时,ID列和标签列不能读入,所以这里用pd.read_csv时要限制读取列:data=pd.read_csv('iris.csv',usecols=["SepalLengthCm","SepalWidthCm","PetalLengthCm","PetalWidthCm"])
- 将数据用corr函数计算后,传入sns.heatmap中,最后加上标题保存后将图片显示出来。
③选取相关系数较大的属性进行回归分析:
- 由第二问可知,PetalLengthCm和PetalWidthCm相关系数最大,为0.96,故要对这两列数据进行回归分析。
- 由参考图可知,需要分类别进行回归分析,即Iris-setosa、Iris-versicolor、Iris-virginica三个属性要分别进行回归分析,这就要求在读取文件后,对数据进行预处理。用df.loc可以 指定列读取指定内容,例如:PetalLengthCm_Iris_setosa = df.loc[df["Species"]=="Iris-setosa",["PetalLengthCm"]]。
- 因为三个属性都要回归分析,所以这里再一次运用的函数封装的思想,定义func可以画出一个回归分析的图,再利用函数run,调用三次func函数,在一个图中将三次的回归分析表现出来。
- 函数func是利用数据集训练线性回归模型,首先将原数据集拆分训练集和测试集,定义一个线性回归模型,模型的成员函数fit(X,y)以数组X和y为输入,再判断是否有截据,如果没有则直线过原点,计算相关系数,并绘制最佳拟合曲线并绘制散点图。
- 函数run是调用三次func函数,每一次向其中传入不同的实参,达到绘制三个列表的回归分析图。
- 最后生成画布和王哥,使结果更加直观。添加标签和坐标、标题等元素,将图片保存后显示出来。
④绘制K-means聚类分析的结果:
- Kmeans聚类主要用的是sklearn.cluster里面的Kmeas,将两列数据读取进来,通过for循环转化为list嵌套列表,再通过np.array转化为矩阵,在进行一次标准化。
- Kmeans聚类,我这里n_clusters=3,即聚成三类,每一类用不同的颜色标注出来,最后加上标题,保存并显示出来。
⑤训练决策树分类器,绘制分类结果:
- 决策树分类主要用的是sklearn.model_selection里面的train_test_split函数以及sklearn.tree里面的DecisionTreeClassifier。
- 首先是数据预处理,读取文件,读取指定列,将PetalLengthCm与PetalWidthCm关联起来,存到一个嵌套列表中,用np.array转化为矩阵。通过类别添加标签0、1、2。用for循环遍历Species中的每一个值,用if语句进行判断,为其添加标签,便于训练决策树模型。
- 划分训练集、测试集:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)。
- 再进行决策树模型的训练:clf_tree = DecisionTreeClassifier(criterion='gini', max_depth=4, random_state=1)、plot_decision_regions(X_combined, y_combined, clf=clf_tree)。
- 最终将图例、标题等提示性信息添加到图表上,保存图片到本地,并将最终结果显示出来。