Python数据分析:内衣销售哪家强?

前些天,我看到某公司对数据分析师的招聘要求有一条:

分析客户人群的购买习惯,并通过购买习惯做出相关数据分析。

正好我最近在找项目练手,于是我决定研究亚马逊上Top100的细分品类——女(qing)式(qu)内衣的销售情况。

我的分析分为核心的三步:

第一步,爬取商品排名和详情页链接,需要的字段为:排名、商品名、详情页链接

第二步,爬取商品详情,需要的信息为:

    ·店家:这不就是竞争对手吗?分析其爆品情况,保留店家链接,后续可针对性挖掘分析

    ·价格:分析爆品价格区间,对商品定价、切分市场有帮助

    ·上架时间:新品?爆了多久?

    ·星级、评论数、评论标签、所有评论链接:进一步爬取评论内容,来分析爆品的优劣势

    ·尺寸、颜色:也是非常有价值的参考数据,但在实际爬取过程中遇到问题,后面会提到

    ·图片链接:难道你不想看看商品长啥样吗?

第三步,数据转化为可视化图表,并做分析。

文末分享本次研究的所有代码和数据,是不是迫不及待想要看过程了?

d196e882c44e9fa40a68212c1995775.png

如何爬取内衣数据

爬取过程分为三步

1、链接数据库,安排header、代理信息

# 0、创建数据库
client = pymongo.MongoClient('localhost', 27017)
Amazon = client['Amazon']
item_info_M = Amazon['item_info_M']
# 0、反爬措施
headers  = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/
    72.0.3626.109 Safari/537.36'
}
# http://cn-proxy.com/
proxy_list = [
    'http://117.177.250.151:8081',
    'http://111.85.219.250:3129',
    'http://122.70.183.138:8118',
    ]
proxy_ip = random.choice(proxy_list) # 随机获取代理ip
proxies = {'http': proxy_ip}

2、爬取商品列表页和详情页

f5ab387143a98e4416f3fe66e4eb04d.png

核心事项:

1)构建函数来获取单个商品的详细信息;

2)利用for循环,遍历商品详情页链接列表,来获取每个商品的详细信息

def get_item_info_2(item_url,data):
    wb_data = requests.get(item_url, headers=headers, proxies=proxies)
    soup = BeautifulSoup(wb_data.text, 'lxml')
    #获取price(需要判断)
    price = soup.select('#priceblock_ourprice')
    data['price'] = price[0].text if price else None
    # 获取star和reviews(需要判断)
    star = soup.select('div>div>span>span>span>a>i>span.a-icon-alt')
    if star:
        data['star'] = star[0].text.split(' ')[0]
        data['reviews'] = soup.select('#reviews-medley-footer > div.a-row.a-spacing-large > a')[0].text.
        split(' ')[2]
        data['Read reviews that mention'] = list(i.text.strip('
').strip() for i in soup.select('span.cr
        -lighthouse-term'))
    else:
        data['star'] = None
        data['reviews'] = None
        data['Read reviews that mention'] = None
    data['Date_first_listed_on_Amazon'] = soup.select('#detailBullets_feature_div > ul > li> span > span:nth
    -child(2)')[-1].text
    # 获取reviews_link(需要判断)
    reviews_link = soup.select('#reviews-medley-footer > div.a-row.a-spacing-large > a')
    if reviews_link:
        data['reviews_link'] = 'https://www.amazon.com' + reviews_link[0].get('href')
    else:
        data['reviews_link'] = None
    # 获取store和store_link (需要判断)
    store = soup.select('#bylineInfo')
    if store:
        data['store'] = store[0].text
        data['store_link'] = 'https://www.amazon.com' + soup.select('#bylineInfo')[0].get('href')
    else:
        data['store'] = None
        data['store_link'] = None
    item_info_M.insert_one(data)   # 存入MongoDB数据库
    print(data)
# 3、将商品详情写入csv文件
for i in range(100):
    get_item_info_2(item_links[i],item_info[i])
    print('已写入第{}个商品'.format(i+1))

3、爬取评论

2c88445e8b4c8eede02744247badb50.png

核心事项:

1)从上一步的csv文件中,读取Rank , item_name , reviews , reviews_link字段

2)构建函数读取每个商品的所有评论

3)利用for循环,获取所有商品的所有评论

