Cafe 市場調查專案

許sir

[致謝].

  • 謹以此份專案紀念我的恩師: 周文賢 教授
  • 感謝老師無私的奉獻,學生受益良多

[說明]

這是一份正式的市場調查專案,主要協助業主(左岸咖啡)了解市場產品定位

[問卷代碼編號]

Label No ="問卷代碼"

【第 A 部份】包裝咖啡之使用及購買行為

A101="左岸頻率" A102="伯朗頻率" A103="廣場頻率" A104="輕鬆頻率"
A2 ="咖啡偏好" A3 ="偏好口味"

A401="提神醒腦" A402="習慣飲用" A403="抒解口渴" A404="換喝飲料" A405="特殊口感" A406="享受感覺"
A501="知名度高" A502="廣告感覺" A503="價格合理" A504="包裝美觀" A505="整體口感"

A611="左岸知名" A612="左岸廣告" A613="左岸價格" A614="左岸包裝" A615="左岸口感"
A621="伯朗知名" A622="伯朗廣告" A623="伯朗價格" A624="伯朗包裝" A625="伯朗口感"
A631="廣場知名" A632="廣場廣告" A633="廣場價格" A634="廣場包裝" A635="廣場口感"
A641="輕鬆知名" A642="輕鬆廣告" A643="輕鬆價格" A644="輕鬆包裝" A645="輕鬆口感"

A701="猶豫程度" A702="後悔程度" A703="詢問程度" A704="關心程度" A705="注意程度" A706="選對重要"
A801="產品重要" A802="自我概念" A803="象徵價值" A804="商店忠誠(逆)" A805="品牌忠誠" A806="品牌信念(逆)"
A901="產品質佳" A902="積極開發" A903="重視權益"

【第 B 部份】左岸咖啡之使用及購買行為

B1 ="訊息接觸"
B201="口味香醇" B202="浪漫生活" B203="提振精神" B204="氣質優雅"
B301="廣告印象" B302="廣告說服" B303="廣告吸引" B304="廣告訊息"
B401="左岸意義" B402="左岸口味" B403="左岸價格" B404="左岸包裝"
B501="產品優質" B502="令人喜歡" B503="正面評價"
B6 ="促銷方案"

【第 C 部份】生活型態

C01 ="閱讀報章" C02 ="戶外活動" C03="價格敏感"
C04 ="偏好家居" C05 ="經常運動" C06="流行資訊"
C07 ="獨自工作" C08 ="重視休閒" C09="重視品牌"
C10 ="希望讚美" C11 ="朋友聚會" C12="重視外觀"
C13 ="工作時長" C14 ="政治冷漠" C15="社會憂心"

【第 D 部份】個人基本資料

Sex ="性別" AGE ="年齡" Occupatn="職業"
Edu ="教育程度" Income0="所得" Income ="調整後所得"
Area="居住地區" Intenst="產品強度";

[標準開始動作]. 如果你用python的目標是科學計算或數值分析,基本是引⼊三個套件

In [1]:
%matplotlib inline 
##將後續畫圖的結果直接顯現在網頁中

import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd  #

[PART 1].輸入資料與資料檢查

In [2]:
import xlrd #讀取excel檔的模板
excel_file = 'Pycafe.xlsx'
Cafe = pd.read_excel(excel_file)
In [3]:
print(Cafe.shape)# 印出資料維度
(40, 93)
In [4]:
print(Cafe.info())# 印出 DataFrame 資料概況, 順便check有沒有missing value
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 40 entries, 0 to 39
Data columns (total 93 columns):
ID             40 non-null int64
A101左岸頻率       40 non-null int64
A102伯朗頻率       40 non-null int64
A103廣場頻率       40 non-null int64
A104輕鬆頻率       40 non-null int64
A2咖啡偏好         40 non-null int64
A3偏好口味         40 non-null object
A401提神醒腦       40 non-null int64
A402習慣飲用       40 non-null int64
A403抒解口渴       40 non-null int64
A404換喝飲料       40 non-null int64
A405特殊口感       40 non-null int64
A406享受感覺       40 non-null int64
A501知名度高       40 non-null int64
A502廣告感覺       40 non-null int64
A503價格合理       40 non-null int64
A504包裝美觀       40 non-null int64
A505整體口感       40 non-null int64
A611左岸知名       40 non-null int64
A612左岸廣告       40 non-null int64
A613左岸價格       40 non-null int64
A614左岸包裝       40 non-null int64
A615左岸口感       40 non-null int64
A621伯朗知名       40 non-null int64
A622伯朗廣告       40 non-null int64
A623伯朗價格       40 non-null int64
A624伯朗包裝       40 non-null int64
A625伯朗口感       40 non-null int64
A631廣場知名       40 non-null int64
A632廣場廣告       40 non-null int64
A633廣場價格       40 non-null int64
A634廣場包裝       40 non-null int64
A635廣場口感       40 non-null int64
A641輕鬆知名       40 non-null int64
A642輕鬆廣告       40 non-null int64
A643輕鬆價格       40 non-null int64
A644輕鬆包裝       40 non-null int64
A645輕鬆口感       40 non-null int64
A701猶豫程度       40 non-null int64
A702後悔程度       40 non-null int64
A703詢問程度       40 non-null int64
A704關心程度       40 non-null int64
A705注意程度       40 non-null int64
A706選對重要       40 non-null int64
A801產品重要       40 non-null int64
A802自我概念       40 non-null int64
A803象徵價值       40 non-null int64
A804商店忠誠(逆)    40 non-null int64
A805品牌忠誠       40 non-null int64
A806品牌信念(逆)    40 non-null int64
A901產品質佳       40 non-null int64
A902積極開發       40 non-null int64
A903重視權益       40 non-null int64
B1訊息接觸         40 non-null int64
B201口味香醇       40 non-null int64
B202浪漫生活       40 non-null int64
B203提振精神       40 non-null int64
B204氣質優雅       40 non-null int64
B301廣告印象       40 non-null int64
B302廣告說服       40 non-null int64
B303廣告吸引       40 non-null int64
B304廣告訊息       40 non-null int64
B401左岸意義       40 non-null int64
B402左岸口味       40 non-null int64
B403左岸價格       40 non-null int64
B404左岸包裝       40 non-null int64
B501產品優質       40 non-null int64
B502令人喜歡       40 non-null int64
B503正面評價       40 non-null int64
B6促銷方案         40 non-null int64
C01閱讀報章        40 non-null int64
C02戶外活動        40 non-null int64
C03價格敏感        40 non-null int64
C04偏好家居        40 non-null int64
C05經常運動        40 non-null int64
C06流行資訊        40 non-null int64
C07獨自工作        40 non-null int64
C08重視休閒        40 non-null int64
C09重視品牌        40 non-null int64
C10希望讚美        40 non-null int64
C11朋友聚會        40 non-null int64
C12重視外觀        40 non-null int64
C13工作時長        40 non-null int64
C14政治冷漠        40 non-null int64
C15社會憂心        40 non-null int64
Sex            40 non-null object
AGE            40 non-null int64
Occupatn       40 non-null object
Edu            40 non-null object
Income0        40 non-null object
IncomeMd       40 non-null float64
Area           40 non-null object
Intenst        40 non-null float64
dtypes: float64(2), int64(85), object(6)
memory usage: 29.1+ KB
None
In [5]:
Cafe.head() #看前五筆資料
Out[5]:
ID A101左岸頻率 A102伯朗頻率 A103廣場頻率 A104輕鬆頻率 A2咖啡偏好 A3偏好口味 A401提神醒腦 A402習慣飲用 A403抒解口渴 ... C14政治冷漠 C15社會憂心 Sex AGE Occupatn Edu Income0 IncomeMd Area Intenst
0 1 3 0 1 0 6 加糖及奶精之香濃口味 4 3 2 ... 2 6 5 自營企業 研究所 6萬以上 6.5 北部 94.8848
1 2 1 0 0 0 1 加糖及奶精之香濃口味 4 3 4 ... 2 6 5 其他 研究所 3-4萬 3.5 北部 17.0509
2 3 0 2 0 0 2 偏苦之咖啡原味 6 5 4 ... 2 6 4 其他 專科及大學 2-3萬 2.5 北部 10.0137
3 4 2 0 3 0 7 加糖及奶精之香濃口味 7 6 4 ... 1 7 3 白領階層 專科及大學 4-5萬 4.5 北部 90.4082
4 5 1 0 0 0 1 加糖及奶精之香濃口味 3 3 3 ... 4 5 2 藍領階層 國中 1-2萬 1.5 北部 17.0509

