python数据分析入门学习笔记儿
轉(zhuǎn)載:?http://www.cnblogs.com/zzhzhao/p/5269217.html
學(xué)習(xí)利用python進(jìn)行數(shù)據(jù)分析的筆記兒&下星期二內(nèi)部交流會(huì)要講的內(nèi)容,一并分享給大家。博主粗心大意,有什么不對的地方歡迎指正~還有許多尚待完善的地方,待我一邊學(xué)習(xí)一邊完善~前言:各種和數(shù)據(jù)分析相關(guān)python庫的介紹(前言1~4摘抄自《利用python進(jìn)行數(shù)據(jù)分析》) 1.Numpy: Numpy是python科學(xué)計(jì)算的基礎(chǔ)包,它提供以下功能(不限于此): (1)快速高效的多維數(shù)組對象naarray (2)用于對數(shù)組執(zhí)行元素級計(jì)算以及直接對數(shù)組執(zhí)行數(shù)學(xué)運(yùn)算的函數(shù) (3)用于讀寫硬盤上基于數(shù)組的數(shù)據(jù)集的工具 (4)線性代數(shù)運(yùn)算、傅里葉變換,以及隨機(jī)數(shù)生成 (5)用于將C、C++、Fortran代碼集成到python的工具 2.pandas pandas提供了使我們能夠快速便捷地處理結(jié)構(gòu)化數(shù)據(jù)的大量數(shù)據(jù)結(jié)構(gòu)和函數(shù)。pandas兼具Numpy高性能的數(shù)組計(jì)算功能以及電子表格和關(guān)系型數(shù)據(jù)(如SQL)靈活的數(shù)據(jù)處理能力。它提供了復(fù)雜精細(xì)的索引功能,以便更為便捷地完成重塑、切片和切塊、聚合以及選取數(shù)據(jù)子集等操作。 對于金融行業(yè)的用戶,pandas提供了大量適用于金融數(shù)據(jù)的高性能時(shí)間序列功能和工具。 DataFrame是pandas的一個(gè)對象,它是一個(gè)面向列的二維表結(jié)構(gòu),且含有行標(biāo)和列標(biāo)。 ps.引用一段網(wǎng)上的話說明DataFrame的強(qiáng)大之處: Excel 2007及其以后的版本的最大行數(shù)是1048576,最大列數(shù)是16384,超過這個(gè)規(guī)模的數(shù)據(jù)Excel就會(huì)彈出個(gè)框框“此文本包含多行文本,無法放置在一個(gè)工作表中”。Pandas處理上千萬的數(shù)據(jù)是易如反掌的事情,同時(shí)隨后我們也將看到它比SQL有更強(qiáng)的表達(dá)能力,可以做很多復(fù)雜的操作,要寫的code也更少。 說了一大堆它的好處,要實(shí)際感觸還得動(dòng)手碼代碼。 3.matplotlib matplotlib是最流行的用于繪制數(shù)據(jù)圖表的python庫。 4.Scipy Scipy是一組專門解決科學(xué)計(jì)算中各種標(biāo)準(zhǔn)問題域的包的集合。 5.statsmodels: 各種模型 ****待學(xué)習(xí) 6.scikit-learn: machine learning模塊,很全 ****待學(xué)習(xí)
一.數(shù)據(jù)導(dǎo)入和導(dǎo)出 (一)讀取csv文件 1.本地讀取 import pandas as pd df = pd.read_csv('E:\\tips.csv') #根據(jù)自己數(shù)據(jù)文件保存的路徑填寫(ps.填寫路徑時(shí),單斜杠會(huì)報(bào)錯(cuò),雙斜杠不會(huì),不知為何) #輸出: 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.網(wǎng)絡(luò)讀取 import pandas as pd data_url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv" #填寫url讀取 df = pd.read_csv(data_url) #輸出同上,為了節(jié)省篇幅這兒就不粘貼了 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) 參數(shù)詳解: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html (二)讀取Mysql數(shù)據(jù) 假設(shè)數(shù)據(jù)庫安裝在本地,用戶名為myusername,密碼為mypassword,要讀取mydb數(shù)據(jù)庫中的數(shù)據(jù) 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表中所有的數(shù)據(jù)到df中,而df的數(shù)據(jù)結(jié)構(gòu)為Dataframe。 ps.MySQL教程:http://www.runoob.com/mysql/mysql-tutorial.html (三)讀取excel文件 要讀取excel文件還需要安裝xlrd模塊,pip install xlrd即可。 df = pd.read_excel('E:\\tips.xls') (四)數(shù)據(jù)導(dǎo)出到csv文件 df.to_csv('E:\\demo.csv', encoding='utf-8', index=False) #index=False表示導(dǎo)出時(shí)去掉行名稱,如果數(shù)據(jù)中含有中文,一般encoding指定為‘utf-8’
?
?(五)讀寫SQL數(shù)據(jù)庫
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 inRAM 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.數(shù)據(jù)庫的代碼是我直接從網(wǎng)絡(luò)上粘貼過來的,沒有測試過是不是可行,先貼上來。
??? 數(shù)據(jù)庫我還在摸索中,學(xué)習(xí)心得學(xué)習(xí)筆記之類的大家可以一起分享23333~
二.提取和篩選需要的數(shù)據(jù) (一)提取和查看相應(yīng)數(shù)據(jù) (用的是tips.csv的數(shù)據(jù),數(shù)據(jù)來源:https://github.com/mwaskom/seaborn-data) print df.head() #打印數(shù)據(jù)前五行 #輸出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() #打印數(shù)據(jù)后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行前三列數(shù)據(jù) #輸出 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 #提取不連續(xù)行和列的數(shù)據(jù),這個(gè)例子提取的是第1,3,5行,第2,4列的數(shù)據(jù) df.iloc[[1,3,5],[2,4]] #輸出 sex day 1 Male Sun 3 Male Sun 5 Male Sun #專門提取某一個(gè)數(shù)據(jù),這個(gè)例子提取的是第三行,第二列數(shù)據(jù)(默認(rèn)從0開始算哈) df.iat[3,2] #輸出 'Male' print df.drop(df.columns[1, 2], axis = 1) #舍棄數(shù)據(jù)前兩列 print df.drop(df.columns[[1, 2]], axis = 0) #舍棄數(shù)據(jù)前兩行 #為了節(jié)省篇幅結(jié)果就不貼出來了哈~ 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: objectdf.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 2df.iloc[0,1] #選取第0行1列的元素 #輸出3 1.01 (二)篩選出需要的數(shù)據(jù)(用的是tips.csv的數(shù)據(jù),數(shù)據(jù)來源:https://github.com/mwaskom/seaborn-data) #example:假設(shè)我們要篩選出小費(fèi)大于$8的數(shù)據(jù) 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 #數(shù)據(jù)篩選同樣可以用”或“和”且“作為篩選條件,比如 #1 df[(df.tip>7)|(df.total_bill>50)] #篩選出小費(fèi)大于$7或總賬單大于$50的數(shù)據(jù) #輸出 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)]#篩選出小費(fèi)大于$7且總賬單大于$50的數(shù)據(jù) #輸出 total_bill tip sex smoker day time size 170 50.81 10 Male Yes Sat Dinner 3 #接上 #假如加入了篩選條件后,我們只關(guān)心day和time df[['day','time']][(df.tip>7)|(df.total_bill>50)] #輸出 day time 23 Sat Dinner 170 Sat Dinner 212 Sat Dinner?
三.統(tǒng)計(jì)描述(用的是tips.csv的數(shù)據(jù),數(shù)據(jù)來源:https://github.com/mwaskom/seaborn-data) print df.describe() #描述性統(tǒng)計(jì) #輸出 各指標(biāo)都比較簡單就不解釋了哈 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?
四.數(shù)據(jù)處理(一)數(shù)據(jù)轉(zhuǎn)置(用的是tips.csv的數(shù)據(jù),數(shù)據(jù)來源:https://github.com/mwaskom/seaborn-data) print df.T #output0 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]?
?(二)數(shù)據(jù)排序(用的是tips.csv的數(shù)據(jù),數(shù)據(jù)來源:https://github.com/mwaskom/seaborn-data)
?
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.填充缺失值(數(shù)據(jù)來自《利用python進(jìn)行數(shù)據(jù)分析》第二章 usagov_bitly_data2012-03-16-1331923249.txt,需要的同學(xué)可以找我要) import json #python有許多內(nèi)置或第三方模塊可以將JSON字符串轉(zhuǎn)換成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' #根據(jù)自己的路徑填寫 records = [json.loads(line) for line in open(path)] frame = DataFrame(records) frame['tz']#輸出(為了節(jié)省篇幅我刪除了部分輸出結(jié)果) 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從以上輸出值可以看出數(shù)據(jù)存在未知或缺失值,接著咱們來處理缺失值。
print frame['tz'].fillna(1111111111111) #以數(shù)字代替缺失值 #輸出結(jié)果(為了節(jié)省篇幅我刪除了部分輸出結(jié)果) 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') #用字符串代替缺失值 #輸出(為了節(jié)省篇幅我刪除了部分輸出結(jié)果) 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還有:
print frame['tz'].fillna(method='pad') #用前一個(gè)數(shù)據(jù)代替缺失值 print frame['tz'].fillna(method='bfill') #用后一個(gè)數(shù)據(jù)代替缺失值2.刪除缺失值 (數(shù)據(jù)同上)
print frame['tz'].dropna(axis=0) #刪除缺失行 print frame['tz'].dropna(axis=1) #刪除缺失列3.插值法填補(bǔ)缺失值
由于沒有數(shù)據(jù),這兒插播一個(gè)小知識點(diǎn):創(chuàng)建一個(gè)隨機(jī)的數(shù)據(jù)框
import pandas as pd import numpy as np #創(chuàng)建一個(gè)6*4的數(shù)據(jù)框,randn函數(shù)用于創(chuàng)建隨機(jī)數(shù) 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好啦,數(shù)據(jù)就出來了。接著我們用空值替換數(shù)值,創(chuàng)造出一個(gè)含有空值的DataFrame。
#把第二列數(shù)據(jù)設(shè)置為缺失值 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?
#接著就可以利用插值法填補(bǔ)空缺值了~ 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?
?(四)數(shù)據(jù)分組(用的是tips.csv的數(shù)據(jù),數(shù)據(jù)來源:https://github.com/mwaskom/seaborn-data)
?
group = df.groupby('day') #按day這一列進(jìn)行分組 #1 print group.first()#打印每一組的第一行數(shù)據(jù) #輸出 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()#打印每一組的最后一行數(shù)據(jù) #輸出 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 #首先創(chuàng)造一個(gè)Series(沒有數(shù)據(jù)情況下的福音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?
#數(shù)值替換,例如將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ǒng)計(jì)分析
(一)t檢驗(yàn)
1.獨(dú)立樣本t檢驗(yàn)
兩獨(dú)立樣本t檢驗(yàn)就是根據(jù)樣本數(shù)據(jù)對兩個(gè)樣本來自的兩獨(dú)立總體的均值是否有顯著差異進(jìn)行推斷;進(jìn)行兩獨(dú)立樣本t檢驗(yàn)的條件是,兩樣本的總體相互獨(dú)立且符合正態(tài)分布。
開始找不到合適的數(shù)據(jù),我就在網(wǎng)上隨便摘抄了個(gè)spss做獨(dú)立樣本t檢驗(yàn)的實(shí)例數(shù)據(jù)作為例子大家暫時(shí)看著吧找到合適的例子再給大家舉~
數(shù)據(jù)如下,我將數(shù)據(jù)保存為本地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)?
輸出結(jié)果的第一個(gè)元素為t值,第二個(gè)元素為p-value
ttest_ind默認(rèn)兩組數(shù)據(jù)方差齊性的,如果想要設(shè)置默認(rèn)方差不齊,可以設(shè)置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檢驗(yàn)
同樣找不到數(shù)據(jù),讓我們暫且假設(shè)上邊獨(dú)立樣本是配對樣本吧,使用同樣的數(shù)據(jù)。
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)同樣的,輸出結(jié)果的第一個(gè)元素為t值,第二個(gè)元素為p-value。
?
?(二)方差分析
1.單因素方差分析
這里依然沿用t檢驗(yàn)的數(shù)據(jù)
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方差齊性檢驗(yàn)。levene(*args, **kwds) Perform Levene test for equal variances.如果p<0.05,則方差不齊 print w,p #進(jìn)行方差分析 f,p = stats.f_oneway(*args) print f,p#輸出 (0.019607843137254936, 0.89209916055865535) 22.5771812081 0.001442381940842.多因素方差分析
??? 數(shù)據(jù)是我從網(wǎng)上找的多因素方差分析的一個(gè)例子,研究區(qū)組和營養(yǎng)素對體重的影響。我做成了excel文件,需要的同學(xué)可以問我要哈~做多因素方差分析需要加載statsmodels模塊,如果電腦沒有安裝可以pip install一下。
?
#數(shù)據(jù)導(dǎo)入 import pandas as pd MANOVA=pd.read_excel('E:\\MANOVA.xlsx') MANOVA #輸出(為了節(jié)省篇幅刪掉了中間部分的輸出結(jié)果) 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 #outputdf 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也許數(shù)據(jù)選得不對,p-value全是空值23333,待我找個(gè)好點(diǎn)兒的數(shù)據(jù)再做一次多因素方差分析。
3.重復(fù)測量設(shè)計(jì)的方差分析(單因素)?? ********待完善
重復(fù)測量設(shè)計(jì)是對同一因變量進(jìn)行重復(fù)測度,重復(fù)測量設(shè)計(jì)的方差分析可以是同一條件下進(jìn)行的重復(fù)測度,也可以是不同條件下的重復(fù)測量。
代碼和多因素方差分析一樣,思路不一樣而已~但我還找不到多因素方差分析合適的數(shù)據(jù)所以這兒就先不寫了2333
?4.混合設(shè)計(jì)的方差分析?? ********待完善
#########統(tǒng)計(jì)學(xué)學(xué)得好的同學(xué)們,教教我吧。。
(三)卡方檢驗(yàn)
卡方檢驗(yàn)就是統(tǒng)計(jì)樣本的實(shí)際觀測值與理論推斷值之間的偏離程度,實(shí)際觀測值與理論推斷值之間的偏離程度就決定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趨于符合,若兩個(gè)值完全相等時(shí),卡方值就為0,表明理論值完全符合。(from 百度百科2333)
1.單因素卡方檢驗(yàn)
數(shù)據(jù)源于網(wǎng)絡(luò),男女化妝與不化妝人數(shù)的理論值與實(shí)際值。
import numpy as np from scipy import stats from scipy.stats import chisquare observed = np.array([15,95])#觀測值:110學(xué)生中化妝的女生95人,化妝的男生15人 expected = np.array([55,55]) #理論值:110學(xué)生中化妝的女生55人,化妝的男生55人 chisquare(observed,expected) #output (58.18181818181818, 2.389775628860044e-14)2.多因素卡方檢驗(yàn)*****正在研究中,學(xué)會(huì)了完善這一塊~
?
?(四)計(jì)數(shù)統(tǒng)計(jì)(用的數(shù)據(jù)為tips.csv)
#example:統(tǒng)計(jì)性別 count = df['sex'].value_counts() #輸出 print count Male 157 Female 87 Name: sex, dtype: int64?
(五)回歸分析? *****待學(xué)習(xí): 數(shù)據(jù)擬合,廣義線性回歸。。。。等等
?
六.可視化
我覺得吧,其實(shí)看著excel就可以實(shí)現(xiàn)的功能為何那么復(fù)雜,excel確實(shí)夠通用夠便捷,但是處理很大數(shù)據(jù)量的話也許吃不消吧。學(xué)學(xué)python繪圖也不賴,而且講真,有的成效真的挺好看的。
(一)Seaborn
我學(xué)數(shù)據(jù)分析可視化是從學(xué)習(xí)Seaborn入門的,Seaborn是基于matplotlib的Python可視化庫,剛開始便接觸matplotlib難免有些吃力,參數(shù)多且難理解,但是慢慢來總會(huì)學(xué)會(huì)的。還有關(guān)鍵的一點(diǎn)是,seaborn畫出來的圖好好看。。 #基礎(chǔ)導(dǎo)入 import numpy as np import pandas as pd import seaborn as sns import matplotlib as mpl import matplotlib.pyplot as plt?
#小費(fèi)數(shù)據(jù)真的挺好的,這兒用tips作為example tips = sns.load_dataset('tips') #從網(wǎng)絡(luò)環(huán)境導(dǎo)入數(shù)據(jù)tips?
1.lmplot函數(shù)
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的參數(shù)進(jìn)行解釋
例子1.? 畫出總賬單和小費(fèi)回歸關(guān)系圖
用到了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為點(diǎn),line為線。其實(shí)就是用字典去限定點(diǎn)和線的各種屬性,如例子所示,散點(diǎn)的顏色為灰石色,線條的顏色為印度紅,成像效果就是這樣點(diǎn)線顏色分離,展現(xiàn)效果很好。大家也可以換上自己想要的圖片屬性。
sns.lmplot("total_bill", "tip", tips, scatter_kws={"marker": ".", "color": "slategray"}, line_kws={"linewidth": 1, "color": "indianred"}).savefig('picture2')
另外:顏色還可以使用RGB代碼,具體對照表可以參考這個(gè)網(wǎng)站,可以自己搭配顏色:
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
?
例子2.用餐人數(shù)(size)和小費(fèi)(tip)的關(guān)系圖
?
官方解釋:
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值進(jìn)行映射
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是個(gè)很有意思的參數(shù), 特別是處理靶數(shù)據(jù)的overlapping過于嚴(yán)重的情況時(shí), 通過增加一定程度的噪聲(noise)實(shí)現(xiàn)數(shù)據(jù)的區(qū)隔化, 這樣原始數(shù)據(jù)是若干?點(diǎn)簇?變成一系列密集鄰近的點(diǎn)群. 另外, 有的人會(huì)經(jīng)常將?rug?與?jitter?結(jié)合使用. 這依人吧.對于橫軸取離散水平的時(shí)候, 用x_jitter可以讓數(shù)據(jù)點(diǎn)發(fā)生水平的擾動(dòng).但擾動(dòng)的幅度不宜過大。
sns.lmplot('size', 'tip', tips, x_jitter=.15).savefig('picture4')
?
seaborn還可以做出xkcd風(fēng)格的圖片,還挺有意思的
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 ********待完善
?七.其它~
(一)調(diào)用R
讓Python直接調(diào)用R的函數(shù),下載安裝rpy2模塊即可~
具體步驟:http://www.geome.cn/posts/python-%E9%80%9A%E8%BF%87rpy2%E8%B0%83%E7%94%A8-r%E8%AF%AD%E8%A8%80/
親測可用~ 大大大大大前提:電腦上安裝了R
(二)ipython ********待完善
總結(jié)
以上是生活随笔為你收集整理的python数据分析入门学习笔记儿的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为何要离开?该怎么离开?今天来谈谈辞职
- 下一篇: python 查看帮助