本文需要用到的数据分析包有pandas、numpy、matplotlib、jieba、seaborn
数据分析的步骤:
-
数据预处理(去重、缺失值处理)
-
数据查看(找到有用的分析数据)
-
数据探索(依照数据给出探索出的结果)
数据预处理
1、模块导入
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import jieba
import seaborn as sns
2、数据导入
字段介绍:update_time表示购买时间,id表示唯一标识符、title标识产品名称、price表示价格、sale_count表示销售数量、comment_count表示评论数量、店名。
data=pd.read_csv('./双十一淘宝美妆数据.csv')
data.head()
3、查看数据基本信息
print(data.shape)
print(data.info())
# sale_count、comment_count含有缺失值
4、重复值处理
# 去除重复值
data=data.drop_duplicates(inplace=False)
# print(data.shape)
# 去除重复值之后,索引没有发生变化,因此可以使用以下方法来重置索引
data.reset_index(inplace=True,drop=True)
print(data.shape)
inplace参数的使用
inplace=False,默认该删除操作不改变原数据,
而是返回一个执行删除操作后的新dataframe(能用=进行赋值操作,但是碰到处理数据量大的时候,会造成内存滥用);
inplace=True,则会直接在原数据上进行删除操作,
删除后无法返回(这样操作省内存空间也就是减少资源占用,但不能用=进行赋值否则报错nonetype).
5、缺失值处理
# 缺失值的处理方式有多种,1、可以直接删除 2、可以使用平均值替换
# 3、可以使用众数替换
# 查看缺失值数据
data.isnull().any()
data.isnull().sum()
# 方法1:
data.dropna(subset=['sale_count'])
data.dropna(subset=['comment_count'])
# 方法2
# 填入平均值
data['sale_count'].fillna(data['sale_count'].mean,inplace=True)
data['comment_count'].fillna(data['comment_count'].mean,inplace=True)
print(data.isnull().any())
# 方法3
# mode1=data.sale_count.mode()
# mode2=data.comment_count.mode()
# print(mode1)
# print(mode2)
6、数据结构
data.describe()
数据查看
1、对title列处理。通过对标题的切词来找到有用的信息
# 数据处理操作
# 1、新增列值,使用切词来处理title标题
title_cut=[]
for i in data.title:
j=jieba.lcut(i)
title_cut.append(j)
data['item_name_cut']=title_cut
data[['title','item_name_cut']].head()
2、添加新列
# 给商品添加分类
sub_type=[] # 子类别
main_type=[] # 主类别
# 设置字符串格式
basic_config_data="""护肤品 套装 套装
护肤品 乳液类 乳液 美白乳 润肤乳 凝乳 柔肤液 亮肤乳 菁华乳 修护乳
护肤品 眼部护理 眼霜 眼部精华 眼膜
护肤品 面膜类 面膜
护肤品 清洁类 洗面 洁面 清洁 卸妆 洁颜 洗颜 去角质 磨砂
护肤品 化妆水 化妆水 爽肤水 柔肤水 补水露 凝露 柔肤液 精粹水 亮肤水 润肤水 保湿水 菁华水 保湿喷雾 舒缓喷雾
护肤品 面霜类 面霜 日霜 晚霜 柔肤霜 滋润霜 保湿霜 凝霜 日间霜 晚间霜 乳霜 修护霜 亮肤霜 底霜 菁华霜
护肤品 精华类 精华液 精华水 精华露 精华素
护肤品 防晒类 防晒霜 防晒喷雾
化妆品 口红类 唇釉 口红 唇彩
化妆品 底妆类 散粉 蜜粉 粉底液 定妆粉 气垫 粉饼 BB CC 遮瑕 粉霜 粉底膏 粉底霜
化妆品 眼部彩妆 眉粉 染眉膏 眼线 眼影 睫毛膏
化妆品 修容类 鼻影 修容粉 高光 腮红
其他 其他 其他"""
3、设置类别字典并添加新列
# 设置字典
category_config_map={}
for config_line in basic_config_data.split('\n'):
print(config_line)
basic_category_list=config_line.strip().strip('\n').strip('\t').split('\t')
# print(basic_category_list)
main_category=basic_category_list[0]
# print(main_category)
sub_category=basic_category_list[1]
# print(sub_category)
ubit_category_list=basic_category_list[2:-1]
# print(ubit_category_list)
for ubit_category in ubit_category_list:
if ubit_category and ubit_category.strip().strip('\t'):
category_config_map[ubit_category]=(main_category,sub_category)
category_config_ma
for i in range(len(data)):
exist=False
for temp in data.item_name_cut[i]:
# print(temp)
if temp in category_config_map:
# print(category_config_map.get(temp)[0])
# print(category_config_map.get(temp)[1])
sub_type.append(category_config_map.get(temp)[1])
main_type.append(category_config_map.get(temp)[0])
exist=True
break
if not exist:
sub_type.append('其他')
main_type.append('其他')
# 查看数据格式
print(len(sub_type),len(main_type),len(data))
# 新增加列值
data['sub_type']=sub_type
data['main_type']=main_type
data.head()
4、数据查看
# 统计汇总
data['sub_type'].value_counts()
data['main_type'].value_counts()
5、判断特殊用法
# 切词判断是否为特殊群体使用
gender=[]
for i in range(len(data)):
if '男' in data.item_name_cut[i]:
gender.append('是')
elif '男士' in data.item_name_cut[i]:
gender.append('是')
elif '男生' in data.item_name_cut[i]:
gender.append('是')
else:
gender.append('否')
data['是否男士专用']=gender
data['是否男士专用'].value_counts()
6、日期设置
# 新增销售额和购买日期列值
data['销售额']=data.sale_count*data.price
data['update_time']=pd.to_datetime(data['update_time'])
data['update_time']
# 将时间设置成新的index
data=data.set_index('update_time')
data['day']=data.index.day
7、删除不需要的数据
# 保存数据
del data['item_name_cut']
8、保存数据
data.to_excel('clean_beautymakeup.xls',sheet_name='clean_data')
数据探索
1、各品牌sku数
# 指定默认字体
plt.rcParams['font.sans-serif']=['SimHei']
# 负号显示问题
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(8,6))
# 计算各店铺的商品数量
data1=data['店名'].value_counts().sort_values(ascending=False)
# 柱形图的设置
data1.plot.bar(width=0.6,alpha=0.6,color='b')
# 题目的设置
plt.title('各品牌SKU数',fontsize=18)
# 纵坐标的设置
plt.ylabel('商品数量',fontsize=14)
plt.show()
2、各品牌销售量个销售额分布
# 品牌总销售量和总销售额
# 设置画板,
fig,axes=plt.subplots(1,2,figsize=(12,10))
# 品牌总销售量,按照店名汇总升序排序
ax1=data.groupby('店名').sale_count.sum().sort_values(ascending=True)
# 绘制图表类型并放置画板位置
ax2=ax1.plot(kind='barh',ax=axes[0],width=0.6)
# 设置标题
ax2.set_title('品牌总销售量',fontsize=12)
# 设置横坐标轴
ax2.set_xlabel('总销售额')
ax3=data.groupby('店名')['销售额'].sum().sort_values(ascending=True)
ax4=ax3.plot(kind='barh',ax=axes[1],width=0.6)
ax4.set_title('品牌总销售额',fontsize=12)
ax4.set_xlabel('总销售额')
#
plt.subplots_adjust(wspace=0.4)
plt.show()
3、各类别的销售量个销售额介绍
# 各类别的销售量,销售额情况
fig,axes=plt.subplots(1,2,figsize=(12,5))
# 主类别的分布
data1=data.groupby('main_type')['sale_count'].sum()
ax1=data1.plot(kind='pie',ax=axes[0],
autopct='%.1f%%', # 设置百分比格式,保留一位小数
pctdistance=0.8, # 设置百分比标签与圆心距离
labels=data1.index, # 设置标签值
labeldistance=1.05, # 设置标签与圆心的距离
startangle=60, # 设置饼图的初始角度
radius=1.1, # 设置饼图的半径
counterclock=False, # 是否逆时针,这里设置为顺时针方向
wedgeprops={'linewidth':1.2,'edgecolor':'k'}, # 设置饼图内外边界的属性值
textprops={'fontsize':10,'color':'k'} # 设置文本标签的属性值
)
ax1.set_title('主类别销售量占比',fontsize=20)
# 次类别的分布
data2=data.groupby('sub_type')['sale_count'].sum()
ax2=data2.plot(kind='pie',ax=axes[1],
autopct='%.1f%%', # 设置百分比格式,保留一位小数
pctdistance=0.8, # 设置百分比标签与圆心距离
labels=data2.index, # 设置标签值
labeldistance=1.2, # 设置标签与圆心的距离
startangle=230, # 设置饼图的初始角度
radius=1.1, # 设置饼图的半径
counterclock=False, # 是否逆时针,这里设置为顺时针方向
wedgeprops={'linewidth':1.2,'edgecolor':'k'}, # 设置饼图内外边界的属性值
textprops={'fontsize':10,'color':'k'}, # 设置文本标签的属性值
)
ax2.set_title('子类别销售量占比',fontsize=20)
plt.subplots_adjust(wspace=0.4)
plt.show()
4、各品牌种类的销售额和销售量分布
# 各品牌总类的销售额和销售量
plt.figure(figsize=(14,6))
# 设置柱形图
sns.barplot(x='店名',y='sale_count',hue='main_type',data=data,
saturation=0.75,ci=0)
plt.title('各品牌各总类的总销售额')
plt.ylabel('销量')
# 添加文本标注
plt.text(0,78000,'注:此处可以使用堆叠图,对比效果更明显',
verticalalignment='top',horizontalalignment='left',color='gray',fontsize=10)
plt.show()
plt.figure(figsize=(14,6))
# 设置柱形图
sns.barplot(x='店名',y='销售额',hue='main_type',data=data,
saturation=0.75,ci=0)
plt.title('各品牌各总类的总销售额')
plt.ylabel('销量额')
plt.show()
5、各品牌各子类的总销量和总销售额
# 各品牌各子类的总销售量
plt.figure(figsize=(16,6))
sns.barplot(x='店名',y='sale_count',hue='sub_type',data=data,saturation=0.75,ci=0)
plt.title('各品牌各子类的总销售量')
plt.ylabel('销量')
plt.show()
# 各品牌各子类的总销售额
plt.figure(figsize=(14,6))
sns.barplot(x='店名',y='销售额',hue='sub_type',data=data,saturation=0.75,ci=0)
plt.title('各品牌各子类的总销售额')
plt.ylabel('销量额')
plt.show()
6、各品牌的热度
# 各品牌的热度,评论数
plt.figure(figsize=(12,6))
data1=data.groupby('店名').comment_count.mean().sort_values(ascending=False)
data1.plot(kind='bar',width=0.8)
plt.title('各品牌商品的平均评论数')
plt.ylabel('评论数')
plt.show()
plt.figure(figsize=(12,10))
x=data.groupby('店名')['sale_count'].mean()
y=data.groupby('店名')['comment_count'].mean()
s=data.groupby('店名')['price'].mean()
txt=data.groupby('店名').id.count().index
# print(txt)
sns.scatterplot(x,y,size=s,hue=s,sizes=(100,1500),data=data)
# 注释
for i in range(len(txt)):
plt.annotate(txt[i],xy=(x[i],y[i]))
plt.ylabel('热度')
plt.xlabel('销量')
plt.legend(loc='upper left')
plt.show()
7、品牌价格对比
# 各品牌的价格,箱线图的绘制
plt.figure(figsize=(14,6))
sns.boxplot(x='店名',y='price',data=data)
plt.ylim(0,2500)
plt.show()
# 各品牌产品的平均价格
fig=plt.figure(figsize=(12,6))
data.groupby('店名').price.sum()
avg_price=data.groupby('店名').price.sum()/data.groupby('店名').price.count()
data1=avg_price.sort_values(ascending=False)
data1.plot(kind='bar',width=0.8,alpha=0.6,color='b',label='各品牌平均价格')
# 平均价格
y=data['price'].mean()
plt.axhline(y,0.1,color='r',label='全品牌平均价格')
# 设置图标
plt.ylabel('各品牌平均价格')
plt.title('各品牌产品的平均价格',fontsize=24)
# 图例设置
plt.legend(loc='best')
plt.show()
随着大数据的时代的到来,数据变得越来越重要,数据可以帮助我们来看清行业的本质,也可以帮助我们更加快速的了解一个行业,关注公众号——DT学说,走进数据的时代