5 rows × 93 columns

In [6]:
Cafe.tail() #看後面幾筆
Out[6]:
ID A101左岸頻率 A102伯朗頻率 A103廣場頻率 A104輕鬆頻率 A2咖啡偏好 A3偏好口味 A401提神醒腦 A402習慣飲用 A403抒解口渴 ... C14政治冷漠 C15社會憂心 Sex AGE Occupatn Edu Income0 IncomeMd Area Intenst
35 36 1 0 2 0 6 加糖及奶精之香濃口味 6 6 4 ... 5 3 4 自營企業 高中(職) 6萬以上 6.5 南部 66.4761
36 37 0 1 0 0 1 加糖及奶精之香濃口味 6 5 4 ... 7 3 5 其他 國中 1-2萬 1.5 南部 5.9818
37 38 0 1 0 0 6 加糖及奶精之香濃口味 6 5 4 ... 6 3 1 學生 國中 2-3萬 2.5 中部 42.9104
38 39 2 0 1 0 5 加糖及奶精之香濃口味 5 5 3 ... 3 6 3 白領階層 高中(職) 5-6萬 5.5 中部 77.4608
39 40 0 2 0 0 3 加糖及奶精之香濃口味 7 6 3 ... 5 4 4 其他 專科及大學 1-2萬 1.5 中部 15.7390

5 rows × 93 columns

In [7]:
Cafe.sample(10)#隨機取10行
Out[7]:
ID A101左岸頻率 A102伯朗頻率 A103廣場頻率 A104輕鬆頻率 A2咖啡偏好 A3偏好口味 A401提神醒腦 A402習慣飲用 A403抒解口渴 ... C14政治冷漠 C15社會憂心 Sex AGE Occupatn Edu Income0 IncomeMd Area Intenst
22 23 1 0 0 2 6 加糖及奶精之香濃口味 6 6 3 ... 5 4 3 白領階層 專科及大學 3-4萬 3.5 北部 66.4761
36 37 0 1 0 0 1 加糖及奶精之香濃口味 6 5 4 ... 7 3 5 其他 國中 1-2萬 1.5 南部 5.9818
17 18 2 1 1 0 6 加糖及奶精之香濃口味 6 6 3 ... 2 5 4 自營企業 研究所 6萬以上 6.5 北部 84.8410
10 11 2 3 0 0 7 加糖及奶精之香濃口味 7 7 3 ... 4 5 4 白領階層 高中(職) 4-5萬 4.5 南部 90.4082
25 26 1 0 0 2 6 加糖及奶精之香濃口味 6 6 3 ... 5 4 3 白領階層 專科及大學 3-4萬 3.5 北部 66.4761
9 10 2 1 1 0 4 加糖及奶精之香濃口味 5 6 2 ... 4 4 4 藍領階層 專科及大學 2-3萬 2.5 北部 68.3881
1 2 1 0 0 0 1 加糖及奶精之香濃口味 4 3 4 ... 2 6 5 其他 研究所 3-4萬 3.5 北部 17.0509
33 34 0 1 0 2 7 偏苦之咖啡原味 7 7 5 ... 4 6 1 學生 國中 1-2萬 1.5 南部 53.8586
37 38 0 1 0 0 6 加糖及奶精之香濃口味 6 5 4 ... 6 3 1 學生 國中 2-3萬 2.5 中部 42.9104
8 9 0 1 0 0 1 偏苦之咖啡原味 6 5 4 ... 5 5 2 藍領階層 高中(職) 2-3萬 2.5 北部 5.9818

10 rows × 93 columns

[PART 2].基本敘述性統計

一般而言,一開始我們會從人口統計資料開始看起

