十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

30天打通数据清洗与可视化:可执行的数据分析学习路线

30天打通数据清洗与可视化:可执行的数据分析学习路线 很多人花了大把时间学数据分析最后却发现一个尴尬的问题工具书翻了不少视频课程也收藏了一堆但拿到一份真实的、充满脏乱差的数据还是不知道第一步该做什么。pandas能导入plotly能画图可一旦面对几千行带缺失值、重复值、口径混乱的Excel或CSV脑子就一片空白。这个问题的根源并不在于你不够努力而是大多数人把“学数据分析”理解成了“学某个工具”。工具当然重要但数据分析的完整链路是数据获取、数据清洗、数据分析、数据挖掘、数据可视化直到最终得出结论的连续动作。只学其中一段永远无法真正上手。所以你在CSDN上刷到的“30天学会数据分析、挖掘、清洗、可视化”这类标题不一定全是噱头。真正值得做的不是用30天去“精通”一个领域而是用30天把整条链路跑通建立一种看到数据就知道“先做什么、再做什么、最后怎么交付”的工程直觉。这比死记几个API重要得多。在这篇文章里我会用一套可执行的学习路线帮你拆解数据分析、数据挖掘、数据清洗、数据可视化之间的关系配上一份从环境搭建到完整项目的实践方案。读完你可以直接照着执行也可以把它当成一个索引缺哪块补哪块。先说一个明确判断数据分析入门的关键不是追求模型多高级、图表多炫酷而是保证“每一步都经得起业务和逻辑的追问”。1. 为什么很多人学完数据分析和数据挖掘还是做不了项目进入正题前先聊聊我见到最多的学习状态。很多人一上来就直奔Python语法、NumPy、pandas、matplotlib甚至直接跳到scikit-learn去调模型。学的时候感觉都懂了等真到项目阶段发现困难完全不在代码而在判断。举个例子。一份订单表导进来里面有重复行、有负数的金额、有缺失的区域字段、有“已完成/成功/SUCCESS”三种写法混杂的状态值。初学者看到这些数据第一反应往往是“用drop_duplicates删掉重复用dropna删掉缺失然后画个图”。但商业数据里有些“缺失”是业务上正常的“无值”有些“重复”来自不同系统的关联关系盲目删除会导致分析结论失真。这才是真正需要训练的。数据清洗绝不是一个“把空值删掉”的技术动作而是你对业务口径、数据产生过程和后续分析目标理解之后做出的决策。数据挖掘也一样不是跑一个随机森林就完事而是要回答“特征的业务含义是什么”“预测结果如果错了会带来什么影响”。所以30天路线重点不是教你背下所有函数而是刻意训练两种能力面对脏数据时的“诊断能力”先看类型、分布、缺失、重复、异常再决定处理策略。面对业务问题时的“拆解能力”把“为什么销售额下降了”拆成按时间、渠道、区域、用户分层去分析。缺少这两种能力学再多的模型和可视化技巧也会在真实项目面前露怯。2. 数据清洗、数据分析、数据挖掘、可视化到底各解决什么问题很多初学者会把数据分析当成一个大筐什么都往里装。为了不走弯路我建议先把这四个概念在一条业务链路上重新定位。环节核心问题常见的输入与输出主要方法 / 工具数据清洗与预处理这份数据现在能用来分析吗输入原始表输出干净、口径统一的表pandas、SQL、数据校验规则数据分析过去发生了什么各部分差异有多大输入干净表输出指标、对比结论统计聚合、分组对比、相关性分析数据挖掘有没有隐藏规律下一步可能会发生什么输入带有业务含义的特征表输出规则、模型、预测结果RFM分层、回归、聚类、树模型数据可视化结论如何被业务方一眼看懂输入分析结果输出图表、报告、大屏matplotlib、seaborn、plotly有些人会问数据可视化和数据清洗是不是不算数据分析这取决于你在什么岗位。实际工作中一名数据分析师可能需要自己取数、自己清洗、自己分析、自己出图甚至在必要的时候自己搭自动化报表。这四个环节不是彼此独立的岗位而是一条流水线。理解这条流水线对后面的学习节奏很重要。你先不必成为Excel函数专家也不必先去啃机器学习公式更不要盯着一堆可视化大屏模板发呆。最合理的方式是先用一个小型数据集把全流程走通。3. 30天学习路线总览按“输出”倒推每天该做什么网上常见的“XX天计划”大多是课程目录按天罗列知识点却没有告诉学习者每天要交出一个什么结果。我建议把每一阶段的学习成果都设计成一个看得见、摸得着的东西而不是“今天学了pandas的groupby”这种自我安慰。下面这套路线可以给一个基础参考适合每天能投入1.5到2小时、周末能投入3到4小时的自学者。总时长大约在80到100小时。阶段天数学习模块核心任务阶段产出第1阶段第1-4天Python基础与数据分析环境掌握变量、循环、函数、列表、字典能读写CSV用自己的代码完成一个简单汇总第2阶段第5-13天数据清洗与预处理pandas加载多格式数据处理缺失、重复、异常、口径统一一份清洗前后对比文档第3阶段第14-22天数据分析与数据挖掘入门分组聚合、RFM分层、认识机器学习建模流程一份用户分层结果表第4阶段第23-29天数据可视化与综合项目用图表回答业务问题按分析目标完成图表组合一份带图表的项目报告第5阶段第30天复盘与作品整理整理代码、清洗文档、结论和图表一份可以展示的项目链接这套设计最重要的原则是每天都要有产出。哪怕第1天只写了50行代码也要保存起来并给代码写出注释。第5天开始每次处理数据都保留“处理前”和“处理后”的快照这样你才能回看自己的判断过程。从第14天开始就要尝试站在“数据挖掘”的角度去思考用户群体之间是否存在差异高价值用户有什么共同特征而不是只停留在“汇总销售额”的描述性分析层面。4. 环境准备与最小工程习惯在正式动手写数据清洗代码之前先把环境搭好。以下方案对Windows、macOS和Linux都适用核心是保证依赖互相隔离不要把你平时写爬虫、做Web开发的环境和数据分析项目混在一起。推荐使用Anaconda因为它自带Jupyter、NumPy、pandas等常用库对新手最省心。也可以只用Python官方环境加venv然后用pip安装依赖。下面以conda为例conda create -n data_learning python3.10 -y conda activate data_learning如果你没有安装Anaconda使用venv也是一样的思路python -m venv data_learning # Windows 下激活 data_learning\Scripts\activate # macOS / Linux 下激活 source data_learning/bin/activate激活环境后安装以下常用库。注意版本不要照搬网上的旧教程以当前安装时的兼容版本为准pip install pandas numpy matplotlib seaborn plotly scikit-learn jupyter ydata-profiling如果你希望以后能重现环境可以在项目目录保存一份依赖清单。使用conda时导出为environment.yml使用pip时导出为requirements.txtpip freeze requirements.txt接下来是工程目录。很多初学者喜欢把所有文件放在桌面文件夹叫“新建文件夹1”代码写到一半就找不到数据了。从第1天开始就按下面这个结构组织项目data_learning/ |-- data/ | |-- raw/ # 原始数据只读不改 | |-- processed/ # 清洗后的数据 |-- notebooks/ # Jupyter Notebook适合探索分析 |-- scripts/ # 正式脚本适合跑批任务 |-- output/ # 图表、报告、结果表这样做的好处是在项目结束后你能清楚地知道哪些数据可以直接复用哪些图表是从哪个脚本里生成的。将来想做“可视化大屏”或者把分析结果自动化这个结构也能无缝迁移到调度任务里。5. 数据清洗与预处理实战先判断“这份数据能不能用来分析”数据清洗是整个项目里最花时间、也是最容易做错的一步。我先给出一份典型的订单数据文件路径假设为data/raw/orders.csv字段包括order_id订单编号user_id用户编号order_date下单日期amount订单金额status订单状态region所在区域真实数据里这个表可能来自多个系统也可能存在以下问题amount列被读成了字符串里面混着空值和非法字符status字段中“已完成”“成功”“SUCCESS”实际描述的是同一件事订单编号有重复可能是同一笔订单被导出了多次region存在缺失但缺失比例很低order_date有的是文本格式有的是时间戳格式无法直接参与日期分组先用pandas做一次“数据体检”import pandas as pd df pd.read_csv(data/raw/orders.csv, encodingutf-8) # 先看整体规模与字段类型 print(数据规模, df.shape) print(字段类型) print(df.dtypes) # 再看缺失和重复 print(缺失情况) print(df.isnull().sum()) print(重复行数, df.duplicated().sum())这段代码不需要做任何处理只是让你知道“当前数据能不能直接分析”。很多人跳过了这一步直接画图结果图表里大量数据没被正确解析结论自然不可信。接下来我们按常见脏数据问题逐项处理# 1. 删除完全重复的订单order_id 是业务唯一标识 df df.drop_duplicates(subset[order_id]) # 2. 金额转数值无法转换的置为 NaN金额缺失的订单直接丢弃 df[amount] pd.to_numeric(df[amount], errorscoerce) df df.dropna(subset[amount]) # 3. 过滤明显不合理的金额。对常规销售订单金额小于等于0通常不是有效成交 df df[df[amount] 0] # 4. 日期统一成 datetime 类型 df[order_date] pd.to_datetime(df[order_date], errorscoerce) df df.dropna(subset[order_date]) # 5. 订单状态口径统一先把文本统一成小写并去掉空格再做映射 df[status] df[status].astype(str).str.strip().str.lower() status_map { 已完成: success, 成功: success, success: success, 失败: fail, fail: fail, 已取消: cancel, cancel: cancel, } df[status_clean] df[status].map(status_map) # 6. 区域缺失比例很低时如果无法通过业务规则回填先标记为“未知” df[region] df[region].fillna(未知)这段代码有几个值得思考的决策点。第一为什么“已完成/成功/SUCCESS”要映射成一个值因为后续按状态分组统计时如果不统一同一种业务状态会被拆成多个组导致统计结果失真。第二为什么金额字段用了两次处理因为原始数据可能是字符串先转成数值才能过滤小于等于0的异常值。第三为什么缺失的订单号可以删但区域缺失可以用“未知”填充因为订单号是唯一标识缺失意味着无法定位业务记录而区域只是分析维度在不清楚真实归属时标为“未知”比强行猜测更诚实。清洗之后再检查一次数据质量print(清洗后数据规模, df.shape) print(df[[amount, order_date, status_clean, region]].info()) print(订单状态分布) print(df[status_clean].value_counts(dropnaFalse))如果输出中各字段的非空数量一致、字段类型正确说明数据已经进入“可分析”状态。这里的核心思路不是“把所有数据都洗干净”而是通过清洗让数据能够支撑下一步的分析目标。真正的坑在于有些人会把数据分析的绝大部分时间耗在反复调格式上反而忘了要回答的业务问题是什么。6. 数据分析与数据挖掘入门从“发生了什么”到“用户为什么不一样”有了干净的订单表就可以开始真正的数据分析。对入门阶段的读者我建议不要一上来就追求复杂的机器学习算法而是先把“统计聚合业务分层”这套基本功打牢。先看整体销售趋势# 增加月份字段 df[order_month] df[order_date].dt.to_period(M).astype(str) monthly_sales df.groupby(order_month, as_indexFalse)[amount].sum() print(monthly_sales) # 按渠道或区域聚合 region_sales df.groupby(region, as_indexFalse)[amount].sum() print(region_sales)到这一步你已经在回答“发生了什么”。如果销售额连续几个月下降或者某个区域明显偏低下一步就要追问是客户数量变少了还是客户购买金额变少了这时候可以继续拆customer_stats df.groupby(user_id).agg( order_cnt(order_id, nunique), total_amount(amount, sum), ) print(customer_stats.describe())通过这些统计你会看到用户之间的差异很大有人只买了一次几十元的订单有人买了许多次。这时需要用数据挖掘里非常适合入门的RFM分层把用户划分成可运营的群体。RFM是一种经典的用户价值分析框架Recency代表最近一次购买距今多久Frequency代表购买频率Monetary代表购买总金额。它的价值在于把抽象的用户活跃度和贡献度转换成可以直接指导运营的标签。# 用当前数据里的最大日期近似“分析截止日期” current_date df[order_date].max() rfm df.groupby(user_id).agg( recency(order_date, lambda x: (current_date - x.max()).days), frequency(order_id, count), monetary(amount, sum), ).reset_index() print(rfm.describe()) # 用中位数作为分界避免高额用户拉高均值 r_median rfm[recency].median() f_median rfm[frequency].median() m_median rfm[monetary].median() def make_rfm_tag(row): if row[recency] r_median and row[frequency] f_median and row[monetary] m_median: return 高价值活跃用户 if row[recency] r_median and row[frequency] f_median and row[monetary] m_median: return 低价值流失用户 if row[recency] r_median and row[frequency] f_median and row[monetary] m_median: return 高频低额用户 return 待运营用户 rfm[user_tag] rfm.apply(make_rfm_tag, axis1) print(rfm[user_tag].value_counts())这段代码并不复杂但它体现了数据挖掘的典型思路先把原始业务明细整理成一行一行的“用户特征”再根据业务规则给用户打标签。RFM的阈值不一定必须用中位数也可以根据业务经验自定义比如“近30天内有购买”才算活跃。如果你还想更进一步接触机器学习建议先理解正规流程特征工程、划分训练集和测试集、选择模型、评估结果、解释业务含义。不要在刚学会train_test_split之后就到处套模型否则很容易把无关变量都塞进去得到一个看似准确却无法解释的结论。7. 数据可视化会画图不等于会表达数据可视化是数据分析的“最后一公里”。很多初学者以为可视化就是学会一堆库把所有能画的图都画一遍。其实可视化的核心是让看到图表的人不需要读长篇文字就能接收你想传递的结论。先解决一个最常见的画图环境问题中文乱码。在matplotlib中需要指定中文字体import matplotlib.pyplot as plt # Windows 常见中文字体是 SimHei 或 Microsoft YaHei plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False画一张月度销售额趋势图import matplotlib.pyplot as plt import seaborn as sns sns.set_theme(stylewhitegrid) monthly_sales df.groupby(order_month, as_indexFalse)[amount].sum() fig, ax plt.subplots(figsize(9, 5)) ax.plot( monthly_sales[order_month], monthly_sales[amount], markero, linewidth2, ) ax.set_title(月度销售额趋势) ax.set_xlabel(月份) ax.set_ylabel(销售额) plt.xticks(rotation45) plt.tight_layout() plt.savefig(output/monthly_sales.png, dpi150) plt.show()如果你觉得matplotlib的交互能力不够可以用plotly画出能放大、悬停显示数据的交互图表import plotly.express as px region_monthly df.groupby( [order_month, region], as_indexFalse )[amount].sum() fig px.line( region_monthly, xorder_month, yamount, colorregion, markersTrue, title分区域月度销售额变化, ) fig.update_layout( xaxis_title月份, yaxis_title销售额, legend_title区域, ) fig.write_html(output/region_monthly_trend.html) fig.show()可视化的设计需要一点审美意识但更关键的是“匹配问题”。如果你想看整体趋势用折线图想比较不同区域或渠道的量级用条形图想检查数值分布用直方图或箱线图只有强调部分与整体的占比时才考虑饼图而且饼图的分块不宜太多。另外一个容易忽略的点是图表标题是最好的结论位置。不要把标题写成“销售额曲线”而要写成类似“华东区下半年的销售额持续下滑”然后在图里用颜色或标注把下滑区间标记出来。分析报告里的图表本质上是在“论证”一个观点而不是纯粹堆图。8. 综合项目实战把清洗、分析、可视化串成一条完整的流水线第23天到第29天建议集中精力完成一个综合项目。这才是检验30天学习成果的关键。不要贪大一个2到5万行的脱敏销售订单表已经足够练习。项目的业务背景可以自己设定比如某电商平台近一年的订单数据已经导出运营方想知道哪些区域销售增长最快、哪些用户群体贡献最大、哪个渠道的流失风险用户最集中并给出下个阶段的运营建议。这个项目至少应该包含四个模块sales_analysis_project/ |-- data/raw/sales_orders.csv |-- scripts/ | |-- data_clean.py | |-- build_rfm.py | |-- make_charts.py | |-- main.py |-- output/ |-- README.md如果数据清洗逻辑已经写好可以把它整理成函数放到scripts/data_clean.py里RFM分层逻辑放到scripts/build_rfm.py里画图函数放到scripts/make_charts.py里。最后在main.py串起全流程。为了快速生成一份探索性的报告你还可以用ydata-profiling做一次自动化EDApip install ydata-profilingfrom ydata_profiling import ProfileReport df pd.read_csv(data/raw/sales_orders.csv, encodingutf-8) profile ProfileReport(df, title销售订单EDA报告) profile.to_file(output/eda_report.html)这份HTML报告会包含缺失值、重复值、字段分布、相关性等大量信息特别适合第一步判断数据质量。但要注意自动化报告只是“辅助”不能替代你根据业务口径写的清洗逻辑。项目完成后你需要能够用自己的话讲清楚四个问题原始数据有多少行、多少列存在哪些质量问题清洗之后的数据规模和业务口径是什么用户分层或其他分析发现了什么规律这些规律对应怎样的运营动作。如果你能不看代码用口头解释清楚这四件事就说明你已经建立了基本的数据分析思维。读者可以把项目代码和报告整理到公开仓库这也是后面求职或持续学习时非常有用的作品集。如果运营方还需要可视化大屏后续可以在plotly或同类工具的基础上再做一层综合看板不必急于在30天内完成。9. 常见学习误区和排查思路在入门阶段有几个反复出现的问题值得单独列出来。如果你在运行代码时遇到状况可以先对照下表。问题现象可能原因排查方式解决方案read_csv读文件时报编码错误文件是GBK或GB2312编码查看报错信息尝试不同编码读取时指定encodinggbk或encodingutf-8图表中文显示成方块系统缺少中文字体或matplotlib未指定字体检查当前代码中rcParams设置设置plt.rcParams[font.sans-serif][SimHei]缺失值填完或删完结果和业务对不上没有区分“真的缺失”和“业务上的无值”逐列打印缺失比例和样本高比例缺失先评估字段作用不要盲目fillna金额列无法求和原始列是字符串包含逗号、货币符号或空值查看df.dtypes和唯一值先to_numeric处理再考虑过滤异常值pd.qcut分箱报“Bin edges must be unique”分位点上有大量重复值检查列字段是否高度重复先用rank()再分箱或改用中位数阈值模型跑完准确率很高但业务不可用数据泄露或使用了不合理的特征检查训练集是否包含未来信息或目标字段重新设计特征先跑简单模型做基准可视化图表堆了很多图读者抓不住重点没有明确每种图要回答什么问题每张图画之前先写出结论只保留能支撑核心结论的图表除了报错还有一个很隐蔽的“心理误区”总觉得要把所有工具学完才开始做项目。实际上python基础语法、pandas常用操作、matplotlib画图等技能只要有最基本的掌握就可以进入综合项目。项目中的新问题会反向逼你去查文档这种学习方式比从第一页看到最后一页有效得多。10. 工程化习惯、数据安全与下一步方向30天路线跑完后不应该停在“能画出几张图”的层面还要逐渐建立工程化习惯。尤其当你进入岗位或开始处理正式项目后下面几点会直接影响数据结果的可信度。第一记录口径。每个字段如果做过过滤、映射、填充都要写清楚原因。最好在清洗脚本开头用注释保存这些规则。数据分析团队最害怕的不是代码写得丑而是三个月后没人知道当初为什么把某些行删掉。建议做一个简单的数据字典包含字段名、业务含义、类型、取值范围、清洗规则。第二保留中间结果。处理原始数据时不要直接覆盖源文件。原始数据进入项目后永远只读清洗结果保存到data/processed/这样即使后续发现清洗规则有误也可以回溯重跑。第三区分探索代码与正式代码。Jupyter Notebook适合探索和画草稿图但一旦确定为规律性任务最好写成.py脚本并配好参数入口。比如把输入路径、输出路径、日期范围等参数放到脚本开头或配置文件中方便下次直接修改参数后重新运行。第四重视数据安全。练习数据尽量使用脱敏后的公开数据集对外发布报告时要检查是否存在用户个人信息、经营敏感信息。真实业务环境中的取数、删数、改数必须经过授权并在测试环境验证。这些不是形式要求而是“分析结果是否能被人信任”的底线。第五明确下一步方向。30天可以入门但不能“精通”。如果你朝数据科学和机器学习方向发展需要补充统计学、特征工程、模型评估等内容如果你发现自己在清洗和调度上更感兴趣可以看向数据工程方向学习更系统的数据管道、实时计算和大数据组件如果你只是想做业务向数据分析则要加强对商业指标、A/B测试、报表体系的理解。这也是“数据工程”和“数据科学”岗位会分开讨论的原因上游数据管道稳定下游的分析和算法才有发挥空间。回到最初的问题为什么很多人学了几个月还是不会做项目因为他们始终站在“学工具”的岸边没有跳进“做项目”的河流里。30天不是一个神奇的期限而是让你用一套完整的链路把零散的工具知识串成一条线。如果你能用固定的一份数据从清洗一路做到分层分析再做出能解释业务的可视化报告那么下一次遇到新数据时你就会知道第一步不是打开图表库而是静下心来看清楚数据本身。这种熟能生巧的判断力才是数据分析入门真正结束的标志。
返回列表