Python數據分析:數據讀取、預處理

Python數據分析:數據讀取、預處理

標準數據集

https://blog.csdn.net/csc_1/article/details/68070174

  • 瑞典汽車保險數據集 https://www.math.muni.cz/~kolacek/docs/frvs/M7222/data/AutoInsurSweden.txt
  • 墨爾本最低日常溫度 daily-minimum-temperatures.csv
    該數據集描述了澳大利亞墨爾本市10年(1981-1990)的最低日常溫度。單位爲攝氏度,有3,650個觀測值。數據來源被稱爲澳大利亞氣象局。https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-min-temperatures.csv
  • UCI 機器學習庫
    http://mlr.cs.umass.edu/ml/

1. 數據讀入、保存

查詢當前的工作路徑
import os
os.getcwd() #獲取當前工作路徑
%pwd #獲取當前工作路徑
Excel 數據讀入
  • 打開 Try JupyterLab / 上傳.csv文件 / 複製已有的Untitled.ipynb文件進行編輯
  • 打開 Try Classic Notebook / File / Open /上傳.csv文件/ 編輯代碼然後運行
import pandas as pd   #導入pandas包
data = pd.read_csv("myexcel.csv")   # pd.read_csv讀取
#data = pd.read_excel("myexcel.xlsx")   # pd.read_excel讀取
print(data) 
數據保存
import pandas as pd   #導入pandas包
data = pd.read_csv("myexcel.csv")   # pd.read_csv讀取myexcel.csv
data.to_csv("myexcel2.csv")   # 導出數據到CSV文件myexcel2.csv
數據複製 淺拷貝、深拷貝

copy.copy 是將父對象的值複製了一份,但是子對象指向同一內存地址
copy.deepcopy 將父子對象的值全部複製一份,和原對象已沒有任何關係

import copy
a = [1,2,3,4,['a','b']]  #原始對象
b = a  #賦值,傳對象的引用
c = copy.copy(a)  #淺拷貝
d = copy.deepcopy(a)  #深拷貝
a.append(5)
a[4].append('c')
print('a=',a)
print('b=',b)
print('c=',c)
print('d=',d)
------------------------------------------------------------
a= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c= [1, 2, 3, 4, ['a', 'b', 'c']]
d= [1, 2, 3, 4, ['a', 'b']]
讀入 .csv文件時的編碼問題 utf-8' codec can't decode
  • 直接在讀取時聲明csv的編碼方式爲‘gbk’
    data=pd.read_csv(‘data.csv’,encoding=‘gbk’)
  • 將數據源的編碼方式改爲‘utf-8’
    找到csv文件–》右鍵–》打開方式–》記事本
    打開記事本,“文件–》另存爲”,可以看到文件的默認編碼格式爲ANSI
    選擇編碼下拉框,選擇需要的編碼格式UTF8,重新保存即可

2. 數據預處理

數據質量分析的任務是檢測原始數據中是否存在髒數據,髒數據一般是指不符合要求,不能直接進行相應分析的數據,髒數據一般包括:缺失值異常值(離羣點)不一致的值內容未知的值

缺失值的四種處理方法:刪除記錄數據填補和不處理

缺失值處理: 刪除缺失值所在行
#缺失值處理: 刪除缺失值所在行
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3,5),columns = list('abcde'))
df.iloc[0,2] = np.nan #iloc是選擇行和列
df.loc[2] = np.nan #loc是選擇行
print(df)

nan_all=df.isnull() #找出缺失值
print(nan_all)
drop = df.dropna() #丟棄包含缺失值的行記錄
print(drop)
------------------------------------------------------------
          a         b         c         d         e
0  0.563419 -0.058732       NaN -0.036233 -0.431621
1 -0.219255  0.767613 -0.683556 -2.222446  0.443755
2       NaN       NaN       NaN       NaN       NaN
       a      b      c      d      e
0  False  False   True  False  False
1  False  False  False  False  False
2   True   True   True   True   True
          a         b         c         d         e
1 -0.219255  0.767613 -0.683556 -2.222446  0.443755
重複值處理: 判斷並刪除重複值所在行
#重複值處理: 判斷並刪除重複值所在行
import pandas as pd
import numpy as np
data = pd.DataFrame([[1,2,3],['a','b','c'],[1,2,3]],columns=list('abc'))
print("原始數據:\n",data)
print(data.duplicated()) #判斷是否有重複行
data = data.drop_duplicates() #去掉重複行
print(data.shape) #查看數據的行列大小:(25375,8)
print("去重數據:\n",data)
------------------------------------------------------------
原始數據:
    a  b  c
0  1  2  3
1  a  b  c
2  1  2  3
0    False
1    False
2     True
dtype: bool
(2, 3)
去重數據:
    a  b  c
0  1  2  3
1  a  b  c
異常值的處理方法:統計法3σ 法箱型圖

異常值的測量標準有很多,比較常見的是描述性統計法3σ 法箱型圖
在這裏插入圖片描述
統計法

#異常值處理:描述性統計
import pandas as pd
import numpy as np
data = pd.read_csv('myexcel2.csv', header=0)

print(data.shape) #查看行列數
print(data.head(5)) #查看前5行數據 
print(data.describe()) 

neg_list = ['數量','單價','總額']
#統計數據中每列小於0的數的個數
for item in neg_list:
    neg_item = data[item]<0
    print(item + '小於0的有' + str(neg_item.sum()) + '個')

#此處將小於0的數據刪除
yichangList = []
for item in neg_list:
    for i in range(0, len(data)):
        if data[item][i]<0:
            yichangList.append(i)
yichangList = list(set(yichangList))          
print(yichangList)
#打印刪除了小於0的數據
for yichangHang in yichangList:
    data = data.drop(yichangHang)
