跳到主要内容Python 数据分析、可视化与机器学习实战脚本精选 | 极客日志PythonAI算法
Python 数据分析、可视化与机器学习实战脚本精选
Python 数据分析与机器学习实战脚本涵盖数据处理、可视化绘图、经典机器学习模型应用以及时序预测技术。内容包含基于 Pandas 的销售与餐饮数据分析、Matplotlib 与 Plotly 图表绘制、Titanic 生存预测与员工流失分析、LSTM 股价预测及 SARIMAX 销量预测等核心案例。通过提供完整代码示例与原理讲解,帮助开发者掌握从数据清洗到模型评估的全流程技能,适用于数据分析、人工智能入门及进阶学习场景。
奇形怪状14 浏览 Python 数据分析、可视化与机器学习实战脚本精选
前言
Python 凭借其丰富的生态系统,已成为数据处理、科学计算和人工智能领域的首选语言。本文精选了多个基于 Python 的实战案例,涵盖数据分析、可视化绘图、机器学习模型应用以及时序预测技术。所有代码均基于 Jupyter Notebook 环境编写,附带必要注释,可直接运行学习。
数据统计分析
电子产品销售分析
利用 Pandas 进行数据清洗与 Plotly 进行交互式可视化是数据分析的标准流程。以下示例展示了如何分析不同内存配置下的手机销量分布。
首先加载数据并统计内存数量:
import pandas as pd
import plotly.express as px
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=, titlefont_size=, tickfont_size=),
legend=(x=, y=, bgcolor=, bordercolor=)
)
fig.show()
'Distribution'
16
12
dict
0
1
'rgba(255, 255, 255, 0)'
'rgba(2, 255, 255, 0)'
餐饮数据分析
针对大规模数据集(如 7 万条记录),使用聚合操作可以快速洞察市场情况。例如统计不同行政区下各类店铺的分布:
import plotly.express as px
fig = px.bar(df2_top3, x="行政区", y="店铺数量", color="类别", text="店铺数量")
fig.update_layout(title="不同行政区下不同类别的店铺数量对比")
fig.show()
此外,还可以分析口味、环境、服务和人均消费四个指标之间的相关性关系,帮助商家优化经营策略。
RFM 用户画像模型
RFM 模型是客户关系管理(CRM)中的核心分析工具,用于衡量客户价值和创利能力。通过三个维度评估:
- Recency (R):最近一次购买时间间隔,反映活跃度和意向。
- Frequency (F):一定时间内购买次数,反映忠诚度和习惯。
- Monetary (M):一定时间内消费总金额,反映消费能力和认可度。
import pandas as pd
from datetime import date
data['Recency'] = (date.today() - data['PurchaseDate'].dt.date).dt.days
frequency_data = data.groupby('CustomerID')['OrderID'].count().reset_index()
frequency_data.rename(columns={'OrderID': 'Frequency'}, inplace=True)
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 图形绘制
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()
统计图形绘制
箱型图 (Boxplot)
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()
栅格图 (Eventplot)
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 入门
Plotly Express 提供了更简洁的 API 来快速绘制散点图、气泡图、小提琴图等交互图表,适合快速原型开发。
机器学习实战
Titanic 生存预测
这是一个经典的二分类问题。通过特征重要性排序可以了解哪些因素对生存影响最大。
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier
from xgboost import XGBClassifier
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()
Iris 数据集 KNN 分类
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 股价预测
长短期记忆网络(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 销量预测
对于具有季节性的数据,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)
基础实用脚本
99 乘法表
for i in range(1, 10):
for j in range(1, i + 1):
print(f'{j}x{i}={i*j}', end=" ")
print("\n")
i = 1
while i <= 9:
j = 1
while j <= i:
print(f'{i}x{j}={i*j}', end='')
j += 1
i += 1
print('\n')
简易计算器 GUI
使用 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()
结语
本文涵盖了从数据清洗、可视化到建模预测的完整工作流。建议读者在实际项目中多尝试修改参数、更换数据集,以深入理解各算法的特性。持续练习是提升编程能力的唯一途径。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online