Botnoi-Classroom-Week1: หาช่องรวยกับการสร้าง Application บน Google Play Store ด้วย Python อย่างง่าย

Natapon Lertampornphithak
botnoi-classroom
Published in
10 min readAug 15, 2020

Team member:

  1. เพชรกฤษณ์
  2. ธนภัทร
  3. ณัฐพจน์
  4. กัลยรัตน์
  5. ธนบดินทร์
  6. อภิสิทธิ์
  7. อรวรรณ
  8. เพิร์ธ
  9. ณัฐรัชต์
  10. ภควรรฒน์
  11. ณฐพล
  12. กมลภัทร
  13. Peerapat
  14. ธราวัฒน์
  15. Mig
  16. ภัทริญญา
  17. ปรินดา
  18. ณัฐสกล

กระบวนการทำ Data Analytics

0. ตั้งจุดประสงค์ของการวิเคราะห์ข้อมูล

  • เข้าใจพฤติกรรมของผู้ใช้ในการซื้อ application ต่างๆ มาใช้ ไม่ว่าจะเป็น application ที่ไม่มีค่าใช้จ่ายหรือมีค่าใช้จ่าย
  • เพื่อพัฒนา application ไปในทางที่ผู้ใช้ส่วนมากเพิ่งพอใจเพื่อเพิ่มโอกาสในการถูกดาวน์โหลดไปใช้โดยผู้ใช้
  • วิเคราะห์ตลาด application เพื่อทราบว่าควรจะไปอยู่ position ไหนของตลาดแล้วจะเพิ่มโอกาสในการประสบผลสำเร็จ

1. การเก็บข้อมูล/การรวบรวมข้อมูลดิบ (Raw Data)

ข้อมูลที่เรานำมาวิเคราะห์ในหัวข้อนี้ เป็นข้อมูลที่ดึงมาจากฐานข้อมูลของ google play store ซึ่งมีการบันทึกข้อมูลต่าง ๆ ดังต่อไปนี้

  • Application Name : บอกเกี่ยวกับชื่อของแอปพลิเคชั่น
  • Category : ประเภทของแอปพลิเคชั่น
  • Rating : เรทติ้งของแอปพลิเคชั่น (เต็ม 5 คะแนน)
  • Number of Review : จำนวนการรีวิวแอปพลิเคชั่นจากผู้ใช้จริง
  • Application Size : ขนาดของแอปพลิเคชั่น
  • Number of Install : จำนวนการดาวน์โหลด (ครั้ง)
  • Application Type : Free/Paid
  • Price : ราคาของแอปพลิเคชั่น
  • Content Rating : การแบ่งระดับแอปพลิเคชั่นตามวุฒิภาวะ
  • Genres : ชนิดของแอปพลิเคชั่น (หัวข้อย่อยของ category)
  • Android Ver. : เวอร์ชั่นของระบบปฏิบัติการแอนดรอยด์ที่รองรับแอปพลิเคชั่น
  • Translated Review : ข้อความการรีวิวของผู้ใช้
  • Sentiment : ทัศนคติของผู้ใช้ต่อแอปพลิเคชั่น (Positive, Neutral, Negative)
  • Sentiment Polarity : ระดับความพึงพอใจของผู้ใช้ในเชิงรูปธรรม
  • Sentiment Subjectivity : ระดับความพึงพอใจของผู้ใช้ในเชิงนามธรรม

2 การตั้งคำถาม ตั้งสมมติฐาน ตั้งเป้าหมายของการวิเคราะห์

ตั้งคำถาม

  1. กลุ่มของ Application มีกี่กลุ่ม และ จำนวน Application ในแต่ละกลุ่มมีปริมาณมากน้อยเพียงใด

2. จำนวน Review ส่งผลต่อจำนวนการโหลด Application หรือไม่ อย่างไร

3. หากจะพัฒนา Application เข้า Play store ควรจัดทำ Application ในกลุ่มไหน เพื่อเพิ่มโอกาสในการถูก download โดย user

4. ใน Application แต่ละกลุ่ม จำนวน Review หรือ Rating มีผลต่อจำนวนการ โหลด Application มากกว่ากัน

5. ขนาดของ Application มีผลต่อการโหลด Application หรือไม่

6. Category และ Genres ไหนบ้างได้รับความนิยมสูงสุด

6. Version ของ Android มีผลต่อจำนวนการโหลด Application หรือไม่