print(data)
#再次統計數據中每列小於0的數的個數
for item in neg_list:
    neg_item = data[item]<0
    print(item + '小於0的有' + str(neg_item.sum()) + '個')
------------------------------------------------------------
(20, 5)
   ID 名稱  數量  單價   總額
0   1  A   5  12   60
1   2  B   3  36  108
。。。。。。
             ID        數量           單價           總額
count  20.00000  20.00000    20.000000    20.000000
mean   10.50000   3.45000   102.050000   223.400000
std     5.91608   3.88621   248.219868   439.866295
min     1.00000  -9.00000     1.000000   -25.000000
25%     5.75000   2.00000    22.750000    56.500000
50%    10.50000   3.00000    25.500000   112.500000
75%    15.25000   6.25000    30.750000   161.250000
max    20.00000   8.00000  1000.000000  2000.000000
數量小於0的有2個
單價小於0的有0個
總額小於0的有2[10, 3]
    ID 名稱  數量    單價    總額
0    1  A   5    12    60
1    2  B   3    36   108
。。。。。。
數量小於0的有0個
單價小於0的有0個
總額小於0的有0

3σ 法 當數據服從正態分佈時,99%的數值應該位於距離均值3個標準差之內的距離,P(|x−μ|>3σ)≤0.003,當數值超出這個距離,可以認爲它是異常值。

# 3σ 法則統計
import pandas as pd
import numpy as np
import copy
data = pd.read_csv('myexcel2.csv', header=0)
data_c = copy.deepcopy(data)  #深拷貝數據
print(data.shape) #查看行列數
print(data.head(5)) #查看前5行數據 
print(data.describe()) 

neg_list = ['數量','單價','總額']
#統計數據中每列不符合 3σ 法則的數的個數 P(|x−μ|>3σ)≤0.003
for item in neg_list:
    data_c[item] = (data_c[item] - data_c[item].mean())/data_c[item].std()
    z_abnormal = abs(data_c[item])>3
    print(item + '中有' + str(z_abnormal.sum()) + '個異常值')

#此處將不符合 3σ 法則的數據刪除
yichangList = []
for item in neg_list:
    data_c[item] = (data_c[item] - data_c[item].mean())/data_c[item].std()
    for i in range(0, len(data_c)):
        if abs(data_c[item][i])>3:
            yichangList.append(i)
yichangList = list(set(yichangList))          
print(yichangList)

#打印刪除了不符合 3σ 法則的數據
for yichangHang in yichangList:
    data = data.drop(yichangHang)
print(data)
------------------------------------------------------------
(20, 5)
   ID 名稱  數量  單價   總額
0   1  A   5  12   60
1   2  B   3  36  108
。。。。。。
             ID        數量           單價           總額
count  20.00000  20.00000    20.000000    20.000000
mean   10.50000   3.45000   102.050000   223.400000
std     5.91608   3.88621   248.219868   439.866295
min     1.00000  -9.00000     1.000000   -25.000000
25%     5.75000   2.00000    22.750000    56.500000
50%    10.50000   3.00000    25.500000   112.500000
75%    15.25000   6.25000    30.750000   161.250000
max    20.00000   8.00000  1000.000000  2000.000000
數量中有1個異常值
單價中有1個異常值
總額中有1個異常值
[11, 3]
    ID 名稱  數量   單價   總額
0    1  A   5   12   60
1    2  B   3   36  108
2    3  D   8   25  200
。。。。。。

箱型圖
在這裏插入圖片描述

#繪製箱型圖 展示異常值
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('iris2.csv')
# column參數表示要繪製成箱形圖的數據,可以是一列或多列;    by參數表示分組依據
data.boxplot(column=['s_l','s_w'],by='specs',grid=True,rot=25,fontsize=15)
# data.boxplot(grid=True)  #全部列畫出
print(data.head())
plt.show()

在這裏插入圖片描述
在這裏插入圖片描述

#箱型圖 法則統計 並刪除異常值
import pandas as pd
import numpy as np
import copy
data = pd.read_csv('iris2.csv', header=0)
data_c = copy.deepcopy(data)  #深拷貝數據
neg_list = ['s_l','s_w','p_l','p_w']
#箱型圖 IQR(差值)=U(上四分位數)-L(下四分位數) #上界=U+1.5IQR,下界=L-1.5IQR
for item in neg_list:
    iqr = data_c[item].quantile(0.75) - data_c[item].quantile(0.25)
    q_abnormal_L = data_c[item] < data_c[item].quantile(0.25)-1.5*iqr
    q_abnormal_U = data_c[item] > data_c[item].quantile(0.75)+1.5*iqr
    print(item+'中有'+str(q_abnormal_L.sum()+q_abnormal_U.sum())+'個異常值')
#此處將不符合 箱型圖 法則的數據刪除
yichangList = []
for item in neg_list:
    iqr = data_c[item].quantile(0.75) - data_c[item].quantile(0.25)
    q_L = data_c[item].quantile(0.25)-1.5*iqr
    q_U = data_c[item].quantile(0.75)+1.5*iqr
    for i in range(0, len(data)):
        if data_c[item][i]<q_L or data_c[item][i]>q_U:
            yichangList.append(i)
yichangList = list(set(yichangList))          
print(yichangList)
#打印刪除了不符合 箱型圖 法則的數據
for yichangHang in yichangList:
    data = data.drop(yichangHang)
print(data)
------------------------------------------------------------
s_l中有0個異常值
s_w中有4個異常值
p_l中有0個異常值
p_w中有0個異常值
[32, 33, 60, 15]
     s_l  s_w  p_l  p_w      specs
。。。。。。
14   5.8  4.0  1.2  0.2     setosa
16   5.4  3.9  1.3  0.4     setosa
。。。。。。

3. 撰寫報告、結論分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章