数据分析(一)- 数据分析基础及matplotlib


数据分析:

  • 基础概念和环境
  • matplotlib:绘图
  • numpy:处理数值型数组
  • pandas:在numpy的基础之上,除了能够处理数值型数组之外,还能处理字符串,列表,时间序列等等数据类型。
    在这里插入图片描述

为什么要学习数据分析

从大量数据中,寻找规律,对大量数据进行统计和分析,统计出感兴趣的规律,供后续使用。绘图使我们更好的理解数据,从一堆数据里面找出经验或结论供他人使用。

  1. 有岗位需求 爬虫+数据分析
  2. 是python数据科学的基础
  3. 是机器学习课程的基础

什么是数据分析

数据分析是用适当的方法对收集来的大量数据进行分析,帮助人们做出判断,以便采取行动。

数据分析的流程:
提出问题-》准备数据-》分析数据-》获得结论-》成果可视化, …

环境安装

conda: https://www.anaconda.com/download/
创建环境:

conda create --name env_name python=3

切换环境:

windows: activate env_name
linux/macos: source activate env_name

认识jupyter notebook

jupyter notebook:一款变成、文档、笔记、展示软件。
启动命令:

jupyter notebook

matplotlib

纯用python实现的库,matplotlib能将数据进行可视化,更直观地呈现,使数据更加客观、更具说服力。
matplotlib是最流行的python底层绘图库,主要做数据可视化图标,名字取材于matlab.

matplotlib能够绘制折线图,散点图,柱状图,直方图,箱线图,饼图等

但是,我们需要知道不同的统计图到底能够表示出什么,以此来决定选择哪种统计图来更直观的呈现我们的数据

matplotlib绘制折线图 plt.plot

plt.plot(x,y)画一条线
多个plt.plot画多条线

from matplotlib import pyplot as plt #导入pyplot
x = range(2,26,2)
y = [15,13,14,15,16,20,21,23,24,25,20,19]
plt.plot(x,y) #传入x,y,通过plot绘制出折线图
plt.show() #展示图形

结果:
在这里插入图片描述

maplotlib基础绘图

设置图片大小 plt.figure(figsize=,dpi=)

生成指定大小的高清图,必须在plt.plot函数之前设置。

from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20,8), dpi=80) #figure图形图标,在这里指的是我们画的图。  dpi: 每英寸上点的个数
x = range(2,26,2)
y = [15,13,14,15,16,20,21,23,24,25,20,19]
plt.plot(x,y)
plt.show()

结果:
在这里插入图片描述

保存到本地 plt.savefig(save_path)

from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20,8), dpi=80) #figure图形图标,在这里指的是我们画的图。  dpi: 每英寸上点的个数
x = range(2,26,2)
y = [15,13,14,15,16,20,21,23,24,25,20,19]
plt.plot(x,y)
plt.savefig('d:\pic.png') #保存图片
plt.show()

结果:
在这里插入图片描述

添加x,y轴刻度 plt.xticks(x)

比如x轴和y轴表示什么,这个图表示什么

from matplotlib import pyplot as plt
#设置图片大小
fig = plt.figure(figsize=(20,8), dpi=80) #figure图形图标,在这里指的是我们画的图。  dpi: 每英寸上点的个数
x = range(2,26,2)
y = [15,13,14,15,16,20,21,23,24,25,20,19]
#绘图
plt.plot(x,y)  
#设置x的刻度
plt.xticks(range(2,25))  #x轴绘制24个点
#设置y的刻度
plt.yticks(range(min(y),max(y)+1))
#展示
plt.show() 

结果:
在这里插入图片描述

调整x轴或y轴上的刻度表示 plt.xticks(x, x_label, rotation)

数字刻度与字符串刻度一一对应,数据长度必须一样。

如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况?
a= [random.randint(20,35) for i in range(120)]

