دسته‌ها
Buiness Analysis Data Science Programming Python علمی

Asking Questions About our Data

Asking Questions About our Data
Thanks to Super Data Science we can look at a training data set with some sales data and gain some insights from it. Let’s take a little look at the data as it looks in Excel.

Upon initial inspection of the data, we can start thinking of some questions about it that we would want to answer.

What rep sold the most?
What item sold the most?
What region sold the most?


Loading the Data
Our data already has descriptive column names so that’ll be much easier for us since we won’t have to name the columns ourselves. But, we do need to understand what each of these columns mean to better understand our data.
To load the data into pandas, we must first import the packages that we’ll be using.
import pandas as pd
import numpy as np
We can use pandas to read in the CSV file with the read_csv method.

df = pd.read_csv("./OfficeSupplies.csv")
If there are no errors when executing then the file loaded with no errors. But now what do we do with it? Pandas takes the data and creates a DataFrame data structure with it. The DataFrame allows us to do quite a bit of analysis on the data. We can look at the number of rows and columns to get a quick idea of how big our data is.

df.shape

There are 43 rows and six columns in our data set. It’s not that big of a data set, but even small data sets can yield some good insights.

General Analysis of the Data
To get a quick idea of what the data looks like, we can call the head function on the data frame. By default, this returns the top five rows, but it can take in a parameter of how many rows to return.

df.head()

This looks a lot like an Excel spreadsheet, doesn’t it? Under the hood, the data frame is a two-dimensional data structure and each column can have different types. To show that, we can call dtypes attribute on the data frame to see what each column types are.

df.dtypes

Even though the first four columns are objects, we can see from the data that it’s text. Due to pandas using Numpy behind the scenes, it interprets strings as objects.

Next, we can look at some descriptive statistics of the data frame with the describe method.

df.describe()

This shows some descriptive statistics on the data set. Notice, it only shows the statistics on the numerical columns. From here you can see the following statistics:

Row count, which aligns to what the shape attribute showed us.
The mean, or average.
The standard deviation, or how spread out the data is.
The minimum and maximum value of each column
The number of items that fall within the first, second, and third percentiles.
We can tell a decent amount of our data from this, such as the average number of units sold is 49 and the average price of each unit is around $20.

Answering our Questions
Now we can do further analysis on our data to answer our questions. Before that, we should see if there are any missing values in our data set. In our current data set of 43 rows we can scan the data to tell there aren’t any missing values, but with much bigger data sets looking at the data by hand to find missing values will be too tedious. This is easy to do in pandas. To check if there are any missing values in the entire data set we use the isnull function, then see if there are any values.

df.isnull().values.any()

We’re lucky we have such a nice data set and with no missing values. While we won’t focus on it in this post, a data scientist will spend their time cleaning (or wrangling ) the data. Since we don’t have any missing data, we can start doing further analysis on our data.

Who sold the most?
The first question we had was what rep had sold the most. Pandas has a lot of utility functions for querying the data frame to help us out. To answer this we can group by the “Rep” column and sum up the values in the columns. Notice in the result that pandas only does a sum on the numerical columns. Then we do a descending sort on the values based on the “Units” column.

df.groupby(["Rep"]).sum().sort_values("Units", ascending=False)

Richard sold the most units, but did he sell the most in dollar amount? Does selling the most units mean the rep earned the most money? How can we determine that if there’s no column available to find that out? Pandas has you covered there, too. We can add columns to our data frame as we need (we can drop them, too, if they add too much noise to our data set). Pandas uses Numpy behind the scenes in the DataFrame object so it has the ability to do mathematical operations on columns, and it can do them quite fast.

df["Total Price"] = df["Units"] * df["Unit Price"]
df.head()

Here we create a new column on our data frame called “Total Price” and multiply the “Units” and “Unit Price” columns to calculate it. We call the head function again to make sure it got added.

Now we can find who sold the most in total dollar amount.

df.groupby("Rep").sum().sort_values("Total Price", ascending=False).head()
We do the same grouping of the “Rep” column and sum up the values, but now we do a descending sort on the “Total Price” column values and print out the results.

Richard may have sold the most units, but Matthew sold the most in terms of total price.

What region sold the most?

We now know who sold the most, but we also have a “Region” column. With this, we can see who sold the most within each region.

group = df.groupby(["Region","Rep"]).sum()
total_price = group["Total Price"].groupby(level=0, group_keys=False)
total_price.nlargest(5)

