机器学习 —— 数据分析与图表绘制

简介: 机器学习 —— 数据分析与图表绘制

   以朝阳医院2018年销售数据为例,目的是了解朝阳医院在2018年里的销售情况,这就需要知道几个业务指标,本次的分析目标是从销售数据中分析出以下业务指标:

(1)业务指标1:月均消费次数

   月均消费次数 = 总消费次数 / 月份数(同一天内,同一个人所有消费算作一次消费)

(2)业务指标2:月均消费金额

   月均消费金额 = 总消费金额 / 月份数

(3)客单价

   客单价 = 总消费金额 / 总消费次数

(4)消费趋势(可视化展示,并根据可视化结果给出下属问题分析得出的结论)

   a、分析每天的消费金额

   b、分析每月的消费金额

   c、分析药品销售情况(截取销售数量最多的前十种药品,并用条形图展示结果)

   数据分析基本过程 数据分析基本过程包括:获取数据、数据清洗、构建模型、数据可视化以及消费趋势分析。

(一)数据获取

1. 读取数据,并且返回表格的前几行数据

import pandas as pd
# 读取数据(最好使用 object 类型读取)
data = pd.read_excel("朝阳医院2018年销售数据.xlsx", dtype="object")
# 通过panda模块内置的read_excel方法读取格式为.xlsx的excel表格内容,以object类型读取,还有一个为read_csv方法读取的是格式为.csv的Excel表格
data.head()# 返回data的前几行数据,默认为前五行,括号内部可填入数字表示显示几行数据

图1:读取数据,并且返回表格的前几行数据

2. 修改为 DataFrame 格式,并且查看数据的形状

# 修改为 DataFrame 格式
dataDF = pd.DataFrame(data)# 定义一个dataDF来存储修改为DataFrame格式的数据
# DataFrame是一种表格型的数据结构。它的每一列可以是不同的值类型(例如布尔型、数值型、字符串等),
# 此外它既有行索引index,又有列索引columns。我们可以将它看成是由Series组成的字典(将每一列看成是一个Series)。
 
 # 查看数据的形状,即几行几列
print(dataDF.shape)# 形状(shape) 打印出数据的形状
print("dataDF.index:{}".format(dataDF.index))# 行索引(index) 打印出数据的参数

图2:修改为 DataFrame 格式,并且查看数据的形状

3. 查看每一列的列表头内容

# 查看每一列的列表头内容
print("dataDF.columns:{}".format(dataDF.columns))# 打印出数据的每个列表头的说明,以及数据的类型
print(dataDF.columns)# 列索引(columns)

图3:查看每一列的列表头内容

4. 查看每一列数据统计数目

# 查看每一列数据统计数目
# count()返回每一列中的非空值的个数。
print("dataDF计数:{}".format(dataDF.count()))

图4:查看每一列数据统计数目

(二)数据分析

       数据清洗过程包括:选择子集、列名重命名、缺失数据处理、数据类型转换、数据排序及异常值处理。

1. 列名重命名

# 使用 rename 函数,把"购药时间" 改为 "销售时间"
dataDF.rename(columns={"购药时间": "销售时间"}, inplace=True)
# 通过rename函数对于数据的列名(columns)里面的购药时间改成销售时间,inplace:是否替换,默认为False。
# inplace为False时返回修改后结果,变量自身不修改。inplace为True时返回None,变量自身被修改。
print("dataDF.columns:{}".format(dataDF.columns))
# 打印出修改后的数据结果,以及数据类型

图5:列名重命名

2. 缺失值处理

