09可視化深度探索蘋果AppStores

導(dǎo)入庫

import pandas as pd
import numpy as np

from matplotlib import pyplot as plt
import seaborn as sns

import plotly_express as px
import plotly.graph_objects as go

數(shù)據(jù)基本信息

data = pd.read_csv("AppleStore.csv", index_col=0)
data.head()
image.png
# 整體大小
data.shape
image.png
# 缺失值
data.isnull().sum()
image.png
# 字段類型
data.dtypes
image.png
# 描述信息
data.describe()
image.png

APP信息統(tǒng)計

# 免費(fèi)的APP數(shù)量
sum(data.price==0)
image.png
# 價格超過50$的APP數(shù)量啤挎,價格大于50$即表示為:超貴
sum(data.price >= 50)
image.png
# 價格超過50$的比例
sum((data.price > 50) / len(data.price) * 100)
image.png
sum(data.price >= 50) / len(data) * 100
image.png
# 立群數(shù)據(jù)
# 價格超過50$的APP信息
outlier = data[data.price > 50][["track_name", "price", "prime_genre", "user_rating"]]
outlier
image.png

免費(fèi)APP

freeapps = data[data["price"] == 0]
freeapps.head()
image.png

正常區(qū)間的APP

# 取數(shù)
paidapps = data[(data["price"] > 0) & (data.price < 50)]
print("max_price:", max(paidapps.price))
print("min_price:", min(paidapps.price))
image.png
# 價格分布
plt.style.use("fivethirtyeight")
plt.figure(figsize=(12, 10))

# 繪制直方圖
plt.subplot(2, 1, 1)
plt.hist(paidapps.price, log=True)
# 標(biāo)題和label值
plt.title("Price distribution of apps (Log scale)")
plt.ylabel("Frequency Log scale")
plt.xlabel("Price Distributions in ($)")

# 繪制stripplot(分布散點(diǎn)圖)
plt.subplot(2, 1, 2)
plt.title("Visual Price distribution")
sns.stripplot(data=paidapps, 
              x="price", 
              jitter=True,  #當(dāng)數(shù)據(jù)點(diǎn)重合較多時驻谆,用該參數(shù)做調(diào)整 
              size=6)

plt.show()
image.png

1.隨著價格的上漲卵凑,付費(fèi)應(yīng)用的數(shù)量呈現(xiàn)指數(shù)級的下降
2.很少應(yīng)用的價格超過30刀;因此胜臊,盡量保持價格在30以下

category對價格分布的影響

data.columns
image.png
# 種類及數(shù)目
data["prime_genre"].value_counts()
image.png
# 顯示前5個種類
yrange = [0, 25]
fsize = 15
plt.figure(figsize=(12, 10))

plt.subplot(5, 1, 1)
plt.xlim(yrange)
games = paidapps[paidapps["prime_genre"] == "Games"]
sns.stripplot(data=games,
             x="price",
             jitter=True,
             size=6,
             color="#eb5e66")
plt.title("Games", fontsize=fsize)
plt.xlabel("")


plt.subplot(5, 1, 2)
plt.xlim(yrange)
ent = paidapps[paidapps["prime_genre"] == "Entertainment"]
sns.stripplot(data=ent,
             x="price",
             jitter=True,
             size=6,
             color="#ff8300")
plt.title("Entertainment", fontsize=fsize)
plt.xlabel("")

plt.subplot(5, 1, 3)
plt.xlim(yrange)
edu = paidapps[paidapps.prime_genre == "Education"]
sns.stripplot(data=edu,
              x="price",
              jitter=True,
              size=6,
              color="#20B2AA")
plt.title("Education", fontsize=fsize)
plt.xlabel("")

plt.subplot(5, 1, 4)
plt.xlim(yrange)
pv = paidapps[paidapps.prime_genre == "Photo & Video"]
sns.stripplot(data=pv,
              x="price",
              jitter=True,
              size=6,
              color="#b84efd")
plt.title("Photo & Video", fontsize=fsize)
plt.xlabel("")

plt.subplot(5, 1, 5)
plt.xlim(yrange)
ut = paidapps[paidapps.prime_genre == "Utilities"]
sns.stripplot(data=pv,
              x="price",
              jitter=True,
              size=6,
              color="#084cfd")
plt.title("Utilities", fontsize=fsize)
plt.xlabel("")
image.png

1.Games游戲類的apps價格相對高且分布更廣勺卢,直到25美元
2.Entertainment娛樂類的apps價格相對較低

Paid apps Vs Free apps

