【机器学习】实战:市场增长点分析挖掘项目

在电商行业激烈竞争的背景下,精准挖掘市场增长点是企业保持竞争力的关键。本文基于拜耳官方旗舰店驱虫剂市场分析项目,先对原文核心内容进行梳理与解读,再续写关键的竞争分析模块,形成完整的市场增长点挖掘闭环,为企业决策提供数据支撑。

1. 业务背景:奠定分析逻辑基础

业务背景模块明确了市场分析的核心理论与方法论,是后续数据分析的 “指南针”,关键要点如下:

1.1 分析流程概述

某电商产品数据分析流程

  • 每个环节都有具体的要求,例如需求文档要求包含:目的,分析思路,预期效果
  • 业务部门出问题和需求,以及对算法&数据部门输出报告的理解和应用

1.2 中台

1.3 市场类别


评判市场和品牌的发展趋势和增长情况,从宏观到微观,从大市场到细分市场。互联网产品由关注用户增量到用户存量,判断产品或市场是用户增量还是存量,判断有新的需求出现即可:

增量市场:从无到有,以前关注哪些需求没有被满足,快速迭代抢占市场,考虑最多的
不是用户体验.流量=新增客户.例如:智能手机潮开始时的市场.小米面对的是增量
市场
存量市场:从有到优,现在关注如何更好的满足需求,考虑更多的是用户体验.产品价
值=新体验-旧体验-替换成本,新体验没有突破性大幅增加,产品价值很难实现.流量
=用户时间(停留时间越久,利益价值越大).例如:现在人手一台智能手机,小米面对
存量市场,如何让需要换手机的用户换成小米,从有到优
创新:想要用产品价值撬动一个用户,同纬度竞争别家的先发优势门槛太高,如果别家
体量很大,基本可以放弃;创新可能就是剩下的活路,而面对互联网的高速发展,线下需
求基本都被互联网化,切入点可能就转移到细分市场.例如:微信QQ是社交领域的霸
主,陌陌探探在陌生人社交上也分了一杯羹,这些已存在的需求,没有被充分实现,也算
增量市场

1.4 产品结构-波士顿矩阵(BCG Matrix)

  • BCG: Boston Consulting Group

1.5 产品生命周期

1.6 处理项目需求的基本思路


了解项目公司的背景和对接人员情况
公司的产品结构,市场环境,对接人的角色和权利等级等
沟通明确实际的项目需求
团队内部理解项目需求
和业务方沟通需求:从业务的角度理解需求可能的解决方案
优化项目需求
和业务核对项目需求
根据项目需求梳理分析思路:每一步分析的目标,需要的数据支持,反复优化
确定分析工具和人员配置,进行数据分析
撰写分析结论和方案

1.7 项目需求例子


问题:销售额下降,怎么办?(问题太大,方法也多:优化老客户,扩大流量,提升转化率)

1.了解涉及项目相关的所有的业务部门的需求,逻辑,问题点
2.拆分:销售额=流量转化率客单价
3.待沟通部门:营销部门(活动),推广部门(流量),客服,售后,供应链
4.沟通之前出想法,沟通之后优化,确认项目需求
5.数据收集:确认每一步需求的数据(可能用到爬虫)

2、项目背景&产品架构


客户介绍: 拜耳官方旗舰店(拜耳公司,总部位于德国的勒沃库森,在六大洲的200个地点建有750家生产厂;拥有120,000名员工及350家分支机构,几乎遍布世界各国.高分子,医药保健,化工以及农业是公司的四大支柱产业.公司的产品种类超过10000种)
客户需求: 拜耳官方旗舰店寻求市场增长点
产品架构:

3、数据说明

市场增长点分析挖掘数据

4、分析挖掘

4.1 数据查看、加载

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os# 更改当前路径
# os.chdir(r'./data/驱虫剂市场')
# 按照windows路径写法
os.chdir('.\\data\\驱虫剂市场')pd.read_excel('电蚊香套装市场近三年交易额.xlsx')
pd.read_excel('防霉防蛀片市场近三年交易额.xlsx')
pd.read_excel('灭鼠杀虫剂市场近三年交易额.xlsx')
# 把时间格式统一一下
temp = pd.read_excel('防霉防蛀片市场近三年交易额.xlsx')
pd.to_datetime(temp['时间'], unit='D', origin='1899-12-30')
0    2018-10-01
1    2018-09-01
2    2018-08-01
3    2018-07-01
4    2018-06-01
5    2018-05-01
6    2018-04-01
7    2018-03-01
8    2018-02-01
9    2018-01-01
10   2017-12-01
11   2017-11-01
12   2017-10-01

