手机销售数据分析

手机销售数据分析手机销售数据分析本文数据来源于网友从淘宝爬取的全网手机销售数据,包括cellphone.csv(淘宝网在售的手机商品信息),count_add_comments.csv(手机商品的评价信息),comments.csv(手机商品的具体评价)数据介绍查看数据详细信息importpandasaspdimportnumpyasnpimporttimephone=pd.read_csv(‘cellphone.csv’)add_comments=pd.read_csv(‘count_add



手机销售数据分析

注: 本文基于Python 实战之淘宝手机销售分析
进行修改。
本文数据来源于网友从淘宝爬取的全网手机销售数据,包括cellphone.csv(淘宝网在售的手机商品信息),count_add_comments.csv(手机商品的评价信息),comments.csv(手机商品的具体评价)

数据介绍

查看数据详细信息

import pandas as pd
import numpy as np
import time
phone=pd.read_csv('cellphone.csv')
add_comments=pd.read_csv('count_add_comments.csv')
comments=pd.read_excel('comments.xlsx')
print(phone.info())
print(add_comments.info())
print(comments.info())

cellphone.csv的数据详细信息如下:
在这里插入图片描述
count_add_comments.csv的数据详细信息如下:
在这里插入图片描述
comments.csv的数据详细信息如下:
在这里插入图片描述

分析思路

:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}

手机销售数据

手机销售数据

度量

分类数据

时间

商品参数

后置摄像头_清晰度

摄像头类型_摄像头个数

网络类型_2g/3g/4g/5g

网络模式_单卡/双卡

运行内存RAM

存储容量

品牌

发货地址

发货城市

发货省份

价格等级

评价内容

爬取时间

商品发布时间

评价时间

累计评价数_总销量

商品现价

商品原价

商品折扣

总销售额

月销量

库存

评分

收藏数

评分

图片

追评

手机品牌统计_词云

手机价格区间统计_直方图

TOP10品牌 手机价格等级构成_堆积柱形图

各个品牌下商品现价与原价对比_分组条形图

各个品牌下收藏数与商品现价的关系_折线图_研究用户是否能突破品牌限制而只关心商品现价而进行收藏商品

各个品牌下销量与商品现价的关系_折线图_研究用户是否能突破品牌限制而只关心商品现价而进行购买商品

各个品牌的总销量_条形图

各发货省销售情况_地图

不同价格等级下的总销量_饼图_从总体上研究价格与销量关系

不同价格等级下的总销售额_饼图_从总体上研究价格与总销售额关系

数据清洗

  • 对导入后的phone数据集进行清洗

在这里插入图片描述
由上表,发现存在空白列,并且商品描述、月销量、库存、评分、累计评价数存在缺失值

  1. 删除空白列
phone=phone.drop(columns=['Unnamed: 19'])
  1. 先获取列名,在此基础上进行更改
phone.columns=['爬取时间', '爬取链接', '商品ID', '商品名称',
       '商品描述', '商品参数', '商品现价',
       '商品原价', '月销量', '库存',
       '发货地址', '商品发布时间',
       '店铺ID', '店铺名称', '商品链接URL', '评分',
       '收藏数' ,'累计评价数', '商品评价印象标签']
  1. 将月销量、库存、累计评价数为null用0填充
phone['月销量']=phone['月销量'].fillna(0)
phone['库存']=phone['库存'].fillna(0)
phone['累计评价数']=phone['累计评价数'].fillna(0)
  1. 删除评分为null的样本
phone.dropna(subset=['评分'])
  • 对add_comments和 phone 进行数据合并,并尽心初步清洗
  1. 对add_comments和 phone 进行数据合并
df=pd.merge(phone,add_comments,left_on='商品ID',right_on='ID(id)')
print(df.info())

合并后的数据如下:
在这里插入图片描述
6. 重命名并删除多余的列

