本次所用到的數據分析工具:numpy、pandas、matplotlib、seaborn
一、分析目的
假如接下來需要開發一款APP,想了解開發什么類型的APP會更受歡迎,此次分析可以對下一步計划進行指導。
二、分析維度
本次只對以下八個維度進行分析:
三、數據處理
1、數據介紹
googleplaystore:谷歌應用商店App相關信息
導入數據:
#導入分析包
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
df = pd.read_csv('./googleplaystore.csv', usecols=(0, 1, 2, 3, 4, 5, 6)) #簡單瀏覽下數據 df.head() #查看行列數量 df.shape
數據量:10841*8
數據概覽:
2、列名稱理解:
3、數據清洗
# 查看各個列的非空數據量
df.count()
App 10841 Category 10841 Rating 9367 Reviews 10841 Size 10841 Installs 10841 Type 10840 Price 10841 dtype: int64
總共有10481條記錄,可以看出Rating有很多null值。
清洗數據:
#App列:查看是否有重復值
pd.unique(df['App']).size
有9660條唯一值記錄,重復值占總記錄大概10%,為了不留下其他列的異常值,將需要刪除的重復記錄放在后面處理。
# Category列: df['Category'].value_counts(dropna=False)
FAMILY 1972 GAME 1144 TOOLS 843 MEDICAL 463 BUSINESS 460 PRODUCTIVITY 424 PERSONALIZATION 392 COMMUNICATION 387 SPORTS 384 LIFESTYLE 382 FINANCE 366 HEALTH_AND_FITNESS 341 PHOTOGRAPHY 335 SOCIAL 295 NEWS_AND_MAGAZINES 283 SHOPPING 260 TRAVEL_AND_LOCAL 258 DATING 234 BOOKS_AND_REFERENCE 231 VIDEO_PLAYERS 175 EDUCATION 156 ENTERTAINMENT 149 MAPS_AND_NAVIGATION 137 FOOD_AND_DRINK 127 HOUSE_AND_HOME 88 LIBRARIES_AND_DEMO 85 AUTO_AND_VEHICLES 85 WEATHER 82 ART_AND_DESIGN 65 EVENTS 64 PARENTING 60 COMICS 60 BEAUTY 53 1.9 1 Name: Category, dtype: int64
這里的類別名稱為1.9的明顯是異常值,查看一下該條異常記錄
df[df['Category'] == '1.9']
猜測是在處理數據是出現了錯位的情況。
# 刪除該條記錄 df.drop(index=10472,inplace=True)
# rating列 df['Rating'].value_counts(dropna=False) # 有1474條NaN值 # 用平均值填充 df['Rating'].fillna(value=df['Rating'].mean(),inplace=True)
# reviews列 df['Reviews'].value_counts(dropna=False) # 查看是否有非數值型數據 df['Reviews'].str.isnumeric().sum()
#將Reviews轉化為int型
df['Reviews'] = df['Reviews'].astype('i8')
由於前面刪除了一條數據,現在總共有10840條數值型數據
# size列 df['Size'].value_counts(dropna=False)
以下是部分數據:
Varies with device 1695 11M 198 12M 196 14M 194 13M 191 15M 184 17M 160 19M 154 16M 149 26M 149 25M 143 20M 139 21M 138 10M 136 24M 136 18M 133 23M 117
# 將size替換成科學計數法以便於進一步分析
df['Size']=df['Size'].str.replace('M','e+6') df['Size']=df['Size'].str.replace('k','e+3')
df['Size'].value_counts(dropna=False)
Varies with device 1695 11e+6 198 12e+6 196 14e+6 194 13e+6 191 15e+6 184 17e+6 160 19e+6 154 16e+6 149 26e+6 149 25e+6 143 20e+6 139 21e+6 138 24e+6 136 10e+6 136 18e+6 133 23e+6 117 22e+6 114
這時可以發現第一條記錄不太符合要求,這時將該字符串用0代替,再將此替換為平均值(當然具體業務環境需要具體分析出現該情況的原因)
df['Size'] = df['Size'].str.replace('Varies with device', '0')
此時還需要進一步將Size列轉換為int類型,以便於接下來的計算
df['Size'] = df['Size'].astype('f8').astype('i8')
0 1695 11000000 198 12000000 196 14000000 194 13000000 191 15000000 184 17000000 160 19000000 154 16000000 149 26000000 149 10000000 146 25000000 143 20000000 139 21000000 138 24000000 136 18000000 133 23000000 117
這里將Size為0的數據填充為平均值(這里合理的方法是將0以外的數據進行平均值處理)
df['Size'].replace(0, df[df['Size']!=0].Size.mean(), inplace=True)
21516529 1695 11000000 198 12000000 196 14000000 194 13000000 191 15000000 184 17000000 160 19000000 154 16000000 149 26000000 149 10000000 146 25000000 143 20000000 139 21000000 138 24000000 136 18000000 133 23000000 117 22000000 114 29000000 103 27000000 97
#查看分布
df.describe()
#Installs列
df['Installs'].value_counts()
1,000,000+ 1579 10,000,000+ 1252 100,000+ 1169 10,000+ 1054 1,000+ 907 5,000,000+ 752 100+ 719 500,000+ 539 50,000+ 479 5,000+ 477 100,000,000+ 409 10+ 386 500+ 330 50,000,000+ 289 50+ 205 5+ 82 500,000,000+ 72 1+ 67 1,000,000,000+ 58 0+ 14 0 1 Name: Installs, dtype: int64
將‘,’和‘+’進行替換,並轉換為int類型
df['Installs'] = df['Installs'].str.replace('+', '') df['Installs'] = df['Installs'].str.replace(',', '') # 轉換 df['Installs'] = df['Installs'].astype('i8')
轉換后如下所示:
1000000 1579 10000000 1252 100000 1169 10000 1054 1000 907 5000000 752 100 719 500000 539 50000 479 5000 477 100000000 409 10 386 500 330 50000000 289 50 205 5 82 500000000 72 1 67 1000000000 58 0 15 Name: Installs, dtype: int64
#Type列: df.info()
App 10840 non-null object Category 10840 non-null object Rating 10840 non-null float64 Reviews 10840 non-null int64 Size 10840 non-null int64 Installs 10840 non-null int64 Type 10839 non-null object Price 10840 non-null object
Type列有一條na值,找出該記錄,並刪除:
df['Type'].value_counts(dropna=False) df[df['Type'].isnull()]
df.drop(index=9148, inplace=True)
#Price列: df['Price'].value_counts(dropna=False)
該列未出現異常值。
#刪除App重復記錄 df.drop_duplicates('App',inplace=True)
df.count()
App 9658 Category 9658 Rating 9658 Reviews 9658 Size 9658 Installs 9658 Type 9658 Price 9658 dtype: int64
清洗后的數據量為:9658*8
四、數據分析
從Category角度:
查看有多少個類別,以及哪些類別更受開發者歡迎;
pd.unique(df['Category']).size # 總共有33個類別
group_by_category=df.groupby('Category')[['App']].count().sort_values('App',ascending=False) group_by_category.rename(columns={'App':'App_count'},inplace=True) group_by_category.index.values f,axes=plt.subplots(figsize=(10,8)) sns.barplot(x=group_by_category['App_count'],y=group_by_category.index) plt.show()
從上以上條形圖可以看出娛樂、家庭以及工具類App最受開發者歡迎。
根據每個Category的平均安裝量進行排序,觀察哪些類別更受用戶青睞:
df.groupby('Category').mean().sort_values('Installs', ascending=False)
可以看出,娛樂社交類更受用戶歡迎。
根據每個Category的評論進行排序,觀察哪些類別評論更多:
df.groupby('Category').mean().sort_values('Reviews', ascending=False)
社交、游戲、視頻類評論較多。
根據評分進行排序:是否與用戶需求程度一致?
df.groupby('Category').mean().sort_values('Rating', ascending=False)
該結果明顯和上述分析結果不一致,可能的原因是那些安裝量更多的App用戶體驗感反而不太強,但這些又是用戶離不開的產品,
還有可能是某一類別的部分評分低而拉低的平均評分,總之,開發者在開發新產品時需要注意用戶體驗感的滿足,這樣才會有更高的用
戶黏性,因為一旦用戶體驗感不好,他們就會想辦法找其他產品來代替。
從Type角度:
df.groupby('Type').count()
很明顯,免費產品依然占主流啦,畢竟人都還是喜歡占便宜嘛,能用免費的就盡量不用收費的,不過從用戶角度來看,如果產品讓我特
別滿意的情況下,還是很樂意使用收費產品的!
從Price角度:
df.groupby('Price').count().sort_values('App',ascending=False).head(10)
從該角度可以發現,其實開發者開發較多的也是免費產品,只有少數需要收費,而且收費越高的數量越少,這也剛好符合用戶需求。
根據每個Category的平均Size進行排序:
df.groupby('Category').mean().sort_values('Size')
可以看到,工具類的安裝內存是最小的,這可能是因為工具是人們需要經常使用的,因此希望裝的小一些。
五、結論
通過對Googleplaystore相關數據的初步分析,可以看出用戶需求量最大的是社交、娛樂等產品,免費產品依然占據主流地位。
另外,就是建議開發者開發一些主流產品時要特別注意用戶體驗,目前各種同類型的產品很多,增強用戶體驗是提升競爭力的
一個很重要的方式;最后,對於工具類產品,在保證質量的前提下,要盡量開發安裝內存小的產品。