# 删除缺失值之前
# 打印出数据缺失值之前的类型(几行几列)
print("删除缺失值之前dataDF.shape:{}".format(dataDF.shape))
# 使用dropna函数删除缺失值
# 因为Excel中的空的cell读入pandas中是空值(NaN),这个NaN是个浮点类型,一般当作空值处理,所以要先去除NaN再进行分隔字符串。
dataDF = dataDF.dropna()# 通过内置的dropna函数删除缺失的数据
# 删除缺失值之后
# 打印出缺失的数据被删除后的数据类型(几行几列)
print("删除缺失值之后dataDF.shape:{}".format(dataDF.shape))
# 将字符串转为浮点型数据
# 将销售数量,应收金额,实收金额的数据类型由字符串转变为浮点数类型(float)
# 数据类型转换:astype函数:字符串转换成数值(浮点型)
dataDF["销售数量"] = dataDF["销售数量"].astype("f8")
dataDF["应收金额"] = dataDF["应收金额"].astype("f8")
dataDF["实收金额"] = dataDF["实收金额"].astype("f8")
print("dataDF.dtypes:{}".format(dataDF.dtypes))
 

图6:缺失值处理

3. 数据类型转换之自定义函数

# 将日期进行分割
# 自定义函数::分隔销售口期,获取销售日期
# 输入:timeColSer销售时间这一列,是个Series数据类型
# 输出:分割后的时间,返回的也是Series数据类型
def splitsaletime(timeColser):
    timelist = []
    for t in timeColser:# [0]表示选取的分片,这里表示切割完后选取第一个分片
        timelist.append(t.split(" ")[0])# split(" ")分割
        timeser = pd.Series(timelist)# 将列表转行为一维数据Series类型
    return timeser

图7:数据类型转换之自定义函数

4. 数据类型转换之调用自定义函数

# 获取"销售时间"这一列数据
t = dataDF.loc[:, "销售时间"]# 获取销售时间这一列数据的数据存储到t里面
# 调用函数去除星期,获取日期
timeser = splitsaletime(t)# 对字符串进行分割,获取销售日期
# 修改"销售时间"这一列日期
dataDF.loc[:, "销售时间"] = timeser
print(dataDF.head())

图8:数据类型转换之调用自定义函数

5. 数据类型转换

# 字符串转日期
# errors='coerce'如果原始数据不符合日期的格式,转换后的值为NaT
dataDF.loc[:, "销售时间"] = pd.to_datetime(dataDF.loc[:, "销售时间"], errors='coerce')
# 将原本是字符串的日期类型转变成日期datatime类型的,pandas提供了一个可选的参数errors,
# 传入errors=‘coerce’,pandas遇到不能转换的数据就会赋值为NaN(Not a Number)
print("dataDF.dtypes:{}".format(dataDF.dtypes))

图9:数据类型转换

6. 删除空值

# 转换日期过程中不符合日期格式的数值会被转换为空值None,
 # 这里删除为空的行
dataDF = dataDF.dropna()
print("dataDF.shape:{}".format(dataDF.shape))
# 按销售时间进行升序排序
dataDF = dataDF.sort_values(by='销售时间', # by :按几列排序
                            ascending=True)# ascending=True为升序,ascending=False为降序
print("dataDF.head():{}".format(dataDF.head()))
# 重置索引(index)
dataDF = dataDF.reset_index(drop=True)
# 通过reset进行索引的重置,drop=True表示删除用作新索引的列,也就是删除被用作索引的第一列

图10:删除空值

7. 删除异常值

# 查看描述统计信息
# 描述指标:“销售数量”值不能小于0
print(dataDF.describe())
# 删除异常值:通过条件判断筛选出数据
# 将"销售数量"这一列中小于0的数排除掉
pop = dataDF.loc[:, "销售数量"] > 0
dataDF = dataDF.loc[pop, :]

图11:删除异常值

8. 删除重复数据

# 排除异常值后再次查看描述统计信息
print(dataDF.describe())
# 计算总消费次数
# 删除重复数据
kpi1_Df = dataDF.drop_duplicates(subset=['销售时间', '社保卡号'])
# drop_duplicates是pandas内的一个删除函数,subset:表示要进去重的列名,默认为 None。

图12:删除重复数据

(三)构建模型及数据可视化

       数据清洗完成后,需要利用数据构建模型(就是计算相应的业务指标),并用可视化的方式呈现结果。