In [8]:
Cafe.describe() #基本統計量, 但這種方法只能看全部,無法只看你想看的欄位(同時只會顯示量化資料)
Out[8]:
ID A101左岸頻率 A102伯朗頻率 A103廣場頻率 A104輕鬆頻率 A2咖啡偏好 A401提神醒腦 A402習慣飲用 A403抒解口渴 A404換喝飲料 ... C09重視品牌 C10希望讚美 C11朋友聚會 C12重視外觀 C13工作時長 C14政治冷漠 C15社會憂心 AGE IncomeMd Intenst
count 40.000000 40.000000 40.000000 40.00000 40.000000 40.000000 40.000000 40.000000 40.000000 40.000000 ... 40.000000 40.00000 40.000000 40.000000 40.000000 40.000000 40.000000 40.000000 40.000000 40.000000
mean 20.500000 0.900000 0.825000 0.52500 0.300000 4.675000 5.650000 5.325000 3.550000 4.875000 ... 5.025000 5.15000 4.875000 4.850000 5.800000 4.000000 4.850000 3.275000 3.275000 49.750510
std 11.690452 0.981887 0.873763 0.84694 0.686873 2.152965 1.188621 1.141018 0.814925 1.264658 ... 1.270726 1.16685 1.362266 1.271986 1.471089 1.281025 1.144664 1.219237 1.624926 31.182213
min 1.000000 0.000000 0.000000 0.00000 0.000000 1.000000 3.000000 3.000000 2.000000 3.000000 ... 3.000000 3.00000 2.000000 2.000000 1.000000 1.000000 3.000000 1.000000 0.500000 5.981800
25% 10.750000 0.000000 0.000000 0.00000 0.000000 2.750000 5.000000 5.000000 3.000000 4.000000 ... 4.000000 4.00000 4.000000 4.000000 5.000000 3.750000 4.000000 2.000000 2.250000 16.722925
50% 20.500000 1.000000 1.000000 0.00000 0.000000 6.000000 6.000000 5.000000 4.000000 5.000000 ... 5.500000 5.00000 5.000000 5.000000 6.000000 4.000000 5.000000 3.000000 2.500000 49.431150
75% 30.250000 2.000000 1.000000 1.00000 0.000000 6.250000 7.000000 6.000000 4.000000 6.000000 ... 6.000000 6.00000 6.000000 6.000000 7.000000 5.000000 6.000000 4.000000 4.500000 79.305850
max 40.000000 3.000000 3.000000 3.00000 2.000000 7.000000 7.000000 7.000000 5.000000 7.000000 ... 7.000000 7.00000 7.000000 7.000000 7.000000 7.000000 7.000000 5.000000 6.500000 97.188900

8 rows × 87 columns

[2-1]. 次數分配表(交叉分析)

In [9]:
Cafe['Sex'].value_counts() #計算一下男女的分佈
Out[9]:
女    21
男    19
Name: Sex, dtype: int64
In [10]:
Cafe['Edu'].value_counts() #計算一下學歷的分佈
Out[10]:
專科及大學    16
高中(職)    13
研究所       6
國中        5
Name: Edu, dtype: int64
In [11]:
result = Cafe['IncomeMd'].describe() #計算調整後的所得之敘述統計量
pd.DataFrame(result )   #格式化成DataFrame
Out[11]:
IncomeMd
count 40.000000
mean 3.275000
std 1.624926
min 0.500000
25% 2.250000
50% 2.500000
75% 4.500000
max 6.500000
In [12]:
Cross0 = pd.crosstab(Cafe['Sex'], Cafe['Edu']) #建立交叉列聯表
Cross0
Out[12]:
Edu 國中 專科及大學 研究所 高中(職)
Sex
4 6 3 8
1 10 3 5
In [13]:
Cross1 = pd.crosstab(Cafe['Sex'], Cafe['A3偏好口味']) #建立交叉列聯表
Cross1
Out[13]:
A3偏好口味 偏苦之咖啡原味 加糖及奶精之香濃口味
Sex
3 18
11 8
In [14]:
Cross2 = pd.crosstab(Cafe['Area'], Cafe['A3偏好口味']) #建立交叉列聯表
Cross2
Out[14]:
A3偏好口味 偏苦之咖啡原味 加糖及奶精之香濃口味
Area
中部 1 6
南部 4 6
北部 9 14
In [15]:
#我們可以採取一些更進階的交叉分析表

Cross3 = pd.crosstab(index=[Cafe['Area'], Cafe['Sex']],
                    columns=Cafe["A3偏好口味"]                                   
                             )  
Cross3
Out[15]:
A3偏好口味 偏苦之咖啡原味 加糖及奶精之香濃口味
Area Sex
中部 0 6
1 0
南部 1 3
3 3
北部 2 9
7 5

[小結]

  • 女生喜歡"加糖及奶精之香濃口味"; 男生喜歡"偏苦之咖啡原味"
  • 南北部在口味偏好的比例上,大約是2:3左右的比例(偏苦之咖啡原味 : 加糖及奶精之香濃口味),顯示"加糖及奶精之香濃口味"在比例上較高
  • 承上,北部的男性,在偏好口味上未必有顯著差異,但女性則有

[2-2]. 樞紐分析表(Pivot Table)

通常一般敘述性統計我們就只能看看單一變數的基本狀況,若我們想要倆倆比較一下,則比較適合用樞紐分析表

In [16]:
Cafe.pivot_table('IncomeMd', index='Sex', columns='Occupatn') #樞紐分析表
Out[16]:
Occupatn 其他 學生 白領階層 自營企業 藍領階層
Sex
1.90 2.0 4.928571 5.500000 2.300000
2.25 1.5 3.666667 6.166667 2.166667
In [17]:
 Cafe.pivot_table('IncomeMd', index='Occupatn', columns='Area') #樞紐分析表
Out[17]:
Area 中部 南部 北部
Occupatn
其他 1.5 1.500000 2.333333
學生 1.5 1.833333 NaN
白領階層 5.5 4.166667 3.928571
自營企業 NaN 6.000000 5.833333
藍領階層 NaN 2.500000 2.214286

[小結].

  • 以收入來說,自營企業(自己當老闆)的收入中位數高於其他組別; 同時除了自營企業之外,其他各組的女性收入都比男性高
  • 從區域的角度來看,北部的所得並沒有南部高; 同時中部的白領階層在所得上顯著高於其他區域,可能是可開發的區域

[2-3].資料視覺化

  • 雖然上述我們採用部分人口統計資料進行初探,但其實你也可以畫畫圖來進行EDA(Exploratory Data Analysis,簡稱EDA)

Python資料視覺化主要有三大套件:

  • 'Matplotlib': 指令功能齊全,歷史最悠久的套件,己乎沒有圖示畫不出來的,但也最複雜
  • 'Seaborn': 是在Matplot的基礎上實作更高階的視覺化API,可以讓畫圖變得更方便、容易。
  • 'Plotly': 好看的各種視覺化圖表,可做出互動化的介面。但Plotly並沒有在Anaconda裡面,所以要在先下pip install plotly進行安裝

[補充1]