4)存储到数据库和csv文件中

csv_file = csv.reader(open('C:/Users/zbd/Desktop/3.csv','r'))
reviews_datalst = []
for i in csv_file:
    reviews_data = {
        'Rank':i[10],
        'item_name':i[8],
        'reviews':i[6],
        'reviews_link':i[5]
    }
    reviews_datalst.append(reviews_data)
del reviews_datalst[0]    # 删除表头
#print(reviews_datalst)
reviews_links = list(i['reviews_link'] for i in reviews_datalst)  # 将评论详情页链接存储到列表reviews_links

4、爬取size和color数据

和第三步基本一样,代码基本一样,主要在于要确认每页评论的size&color个数。

headers = ['_id','item_name', 'customer_name', 'star', 'review_date', 'review_title', 'review_text']
with open('C:/Users/zbd/Desktop/4.csv','w',newline='',encoding='utf-8') as f:
    f_csv = csv.DictWriter(f, headers)
    f_csv.writeheader()
    f_csv.writerows(all_reviews)
print('写入完毕!')

爬取完毕后,对数据进行基本的清洗,包括去空值、统一数据格式等,便可开始做分析。

歪果内衣哪家强?

① 不同商家的星级排名 

df_star = df['star'].sort_values(ascending = False)
df_star.plot(kind = 'bar',color = 'yellow',grid = True,alpha = 0.5,ax =axes[0],width =0.7,
                                              ylim = [3,5],title = '不同商家的星级排名')
axes[0].axhline(df_star.mean(),label = '平均星级%.2f分' %df_star.mean() ,color = 'r' ,linestyle = '--',)
axes[0].legend(loc = 1)

0be415a88d6fd5f38c2243945c89f1c.png

    ·平均星级达4.15分,高于平均分的商家超过一半(17/32)

    ·Top1的LALAVAVA高达4.9分,紧随其后也有5家达到4.5分。

    ·倒数第一N-pearI只有3.2分

让我看看LALAVAVA长什么样。亚马逊上的商品,看上去就是普通泳衣,米国人还是很保守的嘛~

c3e81cfd70644167e22c6f7ce9cb493.png

但评分高真的就说明产品好吗?不如来看看评论数吧——

②不同商家的平均评论数排名 

df_reviews_mean = df['reviews_mean'].sort_values(ascending = False)
df_reviews_mean.plot(kind = 'bar',color = 'blue',grid = True,alpha = 0.5,ax =axes[1],width =0.7,
                                              title = '不同商家的平均评论数排名')
axes[1].axhline(df_reviews_mean.mean(),label = '平均评论数%i条'%df_reviews_mean.mean(),color = 'r',linestyle = '--',)
axes[1].legend(loc = 1)

6c52540c0e21259cb6a8da5e2c3f8e5.png

    ·首先平均评论数只有193条,而且高于平均线的只有不到三成(12/32),想想淘宝动辄上万,我们的人口优势让米国人羡慕呀;

    ·再来看星级Top1的LALAVAVA,评论数少得可怜,那么对其商品真实质量就要存疑了;

    ·而星级倒数的N-pear I,同样评论数很少,那大概率其商品其实不咋地;

    ·反观评论数Top1的Garmol,其星级评价4.4,口碑佳评论也多,看来是不错的商品;

    ·紧随其后的几家,其星级分数就低于平均分了

那么,亚马逊的星级评价难道就只受评论数的几颗星比例影响吗?我查阅了网上的一些资料,发现亚马逊评价星级评定的三个重要因素:评论距离现在的时间,评论被买家投票采纳数,评论是否有verified purchase标志(意指真实买家)。此外,评论的字符数,被点击次数等因素也可能会对评论星级有影响。

看来,亚马逊对评论的监控和管理是非常严格而复杂的!当然,最重要的还是看看评论第一名的Garmol长什么样:

80fd2123de31da52320f5ccf50125be.png

比上边的泳衣更点题了,大家说好才是真的好,very sexy!

③不同商家的价格区间排名(按均价)