1. 计算总消费次数

# 计算总消费次数
# 总消费次数:同一天内,同一个人发生的所有消费算作一次消费
# 有多少行
totall = kpi1_Df.shape[0]# 统计有多少行的数据(总消费次数)
print('总消费次数:', totall)
# 按销售时间升序排序
kpi1_Df = kpi1_Df.sort_values(by='销售时间', ascending=True)
# 对销售时间这一列进行升序排序,ascending=True为升序,ascending=False为降序
# 重命名行名(index)
kpi1_Df = kpi1_Df.reset_index(drop=True)

图13:计算总消费次数

2. 业务指标1-3(月均消费次数、月均消费金额、客单价)

# 获取时间范围
# 最小时间值
startTime = kpi1_Df.loc[0, '销售时间']
# 最大时间值
endTime = kpi1_Df.loc[totall - 1, '销售时间']
# 计算天数
daysI = (endTime - startTime).days
# 月份数:运算符"//"表示取整除,返回商的整数部分
monthsI = daysI // 30
print('月份数:', monthsI)

# 计算月均消费次数
# 业务指标1:月均消费次数=总消费次数 / 月份数
kpi1_I = totall // monthsI
print('业务指标1:月均消费次数=', kpi1_I)

# 总消费金额
totalMoneyF = dataDF.loc[:, '实收金额'].sum()
# 月均消费金额
# 业务指标2:月均消费金额 = 总消费金额 / 月份数
monthMoneyF = totalMoneyF / monthsI
print('业务指标2:月均消费金额=', monthMoneyF)

# 业务指标3:客单价 = 总消费金额 / 总消费次数
# 客单价(per customer transaction)是指商场(超市)每一个顾客平均购买商品的金额,客单价也即是平均交易金额。
pct = totalMoneyF / totall
print('业务指标3:客单价=', pct)

图14:月均消费次数、月均消费金额、客单价

3. 业务指标:消费趋势(可视化展示)

# 业务指标:消费趋势,画图-折线图
import matplotlib.pyplot as plt
from pylab import mpl # 画图时用于显示中文字符
mpl.rcParams['font.sans-serif'] = ['SimHei']   # SimHei是黑体的意思
# 在操作之前先复制一份数据,防止影响清洗后的数据
groupDf = dataDF
# 重命名行(index)为销售时间所在列的值
groupDf.index = groupDf['销售时间']
groupDf.head()

图15:重命名行(index)为销售时间所在列的值

4. a、分析每天的消费金额

# a、分析每天的消费金额
plt.figure(figsize=(20,10))# 设置画布大小
plt.plot(groupDf['实收金额'])
# plt.plot(x, y, format_string, **kwargs)可以绘制点和线, 并且对其样式进行控制
# x               X轴数据,列表或数组,可选
# y               Y轴数据,列表或数组
# format_string   控制曲线的格式字符串,可选
# kwargs          第二组或更多(x,y,format_string),可画多条曲线
plt.title('按天消费金额(ZShiJ)')# 设置图像标题
plt.xlabel('时间')    # 设置x轴的标签文本
plt.ylabel('实收金额')# 设置y轴的标签文本
plt.savefig("day.png")# 保存图片
plt.show()            # 把图像显示出来。

图16:a、分析每天的消费金额

图17:按天消费金额

       分析:由图17按天消费金额,可以看出,每天的消费金额有所不同,但是除了极个别天会出现消费的金额较大,大部分人消费情况基本都在500元以内。

5. b、分析每月的消费金额

# b、分析每月的消费金额
# 将销售时间聚合按月分组
gb = groupDf.groupby(groupDf.index.month)
print(gb)

图18:b、分析每月的消费金额

6. 描绘按月消费金额图