matplotlib 幾乎是標準 Python 畫圖套件! 在有 matplotlib 之前, Python 要畫圖不那麼方便, 和 Python 很多套件一樣, 有許多方案, 但各家有不同的優缺點, 也沒有一套是大家都在用的。

matplotlib 仿 Matlab 式的畫圖方式, 讓很多人很快入手、並且功能相當完整。原作者是 John D. Hunter, 和很多 Python 的套件作者一樣, 他有博士學位。非常令人遺憾的是他在 2012 年因大腸直腸癌治療併發症過逝, 過逝時才 44 歲!

他在過逝前不久, 還被邀請到 SciPy 研討會的 Keynote, 回去之後就被檢查出有大腸直腸癌。因此這部影片大概就是他最後一次的 Keynote, 時間是 2012 年 7 月 18 日 (他在同年 8 月 28 日過逝)

[補充2].字形編碼問題

  • 在matplotlib 或 Seaborn 中,對於中文必須特別設定,否則圖不會顯示中文
  • 請採用以下設定,請參考

https://medium.com/marketingdatascience/%E8%A7%A3%E6%B1%BApython-3-matplotlib%E8%88%87seaborn%E8%A6%96%E8%A6%BA%E5%8C%96%E5%A5%97%E4%BB%B6%E4%B8%AD%E6%96%87%E9%A1%AF%E7%A4%BA%E5%95%8F%E9%A1%8C-f7b3773a889b

  • 建議:
    • Mac可用字體:SimHei
    • Windows 可用字體:Microsoft JhengHei

[2-3-1]. 散佈圖

In [18]:
#基礎設定
from matplotlib.font_manager import FontProperties
import seaborn as sns
myfont=FontProperties(fname=r'C:\Users\user\Anaconda3\lib\site-packages\matplotlib\mpl-data\fonts\ttf\msj.ttf',size=14)
sns.set(font=myfont.get_family())
sns.set_style("whitegrid",{"font.sans-serif":['Microsoft JhengHei']})
In [19]:
sns.jointplot(x = "A101左岸頻率", y = "Intenst", data = Cafe)#散佈圖
C:\Users\user\Anaconda3\lib\site-packages\scipy\stats\stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval
Out[19]:
<seaborn.axisgrid.JointGrid at 0x1dc9833f0b8>
In [20]:
sns.scatterplot(x="Occupatn", y="Intenst", 
                hue="A101左岸頻率",
                data=Cafe)
Out[20]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9925ef98>

[2-3-2].次數分配圖

In [21]:
#distplot的變數只能放數量資料
sns.distplot(Cafe['Intenst']) #產品強度的次數分佈
Out[21]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9a359cc0>

[2-3-3].次數分配圖(count plot)

In [22]:
# countplot放屬質資料
sns.countplot(x = "A3偏好口味", data=Cafe)
Out[22]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9a3ec128>
In [23]:
sns.countplot(x = "Income0", data=Cafe) 
Out[23]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9a42e908>

[2-3-4]. Bar-Plot

In [24]:
sns.barplot(x="Occupatn", y="Intenst", data=Cafe)
Out[24]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9a493080>

[小結].自營企業的產品強度最高,其他與藍領偏低

In [25]:
sns.barplot(x="Occupatn", y="Intenst", hue="Sex", data=Cafe)
Out[25]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9a4ebdd8>

自營企業與白領階層,都是女性的產品強度較高 ; 但在藍領階層則為男性的產品強度較高

In [26]:
from numpy import median
sns.barplot(x="Occupatn", y="A101左岸頻率", data=Cafe, estimator=median) #用每天的中位數去估計小費的高低
Out[26]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9a580390>

[2-3-5]. Box-Plot

In [27]:
sns.boxplot(x = 'Area', y= 'Intenst', data = Cafe)
Out[27]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9a5da6d8>

中部的產品強度Q1與Q2非常接近,可能需要額外進行資料探討,因此我們可以嘗試加入其他變數看看,如下圖:

In [28]:
sns.boxplot(x = 'Area', y= 'Intenst', data = Cafe, hue = 'Sex') # hue = 'sex'以性別當圖標
Out[28]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9a64e898>

[2-3-6]. Cat-Plot

In [29]:
#這是進階語法,可一次看多個
sns.catplot(x="Area", y="Intenst",
            hue="Sex", col="Occupatn",
            data=Cafe, kind="bar",
            height=4, aspect=.7)
Out[29]:
<seaborn.axisgrid.FacetGrid at 0x1dc9a70ae48>

[2-4]. 相關係數矩陣

In [30]:
colormap = plt.cm.viridis
plt.figure(figsize=(14,12))
plt.title('Pearson Correlation of Features', y=1.05, size=15)
sns.heatmap(Cafe[['IncomeMd', 'A101左岸頻率', 'Intenst', 'A2咖啡偏好', 'AGE']].astype(float).corr(),linewidths=0.1,vmax=1.0, square=True, cmap=colormap, linecolor='white', annot=True)
Out[30]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9aa098d0>

[PART 3]. 產品消費頻率、性別與生活型態之探討

  • 本文的目的在於解決左岸咖啡的產品偏好與消費者行為等問題,因此在本小節將交叉使用卡方分析、變異數分析與迴歸分析等統計工具

[3-1]. T檢定

In [31]:
Cafe.A101左岸頻率.describe()
Out[31]:
count    40.000000
mean      0.900000
std       0.981887
min       0.000000
25%       0.000000
50%       1.000000
75%       2.000000
max       3.000000
Name: A101左岸頻率, dtype: float64
In [32]:
Cafe.A102伯朗頻率.describe()
Out[32]:
count    40.000000
mean      0.825000
std       0.873763
min       0.000000
25%       0.000000
50%       1.000000
75%       1.000000
max       3.000000
Name: A102伯朗頻率, dtype: float64

近一週飲用包裝咖啡之瓶/罐數上,我們發現左岸咖啡與伯朗咖啡的平均飲用頻率不同,因此我們可以採用平均數檢定

  • H0a:左岸咖啡與伯朗咖啡的飲用頻率相同
  • H1a:左岸咖啡與伯朗咖啡的飲用頻率不同
In [33]:
# two sample student t test

import numpy as np
from scipy import stats

mean1 = 0.9 #左岸頻率
mean2 = 0.825 #伯朗頻率

std1 = 0.981887
std2 = 0.873763

nobs1 = 40 #觀察值
nobs2 = 40

modified_std1 = np.sqrt(np.float64(nobs1)/np.float64(nobs1-1)) * std1
modified_std2 = np.sqrt(np.float64(nobs2)/np.float64(nobs2-1)) * std2