df.columns=['爬取时间', '爬取链接', '商品ID', '商品名称',
       '商品描述', '商品参数', '商品现价',
       '商品原价', '月销量', '库存',
       '发货地址', '商品发布时间',
       '店铺ID', '店铺名称', '商品链接URL', '评分',
       '收藏数' ,'累计评价数', '商品评价印象标签','图片', '追评', 'ID(id)', 'Unnamed: 3']
df=df.drop(columns=['Unnamed: 3'])
df=df.drop(columns=['ID(id)'])
  1. 清洗时间参数
df['商品发布时间']=df['商品发布时间'].apply(lambda op:time.strftime('%Y-%m-%d',time.localtime(op)))

  1. 清洗价格数据
def get_prices(s):
       price=s.split('-')
       l=[float(i) for i in price]
       return np.mean(l)
df['商品现价']=df['商品现价'].apply(get_prices)
df['商品原价']=df['商品原价'].apply(get_prices)
  1. 清洗发货城市数据
pro_list=['北京',
 '天津',
 '上海',
 '重庆',
 '河北',
 '山西',
 '辽宁',
 '吉林',
 '黑龙江',
 '江苏',
 '浙江',
 '安徽',
 '福建',
 '江西',
 '山东',
 '河南',
 '湖北',
 '湖南',
 '广东',
 '海南',
 '四川',
 '贵州',
 '云南',
 '陕西',
 '甘肃',
 '青海',
 '台湾',
 '内蒙古',
 '广西',
 '西藏',
 '宁夏',
 '新疆',
 '香港',
 '澳门']

def get_city(address):
       for i in pro_list:
              if i in address:
                     city=address.replace(i,'')
                     if len(city)==0:
                            city=i
       return city
def get_province(address):
       for i in pro_list:
              if i in address:
                     province=i
       return province
df['发货城市']=df['发货地址'].apply(get_city)
df['发货省份']=df['发货地址'].apply(get_province)
  1. 价格分箱
def get_price_level(p):
    level=p//1000
    if level==0:
        return '0~999'
    if level==1:
        return '1000~1999'
    if level==2:
        return '1999~2999'
    if level==3:
        return '2999~3999'
    if level==4:
        return '3999~4999'
    if level>=5:
        return '5000+'
    else:
        return '计算出错'
df['价格等级']=df['商品现价'].apply(get_price_level)
  1. 手机参数信息提取
target=['后置摄像头',
 '摄像头类型',
 '视频显示格式',
 '分辨率',
 '触摸屏类型',
 '屏幕尺寸',
 '网络类型',
 '网络模式',
 '键盘类型',
 '款式',
 '运行内存RAM',
 '存储容量',
 '品牌',
 '华为型号',
 '电池类型',
 '核心数',
 '机身颜色',
 '手机类型',
 '操作系统',
 'CPU品牌',
 '产品名称']
for t in target:
    def get_pram(p):
        for i in eval(p):
            if i['label']==t:
                return i['value']
    df[t]=df['商品参数'].apply(get_pram)

  • 将处理后的数据存储为”处理后的数据.xlsx”
df.to_excel('处理后的数据.xlsx')

数据可视化

导入数据,删除多余的列

import pandas as pd
import numpy as np
data=pd.read_excel('处理后的数据.xlsx')
data.drop(columns=['Unnamed: 0'],inplace=True)

删除价格异常的样本

# 计算下四分位数和上四分位
Q1 = data['商品现价'].quantile(q = 0.25)
Q3 = data['商品现价'].quantile(q = 0.75)
# 基于1.5倍的四分位差计算上下须对应的值
low_whisker = Q1 - 1.5*(Q3 - Q1)
up_whisker = Q3 + 1.5*(Q3 - Q1)
# 寻找异常点
data=data.drop(data['商品现价'][(data['商品现价']> up_whisker) | (data['商品现价'] < low_whisker)].index)
print(data)

导入相关的可视化库

