گزارش جلسه اول کارگاه تحلیل داده در R

workshop_dataAnalysis-with-R-cover3

روز نخست کارگاه «تحلیل داده در R» در هفته‌ای که گذشت در دانشکده مهندسی صنایع دانشگاه شریف توسط انجمن علمی دانشجویان همین دانشکده برگزار شد.

مقدمه

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

اگر فکر می‌کنید لازمه که در کنار کارگاه یک یا چند منبع آموزشی را به طور کامل مطالعه کنید تا مطمئن شید نسبت به جوانب موضوع اشراف پیدا کردید، به لینک زیر مراجعه کنید:

اینجا علاوه بر منابع آموزشی، یک سری پروژه هم هست که اگر دنبال منابعی برای تمرین و دست‌ورزی بیشتر هستید، می‌تونه به کارتون بیاد.

اگر دنبال یک ترتیب مناسب برای یادگیری امکانات و سرفصل‌های مختلف تحلیل داده با R هستید می‌تونید به این ترتیب پیش برید:

برای اینکه به محتوای مدرسه دقیقه (d-learn.ir) به طور کامل دسترسی پیدا کنید، لازمه از اینجا اشتراک تهیه کنید:

برای تهیه اشتراک، اگر «اشتراک سبز یک‌ماهه» انتخاب کنید و عبارت زیر را در بخش کد تخفیف وارد کنید، خرید اشتراک رایگان خواهد شد:

iesharif-grn1m-free

این کد تخفیف تا پایان هفته اول اسفند فعال خواهد بود.

اگر فکر می‌کنید برای یادگیری موثر، به دریافت بازخورد اختصاصی نیاز دارید، اشتراک‌های
طلایی را انتخاب کنید. با وارد کردن کد تخفیف زیر، ۵۰% تخفیف روی تمامی طرح‌های اشتراک
دریافت کنید:

iesharif-all-50%

این کد تخفیف تا پایان هفته اول اسفند فعال خواهد بود.

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

آشنایی سریع با R

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

دوره آموزشی «آشنایی با R»

عملگر، مقدار پایه، بردار، ماتریس، لیست، فاکتور، جدول

کدهایی که در کلاس نوشتیم را می‌تونید اینجا ملاحظه کنید:

				
					# Basic Values in R

# numeric
class(3.56)
class(2)
# integer
class(2L)
# logical
class(F)
TRUE 
FALSE
T
F
# character
class('salam')

# We always deal with basic values as vectors 
x = c(2,3,5,7,9)
x <- c(2,3,5,7,9)

# = and <- are both assignment operators

class(x) # there is not a new class for vectors
length(x)

y = 1:5
class(y) # integer

# vectorized (element-wise) operations
x * 3
x + y
x > y

z = 51:100
print(z)

# some built-in functions
class()
typeof()
c()

mean(d$k)
min(d$k)
max(d$k)
which.max(d$k)


## How to call values from a vector
# method 1. indexing by integer
z[3]
z[c(3,7,40)]

# method 2. by logical indexing
z > 80
z[z > 80]
z[z > 80 & z < 90]

# method 3. by calling names
t = c(Ali = 15, Mina = 18, Sina = 15)
t
class(t)
t['Ali']
class(t[c('Mina', 'Sina')])

names(t)

a = c(1,3)
names(a) = c('s1', 's2')
a

# Values are mutable in R and can be replaced by new values while calling them
a[2] = 12
a

# a vector has only one class
e = c(1L, 3.6, F, T, 's')
class(e) # takes the most general class among the present values
e

#####################

# matrix
m = 1:100
dim(m) # a vector has no dimention in R
dim(m) = c(20, 5)
m

class(m)
typeof(m) # typeof returns the most general class that an object belongs to

x[c(3, 6, 10),]

# concatenating vectors to build a matrix by row or column
rbind(1:5, 6:10)
cbind(1:5, 6:10)

# list 
x = list(n1 = c(1,2,4),
         n2 = c('a', 'b', 'c', 'd'),
         n3 = 1:20)
class(x)
x
class(x[1]) # [] returns a list
x[[1]]
class(x[[1]]) # [[]] drop the class of the list and returns class the value
x[['n1']]

x$n2 # no need to use '' when we call the names by $

# data.frame
d = data.frame(x = 1:10,
               y = letters[1:10],
               z = LETTERS[1:10],
               k = runif(10, 0, 10))
d
class(d)
# data.frame is a type of list
# it's a list that has been made up of vectors of the same length
typeof(d) # typeof returns the most general class that an object belongs to

# converting matrix to a data.frame
dm = as.data.frame(m)

class(d$x)
d[1,]
d[, 1]
d[1:4, 1:2]

d$x + d$k
d$new_column = 1

d[3, 4] = 40
d[3, 4]

				
			

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

				
					
newfunction = function(x, y){
  z = x + y
  return(z)
} 

newfunction(3, 6)

x = 8
if (x > 10){
  print('x is larger than 10')
} else if (x < 10) {
  print('x is less than 10')
} else {
  print('x is 10')
}


for (i in 1:10){
  print(i)
}

j = 0
while (j < 5){
  print(j)
  j = j + 1
}

# some plotting functions in base R
plot(runif(50, 0, 10), rnorm(50, 0, 1))
hist(rnorm(50, 0, 1))


				
			

تحلیل داده‌های آلودگی هوای تهران

بعد از این معرفی، با توجه به وضعیت کیفیت هوا در ماه‌های اخیر، رفتیم سراغ موضوع آلودگی هوا و داده‌های شرکت کنترل کیفیت هوای تهران (متعلق به شهرداری) با دست‌ورزی با این داده‌ها چیزهایی که یاد گرفتیم را به کار بگیریم و کلی مطلب جدید یاد بگیریم.