(statistic, pvalue) = stats.ttest_ind_from_stats(mean1=mean1, std1=modified_std1, nobs1=40, mean2=mean2, std2=modified_std2, nobs2=40)

print("t statistic is: ", statistic)
print("pvalue is: ", pvalue)
t statistic is:  0.35634979368627523
pvalue is:  0.7225407335164281

[小結]. Do not Reject H0。在α = 0.05下,我們有顯著的證據認為,左岸咖啡與伯朗咖啡的平均飲用頻率相同

[3-2].Independent t-test

In [34]:
sns.barplot(x="Sex", y="C01閱讀報章", data=Cafe) #以"閱讀報章"為範例
Out[34]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9aaeaba8>

Q: H0b:性別對部份生活型態有無差異?

  • H0b: 性別對閱讀報章之生活型態沒有差異
  • H1b: 性別對閱讀報章之生活型態有差異
In [35]:
Cafe["Gender"] = Cafe[["Sex"]] #新增一個 Gender欄位,內容是Sex的內容
Cafe.Gender.sample(10)#隨機取10行
Out[35]:
22    男
23    男
12    女
2     男
5     女
25    男
11    男
7     男
1     女
31    男
Name: Gender, dtype: object
In [36]:
from scipy.stats import ttest_ind

males = Cafe[Cafe['Gender']=='男']
females = Cafe[Cafe['Gender']=='女']
stats.ttest_ind(males['C01閱讀報章'], females['C01閱讀報章'])
#ttest_ind(males['C01閱讀報章'], females['C01閱讀報章'], nan_policy='omit')
Out[36]:
Ttest_indResult(statistic=2.1650845805362673, pvalue=0.03672691814441933)

[小結]. Reject H0。在α = 0.05下,我們有顯著的證據認為,性別對閱讀報章之生活型態有差異

[PART 4]. 左岸咖啡之市場區隔及目標選擇決策

In [37]:
sns.countplot(x = "Occupatn", data=Cafe) 
Out[37]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9822e240>

[4-1]. One-Way ANOVA: 左岸咖啡之市場區隔及目標選擇決策

  • H0c: 職業對產品強度沒有影響
  • H1c: 職業對產品強度有影響
In [38]:
#create an Ordinary Least Squares (OLS) model as a precursor to the ANOVA. 
from scipy import stats
import statsmodels
import statsmodels.api as sm
from statsmodels.formula.api import ols
In [39]:
model = ols('Intenst ~ Occupatn', Cafe).fit() #builds the OLS model, predicting weight loss with diet type.
In [40]:
resids = statsmodels.regression.linear_model.RegressionResults.resid(model) # grabs the residual values from the OLS model
hist2 = plt.hist(resids, bins = 'auto', color='dodgerblue') # check for variable normality in weight loss dependent variable. 
#Data looks normally distributed.
plt.title("Figure . Distribution of OLS Model Residuals")
plt.xlabel("Residual Values")
plt.ylabel("Count", rotation = 0, labelpad = 40)
plt.show()
In [41]:
table = sm.stats.anova_lm(model, typ=2) # Type 2 ANOVA DataFrame
print(table) 
                sum_sq    df          F        PR(>F)
Occupatn  29122.702854   4.0  28.963215  1.137793e-10
Residual   8798.182431  35.0        NaN           NaN

Reject H0。在α = 0.05下,我們有顯著的證據認為,職業對產品強度有差異。但是職業對產品強度有差異,但究竟誰高誰低,兩兩之間誰跟誰有差異? 我們需要進行ANOVA的事後多重比較

[4-2].ANOVA的事後多重比較(以Tukey test 為例)

In [42]:
from statsmodels.stats.multicomp import pairwise_tukeyhsd
from statsmodels.stats.multicomp import MultiComparison

mc = MultiComparison(Cafe['Intenst'], Cafe['Occupatn'])
tkresult = mc.tukeyhsd()
 
print(tkresult)
Multiple Comparison of Means - Tukey HSD,FWER=0.05
===============================================
group1 group2 meandiff  lower    upper   reject
-----------------------------------------------
  其他     學生   32.4978   7.0725  57.9231   True 
  其他    白領階層  57.3668  37.6004  77.1332   True 
  其他    自營企業  68.6648  43.2395  94.0902   True 
  其他    藍領階層   7.3972  -14.7525 29.5469  False 
  學生    白領階層   24.869   0.8813  48.8567   True 
  學生    自營企業   36.167   7.3374  64.9967   True 
  學生    藍領階層  -25.1006 -51.0873  0.8861  False 
 白領階層   自營企業   11.298  -12.6897 35.2857  False 
 白領階層   藍領階層  -49.9696 -70.453  -29.4862  True 
 自營企業   藍領階層  -61.2676 -87.2543 -35.281   True 
-----------------------------------------------

由上表可以看出,

  • 自營企業 和 (藍領階層、學生、其他)有顯著差異
  • 白領階層 和 (藍領階層、學生、其他)有顯著差異
  • 但藍領階層 和 (學生、其他)沒有顯著差異
  • 但白領階層 和 自營企業沒有顯著差異
In [43]:
grouped2 = Cafe['Intenst'].groupby(Cafe['Occupatn']) #以 Occupatn 為分組看 Intenst 的平均數
print(grouped2.mean()) #計算各組均值
Occupatn
其他      16.981522
學生      49.479320
白領階層    74.348346
自營企業    85.646360
藍領階層    24.378725
Name: Intenst, dtype: float64

[小結]

  • 目標市場群(高產品強度群):白領、自營
  • 非目標市場群:其他、藍領
  • 可能的潛在市場群:學生族

[管理意涵]

  • 實證結果顯示,左岸咖啡之目標市場群皆為高收入職業、非目標市場群則為低收入職業,符合行銷研究人員當初的預期,值得注意的是,學生族的產品強度雖然低於目標市場群,但也顯著高於另外兩個非目標市場,可能是未來可以開發的市場區隔。

[4-3]. Two-Way ANOVA: 左岸咖啡市場區隔與目標界定

Q:不同職業與不同性別,對產品強度影響!

  • H0d: 職業與性別,對產品強度沒有顯著交互作用影響
  • H1d: 職業與性別,對產品強度有顯著交互作用影響
