本笔记摘录清华大学工业工程系朱成礼老师的python教案与授课内容,并在此基础上进行实操性的拓展,希望能对大家有所帮助。

一、数据分析简介

数据分析的一般流程:需求分析——>获取数据——>数据预处理——>分析与建模——>评价与优化——>部署

二、数据分析实例

1、数据集情况简介

2、数据预处理(清洗)

2.1 数据探索分析

快速了解数据全貌,发现数据特征

编号、类名、非空数的数量、数据类型

import pandas as pd
# 加载csv数据集,指定第一列为索引
iris_data = pd.read_csv('data/Iris_0625.csv)
iris_data.info() # 查看数据集信息# 显示前5行数据
print(iris_data.head())
# 描述性统计信息
print(iris_data.describe())

2.2 重复行分析与处理

输出重复行标记,若要查看重复行,则print(a[df......])

id一样,标记为重复;定义某一列,若该列重复则就算重复(用subject指定)。keep=‘first'表示第一个不标记为重复,后面的算重复

inplace = True在原来DataFrame上做操作;False生成DataFrame副本

2.3缺失值分析与处理

缺失值的处理方法:

• 删除含有缺失值的记录

• 数据补齐(就近补齐、均值补齐、利用同类均值补齐、拟合补齐)

• 不处理

2.3.1 缺失值检测

2.3.2 使用describe检测缺失值

count列表示非空的数字个数

2.3.3 使用fillna()填充缺失值

df.fillna(value=None, method=None, axis=None)
# method:{‘ffill’用前面的值填充, ‘bfill’用后面的值填充, None用value去填充}
df1 = df.fillna('missing')
df2 = df.fillna(method='ffill')
values = {'A': 0, 'B': 1, 'C': 2, 'D': 3}
# A,B,C,D指列的名字
df3 = df.fillna(value=values, limit=1)

2.3.4 用dropna()删除

df.dropna(axis=0, how='any', thresh=None)
df1 = df.dropna() # 删除含有缺失值的行
df2 = df.dropna(how='all') # 删除全为缺失值的行
df3 = df.dropna(thresh=2) # 删除至少含有2个缺失值的行

2.3.5 使用同类均值填补缺失值

df_data = pd.read_csv('data/iris_deldup.csv', index_col=[0])
# 按类别分组
iris_group = df_data.groupby(‘Species’)
# 用类别均值填充缺失值
for x in iris_group:   # 对每一个组都进行同样的操作values = x[1].mean().to_dict()   # 以列为key,以均值为value生成字典x[1].fillna(value=values, inplace=True) df_data.update(x[1])
# 填充后的数据保存至硬盘
df_data_fillna.to_csv('data/iris_fillna.csv')

2.4 异常值分析与处理.

2.4.1 基于偏差的方法

绘制直方图,若服从正态分布,则可使用此法

2.4.2 箱线图分析法

上限之上、下限之下的数据被认为是异常值

删除异常值

sw_q1 = df_data['SepalWidth'].quantile(0.25) # 计算上四分位数
sw_q3 = df_data['SepalWidth'].quantile(0.75) # 计算下四分位数
sw_iqr = sw_q3 - sw_q1 # 计算四分位间距
sw_low = sw_q3 - 1.5 * sw_iqr # 计算下限
sw_up = sw_q1 + 1.5 * sw_iqr # 计算上限
delabnormal_data = df_data.query(f'SepalWidth > {sw_low} and
SepalWidth < {sw_up}')
# 绘制去除异常值之后,花萼宽度箱线图
delabnormal_data[['SepalWidth']].plot(kind='box', grid=False)
plt.savefig('figure/iris_sepalwidth_box')
delabnormal_data.to_csv('data/iris_delabnormal.csv')

2.5 应用实例1

import pandas as pd
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']# 数据快速探索性分析
# 加载数据集
iris_data = pd.read_csv('Iris_0625.csv')# 查看数据集信息
iris_data.info()# 输出前六行数据
print(iris_data.head(6))# 输出数据统计量(最大值、均值、四分数、标准差)
print(iris_data.describe())# 重复行及缺失值处理
# 输出重复行,统计重复行数
dup_row = iris_data.duplicated(keep=False)
print(f'重复行:{iris_data[dup_row]}')
dup_count = dup_row.sum()
print(f'重复行数:{dup_count}')# 保留一行并删除其余行
df_result = iris_data.drop_duplicates(keep='first')
df_result.to_csv('iris_delduplicated.csv', index=False)
iris_delduplicated = pd.read_csv('iris_delduplicated.csv')# 统计缺失信息
df_r1 = iris_delduplicated.isnull()
print(f'是否有缺失值:\n{df_r1}')df_r2 = iris_delduplicated.isnull().any(1)
print(f'行的缺失值信息为::{df_r2}')df_r3 = iris_delduplicated.isnull().any(1).sum()
print(f'有缺失值的行的个数为:{df_r3}')# 输出各行缺失值个数
df_r4 = iris_delduplicated.isnull().sum(axis=1)
print(f'各行缺失值个数为:{df_r4}')# 输出缺失值总数
a = df_r4.sum(axis=0)
print(f'缺失值总数为:{a}')# 使用列均值填充缺失值
values = iris_delduplicated.mean().to_dict()
df_fill = iris_delduplicated.fillna(value=values, limit=1)
iris_delduplicated.update(df_fill)
iris_delduplicated.to_csv('iris_fillna1.csv')# 使用同类均值填充缺失值
# 按类别分组
iris_group = iris_delduplicated.groupby('Species')# 用类别均值填充缺失值
for x in iris_group:values = x[1].mean().to_dict()x[1].fillna(value=values, inplace=True)iris_delduplicated.update(x[1])# 将填充后的数据保存至硬盘
iris_delduplicated.to_csv('iris_fillna2.csv')# 异常值分析与处理
# 绘制各属性列的箱线图
plt.figure(figsize=(8, 6), num='箱线图')
plt.subplot(221)
plt.boxplot(iris_delduplicated['SepalLength'], labels=['花萼长度'])plt.subplot(222)
plt.boxplot(iris_delduplicated['SepalWidth'], labels=['花萼宽度'])plt.subplot(223)
plt.boxplot(iris_delduplicated['PetalLength'], labels=['花瓣长度'])plt.subplot(224)
plt.boxplot(iris_delduplicated['PetalWidth'], labels=['花瓣宽度'])# 调整子图之间的距离
plt.subplots_adjust(wspace=0.2, hspace=0.25)
plt.savefig('iris-box.png')# 删除含有异常值的行
sw_q1 = iris_delduplicated['SepalWidth'].quantile(0.25)  # 计算下四分位数
sw_q3 = iris_delduplicated['SepalWidth'].quantile(0.75)  # 计算上四分位数
sw_iqr = sw_q3 - sw_q1  # 计算四分位间距
sw_low = sw_q1 - 1.5 * sw_iqr  # 计算下限
sw_up = sw_q3 + 1.5 * sw_iqr  # 计算上限
delabnormal_data = iris_delduplicated.query(f'SepalWidth > {sw_low} and SepalWidth < {sw_up}')# 绘制去除异常值之后,花萼宽度箱线图
# 将处理后的数据保存至csv文件
delabnormal_data[['SepalWidth']].plot(kind='box', grid=False)
plt.savefig('iris_sepalwidth_box')
delabnormal_data.to_csv('iris_delabnormal.csv')

3、数据特征分析

3.1 分布分析

揭示数据的分布特征和分布类型,显示其分布情况。可用直方图表示

3.2 统计量分析

包括描述数据集中趋势的统计值(平均数、中位数和众数)、描述数据离中趋势的统计量(极 差、四分位数、平均差、方差、标准差和变异系数)和描述数据分布状况的统计量(偏态系 数)。

3.3 相关性分析

是研究两个或两个以上的变量间的相关关系。可用相关系数、散点图来反映。

3.4 特征选择

当数据预处理完成后,需要选择有意义的特征来构建数据分析模型,好的特征能够构造出 较好的分析模型。

特征选择主要有两个目的: (1)减少特征数量、降维,使模型泛化能力更强,减少过拟合 (2)增强对特征和特征值之间的理解

3.5 应用实例2

import pandas as pd
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']# 特征分析
# 加载预处理后的数据文件
iris_data = pd.read_csv('iris_delabnormal.csv', index_col=[0])# 在一个Figure上绘制杂色鸢尾花(Species=2)四个属性的直方图(bins=20)
iris_group = iris_data.query("Species==2")# 绘制变量直方图
plt.figure(figsize=(8, 6), num=1)  # 设置图形大小和编号plt.subplot(221)  # 绘制第一个图
plt.hist(iris_group['SepalLength'], bins=20, density=True,edgecolor='black', linewidth='1.0')
plt.xlabel('花萼长度')
plt.ylabel('频率')
plt.title('花萼长度分布图')plt.subplot(222)  # 绘制第一个图
plt.hist(iris_group['SepalWidth'], bins=20, density=True,edgecolor='black', linewidth='1.0')
plt.xlabel('花萼宽度')
plt.ylabel('频率')
plt.title('花萼宽度分布图')plt.subplot(223)  # 绘制第一个图
plt.hist(iris_group['PetalLength'], bins=20, density=True,edgecolor='black', linewidth='1.0')
plt.xlabel('花瓣长度')
plt.ylabel('频率')
plt.title('花瓣长度分布图')plt.subplot(224)  # 绘制第一个图
plt.hist(iris_group['PetalLength'], bins=20, density=True,edgecolor='black', linewidth='1.0')
plt.xlabel('花瓣宽度')
plt.ylabel('频率')
plt.title('花瓣宽度分布图')
# 调整子图之间的距离
plt.subplots_adjust(wspace=0.25, hspace=0.4)
plt.savefig('iris_hist.png')
plt.show()# 绘制三种鸢尾花SepalLength和PetalLength变量之间的散点图,并将此图保存至png文件
setosa_data = iris_data[iris_data.Species == 1]
versicolor_data = iris_data[iris_data.Species == 2]
virginica_data = iris_data[iris_data.Species == 3]
s1 = plt.scatter(setosa_data['PetalLength'],setosa_data['PetalWidth'],color='red', marker='.')
s2 = plt.scatter(versicolor_data['PetalLength'],versicolor_data['PetalWidth'],color='orange', marker='x')
s3 = plt.scatter(virginica_data['PetalLength'],virginica_data['PetalWidth'],color='blue', marker='+')
plt.title('花瓣长度与宽度散点图')
plt.xlabel('花瓣长度')
plt.ylabel('花瓣宽度')
plt.legend((s1, s2, s3), ('setosa', 'versicolor', 'virginica'),loc='best')
plt.savefig('petal_lenth_width.png')
plt.show()# 选择特征属性
# 计算各属性之间的相关系数
corr_matrix = iris_data.corr()
print(corr_matrix)# PetalLength与PetalWidth相关系数约为0.95,保留一个变量
select_data = iris_data[['SepalLength', 'SepalWidth','PetalLength', 'Species']]# 保存筛选变量后的数据
select_data.to_csv('iris_selvariables.csv', encoding='utf_8_sig')

4、分类模型

4.1 决策树分类

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
# 加载csv数据集,指定第一列为索引
df_data = pd.read_csv('data/iris_delabnormal.csv', index_col=[0])
# 将Species列赋值于y,为分类标号,其余列赋值给x,为属性集
x = df_data[['SepalLength','SepalWidth', 'PetalLength', 'PetalWidth']]
y = df_data['Species']
# 将对数据集分成训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
model_dtc = DecisionTreeClassifier() # 建立决策树模型
model_dtc.fit(x_train, y_train) # 训练模型
y_pred = model_dtc.predict(x_test) #用模型用测试集
# 计算决策树分类模型的准确率
print("决策树模型评分(acc):", model_dtc.score(x_test, y_test))
print('计算准确率(acc):', metrics.accuracy_score(y_test, y_pred))

4.2 回归分析

4.3 逻辑回归

4.4 应用案例3

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics# 加载csv数据集,指定第一列为索引
df_data = pd.read_csv('iris_delabnormal.csv', index_col=[0])# 将Species列赋值给y,其余列赋值给x
x = df_data[['SepalLength', 'SepalWidth','PetalLength', 'PetalWidth']]
y = df_data['Species']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
model_dtc = DecisionTreeClassifier()  # 建立决策树模型
model_dtc.fit(x_train, y_train)  # 训练模型
y_pred = model_dtc.predict(x_test)  # 用测试集形成一系列预测值# 计算决策树分类模型的准确率
print(f'决策树模型评分(acc):{model_dtc.score(x_test, y_test)}')
print(f'计算准确率:{metrics.accuracy_score(y_test,y_pred)}')
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics# 加载csv数据集,指定第一列为索引
df_data = pd.read_csv('iris_delabnormal.csv', index_col=[0])# 将Species列赋值给y,其余列赋值给x
x = df_data[['SepalLength', 'SepalWidth','PetalLength', 'PetalWidth']]
y = df_data['Species']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)# 建立逻辑回归模型
model_lr = LogisticRegression(max_iter=500)
model_lr.fit(x_train, y_train)# 预测测试集
y_pred = model_lr.predict(x_test)  # 返回ndarray
print(f'逻辑回归模型评分(acc):{model_lr.score(x_test, y_test)}')
print(f'逻辑回归模型评分:{metrics.accuracy_score(y_test, y_pred)}')# 保存预测结果
y_test.to_csv('lr_test.csv')
np.savetxt('lr_pred.csv', y_pred, fmt='%0.1f', delimiter=',', newline='\n')

我们的授课内容就到此结束了,随后我还会更新更多对数据分析和机器学习的自学内容。感谢观看!

Python学习DAY5|数据分析简介与实战相关推荐

  1. Python学习day5作业-ATM和购物商城

    Python学习day5作业 Python学习day5作业 ATM和购物商城 作业需求 ATM: 指定最大透支额度 可取款 定期还款(每月指定日期还款,如15号) 可存款 定期出账单 支持多用户登陆, ...

  2. Python学习day5作业

    目录 Python学习day5作业 ATM和购物商城 1. 程序说明 2. 基本流程图 3. 程序测试帐号 4. 程序结构: 5. 程序测试 title: Python学习day5作业 tags: p ...

  3. 小猪的Python学习之旅 —— 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中

    小猪的Python学习之旅 -- 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中 标签:Python 一句话概括本文: 利用Excel存储爬到的抓取豆瓣音乐Top 250数据信息,还有 ...

  4. Python学习笔记一简介及安装配置

    Python学习笔记一 参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e54 ...

  5. Python学习笔记——数据分析之数据可视化工具实战案例:世界高峰数据可视化

    世界高峰数据可视化 (World's Highest Mountains) 参考:https://www.kaggle.com/alex64/d/abcsds/highest-mountains/le ...

  6. python大数据分析基础教程_基于Python的大数据分析基础及实战

    第1部分 基 础 篇 第1章 Python语言基础 /2 1.0 引子 /2 1.1 工欲善其事,必先利其器(安装Python) /3 1.2 学跑得先学走(语法基础) /9 1.3 程序结构 /11 ...

  7. Python学习笔记——数据分析之工作环境准备及数据分析建模理论基础

    目录 <Linkedln:2016年中国互联网最热职位人才库报告> Python3.x 常用的新特性 字符串编码格式回顾: DIKW 体系 数据建模基础 <Linkedln:2016 ...

  8. python 豆瓣评论数据分析_Python爬虫实战案例:豆瓣影评大数据分析报告之网页分析...

    个人希望,通过这个完整的爬虫案例(预计总共4篇短文),能够让爬虫小白学会怎么做爬虫的开发,所以在高手们看来,会有很多浅显的废话,如果觉得啰嗦,可以跳过一些内容~ 上一篇文章给大家简单介绍了Python ...

  9. python学习(25) BeautifulSoup介绍和实战

    BeautifulSoup是python的html解析库,处理html非常方便 BeautifulSoup 安装 pip install beautifulsoup4 BeautifulSoup 配合 ...

最新文章

  1. mysql 二进制日志后缀数字最大为多少
  2. 虚拟机nat固定IP上网配置
  3. 怎么让员工服从管理_职场 | 在职场中,遇到不服从管理的员工,该怎么办呢?...
  4. 利用trunk实现vlan内通信_实现不同VLAN间通信——单臂路由
  5. HTTP,TCP, socket,RPC 与gRPC都是啥?
  6. nodejs的mysql初始化
  7. 微信打飞机--Java版
  8. Git以及Git小乌龟的安装使用
  9. sketchup草图家具拆单软件 衣柜橱柜拆单 SU 全屋定制拆单 有屋软件 下料机
  10. Bootstrap自定义图标
  11. PD快充3.0协议芯片
  12. 企业微信开发OA审批
  13. Python之路【第二十篇】:python项目之旧版抽屉新热榜
  14. python idle解释器的命令提示符是_Python IDLE使用
  15. CF896C Willem, Chtholly and Seniorious(珂朵莉树)
  16. 解决Could not resolve XXX
  17. 为网站配置免费的HTTPS证书 4-4
  18. 分布式下载方式(二)DHT分布式网络
  19. Python中str和repr的区别
  20. Java使用iText生成word文 表格、图片、表格里插图片、页眉、页脚、图片页脚、(学习帖)

热门文章

  1. 影视剧中十大经典反派台词!(来自大洋论坛)
  2. 不平衡数据集评价指标及常用解决方法
  3. 段子用计算机等于250,段子手要失业了,计算机也懂幽默
  4. Transformer课程 第8课 NER案例模型训练及预测
  5. java中像scanf一样多个输入_VB模拟键盘输入的N种方法
  6. 12.3 文本查询程序
  7. java 接收 char字符型
  8. 【毕业设计】Java ssm+vue酒店管理系统
  9. 【微信小程序】访问本地服务器 404
  10. 三星原生android手机,非原生系统??三星Android Go手机曝光