import random
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20,8), dpi = 80)
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
plt.plot(x,y)
#调整x的刻度表示
_x = x[::10]
_xticks_labels = ['{0}:{1}'.format(10+int(i/60),i%60) for i in _x]
plt.xticks(x[::10],_xticks_labels, rotation = 90)  #如果x轴刻度只有数字,那么只需要传入数字;否则需要传入字符串和原始x刻度,旋转90度表示
plt.show(

结果:
在这里插入图片描述

设置中文(fc-list命令 font_manager模块)

matplotlib默认不支持中文字符,因为默认的英文字体无法显示汉字。
查看linux/mac/windows下面支持的字体:

fc-list 查看支持的字体
fc-list :lang=zh 查看支持的中文(冒号前面有空格)

如何修改matplotlib的默认字体?

通过matplotlib.rc函数可以修改,具体方法参见源码(windows/linux)
通过matplotlib 下的font_manager模块可以解决(windows/linux/mac)

matplotlib.rc函数

font = {'family' : 'monospace',
              'weight' : 'bold',
              'size'   : 'larger'}

matplotlib.rc('font', **font)

font_manager模块
使用fc-list查看字体文件路径,然后利用该路径实例化font_manager

font_manager.FontProperties(fname=“C:/WINDOWS/Fonts/msyhbd.ttc”)
plt.xticks(x[::10],_xticks_labels, rotation = 45, fontproperties = my_font)

import random
from matplotlib import pyplot as plt
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname="C:/WINDOWS/Fonts/msyhbd.ttc")
fig = plt.figure(figsize=(20,8), dpi = 80)
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
plt.plot(x,y)
#调整x的刻度表示
_x = x[::10]
_xticks_labels = ['{0}点{1}分'.format(10+int(i/60),i%60) for i in _x]
plt.xticks(x[::10],_xticks_labels, rotation = 45, fontproperties = my_font)  #如果x轴刻度只有数字,那么只需要传入数字;否则需要传入字符串和原始x刻度,旋转45度表示
plt.show()

结果:
在这里插入图片描述

添加x轴、y轴描述信息 plt.xlable() plt.ylabel() plt.title()

import random
from matplotlib import pyplot as plt
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname="C:/WINDOWS/Fonts/msyhbd.ttc")
fig = plt.figure(figsize=(20,8), dpi = 80)
x = range(0,120)
y = [random.randint(20,35) for i in range(120)]
plt.plot(x,y)
#调整x的刻度表示
_x = x[::10]
_xticks_labels = ['{0}点{1}分'.format(10+int(i/60),i%60) for i in _x]
plt.xticks(x[::10],_xticks_labels, rotation = 45, fontproperties = my_font)  #如果x轴刻度只有数字,那么只需要传入数字;否则需要传入字符串和原始x刻度,旋转45度表示
plt.xlabel('时间',fontproperties = my_font)
plt.ylabel('温度 单位(摄氏度)',fontproperties = my_font)
plt.title('10点到12点每分钟气温的变化情况', fontproperties = my_font)
plt.show()

结果:
在这里插入图片描述

绘制网格 plt.grid

from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname = 'C:/WINDOWS/Fonts/msyhbd.ttc')
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
x = range(11,31)
plt.figure(figsize=(20,8), dpi= 80)
plt.plot(x,y)

#设置x轴刻度
x_ticks_labels = [str(x) + '岁' for x in x]
plt.xticks(x,x_ticks_labels, fontproperties = my_font)

#绘制网格
plt.grid(alpha = 0.4)  #alpha设置网格透明度

#展示
plt.show()

结果:在这里插入图片描述

绘制多个折线 plt.legend()

在这里插入图片描述

from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname = 'C:/WINDOWS/Fonts/msyhbd.ttc')
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2 = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
x = range(11,31)

#设置图形大小
plt.figure(figsize=(20,8), dpi= 80)
plt.plot(x,y, label = '自己')
plt.plot(x,y2, label = '同桌')

#设置x轴刻度
x_ticks_labels = [str(x) + '岁' for x in x]
plt.xticks(x,x_ticks_labels, fontproperties = my_font)

#绘制网格
plt.grid(alpha = 0.4)  #alpha设置网格透明度

#添加图例:告诉别人,每条线代表什么意思
plt.legend(prop = my_font, loc = 'upper left')  # loc设置图例的位置, 这里设置左上角

#展示
plt.show()

结果:
在这里插入图片描述

线条的样式(比如颜色,透明度等) plt.plot(x,y, label, color = ‘orange’, linestyle = ‘-.’)

在这里插入图片描述
在这里插入图片描述

from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname = 'C:/WINDOWS/Fonts/msyhbd.ttc')
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y2 = [1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]
x = range(11,31)

