数据分析基础

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 只是最小占位;数字大的时候会自动拓宽,不会截断)
      • 小数位数:保留几位小数
    • %%:使用转义字符输出一个%
  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知识~

🥰支持我,请 点赞 + 好评 + 收藏 三连,带来更多文章~

🥰有需要完整源码的同学可以留言、后台私信我

相关推荐
babe小鑫2 小时前
2026信管专业学习数据分析的价值
学习·数据挖掘·数据分析
2601_966871403 小时前
Python 爬虫 + 数据挖掘实战:数据抓取与深度挖掘分析全流程
爬虫·python·数据挖掘
数据智研5 小时前
【数据分享】陕西区域统计年鉴(2012-2018)
大数据·人工智能·信息可视化·数据分析
咖啡星人k6 小时前
数据分析效率翻倍:用 MonkeyCode 处理 CSV 数据全流程
数据挖掘·数据分析
躺柒9 小时前
读数据可视化08数据(上)
大数据·信息可视化·数据分析·数据可视化·视觉·可视化分析
YOLO数据集集合19 小时前
煤炭物料检测数据集:基于YOLO26的矿山传送带智能“哨兵”
人工智能·yolo·数据挖掘·煤炭·煤炭检测·矿山传送带·传送带异物
满怀冰雪1 天前
22-使用 PaddleClas 快速训练图像分类模型
人工智能·python·机器学习·分类·数据挖掘·paddlepaddle
杀生丸学AI1 天前
【世界模型】Lyra 2.0:可探索的生成式3D世界(NVIDIA)
人工智能·深度学习·3d·数据挖掘·transformer·世界模型·高斯泼溅
NPE~1 天前
[图挖掘]GCN模型训练——从0到1
人工智能·ai·数据挖掘·教程·风控·图挖掘