In [44]:
import pandas as pd
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
from statsmodels.graphics.factorplots import interaction_plot #產生交互作用圖
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns
In [45]:
model = ols('Intenst ~ C(Sex)*C(Occupatn)', Cafe).fit()
res = sm.stats.anova_lm(model, typ= 2) #  
res
Out[45]:
sum_sq df F PR(>F)
C(Sex) 750.658547 1.0 4.520973 4.182381e-02
C(Occupatn) 29727.191211 4.0 44.759312 3.124841e-12
C(Sex):C(Occupatn) 3066.349555 4.0 4.616908 5.036366e-03
Residual 4981.174330 30.0 NaN NaN
In [46]:
sns.pointplot(x="Occupatn", y="Intenst", hue="Sex", data=Cafe, linestyles=["-", "--"])#交互作用圖
C:\Users\user\Anaconda3\lib\site-packages\scipy\stats\stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval
Out[46]:
<matplotlib.axes._subplots.AxesSubplot at 0x1dc9cbc0f28>
In [47]:
sns.factorplot(x="Occupatn",  y="Intenst", hue="Sex", data=Cafe,
               kind="box")
C:\Users\user\Anaconda3\lib\site-packages\seaborn\categorical.py:3666: UserWarning: The `factorplot` function has been renamed to `catplot`. The original name will be removed in a future release. Please update your code. Note that the default `kind` in `factorplot` (`'point'`) has changed `'strip'` in `catplot`.
  warnings.warn(msg)
Out[47]:
<seaborn.axisgrid.FacetGrid at 0x1dc9cb6a6d8>
In [48]:
model.summary()
Out[48]:
OLS Regression Results
Dep. Variable: Intenst R-squared: 0.869
Model: OLS Adj. R-squared: 0.829
Method: Least Squares F-statistic: 22.04
Date: Tue, 26 Mar 2019 Prob (F-statistic): 6.89e-11
Time: 10:29:55 Log-Likelihood: -153.25
No. Observations: 40 AIC: 326.5
Df Residuals: 30 BIC: 343.4
Df Model: 9
Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975]
Intercept 18.7578 5.763 3.255 0.003 6.989 30.527
C(Sex)[T.男] -3.9967 8.644 -0.462 0.647 -21.650 13.657
C(Occupatn)[T.學生] 29.6267 10.781 2.748 0.010 7.609 51.644
C(Occupatn)[T.白領階層] 69.0054 7.545 9.146 0.000 53.596 84.414
C(Occupatn)[T.自營企業] 77.2790 10.781 7.168 0.000 55.262 99.297
C(Occupatn)[T.藍領階層] -1.5637 8.150 -0.192 0.849 -18.207 15.080
C(Sex)[T.男]:C(Occupatn)[T.學生] 5.8214 14.597 0.399 0.693 -23.990 35.633
C(Sex)[T.男]:C(Occupatn)[T.白領階層] -25.0690 11.230 -2.232 0.033 -48.003 -2.134
C(Sex)[T.男]:C(Occupatn)[T.自營企業] -13.3208 14.597 -0.913 0.369 -43.133 16.491
C(Sex)[T.男]:C(Occupatn)[T.藍領階層] 23.1557 12.778 1.812 0.080 -2.940 49.251
Omnibus: 8.593 Durbin-Watson: 1.863
Prob(Omnibus): 0.014 Jarque-Bera (JB): 7.438
Skew: 0.925 Prob(JB): 0.0243
Kurtosis: 4.020 Cond. No. 14.7


Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
In [49]:
## 各群不同的平均值是多少

pd.crosstab(Cafe.Occupatn, Cafe.Sex, values=Cafe.Intenst, aggfunc='mean').round(2) #取不同組別的平均數,小數點以下兩位
Out[49]:
Sex
Occupatn
其他 18.76 14.76
學生 48.38 50.21
白領階層 87.76 58.70
自營企業 96.04 78.72
藍領階層 17.19 36.35

In [50]:
#Our model fit (the linear model fitted with the OLS method) and get a Quantile-Quantile (QQplot):
res = model.resid 
fig = sm.qqplot(res, line='s')
plt.show()

[小結]: Reject H0。在α = 0.05下,我們有顯著的證據認為,不同職業與不同性別,對產品強度有顯著影響

[管理意涵]

  • 自營女性、白領女性、自營男性。三者的產品強度最高
  • 簡而言之,左岸咖啡可以利用職業及性別來區隔市場,實證結果顯示,自營女性、白領女性、自營男性。三者的產品強度最高,應是為目標市場,其餘七個職業性別組合則被視為非目標市場,行銷人員應依據這三群的目標市場特質,設計左岸咖啡之行銷策略。

[補充:為將來做準備 ]. 我們新建一個分群變數!

  • Segment
    • 1.自營企業
    • 2.白領階層
    • 3.學生、籃領、其它
In [51]:
Cafe["Segment"] = Cafe[["Occupatn"]] #新增一個 Segment欄位,內容是Occupatn的內容
Cafe.sample(10)#隨機取10行
Out[51]:
ID A101左岸頻率 A102伯朗頻率 A103廣場頻率 A104輕鬆頻率 A2咖啡偏好 A3偏好口味 A401提神醒腦 A402習慣飲用 A403抒解口渴 ... Sex AGE Occupatn Edu Income0 IncomeMd Area Intenst Gender Segment
35 36 1 0 2 0 6 加糖及奶精之香濃口味 6 6 4 ... 4 自營企業 高中(職) 6萬以上 6.5 南部 66.4761 自營企業
19 20 0 1 2 0 7 偏苦之咖啡原味 7 7 4 ... 4 白領階層 研究所 3-4萬 3.5 北部 53.8586 白領階層
27 28 0 1 0 0 2 加糖及奶精之香濃口味 5 4 4 ... 3 藍領階層 高中(職) 2-3萬 2.5 北部 10.0137 藍領階層
9 10 2 1 1 0 4 加糖及奶精之香濃口味 5 6 2 ... 4 藍領階層 專科及大學 2-3萬 2.5 北部 68.3881 藍領階層
38 39 2 0 1 0 5 加糖及奶精之香濃口味 5 5 3 ... 3 白領階層 高中(職) 5-6萬 5.5 中部 77.4608 白領階層
24 25 0 2 0 0 6 偏苦之咖啡原味 7 6 4 ... 1 學生 國中 1萬以下 0.5 中部 42.9104 學生
5 6 0 1 0 0 2 偏苦之咖啡原味 5 5 5 ... 3 其他 高中(職) 1-2萬 1.5 北部 10.0137 其他
21 22 2 1 0 0 5 加糖及奶精之香濃口味 5 5 3 ... 2 白領階層 專科及大學 3-4萬 3.5 南部 77.4608 白領階層
20 21 1 0 0 0 4 加糖及奶精之香濃口味 5 4 4 ... 5 其他 高中(職) 1-2萬 1.5 中部 45.0037 其他
17 18 2 1 1 0 6 加糖及奶精之香濃口味 6 6 3 ... 4 自營企業 研究所 6萬以上 6.5 北部 84.8410 自營企業