import matplotlib.pyplot as plt
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.charts import WordCloud
from pyecharts.charts import Scatter
from pyecharts.charts import Line
from pyecharts.charts import Pie
from pyecharts.charts import Geo
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ChartType
1. 淘宝在售手机价格区间统计
sales=data['价格等级'].value_counts()
sales_bar=Bar()
sales_bar.add_xaxis(list(sales.index))
sales_bar.add_yaxis('价格等级',list(sales.values.astype(float)))
sales_bar.render('sales_bar.html')

结果如下:
在这里插入图片描述
由图可得,价格为1000~1999元的手机最多。

2. 绘制手机品牌词云图
word_count=data['品牌'].value_counts()
nameciyu=WordCloud(init_opts=opts.InitOpts(width='880px',height='500px'))
nameciyu.add('',[list(z) for z in zip(word_count.index,
                                      word_count.values.astype(float))])
nameciyu.set_global_opts(title_opts=opts.TitleOpts(title='手机品牌词云图',pos_left='15%'))
nameciyu.render('nameciyu.html')

结果如下:
在这里插入图片描述
由图可得,淘宝网上,华为品牌的商品条目数量是最多的,其次是荣耀品牌的商品条目数量。

3. TOP10品牌 手机价格等级构成
  • 进行数据集处理
#找出销售量top10的品牌
data1=data.groupby('品牌')['累计评价数'].sum().sort_values(ascending=False)[0:10]
# 从data数据集中挑出品牌为top10品牌的手机
data2 = pd.DataFrame(columns =data.columns.tolist())
for i in data1.index:
    temp=data[data['品牌']==i]
    data2=pd.concat([temp,data2])  # 向下拼接

scale1=data2[data2['价格等级']=='0~999'].groupby('品牌')['价格等级'].count().reset_index()
scale2=data2[data2['价格等级']=='1000~1999'].groupby('品牌')['价格等级'].count().reset_index()
scale3=data2[data2['价格等级']=='1999~2999'].groupby('品牌')['价格等级'].count().reset_index()
scale4=data2[data2['价格等级']=='2999~3999'].groupby('品牌')['价格等级'].count().reset_index()
scale5=data2[data2['价格等级']=='3999~4999'].groupby('品牌')['价格等级'].count().reset_index()
scale6=data2[data2['价格等级']=='5000+'].groupby('品牌')['价格等级'].count().reset_index()
scale_data=pd.merge(scale1,scale2,on='品牌',how='outer')
scale_data=pd.merge(scale_data,scale3,on='品牌',how='outer')
scale_data=pd.merge(scale_data,scale4,on='品牌',how='outer')
scale_data=pd.merge(scale_data,scale5,on='品牌',how='outer')
scale_data=pd.merge(scale_data,scale6,on='品牌',how='outer')
scale_data.columns=['品牌','0~999','1000~1999','1999~2999','2999~3999','3999~4999','5000+']
scale_data.fillna(0,inplace=True)
print(scale_data)

处理后结果集如下:

在这里插入图片描述

  • 画出价格等级构成堆积图
duiji_bar=Bar(init_opts=opts.InitOpts(width='1200px',height='600px'))
duiji_bar.add_xaxis(scale_data['品牌'].tolist())
duiji_bar.add_yaxis('0~999',scale_data['0~999'].tolist(),stack='stack1')
duiji_bar.add_yaxis('1000~1999',scale_data['1000~1999'].tolist(),stack='stack1')
duiji_bar.add_yaxis('1999~2999',scale_data['1999~2999'].tolist(),stack='stack1')
duiji_bar.add_yaxis('2999~3999',scale_data['2999~3999'].tolist(),stack='stack1')
duiji_bar.add_yaxis('3999~4999',scale_data['3999~4999'].tolist(),stack='stack1')
duiji_bar.add_yaxis('5000+',scale_data['5000+'].tolist(),stack='stack1')
duiji_bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
duiji_bar.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts={ 
   "rotate":25}))
duiji_bar.render("duiji_bar.html")

结果如下:
在这里插入图片描述

4. 不同品牌手机现价&原价对比
price1=data.groupby('品牌')['商品原价'].mean().reset_index()
price2=data.groupby('品牌')['商品现价'].mean().reset_index()
price=pd.merge(price1,price2,on='品牌')

