[Python] 5.利用Python进行数据分析-单因子探索分析与可视化

I.理论部分
 
1)概念相关:
集中趋势:均值,中位数,众数,分位数
离中趋势:标准差,方差
数据分布:偏度系数,峰度系数,正态分布,三大分布
抽样理论:抽样误差(确定样本量)、抽样精度
 
2)数据分类
定类(类别):根据事物离散,无差别属性进行的分类。性别,民族
定序(顺序):可以界定数据的大小,但不能测定差值。低中高
定距(间隔):可以界定数据大小的同时测定差值,但无绝对零点(乘除比率等无意义)。温度
定比(比率):可以界定数据大小,可以测定差值,有绝对零点(乘除比率有意义)。身高,体重
 
3)单属性分析:
1.异常值分析
    连续异常值:[下分位数-K*(Q3-Q1),上分位数+K*(Q3-Q1)]
    离散异常值:空值
    知识异常值:不符合常理的值
2.对比分析
    比较什么?
        绝对数比较,
        相对数比较,
        结构相对数:部分与总体
        比例相对数:总体内不同部分的数值进行比较
        比较相对数:同一时空下相似或者同质的数值进行的比较
        动态相对数:增速等
        强度相对数:性质不同但有相互联系属性相互的联合,平均
    怎么比?
        时间维度:同比,环比
        空间维度:
        经验与计划:进度与排期的比较
3.结构分析
    静态:分析总体的组成(总体的结构)
    动态:分析结构变化的趋势
4.分布分析
    直接获得的概率分布
    判断是不是正态分布
    极大似然(相似程度的衡量)
 
 
II.编码实现
 
1)准备工作
pip install pandas  #cmd中利用pip安装所需要的包pandas,numpy,scipy
ipmort pandas as pd  #IDE中调用所需的包,包括了pandas,scipy.stats
df = pd.read_csv(" 文件路径")  #数据的选取
 
pandas库显示不完全的问题使用下列代码:
pd.set_option('display.max_columns', None)  #显示所有列
pd.set_option('display.max_rows', None)  #显示所有行
pd.set_option('max_colwidth',100)  #设置value的显示长度为100,默认为50
 
2)一些简单操作
单series数据查看,目的是为了寻找异常值,此处以HR表中department列为例
d_s = df["department"]
d_s.sum()  #求和
d_s.mean()  #均值
d_s.median()  #中位数
d_s.quantile(q=0.25)  #四分位数
d_s.mode()  #众数
d_s.std()  #标准差
d_s.var()  #方差
d_s.skew()  #偏度系数
d_s.kurt()  #峰度系数
d_s.value_counts()  #按照类型计数
d_s.value_counts(normalize = True).sort_index()  #按照类型计算百分比,并排序
d_s.where(d_s != "sale")  #显示不为sale的值,即sale值记为空值
d_s.dropna()  #删除空值
d_s.isnull()  # 列出是否有异常值
d_s[d_s.isnull()]  # 查看哪些是空置
df[df["department"].isnull()]   # 查看空值数据
 
3)对比分析
1.清除空值
df = df.dropna(axis=0,how='any')  #删除空值axis=(0行,1列),how(any任一为空,all所有为空)
2.清除其他异常值
df = df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]  #删除其余
3.对比部门之间的关系
df.groupby("department").mean()
4.切片
df.lock[:,["last_evaluation","department"]].groupby("department").mean()
5.自己定义函数对比
df.loc[:,["average_monthly_hours","department"]].groupby("department")["average_monthly_hours"].apply(lambda x:x.max()-x.min())
 
 
III.初级可视化
1)柱状图:横轴为类,有意义的为它的高度
# 调用库
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
 
# 文件读取
df = pd.read_csv(r"C:\Users\Administrator\sample_code\data\HR.csv")
df = df.dropna(axis=0,how='any')
df = df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]
 
# 用seaborn改变样式(背景色,字体,字号,颜色
sns.set_style(style="darkgrid")
sns.set_context(context="poster",font_scale=0.5)
# 如果要用色块中的某个颜色,要改成数组形式再做标注:sns.set_palette([sns.color_palette("RdBu", n_colors=7)][5])
sns.set_palette(sns.color_palette("RdBu", n_colors=7))
 
# 加标题
plt.title("SALARY")
# 横坐标
plt.xlabel("salary")
# 纵坐标
plt.ylabel("number")
# 横轴标注(对横轴标注为salary对应数量的index)
plt.xticks(np.arange(len(df["salary"].value_counts()))+0.5,df["salary"].value_counts().index)
# 修改横纵坐标的显示范围,发现只显示了一半,横坐标需要加0.5
plt.axis([0,4,0,10000])
# 用zip函数确定确定标注位置和标注的值
for x,y in zip(np.arange(len(df["salary"].value_counts()))+0.5,df["salary"].value_counts()):
    plt.text(x,y,y,ha="center",va="bottom")