Now we group by two columns, “Region” and “Rep”, and sum those values up. With that result, we save it off into a new data frame. Then take the “Total Price” column and group the values. In our groupby function, we specify what level to group by since we already did the first grouping, which creates a hierarchical index on the data. Then we take the largest five of those to print out. From the results, we can tell that Matthew sold the most in the Central region, Susan in the East, and James in the West.

Another thing to note from this result: the Central region has the same number of reps than East and West combined. That could be something to bring up to the sales team when presenting the data.

دسته‌ها
Buiness Analysis Data Science Python علمی محمد حسین ابراهیم زاده

python, Pandas Categorize the range

df[‘PriceBin’] = pd.cut(df[‘PriceAvg’], bins = 3)
df[‘PriceBin’].value_counts()

(۵۴۰۶۰.۰, ۲۰۴۰۰۰۰.۰]      ۲۰۹ 
(۲۰۴۰۰۰۰.۰, ۴۰۲۰۰۰۰.۰] ۴
(۴۰۲۰۰۰۰.۰, ۶۰۰۰۰۰۰.۰] ۱
Name: PriceBin, dtype: int64


df[‘PriceBin’] = pd.qcut(df[‘PriceAvg’], q=3)
df[‘PriceBin’].value_counts().sort_index()

(۵۹۹۹۹.۹۹۹, ۲۱۰۰۰۰.۰]    ۷۷
(۲۱۰۰۰۰.۰, ۳۱۵۰۰۰.۰]     ۶۶
(۳۱۵۰۰۰.۰, ۶۰۰۰۰۰۰.۰]    ۷۱
Name: PriceBin, dtype: int64

h = df.groupby(‘PriceBin’, as_index=False).median()[‘SalesAvg’]

h = pd.DataFrame(h)
h.reset_index(inplace=True)
h


PriceBin SalesAvg
۰(۵۹۹۹۹.۹۹۹, ۲۱۰۰۰۰.۰] ۴۲.۰۰۰۰۰۰۱
(۲۱۰۰۰۰.۰, ۳۱۵۰۰۰.۰] ۱۴۵.۱۶۶۶۶۷۲
(۳۱۵۰۰۰.۰, ۶۰۰۰۰۰۰.۰] ۱۱۴.۲۰۰۰۰۰

دسته‌ها
Buiness Analysis Data Science Python علمی محمد حسین ابراهیم زاده

Useful Python pandas codes

To Rename the data frame
df.rename(columns={“contract_id”:”deal_id”},inplace=True)

Where statement
tips[tips[‘time’] == ‘Dinner’].head(۵)

vlookup
mg = pd.merge(df,AgReg,on=”deal_id”,how=”left”)

choose the first column of an array or first part of a string with a delimitter
df[“cat”] = df[“CategoryID”].str.split(‘,’,1).str[0]

filling na or nan or Null values
df[“CategoryID”].fillna(“”,inplace=True)

Convert To date time
pd.to_datetime(df[“start_date”],errors=’ignore’)

combination of where and select some.
df[(df[‘CategoryName_Art’] == ۱)].iloc[0:5,:]

Get data ready for decision tree dmdf = pd.get_dummies(df[[‘ShamsiYear’, ‘ShamsiYearMonth’, ‘Brand’,       ‘CategoryName’, ‘SubCategoryName’,  ‘UnitPrice’, ‘SoldCoupon’,       ‘Area2’]])

دسته‌ها
Buiness Analysis Data Science process mining

Process mining – Introduction 2

  • Case ID
  • Activity Name
  • Time Stamp

Play out: A possible scenario

Play in: simple process allowing for 4 traces

Replay

Process mining:

  1. Discovery
  2. Conformance
  3. Enhancement

Machine learning:

  1. Supervised learning: response variable that labels each instance (we labeled each data and the machine will learn from that)
    1. Classification: classify to predict (i.e. decision tree)
    2. Regression: final function that fits data
  2. Unsupervised learning: unlabeled. (i.e. clustering like K-means, pattern discovery)

Example: smoker, drinker, weight: supervised learning

Smoker, drinker: predictor variable

Weight: response variable

دسته‌ها
Buiness Analysis Data Science process mining

Process mining – Introduction 1

Process mining is the combination of Data mining and Business process management. It works with log files. Every log file must have:

  1. Case ID (order ID)
  2. Activity (purchased, Request, rejected, …)
  3. Time stamp

Process mining Internet of events
Big data Internet of contents (google, Wikipedia)
Social media Internet of people
Cloud Internet of things
Mobility Internet of places

 Big data issue:

  • Volume (data size)
  • Velocity (speed of change)
  • Variety (different forms of sources)
  • Veracity (uncertainty of data)