7. ผู้โหลด Application แต่ละกลุ่ม ใช้โทรศัพท์ที่มี Android version ไหนมากที่สุด

ตั้งสมมติฐาน

  1. ระดับความพึงพอใจในการโหลด มีผลต่อการโหลดค่อนข้างสูง
  2. แอปพลิเคชั่นที่เสียเงินมี rating ที่สูงกว่าแอปพลิเคชั่นที่ไม่มีค่าใช้จ่าย

ตั้งเป้าหมาย

  1. เพื่อแสดงให้เห็นโอกาสหรือช่องทางในตลาดแอปพลิเคชั่น ที่สามารถสร้างแอปพลิเคชั่นและมีโอกาสประสบความสำเร็จได้

3. การสร้างฐานข้อมูลเพื่อการวิเคราะห์ (Data Mart)

  • เพื่อการวิเคราะห์เราต้องมีการจัดข้อมูลให้เหมาะสมสำหรับการนำมาวิเคราะห์

3.1 กลุ่มของแอปพลิเคชั่น และ จำนวนแอปพลิเคชั่นในแต่ละกลุ่ม

#Should be url for share link, file in google sheet

url = ‘https://docs.google.com/spreadsheets/d/1_IMktMGqRiyX4f5HvJI45h9rvrQKICN5Jfdfcxo_e6I/edit?usp=sharing'

sheet = gc.open_by_url(url)

# Get data from google sheet

dat = sheet.sheet1.get_as_df()

dat

dat.info()

#กลุ่มของ Application และ จำนวน Application ในแต่ละกลุ่ม

cat_count = dat.groupby([‘Category’],as_index=False).size().rename(‘count’).reset_index().sort_values(‘count’,ascending=False)

plt.figure(figsize=(16,8))

cat = sns.barplot(x=’count’,y=’Category’,data=cat_count,color=’Blue’)

สรุปเรื่องกลุ่มของแอปพลิเคชั่น

3.2 จำนวนรีวิวต่อกลุ่มของแอปพลิเคชั่น

#จำนวน Review มีผลต่อจำนวนครั้งของการโหลด Application หรือไม่ อย่างไร

#dat.head()

#dat[‘Installs’].unique()

A = dat[[‘Reviews’,’Installs’,’Category’]]

A[‘Installs’].replace({‘0+’: 0,

‘1+’:1,

‘5+’: 5,

‘10+’:10,

‘50+’:50,

‘100+’:100,

‘500+’:500,

‘1,000+’:1000,

‘5,000+’:5000,

‘10,000+’:10000,

‘50,000+’:50000,

‘100,000+’:100000,

‘500,000+’:500000,

‘1,000,000+’:1000000,

‘5,000,000+’:5000000,

‘10,000,000+’:10000000,

‘50,000,000+’:50000000,

‘100,000,000+’:100000000,

‘500,000,000+’:500000000,

‘1,000,000,000+’:1000000000

},inplace=True)

B = A.sort_values(‘Reviews’,ascending=False)

plt.figure(figsize=(16,8))

rv = sns.scatterplot(x=’Reviews’,y=’Installs’,data=B,color=’Blue’)

rv.set_xticklabels(cat.get_xticklabels(),rotation=90)

rv.set_xscale(‘log’)

rv.set_yscale(‘log’)

### EX. การโหลด 1,000,000,000+ Installs

### ดึง 3 Category ที่มากที่สุดในกลุ่ม 1,000,000,000+ Installs

a,b = plot_RVvsCate_perInstall(n=1000000000,nlarge=3)

print(‘The largest Category in this group’)

print(b)

สรุปเรื่องจำนวนรีวิวต่อกลุ่มของแอปพลิเคชั่น

  • หากจะพัฒนา Application เข้า Play store ควรจัดทำ Application ในกลุ่มไหน เพื่อเพิ่มโอกาสในการถูก download โดย user

#ขึ้นอยู่กับว่าต้องการให้ยอดการ Installs อยู่ในระดับใด ตามกราฟข้างบน

# เช่น ยอด Installs 1,000,000,000+

# 3 อันดับกลุ่ม Applications ได้แก่

  1. COMMUNICATION

2. SOCIAL

3. GAME

3.3 Application Size และ Genres

#ขนาดและGenresของ Application มีผลต่อการโหลด Application หรือไม่

#plot เพื่อดูว่า ที่แต่ละ Genres แต่ละยอด Installs, มีจำนวนกี่ App เป็นอย่างไร

def plot_Genres(genre,nlarge=3):

A = dat[[‘App’,’Genres’,’Size’,’Installs’]]

B = A.groupby([‘Genres’,’Installs’])[‘App’].count().rename(‘count’).reset_index()

C = B[B[‘Genres’]==genre].sort_values(‘count’,ascending=False)

plt.figure(figsize=(16,8))

#plt.bar(x=C.index,height=C.values)

#plt.xticks(rotation=90)

rv = sns.barplot(x=’count’,y=’Installs’,data=C,color=’Blue’,ci=None)

plt.title(‘Plot number of App in ‘ + genre+ ‘ Genres’)

return rv,C.nlargest(nlarge,’count’).reset_index()[‘Installs’]

#### แสดงให้เห็นว่าที่แต่ละ Genres จะมี ยอดการ Installs ที่แตกต่างกัน

#### EX. หากทำ App ประเภท Genre = Art & Design Genre

#### โอกาสยอด Installs จะมี

#100,000+

#10,000+

#50,000+

for i in dat[‘Genres’].unique():

a,b = plot_Genres(genre=i,nlarge=3)

print(‘The largest Installs in ‘ + i + ‘ Genre’)

print(b)

สรุปเรื่อง Application Size และ Genres

#plot เพื่อดูว่า ที่แต่ละ Size แต่ละยอด Installs, มีจำนวนกี่ App เป็นอย่างไร

#แบ่งช่วง size เป็น 1k-,1k-500k,500k-1M,1M-10M,10M-100M,100M+

#1M-10M เป็นช่วงที่คน Installs มากสุด ขณะที่ 1–10M รองลงมา

size_app = dat[[‘Size’,’Installs’,’App’]]

size_app[‘Installs’].replace({‘0+’: 0,

‘1+’:1,

‘5+’: 5,

‘10+’:10,

‘50+’:50,

‘100+’:100,

‘500+’:500,

‘1,000+’:1000,

‘5,000+’:5000,

‘10,000+’:10000,

‘50,000+’:50000,

‘100,000+’:100000,

‘500,000+’:500000,

‘1,000,000+’:1000000,

‘5,000,000+’:5000000,

‘10,000,000+’:10000000,

‘50,000,000+’:50000000,

‘100,000,000+’:100000000,

‘500,000,000+’:500000000,

‘1,000,000,000+’:1000000000

},inplace=True)

size_app[‘Size’] = size_app[‘Size’].map(lambda x: float(x.upper().split(‘M’)[0])*(10**6) if x.upper().endswith(‘M’) else float(x.upper().split(‘K’)[0])*(10**3) if x.upper().endswith(‘K’) else x )

#1k-,1k-500k,500k-1M,1M-10M,10M-100M,100M+

size_app[‘Size’] = size_app[‘Size’].map(lambda x:’Varies with device’ if x==’Varies with device’ else ‘1k-’ if float(x)<(10**3) else ‘1k-500k’ if (10**3)<=float(x)<500*(10**3) else ‘500k-1M’ if 500*(10**3)<=float(x)<(10**6) else ‘1M-10M’ if (10**6)<=float(x)<(10**7) else ‘10M-100M’ if (10**7)<=float(x)<(10**8) else ‘100M+’)

plt.figure(figsize=(16,8))

sns.barplot(x=’Size’,y=’count’,data=size_app.groupby(‘Size’)[‘Installs’].sum().rename(‘count’).reset_index())

plt.yscale(‘log’)

3.4 Android Version ต่อจำนวนการโหลด Application

#Version ของ Android มีผลต่อจำนวนการโหลด Application หรือไม่ ผู้โหลด Application แต่ละกลุ่ม ใช้โทรศัพท์ที่มี Android version มากที่สุด

#### คิดแบบอย่างง่าย ให้สามารถ บวก Install ได้โดยตรงเลย

#### เช่น ‘1,000+’ + ‘1,000’ = ‘2,000+’

#### ต้อง rotation แกน x

Ver_And = dat[[‘Android Ver’,’Installs’,’App’]]

Ver_And[‘Installs’].replace({‘0+’: 0,

‘1+’:1,

‘5+’: 5,

‘10+’:10,

‘50+’:50,

‘100+’:100,

‘500+’:500,

‘1,000+’:1000,

‘5,000+’:5000,

‘10,000+’:10000,

‘50,000+’:50000,

‘100,000+’:100000,

‘500,000+’:500000,

‘1,000,000+’:1000000,

‘5,000,000+’:5000000,

‘10,000,000+’:10000000,

‘50,000,000+’:50000000,

‘100,000,000+’:100000000,

‘500,000,000+’:500000000,

‘1,000,000,000+’:1000000000

},inplace=True)

Ver_And_Appcount = Ver_And.groupby([‘Android Ver’])[‘App’].count().rename(‘count’).reset_index()

Ver_And_Inscount = Ver_And.groupby([‘Android Ver’])[‘Installs’].sum().rename(‘count’).reset_index()

fig, axs = plt.subplots(1,2, figsize=(15,6),sharex=True)

axs[0].tick_params(labelrotation=90)

axs[1].tick_params(labelrotation=90)

sns.barplot(x=’Android Ver’,y=’count’,data=Ver_And_Appcount,ax=axs[0])

sns.barplot(x=’Android Ver’,y=’count’,data=Ver_And_Inscount,ax=axs[1])

สรุปเรื่อง Android Version ต่อจำนวนการโหลด Application

#### โดยเฉลี่ย Ver Android 4.1 and Up มีจำนวน App มากสุด

#### แต่จำนวนคนโหลดมากสุดจะอยู่ในหมวด Vary on device

3.5 ระดับความพึงพอใจต่อจำนวนครั้งการโหลดของผู้ใช้

url = ‘https://docs.google.com/spreadsheets/d/1OSYNFLv9sNybNnZi8A3bldKVD7oSTS1Z5M4qruI7BSY/edit?usp=sharing'

url2 = ‘https://docs.google.com/spreadsheets/d/1MYxSO6U66lBmuT3iRrRLh5kgHzzrRwGmEa3Ywr5SSmc/edit#gid=1743264117'

sheet = gc.open_by_url(url)

sheett = gc.open_by_url(url2)

# Get data from google sheet

dat = sheet.sheet1.get_as_df()

review = sheett.sheet1.get_as_df()

dat.dropna()

review.dropna()

review_polar = review.groupby(‘App’,as_index=False).mean()

join = dat.merge(review_polar,how=’inner’)

join_sortedby_polarity = join.sort_values(‘Sentiment_Polarity’)

join_sortedby_polarity.head()

สรุปเรื่อง ระดับความพึงพอใจต่อจำนวนครั้งการโหลดของผู้ใช้

บางแอพที่รีวิวส่วนใหญ่เป็นด้านลบแต่มียอดดาวโหลดน์ที่สูง เพราะฉะนั้นต้องหา correlation เพื่อดูว่ามีความสัมพันธ์มากน้อยแค่ไหน

4. การหาคำตอบจากข้อมูล

4.1 Feedback จาก Translated Reviews (User Reviews) ใน Category ไหนดีสุด?

url = ‘https://docs.google.com/spreadsheets/d/1-Y2Vi5IRCsMzmykG-6_wro-7wMGzoWASv_lFLP4XN3w/edit#gid=1275998150'

sheet = gc.open_by_url(url)

# Get data from google sheet

df = sheet.sheet1.get_as_df()

df.sample(7)

# กำจัด NaN

user_review = df.dropna()

# Main Dataframe

url = ‘https://docs.google.com/spreadsheets/d/1_IMktMGqRiyX4f5HvJI45h9rvrQKICN5Jfdfcxo_e6I/edit?usp=sharing'

sheet = gc.open_by_url(url)

# Get data from google sheet

dat = sheet.sheet1.get_as_df()

dat

# รวม 2 dataframeไว้วิเคราะห์

merged_df = pd.merge(dat, user_review , on = “App”, how = “inner”)

merged_df = merged_df.dropna(subset=[‘Sentiment’, ‘Translated_Review’])

merged_df

# จำนวน sentiment ที่ predict มาในแต่ละCategory

grouped_sentiment_category_sum = merged_df.groupby([‘Category’]).agg({‘Sentiment’: ‘count’}).reset_index()

Grouped_sentiment_category_sum

# Distribution ของ Sentiment ในแต่ละ Category

grouped_sentiment_category_count = merged_df.groupby([‘Category’, ‘Sentiment’]).agg({‘App’: ‘count’}).reset_index()

grouped_sentiment_category_count

# หา fraction ของทั้ง positive/negative/neutral ของทุก Category

newdf = pd.merge(grouped_sentiment_category_count, grouped_sentiment_category_sum, on=[“Category”])

