数据分析03-(数值型描述统计及项目分析)

处理普通文本

读取文本:read_csv() read_table()

方法参数参数解释
filepath_or_buffer文件路径
sep列之间的分隔符。read_csv()默认为为’,’, read_table()默认为’\t’
header默认将首行设为列名。header=None时应手动给出列名。
namesheader=None时设置此字段使用列表初始化列名。
index_col将某一列作为行级索引。若使用列表,则设置复合索引。
usecols选择读取文件中的某些列。设置为为相应列的索引列表。
skiprows跳过行。可选择跳过前n行或给出跳过的行索引列表。
encoding编码。

写入文本:dataFrame.to_csv()

方法参数参数解释
filepath_or_buffer文件路径
sep列之间的分隔符。默认为’,’
na_rep写入文件时dataFrame中缺失值的内容。默认空字符串。
columns定义需要写入文件的列。
header是否需要写入表头。默认为True。
index会否需要写入行索引。默认为True。
encoding编码。

案例:读取电信数据集。

pd.read_csv('../data/CustomerSurvival.csv', header=None, index_col=0)
处理JSON

读取json:read_json()

方法参数参数解释
filepath_or_buffer文件路径
encoding编码。

案例:读取电影评分数据:

pd.read_json('../data/ratings.json')

写入json:to_json()

方法参数参数解释
filepath_or_buffer文件路径; 若设置为None,则返回json字符串
orient设置面向输出格式:[‘records’, ‘index’, ‘columns’, ‘values’]

案例:

data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data, index=['s1','s2','s3','s4'])
df.to_json(orient='records')

其他文件读取方法参见:https://www.pypandas.cn/docs/user_guide/io.html

数值型描述统计(统计学)

算数平均值

$S = [s_1, s_2, …, s_n] $

样本中的每个值都是真值与误差的和。

m e a n = ( s 1 + s 2 + . . . + s n ) n mean = \frac{(s_1 + s_2 + ... + s_n) }{n} mean=n(s1+s2+...+sn)

算数平均值表示对真值的无偏估计。

m = np.mean(array)
m = array.mean()
m = df.mean(axis=0)

案例:针对电影评分数据做均值分析:

mean = ratings['John Carson'].mean()
mean = np.mean(ratings['John Carson'])
means = ratings.mean(axis=1)
加权平均值

求平均值时,考虑不同样本的重要性,可以为不同的样本赋予不同的权重。

样本: S = [ s 1 , s 2 , s 3 . . . s n ] S = [s_1, s_2, s_3 ... s_n] S=[s1,s2,s3...sn]

权重: W = [ w 1 , w 2 , w 3 . . . w n ] W =[w_1, w_2, w_3 ... w_n] W=[w1,w2,w3...wn]

加权平均值:
a = s 1 w 1 + s 2 w 2 + . . . + s n w n w 1 + w 2 + . . . + w n a = \frac{s_1w_1 + s_2w_2 + ... + s_nw_n}{w_1+w_2+...+w_n} a=w1+w2+...+wns1w1+s2w2+...+snwn
代码实现:

a = np.average(array, weights=volumes)

案例:自定义权重,求加权平均。

# 加权均值
w = np.array([3,1,1,1,1,1,1])
np.average(ratings.loc['Inception'], weights=w)

mask = ~pd.isna(ratings.loc['Inception']) 
np.average(ratings.loc['Inception'][mask], weights=w[mask])
最值

np.max() / np.min() / np.ptp(): 返回一个数组中最大值/最小值/极差(最大值减最小值)

import numpy as np
# 产生9个介于[10, 100)区间的随机数
a = np.random.randint(10, 100, 9)
print(a)
print(np.max(a), np.min(a), np.ptp(a))

np.argmax() np.argmin(): 返回一个数组中最大/最小元素的下标

print(np.argmax(a), np.argmin(a))
print(series.idxmax(), series.idxmin())
print(dataframe.idxmax(), dataframe.idxmin())

np.maximum() np.minimum(): 将两个同维数组中对应元素中最大/最小元素构成一个新的数组