# 描绘按月消费金额图
# 对进行按月份分组好数据进行求和,从而看到每个月份的销售数量,应收金额,实收金额的数据和
monthDF = gb.sum()
print(monthDF)
# plt.figure(figsize=(8,7))# 设置画布大小
plt.plot(monthDF['实收金额'])# 根据实收金额绘制按月消费金额图的线图
plt.title('按月消费金额(ZShiJ)')# 设置图像标题
plt.xlabel('时间')      # 设置x轴的标签文本
plt.ylabel('实收金额')  # 设置y轴的标签文本
plt.savefig("month.png")# 保存图片
plt.show()              # 把图像显示出来。

图19:描绘按月消费金额图

图20:按月消费金额

       分析:由图20按月消费金额的结果显示,我们可以看出7月消费金额最少,我认为这是因为7月份的数据不完整,所以不具参考价值。

       1月、4月、5月和6月的月消费金额差异不大,2月和3月的消费金额迅速降低,这可能是2月和3月处于春节期间,大部分人都回家过年的原因。

7. c、分析药品销售情况(截取销售数量最多的前十种药品,并用条形图展示结果)

# c、分析药品销售情况(截取销售数量最多的前十种药品,并用条形图展示结果)
# 聚合统计各种药品的销售数量
# 对“商品名称”和“销售数量”这两列数据进行聚合为Series形式
medicine = groupDf[['商品名称','销售数量']]
# groupby按照商品名称进行分组,算出商品名称对应相应的销售数量
bk = medicine.groupby('商品名称')[['销售数量']]
# 按照商品名称对药品的销售数量进行求和
re_medicine = bk.sum()

图21:c、分析药品销售情况

8. 降序排序截取销售数量最多的十种药品

# 对药品销售数量按降序排序
re_medicine = re_medicine.sort_values(by='销售数量', ascending=False)# 降序排序
re_medicine.head()
# 截取销售数量最多的十种药品
top_medicine = re_medicine.iloc[:10,:]
print(top_medicine)

图22:降序排序截取销售数量最多的十种药品

9. 条形图展示销售数量前十的药品


# 用条形图展示销售数量前十的药品
# 对数据的top_medicine进行条形图的可视化
top_medicine.plot(kind = 'bar',color = 'pink')
plt.title('销售前十的药品(ZShiJ)')# 设置图像标题
plt.xlabel('药品')             # 设置x轴的标签文本
plt.ylabel('数量')             # 设置y轴的标签文本
plt.savefig("top_medicine.png")# 保存图片
plt.show()                     # 把图像显示出来。

图23:条形图展示销售数量前十的药品

图24:销售前十的药品

       分析:由图24销售前十的药品可以得到销售数量最多的前十种药品信息,这些信息将会有助于加强医院对药房的管理,比如多进一些销售数量多的药品。

异常问题与解决方案

问题1:去重复值用错函数

图25:没有成功去重复值

解决方案:Dropna是删除空值和缺失值,删除重复值需要使用drop_duplicates,drop_duplicates是pandas内的一个删除函数,subset:表示要进去重的列名,默认为 None。

图26:计算总消费次数

问题2:需要注意数据类型转换

图27:数据类型转换

解决方法:一定要记得将原始数据字符串格式日期转换成正常的数据日期,否则会影响后面建模。

参考资料

[1] 详解pandas最常用的3种去重方法

[2] Pandas常用函数大合集

[3] plt.plot()函数解析

[4] Pandas数据排序

[5] 可视化之用pandas绘制简单的图形




