1、爬取淘宝商品前十页
下载的文件存放位置
2、导入项目编程需要使用到的Python库
- copy: 用于创建对象的浅复制或深复制
- matplotlib 和 matplotlib.pyplot: 这两个库是Python中最常用的绘图库,用于生成各种静态、动态、交互式的图表和图形。
- numpy: 提供了强大的多维数组对象和数学函数库
- pandas: 强大的数据处理和分析工具,基于 numpy 构建,可以方便地处理结构化数据,如CSV或Excel文件中的表格数据。
- matplotlib.font_manager.FontProperties: 用于设置matplotlib中字体属性的类,比如字体大小、样式等
- re: Python的标准库,提供正则表达式匹配操作
- seaborn: 基于matplotlib的数据可视化库,提供了更高级、更美观的统计图形绘制功能,适合做数据分布的视觉展示。
- jieba: 中文分词库,用于对中文文本进行词语切分,是处理中文文本数据的重要工具。
- jieba.analyse.extract_tags: jieba库中的一个功能,用于提取文本中的关键词,常用于文本主题分析。
- WordCloud: 用于生成词云的库,可以帮助可视化文本数据中单词的频率。
3、设置字体
4、导入数据集
df = pd.read_csv("taobao.csv", encoding='utf-8')
使用了Pandas库来读取一个名为"taobao.csv"的CSV文件,并指定文件的字符编码为'utf-8'。
5、数据概述
(1)查看数据前十行
print(df.head(10)) 是一个Pandas命令,用于显示DataFrame对象df的前10行数据。输出一个表格形式的结果,展示CSV文件导入后 DataFrame 的初始部分数据。
(2)查看列名
print(df.columns) 这段代码的作用是打印出DataFrame df 所有列的名称
(3)修改列名至表中
new_column_names = ['序号', '商品链接', '标题', '商店名', '卖点1', '卖点2', '价格(元)', '销售', '发货地']
df.rename(columns=dict(zip(df.columns, new_column_names)), inplace=True)
print(df.columns)
df.to_csv('taobao.csv' , index=False)
- 创建了一个列表new_column_names,里面存放了给DataFrame列重新命名的新列名。
- 使用df.rename()函数和字典dict(zip(df.columns, new_column_names))来将原DataFrame的列名映射到新的列名上
- 调用print(df.columns)来打印出修改后的列名,确认列名是否已经成功更新。
使用df.to_csv('taobao.csv', index=False)将修改列名后的DataFrame保存回CSV文件。index=False参数表示在保存时不包含索引列
(4)查看末尾5行的数据
print(df.tail(n=5)):指定要从末尾开始显示的 5 行
(5)查看行数和列数
print(df.shape):打印DataFrame‘df’的形状,即行数和列数
(6)查看所有列名
print(df.columns)这个命令是用来打印DataFrame ‘df’所有列的名称
(7)查看详细结构信息
print(df.info()):会显示出DataFrame的详细结构信息,包括数据框的总览(列名及其数据类型);每一列的非空值数量;数据框所占内存大小;索引的类型和唯一标识数量
(8)查看每列的数据类型
print(df.dtypes) :打印出DataFrame‘df’中每列数据的类型
(9)查看‘商店名’的所有唯一值
print(df['商店名'].unique()) 这行代码的作用是打印出DataFrame df中'商店名'这一列所有不重复的值,显示出该列所有唯一的商店名称。
(10)查看价格从高到低排列
price = df.sort_values(by=['价格(元)'], ascending=False)
print(price)
1、对DataFrame df按照'价格(元)'这一列的值进行降序排序,
2、排序后的新DataFrame被赋值给了变量price。
3、通过print(price)打印出这个按价格降序排列的数据Frame。
(11)创建透视表以多种维度查看数据的不同汇总视图
pivot_table_example = pd.pivot_table(df, values='价格(元)', index='商店名', columns='卖点1', aggfunc="nunique")
print(pivot_table_example)
print(df.columns)
print(pivot_table_example): 这将打印出创建的数据透视表,展示了不同商店的每个卖点对应的不同价格数量。
print(df.columns): 这行代码打印出原始DataFrame df 的所有列名,以便了解数据框架的结构。
(12)查看价格大于500元的行
high_price_items = df[df['价格(元)'] > 500]:从DataFrame df中筛选出“价格(元)”列值大于500的行
print(high_price_items):打印出这些高价商品的信息
6.数据清洗
(1)查看每列非空数据
print(df.count()) :打印出DataFrame df中每列非空值的数量。运行这段代码后,显示出一个Series,其中索引是列名,对应的值是各列中非空数据项的数量
(2)检查是否有空值
print(df.isnull().sum()):检查DataFrame df中每一列含有多少缺失值(NaN值)。df.isnull()会返回一个布尔值的DataFrame,其中True表示该位置的值是缺失的,False表示有值。紧接着调用.sum()会计算每一列中True的个数,也就是缺失值的数量。
(3)将空值赋值为“NaN”
df.replace('', np.nan, inplace=True):将DataFrame df中所有空字符串('')替换为NaN(Not a Number),inplace=True参数表示这一替换操作直接在原始DataFrame上进行。
df.to_csv('taobao.csv' , index=False):将修改后的DataFrame保存回名为'taobao.csv'的CSV文件中。
(4)删除‘链接’列和‘序列’号
df.drop('商品链接', axis=1, inplace=True)
df.drop('序号', axis=1, inplace=True)
df.to_csv('taobao.csv' , index=False)
① df.drop('商品链接', axis=1, inplace=True): 从DataFrame df中删除名为'商品链接'的列。axis=1表示沿着列进行操作,inplace=True表示直接在原始DataFrame上进行修改,而不是返回一个新的DataFrame对象。
② df.to_csv('taobao.csv', index=False): 修改后的DataFrame被保存回'taobao.csv'文件中,且在保存时不包含索引列。
(5)删除重复行
df.drop_duplicates(inplace=True):先执行去重操作并在原DataFrame上修改
print(df):打印出修改后的DataFrame
(6)提取销售中的数字存为“数字销量”
① 定义函数 extract_number(sales_str)
- 使用正则表达式 r'\d+' 匹配输入字符串 sales_str 中的数字序列。
- 如果找到匹配项,使用 int(match.group()) 将匹配到的数字字符串转换为整数并返回。
- 如果未找到数字,函数返回0
② 应用函数:在DataFrame df 上应用 extract_number 函数到 '销售' 列的每个元素上,使用 .apply(extract_number) 方法,并将结果作为新列 '数字销量' 添加到DataFrame中。
③ 保存处理后的数据:使用 to_csv('taobao.csv', index=False) 将处理后的DataFrame保存回CSV文件,其中 index=False 参数表示不保存行索引。
④ 打印处理后的数据框:通过 print(df[['标题', '商店名', '数字销量']]) 打印出包含标题、商店名和新计算的数字销量的DataFrame的部分列。
紧接着,print(df.head()) 打印出DataFrame的前五行,以便快速查看整个数据框的结构和部分数据。
7.数据分析
(1)打印数值型的基本统计摘要
df.describe() 是一个非常常用的方法,它用于生成数据框(DataFrame)中数值型列的基本统计摘要
- count: 非空值的数量。
- mean: 平均值。
- std: 标准差,衡量数值离散程度。
- min: 最小值。
- 25%:第一四分位数(Q1),即数据中小于这个值的有25%的数据。
- 50%:中位数(median),即数据中间的值,把数据集一分为二。
- 75%:第三四分位数(Q3),即数据中大于这个值的有25%的数据。
- max: 最大值。
(2)按发货地分组,计算平均价格
grouped_mean = df.groupby('发货地')['价格(元)'].mean()
print(grouped_mean)
计算DataFrame‘df’中按照'发货地'这一列分组后,各组内'价格(元)'这一列的平均值。
(3)计算各个商店的平均销量和平均价格
① 获取所有不同的店铺名
shops = df['商店名'].unique().tolist() :从DataFrame df 的 '商店名' 列中提取出所有不重复的店铺名,并将它们转化为列表形式。这样就得到了一个包含所有独特店铺名称的列表。
② 初始化平均销量和平均价格列表:
average_sales = []
average_prices = []
分别创建了两个空列表 average_sales 和 average_prices,用于存储接下来计算出的每个店铺的平均销量和平均价格。
③ 循环计算每个店铺的平均销量和平均价格:
对于每个店铺名 shop:
avg_data = df[df['商店名'] == shop]:这一行筛选出DataFrame中 '商店名' 列等于当前店铺名的所有行,即这个店铺的所有数据。
avg_sale = avg_data['数字销量'].mean():计算筛选出的数据中 '数字销量' 列的平均值,即该店铺的平均销量。
avg_price = avg_data['价格(元)'].mean():类似地,计算 '价格(元)' 列的平均值,得到该店铺商品的平均价格。
计算出的平均销量 avg_sale 和平均价格 avg_price 分别追加到 average_sales 和 average_prices 列表中。
④ 打印并存到新的文件中
使用 enumerate 函数遍历 shops 列表的同时获取索引 i,以便从 average_sales 和 average_prices 列表中取出与当前店铺对应的平均销量和平均价格进行打印。
(4)归类价格区间新增到列表
① 定义价格区间函数 price_interval
根据价格值将其归类到三个不同的价格区间:'0-200'、'200-700' 或 '>700'。如果价格不超过200元,则归为'0-200'区间;若价格在200元到700元(含200元,不含700元)之间,则归为'200-700';超出700元的,归为'>700'区间。
② 应用函数到DataFrame以创建新列
df['价格区间'] = df['价格(元)'].apply(price_interval):将之前定义的price_interval函数应用到DataFrame的'价格(元)'列的每一个元素上
③ 保存更新后的DataFrame到CSV文件
df.to_csv('taobao.csv', index=False):将更新后的DataFrame(现在包含了一个新的'价格区间'列)保存回原始的CSV文件taobao.csv中
(5)计算百分比新增到列表
① total_sales = df['数字销量'].sum():计算数字销量的总和
② df['百分比销量'] = df['数字销量'] / total_sales * 100:将每行数字销量除以总和得到百分比销量新增到列表中。
(6)将卖点12汇总到文件中
① 数据准备:
df[['卖点1', '卖点2']] 这部分代码选取了DataFrame df 中的两列,'卖点1' 和 '卖点2'。
② 数据合并:
.stack() 方法将这两列的数据垂直堆叠起来,形成一个多级索引的Series,其中每个索引对(原本的行索引和列名)对应一个卖点。
.tolist() 将这个Series转换为一个列表,方便后续操作。
③ 去除重复项:
list(set(combined_points)) 这将合并后的列表转换为集合(set),集合自动去除所有重复的元素,然后再将结果转换回列表。这样就得到了一个包含了所有唯一卖点的列表 unique_combined_points。
④ 保存到文件:
file_name = '卖点汇总.txt' 定义了输出文件的名称。
with open(file_name, 'a', encoding='utf-8') as file: 使用上下文管理器打开指定的文件。模式 'a' 表示追加模式,即在文件末尾添加内容,而不是覆盖原有内容。
循环遍历 unique_combined_points 列表,对每个卖点 point 执行 file.write(point + '\n'),将卖点写入文件,每个卖点后面跟着一个换行符 ('\n'),确保每个卖点独占一行。
⑤ 完成提示:
print(f"卖点已成功保存到 {file_name}") 打印一条消息,通知用户卖点已成功保存到指定的文件中。
(7)判断发货地南北方并保存至文件中
① 定义南北城市集合
定义了两个集合north_cities和south_cities,分别代表中国北方和南方的一些省份或地区。
② 打印DataFrame的列名
使用print(df.columns)打印出原始DataFrame(df)的所有列名,确认数据结构和即将操作的列是否存在。
③ 添加方位列并初始化
在df中添加一个新的列'方位',并默认设置所有行的值为'未知'。
④ 更新方位列
根据发货地是否存在于north_cities或south_cities集合中,分别将'方位'列更新为'北方'或'南方'。
⑤ 保存处理后的数据
将处理后的DataFrame保存到新的CSV文件taobao.csv,并且在保存时不包含索引列(index=False),以便于外部查看和进一步分析。
(9)删除包含“未知”方位的数据
8.数据可视化
(1)绘制发货地的平均价格占比饼状图
① 数据准备:
labels = grouped_mean.index.tolist():这行代码从一个名为grouped_mean的对象中提取索引,并将其转换为列表形式,用作饼图的标签。
sizes = grouped_mean.values.tolist():这行代码获取grouped_mean对象的值,同样转换为列表形式,这些值将决定饼图中每个部分的大小。
② 绘制饼状图:
plt.figure(figsize=(10, 6)):设定图表的尺寸为宽度10英寸,高度6英寸。
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140, pctdistance=0.85):这一行代码实际绘制饼图。其中,
- sizes定义了饼图各个部分的大小,
- labels=labels指定了每个部分的标签(即发货地名称),
- autopct='%1.1f%%'自动计算并显示每个部分的百分比,保留一位小数,
- startangle=140设置了饼图的起始角度,使得第一个切片从140度开始,可以调整饼图的视觉效果,
- pctdistance=0.85控制百分比标签与圆心的距离,数值越小,标签离圆心越近。
③ 图表美化和布局:
fig = plt.gcf():获取当前的图形实例,虽然在这个上下文中没有直接使用fig,但有时保存或进一步操作图形时会用到。
plt.title('各发货地平均价格占比'):为图表添加标题。
plt.axis('equal'):确保饼图呈现为正圆形,而不是椭圆。
(2)绘制价格的直方图(价格区间分布)
① 绘制直方图:
sns.histplot(data=df, x='价格(元)', bins=200):这行代码创建了一个直方图。其中,data=df指定数据来源为DataFrame df,
x='价格(元)'指定了用于绘制直方图的变量是'价格(元)'这一列,bins=200设置了直方图的柱子数量为200,较大的bins值可以让价格分布的细节展现得更细致。
② 图表美化:
plt.title('价格区间分布'):为直方图添加标题,说明这是关于'价格区间分布'的图表。
plt.xlabel('价格(元)'):为x轴添加标签,说明横轴代表的是'价格(元)'。
plt.ylabel('频数'):为y轴添加标签,说明纵轴代表的是该价格区间出现的频数。
③ 显示图表:
plt.show():最后,调用这个函数来展示刚才配置好的直方图。
(3)绘制价格的密度图(价格区间分布)
① 绘制核密度图:
sns.displot(data=df, x='价格(元)', kind='kde'): sns.displot函数,它是Seaborn中更为通用的分布图函数。
data=df指定了绘图数据集为df。
x='价格(元)'指定了绘图基于'价格(元)'这一列。
kind='kde':展示'价格(元)'变量的密度分布
② 图表美化与展示:
plt.title('价格密度分布'):设置了图表的标题。
plt.xlabel('价格(元)')和plt.ylabel('密度'):分别设置了x轴和y轴的标签,说明了图表展示的是价格与对应的价格密度。
plt.show()用于展示图表。
(4)绘制店铺平均销量与价格关系散点图
① 读取CSV:results_df = pd.read_csv('店铺销售分析.csv')
: 使用pandas的read_csv函数读取名为'店铺销售分析.csv'的文件,并将数据存储在一个DataFrame对象results_df中。
② 提取数据列
average_prices = results_df['平均价格(元)']
average_sales = results_df['平均销量']
提取列: 这两行代码分别从DataFrameresults_df中提取出'平均价格(元)'和'平均销量'两列的数据,并分别赋值给变量average_prices和average_sales。
③ 绘制散点图
plt.figure(figsize=(10, 6)):设置其尺寸为宽10英寸,高6英寸。
plt.scatter(average_prices, average_sales, alpha=0.6, color='skyblue'):使用matplotlib的scatter函数绘制散点图。其中,average_prices和average_sales为x轴和y轴的数据,alpha=0.6设置了点的透明度,color='skyblue'指定了点的颜色。
④ 添加图表元素
plt.title('店铺平均销量与价格关系散点图'):添加标题
plt.xlabel('平均价格'):x轴标签
plt.ylabel('平均销量'):y轴标签
⑤ 显示网格和图形
plt.grid(True): 在图表上启用网格线
plt.show():显示所创建的图表
(5)绘制不同价格区间在各地域的销售热度图
① 数据准备
sales_by_price_and_local = df.groupby(['价格区间', '发货地'])['数字销量'].sum().reset_index():使用Pandas的groupby方法对DataFrame df按照'价格区间'和'发货地'两个列进行分组。
对每个组,通过.sum()方法求出'数字销量'的总和,这意味着你会得到每个价格区间和发货地组合的销售总量。reset_index()方法将分组后的多级索引转换为常规的列,便于后续操作。
② 构建热度图
plt.figure(figsize=(10, 8)) # 设置图形大小
sns.heatmap(sales_by_price_and_local.pivot_table(index='价格区间', columns='发货地', values='数字销量', fill_value=0),annot=True, fmt=".1f", cmap="YlGnBu"):pivot_table函数将上面分组求和后的DataFrame转换为交叉表(表格中,index'价格区间',columns'发货地',values为对应的'数字销量',fill_value=0 表示如果某些交叉组合没有数据,则用0填充。
- sns.heatmap(...) 使用Seaborn库绘制热力图。
- annot=True 会在每个单元格显示具体的数值。
- fmt=".1f" 控制数值的显示格式,这里保留一位小数。
- cmap="YlGnBu" 指定热力图的颜色映射,"YlGnBu"是一种从黄色渐变到蓝色的颜色映射,适合展示从低到高的数据分布。
③ 图形美化和显示
plt.title('不同价格区间在各地域的销售热度图') # 设置图表标题
plt.ylabel('价格区间') # 设置y轴标签
plt.xlabel('地域') # 设置x轴标签
plt.show() # 显示图形
(5)绘制按价格区间和发货地分列的销售量折线图
① 数据重塑
pivot_df = df.pivot_table(index='价格区间', columns='发货地', values='数字销量', aggfunc=np.sum):使用pivot_table函数对DataFrame df进行重塑;index='价格区间' 每一行代表一个不同的价格区间;columns='发货地' 每一列对应一个不同的发货地;values='数字销量' 指定要汇总的值是'数字销量'这一列;aggfunc=np.sum 计算每个价格区间和发货地组合的销售量总和。
② 缺失值处理
pivot_df.fillna(0, inplace=True):使用fillna方法将数据中的任何缺失值(NaN)替换为0,这在数据可视化中很常见,以避免因缺失值导致绘图错误;inplace=True 参数意味着直接在原始DataFrame上进行修改
③ 可视化
pivot_df.plot(kind='bar', figsize=(12, 6));使用plot函数绘制条形图,kind='bar'指定绘制条形图;figsize=(12, 6)设置图表的尺寸为宽12英寸,高6英寸,以确保图表有足够的空间展示数据。
④ 图形美化和标签设置
plt.title('按价格区间和发货地分列的销售量') # 设置图表的标题
plt.xlabel('价格区间') # x轴的标签
plt.ylabel('销售量') # y轴的标签
plt.legend(title='发货地') # 图例标题为'发货地'
plt.show()
(6)绘制销量中位数最高的前十大商店柱形图
① 计算每个商店的价格中位数:
median_prices = df.groupby('商店名')['价格(元)'].median():使用pandas的groupby方法按商店名对数据集df进行分组,然后对每个组的价格(元)列计算中位数。结果是一个Series,其中索引为商店名,值为相应商店的价格中位数。
② 选取价格中位数排名前二十的商店:
top_10_stores = median_prices.sort_values(ascending=False).head(20):使用sort_values方法将上一步得到的中位数Series按照值进行降序排序。使用head(20)选取排序后的前20个值。
③ 绘制柱状图:
plt.figure(figsize=(10, 6)):设置图表的尺寸为10英寸宽,6英寸高
top_10_stores.plot(kind='bar', color='skyblue'):调用plot方法绘制柱状图,其中kind='bar'指定了图表类型为柱状图,color='skyblue'设置了柱子的颜色。
④ 添加图表标题和轴标签:
plt.title('价格中位数最高的前十大商店'):图表的标题
plt.xlabel('商店名'):x轴的标签
plt.ylabel('价格中位数'):y轴的标签
⑤ 优化横坐标显示:
plt.xticks(rotation=45, ha='right'):避免x轴标签(商店名)重叠,这行代码旋转了x轴标签文本45度,并将文本对齐方式设置为右对齐(ha='right')。
⑥ 自动调整布局并显示图形:
plt.tight_layout():自动调整子图参数,以确保图表元素之间没有重叠
plt.show()
(7)绘制各商店销量占总销量的百分比条形图
① 按百分比销量降序排序(可选):
df_sorted = df.sort_values(by='百分比销量', ascending=False):根据每个商品的百分比销量从高到低重新排序数据框,使得后续的图表更加直观。
② 绘制百分比条形图:
plt.figure(figsize=(10, 6)) # 设置图表尺寸
plt.bar(df_sorted.index, df_sorted['百分比销量']) # 绘制条形图,x轴为商品索引,y轴为百分比销量
plt.ylabel('百分比销量 (%)') # 设置y轴标签
plt.title('各商店销量占总销量的百分比') # 设置图表标题
plt.xticks(rotation=45) # 旋转x轴标签文本,防止标签重叠
plt.show() # 显示图表
(8)绘制产品列表及卖点出现情况柱形图
(9)绘制卖点生成词云
① 定义函数:首先,定义一个名为keep_numbers的函数,其作用是从给定文本中筛选出所有的数字和字母,保证这些内容不会被当作无意义的词语过滤掉。
② 处理文本:使用keep_numbers函数处理读取到的文本,这一步会去除所有非数字和非字母字符,仅保留这些信息以便后续生成词云。
③ 生成词云设置:配置词云的各项参数,比如指定中文字体路径以支持中文显示,设定背景颜色、最大词数、图像尺寸等。
④ 创建词云:基于处理过的文本(即保留了数字和字母的文本),使用WordCloud库生成词云对象。这一步会统计文本中各词汇出现的频率,并据此生成视觉化的词云图。
⑤ 展示结果:使用matplotlib库展示生成的词云图,通过调整图像的布局使之适配窗口,并隐藏坐标轴以获得更佳的视觉效果。
(10)绘制数字销量与发货地的柱形图
9、特征工程
(1)解析数字销量、价格和发货地
① 数据清洗 - 转换数字销量并处理异常值:
df['数字销量'] = pd.to_numeric(df['数字销量'], errors='coerce') :使用pd.to_numeric()尝试将'数字销量'列转换为数值类型
df.dropna(subset=['数字销量'], inplace=True) :删除那些在'数字销量'列中为NaN的行
② 特征缩放 - 对价格进行标准化:
df[['价格(元)']] = scaler.fit_transform(df[['价格(元)']]):
fit_transform()方法首先计算'价格(元)'列的统计量(均值和标准差),然后基于这些统计量将价格数据进行标准化变换。
③ 独热编码 - 对类别特征'发货地'进行编码:
df = pd.get_dummies(df, columns=['发货地']):对分类变量(这里是'发货地')进行独热编码(One-Hot Encoding)。这个过程会为'发货地'列中的每一个唯一类别创建一个新的二进制列,如果某行原始数据中存在该类别,则新列的值为1,否则为0。这样做可以使得模型能够理解并利用类别特征之间的差异。
④ 保存处理后的数据:
df.to_csv('taobao_encoded.csv',index=False,encoding='utf-8-sig'):将经过上述预处理的DataFrame保存为CSV文件,命名为taobao_encoded.csv。index=False表示不保存DataFrame的索引列,encoding='utf-8-sig'是为了确保在中文环境中文件能够正确地被其他软件识别和读取。
(2)南北销量占比饼状图
① 计算南北销量:得到北方总销量north_sales和南方总销量south_sales。
② 准备南北销量占比数据:创建一个字典sales_data,其中键为区域('北方'、'南方'),值分别为对应的销量。提取字典的键(区域标签)到labels变量,销量值到sizes变量,为后续绘图做准备。
③ 绘制饼状图:使用matplotlib库来绘制饼状图,展示南北销量的占比。
plt.figure(figsize=(8, 6)):设置图形的尺寸为8英寸宽,6英寸高。
plt.pie(sizes,labels=labels,autopct='%1.1f%%', startangle=140)绘制饼图,其中:
- sizes是每个部分的大小(即销量),
- labels是每个部分的标签(即南北方向),
- autopct='%1.1f%%'自动显示百分比,保留一位小数,
- startangle=140设定饼图的起始角度,改变饼图的初始切口位置,增加可读性。
- plt.axis('equal')确保饼图呈圆形,而不是椭圆。
- plt.title('南北销量占比')为图表设置标题。
(3)展示各方位销量的分布情况一直箱线图
① 设置图形大小
plt.figure(figsize=(10, 6)):首先,设置matplotlib图形的尺寸为宽度10英寸,高度6英寸,以便于更好地展示数据。
② 绘制箱线图
- sns.boxplot(x='方位', y='数字销量', data=df, palette='Set2'):这一行代码使用Seaborn库的boxplot函数来绘制箱线图。
- x='方位':指定x轴变量为数据框df中的'方位'列,用于区分不同的组别(北方和南方)。
- y='数字销量':指定y轴变量为'数字销量',即需要分析的数值型数据。
- data=df:指定数据来源是DataFramedf。
- palette='Set2':设置调色板为'Set2',这会影响到箱线图中不同类别的颜色,以增强区分度。
③ 添加图表元素
plt.title('不同方位的数字销量分布'):为图表添加标题,说明图表展示的是不同方位的数字销量分布情况。
plt.ylabel('数字销量'):设置y轴的标签为“数字销量”,明确y轴代表的含义。
plt.xlabel('方位'):设置x轴的标签为“方位”,表明横轴区分的是不同的方位类别。
④ 显示图表
plt.show():最后,显示之前配置好的箱线图。
(4)结合价格(元)和数字销量相关性热图
① 计算相关系数矩阵
corr_matrix = df[['价格(元)', '数字销量']].corr():这一行代码从原始数据框df中选取了'价格(元)'和'数字销量'两列,然后使用Pandas的.corr()方法计算这两列之间的相关系数矩阵。由于只选了两列,所以这个矩阵实际上是一个2x2的相关系数矩阵,对角线上的值都是1(因为任何变量与自身完全相关),非对角线上的值表示两变量之间的皮尔逊相关系数,范围从-1到1。
② 绘制相关性热图
plt.figure(figsize=(8, 6)):设置图形大小为宽度8英寸,高度6英寸。
sns.heatmap(corr_matrix,annot=True,cmap='coolwarm',linewidths=.1):
- sns.heatmap(...):使用Seaborn的heatmap函数来绘制热图。
- annot=True:开启热图中每个单元格的注释,直接在图上显示具体的相关系数数值。
- cmap='coolwarm':指定颜色映射方案为'coolwarm',颜色从冷色调(蓝色,表示负相关)过渡到暖色调(红色,表示正相关),便于观察相关性的正负及其强度。
- linewidths=.1:设置单元格之间的线条宽度为0.1,增加热图的可读性。
plt.title('变量间相关性热图'):为热图添加标题,说明这是展示两个变量间相关性的图表。
plt.show():最后,显示热图。
(5)绘制发货地与价格的箱线图
① 设置图形尺寸
plt.figure(figsize=(10, 6)):这行代码设置了图表的大小为宽度10英寸,高度6英寸,使得图表有足够的空间清晰展示数据。
② 绘制箱线图
sns.boxplot(x='发货地', y='价格(元)', data=df):使用了Seaborn库的boxplot函数来绘制箱线图。
- x='发货地':指定x轴变量为“发货地”,这意味着箱线图的各个箱体会按不同的发货地点分组。
- y='价格(元)':指定y轴变量为“价格(元)”。
- data=df:指定了使用的数据源是df数据框。
③ 添加图表标题和坐标轴标签
plt.title('不同发货地的价格分布'):为图表添加主标题,说明图表展示的是不同发货地之间的价格分布情况。
plt.ylabel('价格(元)'):设置y轴的标签为“价格(元)”,明确y轴代表的数据意义。
plt.xlabel('发货地'):设置x轴的标签为“发货地”,表明x轴上分类的依据。
(6)绘制发货地与数字销量的箱线图
(7)绘制价格与数字销量的散点图
sns.lmplot(x='价格(元)', y='数字销量', data=df, hue='发货地', palette='Set2', scatter_kws={'alpha': 0.6}):
- x='价格(元)', y='数字销量': 分别指定x轴和y轴的变量,这里是研究价格与数字销量的关系。
- data=df: 指定绘图所用的数据集为df。
- hue='发货地': 根据"发货地"对点进行颜色区分,这样可以直观地看到不同发货地在价格-销量平面上的分布情况。
- palette='Set2': 设置调色板为'Set2',这是一种预设的颜色方案,用于给不同的分类(此处为不同的发货地)分配不同的颜色。
- scatter_kws={'alpha': 0.6}: 设置散点图中点的透明度(alpha值)为0.6,这样当数据点重叠时,可以更清晰地看出点的密集程度。
(8)预测商品的“数字销量”(目标变量)基于商品的其他特征
① 特征定义:首先定义了三类特征处理的变量。
- 文本特征:指定了text_features列表,包含标题, 卖点1, 卖点2列,计划使用TF-IDF向量化进行文本特征提取,并使用中文停用词过滤不携带重要信息的词汇。
- 类别特征:在categorical_features列表中定义了商店名, 发货地, 方位列,计划通过One-Hot编码转换为模型可以理解的数值型特征。
- 数值特征:通过numeric_features列出价格(元)这一数值型特征,并决定直接传递(passthrough)不做变换。
② 预处理器与管道构建:
- 创建了一个简化的预处理器simple_preprocessor,仅包含了数值特征的处理步骤,使用了passthrough转换器,意味着数值特征直接传递到模型中,而不进行额外变换。
- 构建了一个机器学习管道(Pipeline),该管道包含两个步骤:预处理阶段应用了simple_preprocessor,模型阶段使用了随机森林回归器(RandomForestRegressor),设置了100棵树和随机种子42以确保结果的可复现性。
③ 数据验证与划分:
- 打印出原始数据集的列名以及目标变量数字销量的前几行,确保数据加载正确。
- 分割数据集为训练集(X_train, y_train)和测试集(X_test, y_test),测试集占总数据的20%,使用固定的随机种子保证结果的一致性。
④ 模型训练与预测:
- 尝试拟合简化版管道到训练数据上,如果成功,则输出成功信息,并继续进行预测。
- 对测试集进行预测,得到预测销量y_pred。
⑤ 模型评估:
- 计算预测结果与实际销量之间的均方误差(MSE)、均方根误差(RMSE)和决定系数(R² Score),这些是评估回归模型性能的常用指标。
- 将评估结果以文本形式组织并写入到模型评价结果.txt文件中,便于后续查阅。
⑥ 异常处理:
整个拟合和预测过程被包裹在try-except语句中,以捕获并打印任何可能发生的异常,确保程序不会因为未预料的错误而直接崩溃。
(9)绘制预测值与实际值的散点图
plt.figure(figsize=(10, 6)) # 设置图形大小为宽10英寸、高6英寸
sns.scatterplot(x=y_test, y=y_pred, alpha=0.6)
- x=y_test 表示横轴数据为实际销量值。
- y=y_pred 表示纵轴数据为预测销量值。
- alpha=0.6 设置了点的透明度,使得点与点重叠时可以清晰看到密度分布,透明度值范围从0(完全透明)到1(完全不透明)。
plt.plot([y_test.min(),y_test.max()],[y_test.min(),y_test.max()], linestyle='--', color='k'):在同一个图表上添加了一条直线,代表理想情况下的完美预测线(即预测值等于实际值)。
- 线的两个端点分别是y_test的最小值和最大值,确保线覆盖了所有数据点的范围。
- linestyle='--'设置了线的样式为虚线。
- color='k'指定了线的颜色为黑色("k"代表黑色)。
plt.title('实际销量 vs 预测销量') # 设置图表标题
plt.xlabel('实际销量') # 设置横轴标签
plt.ylabel('预测销量') # 设置纵轴标签
plt.show() # 显示图表
(10)绘制残差分布图:评估模型是否具有较好的预测准确性和稳健性的一个重要指标
① 计算残差:通过实际值减去预测值得到模型预测的误差。
② 使用 seaborn 的 histplot 函数绘制残差的直方图,并开启核密度估计(KDE),以更好地展示残差的分布情况。
③ 图表标题和轴标签提供了对图表内容的明确说明。
(11)绘制残差与预测值的关系图:分析残差与预测值之间是否存在系统性的关系。
① 使用散点图 (scatter) 展示预测值与相应残差之间的关系。
② 添加一条水平线 y=0(红色虚线),作为理想情况下所有残差都应围绕的中心线,帮助识别残差是否有规律地偏离零。
③ 透明度设置(alpha=0.6)使得点密集区域的颜色更深,有助于观察点的分布密度。
(12)绘制特征重要性图:展示模型使用的各个特征对于预测目标的重要性排名
① 从已经训练好的模型中提取特征重要性得分。
② barh 函数绘制的是水平条形图,其中横坐标表示特征重要性得分,纵坐标为特征名称。
③ 蓝色条形图直观地展现了不同特征的重要性差异,条形越长,特征越重要。
10.结论与建议
经过本次实践项目的深入研究,我成功实现了对淘宝商品数据的爬取、预处理、特征工程、模型建立与可视化分析,通过Python实践,熟练掌握了Pandas、Matplotlib、Seaborn、Numpy和Sklearn等库的使用。主要成就包括:
1. 数据分析能力提升:熟练掌握了Pandas库的使用,能够高效地进行数据清洗、筛选、聚合等操作,为后续分析奠定了坚实基础。通过Pandas的灵活运用,不仅完成了数据的快速概览,还进行了列名的修改和数据的保存,提高了数据处理的效率。
2. 数据可视化技能:熟悉了matplotlib和seaborn库的基本操作流程,实现了数据的可视化展示。通过绘制发货地与销量的箱线图、价格与销量的散点图,直观揭示了数据间的关联与分布特点。此外,利用词云图展示了卖点的频率分布,增强了数据的可读性和吸引力。
3. 机器学习实践:成功应用了sklearn库进行特征工程和模型构建,实现了商品销量的预测。通过对特征的合理选择与预处理(包括数值特征的标准化、类别特征的独热编码),构建了随机森林回归模型。模型训练与预测结果显示,模型具备一定的预测能力,能够基于商品特征预测其销量,为电商运营决策提供了数据支持。
4. 异常处理与优化:在模型训练和预测过程中,实施了全面的异常处理机制,确保了程序的稳定运行。通过计算模型评估指标(如MSE、RMSE、R² Score),我能够量化模型性能,为进一步优化提供依据。
建议
1、数据收集:未来可以扩大数据采集范围,增加样本量,提升模型的泛化能力,同时注意数据时效性,定期更新数据以反映市场最新趋势。
特征选择与工程:进一步探索更多潜在特征,如用户评价、商品图片特征等,可能对销量预测有重要影响。优化特征选择策略,如使用递归特征消除、特征重要性筛选等方法,精简模型并提升预测效率。
2、模型优化:尝试更多机器学习算法和深度学习模型,比如梯度提升树、神经网络等,对比不同模型的预测效果,选取最优模型。同时,考虑集成学习方法提高预测的稳定性和准确性。
3、实时监控与反馈机制:建立模型在线预测与监控系统,实时跟踪预测效果,及时调整模型参数,应对市场变化。
用户体验与商业策略:基于预测结果,为商家提供定制化建议,如调整价格策略、优化发货地布局、改进商品卖点提炼等,提升用户体验和市场竞争力。
4、深度分析与报告:对预测结果进行更深入的解读与分析,形成定期报告,为管理层提供决策支持,推动业务增长。
综上所述,本次实践不仅加深了对Python数据分析与机器学习技术的理解,也为我提供了宝贵的实战经验。未来,通过持续优化模型与方法,可望在电商数据分析领域取得更多实用成果。