目录
五、 数据处理
六、 统计分析
五.数据处理
(一)数据转置(用的是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)
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.填充缺失值
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
从以上输出值可以看出数据存在未知或缺失值,接着咱们来处理缺失值。
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
还有:
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.插值法填补缺失值
由于没有数据,这儿插播一个小知识点:创建一个随机的数据框
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。
#把第二列数据设置为缺失值
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
(五)回归分析 *****待学习: 数据拟合,广义线性回归。。。。等等
end.
作者:小星星.
来源:博客园.
关注我们吧,查看更多干货文章,视频。回复“数据”还有数据分析相关资料领取,每周更有免费直播课,有问题也可私信咨询小编哦!