(大)数据处理:从txt到数据可视化

Python 2.7
IDE Pycharm 5.0.3
numpy 1.11.0
matplotlib 1.5.1

本次可视化数据由机器学习实战倾情提供(就是盗用了数据和改了一点点程序更加易读)


前言

将txt中数据进行可视化展示用于分析需求

你只需要知道

每行的第一列数据是飞行里程,第二列是玩游戏所占百分比时间,第三列是每年吃的冰激凌消耗量,第四列是某个xx觉得这类人的适合约会的感兴趣程度,也就是说啦,他一年飞40920公里,有百分之八左右的时间在玩游戏,每年还要吃掉0.9公升哦,这个对象xx觉得好有魅力,非常想和它约会呢,就是这个意思!


准备食材

我用的datingTestSet.txt,是左边那个

刚下载下来的txt是左边那个,第四列也就是类别了,但是中文怎么转化为右边那个数值强度呢?还是挺简单的,扫描每一行的时候把判断相等字符串直接替换就可以了,详细请看如下代码片段,这里单独拿出来看一下。

#将评价转化为数字
        if listFromLine[3] == 'largeDoses':
            listFromLine[3] =3
        elif listFromLine[3] == 'smallDoses':
            listFromLine[3]=2
        else:
            listFromLine[3]=1

经过转化之后,形式应该和右边那个一样了,非常想约会是3,一般是2,不想是1,就酱紫。这也就是类别了。


从txt到存入array数组

我现在接触到的保存在txt中数据的有(大)数据处理:从txt到MySql的数据预处理迁徙中的北京市一个月的出租车GPS数据(350G),高光谱数据AVIRIS遥感图像数据(.mat)也是可以转化为txt的,所以如何将txt数据清洗后存入到array也好,存入到database也好,这都是数据处理后续工作避不开的前提,废话不多说,开始。

完整代码

# -*- coding: utf-8 -*-
from numpy import *
import matplotlib.pyplot as plt

def file2matrix(filename):
    fr = open(filename,'r')
    arrayOlines = fr.readlines()
    numberOfLines = len(arrayOlines)
    returnMat = zeros((numberOfLines,3)) #构造全零阵来存放数
    classLabelVector = [] #开辟容器
    index = 0

    for line in arrayOlines:
        #清洗数据
        line = line.strip()
        listFromLine = line.split('\t')
        #将评价转化为数字
        if listFromLine[3] == 'largeDoses':
            listFromLine[3] =3
        elif listFromLine[3] == 'smallDoses':
            listFromLine[3]=2
        else:
            listFromLine[3]=1
        #存入数据到list
        returnMat[index,:] = listFromLine[0:3] #三个特征分别存入一行的三个列
        classLabelVector.append(int(listFromLine[3])) #最后一行是类别标签

        index +=1
    return returnMat,classLabelVector


#将喜欢强度转化为颜色
def ColorOfDatingLable(num):
    datingLabels_rgb = []
    for i in range(len(num)):
        if num[i]==3:
            datingLabels_rgb.append('red')
        elif num[i]==2:
            datingLabels_rgb.append('green')
        else:
            datingLabels_rgb.append('black')

    return datingLabels_rgb

datingDataMat,datingLabels = file2matrix('C:\\Users\\MrLevo\\Desktop\\machine_learning_in_action\\Ch02\\datingTestSet.txt')


##################创建图表1#####################
plt.figure(1) #创建图表1

ax1 = plt.subplot(1,2,1) # 图表1中创建子图1
plt.title("original color")
plt.xlabel('play game/time %')
plt.ylabel('ice cream cost/week')

ax2 = plt.subplot(1,2,2) # 图表1中创建子图2
plt.title("improved color")
plt.xlabel('play game/time %')
plt.ylabel('ice cream cost/week')

###################创建图表2####################
plt.figure(2) #创建图表2

ax3 = plt.subplot(2,2,1) # 图表2中创建子图1
plt.title("play game & ice cream cost")
plt.xlabel('play game/time %')
plt.ylabel('ice cream cost/week')

ax4 = plt.subplot(2,2,2) # 图表2中创建子图2
plt.title("fly distance & play game")
plt.xlabel('fly distance/year')
plt.ylabel('play game/time %')

ax5 = plt.subplot(2,2,3) # 图表2中创建子图2
plt.title("fly distance & ice cream cost")
plt.xlabel('fly distance/year')
plt.ylabel('ice cream cost/week')

