数据分析入门
第一天 参考视频
一、Jupyter使用
(一)优点
-
展示数据方便
-
可以分块运行代码
(二)模式
-
编辑模式:在单元格(cell)里面操作
-
命令模式:操作单元格
(三)快捷键
-
命令模式:
Shift-Enter : 运行本单元,选中下个单元
Ctrl-Enter : 运行本单元,停留在本单元
A : 在上方插入新单元
B : 在下方插入新单元
D,D : 删除选中的单元(双击D)
Enter : 转入编辑模式
-
编辑模式
Tab : 代码补全或缩进
Ctrl-A : 全选
Ctrl-Z : 撤销
Ctrl-/ : 注释
Ctrl-鼠标点击:多光标操作
二、Matplotlib(Matrix Plot Library)
(一)用途及优点
-
专用于开发2D图表
-
以渐进、交互式方式实现数据可视化
(二)Matplotlib三层结构
-
容器层
画板层Canvas
画布层Figure(plt.figure())
绘图区/坐标系axes(axis,一个画布可以有多个绘图区,plt.subfplots())
-
辅助显示层
坐标轴、刻度、图例等
-
图像层
图像
(三)折线图
-
基本绘图方法
import matplotlib.pyplot as plt %matplotlib inline import random #需求:...... #1.准备数据 x=range(60) y_first=[random.uniform(15,18) for i in x] # 第一根线 y_second=[random.uniform(1,3) for i in x] # 第二根线 #2.创建画布 plt.figure(figsize=(20,8),dpi=80) #3.绘制图像 plt.plot(x,y_first,color="r",linestyle="--",label="SHanghai") # 第一根线 plt.plot(x,y_second,color="b",linestyle="-.",label="Beijing") # 第二根线 # 显示图例 plt.legend() # 修改x、y刻度 x_label = ["11H{}m".format(i) for i in x] #中文显示有问题 解决方法不管了 plt.xticks(x[::5],x_label[::5]) # plt.yticks(range(0,40,5)) plt.yticks(range(40)[::5]) # 添加网格线 plt.grid(linestyle="--",alpha=0.5) # 添加标题、坐标轴标签 plt.xlabel("Time") plt.ylabel("Temperature") plt.title("You Shoule Say Sth.") #4.保存图像 # path = "C:/Users/ABC/Desktop/figure.png" # plt.savefig(path) #5.显示图像 plt.show() #此语句会释放figure资源,如果在此语句后保存图像,将得到空白图
-
多个坐标系显示-plt.subplots(面向对象的画图方法)
import matplotlib.pyplot as plt %matplotlib inline import random #需求:...... # 1.准备数据 x=range(60) y_first = [random.uniform(15,18) for i in x] # 第一根线 y_second = [random.uniform(1,3) for i in x] # 第二根线 # 2.创建画布 # plt.figure(figsize=(20,8),dpi=80) figure,axes = plt.subplots(nrows=1,ncols=2,figsize=(20,8),dpi=80) # 3.绘制图像 axes[0].plot(x,y_first,color="r",linestyle="--",label="SHanghai") # 第一根线 axes[1].plot(x,y_second,color="b",linestyle="-.",label="Beijing") # 第二根线 # 显示图例 axes[0].legend() axes[1].legend() # 修改x、y刻度 x_label = ["11H{}m".format(i) for i in x] # 中文显示有问题 解决方法不管了 axes[0].set_xticks(x[::8]) axes[0].set_xticklabels(x_label[::8]) axes[0].set_yticks(range(40)[::5]) axes[1].set_xticks(x[::8]) axes[1].set_xticklabels(x_label[::8]) axes[1].set_yticks(range(40)[::5]) # 添加网格线 axes[0].grid(linestyle="--",alpha=0.5) axes[1].grid(linestyle="--",alpha=0.5) # 添加标题、坐标轴标签 axes[0].set_xlabel("Time") axes[0].set_ylabel("Temperature") axes[0].set_title("Shanghai") axes[1].set_xlabel("Time") axes[1].set_ylabel("Temperature") axes[1].set_title("Beijing") # 4.保存图像 # path = "C:/Users/ABC/Desktop/figure.png" # plt.savefig(path) # 5.显示图像 plt.show() # 此语句会释放figure资源,如果在此语句后保存图像,将得到空白图
-
折线图的应用场景
某事物、某指标随时间的变化状况
拓展:画各种数学函数图像
(四)各种图型
-
折线图 plot - 变化状况(拓展:画各种数学函数图像)
画法见上面
-
散点图 scatter - 关系/规律
import matplotlib.pyplot as plt %matplotlib inline import random # 相比于折线图,plot改成scatter即可,少了画线这一步 # 1.准备数据 movie_names = ["The Intern","Me Before You","The Jungle Book","Room","The Martian","Like Sunday, Like Rain"] tickets = [int(random.uniform(30001,60000)) for i in movie_names] # 2.创建画布 plt.figure(figsize=(20,8),dpi=80) # 3.绘制图像 plt.scatter(movie_names,tickets) # 4.显示图像 plt.show()
-
柱状图 bar - 统计/对比
# 显示单个柱状图 import matplotlib.pyplot as plt %matplotlib inline import random # 柱状图,对比不同电影票数 # 1.准备数据 # movie_names = ["The Intern","Me Before You","The Jungle Book","Room","The Martian","Like Sunday, Like Rain"] movie_names = ["The","Me","Jungle","Room","Martian","Sunday"] tickets = [int(random.uniform(30001,60000)) for i in movie_names] # 2.创建画布 plt.figure(figsize=(20,8),dpi=80) # 3.绘制图像 x_ticks = range(len(movie_names)) plt.bar(x_ticks,tickets,color=['b','r','g','y','c','m']) # 修改刻度 # plt.xticks = (x_ticks,movie_names) # 不知道为什么刻度标签显示不出来 plt.xticks(x_ticks,movie_names) # 这是个函数,用等于当然显示不出来,垃圾jupyter,这函数也不显示清楚些,连个doc都没有 # 添加标题 plt.title("Movie Tickets") # 添加网格 plt.grid(linestyle="--",alpha=0.5) # 4.显示图像 plt.show()
# 显示多个柱状图 import matplotlib.pyplot as plt %matplotlib inline import random # 柱状图,对比不同电影票数 # 1.准备数据 # movie_names = ["The Intern","Me Before You","The Jungle Book","Room","The Martian","Like Sunday, Like Rain"] movie_name = ["Lighting","Justice","Travel"] first_day = [10587,10062,1275] first_weekend = [36224,34479,11830] # 2.创建画布 plt.figure(figsize=(20,8),dpi=80) # 3.绘制图像 plt.bar(range(3),first_day,width=0.2,label="first_day") plt.bar([(i+0.2) for i in range(3)],first_weekend,width=0.2,label="first_weekend") # 让柱状图偏移0.2,不然与上面重叠 # 修改刻度 plt.xticks([(i+0.1) for i in range(3)],movie_name) # 让刻度偏移0.1,不然显示在左边不好看 # 添加标题 plt.title("Movie Tickets") # 添加网格 plt.grid(linestyle="--",alpha=0.5) # 显示图例 plt.legend() # 4.显示图像 plt.show()
-
直方图 histogram - 分布状况
(1)直方图相关概念
组数(长度):在统计数据时,我们把数据按照不同的范围分成几个组,分成的组的个数称为组数
组距(宽度):每一组两个端点的差
已知 最高175.5 最矮150.5 组距5
求组数:(175.5 - 150.5) / 5 = 5
(2)直方图与柱状图对比
① 直方图展示数据的分布,柱状图比较数据的大小。
② 直方图X轴为定量数据,柱状图X轴为分类数据。
③ 直方图柱子无间隔,柱状图柱子有间隔
④ 直方图柱子宽度(组距)可不一,柱状图柱子宽度(分类)须一致
(3)直方图绘制
import matplotlib.pyplot as plt %matplotlib inline import random # 直方图,电影时长分布图 # 1.准备数据 time = [int(random.uniform(80,150)) for i in range(250)] # 2.创建画布 plt.figure(figsize=(20,8),dpi=80) # 3.绘制图像 distance = 2 # 组距 group_num = (max(time) - min(time)) // distance # 组数 plt.hist(time, bins=group_num, density=True) # density频度,怎么解决网格线和直方图柱子不对齐问题? # 修改刻度 plt.xticks(range(min(time),max(time) + 2,distance)) # 左闭右开注意加上distance # 添加标题 plt.title("Movie Duration") # 添加网格 plt.grid(linestyle="--",alpha=0.5) # 添加x、y描述信息 plt.xlabel("Movie Duration") plt.ylabel("Movie Quantity") # 4.显示图像 plt.show()
-
饼图 pie π - 占比(类别超过9个不建议使用,可用柱状图)
import matplotlib.pyplot as plt %matplotlib inline # 直方图,电影时长分布图 # 1.准备数据 movie_names = ["The Intern","Me Before You","The Jungle Book","Room","The Martian","Like Sunday, Like Rain"] place_count = [60605,54536,45819,28243,12370,7654] # 2.创建画布 plt.figure(figsize=(20,8),dpi=80) # 3.绘制图像 plt.pie(place_count, labels=movie_names, colors=['b','r','g','y','c','m'], autopct="%1.2f%%") # autopct百分比显示格式,%%转义为一个% # 保持x、y轴比例 默认就是这个,不用写此句 plt.axis("equal") # 显示图例 plt.legend() # 4.显示图像 plt.show()