compare_bar=Bar(init_opts=opts.InitOpts(width='1000px',height='600px'))
compare_bar.add_xaxis(list(price['品牌']))
compare_bar.add_yaxis('商品原价',list(np.round(price['商品原价'],2)),gap='20%',category_gap='50%')
compare_bar.add_yaxis('商品现价',list(np.round(price['商品现价'],2)),gap='20%',category_gap='50%')
compare_bar.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts={ 
   "rotate":90}))
compare_bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
compare_bar.render('compare_bar.html')

结果如下:
在这里插入图片描述
由图形可得,华为品牌的手机,原价与现价相比,差距最大。

5. 收藏数与价格的关系(从品牌的角度)

以价格(每一品牌的价格平均值)为x轴,收藏数(每一品牌的收藏数平均值)为y轴,画出收藏数与价格的关系折现图。

# 数据处理(算出每一品牌的商品价格平均值和每一品牌的商品收藏数平均值)
sale=data.groupby('品牌')['商品现价'].mean().reset_index()
store=data.groupby('品牌')['收藏数'].mean().reset_index()
store_sale=pd.merge(sale,store,on='品牌')
store_sale.sort_values(by='商品现价',inplace=True)
store_sale=store_sale.drop(store_sale[store_sale['收藏数']>10000].index)
#画出折线上的折点
store_sale_scatter=Scatter()
store_sale_scatter.add_xaxis(list(np.round(store_sale['商品现价'],2)))
store_sale_scatter.add_yaxis('收藏数',store_sale[['收藏数','品牌']].values.tolist()) #每个折点上的提示框既有商品价格,又有商品收藏数,还有商品品牌
store_sale_scatter.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
store_sale_scatter.set_global_opts(xaxis_opts=opts.AxisOpts(name='商品现价(元)',type_='value'))
#画出折线
store_sale_line=Line()
store_sale_line.add_xaxis(list(np.round(store_sale['商品现价'],2)))
store_sale_line.add_yaxis('收藏数',store_sale['收藏数'].values.tolist())
store_sale_line.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
store_sale_line.set_global_opts(xaxis_opts=opts.AxisOpts(name='商品现价(元)',type_='value'))
store_sale_line.set_global_opts(tooltip_opts=opts.TooltipOpts(formatter='价格,收藏数,品牌:{c}'))
store_sale_line.overlap(store_sale_scatter).render('store_sale_line.html')

结果如下:
在这里插入图片描述
有图形可得,对于不同品牌,价格并不是客户收藏的重要关注点。

6. 销量与价格的关系(从品牌的角度)

类似于分析收藏数与价格的关系,同样使用折线图研究销量与价格的关系

sale=data.groupby('品牌')['商品现价'].mean().reset_index()
number=data.groupby('品牌')['累计评价数'].mean().reset_index()
number_sale=pd.merge(sale,number,on='品牌')
number_sale.sort_values(by='商品现价',inplace=True)
number_sale=number_sale.drop(number_sale[number_sale['累计评价数']>10000].index)

number_sale_scatter=Scatter()
number_sale_scatter.add_xaxis(list(np.round(number_sale['商品现价'],2)))
number_sale_scatter.add_yaxis('销量',number_sale[['累计评价数','品牌']].values.tolist())
number_sale_scatter.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
number_sale_scatter.set_global_opts(xaxis_opts=opts.AxisOpts(name='商品现价(元)',type_='value'))

number_sale_line=Line()
number_sale_line.add_xaxis(list(np.round(number_sale['商品现价'],2)))
number_sale_line.add_yaxis('销量',number_sale['累计评价数'].values.tolist())
number_sale_line.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
number_sale_line.set_global_opts(xaxis_opts=opts.AxisOpts(name='商品现价(元)',type_='value'))
number_sale_line.set_global_opts(tooltip_opts=opts.TooltipOpts(formatter='价格,销量,品牌:{c}'))
number_sale_line.overlap(number_sale_scatter).render('number_sale_line.html')