avg_price = (d-c)/2
avg_price.name = 'avg_price'
max_price = avg_price.copy()
max_price.name = 'max_price'
df_price = pd.concat([c,avg_price,max_price,df_re['price_mean']],axis=1)
df_price = df_price.sort_values(['price_mean'],ascending = False)
df_price.drop(['price_mean'],axis =1,inplace = True)
df_price.plot(kind = 'bar',grid = True,alpha = 0.5 , ax =axes[2],width =0.7,stacked = True,
              color= ['white','red','blue'],ylim = [0,55],title = '不同商家的价格区间')

cda571f7123fcc45db46ad7ce1093c6.png

    ·从图上来看,明显ELOVER锁定的是高端市场,定价区间在49刀左右;相反,Goddessvan定价仅0.39刀,还只有一款,猜测可能         是亏本冲量,提高商家曝光,抢夺低端市场

    ·从均价来看,基本分布在10-20刀间,说明这是内衣市场的主要价格区间;但20-40刀区间居然没有任何商家,可以在这一块深入         研究,看能不能找到证据说明该区间是蓝海,有更大的市场潜力

    ·而从每个商家的价格区间来看,大多数都是采取多颜色或款式的策略,一方面为用户提供更多选择,另一方面也体现了商家的上新         能力;而仅有少数几家采取了单一爆款的策略

最奢华的ELOVER看上去果然比较女神,缩略图都比别家更用心。

606cf584fb811a1e147d8fb05a1c7d3.png

那么,到底哪个商家的策略更靠谱,市场份额更大呢?

④商家的商品数量饼图 

df_per = df_re['item_num']
fig,axes = plt.subplots(1,1,figsize = (8,8))
plt.axis('equal') #保证长宽相等
plt.pie(df_per , 
        labels = df_per.index , 
        autopct = '%.2f%%',
        pctdistance = 1.05 , 
        #shadow = True ,
        startangle = 0 ,
        radius = 1.5 , 
        colors = colors,
        frame = False
        )

a33bd96b509cc3c6f353db37b9d850b.png

    ·在Top100的商品占比中,Avidlove以28%的巨大优势称霸

    ·而其他商家基本都是个位数的占比,没有很明显的优劣势

Avidlove的内衣是酷酷风的,我喜欢。

c6ea1eb9af324253a500f9203adb84c.png

单一方面毕竟还是很难衡量哪家商家更优秀,不如综合多个指标来分析吧~

⑤不同商家的加权分排名 

df_nor = pd.concat([df_re['star_nor'],df_re['reviews_mean_nor'],df_re['price_mean_nor'],df_re['item_num_nor']],axis =1)
df_nor['nor_total'] = df_re['star_nor'] + df_re['reviews_mean_nor'] + df_re['price_mean_nor'] + df_re['item_num_nor']
df_nor = df_nor.sort_values(['nor_total'],ascending = False)
df_nor.drop(['nor_total'],axis = 1,inplace = True)
df_nor.plot(kind = 'bar',grid = True,alpha = 0.5 , ax =axes[3],width =0.7,stacked = True,
           title = '不同商家的加权分排名')

3f999836242a3d90df877f0a11c1608.png

将星级、平均评论数、商品均价、商品数量进行标准化处理后,因为不好拍定加权的比例,便将4项的归一化结果x10后直接累加得到总分,并制作成堆积图。

而每个商家的4项指标的占比,则侧面反映其自身的优劣势。

    ·Avidlove,刚刚的酷酷风内衣,在其他三项中规中矩的情况下,以商品数量优势夺得综合分第一,有种农村包围城市的感觉

    ·Garmol,主要依靠口碑(星级、平均评论数)的优势,夺得了第二名

    ·ELOVER,主要依靠精准切分高端市场,夺得了第三名

    ·N-pearI,没有任何优势,不出意料的光荣垫底

口碑最差的N-pearI,能搜到的商品也最少,不过图很劲爆……

73bfff77e229f75d671587cf2a28b1d.png

粗略来看的话,想要排名靠前,口碑一定不能太差,至少要保持在平均水平及以上!

⑥不同商家的星级/价格散点图 

9d33db2745d72014ad02b7a42de7dfa.png

x轴为商家的商品均价,y轴为商家的星级,点大小为商品数量,商品数量越大,点越大,点颜色为评论均值,评论均值越大,颜色越深红。

