数据分析案例
数据分析案例要求
电商数据分析案例
电商数据分析案例
一.数据集介绍
此次的数据集来自kaggle的关于在线零售业务的交易数据,该公司主要销售礼品,大部分出售对象是面向批发商。
二.数据集字段介绍
数据包含541910行,8个字段,字段内容为:
InvoiceNo: 订单编号,每笔交易有6个整数,退货订单编号开头有字母’C’。
StockCode: 产品编号,由5个整数组成。
Description: 产品描述。
Quantity: 产品数量,有负号的表示退货
InvoiceDate: 订单日期和时间。
UnitPrice: 单价(英镑),单位产品的价格。
CustomerID:客户编号,每个客户编号由5位数字组成。
Country: 国家的名称,每个客户所在国家/地区的名称。
三.分析内容
1.购买商品数前十的国家是? 条形图
2.交易额前十的国家是? 条形图
3.哪些月份销量较佳?
4.客单价多少? 总金额/总客户数
5.用户消费行为分析 RFM
'''
数据的来源:
某英国的kaggle电商公司的数据,主要产品是零售批发
数据的字段
InvoiceNo: 订单号
StockCode: 商品编号
Description: 商品描述
Quantity: 数量
InvoiceDate 日期
UnitPrice 单价
CustomerID 客户id
Country 国家
分析的需求?
1.购买商品数前十的国家是?
2.交易额前十的国家是?
3.哪些月份销量较佳?
4.客单价多少?
5.用户消费行为分析
'''
'''
数据分析的基本步骤
1、加载数据
2、观察数据
3、数据处理:数据清洗
4、建模(完成KPI)
5、可视化
6、总结报告
'''
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['FangSong']
print('----------------step1:加载数据----------------')
df = pd.read_csv('data.csv', dtype=object)
print('----------------step2:观察数据----------------')
print('列名:\n', df.columns)
print()
print('数据类型:\n',df.dtypes)
print()
print('形状:\n',df.shape)
print()
print('索引:\n', df.index)
print()
print('非空统计-计数:\n', df.count())
print()
print('前5条数据:\n', df.head())
print()
print('数据的基本信息:\n',df.info())
'''
通过数据观察,初步了解以下问题
问题:
1、数据类型有问题
2、数据存在缺失值
3、数据有异常(有负数的数据,退货数据,不需要去分析)
4、缺少金额一列
'''
print('----------------step3:数据处理-数据清洗----------------')
'''
一般在做数据分析前,需要对数据进行处理操作,保证数据的准确性
数据清洗主要包括:
1、缺失值处理
2、异常值处理
3、重复值处理
4、子集的选择
5、类型的转换
6、重命名
7、数据排序
8、字段统一化
'''
'''
1、缺失值处理
'''
df.dropna(inplace=True)
'''
2、类型转换
'''
df['Quantity'] = df['Quantity'].astype(float)
df['UnitPrice'] = df['UnitPrice'].astype(float)
df['InvoiceDate'] = pd.to_datetime(df['InvoiceDate'])
'''
3、异常值处理:去除负数的数据
'''
df = df[ df['Quantity']>=0 ]
print(df.describe())
'''
4、重命名:不需要
df.rename(columns={旧名:新名...})
'''
'''
5、排序
'''
df.sort_values(by='InvoiceDate', inplace=True, ignore_index=True)
'''
6、子集的选择
'''
df['money'] = df['Quantity']*df['UnitPrice']
print(df.head())
'''
7、字段统一化
usa USA 是同一个国家,但是不进行同一化处理,会影响结果
USA
USA
apply(处理函数)
处理函数:去除前后空格,全部转换成大写
'''
df['Country'] = df['Country'].str.upper()
df['Country'] = df['Country'].str.strip()
print(df['Country'])
kpi_df = df.copy()
print('----------------step4:建模,完成KPI----------------')
plt.figure('kaggle电商数据分析', figsize=(6.4*1.5,4.8*1.5))
def kpi(column, i, kpi_title):
kpi1_data = kpi_df.groupby(by='Country')[[column]].sum()
kpi1_data.sort_values(by=column, ascending=False,inplace=True)
top_ten_quantity = kpi1_data[:10]
print(top_ten_quantity)
plt.subplot(2,2,i)
plt.title(kpi_title)
if i in [1,3]:
plt.xlabel('国家', fontsize=10)
plt.ylabel('数量', fontsize=10)
plt.xticks(rotation=90)
plt.bar(top_ten_quantity.index, top_ten_quantity[column])
else:
plt.xlabel('数量', fontsize=10)
plt.ylabel('国家', fontsize=10)
plt.barh(top_ten_quantity.index, top_ten_quantity[column])
kpi('Quantity',1,'购买商品数前十的国家是?')
kpi('Quantity',2,'购买商品数前十的国家是?')
kpi('money', 3, '交易额前十的国家是?')
kpi('money', 4, '交易额前十的国家是?')
plt.show()
print('==============================3.哪些月份销量较佳?==================================')
kpi3_data = kpi_df.groupby(by=df['InvoiceDate'].dt.month)[['Quantity']].sum()
kpi3_data.sort_values(by='Quantity', ascending=False,inplace=True)
print(kpi3_data)
print('==============================4.客单价多少?==================================')
new_df = kpi_df.drop_duplicates('CustomerID')
total_ct = new_df['CustomerID'].count()
print('总的客户量:',total_ct)
total_money = kpi_df['money'].sum()
print('总的金额:', total_money)
print('KPI4 客单价:',(total_money/total_ct))
print('==============================5.用户消费行为分析==================================')
'''
R:最近一次消费日期
'''
import datetime
print('============================R==========================')
R_DATA = kpi_df.groupby(by='CustomerID')[['InvoiceDate']].max()
R_DATA['天数'] = datetime.datetime.today()- R_DATA['InvoiceDate']
max_time = R_DATA['天数'].max()
min_time = R_DATA['天数'].min()
R_ZJ = (max_time-min_time)/5
team1 = (min_time, min_time+R_ZJ)
team2 = (min_time+R_ZJ ,min_time+2*R_ZJ)
team3 = (min_time+2*R_ZJ, min_time+3*R_ZJ)
team4 = (min_time+3*R_ZJ, min_time+4*R_ZJ)
team5 = (min_time+4*R_ZJ, max_time)
R_DATA.loc[(R_DATA['天数']>=team1[0]) & (R_DATA['天数']<team1[1]), 'R'] = 5
R_DATA.loc[(R_DATA['天数']>=team2[0]) & (R_DATA['天数']<team2[1]), 'R'] = 4
R_DATA.loc[(R_DATA['天数']>=team3[0]) & (R_DATA['天数']<team3[1]), 'R'] = 3
R_DATA.loc[(R_DATA['天数']>=team4[0]) & (R_DATA['天数']<team4[1]), 'R'] = 2
R_DATA.loc[(R_DATA['天数']>=team5[0]) & (R_DATA['天数']<=team5[1]), 'R'] = 1
R_DATA['R_S'] = R_DATA['R'].mean()
R_DATA.loc[R_DATA['R']>=R_DATA['R_S'],'R价值评估'] = '高'
R_DATA.loc[R_DATA['R']<R_DATA['R_S'],'R价值评估'] = '低'
R_DATA['客户'] = R_DATA.index
'''
F:消费频率
'''
print('============================F==========================')
F_DATA = kpi_df.groupby(by='CustomerID')[['CustomerID']].count()
max_ci = F_DATA['CustomerID'].max()
min_ci = F_DATA['CustomerID'].min()
F_ZJ = (max_ci-min_ci)/5
team1 = (min_ci, min_ci+F_ZJ)
team2 = (min_ci+F_ZJ ,min_ci+2*F_ZJ)
team3 = (min_ci+2*F_ZJ, min_ci+3*F_ZJ)
team4 = (min_ci+3*F_ZJ, min_ci+4*F_ZJ)
team5 = (min_ci+4*F_ZJ, max_ci)
F_DATA.loc[(F_DATA['CustomerID']>=team1[0]) & (F_DATA['CustomerID']<team1[1]),'F'] = 1
F_DATA.loc[(F_DATA['CustomerID']>=team2[0]) & (F_DATA['CustomerID']<team2[1]),'F'] = 2
F_DATA.loc[(F_DATA['CustomerID']>=team3[0]) & (F_DATA['CustomerID']<team3[1]),'F'] = 3
F_DATA.loc[(F_DATA['CustomerID']>=team4[0]) & (F_DATA['CustomerID']<team4[1]),'F'] = 4
F_DATA.loc[(F_DATA['CustomerID']>=team5[0]) & (F_DATA['CustomerID']<=team5[1]),'F'] = 5
F_DATA['F_S'] = F_DATA['F'].mean()
F_DATA.loc[F_DATA['F']>=F_DATA['F_S'],'F价值评估'] = '高'
F_DATA.loc[F_DATA['F']<F_DATA['F_S'],'F价值评估'] = '低'
F_DATA['客户'] = F_DATA.index
'''
M:消费金额
'''
print('============================M==========================')
M_DATA = kpi_df.groupby(by='CustomerID')[['money']].sum()
max_money = M_DATA['money'].max()
min_money = M_DATA['money'].min()
M_ZJ = (max_money-min_money)/5
team1 = (min_money, min_money+M_ZJ)
team2 = (min_money+M_ZJ ,min_money+2*M_ZJ)
team3 = (min_money+2*M_ZJ, min_money+3*M_ZJ)
team4 = (min_money+3*M_ZJ, min_money+4*M_ZJ)
team5 = (min_money+4*M_ZJ, max_money)
M_DATA.loc[(M_DATA['money']>=team1[0]) & (M_DATA['money']<team1[1]),'M'] = 1
M_DATA.loc[(M_DATA['money']>=team2[0]) & (M_DATA['money']<team2[1]),'M'] = 2
M_DATA.loc[(M_DATA['money']>=team3[0]) & (M_DATA['money']<team3[1]),'M'] = 3
M_DATA.loc[(M_DATA['money']>=team4[0]) & (M_DATA['money']<team4[1]),'M'] = 4
M_DATA.loc[(M_DATA['money']>=team5[0]) & (M_DATA['money']<=team5[1]),'M'] = 5
M_DATA['M_S'] = M_DATA['M'].mean()
M_DATA.loc[M_DATA['M']>=M_DATA['M_S'],'M价值评估'] = '高'
M_DATA.loc[M_DATA['M']<M_DATA['M_S'],'M价值评估'] = '低'
M_DATA['客户'] = M_DATA.index
rf_data = pd.merge(R_DATA,F_DATA)
RFM = pd.merge(rf_data, M_DATA)
NB_CUS = RFM[(RFM['R价值评估'] == "高") & (RFM['F价值评估'] == "高") & (RFM['M价值评估'] == "高")]
print('高价值客户')
print(NB_CUS)
医院数据分析案例
医院数据分析案例
分析的需求:
a、每日消费趋势
b、每月消费趋势
c、药品的消费趋势
d、客单价
注意:同一天同一个用户,代表一次消费
数据处理
1、列名重命名
购药时间 -> 销售日期
2、缺失值处理
3、类型转换
读取数据时,需要以object类型读取数据(原样显示数据)
001616528 - > 1e+xx
销售日期 -> 日期格式
销售数量:float
应收金额:float
实收金额:float
4、异常值的处理
df[df[销售数量]>0]
5、选择子集(不需要)
6、排序
按照销售日期进行排序,重新定义索引
数据建模(kpi)
1、每日销售金额趋势图
x:销售时间
y:实收金额
plot(x,y)
2、每月销售金额趋势图
销售时间的月份进行分组聚合
1 4444
2 2222
3 4444
4 2222
...
X: [1,2,3,4...]
Y: [XX,XX,XX...]
3、客单价
df['实收金额'] = xxx
同一天同一个人算作一次消费
drop_去重(set=['销售日期','社保卡号'])
总金额/总的消费次数
4、药品的销售趋势图(销量在前十的药品,并绘图)
对药品进行分组聚合,计算销量
排序分析
[:10]
销量
阿司匹林 30
九九感冒林 20
y = df[销售数量]
x = 药名
bar(x,y)
车型数据分析案例
车型数据分析
5个文件
1、百度车型的真实搜索指数数据
2、城市的id-城市名
3、城市车型搜索指数的比重
4、省份的id-省份名
5、省份车型搜索指数的比重
需求:
计算各省每一个月的每一种车型的真是搜索指数
901 山东 宾智 12 1000
宾智 11 300
计算出每一种车型的真是搜索指数
902 贵州
903 江西
计算出每一种车型的真是搜索指数
a.通过百度表计算出各种类型每一个月的真实搜索指数
缤智 1 123
2 456
3 789
4 110
[keyword,month][[_index]].sum()
b.通过省份比重表,计算占比值
[keyword,month][prov_index].sum()
2222
901 12 272
1 111
2 333
1、百度的真实搜索指数
2、省份搜索指数比重
BMW 12月 广东 600
1月 山东 500
1月 广东 400
...
分析:计算每一种汽车每一个月各省的搜索指数(真实的数据)
思路:
根据真实搜索指数,计算其比重占得数据值
1、BMW 1月 10000
2月 5000
2、计算比例值
BMW 1月 广东 700 700/1800=0.3 10000*0.3=3000
1月 山东 500
1月 江苏 600
、、、
1月总比重=700+500+600=1800
3、城市搜索指数比重
BMW 12 广东 深圳 400 400/3000
12 广东 广州 500
...
BMW 12 广东 3000 20000
import pandas as pd
import os
'''
根据真实搜索指数表,计算每一种汽车每一个月的真实数据
'''
os.chdir('车辆数据')
print('--------------------1、真实搜索数据---------------')
baidu_df = pd.read_excel('baidu_index_0625.xlsx')
print(baidu_df.head())
print(baidu_df.info())
print('----------------------------------------')
baidu_df.dropna(inplace=True)
'''
apply() 数据处理用的比较常见的函数
def chuli(x):
return x.strip().upper()
lambda 匿名函数
参数:返回值
lambda x:x.strip().upper()
'''
baidu_df['keyword'] = baidu_df['keyword'].apply(lambda x: x.strip().upper())
print(baidu_df.head())
baidu_df['date'] = baidu_df['date'].dt.strftime('%B')
print(baidu_df['date'])
print('--------------------------------------')
baidu_index = baidu_df.groupby(by=['keyword', 'date'])[['_index']].sum()
print(baidu_index.head(10))
print('--------------------2、省份比重数据---------------')
prov_df = pd.read_excel('province_index_0625.xlsx')
print(prov_df.info())
print(prov_df.count())
print(prov_df.shape)
prov_df['keyword'] = prov_df['keyword'].apply(lambda x: x.strip().upper())
prov_df['date'] = prov_df['date'].apply(lambda x: x.split("|")[0])
prov_df['date'] = pd.to_datetime(prov_df['date']).dt.strftime('%B')
prov_sum = prov_df.groupby(by=['keyword', 'date'])[['prov_index']].sum()
prov_index = pd.merge(prov_df, prov_sum, on=['keyword', 'date'])
prov_index['pct'] = prov_index['prov_index_x']/prov_index['prov_index_y']
prov_index_final = pd.merge(prov_index, baidu_index, on=['keyword', 'date'])
prov_index_final['prov_index_final'] = prov_index_final['pct']*prov_index_final['_index']
prov_id = pd.read_excel('province_id.xlsx')
prov_index_final = pd.merge(prov_index_final, prov_id, left_on='prov', right_on='id')
print('--------------------3、城市比重数据---------------')
city_df = pd.read_excel('city_index_0625.xlsx')
city_df['keyword'] = city_df['keyword'].apply(lambda x:x.strip().upper())
city_df['date'] = city_df['date'].apply(lambda x:x.split("|")[0])
city_df['date'] = pd.to_datetime(city_df['date']).dt.strftime('%B')
city_index = city_df.groupby(by=['keyword', 'date', 'prov'])[['city_index']].sum()
city_index2 = pd.merge(city_df, city_index, on=['keyword', 'date', 'prov'])
city_index_final = pd.merge(city_index2, prov_index_final, on=['keyword', 'date', 'prov'])
city_index_final.to_excel('test.xlsx')
数据分析流程
数据清洗
1、子集的选择(选择列、添加列)
2、类型转换
3、异常值处理
4、缺失值处理
5、列名重命名
6、数据排序
7、字段统一化