python數據分析入門筆記[1]

1.Numpy:   Numpy是python科學計算的基礎包,它提供如下功能(不限於此):     (1)快速高效的多維數組對象naarray      (2)用於對數組執行元素級計算以及直接對數組執行數學運算的函數     (3)用於讀寫硬盤上基於數組的數據集的工具     (4)線性代數運算、傅里葉變換,以及隨機數生成     (5)用於將C、C++、Fortran代碼集成到python的工具  2.pandas   pandas提供了使咱們可以快速便捷地處理結構化數據的大量數據結構和函數。pandas兼具Numpy高性能的數組計算功能以及電子表格和關係型數據(如SQL)靈活的數據處理能力。它提供了複雜精細的索引功能,以便更爲便捷地完成重塑、切片和切塊、聚合以及選取數據子集等操做。   對於金融行業的用戶,pandas提供了大量適用於金融數據的高性能時間序列功能和工具。   DataFrame是pandas的一個對象,它是一個面向列的二維表結構,且含有行標和列標。   ps.引用一段網上的話說明DataFrame的強大之處:   Excel 2007及其之後的版本的最大行數是1048576,最大列數是16384,超過這個規模的數據Excel就會彈出個框框「此文本包含多行文本,沒法放置在一個工做表中」。Pandas處理上千萬的數據是易如反掌的事情,同時隨後咱們也將看到它比SQL有更強的表達能力,能夠作不少複雜的操做,要寫的code也更少。 說了一大堆它的好處,要實際感觸還得動手碼代碼。  3.matplotlib   matplotlib是最流行的用於繪製數據圖表的python庫。  4.Scipy   Scipy是一組專門解決科學計算中各類標準問題域的包的集合。
5.statsmodels: https://github.com/statsmodels/statsmodels
6.scikit-learn: http://scikit-learn.org/stable/



一.數據導入和導出 (一)讀取csv文件  1.本地讀取
複製代碼
import pandas as pd
df = pd.read_csv('E:\\tips.csv')  #根據本身數據文件保存的路徑填寫(p.s.  python填寫路徑時,要麼使用/,要麼使用\\)
#輸出: total_bill tip sex smoker day time size 0 16.99 1.01 Female No Sun Dinner 2 1 10.34 1.66 Male No Sun Dinner 3 2 21.01 3.50 Male No Sun Dinner 3 3 23.68 3.31 Male No Sun Dinner 2 4 24.59 3.61 Female No Sun Dinner 4 5 25.29 4.71 Male No Sun Dinner 4 .. ... ... ... ... ... ... ... 240 27.18 2.00 Female Yes Sat Dinner 2 241 22.67 2.00 Male Yes Sat Dinner 2 242 17.82 1.75 Male No Sat Dinner 2 243 18.78 3.00 Female No Thur Dinner 2 [244 rows x 7 columns]
複製代碼
2.網絡讀取
import pandas as pd
data_url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv" #填寫url讀取
df = pd.read_csv(data_url)
#輸出同上,爲了節省篇幅這兒就不粘貼了
3.read_csv詳解  功能: Read CSV (comma-separated) file into DataFrame
複製代碼
read_csv(filepath_or_buffer, sep=',', dialect=None, compression='infer', doublequote=True, escapechar=None, quotechar='"', quoting=0, skipinitialspace=False, lineterminator=None, header='infer', index_col=None, names=None, prefix=None, skiprows=None, skipfooter=None, skip_footer=0, na_values=None, true_values=None, false_values=None, delimiter=None, converters=None, dtype=None, usecols=None, engine=None, delim_whitespace=False, as_recarray=False, na_filter=True, compact_ints=False, use_unsigned=False, low_memory=True, buffer_lines=None, warn_bad_lines=True, error_bad_lines=True, keep_default_na=True, thousands=None, comment=None, decimal='.', parse_dates=False, keep_date_col=False, dayfirst=False, date_parser=None, memory_map=False, float_precision=None, nrows=None, iterator=False, chunksize=None, verbose=False, encoding=None, squeeze=False, mangle_dupe_cols=True, tupleize_cols=False, infer_datetime_format=False, skip_blank_lines=True)
複製代碼
參數詳解: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html  (二)讀取Mysql數據   假設數據庫安裝在本地,用戶名爲myusername,密碼爲mypassword,要讀取mydb數據庫中的數據
複製代碼
import pandas as pd
import MySQLdb
mysql_cn= MySQLdb.connect(host='localhost', port=3306,user='myusername', passwd='mypassword', db='mydb')
df = pd.read_sql('select * from test;', con=mysql_cn)    
mysql_cn.close()
複製代碼
上面的代碼讀取了test表中全部的數據到df中,而df的數據結構爲Dataframe。
ps.MySQL教程:http://www.runoob.com/mysql/mysql-tutorial.html
(三)讀取excel文件
要讀取excel文件還須要安裝xlrd模塊,pip install xlrd便可。
df = pd.read_excel('E:\\tips.xls')