10 rows × 95 columns

In [52]:
Cafe["Segment"] = Cafe["Segment"].str.replace("學生","其他") 
Cafe["Segment"] = Cafe["Segment"].str.replace("藍領階層","其他")
Cafe.sample(10)#隨機取10行
#所以現在Segment只有三種類別: 自營企業、白領階層、其他
Out[52]:
ID A101左岸頻率 A102伯朗頻率 A103廣場頻率 A104輕鬆頻率 A2咖啡偏好 A3偏好口味 A401提神醒腦 A402習慣飲用 A403抒解口渴 ... Sex AGE Occupatn Edu Income0 IncomeMd Area Intenst Gender Segment
4 5 1 0 0 0 1 加糖及奶精之香濃口味 3 3 3 ... 2 藍領階層 國中 1-2萬 1.5 北部 17.0509 其他
21 22 2 1 0 0 5 加糖及奶精之香濃口味 5 5 3 ... 2 白領階層 專科及大學 3-4萬 3.5 南部 77.4608 白領階層
35 36 1 0 2 0 6 加糖及奶精之香濃口味 6 6 4 ... 4 自營企業 高中(職) 6萬以上 6.5 南部 66.4761 自營企業
3 4 2 0 3 0 7 加糖及奶精之香濃口味 7 6 4 ... 3 白領階層 專科及大學 4-5萬 4.5 北部 90.4082 白領階層
28 29 0 0 1 0 2 偏苦之咖啡原味 5 4 4 ... 5 其他 專科及大學 2-3萬 2.5 北部 10.0137 其他
19 20 0 1 2 0 7 偏苦之咖啡原味 7 7 4 ... 4 白領階層 研究所 3-4萬 3.5 北部 53.8586 白領階層
7 8 1 0 0 0 2 偏苦之咖啡原味 4 4 3 ... 2 藍領階層 高中(職) 1-2萬 1.5 北部 24.9322 其他
26 27 2 0 3 0 7 加糖及奶精之香濃口味 7 6 2 ... 3 白領階層 專科及大學 4-5萬 4.5 北部 90.4082 白領階層
10 11 2 3 0 0 7 加糖及奶精之香濃口味 7 7 3 ... 4 白領階層 高中(職) 4-5萬 4.5 南部 90.4082 白領階層
31 32 1 0 0 0 4 加糖及奶精之香濃口味 3 4 3 ... 4 白領階層 專科及大學 4-5萬 4.5 南部 45.0037 白領階層

10 rows × 95 columns

[PART 5]. 左岸咖啡之所得定位 (Multiple Regression)

  • 在前面,我們已經Income0 轉成IncomeMd
  • 此時的 IncomeMd 是Ratio Scale
  • 因此本小節,我們要用Regresion 看看個人所得、咖啡偏好對左岸咖啡的使用頻率沒有影響
  • 在使用迴歸時,建議一個model一個model跑,比較清楚
  • 所以接下來的流程是:
    • Model-1: 個人所得對使用頻率
    • Model-2: 咖啡偏好對使用頻率
    • Model-3: 個人所得、咖啡偏好對使用頻率
  • H0e:個人所得、咖啡偏好對左岸咖啡的使用頻率沒有影響
  • H1e:個人所得、咖啡偏好對左岸咖啡的使用頻率有影響

[Model 1]. 個人所得對使用頻率

In [53]:
Cafe.IncomeMd.mean() #所得均值
Out[53]:
3.275
In [54]:
Cafe.A101左岸頻率.mean() #左岸頻率均值
Out[54]:
0.9
In [55]:
import statsmodels.api as sm
import statsmodels.formula.api as smf