# 制图(横轴为salary对应的数量的长度,纵轴为salary对应的数量),同时可以指定宽度
plt.bar(np.arange(len(df["salary"].value_counts()))+0.5,df["salary"].value_counts(),width=0.5)
 
# seaborn为matplotib的封装,所以后者的命令前者也可以用,下面为seaborn的命令
# sns.countplot(x="salary",hue="department",data=df)
 
# 显示图表
plt.show()
 
 
 
2)直方图,横轴为一个区间,有意义的是他的面积
# 调用库
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
 
# 文件读取
df = pd.read_csv(r"C:\Users\Administrator\sample_code\data\HR.csv")
df = df.dropna(axis=0,how='any')
df = df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]
 
# 用seaborn改变样式(背景色,字体,字号,颜色
sns.set_style(style="whitegrid")
sns.set_context(context="paper",font_scale=0.8)
# 如果要用色块中的某个颜色,要改成数组形式再做标注:sns.set_palette([sns.color_palette("RdBu", n_colors=7)][5])
sns.set_palette(sns.color_palette("RdBu", n_colors=7))
 
# 制图,***其他图形也可以这样设置在一页上生成类似格式的图***
f = plt.figure()
# 在一行三列第一个位置添加一个直方图
f.add_subplot(1,3,1)
# 参数kde,hist分别对应曲线和直方,不需要改为False即可
sns.distplot(df["satisfaction_level"],bins=10)
f.add_subplot(1,3,2)
sns.distplot(df["last_evaluation"],bins=10)
f.add_subplot(1,3,3)
sns.distplot(df["average_monthly_hours"],bins=10)
 
# 显示图表
plt.show()
 
 
 
3)箱线图
# 调用库
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
 
# 文件读取
df = pd.read_csv(r"C:\Users\Administrator\sample_code\data\HR.csv")
df = df.dropna(axis=0,how='any')
df = df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]
 
# 用seaborn改变样式(背景色,字体,字号,颜色
sns.set_style(style="whitegrid")
sns.set_context(context="paper",font_scale=0.8)
# 如果要用色块中的某个颜色,要改成数组形式再做标注:sns.set_palette([sns.color_palette("RdBu", n_colors=7)][5])
sns.set_palette(sns.color_palette("RdBu", n_colors=7))
 
# x,y分别代表横,竖,参数saturation确定方框的边界,参数whis确定上分位数再向上的几倍的分位数间距为上界
sns.boxplot(x=df["time_spend_company"],saturation=0.75,whis=3)
 
# 显示图表
plt.show()
 
 
 
4)折线图:事物变化趋势
# 调用库
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
 
# 文件读取
df = pd.read_csv(r"C:\Users\Administrator\sample_code\data\HR.csv")
df = df.dropna(axis=0,how='any')
df = df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]
 
# 用seaborn改变样式(背景色,字体,字号,颜色
sns.set_style(style="whitegrid")
sns.set_context(context="paper",font_scale=0.8)
# 如果要用色块中的某个颜色,要改成数组形式再做标注:sns.set_palette([sns.color_palette("RdBu", n_colors=7)][5])
sns.set_palette(sns.color_palette("RdBu", n_colors=7))
 
# 绘制time_spend_company和left的折线图
sub_df=df.groupby("time_spend_company").mean()
sns.pointplot(sub_df.index,sub_df["left"])
# 或者可以这样画 
# sns.pointplot(x="time_spend_company",y="left",data=df)
 
# 显示图表
plt.show()
 
 
 
4)饼图:查看百分比,无法用seaborn绘制,利用matplotlib绘制
# 调用库
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
 
# 文件读取
df = pd.read_csv(r"C:\Users\Administrator\sample_code\data\HR.csv")
df = df.dropna(axis=0,how='any')
df = df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]
 
# 设定标签
lbs=df["department"].value_counts().index
# 设定分离块
explodes=[0.1 if i=="sales" else 0 for i in lbs]
# 制图,autopct="%1.1f%%"设定显示值,color可以采用seaborn的内容
plt.pie(df["department"].value_counts(normalize=True),explode=explodes,labels=lbs,autopct="%1.1f%%",colors=sns.color_palette("Reds"))
 
# 显示图表
plt.show()

猜你喜欢

转载自blog.csdn.net/Edward_is_1ncredible/article/details/81666539