Python 数据分析、可视化与机器学习实战脚本精选
前言
Python 凭借其丰富的生态系统,已成为数据处理、科学计算和人工智能领域的首选语言。本文精选了多个基于 Python 的实战案例,涵盖数据分析、可视化绘图、机器学习模型应用以及时序预测技术。所有代码均基于 Jupyter Notebook 环境编写,附带必要注释,可直接运行学习。
Python 数据分析与机器学习实战脚本涵盖数据处理、可视化绘图、经典机器学习模型应用以及时序预测技术。内容包含基于 Pandas 的销售与餐饮数据分析、Matplotlib 与 Plotly 图表绘制、Titanic 生存预测与员工流失分析、LSTM 股价预测及 SARIMAX 销量预测等核心案例。通过提供完整代码示例与原理讲解,帮助开发者掌握从数据清洗到模型评估的全流程技能,适用于数据分析、人工智能入门及进阶学习场景。

Python 凭借其丰富的生态系统,已成为数据处理、科学计算和人工智能领域的首选语言。本文精选了多个基于 Python 的实战案例,涵盖数据分析、可视化绘图、机器学习模型应用以及时序预测技术。所有代码均基于 Jupyter Notebook 环境编写,附带必要注释,可直接运行学习。
利用 Pandas 进行数据清洗与 Plotly 进行交互式可视化是数据分析的标准流程。以下示例展示了如何分析不同内存配置下的手机销量分布。
首先加载数据并统计内存数量:
import pandas as pd
import plotly.express as px
# 假设 df 为已加载的数据框
nei_cun = color_size["Number_GB"].value_counts().reset_index()
nei_cun.columns = ["Number_of_GB", "Count"] # 重命名列
nei_cun["Number_of_GB"] = nei_cun["Number_of_GB"].apply(lambda x: str(x) + "GB")
# 绘制饼图
fig = px.pie(nei_cun, values="Count", names="Number_of_GB")
fig.show()
接着分析不同闪存(Ram)下的价格分布箱线图:
import plotly.graph_objects as go
fig = px.box(df, y="Sale Price", color="Ram")
fig.update_layout(height=600, width=800, showlegend=False)
fig.update_layout(
title={"text": '不同闪存下的价格分布', "y": 0.96, "x": 0.5, "xanchor": "center", "yanchor": "top"},
xaxis_tickfont_size=12,
yaxis=dict(title='Distribution', titlefont_size=16, tickfont_size=12),
legend=dict(x=0, y=1, bgcolor='rgba(255, 255, 255, 0)', bordercolor='rgba(2, 255, 255, 0)')
)
fig.show()
针对大规模数据集(如 7 万条记录),使用聚合操作可以快速洞察市场情况。例如统计不同行政区下各类店铺的分布:
import plotly.express as px
# 假设 df2_top3 为预处理后的数据
fig = px.bar(df2_top3, x="行政区", y="店铺数量", color="类别", text="店铺数量")
fig.update_layout(title="不同行政区下不同类别的店铺数量对比")
fig.show()
此外,还可以分析口味、环境、服务和人均消费四个指标之间的相关性关系,帮助商家优化经营策略。
RFM 模型是客户关系管理(CRM)中的核心分析工具,用于衡量客户价值和创利能力。通过三个维度评估:
实现代码如下:
import pandas as pd
from datetime import date
# 计算 R 值:距离今天的天数
data['Recency'] = (date.today() - data['PurchaseDate'].dt.date).dt.days
# 计算 F 值:订单计数
frequency_data = data.groupby('CustomerID')['OrderID'].count().reset_index()
frequency_data.rename(columns={'OrderID': 'Frequency'}, inplace=True)
# 计算 M 值:交易金额总和
monetary_data = data.groupby('CustomerID')['TransactionAmount'].sum().reset_index()
monetary_data.rename(columns={'TransactionAmount': 'MonetaryValue'}, inplace=True)
# 合并数据
rfm = pd.merge(frequency_data, monetary_data, on='CustomerID')
rfm = pd.merge(rfm, data[['CustomerID', 'Recency']], on='CustomerID')
Matplotlib 支持基础及高级的 3D 绘图,适用于展示多维数据关系。
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('fivethirtyeight')
fig = plt.figure(figsize=(8, 6))
ax = fig.gca(projection='3d')
z = np.linspace(0, 20, 1000)
x = np.sin(z)
y = np.cos(z)
surf = ax.plot3D(x, y, z)
# 添加散点
z_noise = 15 * np.random.random(200)
x_noise = np.sin(z_noise) + 0.1 * np.random.randn(200)
y_noise = np.cos(z_noise) + 0.1 * np.random.randn(200)
ax.scatter3D(x_noise, y_noise, z_noise, c=z_noise, cmap='Greens')
plt.show()
箱型图能清晰展示数据的分布、中位数及异常值。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(10)
D = np.random.normal((3, 5, 4), (1.25, 1.00, 1.25), (100, 3))
fig, ax = plt.subplots(2, 2, figsize=(9, 6), constrained_layout=True)
# 基础位置
ax[0, 0].boxplot(D, positions=[1, 2, 3])
ax[0, 0].set_title('positions=[1, 2, 3]')
# 凹槽显示
ax[0, 1].boxplot(D, positions=[1, 2, 3], notch=True)
ax[0, 1].set_title('notch=True')
# 标记符号
ax[1, 0].boxplot(D, positions=[1, 2, 3], sym='+')
ax[1, 0].set_title("sym='+'")
# 自定义样式
ax[1, 1].boxplot(D, positions=[1, 2, 3], patch_artist=True, showmeans=False, showfliers=False,
medianprops={"color": "white", "linewidth": 0.5},
boxprops={"facecolor": "C0", "edgecolor": "white", "linewidth": 0.5})
ax[1, 1].set_title("patch_artist=True")
for i in range(2):
for j in range(2):
ax[i, j].set(xlim=(0, 4), xticks=[1, 2, 3], ylim=(0, 8), yticks=np.arange(0, 9))
plt.show()
用于展示事件发生的时间序列或分布。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
x = [2, 4, 6]
D = np.random.gamma(4, size=(3, 50))
fig, ax = plt.subplots(2, 2, figsize=(9, 6), constrained_layout=True)
ax[0, 0].eventplot(D)
ax[0, 0].set_title('default')
ax[0, 1].eventplot(D, orientation='vertical', lineoffsets=[1, 2, 3])
ax[0, 1].set_title("orientation='vertical'")
ax[1, 0].eventplot(D, orientation='vertical', lineoffsets=[1, 2, 3], linelengths=0.5)
ax[1, 0].set_title('linelengths=0.5')
ax[1, 1].eventplot(D, orientation='vertical', lineoffsets=[1, 2, 3], linelengths=0.5, colors='orange')
ax[1, 1].set_title("colors='orange'")
plt.show()
Plotly Express 提供了更简洁的 API 来快速绘制散点图、气泡图、小提琴图等交互图表,适合快速原型开发。
这是一个经典的二分类问题。通过特征重要性排序可以了解哪些因素对生存影响最大。
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier
from xgboost import XGBClassifier
# 假设 X, Y 已准备好
rf = RandomForestClassifier(n_estimators=500, random_state=0)
rf.fit(X, Y)
ada = AdaBoostClassifier(n_estimators=200, learning_rate=0.05, random_state=0)
ada.fit(X, Y)
gbc = GradientBoostingClassifier(n_estimators=500, learning_rate=0.1, random_state=0)
gbc.fit(X, Y)
xgbc = XGBClassifier(n_estimators=900, learning_rate=0.1)
xgbc.fit(X, Y)
# 可视化特征重要性
f, ax = plt.subplots(2, 2, figsize=(15, 12))
pd.Series(rf.feature_importances_, X.columns).sort_values(ascending=True).plot.barh(width=0.8, ax=ax[0, 0])
ax[0, 0].set_title('Feature Importance in Random Forests')
pd.Series(ada.feature_importances_, X.columns).sort_values(ascending=True).plot.barh(width=0.8, ax=ax[0, 1], color='#9dff11')
ax[0, 1].set_title('Feature Importance in AdaBoost')
pd.Series(gbc.feature_importances_, X.columns).sort_values(ascending=True).plot.barh(width=0.8, ax=ax[1, 0], cmap='RdYlGn_r')
ax[1, 0].set_title('Feature Importance in Gradient Boosting')
pd.Series(xgbc.feature_importances_, X.columns).sort_values(ascending=True).plot.barh(width=0.8, ax=ax[1, 1], color='#FD0F00')
ax[1, 1].set_title('Feature Importance in XgBoost')
plt.show()
K-近邻算法(KNN)是一种简单有效的监督学习算法。
import pandas as pd
import seaborn as sns
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, confusion_matrix
# 特征分布矩阵
pd.plotting.scatter_matrix(X_train, c=y_train, figsize=(15, 15), marker='o', hist_kwds={'bins': 20}, s=60, alpha=.8)
plt.show()
# 混淆矩阵
sns.heatmap(confusion_matrix(y_pred, y_test), annot=True)
plt.show()
# 新数据预测
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
x_new = [[5, 2.9, 1, 0.2]]
prediction = knn.predict(x_new)
处理分类变量时,LabelEncoder 是常用的编码方式。
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Attrition'] = le.fit_transform(df['Attrition'])
df['BusinessTravel'] = le.fit_transform(df['BusinessTravel'])
df['Department'] = le.fit_transform(df['Department'])
df['EducationField'] = le.fit_transform(df['EducationField'])
df['Gender'] = le.fit_transform(df['Gender'])
df['JobRole'] = le.fit_transform(df['JobRole'])
df['MaritalStatus'] = le.fit_transform(df['MaritalStatus'])
df['Over18'] = le.fit_transform(df['Over18'])
df['OverTime'] = le.fit_transform(df['OverTime'])
结合随机森林等模型,可进一步分析教育背景、年龄与月收入对流失率的影响。
长短期记忆网络(LSTM)擅长处理时间序列数据中的长期依赖关系。
from keras.models import Sequential
from keras.layers import Dense, LSTM
model = Sequential()
model.add(LSTM(128, return_sequences=True, input_shape=(xtrain.shape[1], 1)))
model.add(LSTM(64, return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))
model.summary()
交叉验证有助于评估模型的泛化能力:
import numpy as np
k = 5
number_val = len(xtrain) // k
number_epochs = 20
all_mae_scores = []
all_loss_scores = []
for i in range(k):
vali_X = xtrain[i * number_val: (i+1) * number_val]
vali_y = ytrain[i * number_val: (i+1) * number_val]
part_X_train = np.concatenate([xtrain[:i * number_val], xtrain[(i+1) * number_val:]], axis=0)
part_y_train = np.concatenate([ytrain[:i * number_val], ytrain[(i+1) * number_val:]], axis=0)
history = model.fit(part_X_train, part_y_train, epochs=number_epochs, validation_data=(vali_X, vali_y), batch_size=300, verbose=0)
all_mae_scores.append(history.history["mae"])
all_loss_scores.append(history.history["loss"])
对于具有季节性的数据,SARIMAX 模型表现优异。
import statsmodels.api as sm
p, d, q = 5, 1, 2
model = sm.tsa.statespace.SARIMAX(df['Revenue'], order=(p, d, q), seasonal_order=(p, d, q, 12))
model = model.fit()
ten_predictions = model.predict(len(df), len(df) + 10)
掌握循环结构是编程的基础,以下是三种常见写法。
# 方法一:For 循环
for i in range(1, 10):
for j in range(1, i + 1):
print(f'{j}x{i}={i*j}', end=" ")
print("\n")
# 方法二:While 循环
i = 1
while i <= 9:
j = 1
while j <= i:
print(f'{i}x{j}={i*j}', end='')
j += 1
i += 1
print('\n')
使用 Tkinter 库可以快速构建桌面应用程序。
import tkinter as tk
root = tk.Tk()
root.title("Standard Calculator")
root.resizable(0, 0)
e = tk.Entry(root, width=35, bg='#f0ffff', fg='black', borderwidth=5, justify='right', font='Calibri 15')
e.grid(row=0, column=0, columnspan=3, padx=12, pady=12)
def buttonClick(num):
temp = e.get()
e.delete(0, tk.END)
e.insert(0, temp + num)
def buttonClear():
e.delete(0, tk.END)
def buttonGet(oper):
global num1, math
num1 = e.get()
math = oper
e.insert(tk.END, math)
try:
num1 = float(num1)
except ValueError:
buttonClear()
# 实际应用中需添加按钮绑定逻辑及主循环
root.mainloop()
本文涵盖了从数据清洗、可视化到建模预测的完整工作流。建议读者在实际项目中多尝试修改参数、更换数据集,以深入理解各算法的特性。持续练习是提升编程能力的唯一途径。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online