Python 实战之淘宝手机销售分析(数据清洗、可视化、数据建模、文本分析)

本文通过对淘宝手机销售数据的清洗,包括处理缺失值、价格、发货城市等,进行了数据可视化分析,如价格区间、品牌销量、情感分析等。数据建模和文本分析部分使用了SnowNLP进行情感分析,并应用LDA主题模型,揭示了手机市场的销售特点和消费者情绪。
摘要由CSDN通过智能技术生成

一、数据介绍

链接: https://pan.baidu.com/s/1GVQ5rv3ElNDLOkaDzuD6Jw 密码:5h6g

本文数据爬取了淘宝全网手机销售数据,其中包括:

  • cellphone.csv
    该数据集包括淘宝网在售的手机商品信息,包括爬取信息、商品信息、评分收藏信息等;
Index Column Non-Null Count Dtype
0 爬取时间(__time) 1691 non-null object
1 爬取链接(__url) 1691 non-null object
2 商品ID(product_id) 1691 non-null int64
3 商品名称(name) 1691 non-null object
4 商品描述(description) 1587 non-null object
5 商品参数(params) 1691 non-null object
6 商品现价(current_price) 1691 non-null object
7 商品原价(original_price) 1691 non-null object
8 月销量(month_sales_count) 1684 non-null float64
9 库存(stock) 1675 non-null float64
10 发货地址(shipping_address) 1691 non-null object
11 商品发布时间(product_publish_time) 1691 non-null int64
12 店铺ID(shop_id) 1691 non-null int64
13 店铺名称(shop_name) 1691 non-null object
14 商品链接URL(url) 1691 non-null object
15 评分(总分5.0分)(score) 1680 non-null float64
16 收藏数(stores_count) 1691 non-null int64
17 累计评价数(comments_count) 1679 non-null float64
18 商品评价印象标签(impresses) 1691 non-null object
19 Unnamed: 19 0 non-null float64
  • count_add_comments.csv
    该数据集包含上述手机商品的评价信息,包含图片的评价条数、追评条数等;
Index Column Non-Null Count Dtype
0 图片(picNum) 1232 non-null float64
1 追评(used) 1176 non-null float64
2 ID(id) 1691 non-null int64
3 Unnamed: 3 0 non-null float64
  • comments.csv
    该数据集包含上数据手机商品的具体评价,包括评价时间、评价内容等;
Index Column Non-Null Count Dtype
0 商品ID(id) 376760 non-null int64
1 评价时间(time) 376760 non-null object
2 评价内容(content) 376759 non-null object
3 爬取链接(spurl) 376760 non-null object
4 爬取时间(sptime) 376760 non-null object
5 Unnamed: 5 0 non-null float64

二、数据清洗

导入数据

  • 发现商品描述、月销量、库存、评分、累计评价数存在缺失
import pandas as pd
import numpy as np

phone=pd.read_csv('cellphone.csv')

add_comments=pd.read_csv('count_add_comments.csv')

缺失值处理+合并

  • 先对phone 进行处理
#删除空白列
phone=phone.drop(columns=['Unnamed: 19'])

#先获取列名,在此基础上进行更改
phone.columns
phone.columns=['爬取时间', '爬取链接', '商品ID', '商品名称',
       '商品描述', '商品参数', '商品现价',
       '商品原价', '月销量', '库存',
       '发货地址', '商品发布时间',
       '店铺ID', '店铺名称', '商品链接URL', '评分',
       '收藏数' ,'累计评价数', '商品评价印象标签']

#商品描述、月销量、库存、评分、累计评价数存在缺失

#查看月销量为0的商品信息
phone[phone['月销量'].isnull()].info()
#对销量为零的数据进行 0 填充
phone['月销量']=phone['月销量'].fillna(0)

#处理库存(0 填充)、评分(删除空白数据)、累计评价数(0填充)
phone['库存']=phone['库存'].fillna(0)
phone['累计评价数']=phone['累计评价数'].fillna(0)
phone=phone.dropna(subset=['评分'])

#重新梳理 index
phone.index=np.arange(len(phone))
  • 再对add_comments和 phone 进行数据合并
df=pd.merge(phone,add_comments,left_on='商品ID',right_on='ID(id)')
  • 最后对合并后的df进行列名梳理,删去重复的商品 ID
df.columns=['爬取时间', '爬取链接', '商品ID', '商品名称',
       '商品描述', '商品参数', '商品现价',
       '商品原价', '月销量', '库存',
       '发货地址', '商品发布时间',
       '店铺ID', '店铺名称', '商品链接URL', '评分',
       '收藏数' ,'累计评价数', '商品评价印象标签','图片', '追评', 'ID(id)', 'Unnamed: 3']
df=df.drop(columns=['Unnamed: 3'])
df=df.drop(columns=['ID(id)'])

清洗时间参数

  • time.localtime():能将 int 格式的时间数据转化
    如:time.localtime(1548475512)
    输出结果:time.struct_time(tm_year=2019, tm_mon=1, tm_mday=26, tm_hour=12, tm_min=5, tm_sec=12, tm_wday=5, tm_yday=26, tm_isdst=0)

  • time.strftime(’%Y-%m-%d’,time.localtime(1548475512)):输出既定格式的时间信息;
    输出结果:‘2019-01-26’

关于时间有关格式化信息
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00-59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身

import time
df['商品发布时间']=df['商品发布时间'].apply(lambda op:time.strftime('%Y-%m-%d',time.localtime(op)))

清洗价格数据

目前得到的‘商品现价’、‘商品原价’两列均为价格区间的表示格式,我们无法获取完整的价格,在此取其均值;

def get_price(s):
    price=s.split('-')
    l=[float(i) for i in price]
    return np.mean(l)
df['商品现价']=df['商品现价'].apply(get_price)
df['商品原价']=df['商品原价'].apply(get_price)

清洗发货城市数据

目前发货城市数据为省+城市名的表示方式,我们要将省份+城市数据提取出来;

#获得中国全部的省级单位名称,找到全部的省级单位
#将每一个地址的省份提取出来,剩下的就是城市
pro_list=['北京',
 '天津',
 '上海',
 '重庆',
 '河北',
 '山西',
 '辽宁',
 '吉林',
 '黑龙江',
 '江苏',
 '浙江',
 '安徽',
 '福建',
 '江西',
 '山东',
 '河南',
 '湖北',
 '湖南',
 '广东',
 '海南',
 '四川',
 '贵州',
 '云南',
 '陕西',
 '甘肃',
 '青海',
 '台湾',
 '内蒙古',
 '广西',
 '西藏',
 '宁夏',
 '新疆',
 '香港',
 '澳门']
def get_city(address):
    for i in pro_list:
        if i in address:
            city=address.replace(i,
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值