# 付費(fèi)APP和免費(fèi)APPA之間的比較
# app的種類
categories = data["prime_genre"].value_counts()
categories
image.png
len(categories)
image.png
# 選擇前4個
s = categories.index[:4]
s
image.png
def categ(x):
    if x in s:
        return x
    else:
        return "Others"
    
data["broad_genre"] = data["prime_genre"].apply(categ)
data.head()
image.png
# 統(tǒng)計免費(fèi)和付費(fèi)APP下的種類數(shù)
# 免費(fèi)
data[data.price==0].broad_genre.value_counts()
image.png
# 免費(fèi)APP
free = data[data.price==0].broad_genre.value_counts().sort_index().to_frame()
free
image.png
# 付費(fèi)
paid = data[data.price > 0].broad_genre.value_counts().sort_index().to_frame()
paid
image.png
# 全部
total = data.broad_genre.value_counts().sort_index().to_frame()
total
image.png
# 將兩個數(shù)據(jù)合并起來
free.columns = ["free"]
paid.columns = ["paid"]
total.columns = ["total"]

free
image.png
# 統(tǒng)計量對比
dist = free.join(paid).join(total)
# 另一種寫法
dist = pd.concat([paid, free, total], axis=1)
dist
image.png
# 生成比例
dist["paid_per"] = dist.paid / dist.total * 100
dist["free_per"] = dist.free / dist.total * 100
dist
image.png
# 高亮顯示最大值
dist.style.highlight_max()
image.png

1.Games相關(guān)的APP是最多的,不管是paid還是free
2.從付費(fèi)占比來看象对,Education教育類型占比最大
3.從免費(fèi)占比來看黑忱,Entertainment娛樂類型的占比最大

付費(fèi)和免費(fèi)的占比

# 生成數(shù)據(jù)
# 分組對比付費(fèi)和免費(fèi)的占比
list_free = dist.free_per.tolist()
list_free
image.png
# 列表轉(zhuǎn)成元組
tuple_free = tuple(list_free)
tuple_paidapps = tuple(dist.paid_per.tolist())
# 柱狀圖
plt.figure(figsize=(12, 8))
N = 5
ind = np.arange(N)
width = 0.56 #兩個柱子間的寬度

p1 = plt.bar(ind, tuple_free, width, color="#45cea2")
p2 = plt.bar(ind, tuple_paidapps, width, bottom=tuple_free, color="#fdd400")

plt.xticks(ind, tuple(dist.index.tolist()))
plt.legend((p1[0], p2[0]), ("free", "paid"))
plt.show()
image.png
# 餅圖
pies = dist[["free_per", "paid_per"]]
pies.columns = ["free %", "paid %"]
pies
image.png
plt.figure(figsize=(15, 8))

pies.T.plot.pie(subplots=True,  #顯示子圖
               figsize=(20, 4),  #大小
               colors=["#45cea2", "#fad470"])  #顏色

plt.show()
image.png

1.在教育類的APP中,付費(fèi)paid的占比是很高的
2.相反的勒魔,在娛樂類的APP中甫煞,免費(fèi)free的占比是很高的

付費(fèi)APP真的足夠好嗎?

# 價格分類
data["category"] = data["price"].apply(lambda x: "Paid" if x > 0 else "Free")
data.head()
image.png
# 小提琴圖
plt.figure(figsize=(15, 8))
plt.style.use("fast")
plt.ylim([0, 5])

plt.title("Distribution of User ratings")

sns.violinplot(data=data,
              y="user_rating",
              x="broad_genre",
              hue="category",
              vertical=True,  #垂直顯示
              kde=False,
              split=True,  #同個類別的小提琴圖一起顯示
              linewidth=2,
              scale="count",
              palette=["#fdd470", "#45cea2"])

plt.xlabel(" ")
plt.ylabel("Rating(0-5)")

plt.show()
image.png

1.在Education類的APP中冠绢,paid的占比是明顯高于free抚吠;其次是Photo & Video
2.Entertainment娛樂的APP,free占比高于paid弟胀;且整體的占比分布更為寬

plt.figure(figsize=(15, 8))
plt.style.use("fast")
plt.ylim([0, 5])

plt.title("Distribution of User ratings")

sns.violinplot(data=data,
              y="user_rating",
              x="broad_genre",
              hue="category",
              vertical=True,  #垂直顯示
              kde=False,
              split=False,  #同個類別的小提琴圖一起顯示
              linewidth=2,
              scale="count",
              palette=["#fdd470", "#45cea2"])

plt.xlabel(" ")
plt.ylabel("Rating(0-5)")

plt.show()
image.png

size和price關(guān)系

sns.color_palette("husl", 8)
sns.set_style("whitegrid")

flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]

