从这周开始,我将在此记录我对《python数据分析与挖掘实战》(第二版)的跟读情况,将我认为的值得学习的点记录在这里,有时候也会对相关知识进行拓展,保持每周更新3-4次的频率,争取在下次开学前把这本书学习完。同时,因为python中库的更新,书中原来使用的一些函数已经发生变化,我也会相应进行修改。
一、数据特征分析
1. 定量数据的分布分析——直方图
import pandas as pd
import numpy as np
catering_sale = './Python数据分析与挖掘实战(第2版)/chapter3/demo/data/catering_fish_congee.xls' # 餐饮数据
data = pd.read_excel(catering_sale,names=['date','sale']) # 读取数据
bins = [0,500,1000,1500,2000,2500,3000,3500,4000]
labels = ['[0,500)','[500,1000)','[1000,1500)','[1500,2000)',
'[2000,2500)','[2500,3000)','[3000,3500)','[3500,4000)']
data['sale分层'] = pd.cut(data.sale, bins, labels=labels)
aggResult = data.groupby('sale分层')['sale'].count()
pAggResult = round(aggResult/aggResult.sum(), 2, ) * 100
import matplotlib.pyplot as plt
plt.figure(figsize=(10,6)) # 设置图框大小尺寸
pAggResult.plot(kind='bar',width=0.8,fontsize=10) # 绘制频率直方图
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.title('季度销售额频率分布直方图',fontsize=20)
plt.show()
结果如图:
上面其实是用条形图来实现条形图的绘制,同时,bins也都是自己设置的范围,实际我们用hist函数可以更便捷实现多种直方图的画法。
plt.figure(figsize=(10,6))
bins = range(0,4500,500)
nums,bins,patches = plt.hist(data['sale'],bins,edgecolor='k')
plt.xticks(bins,bins)
for num,bin in zip(nums,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.5,num+0.5))
plt.title(u'季度销售额分布直方图')
plt.show()
结果如图:
关于数据分箱用法pd.cut可以参考:数据分箱之pd.cut() - 知乎
直方图的多种画法可以参考:
matplotlib.pyplot.hist — Matplotlib 3.5.0 documentation
2. 定性数据分布分析——条形图,饼图
import pandas as pd
import matplotlib.pyplot as plt
catering_dish_profit = './Python数据分析与挖掘实战(第2版)/chapter3/demo/data/catering_dish_profit.xls' # 餐饮数据
data = pd.read_excel(catering_dish_profit) # 读取数据
# 绘制饼图
x = data['盈利']
labels = data['菜品名']
plt.figure(figsize = (8, 6)) # 设置画布大小
plt.pie(x,labels=labels) # 绘制饼图
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.title('菜品销售量分布(饼图)') # 设置标题
plt.axis('equal')
plt.show()
# 绘制条形图
x = data['菜品名']
y = data['盈利']
plt.figure(figsize = (8, 4)) # 设置画布大小
plt.bar(x,y)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.xlabel('菜品') # 设置x轴标题
plt.ylabel('销量') # 设置y轴标题
plt.title('菜品销售量分布(条形图)') # 设置标题
plt.show() # 展示图片
输出结果如图:
3. 对比分析——折线图
# 部门之间销售金额比较
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_excel("./Python数据分析与挖掘实战(第2版)/chapter3/demo/data/dish_sale.xls")
plt.figure(figsize=(8, 4))
plt.plot(data['月份'], data['A部门'], color='green', label='A部门',marker='o')
plt.plot(data['月份'], data['B部门'], color='red', label='B部门',marker='s')
plt.plot(data['月份'], data['C部门'], color='skyblue', label='C部门',marker='x')
plt.legend() # 显示图例
plt.ylabel('销售额(万元)')
plt.show()
结果如下:
4. 统计量分析
import pandas as pd
catering_sale = './Python数据分析与挖掘实战(第2版)/chapter3/demo/data/catering_sale.xls' # 餐饮数据
data = pd.read_excel(catering_sale, index_col = u'日期') # 读取数据,指定“日期”列为索引列
data = data[(data[u'销量'] > 400)&(data[u'销量'] < 5000)] # 过滤异常数据
statistics = data.describe() # 保存基本统计量
statistics.loc['range'] = statistics.loc['max']-statistics.loc['min'] # 极差
statistics.loc['var'] = statistics.loc['std']/statistics.loc['mean'] # 变异系数
statistics.loc['dis'] = statistics.loc['75%']-statistics.loc['25%'] # 四分位数间距
print(statistics)
得到结果如下:
关于如何指定索引,可以参考这两篇文章:
5. 周期性分析
import pandas as pd
import matplotlib.pyplot as plt
df_normal = pd.read_csv("./Python数据分析与挖掘实战(第2版)/chapter3/demo//data/user.csv")
plt.figure(figsize=(8,4))
plt.plot(df_normal["Date"],df_normal["Eletricity"])
plt.xlabel("日期")
plt.ylabel("每日电量")
# 设置x轴刻度间隔
x_major_locator = plt.MultipleLocator(7)
ax = plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
plt.title("正常用户电量趋势")
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.show() # 展示图片
输出结果如下:
关于坐标轴的设置问题可以参考以下两篇文章:
Matplotlib入门-2-坐标轴axis/axes设置 - 知乎
6. 贡献度分析
即找到贡献度最高的前80%的产品
import pandas as pd
# 初始化参数
dish_profit = './Python数据分析与挖掘实战(第2版)/chapter3/demo/data/catering_dish_profit.xls' # 餐饮菜品盈利数据
data = pd.read_excel(dish_profit, index_col = u'菜品名')
data = data[u'盈利'].copy()
data.sort_values(ascending = False)
import matplotlib.pyplot as plt # 导入图像库
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.figure()
data.plot(kind='bar')
plt.ylabel(u'盈利(元)')
p = 1.0*data.cumsum()/data.sum()
p.plot(color = 'r', secondary_y = True, style = '-o',linewidth = 2)
plt.annotate(format(p[6], '.4%'), xy = (6, p[6]), xytext=(6*0.9, p[6]*0.9), arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) # 添加注释,即85%处的标记。这里包括了指定箭头样式。
plt.ylabel(u'盈利(比例)')
plt.show()
结果如下:
7.相关性分析
可以用散点图和散点图矩阵来进行相关性分析
数据相关性分析:
from __future__ import print_function
import pandas as pd
catering_sale = './Python数据分析与挖掘实战(第2版)/chapter3/demo/data/catering_sale_all.xls' # 餐饮数据,含有其他属性
data = pd.read_excel(catering_sale, index_col = u'日期') # 读取数据,指定“日期”列为索引列
print(data.corr(),'\n') # 相关系数矩阵,即给出了任意两款菜式之间的相关系数
结果如下:
print(data.corr()[u'百合酱蒸凤爪'],'\n') # 只显示“百合酱蒸凤爪”与其他菜式的相关系数
结果如下:
print(data[u'百合酱蒸凤爪'].corr(data[u'翡翠蒸香茜饺']))
结果如下:
这篇文章基本只展示了书中的内容,以及汇总了一些我认为写的比较好的文章(侵删),之后的文章还会有更多各种图的画法~