#设置图形大小
plt.figure(figsize=(20,8), dpi= 80)

# 绘图并设置线条颜色,样式
plt.plot(x,y, label = '自己', color = 'orange', linestyle = ':')
plt.plot(x,y2, label = '同桌', color = 'cyan', linestyle = '-.')

#设置x轴刻度
x_ticks_labels = [str(x) + '岁' for x in x]
plt.xticks(x,x_ticks_labels, fontproperties = my_font)

#绘制网格
plt.grid(alpha = 0.4, linestyle = '--')  #alpha设置透明度, linestype设置线条样式

#添加图例:告诉别人,每条线代表什么意思
plt.legend(prop = my_font, loc = 'upper left')  # loc设置图例的位置, 这里设置左上角

#展示
plt.show()

结果:
在这里插入图片描述

  1. 标记出特殊的点(比如告诉别人最高点和最低点在哪里)
  2. 给图片添加一个水印(防伪,防止盗用)

常用统计图

折线图

以折线的上升或下降来表示统计数量的增减变化的统计图。
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
在这里插入图片描述

直方图

由一系列高度不等的纵向条纹或线段表示数据分布的情况。
一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据,展示一组或者多组数据的分布状况(统计)
在这里插入图片描述

条形图

排列在工作表的列或行中的数据可以绘制到条形图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)
在这里插入图片描述

散点图

用两组数据构成多个坐标点,考察坐标点的分布,判断两变量
之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
在这里插入图片描述
在这里插入图片描述

matplotlib绘制散点图 plt.scatter()

假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间(天)变化的某种规律?
a = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
b =[26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]

from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:/WINDOWS/Fonts/msyhbd.ttc')
y1 = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
y2 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]

x1 =  range(1,32)
x2 = range(51,82)
#设置图像大小
fig = plt.figure(figsize=(20,8), dpi = 80)

#使用sactter绘制散点图,和之前绘制折线图的唯一区别
plt.scatter(x1,y1, label='3月份',)
plt.scatter(x2,y2, label='4月份')

#调整x轴的刻度
x1_labels = ['3月{}日'.format(i) for i in x1[::3]]
x2_labels = ['10月{}日'.format(i%50) for i in x2[::3]]
plt.xticks(list(x1[::3]) + list(x2[::3]), x1_labels + x2_labels, fontproperties = my_font, rotation = 45)

#添加描述信息
plt.xlabel('时间', fontproperties = my_font)
plt.ylabel('温度', fontproperties = my_font)
plt.title('3月和10月份的温度变化', fontproperties = my_font)

#添加图例
plt.legend(prop = my_font)

#展示
plt.show()

结果:
在这里插入图片描述
散点图的应用场景:

  • 不同条件(维度)之间的内在关联关系
  • 观察数据的离散聚合程度

matplotlib绘制条形图 plt.bar() plt.barh()

示例一:假设你获取到了2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据?

a = [“战狼2”,“速度与激情8”,“功夫瑜伽”,“西游伏妖篇”,“变形金刚5:最后的骑士”,“摔跤吧!爸爸”,“加勒比海盗5:死无对证”,“金刚:骷髅岛”,“极限特工:终极回归”,“生化危机6:终章”,“乘风破浪”,“神偷奶爸3”,“智取威虎山”,“大闹天竺”,“金刚狼3:殊死一战”,“蜘蛛侠:英雄归来”,“悟空传”,“银河护卫队2”,“情圣”,“新木乃伊”,]

b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23] 单位:亿

from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font  = font_manager.FontProperties(fname='C:/WINDOWS/Fonts/msyhbd.ttc')
x_labels = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:\n最后的骑士","摔跤吧!\n爸爸","加勒比海盗5:\n死无对证","金刚:\n骷髅岛","极限特工:\n终极回归","生化危机6:\n终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:\n殊死一战","蜘蛛侠:\n英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
x = range(len(x_labels))
y = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

#设置图形大小
fig = plt.figure(figsize= (15,10), dpi = 80) # figsize(w,h)

#绘制条形图
plt.bar(x,y, width= 0.7, label='电影销量')

#设置x的刻度
plt.xticks(x, x_labels, fontproperties = my_font, rotation = 90)
plt.legend(prop = my_font)

