ARTICLE DETAIL

资讯详情

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

Python数据分析与挖掘实训数据包:从数据清洗到模型验证全流程

Python数据分析与挖掘实训数据包:从数据清洗到模型验证全流程 简介这份实训数据包面向正在学习Python数据分析与挖掘的在校学生与转行自学者围绕真实业务场景提供可动手练习的数据素材帮助读者把数据清洗、探索性分析、特征工程与机器学习建模等环节串联成完整实践链路。包内共17个文件以csv数据表为主辅以xlsx、xls表格和sql建表脚本压缩包约112.9MB覆盖用户信息、消费记录、商品销售、内容浏览日志等典型数据集可直接用于Pandas读取、可视化绘图与Scikit-Learn建模练习。目前已有395人学习下载。数据按章节组织涉及缺失值与异常值处理、描述性统计与图表呈现、多源数据导入导出、特征选择与编码、线性回归与决策树等监督学习算法以及神经网络入门内容便于读者按学习进度逐章复现案例在真实数据上巩固从预处理到模型评估的完整流程。1. 从一份实训数据包说起Python 数据分析与挖掘到底练什么很多人学 Python 数据分析卡在第一步不是不会写代码而是手里没有一份像样的数据。网上找的 CSV 要么字段太少要么全是英文看不懂要么干脆就是随机生成的假数据跑完df.head()就不知道该干嘛了。这份「Python数据分析与挖掘实战_实训数据.zip」解决的就是这个问题——它把一门完整课程里用到的实训数据按章节打包好了从第 2 章的学生基本信息到第 10 章的日志表字段说明覆盖了数据清洗、探索性分析、特征工程、用户行为分析、销售预测等典型场景。适合正在跟着教材或视频课做练习的人也适合想找一套结构完整的数据集来练手 Pandas、Matplotlib、Scikit-Learn 的从业者。下面我按实际拆包后的使用路径把每章数据怎么用、参数怎么设、哪里容易翻车讲清楚。2. 拆包先看目录各章节数据文件的定位与加载方式2.1 文件清单与对应技术点拿到压缩包先别急着解压到桌面我一般会先建一个项目目录把数据按章节分好。这份资源里的文件大致可以分成四类基础信息类学生基本信息.xls、USER_INFO.csv、USER_INFO_M.csv、交易流水类acc_records.csv、data.csv、user_balance_table.csv、商品与销售类各化妆品销量.xlsx、新零售智能销售设备6月份商品销售情况.xlsx、Supermarket-customers.csv、日志与行为类jc_content_viewlog1.sql、jc_content_viewlog1表的字段说明.xlsx、user_info_screen.csv、communication.csv。第 7 章的 drink.csv、Breakfast.csv、bread.csv 属于典型的关联规则挖掘数据集第 5 章的 testset.csv 则是留给模型验证用的。章节代表文件格式典型用途第2章学生基本信息.xlsExcel基础统计、分组聚合第3章各化妆品销量.xlsxExcel可视化、趋势分析第4章USER_INFO.csvCSV数据清洗、缺失值处理第5章acc_records.csv、testset.csvCSV分类模型训练与验证第6章USER_INFO_M.csvCSV用户画像、特征工程第7章drink.csv、Breakfast.csv、bread.csvCSV关联规则、频繁项集第8章user_balance_table.csvCSV时间序列、余额预测第9章user_info_screen.csvCSV筛选、条件过滤第10章jc_content_viewlog1.sqlSQL日志分析、SQL 导入加载时有个细节.xls是老版 Excel 格式Pandas 读它需要xlrd库而.xlsx需要openpyxl。很多人装完 Pandas 直接read_excel报错就是缺了这两个引擎之一。我一般会在项目开始前统一装好pip install pandas numpy matplotlib seaborn scikit-learn xlrd openpyxl sqlalchemy pymysql这条命令里xlrd负责.xlsopenpyxl负责.xlsxsqlalchemy和pymysql是为第 10 章的 SQL 文件准备的。如果你用的是 Anaconda大部分库已经自带但xlrd新版本不再支持.xls以外的格式所以读.xlsx必须靠openpyxl这一点后面避坑章节还会展开。2.2 统一加载脚本与编码处理CSV 文件最烦人的就是编码。这份资源里的 CSV 有些是 UTF-8有些可能是 GBK 或 GB2312直接pd.read_csv会抛UnicodeDecodeError。我的习惯是写一个带异常回退的加载函数先试 UTF-8失败再试 GBK再失败试 GB18030。这样不管文件来自 Windows 还是 Linux 环境都能读进来。import pandas as pd def load_csv_smart(filepath, **kwargs): 按 UTF-8 - GBK - GB18030 顺序尝试读取 CSV encodings [utf-8, gbk, gb18030] for enc in encodings: try: df pd.read_csv(filepath, encodingenc, **kwargs) print(f[OK] {filepath} 使用编码 {enc}形状 {df.shape}) return df except UnicodeDecodeError: continue raise ValueError(f无法读取 {filepath}请检查文件编码) # 示例读取第4章用户信息 user_info load_csv_smart(第4章/USER_INFO.csv) print(user_info.dtypes) print(user_info.isnull().sum())这段代码的关键在encodings列表的顺序和try/except的捕获类型。UnicodeDecodeError是编码不匹配时 Pandas 抛出的典型异常捕获它继续试下一个编码即可。**kwargs让你可以继续传sep、header、usecols等参数不影响原有灵活性。打印dtypes和isnull().sum()是为了在加载后立刻确认字段类型和缺失情况避免后面分析时才发现某列全是字符串。对于 Excel 文件加载方式类似但要注意sheet_name参数。一个.xlsx里可能有多个工作表不指定就只读第一个。第 3 章的「各化妆品销量.xlsx」和「新零售智能销售设备6月份商品销售情况.xlsx」很可能有多个 sheet我一般先用pd.ExcelFile看一眼再决定读哪个xl pd.ExcelFile(第3章/各化妆品销量.xlsx, engineopenpyxl) print(xl.sheet_names) # 先看有哪些工作表 df_sales xl.parse(xl.sheet_names[0]) # 再按需读取engineopenpyxl是显式指定引擎避免 Pandas 自动推断时选错。如果你环境里同时装了xlrd和openpyxl不指定引擎有时会报版本冲突这个坑后面会细说。3. 数据清洗与探索从 USER_INFO 到可视化落地3.1 缺失值与异常值处理的标准流程第 4 章的USER_INFO.csv和第 6 章的USER_INFO_M.csv是练数据清洗的好材料。真实业务数据里用户信息表通常会有缺失的手机号、空白的年龄、格式不统一的日期。我一般按「先看分布再定策略」的顺序走数值列看describe()类别列看value_counts()日期列看pd.to_datetime的报错情况。# 数值列分布 print(user_info.describe()) # 类别列取值分布 for col in user_info.select_dtypes(includeobject).columns: print(f\n{col} 取值前10) print(user_info[col].value_counts().head(10)) # 缺失值比例 missing_ratio user_info.isnull().sum() / len(user_info) print(missing_ratio[missing_ratio 0].sort_values(ascendingFalse))这段代码的输出决定了你后面怎么填。缺失比例低于 5% 的数值列我通常用中位数填充高于 30% 的列考虑直接丢弃或作为单独类别标记。类别列缺失可以填Unknown但要注意这会影响后续分组聚合的结果。describe()还能帮你发现异常值比如年龄出现 200 或 -1这种明显超出业务范围的数值要么截断要么置空。异常值检测常用 IQR 方法不依赖正态分布假设比 3σ 更稳健def detect_outliers_iqr(df, col): Q1 df[col].quantile(0.25) Q3 df[col].quantile(0.75) IQR Q3 - Q1 lower Q1 - 1.5 * IQR upper Q3 1.5 * IQR outliers df[(df[col] lower) | (df[col] upper)] print(f{col}: 下界 {lower:.2f}, 上界 {upper:.2f}, 异常数 {len(outliers)}) return outliers # 对年龄列做异常检测 outliers_age detect_outliers_iqr(user_info, age)1.5 * IQR是经典阈值业务上如果数据本身波动大可以放宽到 3 倍 IQR。返回的outliers不要直接删先看看这些行是不是有特殊含义比如高消费用户被当成异常删掉就亏大了。3.2 用 Matplotlib 和 Seaborn 做探索性可视化第 3 章的化妆品销量数据适合练可视化。我一般会先画一个按品类分组的柱状图看整体分布再用箱线图看各品类的离散程度最后用热力图看字段间的相关性。Seaborn 的boxplot和heatmap比 Matplotlib 原生接口省事很多。import matplotlib.pyplot as plt import seaborn as sns plt.rcParams[font.sans-serif] [SimHei] # 中文显示 plt.rcParams[axes.unicode_minus] False # 假设 df_sales 有 品类 和 销量 两列 fig, axes plt.subplots(1, 2, figsize(14, 5)) sns.barplot(datadf_sales, x品类, y销量, axaxes[0]) axes[0].set_title(各品类销量对比) axes[0].tick_params(axisx, rotation45) sns.boxplot(datadf_sales, x品类, y销量, axaxes[1]) axes[1].set_title(各品类销量分布) plt.tight_layout() plt.savefig(sales_overview.png, dpi150) plt.show()SimHei是 Windows 自带中文字体Linux 或 Mac 上可能没有需要换成WenQuanYi Micro Hei或Arial Unicode MS。不设这个参数中文标签会变成方块。dpi150是保存图片的分辨率写报告够用再高文件会很大。tight_layout()自动调整子图间距避免标签被截断。热力图之前要先做相关性计算只保留数值列numeric_df df_sales.select_dtypes(include[float64, int64]) corr numeric_df.corr() plt.figure(figsize(10, 8)) sns.heatmap(corr, annotTrue, fmt.2f, cmapcoolwarm, center0) plt.title(数值字段相关性热力图) plt.show()annotTrue把相关系数写在格子里fmt.2f保留两位小数center0让颜色以 0 为中心对称正相关偏红、负相关偏蓝。相关系数绝对值大于 0.7 的字段对后面建模时要注意多重共线性可以考虑删掉其中一个。4. 关联规则与用户行为第 7 章和第 10 章的实战路径4.1 从 drink.csv 到频繁项集Apriori 参数怎么调第 7 章的drink.csv、Breakfast.csv、bread.csv是典型的购物篮数据适合练关联规则挖掘。这类数据通常长成「订单号 商品名」的格式一行一个商品同一个订单号有多行。用 Apriori 之前要先做透视把数据转成「一行一个订单、每列一个商品」的 0-1 矩阵。# 假设 drink.csv 有 订单号 和 商品 两列 drink pd.read_csv(第7章/drink.csv, encodinggbk) # 透视成 0-1 矩阵 basket drink.groupby([订单号, 商品])[商品].count().unstack().fillna(0) basket basket.applymap(lambda x: 1 if x 0 else 0) print(basket.shape) print(basket.head())groupby加unstack是购物篮数据透视的标准操作fillna(0)把没有购买记录的位置填 0applymap把计数转成 0-1。数据量大时applymap会慢可以改用(basket 0).astype(int)向量化操作快很多。接下来跑 Apriori核心参数是min_support最小支持度、min_confidence最小置信度、min_lift最小提升度。支持度太低会产出大量无意义规则太高又可能一条规则都跑不出来。我的经验是先从 0.01 到 0.05 之间试看规则数量再调整。from mlxtend.frequent_patterns import apriori, association_rules frequent_itemsets apriori(basket, min_support0.02, use_colnamesTrue) print(f频繁项集数量{len(frequent_itemsets)}) rules association_rules(frequent_itemsets, metricconfidence, min_threshold0.3) rules rules[rules[lift] 1.0].sort_values(lift, ascendingFalse) print(rules[[antecedents, consequents, support, confidence, lift]].head(10))min_support0.02表示一个商品组合至少在 2% 的订单里同时出现。metricconfidence配合min_threshold0.3表示只看置信度大于 30% 的规则。lift 1.0是筛选有效关联的底线提升度小于等于 1 说明两个商品之间没有正向关联甚至可能是负相关。mlxtend不是 Pandas 自带库需要单独pip install mlxtend。4.2 第 10 章 SQL 日志表的导入与字段解析第 10 章给了jc_content_viewlog1.sql和对应的字段说明 Excel这是练 SQL 导入和日志分析的素材。.sql文件不能直接用 Pandas 读常见做法是先导入 MySQL 或 SQLite再用pd.read_sql查出来。如果只是本地练习SQLite 最省事不需要装数据库服务。# 用 sqlite3 导入 SQL 文件 sqlite3 viewlog.db 第10章/jc_content_viewlog1.sql导入后先用字段说明 Excel 对照一下表结构确认字段名和类型import sqlite3 conn sqlite3.connect(viewlog.db) field_desc pd.read_excel(第10章/jc_content_viewlog1表的字段说明.xlsx, engineopenpyxl) print(field_desc) # 查前 5 行 sample pd.read_sql(SELECT * FROM jc_content_viewlog1 LIMIT 5, conn) print(sample)sqlite3是 Python 内置库不需要额外安装。pd.read_sql直接接收 SQL 语句和连接对象返回 DataFrame。字段说明 Excel 里通常有字段名、类型、含义三列先看一遍再写查询能避免把content_id当成user_id这种低级错误。日志表数据量大时不要SELECT *全量拉加LIMIT或WHERE条件分批取。5. 避坑与排查这份实训数据最容易翻车的五个地方5.1 读 Excel 报错 xlrd 版本不兼容现象pd.read_excel(学生基本信息.xls)抛出XLRDError: Excel xlsx file; not supported。原因新版xlrd只支持.xls不支持.xlsx而 Pandas 默认可能仍调用xlrd。解决读.xlsx时显式指定engineopenpyxl读.xls时用enginexlrd两个库都装上各管各的。5.2 CSV 中文乱码导致列名变成乱码现象df.columns输出一堆\xca\xfd\xbe\xdd之类的字符。原因文件是 GBK 编码但用 UTF-8 读了。解决用前面load_csv_smart函数自动回退编码或者手动指定encodinggbk。如果列名已经乱了重新读一遍即可不要试图在乱码基础上改列名。5.3 关联规则跑不出结果或规则爆炸现象apriori返回空 DataFrame或者返回几万条规则。原因min_support设得太高或太低。解决先算一下商品出现频率把min_support设在「出现次数最多的商品频率」的 1/10 到 1/5 之间。规则太多就提高min_confidence和lift阈值规则为空就降低min_support。5.4 SQL 文件导入后表名为空或字段缺失现象sqlite3导入成功但SELECT报no such table。原因.sql文件里可能包含CREATE DATABASE或USE语句SQLite 不支持。解决先用文本编辑器打开.sql文件删掉CREATE DATABASE、USE等非标准语句只保留CREATE TABLE和INSERT INTO再导入。5.5 可视化中文显示为方块现象图表标题和轴标签全是□□□。原因Matplotlib 默认字体不含中文。解决设置plt.rcParams[font.sans-serif] [SimHei]Mac 上换成[Arial Unicode MS]Linux 上换成[WenQuanYi Micro Hei]。设置后如果还不生效清一下 Matplotlib 缓存rm -rf ~/.matplotlib。6. 进阶技巧用 testset.csv 做一次完整的模型验证闭环第 5 章的acc_records.csv和testset.csv可以串成一个完整的分类模型验证流程。acc_records.csv当训练集testset.csv当测试集中间走一遍特征工程、模型训练、混淆矩阵评估。我一般会先确认两个文件的字段是否一致不一致就以训练集为准做列对齐。from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, confusion_matrix from sklearn.preprocessing import LabelEncoder # 加载 train load_csv_smart(第5章/acc_records.csv) test load_csv_smart(第5章/testset.csv) # 假设目标列叫 label其余为特征 target label feature_cols [c for c in train.columns if c ! target] # 类别编码 le LabelEncoder() for col in train[feature_cols].select_dtypes(includeobject).columns: train[col] le.fit_transform(train[col].astype(str)) test[col] le.transform(test[col].astype(str)) # 训练 X_train train[feature_cols] y_train train[target] X_test test[feature_cols] y_test test[target] clf RandomForestClassifier(n_estimators100, random_state42) clf.fit(X_train, y_train) # 评估 y_pred clf.predict(X_test) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))LabelEncoder对每一列单独编码训练集和测试集必须用同一个编码器否则类别映射会错位。random_state42保证结果可复现。classification_report输出精确率、召回率、F1 值比只看准确率更能发现类别不平衡问题。如果测试集里出现了训练集没有的类别le.transform会报错这时候要么把新类别归为Unknown要么用handle_unknownignore的OrdinalEncoder替代。跑完这一遍你会对「数据加载 → 清洗 → 特征编码 → 模型训练 → 评估」的完整链路有个具体感受。这份实训数据的价值不在于文件本身多稀有而在于它把每个环节需要的素材都准备好了省去了到处找数据的麻烦。从那以后我每次拿到新数据集都会先跑一遍load_csv_smart加describe()加isnull().sum()这三板斧确认数据底子干净了再往下走。希望帮到你。本文还有配套的精品资源点击获取
返回列表