Data science questions:

  • What happened
  • Why did it happen
  • What will happen
  • What is the best that can happen?

Process mining questions:

  • What is the process that people really follow?
  • What are the bottlenecks in the process?
  • Where do people deviate from the expected?

دسته‌ها
Buiness Analysis Data Science Programming Python علمی

Pandas V.S SQL

If you knew SQL before and want to migrate to Python, you can use this article.

۱) Simple select

—-

SELECT total_bill, tip, smoker, time
FROM tips
LIMIT ۵;

—–

tips[[‘total_bill’‘tip’‘smoker’‘time’]].head(۵)

—————

—————

۲) where 

——

SELECT *
FROM tips
WHERE time = ‘Dinner’
LIMIT ۵;

———

tips[tips[‘time’== ‘Dinner’].head(۵)

————

۳) Multiple conditions

— tips of more than $5.00 at Dinner meals

SELECT *
FROM tips
WHERE time = ‘Dinner’ AND tip > ۵.۰۰;

—–

tips[(tips[‘time’== ‘Dinner’& (tips[‘tip’> ۵.۰۰)]

SELECT *
FROM frame
WHERE col2 IS NULL;

frame[frame[‘col2’].isna()]

————————–

۴) Group By 

SELECT sex, count(*)
FROM tips
GROUP BY sex;

———

tips.groupby(‘sex’).size()

sex

Female 87

Male 157

dtype: int64

Notice that in the pandas code we used size() and not count(). This is because count() applies the function to each column, returning the number of not null records within each.

tips.groupby(‘sex’).count()

        total_bill tip smoker day time size
sex
Female        ۸۷   ۸۷   ۸۷     ۸۷   ۸۷   ۸۷
Male         ۱۵۷   ۱۵۷  ۱۵۷   ۱۵۷  ۱۵۷  ۱۵۷

Alternatively, we could have applied the count() method to an individual column:

tips.groupby(‘sex’)[‘total_bill’].count()

Sex

Female 87

Male 157

Name: total_bill, dtype: int64

————–

SELECT dayAVG(tip), COUNT(*)
FROM tips
GROUP BY day;

—-

tips.groupby(‘day’).agg({‘tip’: np.mean, ‘day’: np.size})

——–

SELECT smoker, dayCOUNT(*), AVG(tip)
FROM tips
GROUP BY smoker, day;

—-

tips.groupby([‘smoker’‘day’]).agg({‘tip’: [np.size, np.mean]})

INNER JOIN

In [22]: df1 = pd.DataFrame({‘key’: [‘A’‘B’‘C’‘D’],
….: ‘value’: np.random.randn(۴)})

….:

In [23]: df2 = pd.DataFrame({‘key’: [‘B’‘D’‘D’‘E’],
….: ‘value’: np.random.randn(۴)})

SELECT *
FROM df1
INNER JOIN df2
ON df1.key = df2.key;

pd.merge(df1, df2, on=‘key’)

merge() also offers parameters for cases when you’d like to join one DataFrame’s column with another DataFrame’s index.

indexed_df2 = df2.set_index(‘key’)

pd.merge(df1, indexed_df2, left_on=‘key’, right_index=True)

LEFT OUTER JOIN

SELECT *
FROM df1
LEFT OUTER JOIN df2
ON df1.key = df2.key;

pd.merge(df1, df2, on=‘key’, how=‘left’)

RIGHT JOIN

SELECT *
FROM df1
RIGHT OUTER JOIN df2
ON df1.key = df2.key;

pd.merge(df1, df2, on=‘key’, how=‘right’)

FULL JOIN

SELECT *
FROM df1
FULL OUTER JOIN df2
ON df1.key = df2.key;

pd.merge(df1, df2, on=‘key’, how=‘outer’)

UNION

SELECT city, rank
FROM df1
UNION ALL
SELECT city, rank
FROM df2;

pd.concat([df1, df2])

SQL’s UNION is similar to UNION ALL, however UNION will remove duplicate rows.

SELECT city, rank
FROM df1
UNION
SELECT city, rank
FROM df2;

pd.concat([df1, df2]).drop_duplicates()

Top N rows with offset

SELECT * FROM tips
ORDER BY tip DESC
LIMIT ۱۰ OFFSET ۵;

tips.nlargest(۱۰ + ۵, columns=‘tip’).tail(۱۰)

Top N rows per group

— Oracle’s ROW_NUMBER() analytic function

SELECT * FROM (
SELECT
t.*,
ROW_NUMBER() OVER(PARTITION BY day ORDER BY total_bill DESCAS rn
FROM tips t
)
WHERE rn < ۳
ORDER BY day, rn;

(tips.assign(rn=tips.sort_values([‘total_bill’], ascending=False).groupby([‘day’]).cumcount() + ۱) .query(‘rn < 3’).sort_values([‘day’‘rn’]))

UPDATE

UPDATE tips
SET tip = tip*۲
WHERE tip < ۲;

tips.loc[tips[‘tip’< ۲‘tip’*= ۲

DELETE

DELETE FROM tips
WHERE tip > ۹;

tips = tips.loc[tips[‘tip’<= ۹]

دسته‌ها
Buiness Analysis Marketing علمی محمد حسین ابراهیم زاده

Excel or any spreadsheet next order date or any related column

In excel or any spreadsheet if you want to have:
• customer next order date
• customer next purchase or order number
• to calculate customer purchase period
• customer order frequency
• …

You have to have the customer number and order date. Also having invoice numbers would be helpful because sometimes orders will break into different invoice numbers. So if we have: customer number in C and invoice numbers in B and order date in D
Just do this:
order by date, order by customer number
then your next order date would be:
=IF ( AND (C2=C1,B2<>B1),D2,””)

دسته‌ها
Buiness Analysis علمی محمد حسین ابراهیم زاده

سوگیری خودانتخابی چیست؟

از اینجا

معمولاً اگر شما یک وب‌سایت داشته باشید، گهگاه مشکلاتی برایتان رخ می‌دهد که نیاز دارید برای رفع آن به بخش خدمات مشتریان شرکت میزبان وب مراجعه کنید. من برای وب‌سایتم از خدمات میزبانی شرکتی استفاده می‌کنم که به‌صورت آنلاین می‌توانم با یک کارشناس فنی گفتگو کنم. پس از پایان گفتگو پنجره‌ای باز می‌شود و از من می‌خواهد در صورت تمایل به پرسش‌هایی برای سنجش میزان رضایت از خدمات دریافت شده پاسخ دهم. امروزه شرکت‌های زیادی از چنین سیستم‌هایی برای پایش رضایت مشتریان استفاده می‌کنند.

می‌دانیم که همه مشتریان در پایان گفتگو با کارشناس فنی، به سؤالات سنجش رضایت پاسخ نمی‌دهند. آیا ممکن است این موضوع که افراد خود انتخاب می‌کنند به این پرسش‌ها پاسخ دهند، باعث شود نمونه آماری تنها بیانگر نظر بخشی از مشتریان باشد؟ در این صورت تا چه حد داده‌های چنین سیستم‌هایی برای شرکت مذکور مفید هستند؟ تا چه حد شرکت می‌تواند بر اساس تحلیل این داده‌ها از میزان رضایت مشتریانش آگاه شود؟

با فراگیرشدن استفاده از اینترنت، انجام تحقیقات بازار نسبت به گذشته ارزان‌تر و آسان‌تر شده است. امروزه بسیاری از شرکت‌های ایرانی به نظرسنجی‌های آنلاین روی آوردند تا دید بهتری از مشتریان به دست آورند. اما باید توجه کرد بسیاری از این نوع نظرسنجی‌ها در معرض سوگیری خودانتخابی (Self-Selection Bias) قرار دارند. در ادامه من با بیان مثال‌های مختلف این سوگیری را توضیح می‌دهم و در انتها درباره نحوه برخورد با آن توضیحاتی ارائه می‌کنم.

سوگیری خودانتخابی چیست؟

به این مثال توجه کنید. اداره گردشگری یک استان اعلام کرده بر اساس مطالعه‌ای که انجام داده است، اغلب گردشگرانی که در دو سال گذشته بیش از یک‌بار به‌قصد تفریح به آن استان سفر کرده‌اند، آن استان را دلپذیر و فوق‌العاده ارزیابی کردند. بنابراین اداره گردشگری آن استان چنین تبلیغ می‌کند که آنجا یکی از بهترین مقاصد گردشگری است. آیا این نتیجه‌گیری درست است؟

معمولاً در چنین مطالعاتی برای آنکه ارزیابی کنند جایی مقصد گردشگری خوبی است یا نه، از ابزار نظرسنجی استفاده می‌کنند. احتمالاً در چنین نظرسنجی سؤالات زیر پرسیده می‌شود:

در دو سال گذشته چند سفر کاری به استان داشتید؟

در دو سال گذشته چند سفر تفریحی (غیر کاری) به استان داشتید؟

آیا فکر می‌کنید این استان مقصد دلپذیر و فوق‌العاده‌ای برای اقامت است؟

بیاید درباره پاسخ‌دهندگان به چنین نظرسنجی کمی بیشتر فکر کنیم. فرض کنید کسانی که در دو سال گذشته تنها برای سفر کاری به آن استان رفتند، فکر نمی‌کنند آنجا جای دلپذیر و فوق‌العاده‌ای است. در این صورت تنها وقتی مجبور به سفر به آن استان بودند، آنجا نمی‌رفتند. این دسته از افراد در نتیجه‌گیریِ نظرسنجی لحاظ نشده‌اند.

فرض کنید کسانی که در دو سال گذشته تنها یک‌بار برای سفر تفریحی به آن استان رفتند، فکر نمی‌کنند آنجا جای دلپذیر و فوق‌العاده‌ای است. احتمالاً به همین دلیل است که دیگر به آنجا سر نزدند. این گروه هم در نتیجه‌گیریِ نظرسنجی لحاظ نشده‌اند.

فرض کنید بیشتر کسانی که در دو سال گذشته بیش از یک‌بار برای سفر تفریحی به آن استان رفتند، فکر می‌کنند آنجا جای دلپذیر و فوق‌العاده‌ای است. بالاخره جوابی که دنبالش می‌گشتیم پیدا شد. این همان جوابی است که اداره گردشگری می‌تواند از آن برای تبلیغ استفاده کند و واقعیت هم دارد، ولی تمام واقعیت نیست.

بنابراین سوگیری خودانتخابی زمانی رخ می‌دهد که ما گروه‌های مختلف افراد را که تصمیمات مختلفی گرفتند، با یکدیگر مقایسه کنیم بدون آنکه توجه کنیم “چرا” این تصمیمات را گرفتند.

نظرسنجی‌های رضایت مشتریان و سوگیری خودانتخابی

نظرسنجی‌های رضایت مشتری (Customer Satisfaction Surveys) ابزارهای مفیدی برای شناسایی نقاط قوت و ضعف خدمات و محصولاتی است که یک سازمان ارائه می‌دهد. ولی سوگیری خودانتخابی در بیشتر نظرسنجی‌های رضایت مشتریان وجود دارد که می‌توان استنتاج بر اساس آنان را تحت شعاع قرار دهد. علت اصلی در اینجاست که این نظرسنجی‌ها معمولاً به‌طور کاملاً تصادفی در بین مشتریان پخش نمی‌شوند و کسانی که تصمیم می‌گیرند به پرسش‌های آن پاسخ دهند، ممکن است به‌طور سامانمند از کسانی که تصمیم می‌گیرند به آن پاسخ ندهند، متفاوت باشند.

برای نمونه یک شرکت هواپیمایی مسافربری تبلیغ می‌کند که ۸۴ درصد مسافران کاری (Business Travelers) که به‌طور منظم بین تهران و مشهد پرواز می‌کنند این خط هواپیمایی را ترجیح می‌دهند. اگر بدانیم تنها ۸ درصد کل مسافران که بین تهران و مشهد پرواز می‌کنند از این خطوط هوایی استفاده می‌کنند، چطور این تناقض را حل کنیم؟

پاسخ این است که بیشتر این نظرسنجی‌ها در بین مشتریان خود شرکت‌ها انجام می‌شود. در این نمونه احتمالاً نظرسنجی از بین کسانی که سوار یکی از هواپیماهای این خط بودند، صورت گرفته است. با احتمال زیاد این افراد این خط هواپیمایی را ترجیح می‌دادند که آن را انتخاب کردند. درواقع نکته شگفت‌انگیز این نیست که چرا ۸۴ درصد آنان همین خط هوایی را ترجیح می‌دهند، جالب‌تر آن است که چرا ۱۶ درصد خطوط هوایی دیگر را ترجیح می‌دهند. ولی هیچ شرکتی اعلام نمی‌کند که ۱۶ درصد کسانی که از خدمات من استفاده می‌کنند، خطوط هوایی دیگر را ترجیح می‌دهند.

نظرسنجی‌های سیاسی و سوگیری خودانتخابی

پیروزی دونالد ترامپ (Donald J. Trump) در انتخابات سال ۲۰۱۶ ریاست جمهوری آمریکا برخلاف پیش‌بینی‌های مبتنی بر نتایج بسیاری از نظرسنجی‌ها، بار دیگر توجه‌ها را به لزوم دقت در اجرا و تحلیل نظرسنجی‌ها جلب کرد. یکی از عوامل توضیح‌دهنده خطا در نتایج آن نظرسنجی‌ها، سوگیری خودانتخابی است.

بسیاری از روش‌های آماری از یک فرض بنیادی شروع می‌شوند که ممکن است نادیده گرفته شود: فرض تصادفی بودن نمونه آماری. وقتی شما می‌خواهید بفهمید در جامعه هدف (در این مثال همه افراد واجد شرایط که می‌خواهند در روز انتخابات رأی دهند) به کدام کاندید رأی می‌دهند عملاً نمی‌توانید از همه افراد جامعه سؤال کنید. این کار فقط یک‌بار آن‌هم در انتخابات واقعی ممکن است. برای این منظور باید یک سری از افراد را که کاملاً “تصادفی” انتخاب شده‌اند و “نماینده‌ای از جامعه هدف” هستند، به‌عنوان نمونه آماری انتخاب کنید و نتایج این نمونه را به جامعه هدف تعمیم دهید. تئوری‌های آماری این تضمین را می‌دهند درصورتی‌که چنین نمونه‌ای انتخاب کرده باشید، با احتمال خوبی می‌توانید ویژگی‌های جامعه هدف را تخمین بزنید.

حال اگر نمونه نسبت به قسمتی از جامعه هدف سوگیری داشته باشد و به‌نوعی نمایانگر تمام جامعه هدف نباشد، نتایج با خطا همراه است. درباره نظرسنجی‌های انتخاباتی، این‌که عملاً نظرسنجی حاصل پاسخ افرادی باشد که حاضر باشند در نظرسنجی شرکت کنند، تمام توضیحات ابتدایی را گوش کنند و پاسخ سؤالات را دهند، ممکن است نمونه را به سمت خاصی سوق دهد. این خطا همواره مشکل‌ساز نیست. برای مثال در آمریکا، میزان پاسخگویی آفریقایی-آمریکایی تبارها در نظرسنجی‌ها پایین است. محقق با دانستن این‌که چند درصد آفریقایی-آمریکایی تبارها کل جمعیت را تشکیل می‌دهند، می‌تواند بر اساس همان نمونه محدود، خطای آماری را اصلاح کند.

اما مشکل زمانی پیش ‌می‌آید که محقق نداند افراد ممکن است بر اساس چه ویژگی به نظرسنجی پاسخ ندهند و برخی از افراد به شکل سامانمند از شرکت در نظرسنجی امتناع کنند. در انتخابات اخیر بسیاری از طرفداران ترامپ بر این باور بودند که رسانه‌ها و مؤسسات افکارسنجی، نظرسنجی‌ها را دست‌کاری می‌کنند و این نگرش احتمالاً باعث شده است طرفداران وی از شرکت در نظرسنجی‌ها خودداری کنند و نتایج عملاً متمایل به طرفداران هیلاری کلینتون (Hillary Clinton) شود که خود ظن آن‌ها را تقویت می‌کرده است.

در این مثال در عمل، قسمتی از نمونه خودش انتخاب کرده که جزء آن نباشد.

نکته مهم این است که افزایش حجم نمونه خطای ناشی از سوگیری خودانتخابی را کاهش نمی‌دهد.

مطالعات مشاهده‌ای و سوگیری خودانتخابی

علاوه بر نظرسنجی‌ها، سوگیری خودانتخابی مطالعات مشاهده‌ای (Observational Studies) را هم می‌تواند تحت تأثیر قرار دهد. برای مثال، گروهی از محققان استرالیایی در سال ۲۰۱۱ گزارشی منتشر کردند که عنوان می‌کرد بر مبنای مشاهدات آنان به‌طور متوسط کسانی که شش ساعت تلویزیون در روز نگاه می‌کنند پنج سال زودتر از کسانی که اصلاً تلویزیون نگاه نمی‌کنند، می‌میرند. با در نظر گرفتن عادات مردم استرالیا در دیدن تلویزیون، آنان این‌طور نتیجه گرفته بودند که با ندیدن تلویزیون به‌طور متوسط دو سال به عمر انتظاری (Life Expectancy) افراد اضافه می‌شود.

در اینجا هم سوگیری خودانتخابی موجب می‌شود که افراد خود تصمیم بگیرند داخل گروهی باشند یا نباشند. در این مثال شاید کسانی که تصمیم گرفتند بیشتر تلویزیون نگاه کنند، ازنظر بدنی کمتر فعال هستند، یا مبتلا به افسردگی شده‌اند و یا در شرایط جسمی خوبی نیستند و نمی‌توانند مانند افراد سالم به فعالیت‌های پرتحرک بپردازند. درواقع ممکن است عامل پنهان دیگری هم‌زمان موجب افزایش دیدن تلویزیون و کاهش طول عمر می‌شود.

روش درست‌تر برای انجام چنین مطالعه‌ای بهره‌گیری از رویکرد آزمایش کنترل‌شده تصادفی است. در حالت ایدئال برای نتیجه‌گیری دقیق باید افراد را به‌صورت تصادفی به دو گروه تقسیم کنیم. گروه اول از دیدن تلویزیون ممنوع می‌شدند و گروه دوم مجبور می‌شدند که هرروز شش ساعت تلویزیون ببینند. در پایان دوره آزمایش، اثر تلویزیون دیدن را بر سلامت افراد دو گروه ارزیابی کنیم. البته واضح است که انجام چنین آزمایشی اخلاقی نیست و باید دنبال روش‌های دیگری بود تا خطای خودانتخابی را در چنین مطالعاتی کاهش داد.

چگونه سوگیری خودانتخابی را کاهش دهیم؟

همان‌طور که اشاره کردم حالت ایدئال برای از بین بردن سوگیری خودانتخابی بهره‌گیری از رویکرد آزمایش کنترل‌شده تصادفی است. اما اگر به هر دلیلی نتوان از این رویکرد استفاده کرد، روش‌های آماری مختلفی مانند رگرسیون چندمتغیره (Multiple Regression)، طراحی ناپیوسته رگرسیون (Regression Discontinuity Design) و همتایابی نمره تمایل (Propensity Score Matching) برای کاهش سوگیری خودانتخابی توسعه یافته‌اند. در اینجا من برای آنکه خواننده دید کلی نسبت به رویکردهای آماری برای حل این مسئله پیدا کند، روش همتایابی نمره تمایل را با مثالی ساده توضیح می‌دهم.

آشنایی شهودی با روش همتایابی نمره تمایل

فرض کنید وزارت بهداشت یک استان تصمیم گرفته است در چند روستا خانه بهداشت تأسیس کند. پس از گذشت یک سال وزارت بهداشت می‌خواهد ارزیابی کند تأسیس خانه بهداشت چه تأثیری بر ارتقاء سلامت روستائیان گذاشته است. برای این منظور نرخ مرگ‌ومیر را در روستاهایی که دارای خانه بهداشت هستند (گروه آزمایش Treatment Group) با آن‌ها که فاقد آن هستند (گروه کنترل Control Group)، مقایسه می‌کند. نتایج این طرح در شکل-۱ آمده است.

شکل-۱

یک روش ساده برای سنجش اثربخشی وجود خانه بهداشت این است که میانگین نرخ مرگ‌ومیر دو گروه را باهم مقایسه کنیم:

mean_{{treatment}} = 1/4\times(10+15+22+19) = 16.5
mean_{{control}} = 1/5\times(25+19+4+8+6) = 12.4

نتایج بالا نشان می‌دهد که میانگین نرخ مرگ‌ومیر در روستاهای فاقد خانه بهداشت ۱۲٫۴ در هر هزار نفر و در روستاهای دارای خانه بهداشت ۱۶٫۵ است. این در ظاهر یعنی در یک سال گذشته روستاهایی که دارای خانه بهداشت بودند، نرخ مرگ‌ومیر بالاتری داشتند. آیا خطایی در تحلیل وجود دارد؟

اگر خانه‌های بهداشت به‌صورت تصادفی در بعضی روستاها ساخته می‌شد و در برخی دیگر ساخته نمی‌شد، آن‌وقت این مقایسه درست بود ولی در واقعیت چنین نیست. به‌احتمال‌زیاد سیاست‌گذار بر مبنایی این تصمیم را گرفته که در کجا خانه بهداشت بسازد. اگر روستاهایی که در آن‌ها خانه بهداشت ساخته‌شده، در گذشته نرخ مرگ‌ومیر بالایی داشته‌اند، مقایسه این دو گروه باهم کار صحیحی نیست. درواقع نرخ مرگ‌ومیر بالا در آن روستاها عامل انتخاب این روستاها برای ساخت خانه بهداشت بوده است. در این صورت این روستاها را باید با همتایان خود مقایسه کرد. این رویکرد مبنای روش همتایابی نمره تمایل است.

اگر فرض کنیم هیچ داده‌ای از نرخ مرگ‌ومیر روستاها قبل از اجرای این برنامه نداشته باشیم، باید از شاخص‌های دیگری استفاده کنیم تا بفهمیم پیشینه این روستاها چقدر به هم شبیه است و تنها آن‌هایی را که به یکدیگر مشابه‌اند، مقایسه کنیم.

در شکل-۲ می‌بینید من دو متغیر دیگر را هم درباره این روستاها اضافه کردم؛ یکی درصد ساکنین زیر خط فقر و دیگری سرانه پزشک در آن روستا. این دو متغیر به من کمک می‌کند تا به برآوردی از پیشینه این روستاها برسم. با احتمال زیاد روستاهایی که ساکنان بیشتری زیر خط فقر و سرانه پزشک پایین‌تری دارند، پیش از اجرای این طرح دارای نرخ مرگ‌ومیر بالاتری بودند.

شکل-۲

در روش همتایابی نمره تمایل، با استفاده از رگرسیون لجستیک (Logistic Regression) برای هر مشاهده نمره‌ای بین صفر تا یک را بر اساس سایر متغیرهایی که ممکن است فرآیند انتخاب را تحت تأثیر قرار دهند (در این مثال درصد ساکنین زیر خط فقر و سرانه پزشک) محاسبه می‌کنیم. نمره تمایل نشانگر این است مشاهدات بر اساس آن متغیرها تا چه حد به هم شبیه هستند. من نمره تمایل را برای همه روستاها محاسبه کردم و در شکل-۳ نشان دادم.

شکل-۳

برای مثال می‌بینید روستای ردیف اول که دارای خانه بهداشت است، با روستای ردیف ۶ که فاقد خانه بهداشت است، به لحاظ پیشینه شباهت زیادی دارد. روستاهای ۲، ۳ و ۴ نیز مشابه روستای ۵ هستند. به‌این‌ترتیب روستاهای ۷، ۸ و ۹ از گروه کنترل خارج می‌شوند. اگر به این روستاها دقت کنید از منظر اقتصادی و سرانه پزشک در وضع مناسبی هستند. حالا می‌توانم روستاهای گروه آزمایش را با گروه کنترلی جدید که شامل روستاهای همتای گروه آزمایش هستند، مقایسه کنم.

mean_{{treatment}} = 1/4\times(10+15+22+19) = 16.5
mean_{{control}} = 1/4\times(19+25+25+25) = 23.5

در این حالت می‌بینیم ساختن خانه بهداشت اثر مثبتی روی کاهش نرخ مرگ‌ومیر گذاشته است.

در مثال مربوط به سنجش رضایت که در ابتدای مقاله اشاره کردم، روش همتایابی نمره تمایل می‌تواند اثر سوگیری خودانتخابی را تصحیح کند. در چنین نظرسنجی‌هایی باید نمره تمایل را برای مشتریانی که به نظرسنجی پاسخ دادند و آن‌هایی که پاسخ ندادند محاسبه کرد. معمولاً در سیستم‌های مدیریت ارتباط مشتریان (CRM) داده‌های خوبی از وضعیت جمعیت‌شناختی و رفتار خرید مشتریان جمع‌آوری می‌شود. این داده‌ها می‌تواند به‌عنوان مبنایی برای سنجش مشابهت پیشینه مشتریان استفاده شود تا میزان رضایت مشتریانی را که به نظرسنجی پاسخ ندادند بر اساس مشتریان با پیشینه مشابه که به نظرسنجی پاسخ دادند، تخمین زد.

اگر به موضوعات مطرح‌شده در این مقاله علاقه‌مند بودید، خواندن مقالات زیر را به شما توصیه می‌کنم.

چگونه بازماندگان شما را فریب می‌دهند؟

چرا مدیران باید تفاوت بین همبستگی و رابطه علّی را بدانند؟

چگونه رابطه علّی را تشخیص دهیم؟

منابع:

Bethlehem, J. (2010). “Selection Bias in Web Surveys”, International Statistical Review, 78(2), 161-188

Keeble, C., Law, G. R., Barber, S., & Baxter, P. D. (2015). “Choosing a Method to Reduce Selection Bias: A Tool for Researchers”, Open Journal of Epidemiology, 5(3), 155-162

Smith, G. (2014). “Standard Deviations: Flawed Assumptions, Tortured Data, and Other Ways to Lie with Statistics”, Overlook Duckworth, Peter Mayer Publishers, Inc. New York

Thavaneswaran, A., & Lix, L. (2008). “Propensity Score Matching in Observational Studies”, Manitoba Center for 

دسته‌ها
Buiness Analysis علمی محمد حسین ابراهیم زاده

قانون ده دقیقه

I made a new rule for my online searches. If my search fails in ten minutes, then I need to change my search.

یه قانون جدید گذاشتم برای جستجوهای آنلاینم. اگر جستجوی من بعد از ده دقیقه به نتیجه مطلوب نرسید، پس باید شیوه جستجوم رو تغییر بدم.