print(np.maximum(a, b), np.minimum(a, b), sep='\n')
中位数

将多个样本按照大小排序,取中间位置的元素。

若样本数量为奇数,中位数为最中间的元素

[ 1 , 2000 , 3000 , 4000 , 10000000 ] [1, 2000, 3000, 4000, 10000000] [1,2000,3000,4000,10000000]

若样本数量为偶数,中位数为最中间的两个元素的平均值

[ 1 , 2000 , 3000 , 4000 , 5000 , 10000000 ] [1,2000,3000,4000,5000,10000000] [1,2000,3000,4000,5000,10000000]

案例:分析中位数的算法,测试numpy提供的中位数API:

import numpy as np
closing_prices = np.loadtxt('../../data/aapl.csv', 
	delimiter=',', usecols=(6), unpack=True)
size = closing_prices.size
sorted_prices = np.msort(closing_prices)
median = (sorted_prices[int((size - 1) / 2)] + 
          sorted_prices[int(size / 2)]) / 2
print(median)
median = np.median(closing_prices)
print(median)
频数与众数

频数指一组数据中各离散值出现的次数,而众数则是指一组数据中出现次数最多的值。

cars = np.array(['bmw', 'bmw', 'bz', 'audi', 'bz', 'bmw'])
cars = pd.Series(cars)
cars.value_counts()
cars.mode()
四分位数