完整代码:

import glob
# 允许在glob中写linux的模式匹配 ls *.txt
filenames = glob.glob('*市场近三年交易额.xlsx')
# 取出具体市场的名字. 
# 从filename中就可以取
import redef read_data(filename):temp = pd.read_excel(filename)# 列名colname = re.search(r'(.*?)市场.*', filename).group(1)if temp.时间.dtype == 'int64':# 修改时间类型temp['时间'] = pd.to_datetime(temp['时间'], unit='D', origin='1899-12-30')# 改名temp.rename(columns={'交易金额': colname}, inplace=True)# 把时间改成indextemp.set_index(keys='时间', inplace=True)return tempdfs = [read_data(filename) for filename in filenames]
df = pd.concat(dfs, axis=1).reset_index()

4.2 补充数据


观察得知, 15年只有2个月数据, 16, 17年是完整数据, 18年少了11, 12的数据.
对于缺失数据, 有两种处理办法, 如果缺的太多, 直接弃用, 如果缺的不多, 想办法补足.
所以15年的11, 12月数据, 要弃用, 18年的数据需要想办法补上.
现在的问题: 如何比较合理补足18年11月12月的数据.
 

# 取11月的数据
# datetime   可以通过.dt把pandas中datetime类型变成python中datetime数据类型. 
month_data = df.loc[df.时间.dt.month == 11]
# 设置seaborn画图风格
sns.set()
# 设置显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'# 画图观察趋势. 4行2列
plt.figure(figsize=(2 * 6, 4 * 5))
for i, col in enumerate(month_data.columns[1:]):axes = plt.subplot(4, 2, i + 1)axes.plot([2015, 2016, 2017], month_data[col][::-1], marker='o')_ = axes.set_xticks([2015, 2016, 2017])_ = axes.set_xticklabels([2015, 2016, 2017])axes.set_title(col)

      

  • 通过画图, 经过观察, 得知, 15, 16, 17这年份的数据都近似符合线性的趋势
  • 那么我们就可以通过线性回归来预测18年的数据, 用预测数据作为我们填充的数据.

import datetime
from sklearn.linear_model import LinearRegression
from pandas import DataFrame, Seriesfor i in [11, 12]:month_data = df.loc[df.时间.dt.month == i]# 用年作为训练数据X_train = month_data.时间.dt.year.values.reshape(-1, 1)# 循环取每一列数据data_2018 = [datetime.datetime(year=2018, month=i, day=1)]for j in range(1, len(month_data.columns)):y_train = month_data.iloc[:, j]# 训练linear = LinearRegression()linear.fit(X_train, y_train)# 预测X_test = np.array([2018]).reshape(-1, 1)y_ = linear.predict(X_test)[0]data_2018.append(y_)# 把数据添加到原始数据中. # 用data_2018生成一个dataframe, 然后再把原始数据追加到data_2018后面# dataframe是要求data必须是二维的. newrow = DataFrame(data=np.array(data_2018).reshape(1, -1), columns=month_data.columns)df = newrow.append(df)# 删除15年的数据
df = df.loc[df.时间.dt.year != 2015].copy()
# 重置索引
df.reset_index(inplace=True)
# 设置时间为行索引
df.set_index('时间', inplace=True)
df.drop(columns='index', inplace=True)
# 计算总金额
df['总金额'] = df.sum(axis=1)
# 重新把时间变为列
df.reset_index(inplace=True)# 因为要按年分析, 所以插入一个年份
# 使用insert在指定的位置插入新的一列
df.insert(1, 'year', df['时间'].dt.year)
# 按照年份分组聚合
total_sum = df.groupby(by='year').sum()total_sum.plot(marker='o', figsize=(6, 6))
plt.xticks([2016, 2017, 2018])
plt.title('近三年交易总额的变化趋势')
plt.ylabel('近三年交易总额')

                       

