昨日内容回顾
-
数据可视化模块
matplotlib 基于matplotlib的seaborn模块 import matplotlib.pyplot as plt 绘制图形有两种策略 1.直接使用Plt模块 plt.图形样式方法 2.使用DataFrame内置方法 df.plot(kind='图形样式')
-
饼图
通过面积大小反应权重占比 Plt.pie()
-
条形图
主体高低反应数值差异 垂直条形图 plt.bar 水平条形图 plt.barh 交叉条形图 plt.bar
-
直方图
反应数据的分布特征 plt.hist
-
箱线图
得知数据的下须值(Q1-1.5IQR)、下四分位数(Q1)、中位数(Q2)、均值、上四分位(Q3)数和上须值(Q3+1.5IQR),更重要的是,箱线图还可以发现数据中的异常点 plt.boxplot
-
折线图
横坐标一般情况下都是时间序列 plt.plot
-
散点图
研究两个变量之间是否存在一定的关系 plt.scatter # 气泡图 由散点图演变而来 作用是通过气泡的大小来反映第三个变量的特征
-
热力图
交叉填充表 用来反应变量之间的组合关系 sns.heatmap '''脱稿完成下列两题''' # 根据交易日期,衍生出年份和月份字段 # 统计每年各月份的销售总额
今日内容概要
- 组合图
- 数据可视化其他模块
- 数据清洗理论概要
- 数据清洗实战案例
今日内容详细
组合图
工作中往往会根据业务需求,将绘制的多个图形组合到一个大图框内,形成类似仪表板的效果;
plt.subplot2grid(shape, loc, rowspan=1, colspan=1, **kwargs)
shape:指定组合图的框架形状,以元组形式传递,如2×3的矩阵可以表示成(2,3)
loc:指定子图所在的位置,如shape中第一行第一列可以表示成(0,0)
rowspan:指定某个子图需要跨几行
colspan:指定某个子图需要跨几列
"""
# 设置大图框的长和高 plt.figure(figsize = (12,6))
# 设置第一个子图的布局
ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
# 设置第二个子图的布局
ax2 = plt.subplot2grid(shape = (2,3), loc = (0,1))
# 设置第三个子图的布局
ax3 = plt.subplot2grid(shape = (2,3), loc = (0,2), rowspan = 2)
# 设置第四个子图的布局
ax4 = plt.subplot2grid(shape = (2,3), loc = (1,0), colspan = 2)
"""
# 读取数据
Prod_Trade = pd.read_excel(r'Prod_Trade.xlsx')
# 衍生出交易年份和月份字段
Prod_Trade['year'] = Prod_Trade.Date.dt.year
Prod_Trade['month'] = Prod_Trade.Date.dt.month
# 设置大图框的长和高
plt.figure(figsize = (12,6))
# 设置第一个子图的布局
ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
# 统计2012年各订单等级的数量
Class_Counts = Prod_Trade.Order_Class[Prod_Trade.year == 2012].value_counts()
Class_Percent = Class_Counts/Class_Counts.sum()
# 将饼图设置为圆形(否则有点像椭圆)
ax1.set_aspect(aspect = 'equal')
# 绘制订单等级饼图
ax1.pie(x = Class_Percent.values, labels = Class_Percent.index, autopct = '%.1f%%')
# 添加标题
ax1.set_title('各等级订单比例')
# 设置第二个子图的布局
ax2 = plt.subplot2grid(shape = (2,3), loc = (0,1))
# 统计2012年每月销售额
Month_Sales = Prod_Trade[Prod_Trade.year == 2012].groupby(by = 'month').aggregate({'Sales':np.sum})
# 绘制销售额趋势图
Month_Sales.plot(title = '2012年各月销售趋势', ax = ax2, legend = False)
# 删除x轴标签
ax2.set_xlabel('')
# 设置第三个子图的布局
ax3 = plt.subplot2grid(shape = (2,3), loc = (0,2), rowspan = 2)
# 绘制各运输方式的成本箱线图
sns.boxplot(x = 'Transport', y = 'Trans_Cost', data = Prod_Trade, ax = ax3)
# 添加标题
ax3.set_title('各运输方式成本分布')
# 删除x轴标签
ax3.set_xlabel('')
# 修改y轴标签
ax3.set_ylabel('运输成本')
# 设置第四个子图的布局
ax4 = plt.subplot2grid(shape = (2,3), loc = (1,0), colspan = 2)
# 2012年客单价分布直方图
sns.distplot(Prod_Trade.Sales[Prod_Trade.year == 2012], bins = 40, norm_hist = True, ax = ax4, hist_kws = {'color':'steelblue'}, kde_kws=({'linestyle':'--', 'color':'red'}))
# 添加标题
ax4.set_title('2012年客单价分布图')
# 修改x轴标签
ax4.set_xlabel('销售额')
# 调整子图之间的水平间距和高度间距
plt.subplots_adjust(hspace=0.6, wspace=0.3)
# 图形显示
plt.show()
补充
数据可视化的方法补充
matplotlib
seaborn
highcharts
echarts
python中有模块可以直接使用echarts
pyecharts
文档:https://pyecharts.org/#/
数据清洗理论概要
1.什么是数据清洗
在对数据进行分析之前 对收集到的数据进行审核 处理 校验
# 数据清洗是整个数据分析环节中必不可少的一环
2.数据清洗比喻
明确需求: 麻辣香锅
收集数据: 采购食材
数据清洗: 清洗食材
数据分析: 烹饪食材
数据可视化: 拍照
数据报告: 点评
3.数据清洗定义
数据清洗是从记录表、表格、数据库中检测、纠正或删除损坏或不准确记录的过程
脏数据
缺失数据 异常数据 重复数据 错误数据等不符合规则的数据
干净的数据
处理完毕可以用于数据分析环节的数据
数据清洗常用方法及流程
读取数据:三种方法
数据概览:df.info()、df.describe()
简单处理:去除数据间的空格、英文字母大小写的转换
重复值处理:duplicated()、drop_duplicates()
缺失值处理:删除缺失值、均值填补法、向前填充/向后填充、模型填补法,如随机森林
异常值处理:删除异常值的记录,作为缺失值处理,平均值修正、盖帽法修正,不处理:业务分析挖掘价值
文本数据处理:去除前后空格处理,处理中间有,()之类的数据,正则表达式提取所需数据
日期类型处理:将系统时间格式化,系统时间和时间戳相互转换,年月日的提取
# 处理过程没有先后顺序 熟练之后随意操作
实战演练
# 数据分析三剑客
# 导入模块
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读入数据
df = pd.read_csv(r'qunar_freetrip.csv')
df
# 数据概览
df.shape # 获取行列数 (5100, 14)
df.columns # 获取列字段
df.index # 获取行索引
df.dtypes # 获取字段类型
df.info() # 查看字段类型及是否含有缺失数据
df.describe() # 快速统计
##########列字段处理#####
# df.head(5)
# 1.删除无用的Unnamed: 0字段
df.drop(columns='Unnamed: 0',inplace=True)
df.head()
# 2.列字段首尾空格(极其容易忽略)
new_col = []
for col in df.columns:
# 移除字段首尾的空格
new_col.append(col.strip())
# 替换旧字段
df.columns = new_col
"""
列表生成式
df.columns = [col.strip() for col in df.columns]
"""
"""
针对异常值处理
1.占比不大可以直接删除
2.Z得分法
3.分位数法
4.距离法
5.直接核定修改
"""
# 删除行数据
# 方式1 纵向合并 统一获取索引值
# 重置行索引
df.index = range(0,df.)
重复值处理
# 统计重复的数据
df.duplicated().sum()
# 直接删除重复的数据
df.drop_duplicates(inplace=True)
df.shape # 查看行列数
# 重置行索引
# 方式1
df.reset_index(inplace=True)
df.drop(columns=['index'],inplace=True)
df.drop(columns=['level_0'],inplace=True)
# 方式2
# 重新赋值
df.index = range(0,df.shape[0])
异常值处理
# 利用快速统计大致猜测可能有异常值的字段
df.describe()
# 1.公式判断是否存在异常值
sd = (df['价格'] - df['价格'].mean()) / df['价格'].std() # 判断的标准
# 利用逻辑索引筛选数据
df[(sd > 3)|(sd < -3)]
# 利用绝对值
df[abs(sd) > 3] # abs就是绝对值的意思(移除正负号)
# 节省大于价格的数据
df[df['节省']>df['价格']]
"""
针对异常值处理
1. 占比不大可以直接删除
2. Z得分法
3. 分位数法
4. 距离法
5. 直接核定修改
"""
# 删除行数据
# 方式1 纵向合并 统一获取索引值
del_index = pd.concat([df[abs(sd) > 3],df[df['节省']>df['价格']]]).index
del_index
# 删除数据
df.drop(index=del_index,inplace=True)
# 再次重置行索引
df.index = range(0,df.shape[0])
# 显示后五条数据
df.tail()
缺失值处理
# 查看缺失数据
df.info()
df.isnull().sum()
# 查看出发地数据是否缺失
df[df['出发地'].isnull()]
'''有时候缺失的数据可能在其他单元格中可以找到答案'''
# 针对出发地缺失可以在路线中找到
df[df['出发地'].isnull()]['路线名']
"""
1.字符串切片(有缺陷)
出发地字符个数不确定
2.字符串切割(没有缺陷)
切割之后列表的第一个元素就是出发地
3.正则表达式(后面讲)
利用特殊符号的组合去字符串中筛选出符合条件的数据
"""
# 获取出发地缺失的行的路线名
str_data = df[df['出发地'].isnull()]['路线名'].values
str_data
# 获取出发地
new_l = []
for i in str_data:
new_l.append(i.split('-')[0])
new_l
# new_l = [i.split('-')[0] for i in df[df['出发地'].isnull()]['路线名'].values]
# 获取对应行的出发地
df.loc[df.出发地.isnull(),'出发地'] = [i.split('-')[0] for i in df.loc[df.出发地.isnull(),'路线名'].values]
# 查看目的地数据是否有缺失
df[df['目的地'].isnull()]
# 针对目的地的获取 无法使用切片和切割操作 只能使用正则
import re
re.findall('-(.*?)\d','深圳-香格里拉3天2晚 | 入住大连黄金山大酒店 + 南方航空/东海往返机票')
# 通过正则表达式获取目的地
reg_exp = '-(.*?)\d'
df.loc[df.目的地.isnull(),'目的地'] = [re.findall(reg_exp,i) for i in df.loc[df.目的地.isnull(),'路线名'].values]
作业
1.利用组合图将所学的统计学图形全部展示在一张图中(最少六个及以上)
2.完成今日数据清洗案例
3.预习明日内容:
https://www.cnblogs.com/Dominic-Ji/articles/11109067.html#_label10