一个零基础友好的 Python 数据分析实践项目,覆盖数据清洗、探索性分析、可视化与机器学习入门四大模块。
项目概览
| 项目属性 | 内容 |
|---|---|
| 项目名称 | Data Analysis Learning Project |
| 项目路径 | DataAnalysis/Data_Analysis_Practice_Project |
| 技术栈 | Python 3.8+、Jupyter Notebook、Pandas、NumPy、Matplotlib、Seaborn、scikit-learn、openpyxl |
| 核心目标 | 通过真实案例掌握 Python 数据分析全链路技能 |
| 项目规模 | 64 个文件、45 个代码文件、约 11,843 行代码 |
| 开源协议 | MIT |
为什么做这个项目?
数据分析是当今技术岗位的通用能力,但对于初学者来说,最大的困惑往往是:
- 学了很多函数,却不知道如何串联成完整项目;
- 面对真实数据时,不知道从哪里下手;
- 清洗、分析、可视化、建模各学各的,缺乏系统性实践。
为了解决这个问题,我搭建了这个零基础友好的数据分析学习项目。它不是一个简单的教程集合,而是一个按照真实工作流组织的、可运行的完整项目:从拿到原始数据开始,经过清洗、探索、可视化,最终尝试简单的机器学习建模。
项目结构
Data_Analysis_Practice_Project/
├── data/ # 原始数据集
│ ├── sample_sales.csv
│ ├── housing_data.csv
│ └── iris_data.csv
├── notebooks/ # Jupyter Notebook 交互分析
│ ├── 01_EDA_Exploration.ipynb
│ ├── 02_Visualization.ipynb
│ ├── 01_linear_regression.ipynb
│ └── 02_classification.ipynb
├── scripts/ # 可复用 Python 脚本
│ └── data_cleaning.py
├── 03_machine_learning/ # 机器学习入门模块
│ ├── README.md
│ ├── data/
│ └── notebooks/
├── requirements.txt
├── LICENSE
└── README.md
这个结构的设计思路是:
notebooks/适合交互式学习和探索;scripts/适合沉淀可复用的数据处理逻辑;data/集中管理所有数据集;03_machine_learning/单独作为一个进阶模块。
技术栈详解
| 工具/库 | 用途 | 为什么选择它 |
|---|---|---|
| Python 3.8+ | 主语言 | 数据分析领域的事实标准 |
| Pandas | 数据清洗、聚合、统计 | DataFrame 结构让表格数据处理非常直观 |
| NumPy | 数值计算、数组操作 | 为 Pandas 和 scikit-learn 提供底层支持 |
| Matplotlib | 基础可视化 | 灵活、可控,适合学习底层绘图原理 |
| Seaborn | 高级统计可视化 | 基于 Matplotlib,一行代码生成美观图表 |
| scikit-learn | 机器学习 | 接口统一、文档完善,非常适合入门 |
| Jupyter Notebook | 交互式分析 | 边写代码边查看结果,适合探索性分析 |
| openpyxl | Excel 导出 | 便于将分析结果交付给非技术同事 |
requirements.txt 内容:
numpy>=1.24.0
pandas>=2.0.0
matplotlib>=3.7.0
seaborn>=0.12.0
scikit-learn>=1.3.0
jupyter>=1.0.0
jupyterlab>=3.6.0
openpyxl>=3.1.0
模块一:数据清洗
1.1 清洗步骤
数据清洗占据了数据分析工作 60%~80% 的时间。本项目设计了完整的清洗流程:
- 加载数据:使用
pd.read_csv()读取 CSV 文件; - 处理缺失值:识别空值,根据场景选择删除或填充;
- 转换数据类型:将字符串日期转换为
datetime,将类别字段转换为category; - 处理异常值:使用统计方法识别并处理异常;
- 特征工程:提取月份、星期、季节等新特征。
1.2 示例数据
date | sales | region | customer_type | sales_level
2023-01-01 | 150 | East | Regular | Low
2023-01-02 | 200 | West | Premium | High
2023-01-03 | 175 | North | Regular | Low
2023-01-04 | 190 | South | Premium | High
1.3 典型清洗代码
import pandas as pd
# 加载数据
df = pd.read_csv('data/sample_sales.csv')
# 转换日期类型
df['date'] = pd.to_datetime(df['date'])
# 提取时间特征
df['month'] = df['date'].dt.month
df['week_day'] = df['date'].dt.dayofweek
# 查看缺失值
print(df.isnull().sum())
# 删除缺失值较少的行
df = df.dropna(subset=['sales', 'region'])
模块二:探索性数据分析(EDA)
2.1 统计描述
使用 df.describe() 快速了解数值型特征的分布:
df.describe()
重点关注:均值、中位数、标准差、最小值、最大值、四分位数。
2.2 相关性分析
import seaborn as sns
import matplotlib.pyplot as plt
# 计算相关系数矩阵
corr = df.corr(numeric_only=True)
# 热力图
plt.figure(figsize=(8, 6))
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0)
plt.title('特征相关性热力图')
plt.show()
2.3 分组聚合
# 按区域统计销售额
region_sales = df.groupby('region')['sales'].sum().reset_index()
print(region_sales)
模块三:数据可视化
3.1 可视化目标
- 展示销售趋势;
- 对比不同区域/客户类型的销售表现;
- 发现数据中的模式和异常。
3.2 常用图表
| 图表类型 | 用途 | 实现库 |
|---|---|---|
| 折线图 | 时间序列趋势 | Matplotlib / Seaborn |
| 柱状图 | 类别对比 | Matplotlib / Seaborn |
| 箱线图 | 分布和异常值 | Seaborn |
| 散点图 | 相关性 | Seaborn |
| 热力图 | 相关性矩阵 | Seaborn |
3.3 示例:区域销售额对比
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 6))
sns.barplot(data=df, x='region', y='sales', estimator='mean')
plt.title('各区域平均销售额对比')
plt.xlabel('区域')
plt.ylabel('平均销售额')
plt.show()
模块四:机器学习入门
4.1 线性回归:房价预测
数据:housing_data.csv
| 字段 | 含义 |
|---|---|
| area | 房屋面积(平方米) |
| bedrooms | 卧室数量 |
| age | 房龄(年) |
| price | 房价(万元) |
代码示例:
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import pandas as pd
# 加载数据
df = pd.read_csv('data/housing_data.csv')
# 特征和目标
X = df[['area', 'bedrooms', 'age']]
y = df['price']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估
print(f'R² Score: {r2_score(y_test, y_pred):.4f}')
print(f'RMSE: {mean_squared_error(y_test, y_pred, squared=False):.4f}')
4.2 分类算法:鸢尾花数据集
数据:经典的 iris_data.csv
算法:
- 逻辑回归(Logistic Regression)
- K-近邻(K-Nearest Neighbors)
评估指标:
- 准确率(Accuracy)
- 精确率(Precision)
- 召回率(Recall)
- F1 分数(F1 Score)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 划分数据
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 训练分类器
clf = LogisticRegression(max_iter=200)
clf.fit(X_train, y_train)
# 预测与评估
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred, target_names=iris.target_names))
项目成果
| 模块 | 完成度 | 产出 |
|---|---|---|
| 数据清洗 | 100% | 可复用的清洗脚本 |
| 探索性分析 | 100% | 多份 Jupyter Notebook |
| 可视化 | 100% | 多种类型图表 |
| 机器学习入门 | 70% | 线性回归 + 分类模型 |
| 项目文档 | 100% | 详细 README |
遇到的问题与解决方案
问题 1:Pandas 读取日期时类型错误
现象:date 列被识别为字符串,无法按时间排序。
解决:使用 pd.to_datetime() 显式转换。
问题 2:Matplotlib 中文乱码
现象:图表中的中文标题显示为方框。
解决:配置中文字体:
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
问题 3:scikit-learn 模型收敛警告
现象:逻辑回归出现 ConvergenceWarning。
解决:增大 max_iter 参数,或进行特征缩放。
学习心得
- 数据清洗是基础:再复杂的模型,也经不起脏数据的折腾。
- 可视化是沟通工具:好的图表能让非技术决策者快速理解数据。
- 从简单模型开始:不要一上来就用深度学习,线性回归和 KNN 已经能解决很多问题。
- 项目化学习最有效:把知识组织成可运行的项目,比零散学习效果好得多。
后续规划
- 完成机器学习模型评估章节;
- 增加真实数据集(如 Kaggle 竞赛数据);
- 补充特征工程专题;
- 增加模型保存与部署的示例。
总结
这个项目是我数据分析学习之路上的第一个完整实践。它让我从"会用几个 Pandas 函数"进阶到"能够独立完成一个数据分析项目"。更重要的是,它建立了一个可扩展的项目模板,后续我可以不断往里面添加新的分析案例和模型。
如果你也是数据分析初学者,建议从 notebooks/01_EDA_Exploration.ipynb 开始,边运行边修改数据,观察结果变化。数据分析最好的老师,就是真实的数据。