结论: 通过观察的值, 整体市场近三年都是增长, 整体市场趋势不错. 处在成长期或成熟期

4.3 各类目市场销售额总和变化趋势

# 查看各类目市场近三年内销售额总和的变化趋势
cat_sum = df.groupby(by='year')[['灭鼠杀虫剂', '电蚊香套装', '盘香灭蟑香蚊香盘', '蚊香加热器', '蚊香液', '蚊香片','防霉防蛀片']].sum()cat_sum.plot(figsize=(10, 8), marker='o')
plt.title('近三年各类目交易总额的变化趋势')
plt.ylabel('近三年各类目交易总额')
_ = plt.xticks([2016, 2017, 2018])
_ = plt.text(2016 - 0.1, 0.57 * 1e9, cat_sum['灭鼠杀虫剂'].values[0])
_ = plt.text(2017 - 0.1, 0.8 * 1e9, cat_sum['灭鼠杀虫剂'].values[1])
_ = plt.text(2018 - 0.1, 1.1 * 1e9, cat_sum['灭鼠杀虫剂'].values[2])

结论: 灭鼠杀虫剂和蚊香液比较有市场

4.4 驱虫市场潜力分析

# 转化成数字类型
for col in df.columns[2:-1]:df[col] = df[col].astype('float64')# 各市场的占比
cat_sum = df.groupby(by='year').sum().copy()
cat_ratio = df.groupby(by='year').sum().iloc[:, :-1].copy()
# 使用pandas指定的运算函数,可以修改默认的运算轴,默认是按列来算的, 我们要按行来算. 
ratio_result = cat_ratio.div(cat_sum['总金额'], axis='index')ratio_result.plot(kind='bar', figsize=(10, 6), stacked=True)
plt.title('近三年各类目销售额占比')
plt.xlabel('年份')
plt.ylabel('销售额占比')for i in range(3):plt.text(i, ratio_result['灭鼠杀虫剂'].values[i] / 2 + 0.1, str(round(ratio_result['灭鼠杀虫剂'].values[i] * 100, 2)) + '%')

4.5 各个市场年增幅

# 按行操作
# 这里是dataframe和dataframe进行运算, 相同索引(行索引和列索引都相同)才会进行运算. 
cat_incr = cat_sum.diff().iloc[1:].reset_index(drop=True) / cat_sum.iloc[:2].reset_index(drop=True)
# 中文字体中, 负号不能正常显示. 
plt.rcParams['axes.unicode_minus'] = False
# 画出每一个类目的增长幅度
cat_incr.plot(figsize=(10, 6))
plt.xticks([0, 1], ['16-17', '17-18'])
plt.title('近三年各类目市场销量年增幅')
plt.xlabel('年份')
plt.ylabel('增幅占比')

结论: 灭鼠杀虫剂的增长幅度比较稳定.

4.6 TOP100品牌数据

top100 = pd.read_excel('top100品牌数据.xlsx')
top100.plot(x='品牌', y='交易指数', kind='barh', figsize=(6, 18))

# 计算HHI
# 先算市场份额
top100_share = top100['交易指数'] / top100['交易指数'].sum()
HHI = sum(top100_share ** 2)0.013546334007208914

驱虫剂市场不存在垄断, 是一个不集中的行业.

5、灭鼠杀虫剂市场机会点分析

# 换目录
os.chdir(r'../灭鼠杀虫剂细分市场')
filelist = glob.glob('*.xlsx')
# 把这五个表格读进来, 拼到一起. 
dfs = [pd.read_excel(filename) for filename in filelist]
df = pd.concat(dfs, axis=0)
# 查看缺失值
df.isnull().any()
# 丢弃全部是null的列丢弃掉 
df.dropna(axis=1, how='all').shape
df.isnull().mean()
df.dropna(axis=1, how='all', inplace=True)# 删缺失值数据超过98%的.
cond = (df.isnull().mean() > 0.98)
df = df.loc[:, ~cond].copy()
df.isnull().mean()# 经过观察发现, 药品登记号后面的特征, 缺失太多, 删除. 
df.columns.get_loc('药品登记号')# 去掉没用的特征
useless = ['时间','页码', '排名',  '链接', '主图链接', '主图视频链接', '宝贝标题', '下架时间', '运费', '旺旺']
df.drop(columns=useless, inplace=True)# 担心index有重复的, 重新整理一下索引
df.reset_index(drop=True, inplace=True)df.drop(columns='类目', inplace=True)# 查看一下具体哪个类别预测销售额比较大
df.groupby(by='类别')[['预估销售额']].sum().plot(kind='bar')

                