data["MB"] = data.size_bytes.apply(lambda x: x/1048576)
# 挑選區(qū)間的數(shù)據(jù)
paidapps_regression = data[((data.price < 30) & (data.price > 0))]

sns.lmplot(data=paidapps_regression, 
          x="MB",
          y="price",
          height=4,
          aspect=2,
          col_wrap=2,
          hue="broad_genre",
          col="broad_genre",
          fit_reg=False,
          palette=sns.color_palette("husl", 5))

plt.show()
image.png
# 使用Plotly實(shí)現(xiàn)
px.scatter(paidapps_regression,
          x="MB",
          y="price",
          color="broad_genre",
          facet_col="broad_genre",
          facet_col_wrap=2)
image.png
# APP分類:是否可根據(jù)paid和free來劃分
# 5種類型對比

# 設(shè)置顏色和大小
BlueOrangeWapang = ["#fc910d", "#fcb13e", "#239cd3", "#1674b1", "#ed6d50"]
plt.figure(figsize=(10, 10))
# 數(shù)據(jù)
label_names = data.broad_genre.value_counts().sort_index().index
size = data.broad_genre.value_counts().sort_index().tolist()
# 內(nèi)嵌空白圈
my_circle = plt.Circle((0, 0), 0.5, color="white")
# 圓
plt.pie(size, labels=label_names, colors=BlueOrangeWapang)
p = plt.gcf()
p.gca().add_artist(my_circle)
plt.show()
image.png
# 使用Plotly實(shí)現(xiàn)
fig = px.pie(values=size,
            names=label_names,
            labels=label_names,
            hole=0.5)

fig.update_traces(textposition="inside", textinfo="percent+label")
fig.show()
image.png
# 5種類型+是否付費(fèi)
f = pd.DataFrame(index=np.arange(0, 10, 2),
                data=dist.free.values,
                columns=["num"])
p = pd.DataFrame(index=np.arange(1, 11, 2),
                data=dist.paid.values,
                columns=["num"])

final = pd.concat([f, p], names=["labels"]).sort_index()
final
image.png
final.num.tolist()
image.png
plt.figure(figsize=(20, 20))

group_names = data.broad_genre.value_counts().sort_index().index
group_size = data.broad_genre.value_counts().sort_index().tolist()
h = ["Free", "Paid"]

subgroup_names = 5*h
sub = ["#45cea2", "#fdd470"]
subcolors = 5*sub
subgroup_size = final.num.tolist()

# 外層
fig, ax = plt.subplots()
ax.axis("equal")
mypie, _ = ax.pie(group_size, radius=2.5, labels=group_names, colors=BlueOrangeWapang)
plt.setp(mypie, width=1.2, edgecolor="white")

# 內(nèi)層
mypie2, _ = ax.pie(subgroup_size, radius=1.6, labels=subgroup_names, labeldistance=0.7, colors=subcolors)
plt.margins(0, 0)

plt.show()
image.png
# 使用Plotly實(shí)現(xiàn)
fig = px.sunburst(data,
                 path=["broad_genre", "category"],
                 values="MB")

fig.show()
image.png

來源:尤而小屋

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楷力,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子邮利,更是在濱河造成了極大的恐慌弥雹,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件延届,死亡現(xiàn)場離奇詭異,居然都是意外死亡贸诚,警方通過查閱死者的電腦和手機(jī)方庭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酱固,“玉大人械念,你說我怎么就攤上這事≡吮” “怎么了龄减?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長班眯。 經(jīng)常有香客問我希停,道長,這世上最難降的妖魔是什么署隘? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任宠能,我火速辦了婚禮,結(jié)果婚禮上磁餐,老公的妹妹穿的比我還像新娘违崇。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布羞延。 她就那樣靜靜地躺著渣淳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伴箩。 梳的紋絲不亂的頭發(fā)上入愧,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音赛蔫,去河邊找鬼砂客。 笑死,一個胖子當(dāng)著我的面吹牛呵恢,可吹牛的內(nèi)容都是我干的鞠值。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渗钉,長吁一口氣:“原來是場噩夢啊……” “哼彤恶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鳄橘,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤声离,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瘫怜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體术徊,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年鲸湃,在試婚紗的時候發(fā)現(xiàn)自己被綠了赠涮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡暗挑,死狀恐怖笋除,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炸裆,我是刑警寧澤垃它,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站烹看,受9級特大地震影響国拇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜听系,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一贝奇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧靠胜,春花似錦掉瞳、人聲如沸毕源。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霎褐。三九已至,卻和暖如春该镣,著一層夾襖步出監(jiān)牢的瞬間冻璃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工损合, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留省艳,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓嫁审,卻偏偏與公主長得像跋炕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子律适,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容