1.数据分析定义
数据分析: 从一堆看似杂乱的数据中,通过数据清洗,分析,可视化等手段,找出有价值的信息和结论,从而帮助我们解决实际的问题
数据分析流程如下:

- 在数据收集,数据清洗处理,数据分析阶段可通过 pandas 库来执行操作。
- 在数据可视化解阶段可通过Matlotlib 库来实现数据可视化展示操作
2.环境准备
Jupyter Notebook: 是一个基于 Web 网页的,交互式的Python 编辑器,一行一运行,让你可以把代码,运行结果,图表和笔记全部都放在一个文件里(在数据分析,机器学习,教学和科研等领域的数据实验室)
注意: Jupyter Notebook 里面,一个单元格,只会自动输出最后一行代码的结果。
3.Pandas基础
Pandas: 是一个功能强大的结构化数据分析的工具集,底层是基于 Numpy 构建的,无论是在数据分析领域,还是大数据开发场景中都有显著的优势
核心:DataFrame (类似表格),Series(类似表格中的一列)

3.1 Pandas初体验
3.1.1 入门程序
import pandas as pd
#构造DataFrame ------ 创建数据集(学员成绩信息)
df = pd.DataFrame([
{'姓名': '张三', '数学': 81, '英语': 70, '语文': 90},
{'姓名': '李四', '数学': 70, '英语': 80, '语文': 85},
{'姓名': '王五', '数学': 90, '英语': 95, '语文': 88},
{'姓名': '赵六', '数学': 60, '英语': 70, '语文': 65},
{'姓名': '孙七', '数学': 85, '英语': 88, '语文': 92},
{'姓名': '周八', '数学': 75, '英语': 85, '语文': 78},
{'姓名': '吴九', '数学': 80, '英语': 80, '语文': 85},
{'姓名': '郑十', '数学': 70, '英语': 75, '语文': 78}
])
df
df['语文']
#统计计算
f"语文成绩的最高分是:{df['语文'].max()}, 最低分是:{df['语文'].min()}, 平均分是:{df['语文'].mean():.2f}"
结果如下:


小结:

3.1.2 DataFrame
3.1.2.1 DataFrame构造方式
构建 DataFrame 的方式有很多,主要方式如下:

构建的 DataFrame 如下所示:

3.1.2.2 DataFrame常见属性
DataFrame 常见属性有很多,如下所示:

示例代码如下:
#Dataframe 常见属性 - index,columns,values,size,dtypes,shape
print(df4.index.tolist()) #index:索引
print(df4.columns.tolist()) #columns:列名
print(df4.values.tolist()) #values:值
print(df4.size) #size:元素个数
print(df4.dtypes) #dtypes:每列元素的数据类型
print(df4.shape) #shape:维度(行,列)
结果展示如下:

3.1.3 Series
3.1.3.1 Series构造方式
构建 Series 的方式有很多,主要方式如下:

构建的 Series 如下所示:

3.1.3.2 Series常见属性
Series 常见属性有很多,如下所示:

示例代码及其输出结果如下:

DataFrame,Series中的常见属性的作用:
3.2 数据读取与写入
基于 Pandas 中提供的 API ,可以很方便的实现各类数据文件(csv,Excel,数据库,网络数据等)的读取和写入
- read_***():读取文件内容并返回对象
- **to_***():**将对象内容存储到文件中

示例代码如下:

小结:
3.3 数据查看,选择,过滤

3.3.1 数据查看
相关代码如下所示:
import pandas as pd
#数据查看 -- head, tail, describe, info, shape, columns
df1 = pd.read_csv('Data/sales.csv',usecols = ['订单号','产品类别','产品名称','销售数量','单价'])
display(df1.head(10)) #查看前10行数据
display(df1.tail(10)) #查看后10行数据
display(df1.describe()) #显示数值列的统计描述
display(df1.info()) #查看数据信息(列名,非空计数,数据类型)
display(df1.shape) #显示数据维度(行,列)
display(df1.columns) #显示列名
相应输出如下:



describe():只对数值列进行统计描述
- count:该列有效非空数据个数
- mean:该列数据平均值
- std:该列数据标准差
- min:该列数据中的最小值
- max:该列数据中的最大值
- 50%:50%的数据小于该值
info(): 查看数据表整体结构**:行数、列数、每列非空数量、数据类型、内存占用**
- <class 'pandas.core.frame.DataFrame'>:表示这是 pandas 的 DataFrame 表格对象
- RangeIndex:entries = 161 行数据;索引从 0 开始,到 160 结束
- Data columns (total 5 columns):一共5列(不带索引)
| 序号 | 列名 | Non‑Null Count | Dtype 含义 |
| 0 | 订单号 | 161 non‑null | int64:整数类型,161 条全部不为空,无缺失值 |
| 1 | 产品类别 | 161 non‑null | object:字符串 / 文本类型,161 条全部不为空,无缺失值 |
| 2 | 产品名称 | 161 non‑null | object:字符串,161 条全部不为空,无缺失值 |
| 3 | 销售数量 | 161 non‑null | int64:整数,161 条全部不为空,无缺失值 |
4 单价 161 non‑null int64:整数,161 条全部不为空,无缺失值
- memory usage
:整个表格占用内存大小- None:info 函数没有返回值,打印输出后返回 None
3.3.2 数据选择
相关代码如下:
#数据选择 -- loc, iloc, at,iat
df2 = pd.read_csv('Data/sales.csv',usecols = ['订单号','产品类别','产品名称','销售数量','单价'])
#1.选择列
#1.1选择单列
display(df2['产品名称'])
#1.2选择多列
display(df2[['产品名称','单价']])
#2.选择行 --iloc, loc
#2.1 iloc -----> 基于行号选择行(不包含结束位置),语法:df.iloc[start:stop:step]
display(df2.iloc[0:5:1])
#2.2 loc ------> 基于行索引选择行(包含结束位置),语法:df.loc[start:end:step]
display(df2.loc[0:5:1])
相应输出如下:


3.3.3 数据过滤
相关代码如下:
df3 = pd.read_csv('Data/sales2.csv')
#数据过滤
#1.获取销售数量 >= 10 的订单数据
display(df3[df3['销售数量']>=5])
#2.获取产品类别为 食品或图书 的订单数据
display(df3[df3['产品类别'].isin(['食品','图书'])])
#3.获取单价在100-200之间的订单数据 ----> 范围:between ---->默认包含边界
display(df3[df3['单价'].between(100,200)])
#4.获取 销售数量 >= 8,并且 单价 >= 100 的订单数据
display(df3[(df3['销售数量']>=8) & (df3['单价']>=100)])
#5.获取产品类别为 服装/食品,支付方式为 支付宝/微信支付 的订单数据
display(df3[(df3['产品类别'].isin(['服装','食品'])) & (df3['支付方式'].isin(['支付宝','微信支付']))])
相应输出结果如下:




3.3.4 小结

3.4 数据清洗
数据清洗: 是指发现并纠正数据中可识别的错误的过程,包括处理缺失值,重复值,异常值,统一数据格式,保证数据的一致性

3.4.1 缺失值处理
相关操作代码如下:
import pandas as pd
pd.set_option('display.min_rows',20) #设置显示行数
#1.读取数据
df = pd.read_csv('Data/sales2.csv')
#2.数据清洗
#2.1 缺失值处理
df.isnull() #查看缺失值
#2.1.1 删除缺失值: df.dropna()返回DataFrame
df1 = df.dropna()#删除缺失值所在行
df2 = df.dropna(axis = 1) #删除缺失值所在列
#2.1.2 填充缺失值: df.fillna()返回DataFrame
df3 = df.fillna('--') #填充缺失值
df4 = df.ffill() #填充缺失值,填充内容参照上一行同列数据
df5 = df.bfill() #填充缺失值,填充内容参照下一行同列数据
3.4.2 重复值处理
相关操作代码如下:
#2.2 重复值处理
#2.2.1 查看重复值
df.duplicated() #查看重复值(重复标准:样本所有列的数据重复)
df.duplicated(subset = ['订单号']) #查看重复值(重复标准:样本指定列的数据重复)
#2.2.2 删除重复值(行删除)
df.drop_duplicates(subset = ['订单号'],keep='first') #保留原始值,删除后续重复值(重复标准:样本指定列的数据重复)
df.drop_duplicates(subset = ['订单号'],keep='last') #保留最后一个值,删除前面重复值(重复标准:样本指定列的数据重复)
3.4.3 异常值处理
相关代码操作如下:
#2.3 异常值处理
#2.3.1 查看异常值(常规查看操作)
df[df['单价'] < 0]
#2.3.2 删除异常值
df.drop(df[df['单价']<0].index) #删除异常值(删除满足条件的行)
#2.3.3 修复异常值
df['单价'] = df['单价'].abs() #绝对值
3.4.4 数据格式处理
相关代码操作如下:
#数据格式处理
df['订单日期'] = df['订单日期'].str.replace('/','-')
注意: df '订单日期' . replace('***','****')仅仅支持整单元格的整体替换,因此需要先将单元格转换为字符串内容再进行替换
3.4.5 小结

