2026/9/15 0:56:39

Python数据分析教学资源:NumPy到sklearn全流程实战

Python数据分析教学资源:NumPy到sklearn全流程实战 简介这套资源是面向Python数据分析教学与自学的完整配套包以任务为导向系统讲解数据分析流程与Python数据分析库的应用适合高校教师备课、企业培训讲师授课以及零基础初学者自学。压缩包共59个文件、72.45MB包含10个PPT课件、9个Word教案、14个CSV实训数据、8个Python脚本以及各章习题答案txt等类型覆盖理论讲解、动手练习和结果检测各环节。核心内容按9章组织从第2章的NumPy数值计算、第3章Matplotlib可视化、第4章pandas统计分析到第5章数据预处理、第6章scikit-learn建模循序渐进第7至9章则结合航空公司客户价值分析、财政收入预测、家用热水器用户行为识别等企业案例提供综合实训数据与配套代码。除第1章外各章均含实训和课后习题随附的答案文件可帮助自学者随时检验掌握情况。已有626人学习是一份讲练结合、可直接用于课堂或自主学习的Python数据分析完整资源。1. 一套能直接跑通全流程的 Python 数据分析教学资源长什么样把压缩包解开之后目录结构其实比大多数培训机构给的东西更值得看。9 章内容分别对应 NumPy 数值计算、Matplotlib 可视化、pandas 统计分析、pandas 数据预处理、scikit-learn 建模以及三个企业级综合案例——航空公司客户价值分析、财政收入预测、热水器用户行为识别。每章都有配套 PPT、教案、实训数据和选择题答案实训数据直接给到了 CSV 和 xls 格式比如第7章 credit_card.csv、第4章 Training_LogInfo.csv、第5章 missing_data.xls这些省去了到处找数据集的功夫。对正在备课的讲师、刚入门需要练习数据的数据分析师以及想用现成数据复现完整分析流程的开发者来说这套包的价值在于它把“数据 → 清洗 → 建模 → 案例”的闭环补齐了而不是只给一堆讲概念的幻灯片。2. 从 populations.npz 起步NumPy 数值计算与 Matplotlib 可视化的数据链路2.1 npz 格式的正确打开方式第3章 populations.npz用的是 NumPy 的压缩存储格式不是直接用pd.read_csv能读的。常见做法是先用np.load加载再通过files属性查看内部键名。很多人在这一步翻车是因为不加allow_pickleTrue就报错——这个参数的作用是允许反序列化存储在数组中的 Python 对象官方数据文件里只要混入字典或列表类型就必须开启。import numpy as np data np.load(第3章/populations.npz, allow_pickleTrue) print(data.files) # 查看包含哪些键 arr data[data] # 提取主体数据 print(arr.shape) # 确认行列规模逻辑上先打印files是为了搞清楚文件内部结构arr.shape则用来确认数据规模是否符合预期。如果arr是二维数组通常行是样本、列是特征后续切列时才不会搞错索引。字段作用使用建议files列出 npz 内所有数组键名加载后的第一件事就是打印它allow_pickle允许读取包含对象类型的数组遇到读取报错时优先检查此参数arr.shape返回维度元组用于验证数据规模与预期一致2.2 缺失值筛查与直方图可视化拿到populations.npz之后先别急着画图。要确认数据里有没有 NaN用np.isnan配合sum()做快速筛查再把异常列清理掉或用np.nan_to_num填充。这一步属于数据质量检查能避免后续可视化时出现空区间。import numpy as np import matplotlib.pyplot as plt arr data[data].astype(float) nan_count np.isnan(arr).sum(axis0) # 每列缺失值数量 print(每列缺失值数量, nan_count) col arr[:, 1] col col[~np.isnan(col)] # 过滤 NaN fig, ax plt.subplots(1, 2, figsize(10, 4)) ax[0].hist(col, bins30, alpha0.7, color#4C72B0) ax[0].set_title(Histogram) ax[1].boxplot(col, vertFalse) ax[1].set_title(Boxplot) plt.tight_layout() plt.show()这里bins30控制直方图分箱数量alpha0.7调整透明度vertFalse让箱线图横向展示方便观察极值分布。第 3 章的训练重点是把数据分布形态看清楚所以直方图和箱线图组合是最实用的搭配。数据量本身不大画图速度很快适合在课堂上反复调整参数看效果。3. pandas 统计分析基础与数据预处理把脏数据收拾干净3.1 missing_data.xls 的缺失值处理策略第5章 missing_data.xls是专门用来练缺失值处理的。不要一上来就dropna()删行先算缺失率再根据业务含义决定填充方式。数值列一般用中位数或均值分类列用众数时间序列用前向填充。这里用中位数更稳因为均值容易被极值带偏。import pandas as pd df pd.read_excel(第5章/missing_data.xls, engineopenpyxl) print(df.isnull().sum()) for col in df.columns: if df[col].dtype float64 or df[col].dtype int64: df[col] df[col].fillna(df[col].median()) else: df[col] df[col].fillna(df[col].mode()[0]) print(df.isnull().sum())engineopenpyxl是读取现代 xls 文件的必要参数缺失值统计用isnull().sum()快速定位按数据类型分别填充可以避免“一刀切”导致的分布扭曲。判断dtype再选择填充值是从业者处理混合类型表格的常规习惯。填充完再跑一次isnull().sum()确认没有遗漏。缺失值类型推荐策略适用场景数值连续型median()存在极值或偏态分布数值连续型mean()数据近似正态分布分类离散型mode()[0]众数有业务含义时间序列ffill()前后值相关性较强3.2 ele_loss.csv 与 alarm.csv 的数据规整ele_loss.csv和alarm.csv这类脱敏数据常见问题集中在日期格式不统一、列名带空格、告警状态码是字符串。处理办法是把日期列统一转成 datetime 类型把状态码用map重编码成数值。import pandas as pd ele pd.read_csv(第5章/ele_loss.csv, encodinggbk) alarm pd.read_csv(第5章/alarm.csv, encodinggbk) ele[date] pd.to_datetime(ele[date], format%Y%m%d) alarm[status_code] alarm[status_code].map({normal: 0, abnormal: 1}) print(ele.dtypes) print(alarm[status_code].value_counts())encodinggbk是处理中文 CSV 的常见参数不设的话UnicodeDecodeError会直接中断流程。pd.to_datetime配合format参数能显著提升解析速度map重编码把文本标签变成模型可用的数值标签。做完之后打印dtypes和value_counts()快速确认类型转换和映射是否生效。3.3 标准化与分层抽样第 5 章的数据预处理还会涉及量纲统一。model.xls和winequality.csv的特征量级差异很大直接用原始值建模会导致距离型算法偏向数值大的特征。先用StandardScaler做 z-score 标准化再用train_test_split划分数据注意stratify参数能保持训练集和测试集的类别比例一致。from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split X df.drop(target, axis1) y df[target] scaler StandardScaler() X_scaled scaler.fit_transform(X) X_train, X_test, y_train, y_test train_test_split( X_scaled, y, test_size0.3, random_state42, stratifyy )fit_transform在训练集上计算均值和标准差并完成转换test_size0.3表示测试集占 30%。random_state42固定随机种子保证复现性stratifyy让分类问题中每个类别的占比在划分前后保持一致。这一步做完后数据才真正达到可建模状态。4. 从 winequality.csv 到 model.xls用 sklearn 走通建模最小闭环4.1 一份 CSV 怎么变成可评估的模型第 6 章的winequality.csv是典型的分类数据集特征是酒的理化指标目标是品质等级。先用pd.read_csv读取切分特征和标签然后训练一个逻辑回归模型当基线。不要一上来就上树模型先跑通流程再迭代。import pandas as pd from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score wine pd.read_csv(第6章/winequality.csv) X wine.drop(quality, axis1) y wine[quality] model LogisticRegression(max_iter1000, C0.1) model.fit(X_train, y_train) y_pred model.predict(X_test) print(Accuracy:, accuracy_score(y_test, y_pred))max_iter1000是为了保证梯度下降能够收敛C0.1是正则化强度的倒数调小一点可以减少过拟合。先打印 accuracy 得到一个基线分数之后再换随机森林或者 XGBoost对比哪个模型更适合这份数据。model.xls和winequality.csv在这个章节往往配套出现前者偏回归任务后者偏分类任务用同一套流程跑两边对比差异。4.2 评估口径混淆矩阵与交叉验证只看准确率不够sklearn.metrics里还有confusion_matrix和classification_report可以看每个类别的精确率和召回率。交叉验证则是判断模型稳定性的关键手段。from sklearn.model_selection import cross_val_score from sklearn.metrics import confusion_matrix, classification_report print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred)) cv_scores cross_val_score(model, X_train, y_train, cv5, scoringaccuracy) print(CV scores:, cv_scores) print(Mean CV:, cv_scores.mean())cv5表示五折交叉验证把训练数据分成 5 份轮流做验证集最后取均值。这样做能避免单次划分带来的偶然性。分类报告里的f1-score对不平衡数据集尤其重要如果某个类别样本很少准确率再高也可能掩盖问题。模型准确率收敛速度适用场景LogisticRegression中等快基线模型、线性可分问题RandomForest较高较慢特征非线性关系明显KNN中等快样本量小、特征维度低4.3 实训数据与建模数据的配合方式model.xls这类文件通常是经过预处理的练习数据列名经常是中文或带特殊字符。读取时注意检查列名必要时手动改列名避免特征选择时因编码问题失灵。df_model pd.read_excel(第5章/model.xls, engineopenxlpy提示文件名里的xls后缀不代表真实格式一定是旧版 Excel建议先用pd.ExcelFile探测实际格式再决定用openpyxl还是xlrd。批量处理多个数据文件时把读取逻辑封装成函数用路径列表循环调用能省掉大量重复代码。5. 三个企业案例的工程化拆解航空公司、财政收入与热水器行为5.1 航空公司客户价值分析RFM 到聚类第 7 章的credit_card.csv配合航空公司客户数据做价值分析。传统 RFM 模型在航空场景下要扩展成 LRFMC——加入L入会时长、C平均折扣系数等维度。实操时先按客户 ID 做聚合再对特征做标准化最后用 KMeans 聚类分群。from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler import pandas as pd df pd.read_csv(第7章/credit_card.csv, encodinggbk) features [F, M, C] # 按实际列名调整 X StandardScaler().fit_transform(df[features]) model KMeans(n_clusters5, random_state42, n_init10) labels model.fit_predict(X) df[cluster] labels print(df.groupby(cluster)[features].mean())n_clusters5对应五类客户价值分群n_init10表示用 10 个不同的随机质心初始化跑 10 次取最优结果避免陷入局部最优。聚类完后打印每个簇的特征均值根据数值高低给客户打标签比如高价值、流失风险、一般价值等。5.2 财政收入预测回归任务中的数据切分陷阱第 8 章的income_tax.csv用于财政收入预测分析。这类时间序列相关数据不能直接用train_test_split随机乱序切分否则会造成数据泄露——模型会在测试集里看到未来的信息。用TimeSeriesSplit或手动按时间点切分更合理。from sklearn.model_selection import TimeSeriesSplit tscv TimeSeriesSplit(n_splits5) for train_idx, test_idx in tscv.split(X): X_train, X_test X[train_idx], X[test_idx] y_train, y_test y[train_idx], y[test_idx]n_splits5意味着把数据按时间顺序分成 5 段每次训练集是前面的时间段验证集是后面的时间段。这样评估出来的模型在未来数据上的表现更接近真实情况。回归评估用mean_squared_error和mean_absolute_error不要只看 R²因为 R² 对离群点不敏感。5.3 热水器用户行为事件识别特征工程的实操第 9 章的USER_INFO_M.csv做的是用户行为分析核心任务是识别一次完整的“洗浴事件”。原始数据是流水记录需要先构造事件级别的特征计算相邻记录的时间间隔、用水量累加、持续时长等再训练分类模型判断是否为有效洗浴事件。df pd.read_csv(第9章/USER_INFO_M.csv, encodinggbk) df[time] pd.to_datetime(df[time]) df df.sort_values([user_id, time]) df[gap] df.groupby(user_id)[time].diff().dt.total_seconds() df[cum_water] df.groupby(user_id)[water_vol].cumsum()diff().dt.total_seconds()计算同一位用户相邻记录的时间间隔cumsum()生成累计用水量这两个特征是判断事件连续性的基础。特征工程做得好模型调参才有意义。案例数据文件模型核心操作航空公司客户价值credit_card.csvKMeansRFM 聚合、分群财政收入预测income_tax.csv回归模型时间序列切分热水器行为识别USER_INFO_M.csv二分类事件级特征工程6. 习题答案与实训数据的高阶复用自动校验与二次挖掘6.1 批量读取 txt 答案做自动比对第 19 章的选择题答案都存放在独立的 txt 文件中格式基本是“题号答案”的行式存储。手动对照批改效率太低可以写一个 Python 脚本批量解析所有答案文件再把自己做的答案用相同格式放进去自动比对逐行输出得分。这里用glob.glob遍历目录strip()去掉换行符后按等号或空格切分。import glob answer_files glob.glob(第*章/*答案.txt) for path in sorted(answer_files): with open(path, encodingutf-8) as f: lines [line.strip() for line in f if line.strip()] print(path, len(lines), 题)glob模式能匹配所有以“第”开头、包含“答案”的 txt 文件encodingutf-8处理 Windows 下可能出现的编码异常。拿到行数后可以进一步解析成字典结构把题号和答案映射起来后续和学生的答案文件做一键比对。6.2 把实训数据改造成新的数据集Training_LogInfo.csv、Training_Userupdate.csv、Training_Master.csv这三张表放在第 4 章结构上明显是同一个业务场景的多表关联。除了按原始题目做 pandas 联表练习还能把它们改造成新的分析任务比如把时间戳字段解析成小时和星期分析不同时间段的用户活跃度或者把用户更新记录按周聚合观察留存趋势。df_log pd.read_csv(第4章/Training_LogInfo.csv) df_log[log_time] pd.to_datetime(df_log[log_time]) df_log[hour] df_log[log_time].dt.hour df_log[weekday] df_log[log_time].dt.dayofweek df_log.groupby(weekday)[user_id].nunique().plot(kindbar)dt.hour和dt.dayofweek分别提取小时和星期编号nunique()统计去重用户数。用这种方法改造原始实训数据等于给自己创造了一个新的分析项目。6.3 数据质量自查的三个技巧拿到陌生数据集时先花 30 秒做三个基础检查第一df.shape看行列数是否符合预期第二df.describe()看数值列的最小值、最大值和分位数确认没有明显异常值第三df.isnull().sum()看缺失值分布。这三个命令组合起来能挡住 80% 的脏数据问题。credit_card.csv这类带中文列名的文件读取后记得用df.columns.tolist()先确认列名避免后续通过索引取列时错位。本文还有配套的精品资源点击获取