结果如下:
在这里插入图片描述
图形证明,并不是所有品牌商品价格越低,销量就越高,只是针对个别品牌,如波导,誉品,纽曼,优思,小辣椒,这几个品牌的平均价格在1000以内,而销售量占所有品牌前五,而小米,荣耀,苹果这样的大品牌虽然价格较高,但是销售量也是居高,可见,品牌知名度对于销量非常重要。

7. 不同品牌手机总销量比较

爬取数据中并未包含总销售量数据,但根据淘宝的系统设置,无论买家是否主动评价,交易成功后将会自动留下评价信息,故在这里可以视‘累计评价数’为总销售量进行分析;

numbers=data.groupby('品牌')['累计评价数'].sum().sort_values()[20:]
number_bar=Bar(init_opts=opts.InitOpts(width='880px',height='600px'))
number_bar.add_xaxis(list(numbers.index))
number_bar.add_yaxis('',list(numbers.values.astype(float)),label_opts = opts.LabelOpts(position='right',font_size=8))
number_bar.set_global_opts(xaxis_opts=opts.AxisOpts(is_show=False),visualmap_opts=opts.VisualMapOpts(max_=26,pos_right=True))
number_bar.reversal_axis()
number_bar.render('number_bar.html')

结果如下:
在这里插入图片描述
由图可得,华为的总销量是最高的。

8. 各发货省销售情况
provin=data.groupby('发货省份')['累计评价数'].sum()
geo=Geo(init_opts=opts.InitOpts(width='880px',height='600px'))
geo.add_schema(maptype='china')
geo.add('',[list(z) for z in zip(provin.index,provin.values.astype(float))],type_=ChartType.EFFECT_SCATTER)
geo.set_series_opts(label_opts=opts.LabelOpts(font_size=8,formatter='{b}'))  # 显示城市
geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(min_=5000,max_=1000000),title_opts=opts.TitleOpts(title='各发货省销售情况'))
geo.render("geo.html")

结果如下:
在这里插入图片描述
由图可得,相比其他城市,广东省和北京市的销量居高,江苏省销售量也不容小觑。

9. 不同价格等级总销量饼图(总体上)

从总体上,分析不同价格等级的销量。

scale_number=data.groupby('价格等级')['累计评价数'].mean()
scale_number_pie=Pie()
scale_number_pie.add("",[list(z) for z in zip(scale_number.index,np.round(scale_number.values,2))])
scale_number_pie.set_global_opts(legend_opts=opts.LegendOpts(pos_bottom=True),title_opts=opts.TitleOpts(title='不同价格等级总销量饼图',pos_left='38%'))
scale_number_pie.render('scale_number_pie.html')

结果如下:
在这里插入图片描述

由图形得出,从总体上,价格较低时,销量会较高。
其中0-999的价格等级销量最高,2999-3999的价格等级销量居第二,
1000-1999的价格等级销量居第三,接下来为1999-2999,3999-4000,5000+。

10. 不同价格等级总销售额饼图

从总体上,分析不同价格等级的销售额。

data['总销售额']=data['商品现价']*data['累计评价数']
scale_sale=data.groupby('价格等级')['总销售额'].mean()
scale_sale_pie=Pie()
scale_sale_pie.add("",[list(z) for z in zip(scale_sale.index,np.round(scale_sale.values,2))],radius=["40%","75%"])
scale_sale_pie.set_global_opts(legend_opts=opts.LegendOpts(pos_bottom=True),title_opts=opts.TitleOpts(title='不同价格等级总销售额玫瑰图',pos_left='38%'))
scale_sale_pie.render('scale_sale_pie.html')

结果如下:
在这里插入图片描述
图形显示,价格等级为3999-4999的手机总销售额最高,其次为3999-4999,199-2999,令人惊讶的是,在上轮分析中,0-999的销量是最高的,然而总销售在所有价格等级是最低的。