3.5 数据排序与分组
3.5.1 数据排序
**数据排序:**在进行数据排序时,有两种排序方法,分别是:升序和降序。而基于 Pandas 进行数据排序时,是可以按照多个列进行排序的

**多列排序:**进行多列排序时,会先按照第一列进行排序,第一列的值相同时,才会按照第二列进行排序
相关操作代码如下:
import pandas as pd
#1.读取数据
df = pd.read_csv('Data/sales2.csv',nrows=10) #只读取前10行
#2.排序
#2.1 根据销售数量降序排序
df.sort_values('销售数量',ascending=False)#ascending默认为True,即升序
#2.2 根据单价升序排序
df.sort_values('单价',ascending=True)
#2.3 根据单价升序排序,如果单价一样,再根据销售数量降序排序
df.sort_values(['单价','销售数量'],ascending = [True,False])
小结:

3.5.2 数据分组
**数据分组:**把数据按照某个特征分成不同的组,然后对每个组分别进行统计计算

相关代码操作如下:
#1.数据分组
#1.1 根据产品类别分组,统计各个类别的订单数量-count 注意:缺失值不参与统计
df.groupby('产品类别')['订单号'].count()
#1.2 根据产品类别分组,统计各个类别的销售数量之和-sum
df.groupby('产品类别')['销售数量'].sum()
#1.3 根据产品类别分组,统计各个类别的销售金额之和-sum
df['销售金额'] = df['销售数量'] * df['单价']
df.groupby('产品类别')['销售金额'].sum()
#1.4 根据产品类别分组,统计各个类别的最低商品单价-min
df.groupby('产品类别')['单价'].min()
#1.5 根据产品类别分组,统计各个类别的最高商品单价-max
df.groupby('产品类别')['单价'].max()
#1.6 根据产品类别分组,统计各个类别的平均商品单价-mean
df.groupby('产品类别')['单价'].mean()
#1.7 根据产品类别分组,统计各个类别的平均商品单价,最高商品单价,最低商品单价-agg
df.groupby('产品类别')['单价'].agg(['mean','max','min'])
#1.8 根据产品类别分组,统计各个类别的商品的销售数量之和,销售金额之和,平均单价-agg+字典
df.groupby('产品类别').agg({'销售数量':'sum','销售金额':'sum','单价':'mean'})
小结:

4.Matplotlib基础
**Matplotlib:**是一个功能强大的数据可视化开源 Python 库,也是 Python 中使用的最多的图形绘图库,可以创建静态,动态,交互式的图表
4.1 Matplotlib 入门程序

注意:X 轴的数据数量要与 Y 轴中的数据数量要一致
4.2 图表信息详解

其相关代码操作如下:
import matplotlib.pyplot as plt
import random
#展示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #设置中文字体为黑体
#数据准备 X,Y
x = [i for i in range(1,25)] #X轴表示一天24小时
y_bj = [random.randint(10,15) for i in x]
y_xa = [random.randint(13,18) for i in x]
plt.figure(figsize = (10,5)) #规定画布大小 (宽,高)
plt.plot(x,y_bj,label = '北京') #绘制折线图 -> 如果没有画布,会自动创建一个画布
plt.plot(x,y_xa,label = '西安') #绘制折线图 -> 如果没有画布,会自动创建一个画布
#设置折线图的详细信息
plt.title('北京24小时温度变化折线图',fontsize = 16) #设置折线图标题,字号大小为16
plt.xlabel('时间',fontsize = 14) #X轴标签,字号14
plt.ylabel('温度',fontsize = 14) #Y轴标签,字号14
plt.xticks(x,fontsize=14) #设置X轴刻度,字号14
y_ticks = [i for i in range(0,30,2)]
plt.yticks(y_ticks,fontsize=14) #设置Y轴刻度,字号14
plt.grid(linestyle = "--",alpha = 0.3) #展示网格线
plt.legend(fontsize=14,loc = 'upper right') #设置图例,字号14,位置在右上角
#或者:
# plt.plot(x,y_bj)
# plt.plot(x,y_xa)
# plt.legend(['北京','西安'],fontsize=14,loc = 'upper left') #设置图例,字号14,位置在左上角
#折线图展示
plt.show()
最终输出结果如下:

4.3 核心图表实战
创建子图: 为了能同时展示多个图表,便于图表之间数据的直观对比和分析,更高效,更专业地组织和呈现复杂的可视化信息,通常会在一个画布上创建多个子图

**nrows:**行数,表示将画布分为几行
**ncols:**列数,表示将画布分为几列
**figsize:**画布大小,元组(宽,高)
**dpi:**每英寸所包含的像素点
figure,axes = plt.subplots():
- figure(也常简写为 fig):画布对象 Figure,代表整张图的底层画布容器
- axes(也常简写为 ax):子图对象 Axes,代表绘图的坐标轴区域,真正用来画曲线、散点、设置刻度的对象
4.3.1 柱状图
柱状图绘制代码如下:
from matplotlib.axes import Axes
import matplotlib.pyplot as plt
#展示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] #设置中文字体为黑体
#绘制折线图
#figure:画布对象; axes:子图数组(里面存放的是 Axes 类型的对象)
figure,axes = plt.subplots(nrows=1, ncols=2, figsize=(20,6), dpi=100)
#子图1:柱状图(世界石油储备)
axes1: Axes = axes[0] #接收子图1对象
countries = ['美国', '中国', '俄罗斯', '伊拉克', '沙特阿拉伯', '委内瑞拉', '伊朗'] #国家列表,X轴
oil_reserves = [198, 161, 150, 145, 120, 110, 90] #石油储量,Y轴
axes1.set_title('世界石油储备', fontsize=16) #设置标题
axes1.bar(countries, oil_reserves, color='blue', width=0.5) #设置柱状图,颜色为蓝色,柱子宽度0.5
axes1.set_xlabel('国家') #设置X轴标签
axes1.set_ylabel('石油储量(百万吨)') #设置Y轴标签
axes1.grid(linestyle='--', alpha=0.5) #设置网格线
绘制结果如下:

4.3.2 饼状图
饼状图绘制代码如下:
#子图2:饼状图(世界人口) --> 擅长比例分析
axes2: Axes = axes[1] #接收子图2对象
countries2 = ['美国', '中国', '俄罗斯', '伊拉克', '沙特阿拉伯', '委内瑞拉', '伊朗','其他国家'] #国家列表,标签
populations = [331, 1439, 146, 110, 33, 21, 76, 1307] #人口数量
axes2.set_title('世界人口比例', fontsize=16) #设置标题
axes2.pie(populations, labels=countries2, autopct='%1.1f%%')
axes2.legend(loc='lower center', fontsize=14, ncol=4, bbox_to_anchor=(0.5, -0.1)) #设置图例,位置在下中心,字号14,图例分为4列,锚点在(0.5 控制水平方位, -0.1 控制垂直方位)
1. axes2.pie(populations, labels=countries2, autopct='%1.1f%%'):
- populations:饼图各部分数值(列表 / 数组)代表每一块的大小。数值不需要归一化,matplotlib 会自动计算占比。
- labels=countries2:每一块对应的标签,字符串列表,和 populations 一 一对应。
- autopct='%1.1f%%' :在饼块上显示百分比文本
- 1.1:总宽度 . 小数位数 (
- 总宽度:这里写 1 只是最小占位;数字大的时候会自动拓宽,不会截断)
- 小数位数:保留几位小数
- %%:使用转义字符输出一个%
- axes2.legend(loc='lower center', fontsize=14, ncol=4, bbox_to_anchor=(0.5, -0.1)):
- **loc:**图例位置
- **ncol:**图例绘制列数
- bbox_to_anchor:图例锚点(控制水平方位,控制垂直方位)
绘制结果如下:

4.3.3 小结
图表保存:
plt.savefig('Data/01.png')
小结:

5.🎇更多干货
🥰关注我 学习更多AI知识~
🥰支持我,请 点赞 + 好评 + 收藏 三连,带来更多文章~
🥰有需要完整源码的同学可以留言、后台私信我