results = smf.ols('A101左岸頻率 ~ IncomeMd', data=Cafe).fit() #簡單迴歸
print(results.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:               A101左岸頻率   R-squared:                       0.549
Model:                            OLS   Adj. R-squared:                  0.537
Method:                 Least Squares   F-statistic:                     46.24
Date:                Tue, 26 Mar 2019   Prob (F-statistic):           4.60e-08
Time:                        10:31:18   Log-Likelihood:                -39.599
No. Observations:                  40   AIC:                             83.20
Df Residuals:                      38   BIC:                             86.58
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     -0.5662      0.240     -2.358      0.024      -1.052      -0.080
IncomeMd       0.4477      0.066      6.800      0.000       0.314       0.581
==============================================================================
Omnibus:                        1.457   Durbin-Watson:                   2.208
Prob(Omnibus):                  0.483   Jarque-Bera (JB):                1.269
Skew:                           0.421   Prob(JB):                        0.530
Kurtosis:                       2.770   Cond. No.                         8.80
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

[Model 2]. 咖啡偏好對使用頻率

In [56]:
Cafe.A2咖啡偏好.mean() #咖啡偏好均值
Out[56]:
4.675
In [57]:
results2 = smf.ols('A101左岸頻率 ~ A2咖啡偏好', data=Cafe).fit() #簡單迴歸
print(results2.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:               A101左岸頻率   R-squared:                       0.177
Model:                            OLS   Adj. R-squared:                  0.155
Method:                 Least Squares   F-statistic:                     8.181
Date:                Tue, 26 Mar 2019   Prob (F-statistic):            0.00684
Time:                        10:31:24   Log-Likelihood:                -51.620
No. Observations:                  40   AIC:                             107.2
Df Residuals:                      38   BIC:                             110.6
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      0.0026      0.345      0.008      0.994      -0.695       0.700
A2咖啡偏好         0.1920      0.067      2.860      0.007       0.056       0.328
==============================================================================
Omnibus:                        3.672   Durbin-Watson:                   1.973
Prob(Omnibus):                  0.159   Jarque-Bera (JB):                1.666
Skew:                           0.079   Prob(JB):                        0.435
Kurtosis:                       2.013   Cond. No.                         12.8
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

[Model 3]. 個人所得、咖啡偏好對使用頻率

In [58]:
results3 = smf.ols('A101左岸頻率 ~ A2咖啡偏好 + IncomeMd', data=Cafe).fit() #複迴歸
print(results3.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:               A101左岸頻率   R-squared:                       0.554
Model:                            OLS   Adj. R-squared:                  0.530
Method:                 Least Squares   F-statistic:                     22.97
Date:                Tue, 26 Mar 2019   Prob (F-statistic):           3.27e-07
Time:                        10:31:29   Log-Likelihood:                -39.375
No. Observations:                  40   AIC:                             84.75
Df Residuals:                      37   BIC:                             89.82
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     -0.6614      0.283     -2.335      0.025      -1.235      -0.087
A2咖啡偏好         0.0370      0.057      0.646      0.522      -0.079       0.153
IncomeMd       0.4239      0.076      5.590      0.000       0.270       0.578
==============================================================================
Omnibus:                        1.340   Durbin-Watson:                   2.202
Prob(Omnibus):                  0.512   Jarque-Bera (JB):                1.132
Skew:                           0.400   Prob(JB):                        0.568
Kurtosis:                       2.805   Cond. No.                         16.8
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

[小結]: Reject H0。在α = 0.05下,我們有顯著的證據認為,個人所得、咖啡偏好對左岸咖啡的使用頻率有影響**

[管理意涵]

  • 由Model-1,我們可以看出 β0=-0.5662,β1=0.0448,所得均值=32.75(千元),左岸使用頻率均值=0.9(罐)。由於迴歸係數正向且顯著,故所得定位策略可能要採取高所得訴求或高所得定位。
  • 由Model-2,我們可以看出 β0=-0.0026,β1=0.1920,咖啡偏好均值=4.675。由於迴歸係數正向且顯著,顯示喜歡飲用咖啡的程度會正向影響使用頻率

[註記].

  • 由Model 3,你會發現當'IncomeMd'丟進去後,'A2咖啡偏好'不顯著了
  • 其實這表示,'IncomeMd'是中介變數
  • 但這不在初等統計學的授課範圍內,因此課堂上我們不多做說明

[PART 6]. 左岸咖啡之口味差異化策劃

  • 在本小節,我們要採用卡方獨立性檢定!
  • 你應該還記得,之前我們曾經新建一個Segment(目標市場)的變數

    • 1.自營企業
    • 2.白領階層
    • 3.學生、籃領、其它
  • 目標市場、性別對口味偏好的影響

    • 變數定義
      • 1.反應變量: A3偏好口味
      • 2.解釋變數: SexSegment

[6-1]. 我們先來看看原始的數據

In [59]:
contingency_table1 = pd.crosstab(index=[Cafe['Occupatn'], Cafe['Sex']],
                    columns=Cafe["A3偏好口味"]                                   
                             )  
contingency_table1

#我們會發現有些格子的數值<5,表示要併組處理
Out[59]:
A3偏好口味 偏苦之咖啡原味 加糖及奶精之香濃口味
Occupatn Sex
其他 1 4
4 0
學生 1 1
3 0
白領階層 0 7
1 5
自營企業 0 2
1 2
藍領階層 1 4
2 1

[6-2]. 併組之後的列聯表

  • 以上的方式必須要每一格的數值都超過5
  • 一旦沒有超過5。必須要併組
  • 本Café的檔案總樣本為40,分配到各組之後會有某幾組不滿5
  • 所以退而求其次用以下的方式處理
  • 採用另一個依據職業類別修改的區隔變數"Segment"
In [60]:
contingency_table2 = pd.crosstab(Cafe['Sex'], Cafe['A3偏好口味'])
contingency_table2
Out[60]:
A3偏好口味 偏苦之咖啡原味 加糖及奶精之香濃口味
Sex
3 18
11 8
In [61]:
contingency_table3 = pd.crosstab(Cafe['Segment'], Cafe['A3偏好口味'])
contingency_table3
#因為本次練習的 Sample size只有40個,一定會有所不足,建議在大樣本的情況下應滿足 >5 之條件 
Out[61]:
A3偏好口味 偏苦之咖啡原味 加糖及奶精之香濃口味
Segment
其他 12 10
白領階層 1 12
自營企業 1 4

[6-3]. 卡方分析

Q:目標市場與性別,對偏好口味之影響!

  • H1f: 不同性別之咖啡口味偏好有顯著差異
  • H1g: 不同目標市場之咖啡口味偏好有顯著差異

[在開始卡方分析之前].先要引入researchpy 套件

- conda install -c researchpy researchpy

In [62]:
import pandas as pd
import researchpy as rp
from scipy import stats
In [63]:
table1, results1 = rp.crosstab(Cafe['Sex'], Cafe['A3偏好口味'], prop= 'col', test= 'chi-square')
    
table1
Out[63]:
A3偏好口味
偏苦之咖啡原味 加糖及奶精之香濃口味 All
Sex
21.43 69.23 52.5
78.57 30.77 47.5
All 100.00 100.00 100.0
In [64]:
results1
Out[64]:
Chi-square test results
0 Pearson Chi-square ( 1.0) = 8.3384
1 p-value = 0.0039
2 Cramer's phi = 0.4566
In [65]:
table2, results2 = rp.crosstab(Cafe['Segment'], Cafe['A3偏好口味'], prop= 'col', test= 'chi-square')
    
table2
Out[65]:
A3偏好口味
偏苦之咖啡原味 加糖及奶精之香濃口味 All
Segment
其他 85.71 38.46 55.0
白領階層 7.14 46.15 32.5
自營企業 7.14 15.38 12.5
All 100.00 100.00 100.0
In [66]:
results2
Out[66]:
Chi-square test results
0 Pearson Chi-square ( 2.0) = 8.4500
1 p-value = 0.0146
2 Cramer's V = 0.4596

[小結]: Reject Ho,在α=0.05下,我們有顯著的證據認為,不同目標市場與不同性別,對咖啡偏好口味有顯著差異。

[管理意涵]

  • 本節假定目標市場與性別的交互作用不存在
  • 實證結果顯示,行銷研究人員可針對其他職業與男性推出偏好濃口味咖啡; 對白領階層、自營企業、女性推出偏好淡口味咖啡。

[最後說明]

  • 此份資料僅供教學用途,主要用以說明敘述統計及應用統計在Python之應用
  • 後續仍然可以用在其他的市場調查議題,若有興趣之同學,可於碩士班時修習"多變量分析",會對市場調查及行銷研究會有更深的體驗
  • 本程式碼僅由本人撰寫,若有任何錯誤,請不吝提出,謝謝