利用价格均值和星级均值,将图切分为四个象限:

①左上象限:实惠好评的商家

②右上象限:有点贵,但一分钱一分货的商家

③右下象限:贵,但质量不咋地的商家

④左下象限:便宜没好货的商家

所以借助这张散点图,挑商家买东西就容易多啦:

    ·追求性价比,可选择Avidlove,而且商品多,任君挑选 (图中圆圈最大的浅红色商家);

    ·追求高端,可选择ELOVER,它贵有它的道理 (图中最左侧且落在左上象限的商家);

    ·追求大众,可选择Garmol,评论数最多,而且好评居多 (图中颜色最红的商家)

顾客可以根据自己的喜好挑选合适的商家,那么作为商家如何改进自己呢?

⑦词频分析

0e7f6e229807bfed391487935576581.png

前面在爬取的过程中,同样爬取了评论标签,通过对此进行词频分析,可以发现顾客最关心的依次是:

1.是否合身:size、fit等相关字眼多次出现且排位靠前

2.质量:good quality、well made;soft and comfortable、fabric是对材质的肯定

3.款式:cute、sexy、like the picture你懂的

4.价格:cheaply made勉强算价格吧,但更多是对商品质量的怀疑

5.口碑:highly recommend,评论的还是非常有参考价值的

评论标签的数量较少,进一步对2.4w条评论进行词频分析,并制作成词云:

d670e5062612cd9843dd2a16cdc2d0d.png

最直观的,仍然是跟“是否合身”以及质量或款式有关。那么我们就从顾客购买商品的Size&Color继续分析

67795a2be4195a27692dfa19b516bc0.png

可以明显看出:

Size方面:large、medium、small肯定均有涵盖,但另外还有xlarge、xxlarge、xxxlarge,亚马逊主要是欧美顾客,可能体型相对较大,所以商家应该多研发以及备货针对体型较大的顾客的商品。

Color方面:非常直观:Black > red > blue > green > white > purple….所以黑色、红色永远不会错;绿色是出乎我意料的,商家也可以大胆尝试。

Style方面:词频中出现trim、lace字眼,蕾丝最高!!!

1a8c179a2cdbf5dc7f135e9414ff1a3.png

在分析了Top100的商品信息和2.4w条评论后,作为一篇正经的python电商数据分析研究,我们来总结一下亚马逊女士内衣产品和销售策略:

1、一定要注意的竞品

Garmol、ELOVER、Avidlove分别在口碑、定价、产品数量三个方向有其核心优势,是需要重点研究的竞争对手。

2、口碑很重要

    ·Review和星级是影响口碑的重要因素,需要深入研究其算法机制并制定针对性的营销策略

    ·Review和星级有基础要求

        ·平均星级达4.15分,高于平均分的商家超过一半

        ·平均评论数只有193条,高于平均线的商家约三成

    ·Review相对淘宝评论较少,亚马逊的算法复杂且惩罚力度大,因此Review重精胜于重多

3、定价策略

    ·主流市场竞争激烈,价格多集中在10-20刀间

    ·高端市场有切入机会,目前仅ELOVER一家,价格在40-55刀间

    ·低端市场价值不大,利润空间小,为了提高曝光或铺量可考虑,但不利于以后冲击中高端市场

    ·中高端市场机会巨大,20-40刀区间暂无其他商家,有巨大的市场潜力

4、产品策略

    ·应结合目标市场和定价,提高研发和上新能力,先多产品试错,再尝试单一爆款巩固市场

    ·内衣尺寸:合身最重要,需贴合国外顾客的体型,一般large及以上。颜色上:保守可多使用黑色、红色,同时可大胆尝试绿色。           款式上:多采用蕾丝装饰

    ·质量和品控是底线

5、拓展&思考:

用python做一篇正经的数据分析不仅需要python基本技巧,还需要强大的数据清洗知识、数据库知识、电商行业理解以及熟练的文字表述能力,作为数据分析师,要学习的还有很多,尤其是对项目的练习。

众多python教程,尽在云海天教程网,欢迎在线学习!

本文转自:https://mp.weixin.qq.com/s/bnOwST04GOuI1qATyvn7_A

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Python数据分析:内衣销售哪家强?