python数据分析基础及流程回顾,重点数据预处理之异常值发现与处理

一、 python数据分析基础库的导入

基本是固定搭配

import numpy as np               #科学计算基础库,多维数组对象ndarray
import pandas as pd              #数据处理库,DataFrame(二维数组)
import matplotlib as mpl         #画图基础库
import matplotlib.pyplot as plt  #最常用的绘图库


mpl.rcParams["font.family"]="SimHei"  #使用支持的黑体中文字体
mpl.rcParams["axes.unicode_minus"]=False # 用来正常显示负号  "-"
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
# % matplotlib inline  #jupyter中用于直接嵌入图表,不用plt.show()
import warnings
warnings.filterwarnings("ignore") #用于排除警告
 
#用于显示使用库的版本
print("numpy_" + np.__version__)
print("pandas_" + pd.__version__)
print("matplotlib_"+ mpl.__version__)

numpy_1.17.4
pandas_0.23.4
matplotlib_2.2.3

二、基础回顾

基本使用简单描述统计1

统计:
sum, mean, std, var,
min, max, argmin, argmax
cumsum, cumprod

排序相关
sort(axis)、
unique( )

随机数生成
from numpy.random import **

numpy.random

简单的随机数据

rand(d0, d1, …, dn),

randn(d0, d1, …, dn)

sigma * np.random.randn(…) + mu

randint(low[, high, size])

random_integers(low[, high, size])

choice(a[, size, replace, p])

排列

shuffle(x) #洗牌

permutation(x) #转置

changes=pd.DataFrame(np.random.normal(loc=0.001,scale=np.sqrt(0.005),size=(100,100)))
#np.random.normal(loc=期望值,scale=标准差,size=(行个数,列个数)),
#生成期望为0.001,方差为0.005(标准差sqrt(0.005))的服从正态分布的100 rows × 100 columns个数,然后放入二维表中
#print(changes.head()) #获取前5行
display(changes.loc[:3,:3]) #切片获取前4行,前4列
#changes.plot() 简单的化一个折线图
returns = changes.cumsum(axis=0)  #cumsum(0)表示按照行进行累加
display(returns.loc[97:100,:3])
#returns.plot()简单的化一个折线图
print(returns.loc[99,].mean())#计算最后一行的均值
print(returns.loc[99,].std()) #计算最后一行的标准差
print(returns.loc[99,].var()) #计算最后一行的方差

0123
0-0.0732650.027694-0.0052740.018362
1-0.162326-0.0276500.013609-0.002829
20.0274910.108222-0.079539-0.007628
3-0.063755-0.0320450.0764770.084774
0123
97-0.621215-0.131843-0.440428-1.508183
98-0.508074-0.243702-0.522049-1.435103
99-0.447405-0.366133-0.471084-1.376747
-0.0037164612652884122
0.6395170858647697
0.40898210311296734

基本使用分布函数2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LANpGybx-1581021357095)(attachment:image.png)]

三、数据分析流程

任务描述:
–理解数据类型和数据结构
–载入数据
–清洗数据
–做简单的统计分析
–使用基础的可视化

数据分析的步骤:
–获取数据
–数据预处理
–数据分析
–数据挖掘
–可视化展现

数据预处理(数据分析和挖掘的瓶颈):
–获取数据
–载入数据
–清洗数据:异常
–清洗数据:维度
–清洗数据:粒度
–缺失值;无效值;格式转换;命名变换;类型转换

数据预处理案例

1、 理解和获取数据
# 理解和获取数据
# 头部导入库在最前面一中:此处略
df = pd.read_csv(r"E:\tips.csv",encoding='utf-8') #导入csv格式数据
display(df.sample(5))  #随机抽样5行
#某餐厅顾客消费记录
#解释数据结构:total_bill	消费, tip	小费,sex	服务员性别,smoker	是否抽烟,day	星期几,time	午餐/晚餐,size	本桌人数
total_billtipsexsmokerdaytimesize
23510.071.25MaleNoSatDinner2
11014.003.00MaleNoSatDinner2
4828.552.05MaleNoSunDinner3
13312.262.00FemaleNoThurLunch2
13120.272.83FemaleNoThurLunch2
2、数据清洗及简单统计

清洗数据:https://blog.csdn.net/weixin_41685388/article/details/103841296

# 对数据做基本统计,检查异常,看看数据质量
print("行列数:",df.shape)  #查看总的有n行,m列
print("info统计:",df.info()) #查看数据是否有缺失值,这里无
display("查看重复值:",df[df.duplicated(subset=["total_bill","tip"],keep=False)])#这组数据查看重复值没什么意义,true无重复
#df1 = df.drop_duplicates(subset=["total_bill","tip"],keep='first',inplace=False) #当然这里没必要删除
display("数值列统计:",df.describe()) # 数值列 和 非数值列  的统计结果不一样!默认统计数值列
display("非数值列统计:",df[["sex","smoker","day","time"]].describe()) #统计非数值列
行列数: (244, 7)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 244 entries, 0 to 243
Data columns (total 7 columns):
total_bill    244 non-null float64
tip           244 non-null float64
sex           244 non-null object
smoker        244 non-null object
day           244 non-null object
time          244 non-null object
size          244 non-null int64
dtypes: float64(2), int64(1), object(4)
memory usage: 13.4+ KB
info统计: None