newdf[‘New_Sentiment’] = newdf.App/newdf.Sentiment_y

newdf

# import lib เพื่อการวิเคราะห์ graph

import plotly.graph_objs as go

import plotly

t1 = go.Bar(

x=list(newdf.Category[::3]),

y= newdf.New_Sentiment[::3],

name=’Negative’,

marker=dict(color = ‘rgb(150,0,0)’)

)

t2 = go.Bar(

x=list(newdf.Category[::3]),

y= newdf.New_Sentiment[1::3],

name=’Neutral’,

marker=dict(color = ‘rgb(220,220,220)’)

)

t3 = go.Bar(

x=list(newdf.Category[::3]),

y= newdf.New_Sentiment[2::3],

name=’Positive’,

marker=dict(color = ‘rgb(0,150,0)’)

)

data = [t1, t2, t3]

layout = go.Layout(

title = ‘Sentiment analysis’,

barmode=’stack’,

xaxis = {‘tickangle’: -45},

yaxis = {‘title’: ‘Fraction of user reviews’}

)

fig = go.Figure(data=data, layout=layout)

plotly.offline.iplot({‘data’: data, ‘layout’: layout})

most positive → COMICS วิเคราะห์จาก Translated Review

most negative → GAME (รวมแบบ Free/Paid)

# จะเห็น positive feedbackเยอะใน COMICS

merged_df.loc[merged_df.Category == “COMICS”][‘Translated_Review’]

# COMICS ฟรีหรือเสียตังค์?

dat.loc[dat.Category == ‘COMICS’][‘Price’]

→ run code ข้างบนจะเห็นว่า COMICS เป็น App ฟรีหมดเลย

อาจสรุปได้ว่า Comics เป็น Category ที่น่าสนใจในการพัฒนา App เพราะมีความน่าจะเป็นสูงที่จะได้รับผลตอบรับดีจากกลุ่มคนที่ชอบ Comics ถึงแม้ว่าจะมียอด download ไม่สูง

4.2 Reviews ของ free/paid app แตกต่างกันไหม?

# import lib มาวิเคราะห์

import matplotlib.pyplot as plt

sns.set_style(‘ticks’)

sns.set_style(“darkgrid”)

fig, ax = plt.subplots()

fig.set_size_inches(12, 8)

ax = sns.boxplot(x=’Type’, y=’Sentiment_Polarity’, data=merged_df)

title = ax.set_title(‘Sentiment Polarity Distribution’)

#สรุปได้ว่า Free apps มี negative reviews เยอะกว่า แต่ COMICS กลับกลายเป็น category ที่ได้รับ positive feedback สูงมากถึงแม้ว่า COMICS จะเป็น Free apps

4.3 Reviews ใน Application ที่มีราคาต่างกัน

# Check unique

merged_df[‘Price’].unique()

