VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > python数据分析 >
  • 数据分析的完整流程:从“拿到数据”到“输出报告”

第1章 数据分析到底是什么?——从职场需求到核心流程
1.2 数据分析的完整流程:从“拿到数据”到“输出报告”
我刚做数据分析时,以为流程就是“拿数据→跑代码→画图”,结果第一次给老板交报告时,被骂得狗血淋头:“你这图里的日期是乱码,销量数据少了一半,最后结论跟没说一样!”后来才明白,数据分析是环环相扣的流水线,任何一步出错,结果全白费。这节我把自vb.net教程C#教程python教程SQL教程access 2010教程己踩过的坑揉进去,用真实电商用户分析案例,从“拿到乱码数据”到“输出老板能直接用的报告”,一步步拆解每个环节的代码、技巧和底层逻辑,让你少走3年弯路。
一、第一步:拿到数据——别上来就跑代码,先做“数据体检”
真实场景:运营给我发了一个Excel,说“这是近3个月的用户消费数据,帮我分析下”
我打开一看,日期列是“2024/01/01”“2024-02-01”两种格式,销量列有很多空值,还有几行是“测试数据”——要是直接用,后面分析全错。
代码演示:用Pandas做“数据体检”(逐行讲解)
python

	# 1. 导入Pandas库(先安装:pip install pandas openpyxl)
	import pandas as pd
	
	# 2. 加载Excel数据(注意:Excel要放在代码同目录,或者写全路径)
	# 坑点:Excel里有多个工作表,要指定sheet_name,不然默认读第一个
	df = pd.read_excel("用户消费数据.xlsx", sheet_name="Sheet1", engine="openpyxl")
	
	# 3. 数据体检第一步:看数据基本信息(行数、列数、数据类型、缺失值)
	print("===== 数据基本信息 =====")
	df.info()
	
	# 4. 数据体检第二步:看前5行数据(检查格式是否正确)
	print("
===== 前5行数据 =====")
	print(df.head())
	
	# 5. 数据体检第三步:看统计指标(数值列的均值、中位数、最大值等)
	print("
===== 统计指标 =====")
	print(df.describe())

代码逐行拆解(踩过的坑全告诉你)

pd.read_excel(..., engine="openpyxl"):

1.坑点:Python读取Excel需要依赖库,.xlsx格式用openpyxl,.xls格式用xlrd,没装的话会报错;
2.拓展知识:如果Excel有密码,用msoffcrypto-tool库解密,代码:import msoffcrypto; file = msoffcrypto.OfficeFile(open("加密数据.xlsx", "rb")); file.load_key(password="123456"); file.decrypt(open("解密数据.xlsx", "wb"))。

df.info():

1.重点看:Non-Null Count(非空值数量)和Dtype(数据类型),比如日期列如果是object类型,说明是文本格式,后面要转成日期类型;
2.企业意义:如果某列缺失值超过30%,要么找运营补数据,要么考虑删除该列,不然会影响分析结果。

df.describe():

1.重点看:max和min,比如销量列最大值是10000,明显是测试数据(正常用户最多买10件),后面要删除;
2.拓展知识:如果数值列的均值远大于中位数,说明数据有异常值(比如少数用户买了很多),要用中位数代替均值更合理。
输出示例(数据体检结果)
===== 数据基本信息 =====
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000 entries, 0 to 9999
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 用户ID 10000 non-null object
1 消费日期 9800 non-null object # 注意:是object类型,要转成日期
2 地区 10000 non-null object
3 商品类别 10000 non-null object
4 销量 9500 non-null float64 # 有500个缺失值
5 消费金额 10000 non-null float64
dtypes: float64(2), object(4)
memory usage: 468.9+ KB
二、第二步:数据清洗——80%的时间花在这里,决定分析结果的准确性
真实场景:体检发现的问题:日期是文本格式、销量有缺失值、有测试数据、地区列有“北京”“北京市”两种写法
代码演示:用Pandas做数据清洗(逐行讲解)
python

	# 1. 处理缺失值:销量列缺失的,用该商品类别的均值填充(别直接删除,会丢数据)
	# 坑点:不能用全局均值填充,不同商品类别的销量差异大,比如手机销量和配件销量
	df["销量"] = df.groupby("商品类别")["销量"].transform(lambda x: x.fillna(x.mean()))
	
	# 2. 处理重复值:删除重复的用户ID+消费日期(同一用户同一天的重复记录)
	df = df.drop_duplicates(subset=["用户ID", "消费日期"], keep="first")
	
	# 3. 处理异常值:删除销量>100的测试数据(正常用户最多买10件)
	df = df[df["销量"] <= 100]
	
	# 4. 统一文本格式:地区列的“北京市”改成“北京”,“上海市”改成“上海”
	df["地区"] = df["地区"].replace({"北京市": "北京", "上海市": "上海"})
	
	# 5. 转换日期格式:把文本类型的日期转成Pandas的日期类型
	df["消费日期"] = pd.to_datetime(df["消费日期"], format="%Y/%m/%d", errors="coerce")
	# errors="coerce":把无法转换的日期转成NaT(缺失的日期),后面再处理
	
	# 6. 重置索引:删除行后索引会乱,重置成连续的
	df = df.reset_index(drop=True)
	
	# 7. 保存清洗后的数据(方便后面分析用)
	df.to_excel("清洗后用户消费数据.xlsx", index=False, engine="openpyxl")
	print("数据清洗完成,保存为:清洗后用户消费数据.xlsx")

代码逐行拆解(企业级技巧)

df.groupby("商品类别")["销量"].transform(lambda x: x.fillna(x.mean())):

1.底层逻辑:按商品类别分组,每个组用自己的均值填充缺失值,比如手机类的缺失值用手机的平均销量填充,配件类用配件的平均销量填充;
2.拓展知识:如果是分类变量缺失(比如地区列缺失),用众数填充,代码:df["地区"] = df["地区"].fillna(df["地区"].mode()[0])。

df.drop_duplicates(subset=["用户ID", "消费日期"], keep="first"):
1.企业意义:同一用户同一天的重复记录是运营导入数据时的错误,删除后避免重复计算销量;
2.拓展知识:如果要保留最后一条重复记录,用keep="last",如果要删除所有重复记录,用keep=False。

pd.to_datetime(df["消费日期"], format="%Y/%m/%d", errors="coerce"):

1.坑点:如果日期格式不统一(比如有“2024-01-01”和“2024/01/01”),去掉format参数,Pandas会自动识别,代码:pd.to_datetime(df["消费日期"], errors="coerce");
2.拓展知识:转换后可以提取年、月、日,比如df["消费月份"] = df["消费日期"].dt.month,方便按月份分析销量。
拓展知识:数据清洗的“三不原则”
不随便删除数据:除非是明显的测试数据,不然尽量用填充的方法;
不修改原始数据:永远保存原始数据,清洗后的数据另存为新文件,方便回溯;
不手动修改数据:用代码批量处理,避免手动修改的错误,而且代码可复用。
三、第三步:探索性分析——用数据找规律,给运营提假设
真实场景:清洗完数据后,老板问“不同地区的用户消费习惯有什么差异?”“哪个商品类别最受欢迎?”
代码演示:用Pandas+Matplotlib做探索性分析(逐行讲解)
python

	# 1. 导入画图库(先安装:pip install matplotlib)
	import matplotlib.pyplot as plt
	# 解决中文乱码问题(必加,不然图表里的中文是方框)
	plt.rcParams["font.sans-serif"] = ["SimHei"]
	plt.rcParams["axes.unicode_minus"] = False
	
	# 2. 分析1:不同地区的消费金额对比(柱状图)
	地区消费 = df.groupby("地区")["消费金额"].sum().sort_values(ascending=False)
	plt.figure(figsize=(10, 6))
	地区消费.plot(kind="bar", color="#1f77b4")
	plt.title("不同地区的消费金额对比")
	plt.xlabel("地区")
	plt.ylabel("总消费金额(元)")
	plt.xticks(rotation=0) # 地区名称横向显示,不旋转
	plt.show()
	
	# 3. 分析2:不同商品类别的销量占比(饼图)
	类别销量 = df.groupby("商品类别")["销量"].sum()
	plt.figure(figsize=(8, 8))
	类别销量.plot(kind="pie", autopct="%.1f%%", labels=类别销量.index)
	plt.title("不同商品类别的销量占比")
	plt.ylabel("") # 去掉默认的y轴标签
	plt.show()
	
	# 4. 分析3:消费金额与销量的相关性(散点图)
	plt.figure(figsize=(10, 6))
	plt.scatter(df["销量"], df["消费金额"], alpha=0.5, color="#ff7f0e")
	plt.title("消费金额与销量的相关性")
	plt.xlabel("销量")
	plt.ylabel("消费金额(元)")
	plt.show()
	
	# 5. 分析4:每月消费趋势(折线图)
	df["消费月份"] = df["消费日期"].dt.to_period("M") # 提取月份,格式是2024-01
	月度消费 = df.groupby("消费月份")["消费金额"].sum()
	plt.figure(figsize=(10, 6))
	月度消费.plot(kind="line", marker="o", color="#2ca02c")
	plt.title("2024年每月消费趋势")
	plt.xlabel("月份")
	plt.ylabel("总消费金额(元)")
	plt.grid(True) # 显示网格线
	plt.show()

代码逐行拆解(可视化技巧)

  1. plt.rcParams["font.sans-serif"] = ["SimHei"]:
  2. 必加代码:Matplotlib默认不支持中文,用SimHei(黑体)显示中文,不然图表里的中文是方框;
    拓展知识:如果是Mac系统,用"PingFang SC",Linux系统用"Noto Sans CJK SC"。
  3. df.groupby("地区")["消费金额"].sum().sort_values(ascending=False):
  4. 底层逻辑:按地区分组,计算每个地区的总消费金额,然后按降序排序,方便看哪个地区消费最高;
    企业意义:如果华东地区消费最高,建议运营在华东地区加大推广力度,比如投放广告、做促销活动。
  5. 类别销量.plot(kind="pie", autopct="%.1f%%"):
  6. autopct="%.1f%%":显示百分比,保留1位小数;
    拓展知识:如果类别太多,用labels=None,然后用plt.legend(类别销量.index)把标签放在图表外面,避免重叠。
  7. plt.scatter(df["销量"], df["消费金额"], alpha=0.5):
  8. alpha=0.5:设置点的透明度,避免点太多重叠看不清;
    企业意义:如果散点图呈正相关,说明销量越高,消费金额越高,运营可以推出“买得多省得多”的活动,提升用户客单价。
    拓展知识:探索性分析的核心是“提假设”,不是“下结论”
    比如从散点图看到销量和消费金额正相关,不能直接说“销量越高,消费金额越高”,要提假设“用户买的商品越多,消费金额越高”,然后用统计方法验证(比如计算相关系数);
    企业意义:探索性分析的结果是给运营提方向,比如“假设华东地区用户更喜欢电子产品,建议做针对性推广”,然后用A/B测试验证假设是否正确。
    四、第四步:建模分析——用数据预测未来,给业务做决策
    真实场景:老板问“下个月的消费金额能达到多少?”“哪些用户是高价值用户?”
    代码演示1:用线性回归预测月度消费金额(逐行讲解)
    python
	# 1. 导入Scikit-learn库(先安装:pip install scikit-learn)
	from sklearn.linear_model import LinearRegression
	from sklearn.model_selection import train_test_split
	from sklearn.metrics import r2_score, mean_absolute_error
	
	# 2. 准备数据:把月份转成数字(2024-01=1,2024-02=2...)
	月度消费 = df.groupby("消费月份")["消费金额"].sum().reset_index()
	月度消费["月份数字"] = 月度消费["消费月份"].dt.month
	
	# 3. 划分训练集和测试集(80%训练,20%测试)
	X = 月度消费[["月份数字"]]
	y = 月度消费["消费金额"]
	X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
	
	# 4. 训练线性回归模型
	model = LinearRegression()
	model.fit(X_train, y_train)
	
	# 5. 预测测试集数据,评估模型
	y_pred = model.predict(X_test)
	r2 = r2_score(y_test, y_pred)
	mae = mean_absolute_error(y_test, y_pred)
	print(f"模型R²得分:{r2:.2f}(越接近1越好)")
	print(f"模型平均绝对误差:{mae:.2f}元(越小越好)")
	
	# 6. 预测下个月的消费金额(比如2024-07=7)
	下个月 = pd.DataFrame({"月份数字": [7]})
	下个月预测金额 = model.predict(下个月)
	print(f"下个月预测消费金额:{下个月预测金额[0]:.2f}元")

代码逐行拆解(建模技巧)

  1. train_test_split(X, y, test_size=0.2, random_state=42):
  2. test_size=0.2:用20%的数据测试模型,80%的数据训练模型;
    random_state=42:固定随机种子,保证每次划分的训练集和测试集一样,结果可复现;
    拓展知识:如果是时间序列数据,不能随机划分,要按时间顺序划分,比如前8个月训练,后2个月测试,代码:train_size = int(len(月度消费)*0.8); X_train, X_test = X[:train_size], X[train_size:]; y_train, y_test = y[:train_size], y[train_size:]。
  3. model.fit(X_train, y_train):
  4. 训练模型,底层是用最小二乘法拟合线性方程:消费金额 = a*月份数字 + b;
    拓展知识:可以查看模型的系数和截距,代码:print(f"系数a:{model.coef_[0]:.2f}"); print(f"截距b:{model.intercept_:.2f}"),系数a是每月消费金额的增长幅度。
  5. r2_score(y_test, y_pred):
  6. R²得分:衡量模型的拟合程度,越接近1,模型越好;
    拓展知识:如果R²低于0.7,说明模型拟合不好,要换模型,比如用ARIMA、Prophet等时间序列模型。
    代码演示2:用K-Means聚类给用户分群(高价值/中价值/低价值)
    python
	from sklearn.cluster import KMeans
	from sklearn.preprocessing import StandardScaler
	
	# 1. 准备用户特征:总消费金额、总销量、消费次数
	用户特征 = df.groupby("用户ID").agg(
	总消费金额=("消费金额", "sum"),
	总销量=("销量", "sum"),
	消费次数=("消费日期", "nunique")
	).reset_index()
	
	# 2. 特征缩放:K-Means对数据范围敏感,要把特征缩放到同一范围
	scaler = StandardScaler()
	特征缩放后 = scaler.fit_transform(用户特征[["总消费金额", "总销量", "消费次数"]])
	
	# 3. 训练K-Means模型,分成3类(高/中/低价值)
	kmeans = KMeans(n_clusters=3, random_state=42)
	用户特征["用户群"] = kmeans.fit_predict(特征缩放后)
	
	# 4. 分析每个用户群的特征
	用户群分析 = 用户特征.groupby("用户群").agg(
	平均总消费金额=("总消费金额", "mean"),
	平均总销量=("总销量", "mean"),
	平均消费次数=("消费次数", "mean"),
	用户数量=("用户ID", "count")
	).reset_index()
	print("用户群分析结果:")
	print(用户群分析)

代码逐行拆解(聚类技巧)

  1. df.groupby("用户ID").agg(...):
  2. agg:聚合函数,同时计算多个指标,比如总消费金额、总销量、消费次数;
    拓展知识:nunique是统计不重复的次数,比如消费次数是用户消费的不同天数。
  3. StandardScaler():
  4. 特征缩放:把特征转成均值为0,标准差为1的标准正态分布,避免某特征数值太大影响聚类结果(比如总消费金额是10000,消费次数是10,总消费金额的影响会更大);
    拓展知识:如果是分类特征,用OneHotEncoder编码,比如地区列转成0/1的二进制特征。
  5. kmeans.fit_predict(特征缩放后):
    给每个用户分配一个用户群标签(0/1/2),然后分析每个群的特征,比如用户群0的平均总消费金额最高,就是高价值用户;
    企业意义:对高价值用户,运营可以推出专属会员服务、生日福利;对低价值用户,推出首单优惠、邀请好友得红包的活动,提升用户活跃度。
    五、第五步:输出报告——把数据变成老板能看懂的“行动指南”
    真实场景:老板要的不是一堆代码和图表,是“我该做什么?能赚多少钱?”
    报告结构(结论先行,数据支撑):
    1.核心结论:用1-3句话总结,比如“下个月消费金额预计达到50万元,华东地区是核心市场,高价值用户占10%,建议针对性推广”;
    2.数据支撑:用图表展示关键数据,比如月度消费趋势图、地区消费对比图、用户群分析表;
    3.行动建议:给业务部门具体的建议,比如“在华东地区投放10万元广告,预计提升销量20%;给高价值用户发送专属优惠券,预计提升客单价15%”;
    4.风险提示:比如“如果下个月有大型促销活动,预测金额可能会偏高;如果出现疫情,预测金额可能会偏低”。
    代码演示:用python-docx生成Word报告(逐行讲解)
    python
	# 1. 导入python-docx库(先安装:pip install python-docx)
	from docx import Document
	from docx.shared import Pt, Inches
	from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
	
	# 2. 创建Word文档
	doc = Document()
	
	# 3. 添加标题
	title = doc.add_heading("用户消费数据分析报告", level=1)
	title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 居中对齐
	
	# 4. 添加核心结论
	doc.add_heading("一、核心结论", level=2)
	p = doc.add_paragraph()
	p.add_run("1. 月度消费趋势:").bold = True
	p.add_run("2024年1-6月消费金额呈逐月增长趋势,下个月预计达到50万元,同比增长15%。")
	p = doc.add_paragraph()
	p.add_run("2. 地区分布:").bold = True
	p.add_run("华东地区消费金额占比35%,是核心市场,其次是华南地区(25%)。")
	p = doc.add_paragraph()
	p.add_run("3. 用户分群:").bold = True
	p.add_run("高价值用户占10%,贡献了40%的消费金额,建议重点维护。")
	
	# 5. 添加数据支撑(插入图表,注意:要先把图表保存为图片)
	doc.add_heading("二、数据支撑", level=2)
	doc.add_paragraph("1. 月度消费趋势图:")
	doc.add_picture("月度消费趋势.png", width=Inches(6)) # 插入图片,设置宽度为6英寸
	doc.add_paragraph("2. 地区消费对比图:")
	doc.add_picture("地区消费对比.png", width=Inches(6))
	
	# 6. 添加行动建议
	doc.add_heading("三、行动建议", level=2)
	p = doc.add_paragraph()
	p.add_run("1. 华东地区推广:").bold = True
	p.add_run("投放10万元广告,推出“满1000减200”的促销活动,预计提升销量20%。")
	p = doc.add_paragraph()
	p.add_run("2. 高价值用户维护:").bold = True
	p.add_run("发送专属优惠券,邀请加入VIP群,提供一对一客服,预计提升客单价15%。")
	
	# 7. 设置文档格式
	for paragraph in doc.paragraphs:
	for run in paragraph.runs:
	run.font.size = Pt(12) # 设置字体大小为12号
	run.font.name = "微软雅黑" # 设置字体为微软雅黑
	
	# 8. 保存文档
	doc.save("用户消费数据分析报告.docx")
	print("报告生成完成,保存为:用户消费数据分析报告.docx")

代码逐行拆解(报告技巧)

doc.add_heading("标题", level=1):

olevel=1是一级标题,level=2是二级标题,以此类推,Word会自动应用标题样式;
o拓展知识:可以设置标题的字体和颜色,代码:title_run = title.runs[0]; title_run.font.color.rgb = RGBColor(0, 0, 255); title_run.font.size = Pt(16)。

doc.add_picture("月度消费趋势.png", width=Inches(6)):

o先把Matplotlib画的图表保存为图片,代码:plt.savefig("月度消费趋势.png", dpi=300, bbox_inches="tight");
odpi=300:设置图片分辨率,避免在Word里模糊;
obbox_inches="tight":去掉图片周围的空白。

run.font.name = "微软雅黑":

设置字体为微软雅黑,比默认的宋体更美观;
拓展知识:如果是Mac系统,用"PingFang SC",Linux系统用"Noto Sans CJK SC"。
拓展知识:不同人群的报告写法
给老板看的报告:简洁,重点放核心结论和行动建议,图表要大,文字要少;
给运营看的报告:详细,放具体的用户群特征、地区数据,还有可直接用的运营策略;
给技术团队看的报告:要附代码和数据来源,方便技术团队复现分析结果,做数据埋点。
六、总结:数据分析的本质是“用数据解决业务问题”
整个流程是:拿到数据→数据体检→数据清洗→探索性分析→建模分析→输出报告,每个环节都不能少:
数据体检:避免用错数据;
数据清洗:保证数据准确;
探索性分析:找业务方向;
建模分析:预测未来,给决策做支撑;
输出报告:把数据变成行动指南。
我现在做项目时,会把这个流程做成一个模板,每次做分析都按这个步骤来,既高效又不会出错。记住:企业要的不是你会多少代码,而是你能用数据帮企业解决问题,比如降本、增效、提收入。下一节,我们就开始学习Python的核心语法,为后面的数据分析打下基础。

转载请注明出处:https://www.xin3721.com/pythonNew/python49605.html


相关教程