این داده‌ها را می‌تونید از لینک زیر بردارید (آرشیو شاخص کیفیت هوا):

tehran airnow daily archive | گزارش جلسه اول کارگاه تحلیل داده در R

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

  1. تحلیل رابطه تعطیلی با آلودگی هوا: آیا تعطیل کردن مدارس، دانشگاه‌ها تاثیر قابل توجهی در کاهش آلودگی هوا دارد؟
  2. تحلیل رابطه آلودگی هوا با آمار مرگ و میر: آیا آلودگی هوا با تاثیر بر سلامت افراد سالمند و آسیب‌پذیر باعث افزایش آمار مرگ و میر می‌شود؟
  3. آیا آلودگی هوا در مناطق مختلف تهران یک پدیده یکدست است یا در مناطق تفاوت‌های چشمگیر وجود دارد؟ به بیان دیگر وقتی هوا آلوده می‌شود در همه مناطق آلوده است یا تنها در برخی مناطق آلودگی مشاهده می‌شود در حالیکه در مناطق دیگر کیفیت هوا قابل قبول یا پاک است؟
  4. تحلیل سرعت تغییرات آلودگی هوا در تهران برای اینکه به درکی از سرعت تولید آلاینده‌ها در شهر: بیشترین تغییر
  5. تحلیل رابطه آلودگی هوا با آمار تصادف‌های درون شهری چون ممکن است با توجه کاهش دید و تاثیر روانی موثر باشد.
  6. تحلیل رابطه آلودگی هوا با آمار بیماری‌های مادرزادی
  7. ارتباط آلودگی هوا با پوشش گیاهی و فرسایش خاک
  8. تحلیل  رابطه مصرف انرژی به طور مشخص در نیروگاه‌ها با آلودگی هوا: آیا می‌توان با تلفیق این داده‌ها با یکدیگر سرنخی از سوزاندن سوخت‌های آلاینده‌تر مانند سوخت‌های مایعی مثل گازوییل و مازوت در نیروگاه‌ها پیدا کرد؟
  9. بررسی رابطه آلودگی هوا با آمار خروج اتوموبیل‌ها از شهر
  10. بررسی وضعیت آلودگی هوا در ایستگاه‌های نزدیک به محل‌های سوزاندن زباله نسبت به سایر ایستگاه‌ها

همونطور که در کلاس هم بحث شد در مورد خیلی از این موارد ممکنه با موانع زیادی در تحلیل مواجه شیم و خیلی راه همواری پیش رومون نباشه. مثلا ممکنه به داده‌های آب و هوایی نیاز داشته باشیم چون به عنوان نمونه می‌دونیم که وزش باد تاثیر زیادی روی کاهش آلودگی هوا داره، یا مثلا اگر بخواهیم رابطه آلودگی هوا با آمار مرگ و میر را مورد بررسی قرار بدیم، باید به پدیده‌‌ای مثل کرونا که می‌دونیم روی مرگ و میر تاثیر زیادی می‌گذاره توجه کنیم و چاره‌ای براشون بیاندیشیم و کلی چالش‌های دیگه مثل همینا … البته خیلی وقت‌ها پرداختن به همین چالش‌ها در حقیقت همون چیزیه که بررسی ما رو پیش می‌بره و به طرح فرضیه و تحلیل‌های بعدی می‌رسونه.
بعد از کمی بحث و گفتگو درباره این عناوین، داده‌هایی را که برای پاسخ به هر سوال نیاز داریم بررسی کردیم. در نتیجه این بررسی، پرسش‌های 5 و 6 و 7 به خاطر دشواری در دسترسی به داده‌های مورد نیاز کنار گذاشنه شدند. بعد از کاهش تعداد گزینه‌ها روی موارد باقیمانده رای‌گیری کردیم. گزینه‌های 8 و 1 با اختلاف بیشتر از بقیه ایده‌ها رأی آوردند. در نتیجه، دستور کارِ کارگاه شد تلاش برای پاسخ به پرسش شماره 8.
اما قبل از اینکه بریم سراغ تحلیل داده‌های مختلف و سعی کنیم با کنار هم قرار دادنشون به این پرسش پاسخ بدیم، باید داده‌های آلودگی هوا که موضوع اصلی تحلیل‌مان خواهد بود را به صورت اختصاصی پیش‌پردازش و بررسی کنیم.

فایلی که از سایت شرکت کنترل کیفیت هوا در کامپیوتر خودمون دانلود کردیم، فایلی با فرمت xlsx است و برای وارد کردن آن در R باید کتابخانه‌ای مثل readxl را نصب و فراخوانی کنیم. این پیش‌پردازش را به صورت زیر آغاز کردیم. پیش‌پردازش مختصری که در دقایق پایانی کلاس انجام دادیم را می‌تونید در ادامه مشاهده کنید.

				
					library(readxl)

d = read_excel('D:/SMCloud/dataSource/shahrdariTehran/airnow/report.xlsx', skip = 1)

class(d)

# rename the columns
names(d)[1:2] = c('station', 'date')
names(d)[10:15] = paste0('s', 1:6)

# removing the rows that are not observations
d = d[d$station != unique(d$station)[1],]

# take a look at the class of each column 
class(d$date)
class(d$CO)
class(d$O3)

# looking at the classes of the columns all at once
sapply(d, class)

# how much of the first column is not available
sum(!is.na(d$station)) / nrow(d)

# calculating not-na-percent in all columns
is_na = function(x){
  return(sum(!is.na(x)) / length(x))
}

sapply(d, is_na)  

# summary() returns information about NAs in each columns, next to other statistics  
summary(d)

				
			

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

دیدگاه‌ها

یک پاسخ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors