熟話說,'巧婦難為無米之炊',數據和特征就是'米',模型和算法則是'巧婦',沒有充足的數據、合適的特征,再強大的模型結構也無法得到滿意的輸出,為了更好的使用模型,必須先對數據有個正確的認識,本博將對數據分析的三種方法(描述性統計,數據可視化和相關性系數)進行總結,為數據預處理准備
1. sklearn數據集類型
- 自帶的小數據集:sklearn.datasets.load_<name>
鳶尾花數據集:load_iris()
乳腺癌數據集:load_breast_cancer()
手寫數字集:load_digits()
- 可在線下載的數據集:sklearn.datasets.fetch_<name>
- 計算機生成的數據集:sklearn.datasets.make_<name>
- svmlight/libsvm格式的數據集:sklearn.datasets.load_svmlight_file()
- 從買了data.org在線下載獲取數據集:sklearn.datasets.fetch_mldata()
2. 數據分析
下面將以房價數據為例進行說明這個數據分析過程
2.1 獲取數據
import pandas as pd
housing = pd.read_csv('./datasets/housing/housing.csv')
2.2 查看列標信息
print(housing.columns)
Index(['longitude', 'latitude', 'housing_median_age', 'total_rooms',
'total_bedrooms', 'population', 'households', 'median_income',
'median_house_value', 'ocean_proximity'],
dtype='object')
2.3 查看數據集前5行信息
print(housing.head())
longitude latitude housing_median_age total_rooms total_bedrooms \
0 -122.23 37.88 41.0 880.0 129.0
1 -122.22 37.86 21.0 7099.0 1106.0
2 -122.24 37.85 52.0 1467.0 190.0
3 -122.25 37.85 52.0 1274.0 235.0
4 -122.25 37.85 52.0 1627.0 280.0
population households median_income median_house_value ocean_proximity
0 322.0 126.0 8.3252 452600.0 NEAR BAY
1 2401.0 1138.0 8.3014 358500.0 NEAR BAY
2 496.0 177.0 7.2574 352100.0 NEAR BAY
3 558.0 219.0 5.6431 341300.0 NEAR BAY
4 565.0 259.0 3.8462 342200.0 NEAR BAY
2.4 獲取數據集的簡單描述
print(housing.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20640 entries, 0 to 20639
Data columns (total 10 columns):
longitude 20640 non-null float64
latitude 20640 non-null float64
housing_median_age 20640 non-null float64
total_rooms 20640 non-null float64
total_bedrooms 20433 non-null float64
population 20640 non-null float64
households 20640 non-null float64
median_income 20640 non-null float64
median_house_value 20640 non-null float64
ocean_proximity 20640 non-null object
dtypes: float64(9), object(1)
memory usage: 1.6+ MB
None
注意:total_bedrooms這個屬性只有20433個非空值,這意味着又207個區域缺失這個特征,所有的屬性的字段都是float,除了ocean_proximity,它的類型是object,因此它可以是任何類型的Python對象
2.5 查看分類標簽種類和數量
print(housing['ocean_proximity'].value_counts()) #查看屬性類別
<1H OCEAN 9136
INLAND 6551
NEAR OCEAN 2658
NEAR BAY 2290
ISLAND 5
Name: ocean_proximity, dtype: int64
2.6 查看數據集統計描述信息
print(housing.describe()) #查看描述性信息
longitude latitude housing_median_age total_rooms \
count 20640.000000 20640.000000 20640.000000 20640.000000
mean -119.569704 35.631861 28.639486 2635.763081
std 2.003532 2.135952 12.585558 2181.615252
min -124.350000 32.540000 1.000000 2.000000
25% -121.800000 33.930000 18.000000 1447.750000
50% -118.490000 34.260000 29.000000 2127.000000
75% -118.010000 37.710000 37.000000 3148.000000
max -114.310000 41.950000 52.000000 39320.000000
total_bedrooms population households median_income \
count 20433.000000 20640.000000 20640.000000 20640.000000
mean 537.870553 1425.476744 499.539680 3.870671
std 421.385070 1132.462122 382.329753 1.899822
min 1.000000 3.000000 1.000000 0.499900
25% 296.000000 787.000000 280.000000 2.563400
50% 435.000000 1166.000000 409.000000 3.534800
75% 647.000000 1725.000000 605.000000 4.743250
max 6445.000000 35682.000000 6082.000000 15.000100
median_house_value
count 20640.000000
mean 206855.816909
std 115395.615874
min 14999.000000
25% 119600.000000
50% 179700.000000
75% 264725.000000
max 500001.000000
3. 數據可視化
數據可視化可以通過各種圖表顯示,如直方圖、點圖、箱體圖、QQ圖,下面以longitude屬性為例
3.1 點圖
import matplotlib.pyplot as plt
plt.plot(housing.index,housing['longitude'],'r.')
plt.show()
3.2 繪制直方圖
plt.hist(housing['longitude'],bins=20)
plt.show()
3.3 將地理數據可視化
housing.plot(kind='scatter',x='longitude',y='latitude')
<matplotlib.axes._subplots.AxesSubplot at 0x206138f5fd0>
housing.plot(kind='scatter',x='longitude',y='latitude',alpha=0.1)
<matplotlib.axes._subplots.AxesSubplot at 0x2061395bc88>
接下來看看房價,每個圓的半徑大小代表了每個地區的人口數量(選項s),顏色代表價格(選項c),使用jet的預定義顏色表(選項cmap)來進行可視化,顏色范圍從藍到紅(從低到高)
housing.plot(kind='scatter',x='longitude',y='latitude',alpha=0.4,s=housing['population']/1000,
label='population',c='median_house_value',cmap=plt.get_cmap('jet'),colorbar=True)
plt.legend()
<matplotlib.legend.Legend at 0x206139bdc88>
4 查看特征相關性
由於數據集不大,可以使用corr()輕松計算除每隊屬性之間標准相關系數,也稱為皮爾遜相關系數
皮爾遜相關系數公式:
計算相關性系數時還可以使用歐式距離和余弦相似度,但需要明確它們的使用場景,歐式距離主要關注數值之間的差異,當相對於平均水平偏離度很大時,不能很好的反映真實的相似度,余弦相似度更偏重於維度之間的差異
corr_matrix = housing.corr()
print(corr_matrix['median_house_value'].sort_values(ascending=False))
median_house_value 1.000000
median_income 0.688075
total_rooms 0.134153
housing_median_age 0.105623
households 0.065843
total_bedrooms 0.049686
population -0.024650
longitude -0.045967
latitude -0.144160
Name: median_house_value, dtype: float64
相關系數的范圍從-1變換到1,越接近1,表示越強的正相關,越接近-1,表示越強烈的負相關,系數靠近0時說明二者之間沒有線性相關性。
\({\color {red} {注意,相關系數僅測量線性相關性,所以它有可能徹底遺漏非線性相關性}}\)
附:變異值度量
極差
極差 = 最大值 - 最小值
樣本方差
n個測量值\(x_1,x_2,...,x_n\)的樣本方差定義為$$s^2 = \frac{1}{n-1}\sum_{i=1}^n{(x_i - \mu)}^2$$
注意:有偏方差和無偏方差的區別
標准方差
解釋標准差的兩個有效法則:經驗法和切比雪夫法則
經驗法則
若一個數據集有近似丘形的對稱分布,則可以用以下的經驗法則描述數據集
(1)大約68%的測量值位於均值的1個標准差范圍內(\(即對於樣本在區間\mu\pm s范圍內,對於總體在區間\mu\pm \sigma范圍內)\)
(2)大約95%的測量值位於均值的2個標准差范圍內(\(即對於樣本在區間\mu\pm 2s范圍內,對於總體在區間\mu\pm 2\sigma范圍內)\)
(3)幾乎所有測量值位於均值的2個標准差范圍內(\(即對於樣本在區間\mu\pm 3s范圍內,對於總體在區間\mu\pm 3\sigma范圍內)\)
切比雪夫法則
對於任一數據集,無論數據的頻數是什么形狀
(1)可能很少的測量值落在均值的1個標准差范圍內(\(即對於樣本在區間\mu\pm s范圍內,對於總體在區間\mu\pm \sigma范圍內)\)
(2)至少有\(\frac{3}{4}\)的測量值落在均值的2個標准差范圍內(\(即對於樣本在區間\mu\pm 2s范圍內,對於總體在區間\mu\pm 2\sigma范圍內)\)
(3)至少有\(\frac{8}{9}\)的測量值落在均值的3個標准差范圍內(\(即對於樣本在區間\mu\pm 3s范圍內,對於總體在區間\mu\pm 3\sigma范圍內)\)
(4)通常,對於任意大於1的數k,至少有\(1-\frac{1}{k^2}\)的測量值落在均值的k個標准差范圍內