'查看重复值:'
total_billtipsexsmokerdaytimesize
6113.812.0MaleYesSatDinner2
16313.812.0MaleNoSunDinner2
19813.002.0FemaleYesThurLunch2
20213.002.0FemaleYesThurLunch2
'数值列统计:'
total_billtipsize
count244.000000244.000000244.000000
mean19.7859432.9982792.569672
std8.9024121.3836380.951100
min3.0700001.0000001.000000
25%13.3475002.0000002.000000
50%17.7950002.9000002.000000
75%24.1275003.5625003.000000
max50.81000010.0000006.000000
'非数值列统计:'
sexsmokerdaytime
count244244244244
unique2242
topMaleNoSatDinner
freq15715187176
3、位置度量
  • -算数平均:mean

  • -中位数:median

  • -截尾均值:去除部分小/大的离散值之后再算均值

  • -M估计:估计的初衷是为了解决最小二乘法的不稳健问题,但从它的发展来看永远超越了它最初的目的,实际上它是包括了稳健估计、最小二乘估计在内的一个广义的估计类。

  • -位置估计的比较:

  • -自助法估计位置度量的变异性:

#均值和中位数比较
pd.DataFrame({"mean":df.mean(),"median":df.median()})
meanmedian
total_bill19.78594317.795
tip2.9982792.900
size2.5696722.000
4、画图检验

简单画一下箱型图,看看离群点的分布,可以根据实际业务对离群点进行处理(这里就不做处理了)

matplotlib画图库:https://blog.csdn.net/weixin_41685388/article/details/103947701

import numpy as np
import matplotlib.pyplot as plt

figure = plt.figure(num="箱型图",figsize=(12,4),dpi=80,facecolor="LightGray",edgecolor="blue",frameon=True)

total_bill = df["total_bill"]
tip = df["tip"]

axes1= plt.subplot(1,2,1)
plt.title("total_bill箱型图")
plt.xlabel("total_bill")
plt.ylabel("value")
axes1.boxplot(total_bill,sym="o",whis=1.5)

axes2= plt.subplot(1,2,2)
plt.title("tip箱型图")
plt.xlabel("tip")
plt.ylabel("value")
axes2.boxplot(tip,sym="o",whis=1.5)

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V50E6KT9-1581021357099)(output_12_0.png)]

画图看一下total_bill和tip关系图,根据直方图,发现似乎有两个离群点,但这里样本量不大的情况,暂时就不做处理啦。

import numpy as np
import matplotlib.pyplot as plt

figure = plt.figure(num="total_bill和tip",figsize=(12,4),dpi=80,facecolor="LightGray",edgecolor="blue",frameon=True)

x = df["tip"]
y = df["total_bill"]
axes1= plt.subplot(1,2,1)
plt.title("total_bill和tip关系图")
plt.xlabel("tip")
plt.ylabel("total_bill")
plt.grid(True, color="g", axis="both", ls="--", lw=0.5) #设置网格线
axes1.plot(x, y, 'bo')


x=df['tip']/df['total_bill']
num_bins = 25 #直方图柱子数量
axes2= plt.subplot(1,2,2)
plt.title("tip/total_bill直方图")
plt.xlabel("tip/total_bill")
plt.ylabel("数量")
plt.grid(True, color="g", axis="both", ls="--", lw=0.5) #设置网格线
n, bins, patches = axes2.hist(x, num_bins)


plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9aVmSGS2-1581021357100)(output_14_0.png)]

画图看一下total_bill和size是否存在某种函数关系

import numpy as np
import matplotlib.pyplot as plt

x = df["size"]
y = df["total_bill"]

#按照size分组聚合total_bill 获取均值
g_a = df[["size","total_bill"]].groupby("size").agg(["count","sum","mean"])
x2 = g_a.index
y2 =g_a["total_bill"]["mean"]

fig, ax = plt.subplots()
plt.title("total_bill和size关系图")
plt.xlabel("size")
plt.ylabel("values")
ax.plot(x, y, 'ro',x2, y2, 'b--')
plt.legend(["total_bill","mean(total_bill)"],loc="best", frameon=False, ncol=2)

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CLikMJAy-1581021357101)(output_16_0.png)]

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个示例代码,展示了如何将UNSW-NB15数据集的训练集和测试集合并并进行预处理操作: ```python import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split # 加载训练集和测试集 train_data = pd.read_csv("UNSW-NB15_1.csv", header=None) test_data = pd.read_csv("UNSW-NB15_2.csv", header=None) # 合并训练集和测试集 data = pd.concat([train_data, test_data], axis=0) # 删除不必要的列和重复项 data = data.drop(columns=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 29]) data = data.drop_duplicates() # 处理缺失异常,这里以删除缺失异常为例 data = data.dropna() data = data[(np.abs(data-data.mean()) <= (3*data.std())).all(axis=1)] # 标准化数据,对数特征进行标准化 scaler = StandardScaler() data.iloc[:, :-1] = scaler.fit_transform(data.iloc[:, :-1]) # 编码类别特征 encoder = LabelEncoder() for column in data.columns: if data[column].dtype == np.object: data[column] = encoder.fit_transform(data[column]) # 划分数据集 X = data.iloc[:, :-1] y = data.iloc[:, -1] X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42) X_val, X_test, y_val, y_test = train_test_split(X_val, y_val, test_size=0.5, random_state=42) # 保存处理后的数据集 X_train.to_csv("X_train.csv", index=False) y_train.to_csv("y_train.csv", index=False) X_val.to_csv("X_val.csv", index=False) y_val.to_csv("y_val.csv", index=False) X_test.to_csv("X_test.csv", index=False) y_test.to_csv("y_test.csv", index=False) ``` 需要注意的是,这只是一个示例代码,具体的预处理操作需要根据数据集的特点和使用场景进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值