->array([0, ‘$4.99’, ‘$6.99’, ‘$3.99’, ‘$11.99’, ‘$9.99’, ‘$29.99’, ‘$2.49’,’$0.99'], dtype=object)

# Clean data เพื่อนำไปวิเคราะห์

merged_df[‘Price’] = merged_df[‘Price’].apply(lambda x: x.replace(‘$’, ‘’) if ‘$’ in str(x) else x)

merged_df[‘Price’] = merged_df[‘Price’].apply(lambda x: float(x))

# Plot Graph

sns.set_style(‘ticks’)

sns.set_style(“darkgrid”)

fig, ax = plt.subplots()

fig.set_size_inches(20, 8)

ax = sns.scatterplot(x=’Price’, y=’Sentiment_Polarity’, data=merged_df)

title = ax.set_title(‘Sentiment Polarity Distribution’)

# จะเห็นได้ว่าAppที่มีราคา $29.99 ได้รับ Feedback ที่ไปในทาง Positive มาก เช่นเดียวกันกับ Appที่มีราคา $4.99, $9.99, $11.99, $3.99

# คนน่าจะพอใจกับตัว App ที่เสียตังค์ มากกว่าตัว App ที่ฟรี ซึ่งสอดคล้องกับกราฟนี้

แล้ว Application เสียตังค์ที่คนถูกใจ อยู่Categoryไหน?

merged_df.loc[merged_df.Price== float(29.99)]

merged_df.loc[merged_df.Price== float(4.99)]

merged_df.loc[merged_df.Price== float(9.99)]

merged_df.loc[merged_df.Price== float(11.99)]

merged_df.loc[merged_df.Price== float(3.99)]

# Appในกลุ่ม SPORTS, GAME, MEDICAL, PERSONALIZATION, FAMILY ได้รับ postive feedback จาก user reviews มากสุดในกลุ่ม App ที่เสียตังค์

4.4 วิเคราะห์ Reviews (User Reviews) กับ Application Size

s = merged_df.Size.value_counts()

s

# Check unique

merged_df[‘Size’].unique()

# Filter Application Size ที่มี Translated Reviews ไม่เป็น NaN

options = [‘14M’, ‘33M’, ‘39M’, ‘12M’, ‘25M’, ‘6.1M’, ‘11M’,

‘Varies with device’, ‘24M’, ‘17M’, ‘2.4M’, ‘27M’, ‘16M’, ‘2.9M’,

‘38M’, ‘21M’, ‘8.2M’, ‘4.2M’, ‘5.9M’, ‘37M’, ‘6.8M’, ‘10M’, ‘2.1M’,

‘42M’, ‘3.9M’, ‘18M’, ‘3.2M’, ‘20M’, ‘26M’, ‘48M’, ‘8.5M’, ‘28M’,

‘46M’, ‘7.8M’, ‘6.6M’, ‘5.1M’, ‘4.0M’, ‘32M’, ‘4.7M’, ‘2.7M’,

‘118k’, ‘7.3M’, ‘695k’, ‘56M’, ‘29M’, ‘40M’, ‘3.1M’, ‘5.0M’, ‘31M’,

‘8.0M’, ‘7.9M’, ‘13M’, ‘7.2M’, ‘41M’, ‘2.8M’, ‘15M’, ‘44M’, ‘8.1M’,

‘4.5M’, ‘7.4M’, ‘1.9M’, ‘1.8M’, ‘2.3M’, ‘5.2M’, ‘1.2M’, ‘5.6M’,

‘72M’, ‘9.6M’, ‘23M’, ‘19M’, ‘43M’, ‘9.5M’, ‘8.9M’, ‘65M’, ‘22M’,

‘3.8M’, ‘8.4M’, ‘58M’, ‘50M’, ‘45M’, ‘53M’, ‘68M’, ‘66M’, ‘35M’,

‘76M’, ‘9.4M’, ‘6.9M’, ‘4.3M’, ‘67M’, ‘5.5M’, ‘3.3M’, ‘3.6M’,

‘7.5M’, ‘9.1M’, ‘8.3M’, ‘7.0M’, ‘77M’, ‘5.7M’, ‘5.3M’, ‘30M’,

‘232k’, ‘99M’, ‘624k’, ‘95M’, ‘8.5k’, ‘292k’, ‘55M’, ‘4.4M’, ‘36M’,

‘3.0M’, ‘1.7M’, ‘7.7M’, ‘74M’, ‘97M’, ‘98M’, ‘4.9M’, ‘52M’, ‘78M’,

‘59M’, ‘85M’, ‘63M’, ‘70M’, ‘71M’, ‘49M’, ‘82M’, ‘73M’, ‘86M’,

‘81M’, ‘96M’, ‘57M’, ‘93M’, ‘83M’, ‘60M’, ‘54M’, ‘61M’, ‘75M’,

‘51M’, ‘91M’, ‘2.6M’, ‘6.4M’, ‘2.0M’, ‘1.5M’, ‘62M’, ‘4.1M’,

‘9.3M’, ‘6.2M’, ‘9.7M’, ‘8.7M’, ‘47M’, ‘1.6M’, ‘9.8M’, ‘6.0M’,

‘6.5M’, ‘88M’, ‘4.6M’, ‘7.6M’, ‘10.0M’, ‘1.3M’, ‘9.9M’, ‘3.5M’,

‘853k’, ‘7.1M’, ‘9.2M’, ‘720k’, ‘6.3M’, ‘5.4M’, ‘92M’, ‘94M’]

App_Size = merged_df[merged_df[‘Android Ver’].isin(options)]

# Plot Graph

sns.set_style(‘ticks’)

sns.set_style(“darkgrid”)

fig, ax = plt.subplots()

fig.set_size_inches(20, 8)

ax = sns.lineplot(x=’Size’, y=’Sentiment_Polarity’, data=App_Size)

title = ax.set_title(‘Sentiment Polarity Distribution’)

# App ที่ได้รับ positive feedback มากสุดจะมี size อยู่ที่ 19M

4.5 คนโหลด App ฟรีหรือ Paid มากกว่ากัน?

# Clean Data

dat[‘Installs’] = dat[‘Installs’].apply(lambda x: x.replace(‘+’, ‘’) if ‘+’ in str(x) else x)

dat[‘Installs’] = dat[‘Installs’].apply(lambda x: x.replace(‘,’, ‘’) if ‘,’ in str(x) else x)

dat[‘Installs’] = dat[‘Installs’].apply(lambda x: float(x))

# Plot Graph

t0 = go.Box(

y=np.log10(dat[‘Installs’][dat.Type==’Paid’]),

name = ‘Paid’,

marker = dict(

color = ‘rgb(0,0,0)’,

)

)

t1 = go.Box(

y=np.log10(dat[‘Installs’][dat.Type==’Free’]),

name = ‘Free’,

marker = dict(

color = ‘rgb(255,0,120)’,

)

)

layout = go.Layout(

title = “Installation of paid apps Vs free apps”,

yaxis= {‘title’: ‘Installs (log-scaled)’}

)

data = [t0, t1]

plotly.offline.iplot({‘data’: data, ‘layout’: layout})

คนโหลด Free Apps มากกว่าอย่างเห็นได้ชัด

อาจสรุปได้ว่าถ้าต้องการให้ Application เป็นที่นิยมในคนหมู่มากควรพัฒนา App ที่ไม่เสียตังค์

4.6 หา correlation ระหว่างความพึงพอใจกับยอดดาวน์โหลด

join_sortedby_polarity[‘Installs’] = join_sortedby_polarity[‘Installs’].str.replace(‘+’,’’)

join_sortedby_polarity[‘Installs’] = join_sortedby_polarity[‘Installs’].str.replace(‘,’,’’)

join_sortedby_polarity[‘Installs’] = join_sortedby_polarity[‘Installs’].astype(‘int’)

join_sortedby_polarity[‘Installs’].unique()

array([1000000000, 10000000, 100000, 1000000, 50000, 10000, 50000000, 500000, 100000000, 5000000, 500000000, 1000, 5000])

plt.scatter(join_sortedby_polarity[‘Sentiment_Polarity’],join_sortedby_polarity[‘Installs’],alpha=0.3)

plt.yscale(‘log’)

plt.ylabel(‘Installation’)

plt.xlabel(‘Polarity’)

#หา correlation

join_sortedby_polarity[‘Sentiment_Polarity’].corr(join_sortedby_polarity[‘Installs’])

0.12639105573673368

  • จากกราฟมีบางแอพที่รีวิวส่วนใหญ่เป็นด้านลบแต่มียอดดาวโหลดน์ที่สูง และค่า correlation ที่หาได้มีค่าน้อยมาก
  • เพราะฉะนั้นต้องลองพิจารณาเฉพาะกลุ่มต่อไป

5. ชุดคำถามใหม่หลังจากเห็นผลลัพธ์แรก

5.1 ควรพัฒนา Application แบบ Paid or Free?

# Clean Data เพื่อการวิเคราะห์

dat[‘Price’] = dat[‘Price’].apply(lambda x: str(x).replace(‘$’, ‘’) if ‘$’ in str(x) else str(x))

dat[‘Price’] = dat[‘Price’].apply(lambda x: float(x))

# วิเคราะห์ความสัมพันธ์ของ Rating กับ Price

paid_apps = dat[dat.Price>0]

p = sns.jointplot( “Price”, “Rating”, paid_apps)

5.2 Trend ของ Application Type (Free/Paid) เป็นอย่างไรในแต่ละ Category

# คัดเฉพาะ Category ที่มีจำนวน Application > 100

datcat = dat[dat.Category.isin([‘FAMILY’,’GAME’, ‘TOOLS’, ‘MEDICAL’, ‘BUSINESS’, ‘PRODUCTIVITY’, ‘PERSONALIZATION’, ‘COMMUNICATION’,’SPORTS’,’LIFESTYLE’,’FINANCE’,’HEALTH_AND_FITNESS’,’PHOTOGRAPHY’, ‘SOCIAL’,’NEW_AND_MAGAZINES’,’SHOPPING’,’TRAVEL_AND_LOCAL’,’DATING’,’BOOKS_AND_REFERENCE’, ‘VIDEO_PLAYERS’,’EDUCATION’,’ENTERTAINMENT’,’MAPS_AND_NAVIGATION’,’FOOD_AND_DRINK’])]

fig, ax = plt.subplots()

fig.set_size_inches(15, 8)

p = sns.stripplot(x=”Price”, y=”Category”, data=datcat, jitter=True, linewidth=1)

title = ax.set_title(‘Trend of Paid/Free App’)

จะเห็น Outlier จาก Graph ข้างบน ซึ่งเป็น Application ที่มีราคามากกว่า $350

dat[[‘Category’, ‘App’]][dat.Price > 200]

# จะเห็นว่าเป็น Application ที่ทำขึ้นมาเล่นๆ

# filter ราคาเพื่อนำ Outlier ออก

fig, ax = plt.subplots()

fig.set_size_inches(15, 8)

subset_df_price = datcat[datcat.Price<100]

p = sns.stripplot(x=”Price”, y=”Category”, data=subset_df_price, jitter=True, linewidth=1)

title = ax.set_title(‘After filtering’)

จากกราฟจะเห็นว่า Price ของ Medical จะค่อนข้างสูง

5.3 ลองพิจาณาเฉพาะกลุ่ม

#พิจารณากราฟและ correlation ของแต่ละหมวดที่ราคาต่าง ๆ ที่มีข้อมูลมากกว่าหรือเท่ากับ 5 ตัว

for category in join_sortedby_polarity[‘Category’].unique() :

for price in join_sortedby_polarity[join_sortedby_polarity[‘Category’]==category][‘Price’].unique() :

x = join_sortedby_polarity[(join_sortedby_polarity[‘Category’]==category)&(join_sortedby_polarity[‘Price’]==price)]

if (len(x) >= 5) :

plt.scatter(x[‘Sentiment_Polarity’],x[‘Installs’],alpha=0.3)

plt.yscale(‘log’)

plt.ylabel(‘Installation’)

plt.xlabel(‘Polarity’)

print(‘Caterogy :’,category,’at price = $’,price)

plt.show()

print(‘Correlation = ‘,x[‘Sentiment_Polarity’].corr(x[‘Installs’]))

print(‘\n’)

จะเห็นได้ว่าเมื่อพิจารณาเจาะลึกเฉพาะกลุ่มก็จะเห็นความสัมพันธ์ที่ไม่สอดคล้องกัน สรุปได้ว่าถึงความพึงพอใจมากก้อไม่ได้แสดงว่าทำให้ยอดดาวน์โหลดสูงนั่นเอง

6. การสรุปผล

  • เราได้เข้าใจพฤติกรรมของผู้ใช้ในการซื้อ application ต่างๆ มาใช้ ไม่ว่าจะเป็น application ที่ไม่มีค่าใช้จ่ายหรือมีค่าใช้จ่าย จะเห็นได้ว่าหมวดหมู่แอปพลิเคชั่นที่เป็นที่นิยมที่สุดคือ COMMUNICATION รองลงมาคือ Social และ Game
  • การพัฒนา application จะเห็นได้ว่า Application ประเภท Comic มีจำนวนแอปใน google play store จำนวนไม่มากนักและมีสัดส่วนในยอดดาวน์โหลดค่อนข้างเยอะและมีการรีวิวพึงพอใจค่อนข้างมาก นี่ก้ออาจจะเป็นโอกาสในการพัฒนาแอป comic ก็จะทำให้คนชอบได้ไม่ยากและมีโอกาสมียอดดาวน์โหลดค่อนข้างมาก
  • จากการวิเคราะห์ทั้งหมด การพัฒนา application ขึ้นอยู่กับหมวดหมู่ที่สร้างและราคาของแอปที่เหมาะสม จะทำให้ผู้ใช้หันมาเลือกแอปของเราเป็นทางเลือกได้

โดยสามารถ download Notebook และ Raw Data ได้ตามลิ้งด้านล่าง :

Google Colab : https://colab.research.google.com/drive/1wmNGDqR5AmMGcarKk10VV4wAbOwf52aL#scrollTo=2xf1s5OT_4GY&uniqifier=6

https://colab.research.google.com/drive/1BIEfJI7soy5htkrQxTOIVw3ZFuSfJXai

Raw Data : https://docs.google.com/spreadsheets/d/1_IMktMGqRiyX4f5HvJI45h9rvrQKICN5Jfdfcxo_e6I/edit?usp=sharing

https://docs.google.com/spreadsheets/d/1-Y2Vi5IRCsMzmykG-6_wro-7wMGzoWASv_lFLP4XN3w/edit?usp=sharing

--

--