相关文章
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
104 4
|
10天前
|
机器学习/深度学习 算法 数据挖掘
Python数据分析革命:Scikit-learn库,让机器学习模型训练与评估变得简单高效!
在数据驱动时代,Python 以强大的生态系统成为数据科学的首选语言,而 Scikit-learn 则因简洁的 API 和广泛的支持脱颖而出。本文将指导你使用 Scikit-learn 进行机器学习模型的训练与评估。首先通过 `pip install scikit-learn` 安装库,然后利用内置数据集进行数据准备,选择合适的模型(如逻辑回归),并通过交叉验证评估其性能。最终,使用模型对新数据进行预测,简化整个流程。无论你是新手还是专家,Scikit-learn 都能助你一臂之力。
57 8
|
6天前
|
机器学习/深度学习 数据可视化 数据挖掘
数据可视化大不同!Python数据分析与机器学习中的Matplotlib、Seaborn应用新视角!
在数据科学与机器学习领域,数据可视化是理解数据和优化模型的关键。Python凭借其强大的可视化库Matplotlib和Seaborn成为首选语言。本文通过分析一份包含房屋面积、卧室数量等特征及售价的数据集,展示了如何使用Matplotlib绘制散点图,揭示房屋面积与售价的正相关关系;并利用Seaborn的pairplot探索多变量间的关系。在机器学习建模阶段,通过随机森林模型展示特征重要性的可视化,帮助优化模型。这两个库在数据分析与建模中展现出广泛的应用价值。
19 2
|
2月前
|
数据采集 机器学习/深度学习 算法
"揭秘数据质量自动化的秘密武器:机器学习模型如何精准捕捉数据中的‘隐形陷阱’,让你的数据分析无懈可击?"
【8月更文挑战第20天】随着大数据成为核心资源,数据质量直接影响机器学习模型的准确性和效果。传统的人工审查方法效率低且易错。本文介绍如何运用机器学习自动化评估数据质量,解决缺失值、异常值等问题,提升模型训练效率和预测准确性。通过Python和scikit-learn示例展示了异常值检测的过程,最后强调在自动化评估的同时结合人工审查的重要性。
55 2
seaborn常用的10种数据分析图表
seaborn常用的10种数据分析图表
|
3月前
|
机器学习/深度学习 自然语言处理 数据挖掘
机器学习不再是梦!PyTorch助你轻松驾驭复杂数据分析场景
【7月更文挑战第31天】机器学习已深深嵌入日常生活,从智能推荐到自动驾驶皆为其应用。PyTorch作为一个开源库,凭借简洁API、动态计算图及GPU加速能力,降低了学习门槛并提高了开发效率。通过一个使用PyTorch构建简单CNN识别MNIST手写数字的例子,展现了如何快速搭建神经网络。随着技能提升,开发者能运用PyTorch及其丰富的生态系统(如torchvision、torchtext和torchaudio)应对复杂场景,如自然语言处理和强化学习。掌握PyTorch,意味着掌握了数据时代的关键技能。
21 1
|
2月前
|
数据可视化 数据挖掘 Python
数据可视化不再难!Matplotlib带你轻松绘制精美图表,让数据分析焕发光彩!
【8月更文挑战第22天】今天分享如何用Python的Matplotlib库绘制多样图表。Matplotlib是数据可视化的强大工具,对数据分析至关重要。本文分六部分:首先介绍环境准备,包括安装和配置;随后通过四个案例演示折线图、柱状图、饼图及散点图的绘制方法;最后总结并鼓励大家进一步探索Matplotlib的丰富功能。跟着示例操作,你将学会基本图表的制作,提升数据展示技能。
28 0
|
2月前
|
机器学习/深度学习 搜索推荐 数据挖掘
【深度解析】超越RMSE和MSE:揭秘更多机器学习模型性能指标,助你成为数据分析高手!
【8月更文挑战第17天】本文探讨机器学习模型评估中的关键性能指标。从均方误差(MSE)和均方根误差(RMSE)入手,这两种指标对较大预测偏差敏感,适用于回归任务。通过示例代码展示如何计算这些指标及其它如平均绝对误差(MAE)和决定系数(R²)。此外,文章还介绍了分类任务中的准确率、精确率、召回率和F1分数,并通过实例说明这些指标的计算方法。最后,强调根据应用场景选择合适的性能指标的重要性。
139 0
|
10天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
39 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 算法 数据挖掘
8个常见的机器学习算法的计算复杂度总结
8个常见的机器学习算法的计算复杂度总结
8个常见的机器学习算法的计算复杂度总结

热门文章

最新文章

下一篇
无影云桌面