画个饼图, 查看各个类别占总体预估销售额的比例

# 画个饼图, 查看各个类别占总体预估销售额的比例
temp = df.groupby(by='类别')[['预估销售额']].sum()
temp['预估销售额'].plot(kind='pie', autopct='%.2f%%', shadow=True, explode=[0.1, 0.2, 0.1, 0.1, 0.1])

                                   

可以看出, 重点需要研究灭鼠和灭蟑螂两个细分市场. 以灭鼠为例.


# 提取灭鼠数据
mouse = df.loc[df['类别'] == '灭鼠'].copy()bins = [0, 50, 100, 150, 200, 250, 300, 650]
labels = ['0_50', '50_100', '100_150', '150_200', '200_250', '250_300', '300以上']
mouse['价格区间'] = pd.cut(mouse.售价, bins=bins, labels=labels, include_lowest=True)
# 根据价格区间进行分组
predict_amount = mouse.groupby(by='价格区间')[['预估销售额']].sum()
# 计算预估销售额占比
predict_amount['预估销售额占比'] = predict_amount['预估销售额'] / predict_amount.sum().values# 宝贝数是通过统计宝贝ID来计算的, 宝贝ID是有可能出现重复的. 
mouse.宝贝ID.nunique()
# 说明确实存在重复宝贝. 
mouse.drop_duplicates(subset=['宝贝ID'])# 计算宝贝数
predict_amount['宝贝数'] = mouse.drop_duplicates(subset=['宝贝ID']).groupby(by=['价格区间'])['宝贝ID'].count()
predict_amount['宝贝数占比'] = predict_amount['宝贝数'] / predict_amount['宝贝数'].sum()predict_amount['单宝贝平均销售额'] = predict_amount['预估销售额'] / predict_amount['宝贝数']
# 计算相对竞争度
predict_amount['相对竞争度'] = 1 - ((predict_amount['单宝贝平均销售额'] - predict_amount['单宝贝平均销售额'].min()) / (predict_amount['单宝贝平均销售额'].max() - predict_amount['单宝贝平均销售额'].min()))
# 按照相对竞争度的顺序来排序
predict_amount.sort_values(by='相对竞争度', inplace=True)
# 按照价格区间查看预估销售额占比和相对竞争度
predict_amount['预估销售额占比'].plot(kind='bar', figsize=(12, 5), color='wheat', label='预估销售额占比')
predict_amount['相对竞争度'].plot(marker='o', label='相对竞争度')
plt.legend()

# 再研究0到50这个价格区间的细分市场
price50 = mouse.loc[mouse.价格区间 == '0_50'].copy()
bins = [0, 10, 20, 30, 40, 50]
labels = ['0-10', '10-20', '20-30', '30-40', '40-50']
price50['细分价格区间'] = pd.cut(price50['售价'], bins=bins, labels=labels)def process_data(df, by):predict_amount = df.groupby(by=by)[['预估销售额']].sum()predict_amount['预估销售额占比'] = predict_amount['预估销售额'] / predict_amount.sum().values# 计算宝贝数predict_amount['宝贝数'] = df.drop_duplicates(subset=['宝贝ID']).groupby(by=by)['宝贝ID'].count()predict_amount['宝贝数占比'] = predict_amount['宝贝数'] / predict_amount['宝贝数'].sum()predict_amount['单宝贝平均销售额'] = predict_amount['预估销售额'] / predict_amount['宝贝数']predict_amount['相对竞争度'] = 1 - ((predict_amount['单宝贝平均销售额'] - predict_amount['单宝贝平均销售额'].min()) / (predict_amount['单宝贝平均销售额'].max() - predict_amount['单宝贝平均销售额'].min()))# 按照相对竞争度的顺序来排序predict_amount.sort_values(by='相对竞争度', inplace=True)return predict_amountprocess_data(mouse, by='价格区间')
predict50 = process_data(price50, by='细分价格区间')def draw(predict_amount):predict_amount['预估销售额占比'].plot(kind='bar', figsize=(12, 5), color='wheat', label='预估销售额占比')predict_amount['相对竞争度'].plot(marker='o', label='相对竞争度')plt.legend()draw(predict50)