数据建模

  • 探讨离散变量与月销量的关系
    利用卡方统计量筛选出影响月销量的显著离散变量。
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#对原数据进行编码
data_copy=data.copy()
le = LabelEncoder()
data_copy.iloc[:, 0] = le.fit_transform(data_copy.iloc[:, 0])  # 月销量

le = LabelEncoder()
data_copy.iloc[:, 1] = le.fit_transform(data_copy.iloc[:, 1]) # 后置摄像头清晰度

le = LabelEncoder()
data_copy.iloc[:, 2] = le.fit_transform(data_copy.iloc[:, 2].astype(str))  # 摄像头类型(有几个摄像头)

le = LabelEncoder()
data_copy.iloc[:, 3] = le.fit_transform(data_copy.iloc[:, 3])  # 网络类型(2g,3g,4g,5g)

le = LabelEncoder()
data_copy.iloc[:, 4] = le.fit_transform(data_copy.iloc[:, 4])  # 网络模式(单卡,双卡)

le = LabelEncoder()
data_copy.iloc[:, 5] = le.fit_transform(data_copy.iloc[:, 5])  # 运行内存RAM

le = LabelEncoder()
data_copy.iloc[:, 6] = le.fit_transform(data_copy.iloc[:, 6]) # 存储容量

le = LabelEncoder()
data_copy.iloc[:, 7] = le.fit_transform(data_copy.iloc[:, 7]) # 品牌

X = data_copy.iloc[:, 1:]   #特征
y =data_copy.iloc[:,0] #标签
# 使用卡方统计量进行特征筛选
fs = SelectKBest(score_func=chi2, k='all')
fs.fit_transform(X, y)

for i in range(len(fs.pvalues_)):
    print('%s: %f' % (data.columns[i+1], fs.pvalues_[i]))

结果如下:
在这里插入图片描述
由图显示,小于0.05的有存储容量,品牌,则这两变量显著影响月销量。

  • 探讨离散变量与月销量的关系
    利用热力图筛选出影响月销量的显著连续变量。
#对屏幕尺寸进行处理,转化为浮点型,纳入特征值中
df=df[df['屏幕尺寸'].notnull()]
df['屏幕尺寸']=[float(i.replace('英寸','')) for i in df['屏幕尺寸']]

#绘制热力图
df['商品折扣']=df['商品现价']/df['商品原价']
f=df[['商品折扣','商品现价','商品原价','库存','评分','收藏数','累计评价数','追评','屏幕尺寸','图片','月销量']]

corr=f.corr()
plt.figure(figsize=(12,9))
sns.heatmap(corr,annot=True)
plt.show()

结果如下:
在这里插入图片描述
由图显示,收藏数,累积评价数,图片,追评显著影响月销量。

  • 拟合回归模型
# 存储容量,品牌独热编码
data_select=data_copy.iloc[:,6:8]
enc = OneHotEncoder()   # 创建独热编码方法
enc.fit(data_select)
enc1 = enc.transform(data_select).toarray()
one_hot=pd.DataFrame(enc1)
# 独热编码后的变量拼接连续变量
data_select1=df[['月销量','图片','追评','收藏数','累计评价数']].fillna(0)
df_all=pd.concat([one_hot,data_select1],axis=1)
  1. 建立LASSO回归模型
X = df_all.iloc[:,:].fillna(0).values
Y = df['月销量'].fillna(0).values
# 切分训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
# 将数据集进行标准化
std_x = StandardScaler()
X_train = std_x.fit_transform(X_train)
X_test = std_x.transform(X_test)
# 拟合模型
reg = Lasso(alpha = 0.1)
reg.fit(X_train, Y_train)
# 评价模型
score = reg.score(X_test, Y_test) #R^2值
print(score)

result = reg.predict(X_test)
plt.figure()
plt.plot(np.arange(len(result)), Y_test, "go-", label="True value")
plt.plot(np.arange(len(result)), result, "ro-", label="Predict value")
plt.legend(loc="best")
plt.show()