(四)數據導出到csv文件
df.to_csv('E:\\demo.csv', encoding='utf-8', index=False) 
#index=False表示導出時去掉行名稱,若是數據中含有中文,通常encoding指定爲‘utf-8’

 

 (五)讀寫SQL數據庫html

複製代碼
import pandas as pd
import sqlite3
con = sqlite3.connect('...')
sql = '...'
df=pd.read_sql(sql,con)

#help文件
help(sqlite3.connect)
#輸出
Help on built-in function connect in module _sqlite3:

connect(...)
    connect(database[, timeout, isolation_level, detect_types, factory])
    
    Opens a connection to the SQLite database file *database*. You can use
    ":memory:" to open a database connection to a database that resides in
    RAM instead of on disk.
#############
help(pd.read_sql)
#輸出
Help on function read_sql in module pandas.io.sql:

read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)
    Read SQL query or database table into a DataFrame.
複製代碼

ps.數據庫的代碼是我直接從網絡上粘貼過來的,沒有測試過是否是可行,先貼上來。python

    數據庫我還在摸索中,學習心得學習筆記之類的你們能夠一塊兒分享23333~mysql

 二.提取和篩選須要的數據
(一)提取和查看相應數據 (用的是tips.csv的數據,數據來源:https://github.com/mwaskom/seaborn-data)
複製代碼
print df.head() #打印數據前五行
#輸出 total_bill tip sex smoker day time size 0 16.99 1.01 Female No Sun Dinner 2 1 10.34 1.66 Male No Sun Dinner 3 2 21.01 3.50 Male No Sun Dinner 3 3 23.68 3.31 Male No Sun Dinner 2 4 24.59 3.61 Female No Sun Dinner 4
複製代碼
複製代碼
print df.tail()  #打印數據後5行
#輸出
     total_bill   tip     sex smoker   day    time  size
239       29.03  5.92    Male     No   Sat  Dinner     3
240       27.18  2.00  Female    Yes   Sat  Dinner     2
241       22.67  2.00    Male    Yes   Sat  Dinner     2
242       17.82  1.75    Male     No   Sat  Dinner     2
243       18.78  3.00  Female     No  Thur  Dinner     2
複製代碼
print df.columns  #打印列名
#輸出
Index([u'total_bill', u'tip', u'sex', u'smoker', u'day', u'time', u'size'], dtype='object')
複製代碼
print df.index  #打印行名
#輸出
Int64Index([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,
            ...
            234, 235, 236, 237, 238, 239, 240, 241, 242, 243],
           dtype='int64', length=244)
複製代碼
複製代碼
print df.ix[10:20, 0:3]  #打印10~20行前三列數據
#輸出
    total_bill   tip     sex
10       10.27  1.71    Male
11       35.26  5.00  Female
12       15.42  1.57    Male
13       18.43  3.00    Male
14       14.83  3.02  Female
15       21.58  3.92    Male
16       10.33  1.67  Female
17       16.29  3.71    Male
18       16.97  3.50  Female
19       20.65  3.35    Male
20       17.92  4.08    Male
複製代碼
複製代碼
#提取不連續行和列的數據,這個例子提取的是第1,3,5行,第2,4列的數據
df.iloc[[1,3,5],[2,4]]
#輸出
    sex  day
1  Male  Sun
3  Male  Sun
5  Male  Sun
複製代碼
#專門提取某一個數據,這個例子提取的是第三行,第二列數據(默認從0開始算哈)
df.iat[3,2]
#輸出
'Male'
print df.drop(df.columns[1, 2], axis = 1) #捨棄數據前兩列
print df.drop(df.columns[[1, 2]], axis = 0) #捨棄數據前兩行
#爲了節省篇幅結果就不貼出來了哈~
print df.shape #打印維度
#輸出
(244, 7)
複製代碼
df.iloc[3] #選取第3行
#輸出1
total_bill     23.68
tip             3.31
sex             Male
smoker            No
day              Sun
time          Dinner
size               2
Name: 3, dtype: object

df.iloc[2:4] #選取第2到第3行
#輸出2
   total_bill   tip   sex smoker  day    time  size
2       21.01  3.50  Male     No  Sun  Dinner     3
3       23.68  3.31  Male     No  Sun  Dinner     2

df.iloc[0,1] #選取第0行1列的元素
#輸出3
1.01
複製代碼
(二)篩選出須要的數據(用的是tips.csv的數據,數據來源:https://github.com/mwaskom/seaborn-data)
複製代碼
#example:假設咱們要篩選出小費大於$8的數據
df[df.tip>8]
#輸出
     total_bill  tip   sex smoker  day    time  size
170       50.81   10  Male    Yes  Sat  Dinner     3
212       48.33    9  Male     No  Sat  Dinner     4
複製代碼
複製代碼
#數據篩選一樣能夠用」或「和」且「做爲篩選條件,好比
#1
df[(df.tip>7)|(df.total_bill>50)] #篩選出小費大於$7或總帳單大於$50的數據
#輸出
     total_bill    tip   sex smoker  day    time  size
23        39.42   7.58  Male     No  Sat  Dinner     4
170       50.81  10.00  Male    Yes  Sat  Dinner     3
212       48.33   9.00  Male     No  Sat  Dinner     4

#2
df[(df.tip>7)&(df.total_bill>50)]#篩選出小費大於$7且總帳單大於$50的數據
#輸出
     total_bill  tip   sex smoker  day    time  size
170       50.81   10  Male    Yes  Sat  Dinner     3
複製代碼
複製代碼
#接上
#假如加入了篩選條件後,咱們只關心day和time
df[['day','time']][(df.tip>7)|(df.total_bill>50)]
#輸出
     day    time
23   Sat  Dinner
170  Sat  Dinner
212  Sat  Dinner
複製代碼

 

  三.統計描述(用的是tips.csv的數據,數據來源:https://github.com/mwaskom/seaborn-data)
複製代碼
print df.describe() #描述性統計
#輸出  各指標都比較簡單就不解釋了哈
       total_bill         tip        size
count  244.000000  244.000000  244.000000
mean    19.785943    2.998279    2.569672
std      8.902412    1.383638    0.951100
min      3.070000    1.000000    1.000000
25%     13.347500    2.000000    2.000000
50%     17.795000    2.900000    2.000000
75%     24.127500    3.562500    3.000000
max     50.810000   10.000000    6.000000
複製代碼

 


四.數據處理

(一)數據轉置(用的是tips.csv的數據,數據來源:https://github.com/mwaskom/seaborn-data)
複製代碼
print df.T
#output
               0       1       2       3       4       5       6       7    \
total_bill   16.99   10.34   21.01   23.68   24.59   25.29    8.77   26.88   
tip           1.01    1.66     3.5    3.31    3.61    4.71       2    3.12   
sex         Female    Male    Male    Male  Female    Male    Male    Male   
smoker          No      No      No      No      No      No      No      No   
day            Sun     Sun     Sun     Sun     Sun     Sun     Sun     Sun   
time        Dinner  Dinner  Dinner  Dinner  Dinner  Dinner  Dinner  Dinner   
size             2       3       3       2       4       4       2       4   

               8       9     ...       234     235     236     237     238  \
total_bill   15.04   14.78   ...     15.53   10.07    12.6   32.83   35.83   
tip           1.96    3.23   ...         3    1.25       1    1.17    4.67   
sex           Male    Male   ...      Male    Male    Male    Male  Female   
smoker          No      No   ...       Yes      No     Yes     Yes      No   
day            Sun     Sun   ...       Sat     Sat     Sat     Sat     Sat   
time        Dinner  Dinner   ...    Dinner  Dinner  Dinner  Dinner  Dinner   
size             2       2   ...         2       2       2       2       3   

               239     240     241     242     243  
total_bill   29.03   27.18   22.67   17.82   18.78  
tip           5.92       2       2    1.75       3  
sex           Male  Female    Male    Male  Female  
smoker          No     Yes     Yes      No      No  
day            Sat     Sat     Sat     Sat    Thur  
time        Dinner  Dinner  Dinner  Dinner  Dinner  
size             3       2       2       2       2  

[7 rows x 244 columns]
複製代碼

 

 (二)數據排序(用的是tips.csv的數據,數據來源:https://github.com/mwaskom/seaborn-data)git

 

複製代碼
df.sort_values(by='tip')  #按tip列升序排序
#輸出(爲了避免佔篇幅我簡化了一部分)
     total_bill    tip     sex smoker   day    time  size
67         3.07   1.00  Female    Yes   Sat  Dinner     1
236       12.60   1.00    Male    Yes   Sat  Dinner     2
92         5.75   1.00  Female    Yes   Fri  Dinner     2
111        7.25   1.00  Female     No   Sat  Dinner     1
0         16.99   1.01  Female     No   Sun  Dinner     2
..          ...    ...     ...    ...   ...     ...   ...
214       28.17   6.50  Female    Yes   Sat  Dinner     3
141       34.30   6.70    Male     No  Thur   Lunch     6
59        48.27   6.73    Male     No   Sat  Dinner     4
23        39.42   7.58    Male     No   Sat  Dinner     4
212       48.33   9.00    Male     No   Sat  Dinner     4
170       50.81  10.00    Male    Yes   Sat  Dinner     3

[244 rows x 7 columns]
複製代碼

 

(三)缺失值處理

1.填充缺失值(數據來自《利用python進行數據分析》第二章 usagov_bitly_data2012-03-16-1331923249.txt,須要的同窗能夠找我要)

複製代碼
import json  #python有許多內置或第三方模塊能夠將JSON字符串轉換成python字典對象
import pandas as pd
import numpy as np
from pandas import DataFrame
path = 'F:\PycharmProjects\pydata-book-master\ch02\usagov_bitly_data2012-03-16-1331923249.txt' #根據本身的路徑填寫
records = [json.loads(line) for line in open(path)]
frame = DataFrame(records)
frame['tz']

#輸出(爲了節省篇幅我刪除了部分輸出結果)
0          America/New_York
1            America/Denver
2          America/New_York
3         America/Sao_Paulo
4          America/New_York
5          America/New_York
6             Europe/Warsaw
7                          
8                          
9                          
10      America/Los_Angeles
11         America/New_York
12         America/New_York
13                      NaN
               ...         
Name: tz, dtype: object
複製代碼

從以上輸出值能夠看出數據存在未知或缺失值,接着我們來處理缺失值。github

複製代碼
print frame['tz'].fillna(1111111111111)  #以數字代替缺失值
#輸出結果(爲了節省篇幅我刪除了部分輸出結果)
0          America/New_York
1            America/Denver
2          America/New_York
3         America/Sao_Paulo
4          America/New_York
5          America/New_York
6             Europe/Warsaw
7                          
8                          
9                          
10      America/Los_Angeles
11         America/New_York
12         America/New_York
13            1111111111111
Name: tz, dtype: object
複製代碼
複製代碼
print frame['tz'].fillna('YuJie2333333333333') #用字符串代替缺失值
#輸出(爲了節省篇幅我刪除了部分輸出結果)
0          America/New_York
1            America/Denver
2          America/New_York
3         America/Sao_Paulo
4          America/New_York
5          America/New_York
6             Europe/Warsaw
7                          
8                          
9                          
10      America/Los_Angeles
11         America/New_York
12         America/New_York
13       YuJie2333333333333
Name: tz, dtype: object
複製代碼

還有:sql

print frame['tz'].fillna(method='pad') #用前一個數據代替缺失值
print frame['tz'].fillna(method='bfill') #用後一個數據代替缺失值

2.刪除缺失值 (數據同上)數據庫

print frame['tz'].dropna(axis=0) #刪除缺失行
print frame['tz'].dropna(axis=1) #刪除缺失列

3.插值法填補缺失值json

因爲沒有數據,這兒插播一個小知識點:建立一個隨機的數據框bootstrap

複製代碼
import pandas as pd
import numpy as np
#建立一個6*4的數據框,randn函數用於建立隨機數
czf_data = pd.DataFrame(np.random.randn(6,4),columns=list('ABCD')) 
czf_data
#輸出
          A         B         C         D
0  0.355690  1.165004  0.810392 -0.818982
1  0.496757 -0.490954 -0.407960 -0.493502
2 -0.202123 -0.842278 -0.948464  0.223771
3  0.969445  1.357910 -0.479598 -1.199428
4  0.125290  0.943056 -0.082404 -0.363640
5 -1.762905 -1.471447  0.351570 -1.546152
複製代碼

好啦,數據就出來了。接着咱們用空值替換數值,創造出一個含有空值的DataFrame。api

複製代碼
#把第二列數據設置爲缺失值
czf_data.ix[2,:]=np.nan
czf_data
#輸出
          A         B         C         D
0  0.355690  1.165004  0.810392 -0.818982
1  0.496757 -0.490954 -0.407960 -0.493502
2       NaN       NaN       NaN       NaN
3  0.969445  1.357910 -0.479598 -1.199428
4  0.125290  0.943056 -0.082404 -0.363640
5 -1.762905 -1.471447  0.351570 -1.546152
複製代碼

 

複製代碼
#接着就能夠利用插值法填補空缺值了~
print czf_data.interpolate()
#輸出
          A         B         C         D
0  0.355690  1.165004  0.810392 -0.818982
1  0.496757 -0.490954 -0.407960 -0.493502
2  0.733101  0.433478 -0.443779 -0.846465
3  0.969445  1.357910 -0.479598 -1.199428
4  0.125290  0.943056 -0.082404 -0.363640
5 -1.762905 -1.471447  0.351570 -1.546152
複製代碼

 

 (四)數據分組(用的是tips.csv的數據,數據來源:https://github.com/mwaskom/seaborn-data)

 

複製代碼
group = df.groupby('day')  #按day這一列進行分組
#1
print group.first()#打印每一組的第一行數據
#輸出
      total_bill   tip     sex smoker    time  size
day                                                
Fri        28.97  3.00    Male    Yes  Dinner     2
Sat        20.65  3.35    Male     No  Dinner     3
Sun        16.99  1.01  Female     No  Dinner     2
Thur       27.20  4.00    Male     No   Lunch     4
#2
print group.last()#打印每一組的最後一行數據
#輸出
      total_bill   tip     sex smoker    time  size
day                                                
Fri        10.09  2.00  Female    Yes   Lunch     2
Sat        17.82  1.75    Male     No  Dinner     2
Sun        15.69  1.50    Male    Yes  Dinner     2
Thur       18.78  3.00  Female     No  Dinner     2
複製代碼

 

(五)值替換

複製代碼
import pandas as pd
import numpy as np
#首先創造一個Series(沒有數據狀況下的福音233)
Series = pd.Series([0,1,2,3,4,5])
#輸出
Series
0    0
1    1
2    2
3    3
4    4
5    5
dtype: int64
複製代碼

 

複製代碼
#數值替換,例如將0換成10000000000000
print Series.replace(0,10000000000000)
#輸出
0    10000000000000
1                 1
2                 2
3                 3
4                 4
5                 5
dtype: int64
複製代碼

 

複製代碼
#列和列的替換同理
print Series.replace([0,1,2,3,4,5],[11111,222222,3333333,44444,55555,666666])
#輸出
0      11111
1     222222
2    3333333
3      44444
4      55555
5     666666
dtype: int64
複製代碼

 

五.統計分析

(一)t檢驗

1.獨立樣本t檢驗

兩獨立樣本t檢驗就是根據樣本數據對兩個樣原本自的兩獨立整體的均值是否有顯著差別進行推斷;進行兩獨立樣本t檢驗的條件是,兩樣本的整體相互獨立且符合正態分佈。

開始找不到合適的數據,我就在網上隨便摘抄了個spss作獨立樣本t檢驗的實例數據做爲例子你們暫時看着吧找到合適的例子再給你們舉~

數據以下,我將數據保存爲本地xlsx格式:

複製代碼
   group  data
0      1    34
1      1    37
2      1    28
3      1    36
4      1    30
5      2    43
6      2    45
7      2    47
8      2    49
9      2    39
複製代碼

 

複製代碼
import pandas as pd
from scipy.stats import ttest_ind
IS_t_test = pd.read_excel('E:\\IS_t_test.xlsx') 
Group1 = IS_t_test[IS_t_test['group']==1]['data']
Group2 = IS_t_test[IS_t_test['group']==2]['data']
print ttest_ind(Group1,Group2)

#輸出
(-4.7515451390104353, 0.0014423819408438474) 
複製代碼

 

輸出結果的第一個元素爲t值,第二個元素爲p-value

ttest_ind默認兩組數據方差齊性的,若是想要設置默認方差不齊,能夠設置equal_var=False

print ttest_ind(Group1,Group2,equal_var=True)
print ttest_ind(Group1,Group2,equal_var=False)
#輸出
(-4.7515451390104353, 0.0014423819408438474)
(-4.7515451390104353, 0.0014425608643614844)

 

2.配對樣本t檢驗

一樣找不到數據,讓咱們暫且假設上邊獨立樣本是配對樣本吧,使用一樣的數據。

複製代碼
import pandas as pd
from scipy.stats import ttest_rel
IS_t_test = pd.read_excel('E:\\IS_t_test.xlsx') 
Group1 = IS_t_test[IS_t_test['group']==1]['data']
Group2 = IS_t_test[IS_t_test['group']==2]['data']
print ttest_rel(Group1,Group2)

#輸出
(-5.6873679190073361, 0.00471961872448184)
複製代碼

一樣的,輸出結果的第一個元素爲t值,第二個元素爲p-value。

 

 (二)方差分析

1.單因素方差分析

這裏依然沿用t檢驗的數據

複製代碼
import pandas as pd
from scipy import stats
IS_t_test = pd.read_excel('E:\\IS_t_test.xlsx') 
Group1 = IS_t_test[IS_t_test['group']==1]['data']
Group2 = IS_t_test[IS_t_test['group']==2]['data']
w,p = stats.levene(*args)
#levene方差齊性檢驗。levene(*args, **kwds)  Perform Levene test for equal variances.若是p<0.05,則方差不齊
print w,p
#進行方差分析
f,p = stats.f_oneway(*args)
print f,p

#輸出
(0.019607843137254936, 0.89209916055865535)
22.5771812081 0.00144238194084
複製代碼

2.多因素方差分析

    數據是我從網上找的多因素方差分析的一個例子,研究區組和養分素對體重的影響。我作成了excel文件,須要的同窗能夠問我要哈~作多因素方差分析須要加載statsmodels模塊,若是電腦沒有安裝能夠pip install一下。

 

複製代碼
#數據導入
import pandas as pd
MANOVA=pd.read_excel('E:\\MANOVA.xlsx')
MANOVA
#輸出(爲了節省篇幅刪掉了中間部分的輸出結果)
id nutrient weight 0 1 1 50.1 1 2 1 47.8 2 3 1 53.1 3 4 1 63.5 4 5 1 71.2 5 6 1 41.4 ....................... 21 6 3 38.5 22 7 3 51.2 23 8 3 46.2
複製代碼
複製代碼
#多因素方差分析
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
formula = 'weight~C(id)+C(nutrient)+C(id):C(nutrient)'
anova_results = anova_lm(ols(formula,MANOVA).fit())
print anova_results
#output
                   df        sum_sq     mean_sq   F  PR(>F)
C(id)               7  2.373613e+03  339.087619   0     NaN
C(nutrient)         2  1.456133e+02   72.806667   0     NaN
C(id):C(nutrient)  14  3.391667e+02   24.226190   0     NaN
Residual            0  8.077936e-27         inf NaN     NaN
複製代碼

也許數據選得不對,p-value全是空值23333,待我找個好點兒的數據再作一次多因素方差分析。

3.重複測量設計的方差分析(單因素)   ********待完善

重複測量設計是對同一因變量進行重複測度,重複測量設計的方差分析能夠是同一條件下進行的重複測度,也能夠是不一樣條件下的重複測量。

代碼和多因素方差分析同樣,思路不同而已~但我還找不到多因素方差分析合適的數據因此這兒就先不寫了2333

 4.混合設計的方差分析   ********待完善

#########統計學學得好的同窗們,教教我吧。。

(三)卡方檢驗

  卡方檢驗就是統計樣本的實際觀測值與理論推斷值之間的偏離程度,實際觀測值與理論推斷值之間的偏離程度就決定卡方值的大小,卡方值越大,越不符合;卡方值越小,誤差越小,越趨於符合,若兩個值徹底相等時,卡方值就爲0,代表理論值徹底符合。(from 百度百科2333)

1.單因素卡方檢驗

數據源於網絡,男女化妝與不化妝人數的理論值與實際值。

複製代碼
import numpy as np
from scipy import stats
from scipy.stats import chisquare
observed = np.array([15,95])
 #觀測值:110學生中化妝的女生95人,化妝的男生15人
expected = np.array([55,55])
#理論值:110學生中化妝的女生55人,化妝的男生55人
chisquare(observed,expected)
#output
(58.18181818181818, 2.389775628860044e-14)
複製代碼

2.多因素卡方檢驗*****正在研究中,學會了完善這一塊~

 

 (四)計數統計(用的數據爲tips.csv)

複製代碼
#example:統計性別
count = df['sex'].value_counts()
#輸出
print count
Male      157
Female     87
Name: sex, dtype: int64
複製代碼

 

(五)迴歸分析  *****待學習: 數據擬合,廣義線性迴歸。。。。等等

 

六.可視化 

  我以爲吧,其實看着excel就能夠實現的功能爲什麼那麼複雜,excel確實夠通用夠便捷,可是處理很大數據量的話也許吃不消吧。學學python繪圖也不賴,並且講真,有的成效真的挺好看的。

(一)Seaborn

我學數據分析可視化是從學習Seaborn入門的,Seaborn是基於matplotlib的Python可視化庫,剛開始便接觸matplotlib不免有些吃力,參數多且難理解,可是慢慢來總會學會的。還有關鍵的一點是,seaborn畫出來的圖好好看。。
複製代碼
#基礎導入
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
複製代碼

 

#小費數據真的挺好的,這兒用tips做爲example
tips = sns.load_dataset('tips') #從網絡環境導入數據tips

 

1.lmplot函數

lmplot(x, y, data, hue=None, col=None, row=None, palette=None, col_wrap=None, size=5, aspect=1, markers='o', sharex=True, sharey=True, hue_order=None, col_order=None, row_order=None, legend=True, legend_out=True, x_estimator=None, x_bins=None, x_ci='ci', scatter=True, fit_reg=True, ci=95, n_boot=1000, units=None, order=1, logistic=False, lowess=False, robust=False, logx=False, x_partial=None, y_partial=None, truncate=False, x_jitter=None, y_jitter=None, scatter_kws=None, line_kws=None)

功能:Plot data and regression model fits across a FacetGrid. 

下面就不一樣的例子,對lmplot的參數進行解釋

例子1.  畫出總帳單和小費迴歸關係圖 

用到了lmplot(x, y, data,scatter_kws)

x,y,data一目瞭然這兒就很少解釋了,scatter_kws和line_kws的官方解釋以下:

{scatter,line}_kws : dictionarie

Additional keyword arguments to pass to plt.scatter and plt.plot.

scatter爲點,line爲線。其實就是用字典去限定點和線的各類屬性,如例子所示,散點的顏色爲灰石色,線條的顏色爲印度紅,成像效果就是這樣點線顏色分離,展示效果很好。你們也能夠換上本身想要的圖片屬性。

sns.lmplot("total_bill", "tip", tips,
           scatter_kws={"marker": ".", "color": "slategray"},
           line_kws={"linewidth": 1, "color": "indianred"}).savefig('picture2') 

另外:顏色還可使用RGB代碼,具體對照表能夠參考這個網站,能夠本身搭配顏色:

http://www.114la.com/other/rgb.htm

marker也能夠有多種樣式,具體以下:

.  Point marker
,  Pixel marker
o  Circle marker
v  Triangle down marker 
^  Triangle up marker 
<  Triangle left marker 
>  Triangle right marker 
1  Tripod down marker
2  Tripod up marker
3  Tripod left marker
4  Tripod right marker
s  Square marker
p  Pentagon marker
*  Star marker
h  Hexagon marker
H  Rotated hexagon D Diamond marker
d  Thin diamond marker
| Vertical line (vlinesymbol) marker
_  Horizontal line (hline symbol) marker
+  Plus marker
x  Cross (x) marker

sns.lmplot("total_bill", "tip", tips,
           scatter_kws={"marker": ".","color":"#FF7F00"},
           line_kws={"linewidth": 1, "color": "#BF3EFF"}).savefig('s1')

ps.我修改maker屬性不成功不知爲什麼,求解答

 

例子2.用餐人數(size)和小費(tip)的關係圖

 

官方解釋:

x_estimator : callable that maps vector -> scalar, optional

Apply this function to each unique value of x and plot the resulting estimate. This is useful when x is a discrete variable. If x_ci is not None, this estimate will be bootstrapped and a confidence interval will be drawn.

大概解釋就是:對擁有相同x水平的y值進行映射

plt.figure()
sns.lmplot('size', 'tip', tips, x_estimator= np.mean).savefig('picture3')

{x,y}_jitter : floats, optional

Add uniform random noise of this size to either the x or y variables. The noise is added to a copy of the data after fitting the regression, and only influences the look of the scatterplot. This can be helpful when plotting variables that take discrete values.

jitter是個頗有意思的參數, 特別是處理靶數據的overlapping過於嚴重的狀況時, 經過增長必定程度的噪聲(noise)實現數據的區隔化, 這樣原始數據是若干 點簇 變成一系列密集鄰近的點羣. 另外, 有的人會常常將 rug 與 jitter 結合使用. 這依人吧.對於橫軸取離散水平的時候, 用x_jitter可讓數據點發生水平的擾動.但擾動的幅度不宜過大。

sns.lmplot('size', 'tip', tips, x_jitter=.15).savefig('picture4')

 

seaborn還能夠作出xkcd風格的圖片,還挺有意思的

with plt.xkcd():
    sns.color_palette('husl', 8)
    sns.set_context('paper')
    sns.lmplot(x='total_bill', y='tip', data=tips, ci=65).savefig('picture1')

 

 

 

 

with plt.xkcd():
    sns.lmplot('total_bill', 'tip', data=tips, hue='day')
    plt.xlabel('hue = day')
    plt.savefig('picture5')

with plt.xkcd():
    sns.lmplot('total_bill', 'tip', data=tips, hue='smoker')
    plt.xlabel('hue = smoker')
    plt.savefig('picture6')

複製代碼
sns.set_style('dark')
sns.set_context('talk')
sns.lmplot('size', 'total_bill', tips, order=2)
plt.title('# poly order = 2')
plt.savefig('picture7')
plt.figure()
sns.lmplot('size', 'total_bill', tips, order=3)
plt.title('# poly order = 3')
plt.savefig('picture8')
複製代碼

 

 
sns.jointplot("total_bill", "tip", tips).savefig('picture9')

 

 

(二)matplotlib ********待完善

相關文章
相關標籤/搜索