store_type = process_data(price50, by='店铺类型')
draw(store_type)

# 产品型号分析
product_type = process_data(price50, by='型号')
product_type.sort_values(by='预估销售额占比', ascending=False, inplace=True)def draw(predict_amount):predict_amount['预估销售额占比'].plot(kind='bar', figsize=(12, 5), color='wheat', label='预估销售额占比')predict_amount['相对竞争度'].plot(marker='o', label='相对竞争度', rot=90)plt.legend()draw(product_type[:19])

product_form = process_data(price50, by='物理形态')
draw(product_form)

物理形态和净含量分析

# 物理形态和净含量分析
form_net = process_data(price50, by=['物理形态', '净含量'])def draw(predict_amount):predict_amount['预估销售额占比'].plot(kind='bar', figsize=(25, 5), color='wheat', label='预估销售额占比')predict_amount['相对竞争度'].plot(marker='o', label='相对竞争度', rot=90)plt.legend()draw(form_net)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:
http://www.pswp.cn/pingmian/95298.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Day 18】21.合并两个有序链表 2.两数相加

文章目录21.合并两个有序链表题目:思路:迭代代码实现(Go):2.两数相加题目:思路:代码实现(Go):21.合并两个有序链表 题目: 将两个升序链表合并为…

Vue 3 WebSocket通信方案:从原理到实践

Vue 3 WebSocket通信方案:从原理到实践 在现代Web应用开发中,实时通信已成为许多应用的核心需求。从即时聊天到实时数据更新,用户对应用响应速度的期望越来越高。本文将深入剖析一个Vue 3环境下的WebSocket通信方案,包括基础封装与…

Windows 电源管理和 Shutdown 命令详解