结果如下:
r方值为在这里插入图片描述
拟合图形为
在这里插入图片描述
由两结果,拟合效果优。

  1. 建立其他模型
def model_test(estimators, x_train, x_test, y_train, y_test):
    for key, estimator in estimators.items():
        estimator.fit(x_train, y_train)
        y_predict = estimator.predict(x_test)
        mse = mean_squared_error(y_test, y_predict)
        print('----------------MSE of %s-------------' % (key), mse) # 均方误差(有偏估计)
        scores = estimator.score(x_test, y_test)
        print('----------------Score of %s-------------' % (key), scores) # R方
        print('\n')


estimators = { 
   }
estimators['Linear'] = LinearRegression()
estimators['ridge'] = Ridge()
estimators['forest'] = RandomForestRegressor()
estimators['gbdt'] = GradientBoostingRegressor()


x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.3)

std_x = StandardScaler()
std_y = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)

y_train = std_y.fit_transform(y_train.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))

model_test(estimators, x_train, x_test, y_train, y_test)

结果如下:
在这里插入图片描述
由图显示,岭回归模型的拟合效果同样为优。
有了优秀的模型,只要向模型导入变量,就有很大的可能性能准确预测出手机的月销量。

文本分析

  • 整理出每个评论内容对应的品牌与对应的情感
from snownlp import SnowNLP
import pandas as pd
import numpy as np
df=pd.read_excel("处理后的数据.xlsx")

cmt=pd.read_excel('comments.xlsx')
cmt.columns=['商品ID(id)','评价时间(time)','评价内容(content)','爬取链接(spurl)','爬取时间(sptime)']
cmt=cmt.dropna(subset=['评价内容(content)'])
cmt.index=np.arange(len(cmt))

temp=df[['商品ID','品牌']]
# 通过商品ID,找到评价内容对应的品牌
join_data=pd.merge(cmt,temp,left_on="商品ID(id)",right_on="商品ID")

# 通过情感分析函数,整理出每条评价内容对应的心情
mood=[]
for i in join_data['评价内容(content)']:
    s=SnowNLP(str(i)).sentiments
    if s > 0.6:
        mood.append("positive")
    elif s < 0.4:
        mood.append("negative")
    else:
        mood.append("smooth")
join_data['mood']=mood

#整理出每个品牌下每种情感的总条目数
data=join_data.groupby(['品牌','mood']).count()
data.to_excel('data.xlsx')

部分数据集如下:
在这里插入图片描述
再将其整理成以下形式,保存为data1.xslx:
在这里插入图片描述

  • 画出每种品牌的情感堆积图:
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar
data=pd.read_excel('data1.xlsx')
print(data)
bar=Bar(init_opts=opts.InitOpts(width='1200px',height='600px'))
bar.add_xaxis(data['品牌'].tolist())
bar.add_yaxis('positive',data['positive'].tolist(),stack='stack1')
bar.add_yaxis('negative',data['negative'].tolist(),stack='stack1')
bar.add_yaxis('smooth',data['smooth'].tolist(),stack='stack1')
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
bar.reversal_axis()
bar.render('堆积图.html')

结果如下:
在这里插入图片描述

  • 画出积极情感占比比较图
data['积极情感占比']=data['positive']/(data['positive']+data['negative']+data['smooth'])
data=data.sort_values(by='积极情感占比')
print(data)
bar=Bar(init_opts=opts.InitOpts(width='1200px',height='600px'))
bar.add_xaxis(data['品牌'].tolist())
bar.add_yaxis('积极情感占比',data['积极情感占比'].tolist())
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
bar.reversal_axis()
bar.render('积极情感占比比较.html')

结果如下:
在这里插入图片描述

由图显示,大部分品牌下的手机的评价内容的情感是比较积极偏向的,其中,几米品牌的评价内容为积极情感的占比在所有品牌居最高,而苹果的评价内容为积极情感的占比是最低的。

今天的文章手机销售数据分析分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/26171.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注