数据的基本统计描述
【目的】把握数据的分布对于成功的数据预处理是至关重要的。基本的数据统计描述可以识别数据的性质,并凸显哪些数据应被视为噪声或离群点。更好地识别数据的性质,把握数据全貌。
知识结构图:
代码实现
############################################# #1. 数据的基本统计描述-集中趋势 ############################################# #导入模块 from scipy import stats import numpy as np import random import matplotlib.pyplot as plt from sklearn.datasets import load_iris from pandas import DataFrame import matplotlib plt.rcParams['font.sans-serif'] = ['simhei'] ################################################## iris_data = load_iris() print(iris_data.data.shape) # 获取第⼀条数据 iris_data.data[0,:] # 获取第⼀个维度的所有取值,作为⼀维向量 print(iris_data.data[:,0]) # 获取第⼀个维度的所有取值,作为⼆维数组 print(iris_data.data[:,np.newaxis,0])#np.newaxis见注释 # 计算每个属性的均值 var_mean = np.mean(iris_data.data, axis=0) # 计算每个属性的中位数 var_median = np.median(iris_data.data, axis=0) #1.3 众数 ''' #⽅法⼀:使⽤numpy ''' # 在numpy中没有直接的⽅法,但是也可以这样实现: # ⾸先⽣成随机数据 data = [random.choice(range(1,5)) for i in range(100)] print(data) counts = np.bincount(data) print(counts) var_mode = np.argmax(counts) ''' ⽅法⼆:直接利⽤scipy下stats模块【推荐】 ''' #stats.mode(data) var_mode = stats.mode(data)[0][0] ############################################# #2. 数据的基本统计描述-离散趋势 ############################################# iris_data = load_iris() feature_1 = iris_data.data[:,0] print(feature_1) #2.1 极差 jicha1 = feature_1.max()-feature_1.min()#方法1 jicha2 = np.max(feature_1)-np.min(feature_1)#方法2 #2.2 四分位数 #利⽤np.percentile()函数 Q1 = np.percentile(feature_1,0.25) print(Q1) Q3 = np.percentile(feature_1,0.75) print(Q3) #2.3 四分位数极差(四分位距) IQR = Q3 - Q1 print(IQR) #2.4 五数概括 max_value = np.max(feature_1) Q3 = np.percentile(feature_1,0.75) median_value = np.median(feature_1) Q1 = np.percentile(feature_1,0.25) min_value = np.min(feature_1) wushu = [min_value, Q1, median_value, Q3, max_value] print(wushu) #2.5 箱线图 #2.5.1 单⼀箱线图 plt.figure() plt.boxplot(x=feature_1) plt.ylabel('values of ' + iris_data.feature_names[0]) plt.xlabel(iris_data.feature_names[0]) plt.show() #2.5.2 多个箱线图 iris_df = DataFrame(iris_data.data, columns=iris_data.feature_names) fig, axes = plt.subplots(1,4) iris_df.plot(kind='box', ax=axes, subplots=True, title='All feature boxplo axes[0].set_ylabel(iris_df.columns[0]) axes[1].set_ylabel(iris_df.columns[1]) axes[2].set_ylabel(iris_df.columns[2]) axes[3].set_ylabel(iris_df.columns[3]) fig.subplots_adjust(wspace=1, hspace=1) fig.show() #2.6 ⽅差和标准差 # ⽅差 v_var = np.var(feature_1) # 所有维度⽅差 v_var_all = np.var(iris_data.data, axis=0) # 标准差 v_std = np.std(feature_1) # 所有维度标准差 v_std_all = np.std(iris_data.data, axis=0) #2.7 DataFrame描述性统计 print(iris_df.describe()) ####################################################### #3. 数据的基本统计描述-基本统计图 ####################################################### iris_data = load_iris() sample_1 = iris_data.data[0,:] #3.1条形图 p1 = plt.bar(range(1, len(sample_1)+1), height = sample_1, tick_label = iris_data.feature_names, width=0.3) plt.ylabel('cm') plt.title('bar of first data') plt.show() #3.2 饼状图 labels = 'Sunny', 'Windy', 'Frogy', 'Snow' sizes = [15, 30, 45, 10] explode = (0, 0.1, 0, 0) # 这⾥只弹出第⼆个天⽓(i.e.'Hogs') fig1, ax1 = plt.subplots() ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',shadow=True, startangle=90) ax1.axis('equal') plt.show()# Equal aspect ratio ensures that pie is drawn as a cir #3.3折线图 import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 5, 0.1) y = np.sin(x) plt.plot(x, y) plt.show() #3.4直⽅图 import numpy as np from sklearn.datasets import load_iris import matplotlib.pyplot as plt iris_data = load_iris() feature_2 = iris_data.data[:,1] plt.hist(feature_2, bins=10) plt.show() #3.5 散点图 feature_1 = iris_data.data[:,0] feature_3 = iris_data.data[:,2] plt.scatter(feature_1,feature_3) plt.show() #3.6 分位数-分位数图 # 调⽤ scipy包中的scipy.stats.probplot函数 # 验证feature_3是否服从正态分布 from scipy import stats import matplotlib.pyplot as plt res = stats.probplot(feature_3, plot=plt) #3.7 数据的基本统计描述-⾼级绘图 # 准备数据和参数 labels=np.array(['语⽂','数学','英语','物理','化学','⽣物']) n_attr=len(labels) scores = np.array([88.7,85,90,95,70,96]) angles = np.linspace(0, 2*np.pi, n_attr, endpoint=False) scores = np.concatenate((scores, [scores[0]])) # 闭合 angles = np.concatenate((angles, [angles[0]])) # 闭合 # 绘图 fig = plt.figure(facecolor="white") plt.subplot(111,polar=True) plt.plot(angles, scores, 'bo-', color = 'g',linewidth = 2) plt.fill(angles, scores, facecolor = 'g',alpha = 0.2) plt.thetagrids(angles*180/np.pi,labels) plt.title('成绩雷达图', ha='center') plt.grid(True) plt.show()
注释,np.newaxis()使用方法:np.newaxis的作用就是在这一位置增加一个一维,这一位置指的是np.newaxis所在的位置,比较抽象,需要配合例子理解。