一、Windows 电源管理概述 Windows 操作系统通过其内置的电源管理框架,为用户提供了多种电源状态和配置选项,以在性能、能耗和数据安全之间找到最佳平衡点。以下是 Windows 系统中常见的电源状态及其特点: 1. 睡眠(Sleep&#xff…

Selenium WebUI 自动化“避坑”指南——从常用 API 到 10 大高频问题

目录 一、为什么 90% 的 UI 自动化脚本活不过 3 个月? 二、Selenium必会 API 速查 三、实践 四、10 大高频异常“症状 → 病因 → 处方” 五、可复用的工具函数 六、面试高频追问(附标准答案) 一、为什么 90% 的 UI 自动化脚本活不过 …

【微信小程序】微信小程序基于双token的API请求封装与无感刷新实现方案

文章目录前言一、设计思路二、执行流程三、核心模块3.1 全局配置3.2 request封装3.2.1 request方法配置参数3.2.2 请求预处理3.2.3 核心请求流程3.3 刷新accessToken3.4 辅助方法四、api封装示例总结前言 现代前后端分离的模式中,一般都是采用token的方式实现API的…

基于单片机醉酒驾驶检测系统/酒精检测/防疲劳驾驶设计

传送门 👉👉👉👉其他作品题目速选一览表 👉👉👉👉其他作品题目功能速览 概述 该设计基于单片机开发,旨在通过实时检测驾驶员酒精浓度,预防酒后驾驶行为…

第6章:垃圾回收分析与调优

1. 垃圾回收基础 1.1 Java 垃圾回收概述 垃圾回收(Garbage Collection,GC)是 Java 虚拟机自动内存管理的核心机制。理解 GC 的工作原理对于 Java 应用性能调优至关重要。 1.1.1 垃圾回收的目标 自动内存管理:无需手动释放内存防止…

ROS2核心模块-动作通信、参数服务

动作通信 机器人导航到某个目标点,此过程需要一个节点A发布目标信息,然后一个节点B接收到请求并控制移动,最终响应目标达成状态信息。 乍一看,这好像是服务通信实现,因为需求中要A发送目标,B执行并返回结果&#xff0c…

word文档封面中文件编号等标题和内容无法对齐

问题 word文档封面中文件编号等标题和内容无法对齐,因为标题使用的是底纹不是文件内容。 解决办法 字体大小、行距两者配合就可以解决。

163起融资,梅卡曼德融资额夺冠,钉钉、百度智能云10周年,汉桑科技IPO| 2025年8月人工智能投融资观察 · 极新月报

“ 二级的活跃会传导到一级吗?”文|云舒&小鱼编辑 | 小白出品|极新8月重点关注:1、八月人工智能领域投融资事件163起,披露金额76.8亿人民币。2、亿级人民币以上金额的投资事件共20起 。3、八月人工智能领域发生一起…

微信小程序预览和分享文件

预览文档previewFile(val) { let item val.currentTarget.dataset.item wx.downloadFile({url: item.filePath, // 替换为实际的文件地址success: function (res) {let filePath ${wx.env.USER_DATA_PATH}/${item.fileName}|| res.tempFilePath //查看的文件名wx.openDocumen…

开源 C++ QT Widget 开发(十二)图表--环境监测表盘

文章的目的为了记录使用C 进行QT Widget 开发学习的经历。临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。 相关链接: 开源 C QT Widget 开发(一)工程文件结构-CSDN博客 开源…

ARMv8架构01 - ARM64架构寄存器基础

一 、ARM64架构基础 1 ARMv8 A 架构介绍 ARMv8 - A是ARM公司发布的第一代支持64位处理器的指令集和架构。它在扩充64位寄存器的同时提供对上一代架构指令集的兼容,因而能同时提供运行 32位 和 64位应用程序的执行环境。 超大物理地址空间(large Physical…

flutter专栏--深入剖析你的第一个flutter应用

使用fvm管理flutter版本 如果你有使用多版本flutter的需求,那么fvm将会给你提供较大的帮助。下面我列举一下mac flutter3.35.2的版本的操作命令,完成之后,你将可以随意切换flutter版本 # 下载fvm相关的依赖 brew tap leoafarias/fvm brew …

MongoDB 聚合查询超时:索引优化与分片策略的踩坑记录

人们眼中的天才之所以卓越非凡,并非天资超人一等而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件。———— 马尔科姆格拉德威尔 🌟 Hello,我是Xxtaoaooo! 🌈 “代码是逻辑的诗篇&#xff…

Augmentcode免费额度AI开发WordPress商城实战

Augment AI开发WordPress商城实战:从零构建到免费额度续杯完整指南 前言 在AI编程工具日益普及的今天,如何高效利用这些工具来开发实际项目成为了开发者关注的焦点。本文将详细介绍如何使用Augment AI从零开始构建一个功能完整的WordPress商城系统&#…

【C++八股文】数据结构篇

一、单例模式优化实现 原代码问题分析 ​内存序重排序风险​:双重检查锁在C中可能因指令重排导致半初始化对象被访问​锁粒度过大​:每次获取实例都需要加锁,影响性能​线程安全性不足​:未考虑C11前的内存模型问题 改进方案&a…

并发编程——15 线程池ForkJoinPool实战及其工作原理分析

1 一道算法题引发的思考及其实现 1.1 算法题 问:如何充分利用多核 CPU 的性能,快速对一个2千万大小的数组进行排序? 这道题可以通过归并排序来解决; 1.2 什么是归并排序? 归并排序(Merge Sort&#xff…

Kafka面试精讲 Day 6:Kafka日志存储结构与索引机制

【Kafka面试精讲 Day 6】Kafka日志存储结构与索引机制 在“Kafka面试精讲”系列的第6天,我们将深入剖析 Kafka的日志存储结构与索引机制。这是Kafka高性能、高吞吐量背后的核心设计之一,也是中高级面试中的高频考点。面试官常通过这个问题考察候选人是否…

Linux 字符设备驱动框架学习记录(三)

Linux字符设备驱动开发新框架详解 一、新旧驱动框架对比 传统字符设备驱动流程 手动分配设备号 (register_chrdev_region)实现file_operations结构体使用mknod手动创建设备节点 新式驱动框架优势 自动设备号分配:动态申请避免冲突自动节点创建:通过class…