#plt.scatter(x[i],y[i],marker = 样式,s=大小半径,color =(np.random.rand(1,3)),label = str(i+1))
ax1.scatter(datingDataMat[:,1],datingDataMat[:,2],15*array(datingLabels),15*array(datingLabels)) #scatter散点图展示第二列和第三列数据
ax2.scatter(datingDataMat[:,1],datingDataMat[:,2],s=15*array(datingLabels),color=ColorOfDatingLable(datingLabels)) #scatter散点图展示第二列和第三列数据,第一个15*array(datingLabels)用来表现不同标签的不同半径
ax3.scatter(datingDataMat[:,1],datingDataMat[:,2],s=15*array(datingLabels),color=ColorOfDatingLable(datingLabels),label='largeDoses/smallDoses/didntLike')
ax4.scatter(datingDataMat[:,0],datingDataMat[:,1],s=15*array(datingLabels),color=ColorOfDatingLable(datingLabels),label='largeDoses/smallDoses/didntLike')
ax5.scatter(datingDataMat[:,0],datingDataMat[:,2],s=15*array(datingLabels),color=ColorOfDatingLable(datingLabels),label='largeDoses/smallDoses/didntLike')

ax3.legend(loc='upper right')
ax4.legend(loc='upper right')
ax5.legend(loc='upper right')

plt.show()

产生的效果图如下

三幅对比图

对比图分析

从上图中可以看出,红点的密集区域以及各个维度之间的联系,其中吃不吃冰激凌,这个貌似并不能作为评判的影响性因素,因为冰激凌量的多少,完全符合了均匀分布。唯一有价值的算是第二幅图,我们可以看出,飞行时间在40000左右,玩游戏时间所占比例为10%左右,xx女士比较喜欢这样类型的男士,并且表现出了极大兴趣,而飞行时间过长,或者游戏时间很短,却不受她的青睐,我们这里揣测一下xx女士的想法,她喜欢的类型应该是比较活泼的,见多识广,但又能不经常出差希望陪伴在自己身边的男士,从飞行距离上看出,适当的旅行能增长见识,会更有趣,而过长的飞行时间,只能表明,他要么在出差,要么就属于那种全世界游玩的人,这样的不定性而缺乏安全感,我想这也就是xx女士并不喜欢这类男士的原因吧,而飞行时间很短,缺乏对外界的认识,让xx女士觉得这类男士缺乏见识和有趣度,你想,一个常年待在家的人,会有多少有趣呢,俗话说得好,读万卷书不如行万里路,我想也是xx女士判别一个人是否有趣的因素吧,而游戏时间上来说,过短的游戏时间,可能会让xx女士认为男士缺乏幽默,激情,智商的表现,毕竟游戏很多都是对一个人反应能力,情商,布局能力的各方面体现,所以,xx女士认为一个不玩游戏,并且飞行距离超长的男士,只能判断为长期出差在外,所以并不喜欢这类,而她对那些‘死宅’却保持着一般的兴趣,这点说明,死宅也有春天啊,哈哈哈。


改进代码

画散点阵scatter来说,它的参数设置是这样的:
#plt.scatter(x[i],y[i],marker = 样式,s=大小半径,color =颜色,label = 点备注
而书中的有一行代码是这样的,我相信也有小伙伴们觉得这个很奇怪:

ax1.scatter(datingDataMat[:,1],datingDataMat[:,2],15*array(datingLabels),15*array(datingLabels)) #scatter散点图展示第二列和第三列数据

第一个好理解,15*array(datingLabels)它来规定点的尺度大小,而第二个的15*array(datingLabels)来表示颜色?很抱歉,我查找scatter颜色参数的过程中,没有看到这个表示方法的,可能我没找到吧,如果有人知道请告诉我一声为什么可以这么表示颜色。我目前知道的表示颜色的参数可以有类似“r”,或者三原色的数值表示的,并没有看到单数值表示的。所以我改进了一下,写了个ColorOfDatingLable函数,里面是将数值转换为颜色值对应起来。所用的语句是这个

ax2.scatter(datingDataMat[:,1],datingDataMat[:,2],s=15*array(datingLabels),color=ColorOfDatingLable(datingLabels)) #scatter散点图展示第二列和第三列数据,第一个15*array(datingLabels)用来表现不同标签的不同半径

他们两的对比图我也放在一块比较了,如图显示

新旧函数对比

相比较而言,修改后的图更加清晰,特色明显。


你可能还需要知道


致谢

numpy快速入门
@星星点灯--Python图表绘制:matplotlib绘图库入门
@MrLevo520--机器学习之K-近邻算法(Python描述)基础
matplotlib官方文档
@MrLevo520--(大)数据处理:从txt到MySql的数据预处理迁徙

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容