# 展示
plt.show()

结果:
在这里插入图片描述
横着的条形图

from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font  = font_manager.FontProperties(fname='C:/WINDOWS/Fonts/msyhbd.ttc')
x_labels = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
x = range(len(x_labels))
y = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

#设置图形大小
fig = plt.figure(figsize= (15,10), dpi = 80) # figsize(w,h)

#绘制条形图
plt.barh(x,y, height= 0.3, label='电影销量',color = 'orange')

#设置x的刻度
plt.yticks(x, x_labels, fontproperties = my_font)

#添加网格
plt.grid(alpha = 0.3)

# 展示
plt.show()

结果:
在这里插入图片描述

示例二:假设你知道了列表a中电影分别在2017-09-14(b_14), 2017-09-15(b_15), 2017-09-16(b_16)三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,应该如何更加直观的呈现该数据?

a = [“猩球崛起3:终极之战”,“敦刻尔克”,“蜘蛛侠:英雄归来”,“战狼2”]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]

from turtle import width
from matplotlib import pyplot as plt 
from matplotlib import font_manager
my_font  = font_manager.FontProperties(fname='C:/WINDOWS/Fonts/msyhbd.ttc')
x_labels = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
y1 = [15746,312,4497,319]
y2 = [12357,156,2045,168]
y3 = [2358,399,2358,362]
x1 = list(range(len(x_labels)))
x2 = [i+0.2 for i in x1]
x3 = [i+0.4 for i in x1]

#设置图形大小
plt.figure(figsize=(20,8), dpi = 80)

#画多个条形图
plt.bar(x1,y1, width=0.2, label='9月14日')
plt.bar(x2,y2, width=0.2, label='9月15日')
plt.bar(x3,y3, width=0.2, label='9月16日')

#设置x轴的刻度
plt.xticks(x2,x_labels, fontproperties = my_font)

#设置图例
plt.legend(prop = my_font)

#展示
plt.show()

结果:
在这里插入图片描述
条形图的应用场景:

  • 数量统计
  • 频率统计(市场饱和度)

示例三、在美国2004年人口普查发现有124 million的人在离家相对较远的地方工作。根据他们从家到上班地点所需要的时间,通过抽样统计(最后一列)出了下表的数据,这些数据能够绘制成直方图么?
interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]
在这里插入图片描述

from matplotlib import pyplot as plt  
from matplotlib import font_manager
interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]

#设置图形大小
plt.figure(figsize= (20,8), dpi = 80)

#绘制条形图
plt.bar(range(len(quantity)), quantity, width = 1)
_x = [i-0.5 for i in range(13)]
_xtick_labels = interval + [150]
plt.xticks(_x, _xtick_labels)
#网格
plt.grid()
#展示
plt.show()

结果:
在这里插入图片描述

matplotlib绘制直方图 plt.hist

假设你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,你应该如何呈现这些数据?

from matplotlib import pyplot as plt    
from matplotlib import font_manager
a = [131,  98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115,  99, 136, 126, 134,  95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117,  86,  95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123,  86, 101,  99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140,  83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144,  83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137,  92,121, 112, 146,  97, 137, 105,  98, 117, 112,  81,  97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112,  83,  94, 146, 133, 101,131, 116, 111,  84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]

#计算组数
d = 3 #组距,根据这个组距调整分成多少个bin
num_bins = (max(a) - min(a)) //d

plt.figure(figsize=(20,8), dpi = 80)

# 绘制频数分布直方图
plt.hist(a, num_bins)

# 绘制频率分布直方图
# plt.hist(a, num_bins, density = True)

# 设置x轴刻度  这里直接传入数字刻度
plt.xticks(range(min(a), max(a)+d, d))

#设置网格
plt.grid()

#展示
plt.show() 

结果:
频数分布直方图
在这里插入图片描述
频率分布直方图
在这里插入图片描述
直方图应用场景:

  • 用户的年龄分布状态
  • 一段时间内用户点击次数的分布状态
  • 用户活跃时间的分布状态

更多的绘图工具

plotly:可视化工具中的github,相比于matplotlib更加简单,图形更加漂亮,同时兼容matplotlib和pandas

使用用法:简单,照着文档写即可。

文档地址: https://plot.ly/python/

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值