所谓四分位数,即把数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。

  • 第1四分位数 (Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字。
  • 第2四分位数 (Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字。
  • 第3四分位数 (Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。

第3四分位数与第1四分位数的差距又称四分位距(InterQuartile Range,IQR)

ary = np.array([1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,5,5,5])
s = pd.Series(ary)
s.quantile([.0, .25, .5, .75, 1.])
标准差

样本(sample):
S = [ s 1 , s 2 , s 3 , . . . , s n ] S = [s_1, s_2, s_3, ..., s_n] S=[s1,s2,s3,...,sn]
平均值:
m = s 1 + s 2 + s 3 + . . . + s n n m = \frac{s_1 + s_2 + s_3 + ... + s_n}{n} m=ns1+s2+s3+...+sn
离差(deviation):表示某组数据距离某个中心点的偏离程度
D = [ d 1 , d 2 , d 3 , . . . , d n ] d i = S i − m D = [d_1, d_2, d_3, ..., d_n]\\ d_i = S_i-m D=[d1,d2,d3,...,dn]di=Sim
离差方:
Q = [ q 1 , q 2 , q 3 , . . . , q n ] q i = d i 2 Q = [q_1, q_2, q_3, ..., q_n]\\ q_i=d_i^2 Q=[q1,q2,q3,...,qn]qi=di2
总体方差(variance):
v = ( q 1 + q 2 + q 3 + . . . + q n ) n v = \frac{(q_1+q_2+q_3 + ... + q_n)}{n} v=n(q1+q2+q3+...+qn)
总体标准差(standard deviation):
s = v s = \sqrt{v} s=v
样本方差:
v ′ = ( q 1 + q 2 + q 3 + . . . + q n ) n − 1 v' = \frac{(q_1+q_2+q_3 + ... + q_n)}{n-1} v=n1(q1+q2+q3+...+qn)
其中,n-1称之为“贝塞尔校正”,这是因为抽取样本时候,采集的样本主要是落在中心值附近,那么通过这些样本计算的方差会小于等于对总体数据集方差的无偏估计值。为了能弥补这方面的缺陷,那么我们把公式的n改为n-1,以此来提高方差的数值。称为贝塞尔校正系数。

样本标准差:
s ′ = v ′ s' = \sqrt{v'} s=v
案例: 根据标准差理论,针对评分数据进行方差分析:

ratings.std(axis=0)
宏观数值统计
ratings.describe()
协方差、相关矩阵、相关系数

通过两组统计数据计算而得的协方差可以评估这两组统计数据的相似程度(相关性)。

样本

A = [a1, a2, ..., an]
B = [b1, b2, ..., bn]

平均值

ave_a = (a1 + a2 +...+ an)/n
ave_b = (b1 + b2 +...+ bn)/n

离差(用样本中的每一个元素减去平均数,求得数据的误差程度):

dev_a = [a1, a2, ..., an] - ave_a
dev_b = [b1, b2, ..., bn] - ave_b

协方差

协方差可以简单反映两组统计样本的相关性,值为正,则为正相关;值为负,则为负相关,绝对值越大相关性越强。

cov_ab = mean(dev_a x dev_b)
cov_ba = mean(dev_b x dev_a)

案例:计算两组股票数据的协方差,得出分析结论。

bhp = pd.read_csv('../data/bhp.csv', header=None, usecols=[6], names=['closing'])
vale = pd.read_csv('../data/vale.csv', header=None, usecols=[6], names=['closing'])

#平均值
ave_bhp = np.mean(bhp)
ave_vale = np.mean(vale)
#离差
dev_bhp = bhp - ave_bhp
dev_vale = vale - ave_vale
#协方差
cov_ab = np.mean(dev_bhp*dev_vale)
cov_ab

相关系数

协方差除去两组统计样本标准差的乘积是一个[-1, 1]之间的数。该结果称为统计样本的相关系数。

# a组样本 与 b组样本做对照后的相关系数
cov_ab/(std_a x std_b)
# b组样本 与 a组样本做对照后的相关系数
cov_ba/(std_b x std_a)
# a样本与a样本作对照   b样本与b样本做对照   二者必然相等
cov_ab/(std_a x std_b)=cov_ba/(std_b x std_a)

通过相关系数可以分析两组数据的相关性:

若相关系数越接近于0,越表示两组样本越不相关。
若相关系数越接近于1,越表示两组样本正相关。
若相关系数越接近于-1,越表示两组样本负相关。

案例:输出案例中两组数据的相关系数。

#相关系数: 协方差 /两组样本标准差之积
print('相关系数:', cov_ab/(np.std(a)*np.std(b)), cov_ba/(np.std(a)*np.std(b)))

# 直接返回相关系数
np.corrcoef(bhp,vale)

相关矩阵
[ v a r _ a s t d _ a × s t d _ a c o v _ a b s t d _ a × s t d _ b c o v _ b a s t d _ b × s t d _ a v a r _ b s t d _ b × s t d _ b ] \left[ \begin{array}{c} \frac{var\_a}{std\_a \times std\_a} & \frac{cov\_ab}{std\_a \times std\_b} \\ \frac{cov\_ba}{std\_b \times std\_a} & \frac{var\_b}{std\_b \times std\_b}\\ \end{array} \right ] [std_a×std_avar_astd_b×std_acov_bastd_a×std_bcov_abstd_b×std_bvar_b]
矩阵正对角线上的值都为1。(同组样本自己相比绝对正相关)
[ 1 c o v _ a b s t d _ a × s t d _ b c o v _ b a s t d _ b × s t d _ a 1 ] \left[ \begin{array}{ccc} 1 & \frac{cov\_ab}{std\_a \times std\_b} \\ \frac{cov\_ba}{std\_b \times std\_a} & 1\\ \end{array} \right ] [1std_b×std_acov_bastd_a×std_bcov_ab1]
numpy与pandas提供了求得相关矩阵与协方差矩阵的API:

# 相关矩阵
a = [5, 3, 5, 3, 1]
b = [4, 2, 3, 4, 2]
np.corrcoef(a, b)	
dataFrame.corr()

# 协方差矩阵 
# [[aa的协方差,ab的协方差], [ba的协方差, bb的协方差]]
np.cov(a, b)			
dataFrame.cov()

项目:保健品消费情况特征描述性统计分析

项目文件资源下载

在我的资源文件中下载:
https://download.youkuaiyun.com/download/yegeli/12562286
保健品.csv、保健品字段介绍.csv

import numpy as np
import pandas as pd
data = pd.read_csv('保健品.csv', engine='python')
# 拿到前20题的结果
sub_data = data.loc[:, :'q5_20']
sub_data.head()
q5_01q5_02q5_03q5_04q5_05q5_06q5_07q5_08q5_09q5_10q5_11q5_12q5_13q5_14q5_15q5_16q5_17q5_18q5_19q5_20
033455545344434552344
154555554444344555445
255551141115115511511
335511145444234344115
454223443432532343453
q5_01	令面色红润
q5_02	使皮肤有光泽
q5_03	精神状态好
q5_04	去斑
q5_05	去痘
q5_06	去皱
q5_07	解决皮肤干燥
q5_08	调节内分泌
q5_09	延缓皮肤衰老
q5_10	去除疲劳
q5_11	提高睡眠质量
q5_12	消除黑眼圈
q5_13	通便润肠
q5_14	抗衰老
q5_15	提高免疫力
q5_16	应该对自己好点
q5_17	希望自己像模特一样
q5_18	同龄人都在服用
q5_19	年轻人对我说该服用
q5_20	女为悦己者容
q8	主要服用的产品
w1	婚姻
w2	教育
w6	个人收入
desc = sub_data.describe()
desc
q5_01q5_02q5_03q5_04q5_05q5_06q5_07q5_08q5_09q5_10q5_11q5_12q5_13q5_14q5_15q5_16q5_17q5_18q5_19q5_20
count625.000000625.000000625.0000625.000000625.000000625.000000625.000000625.000000625.000000625.000000625.000000625.000000625.000000625.00000625.00000625.000000625.000000625.000000625.000000625.000000
mean3.8048003.9328004.15523.3056002.7600003.2768003.6832003.6432003.7504003.9008003.8448003.1392003.4384003.665604.032003.8688002.6944003.0368003.0320003.275200
std1.2886251.1734081.04541.4853081.5617631.5458351.3535761.3829511.3710971.1490311.2909611.4067661.4130111.411441.187111.2616391.5590051.3868391.3583551.417985
min1.0000001.0000001.00001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.000001.000001.0000001.0000001.0000001.0000001.000000
25%3.0000003.0000004.00002.0000001.0000002.0000003.0000003.0000003.0000003.0000003.0000002.0000002.0000003.000003.000003.0000001.0000002.0000002.0000002.000000
50%4.0000004.0000004.00004.0000003.0000004.0000004.0000004.0000004.0000004.0000004.0000003.0000004.0000004.000004.000004.0000002.0000003.0000003.0000003.000000
75%5.0000005.0000005.00005.0000004.0000005.0000005.0000005.0000005.0000005.0000005.0000004.0000005.0000005.000005.000005.0000004.0000004.0000004.0000005.000000
max5.0000005.0000005.00005.0000005.0000005.0000005.0000005.0000005.0000005.0000005.0000005.0000005.0000005.000005.000005.0000005.0000005.0000005.0000005.000000
相关性分析
corr = sub_data.corr()
corr[corr>0.4] = 999
corr[corr<=0.4] = 0
corr
q5_01q5_02q5_03q5_04q5_05q5_06q5_07q5_08q5_09q5_10q5_11q5_12q5_13q5_14q5_15q5_16q5_17q5_18q5_19q5_20
q5_01999.0999.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
q5_02999.0999.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
q5_030.00.0999.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
q5_040.00.00.0999.00.0999.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
q5_050.00.00.00.0999.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
q5_060.00.00.0999.00.0999.0999.00.0999.00.00.00.00.00.00.00.00.00.00.00.0
q5_070.00.00.00.00.0999.0999.00.00.00.00.00.00.00.00.00.00.00.00.00.0
q5_080.00.00.00.00.00.00.0999.00.00.00.00.00.00.00.00.00.00.00.00.0
q5_090.00.00.00.00.0999.00.00.0999.00.00.00.00.0999.00.00.00.00.00.00.0
q5_100.00.00.00.00.00.00.00.00.0999.00.00.00.00.00.00.00.00.00.00.0
q5_110.00.00.00.00.00.00.00.00.00.0999.00.00.00.00.00.00.00.00.00.0
q5_120.00.00.00.00.00.00.00.00.00.00.0999.00.00.00.00.00.00.00.00.0
q5_130.00.00.00.00.00.00.00.00.00.00.00.0999.00.00.00.00.00.00.00.0
q5_140.00.00.00.00.00.00.00.0999.00.00.00.00.0999.00.00.00.00.00.00.0
q5_150.00.00.00.00.00.00.00.00.00.00.00.00.00.0999.00.00.00.00.00.0
q5_160.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0999.00.00.00.00.0
q5_170.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0999.00.00.00.0
q5_180.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0999.0999.00.0
q5_190.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0999.0999.00.0
q5_200.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0999.0

通过相关性分析,发现某些字段之间有正相关关系,代表保健品解决的是同一种问题。可以把当前这20道题总结出几个主要方面(消费保健品的重要因素)便于后期分析:

  1. 改善精神状态
  2. 抗衰老
  3. 有益于身体健康
  4. 关注外界看法
分析市场中现有的保健品所关注的功效
mean_score = desc.loc['mean']
# 降序排列均值数组
mean_score = mean_score.sort_values(ascending=False)
# 整理结果
fields = pd.read_csv('保健品字段介绍.csv', engine='python',
        header=None, names=['fid', 'effect', '_'],
        usecols=['fid', 'effect'], index_col='fid',
        encoding='gbk')
fields['mean_score'] = mean_score
# by:按照mean_score列进行降序排列
fields = fields.sort_values(by='mean_score', ascending=False)
fields
effectmean_score
fid
q5_03精神状态好4.1552
q5_15提高免疫力4.0320
q5_02使皮肤有光泽3.9328
q5_10去除疲劳3.9008
q5_16应该对自己好点3.8688
q5_11提高睡眠质量3.8448
q5_01令面色红润3.8048
q5_09延缓皮肤衰老3.7504
q5_07解决皮肤干燥3.6832
q5_14抗衰老3.6656
q5_08调节内分泌3.6432
q5_13通便润肠3.4384
q5_04去斑3.3056
q5_06去皱3.2768
q5_20女为悦己者容3.2752
q5_12消除黑眼圈3.1392
q5_18同龄人都在服用3.0368
q5_19年轻人对我说该服用3.0320
q5_05去痘2.7600
q5_17希望自己像模特一样2.6944
q8主要服用的产品NaN
w1婚姻NaN
w2教育NaN
w6个人收入NaN

通过上表可得:多数产品在产品功效上更多关注改善用户的精神状态,其次抗衰老,再次为身体健康,最后为外界因素。

统计收集到的结果中每一种保健品的已婚未婚频数
# w1字段的频数
result = data['w1'].value_counts()
result / result.sum()
2    0.7248
1    0.2752
Name: w1, dtype: float64

收集到的数据中,已婚占比:72% 未婚占比:27%

统计每一种保健品的频数
products = {1:'太太**',2:'乌鸡**',3:'排毒**',4:'阿*',
            5:'红桃*',6:'脑白*',7:'朵**',9:'其他'}
products = pd.Series(products)
r = data['q8'].value_counts()
# 把两个Series合并到一个DataFrame中
result = pd.DataFrame({'products':products, 'q8':r})
result.sort_values(by='q8', ascending=False)
productsq8
9其他282
3排毒**83
1太太**55
5红桃*55
7朵**55
4阿*40
2乌鸡**32
6脑白*23

由结果可知,市场占有率最高的是“排毒”,第二梯队:“太太”、“红桃”、“朵”,针对当前这种情况,如果想要切入保健品市场,可以尽快抢占:“乌鸡”、“阿”等产品的市场占有率,进而慢慢蚕食第二梯队的市场。所以后续分析可以关注一下这几个品牌。

研究每个产品的功效的侧重点
# 研究每一个的产品   功效侧重点
result1 = pd.DataFrame([])
for k, v in products.items():
    mask = data['q8']==k
    result1[k] = sub_data[mask].mean()
result1
12345679
q5_014.1818183.875003.8554223.6253.7454553.5652173.6363643.797872
q5_024.2181824.031253.9156633.5503.8909093.6521744.1272733.918440
q5_034.0181824.031254.2168673.9004.2727273.9130434.2000004.202128
q5_043.5090913.375003.4578312.6503.1090913.4782613.2909093.333333
q5_052.5636362.843753.1084341.9252.9454552.8695653.1636362.680851
q5_063.7272733.218753.2530123.2002.8545453.4782613.5272733.230496
q5_073.8727273.781253.8433733.3253.4000003.7826093.8727273.648936
q5_083.8181824.031253.8674703.2003.2727273.5217393.6909093.634752
q5_093.9636363.531253.7951813.5503.4727273.4782613.7454553.826241
q5_103.6363643.812503.7710843.7754.0000003.1739134.0909094.021277
q5_113.8909093.875003.5301203.4503.8909094.1304353.8363643.950355
q5_123.2181822.906253.1927712.3253.2545453.6086963.3090913.156028
q5_133.3272733.593753.7590363.0002.8181823.2173913.6727273.503546
q5_143.7818183.625003.6144583.5253.1818183.3478263.5636363.822695
q5_153.8363644.156254.0240963.9004.0000003.7826093.8727274.134752
q5_163.8000004.468753.6265063.5254.1090913.3913044.0727273.886525
q5_172.9272732.718752.7469882.2253.0909092.2173913.0363642.592199
q5_183.1454553.468753.1084342.5753.2000002.8260873.2727272.950355
q5_193.2909093.375002.9638552.7253.2181822.8695653.0727272.975177
q5_203.5090913.781253.6265062.3753.1090912.8260873.2545453.269504
# 获取每一列的最大值的索引,可以理解为每个产品最注重的功效
result_idxmax = result1.idxmax()
result2 = pd.DataFrame(
    {'products':products, 'idxmax': result_idxmax})
result2
idxmaxproducts
1q5_02太太**
2q5_16乌鸡**
3q5_03排毒**
4q5_03阿*
5q5_03红桃*
6q5_11脑白*
7q5_03朵**
9q5_03其他
# 迭代idxmax列,通过fid得到一组对应的功效字符串,追加到result2
def func(item):
    return fields['effect'].loc[item]
result2['effect'] = result2['idxmax'].apply(func)
result2
idxmaxproductseffect
1q5_02太太**使皮肤有光泽
2q5_16乌鸡**应该对自己好点
3q5_03排毒**精神状态好
4q5_03阿*精神状态好
5q5_03红桃*精神状态好
6q5_11脑白*提高睡眠质量
7q5_03朵**精神状态好
9q5_03其他精神状态好

由每个产品的功效侧重点可得:
若希望切入保健品市场,功效方面则优先保证改善用户的精神状态。而针对“乌鸡”、“阿”这些竞品,可以从广告投放,舆论扩散,产品口号等角度抢占他们的市场。

研究每个产品的用户群体,婚否字段分析
# w1字段的频数
result = data['w1'].value_counts()
result / result.sum()
2    0.7248
1    0.2752
Name: w1, dtype: float64
# 研究q8==k的用户群体
result3 = pd.DataFrame([])
for k, v in products.items():
    mask = data['q8']==k
    result3[k] = data[mask]['w1'].value_counts()
result3 = result3.T
result3.columns = ['married', 'not-married']
result3['product'] = products
result3['effect'] = result2['effect']
result3
marriednot-marriedproducteffect
1505太太**使皮肤有光泽
22111乌鸡**应该对自己好点
34736排毒**精神状态好
4391阿*精神状态好
52431红桃*精神状态好
61310脑白*提高睡眠质量
74213朵**精神状态好
921765其他精神状态好

可知:“太太”、“阿”、“红桃”对婚姻属性比较敏感,前两者针对已婚女士,“红桃”针对未婚女士。已婚女士更关注保健品的护肤、抗衰老等功效,未婚女士更多要保持年轻精神状态。针对“乌鸡”、“阿”角度分析,可以更多关注已婚女士对保健品的需求,设计相关产品形象。

结论
  1. 多数产品在产品功效上更多关注改善用户的精神状态,其次抗衰老,再次为身体健康,最后为外界因素。
  2. 如果想要切入保健品市场,可以尽快抢占:“乌鸡”、“阿”等产品的市场占有率,进而慢慢蚕食第二梯队的市场。所以后续分析可以关注一下这几个品牌。
  3. 若希望切入保健品市场,功效方面则优先保证改善用户的精神状态。而针对“乌鸡”、“阿”这些竞品,可以从广告投放,舆论扩散,产品口号等角度抢占他们的市场。
  4. 已婚女士更关注保健品的护肤、抗衰老等功效,未婚女士更多要保持年轻精神状态。针对“乌鸡”、“阿”角度分析,可以更多关注已婚女士对保健品的需求,设计相关产品形象。

代码总结

import numpy as np
import pandas as pd
ratings = pd.read_json('../../data/ratings.json')
ratings
John CarsonMichelle PetersonWilliam ReynoldsJillian HobartMelissa JonesAlex RobertsMichael Henry
Inception2.53.02.5NaN33.0NaN
Pulp Fiction3.53.53.03.544.04.5
Anger Management3.01.5NaN3.02NaNNaN
Fracture3.55.03.54.035.04.0
Serendipity2.53.5NaN2.523.51.0
Jerry Maguire3.03.04.04.533.0NaN
m = ratings.loc['Inception'].mean()
m = ratings.mean()
m = ratings.mean(axis=1)
m
Inception           2.800000
Pulp Fiction        3.714286
Anger Management    2.375000
Fracture            4.000000
Serendipity         2.500000
Jerry Maguire       3.416667
dtype: float64
scores = ratings.loc['Fracture']
weights = [3, 5, 5, 3, 1, 1, 1]
s = np.average(scores, weights=weights)
s
4.052631578947368
最值
np.max(ratings['Alex Roberts']), np.min(ratings['Alex Roberts'])
(5.0, 3.0)
ratings.max(axis=1)
Inception           3.0
Pulp Fiction        4.5
Anger Management    3.0
Fracture            5.0
Serendipity         3.5
Jerry Maguire       4.5
dtype: float64
ratings.idxmax(axis=1)
Inception           Michelle Peterson
Pulp Fiction            Michael Henry
Anger Management          John Carson
Fracture            Michelle Peterson
Serendipity         Michelle Peterson
Jerry Maguire          Jillian Hobart
dtype: object
ratings.idxmin()
John Carson                 Inception
Michelle Peterson    Anger Management
William Reynolds            Inception
Jillian Hobart            Serendipity
Melissa Jones        Anger Management
Alex Roberts                Inception
Michael Henry             Serendipity
dtype: object
中位数
np.median(ratings.loc['Fracture'])
4.0
ratings.median()
John Carson          3.00
Michelle Peterson    3.25
William Reynolds     3.25
Jillian Hobart       3.50
Melissa Jones        3.00
Alex Roberts         3.50
Michael Henry        4.00
dtype: float64
ratings
John CarsonMichelle PetersonWilliam ReynoldsJillian HobartMelissa JonesAlex RobertsMichael Henry
Inception2.53.02.5NaN33.0NaN
Pulp Fiction3.53.53.03.544.04.5
Anger Management3.01.5NaN3.02NaNNaN
Fracture3.55.03.54.035.04.0
Serendipity2.53.5NaN2.523.51.0
Jerry Maguire3.03.04.04.533.0NaN
频数与众数
cars = np.array(['bmw', 'bmw', 'bz', 'bz', 'audi', 'bz', 'bmw'])
cars = pd.Series(cars)
cars.value_counts()
bmw     3
bz      3
audi    1
dtype: int64
cars.mode()
0    bmw
1     bz
dtype: object
四分位数
data = pd.read_csv('CustomerSurvival.csv', header=None)
data
extra_time = data[2]

extra_time.quantile([.0, .25, .5, .75, 1.])
0.00   -2828.33
0.25    -126.67
0.50      13.50
0.75     338.66
1.00    4314.00
Name: 2, dtype: float64
方差与标准差
# ddof=1: 贝塞尔校正系数
np.std(ratings['John Carson'], ddof=1), \
np.std(ratings['Michelle Peterson'])
(0.4472135954999579, 1.0307764064044151)
ratings.std()
John Carson          0.447214
Michelle Peterson    1.129159
William Reynolds     0.645497
Jillian Hobart       0.790569
Melissa Jones        0.752773
Alex Roberts         0.836660
Michael Henry        1.892969
dtype: float64
ratings.describe()
John CarsonMichelle PetersonWilliam ReynoldsJillian HobartMelissa JonesAlex RobertsMichael Henry
count6.0000006.0000004.0000005.0000006.0000005.000003.000000
mean3.0000003.2500003.2500003.5000002.8333333.700003.166667
std0.4472141.1291590.6454970.7905690.7527730.836661.892969
min2.5000001.5000002.5000002.5000002.0000003.000001.000000
25%2.6250003.0000002.8750003.0000002.2500003.000002.500000
50%3.0000003.2500003.2500003.5000003.0000003.500004.000000
75%3.3750003.5000003.6250004.0000003.0000004.000004.250000
max3.5000005.0000004.0000004.5000004.0000005.000004.500000
data.describe()
0123456789
count4975.0000004975.0000004975.0000004975.0000004975.0000004975.0000004975.0000004975.0000004975.0000004975.000000
mean2488.0000001.057688258.520034-71.5804220.0213070.2452260.0474370.22733714.7742710.782714
std1436.3031250.258527723.057213275.5574480.1444190.4302640.2781430.4191546.5342730.412441
min1.0000001.000000-2828.330000-2189.8800000.0000000.0000000.0000000.0000001.0000000.000000
25%1244.5000001.000000-126.670000-74.2900000.0000000.0000000.0000000.00000013.0000001.000000
50%2488.0000001.00000013.500000-59.6500000.0000000.0000000.0000000.00000013.0000001.000000
75%3731.5000001.000000338.660000-25.7950000.0000000.0000000.0000000.00000019.0000001.000000
max4975.0000003.0000004314.0000002568.7000001.0000001.0000002.0000001.00000025.0000001.000000
协方差、相关矩阵、相关系数
A = ratings['John Carson']
B = ratings['Melissa Jones']
# 求两组数据的均值
mean_a = A.mean()
mean_b = B.mean()
# 求离差
dev_a = A - mean_a
dev_b = B - mean_b
# 求协方差
cov_ab = np.mean(dev_a * dev_b)
cov_ab
0.16666666666666666
# 相关系数   协方差/两组样本标准差之积
coef = cov_ab / (np.std(A) * np.std(B))
coef
0.5940885257860046
# np.corrcoef() 返回相关系数矩阵
np.corrcoef(A, B)
C = ratings['Michelle Peterson']
np.corrcoef([A, B, C])

array([[1.        , 0.59408853, 0.39605902],
       [0.59408853, 1.        , 0.41176471],
       [0.39605902, 0.41176471, 1.        ]])
ratings.corr()
John CarsonMichelle PetersonWilliam ReynoldsJillian HobartMelissa JonesAlex RobertsMichael Henry
John Carson1.0000000.3960590.4045200.5669470.5940890.7470180.991241
Michelle Peterson0.3960591.0000000.2045980.3149700.4117650.9637960.381246
William Reynolds0.4045200.2045981.0000001.000000-0.2581990.134840-1.000000
Jillian Hobart0.5669470.3149701.0000001.0000000.5669470.0285710.893405
Melissa Jones0.5940890.411765-0.2581990.5669471.0000000.2112890.924473
Alex Roberts0.7470180.9637960.1348400.0285710.2112891.0000000.662849
Michael Henry0.9912410.381246-1.0000000.8934050.9244730.6628491.000000
ratings
John CarsonMichelle PetersonWilliam ReynoldsJillian HobartMelissa JonesAlex RobertsMichael Henry
Inception2.53.02.5NaN33.0NaN
Pulp Fiction3.53.53.03.544.04.5
Anger Management3.01.5NaN3.02NaNNaN
Fracture3.55.03.54.035.04.0
Serendipity2.53.5NaN2.523.51.0
Jerry Maguire3.03.04.04.533.0NaN
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YEGE学AI算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值