লাইন গ্রাফের অনেকগুলি লাইন রয়েছে, এর থেকে আরও ভাল সমাধান কি আছে?


30

আমি সময়ের সাথে সাথে ব্যবহারকারীদের দ্বারা ক্রিয়া সংখ্যা (এই ক্ষেত্রে, "পছন্দগুলি") লেখার চেষ্টা করছি।

সুতরাং আমার y- অক্ষ হিসাবে আমার "ক্রমের সংখ্যা" রয়েছে, আমার এক্স-অক্ষের সময় (সপ্তাহ) এবং প্রতিটি লাইনই একজন ব্যবহারকারীকে উপস্থাপন করে।

আমার সমস্যাটি হ'ল আমি প্রায় 100 ব্যবহারকারীর সেট এর জন্য এই ডেটাটি দেখতে চাই। একটি লাইন গ্রাফ দ্রুত 100 লাইন সহ একটি বিচলিত জঞ্জাল হয়ে যায়। এই তথ্যটি প্রদর্শন করতে আমি কি আরও ভাল ধরণের গ্রাফ ব্যবহার করতে পারি? বা আমার ব্যক্তিগত লাইনগুলি চালু / বন্ধ টগল করতে সক্ষম হওয়া উচিত?

আমি একবারে সমস্ত ডেটা দেখতে চাই, তবে উচ্চ নির্ভুলতার সাথে ক্রিয়া সংখ্যা নির্ধারণ করতে সক্ষম হওয়া খুব গুরুত্বপূর্ণ নয়।

আমি কেন এটি করছি

আমার ব্যবহারকারীদের (শীর্ষ ব্যবহারকারীদের) একটি উপসেটের জন্য, আমি এটি অনুসন্ধান করতে চাই যে কোনও একটি নির্দিষ্ট তারিখে এপ্লিকেশনটির নতুন সংস্করণ পছন্দ করে নি that আমি পৃথক ব্যবহারকারীদের দ্বারা ক্রিয়া সংখ্যায় উল্লেখযোগ্য ড্রপ সন্ধান করছি।


5
আপনি কি আলফাকে প্লট করার জন্য ব্যবহৃত হচ্ছে তা পরিবর্তন করে লাইনগুলি আধা স্বচ্ছ করার বিষয়টি বিবেচনা করেছেন?
Fomite

1
@ এপিগ্রাড যুক্তিসঙ্গত পরামর্শ কিন্তু আমি যা খুঁজছি তা দেখতে এটি এত সহজ করে তুলবে না।
নিয়মিত

1
@ রেগুলেট এটিতে আমি facet_wrapচার্ট প্রতি ~ 5 জন ব্যবহারকারী দিয়ে 4 x 5 চার্টের (4 সারি, 5 কলাম - পছন্দসই দিক অনুপাতের উপর নির্ভর করে) ব্লক তৈরি করতে ggplot2 এর ফাংশন ব্যবহার করে একটি "ছোট একাধিক" পদ্ধতির পরামর্শ দেব । এটি যথেষ্ট পরিষ্কার হওয়া উচিত এবং আপনি এটি চার্ট প্রতি প্রায় 10 ব্যবহারকারী পর্যন্ত স্কেল করতে পারেন, 4x5 প্লট দিয়ে 200 বা 6x6 প্লটের সাথে 360 ব্যবহার করে giving
স্লোলিয়ারার

উত্তর:


31

আমি (ক) ব্যবহারকারীর মধ্যে পরিবর্তনের মূল প্রভাবগুলি মুছে ফেলার জন্য একটি (মানিক) প্রাথমিক বিশ্লেষণের পরামর্শ দিতে চাই, (খ) পরিবর্তনের ক্ষেত্রে সমস্ত ব্যবহারকারীর মধ্যে আদর্শ প্রতিক্রিয়া এবং (গ) এক সময়ের থেকে পরবর্তী সময়ের মধ্যে সাধারণ পরিবর্তনের জন্য ।

এটি করার একটি সহজ (তবে কোনওভাবেই সর্বোত্তম নয়) উপায় হল ব্যবহারকারী মিডিয়ান এবং সময়কালীন মিডিয়ানদের সাফ করার জন্য ডেটাতে "মিডিয়ান পোলিশ" এর কয়েকটি পুনরাবৃত্তি করা, তারপরে সময়ের সাথে সাথে বাকীগুলিকে মসৃণ করুন। মসৃণগুলি যেগুলি অনেকগুলি পরিবর্তন করে তা সনাক্ত করুন: তারা গ্রাফিকগুলিতে আপনি জোর দিতে চান এমন ব্যবহারকারী users

কারণ এগুলি গণনা ডেটা, বর্গমূল ব্যবহার করে এগুলি পুনরায় প্রকাশ করা ভাল ধারণা।

ফলাফল কী হতে পারে তার উদাহরণ হিসাবে, 240 ব্যবহারকারীর একটি সিমুলেটেড 60-সপ্তাহের ডেটাসেট রয়েছে যারা সাধারণত প্রতি সপ্তাহে 10 থেকে 20 ক্রিয়া করে। 40 সপ্তাহ পরে সমস্ত ব্যবহারকারীর মধ্যে একটি পরিবর্তন ঘটেছিল these এর মধ্যে তিনটি পরিবর্তকে নেতিবাচক প্রতিক্রিয়া জানাতে "বলা হয়েছিল"। বাম প্লটটি কাঁচা ডেটা দেখায়: সময়ের সাথে সাথে ব্যবহারকারী দ্বারা রঙের দ্বারা পৃথকীকৃত কর্মের সংখ্যা। প্রশ্নে দৃserted়ভাবে বলা হয়েছে, এটি একটি গোলযোগ। ডান প্লটটি এই ইডিএর ফলাফলগুলি দেখায় - আগের মতো একই রঙে - অস্বাভাবিকভাবে প্রতিক্রিয়াশীল ব্যবহারকারীদের সাথে স্বয়ংক্রিয়ভাবে চিহ্নিত এবং হাইলাইট হয়। সনাক্তকরণ - এটা কিছুটা যদিও তদর্থক --is সম্পূর্ণ ও সংশোধন (এই উদাহরণে)।

চিত্র 1

এখানে Rকোডটি এই তথ্য উত্পাদিত এবং বিশ্লেষণ চালায়। এটি সহ বেশ কয়েকটি উপায়ে উন্নতি করা যেতে পারে

  • কেবলমাত্র একটি পুনরাবৃত্তির পরিবর্তে অবশিষ্টাংশগুলি অনুসন্ধান করার জন্য একটি পূর্ণ মিডিয়ান পোলিশ ব্যবহার করা।

  • পরিবর্তনের পয়েন্টের আগে এবং পরে আলাদাভাবে অবশিষ্টাংশগুলিকে স্মুথ করা।

  • সম্ভবত আরও পরিশীলিত আউটলেট সনাক্তকরণ অ্যালগরিদম ব্যবহার করে। বর্তমান এক কেবল সমস্ত ব্যবহারকারীকে ফ্ল্যাগ করে যাঁর রেসিডুয়ালগুলির পরিসীমা মাঝারি ব্যাপ্তির দ্বিগুণেরও বেশি। তবুও সহজ, এটি দৃust় এবং ভালভাবে কাজ করে বলে মনে হয়। (একটি ব্যবহারকারী-স্থিরযোগ্য মান, এই পরিচয়টি thresholdকম-বেশি কড়া করার জন্য সামঞ্জস্য করা যেতে পারে))

তবুও পরীক্ষার পরামর্শ দেয় যে এই সমাধানটি 12 - 240 বা তার বেশি সংখ্যক ব্যবহারকারীর জন্য গণনা করে।

n.users <- 240        # Number of users (here limited to 657, the number of colors)
n.periods <- 60       # Number of time periods
i.break <- 40         # Period after which change occurs
n.outliers <- 3       # Number of greatly changed users
window <- 1/5         # Temporal smoothing window, fraction of total period
response.all <- 1.1   # Overall response to the change
threshold <- 2        # Outlier detection threshold

# Create a simulated dataset
set.seed(17)
base <- exp(rnorm(n.users, log(10), 1/2))
response <- c(rbeta(n.users - n.outliers, 9, 1),
              rbeta(n.outliers, 5, 45)) * response.all
actual <- cbind(base %o% rep(1, i.break), 
                base * response %o% rep(response.all, n.periods-i.break))
observed <- matrix(rpois(n.users * n.periods, actual), nrow=n.users)

# ---------------------------- The analysis begins here ----------------------------#
# Plot the raw data as lines
set.seed(17)
colors = sample(colors(), n.users) # (Use a different method when n.users > 657)
par(mfrow=c(1,2))
plot(c(1,n.periods), c(min(observed), max(observed)), type="n",
     xlab="Time period", ylab="Number of actions", main="Raw data")
i <- 0
apply(observed, 1, function(a) {i <<- i+1; lines(a, col=colors[i])})
abline(v = i.break, col="Gray")  # Mark the last period before a change

# Analyze the data by time period and user by sweeping out medians and smoothing
x <- sqrt(observed + 1/6)                        # Re-express the counts
mean.per.period <- apply(x, 2, median)
residuals <- sweep(x, 2, mean.per.period)
mean.per.user <- apply(residuals, 1, median)
residuals <- sweep(residuals, 1, mean.per.user)

smooth <- apply(residuals, 1, lowess, f=window)  # Smooth the residuals
smooth.y <- sapply(smooth, function(s) s$y)      # Extract the smoothed values
ends <- ceiling(window * n.periods / 4)          # Prepare to drop near-end values
range <- apply(smooth.y[-(1:ends), ], 2, function(x) max(x) - min(x))

# Mark the apparent outlying users
thick <- rep(1, n.users)
thick[outliers <- which(range >= threshold * median(range))] <- 3
type <- ifelse(thick==1, 3, 1)

cat(outliers) # Print the outlier identifiers (ideally, the last `n.outliers`)

# Plot the residuals
plot(c(1,n.periods), c(min(smooth.y), max(smooth.y)), type="n",
     xlab="Time period", ylab="Smoothed residual root", main="Residuals")
i <- 0
tmp <- lapply(smooth, 
       function(a) {i <<- i+1; lines(a, lwd=thick[i], lty=type[i], col=colors[i])})
abline(v = i.break, col="Gray")

3
threshold2.5n.users <- 500n.outliers <- 100threshold <- 2.5

16

সাধারণত আমি প্লটের একক দিকের দুটি বা তিনটি লাইনের বেশি দেখতে পঠন কঠিন হতে শুরু করি (যদিও আমি এখনও এটি সমস্ত সময় করি)। সুতরাং যখন আপনার কাছে এমন কিছু রয়েছে যা ধারণাগতভাবে 100 দিকের প্লট হতে পারে তখন কী করা উচিত এটি একটি আকর্ষণীয় উদাহরণ। একটি সম্ভাব্য উপায় হ'ল সমস্ত 100 টি দৃষ্টিভঙ্গি আঁকুন তবে সেগুলি একবারে পৃষ্ঠায় একবারে পাওয়ার চেষ্টা করার পরিবর্তে অ্যানিমেশনটিতে একবারে তাদের দিকে তাকিয়ে looking

আমরা আসলে আমার কাজটিতে এই কৌশলটি ব্যবহার করেছি - আমরা মূলত একটি ইভেন্টের পটভূমি হিসাবে (একটি নতুন ডেটা সিরিজের প্রবর্তন) হিসাবে different০ টি বিভিন্ন লাইন প্লট দেখিয়ে অ্যানিমেশন তৈরি করেছি, তারপরে আমরা দেখেছি যে এটি করার ফলে আমরা তথ্যটির কিছু বৈশিষ্ট্য তুলেছি যা প্রতি পৃষ্ঠায় 15 বা 30 টির মতো মুখযুক্ত প্লটগুলিতে দৃশ্যমান ছিল না।

সুতরাং আপনি কাঁচা তথ্য উপস্থাপনের একটি বিকল্প উপায়, আপনি @Whuber দ্বারা প্রস্তাবিত হিসাবে ব্যবহারকারী এবং সাধারণ সময়ের প্রভাবগুলি অপসারণের আগে। এটি তার কাঁচা তথ্য উপস্থাপনের অতিরিক্ত বিকল্প হিসাবে উপস্থাপিত হয়েছে - আমি সম্পূর্ণরূপে আপনাকে পরামর্শ দিচ্ছি যে আপনি তারপরে তার পরামর্শ মত লাইন ধরে বিশ্লেষণ চালিয়ে যান।

এই সমস্যাটি ঘুরে দেখার এক উপায় হ'ল 100 (বা @ হুবারের উদাহরণে 240) সময় সিরিজের প্লটগুলি আলাদাভাবে তৈরি করা এবং এনিমেশনে একসাথে বুনন। নীচের কোডটি এই ধরণের 240 পৃথক চিত্র তৈরি করবে এবং তারপরে আপনি মুভিতে রূপান্তর করতে ফ্রি মুভি তৈরির সফটওয়্যার ব্যবহার করতে পারেন। দুর্ভাগ্যক্রমে আমি এটি করতে এবং গ্রহণযোগ্য মানের রাখতে পারার একমাত্র উপায় ছিল 9MB ফাইল, তবে আপনার যদি এটি ইন্টারনেটে প্রেরণের দরকার না হয় যা সমস্যা নাও হতে পারে এবং যাইহোক আমি নিশ্চিত যে আরও কিছু উপায়ের সাথে এর আশেপাশে উপায় রয়েছে sure অ্যানিমেশন জ্ঞান আর-এ অ্যানিমেশন প্যাকেজটি এখানে দরকারী হতে পারে (আপনি আর এর মাধ্যমে একটি কল এ সব করতে দেয়) তবে আমি এই চিত্রটির জন্য এটি সহজ রেখেছি।

আমি অ্যানিমেশনটি এমনভাবে তৈরি করেছি যে এটি প্রতিটি লাইনকে ভারী কালোতে আঁকেন তারপরে একটি ফ্যাকাশে অর্ধ-স্বচ্ছ সবুজ ছায়া ফেলে দেয় যাতে চোখটি জমা হওয়া ডেটার ক্রমান্বয়ে ছবি পায়। এতে উভয় ক্ষেত্রেই ঝুঁকি এবং সুযোগ রয়েছে - লাইনগুলি যুক্ত হওয়ার ক্রমটি একটি পৃথক ধারণা ছেড়ে দেবে, সুতরাং আপনার এটিকে কোনও উপায়ে অর্থবহ করার বিষয়টি বিবেচনা করা উচিত।

মুভিটির কয়েকটি স্থিরচিত্র এখানে রয়েছে, যা একই তথ্য ব্যবহার করে যা @ শুভর উত্পন্ন করেছেন: এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

# ---------------------------- Data generation - by @whuber ----------------------------#

n.users <- 240        # Number of users (here limited to 657, the number of colors)
n.periods <- 60       # Number of time periods
i.break <- 40         # Period after which change occurs
n.outliers <- 3       # Number of greatly changed users
window <- 1/5         # Temporal smoothing window, fraction of total period
response.all <- 1.1   # Overall response to the change
threshold <- 2        # Outlier detection threshold

# Create a simulated dataset
set.seed(17)
base <- exp(rnorm(n.users, log(10), 1/2))
response <- c(rbeta(n.users - n.outliers, 9, 1),
              rbeta(n.outliers, 5, 45)) * response.all
actual <- cbind(base %o% rep(1, i.break), 
                base * response %o% rep(response.all, n.periods-i.break))
observed <- matrix(rpois(n.users * n.periods, actual), nrow=n.users)

# ---------------------------- The analysis begins here ----------------------------#

# Alternative presentation of original data 
# 
setwd("eg animation")

for (i in 1:n.users){
    png(paste("line plot", i, ".png"),600,600,res=60)
    plot(c(1,n.periods), c(min(observed), max(observed)), 
        xlab="Time period", ylab="Number of actions", 
        main="Raw data", bty="l", type="n")
    if(i>1){apply(observed[1:i,], 1, function(a) {lines(a, col=rgb(0,100,0,50,maxColorValue=255))})}
    lines(observed[i,], col="black", lwd=2)
    abline(v = i.break, col="Gray")  # Mark the last period before a change
    text(1,60,i)
    dev.off()
}

##
# Then proceed to further analysis eg as set out by @whuber

+1, এটি একটি দুর্দান্ত ধারণা। আপনি windows()বা ব্যবহার করে একটি নতুন ডিভাইস উইন্ডোও শুরু করতে পারেন quartz()এবং তারপরে নিজের for()লুপটিকে নীড় করে নিতে পারেন। এনবি, আপনাকে Sys.sleep(1)আপনার লুপের নীচে একটি রাখা দরকার যাতে আপনি প্রকৃতপক্ষে পুনরাবৃত্তিগুলি দেখতে পান। অবশ্যই, এই কৌশলটি কোনও মুভি ফাইলটি সংরক্ষণ করে না - আপনি যখনই আবার এটি দেখতে চান প্রতিবার এটি চালাতে হবে।
গুং - মনিকা পুনরায়

+1 খুব সুন্দর ধারণা - আমি পরের সুযোগটি চেষ্টা করব। (GTW, ম্যাথামেটিকাল , উদাহরণস্বরূপ, তৈরি এবং এই ধরনের অ্যানিমেশন বাঁচানোর ছোট কাজ করে।)
whuber

আশ্চর্যজনক ধারণা - এই লাইনগুলির সাথে অ্যানিমেশন (বা উত্পন্ন করার কোড এবং ডেটা) কোনও প্রকাশনায় খুব সেক্সি অনলাইন পরিশিষ্ট তৈরি করবে।
এন ব্রাউয়ার

7

সবচেয়ে সহজ জিনিসগুলির মধ্যে একটি হ'ল একটি বক্সপ্লট। আপনার নমুনা মিডিয়ানরা কীভাবে চলে এবং কোন দিনগুলিতে সর্বাধিক বিদেশী থাকে তা আপনি তাত্ক্ষণিকভাবে দেখতে পারেন।

day <- rep(1:10, 100)
likes <- rpois(1000, 10)
d <- data.frame(day, likes)
library(ggplot2)
qplot(x=day, y=likes, data=d, geom="boxplot", group=day)

এখানে চিত্র বর্ণনা লিখুন

স্বতন্ত্র বিশ্লেষণের জন্য আমি আপনার ডেটা থেকে একটি ছোট এলোমেলো নমুনা গ্রহণ এবং পৃথক সময় সিরিজ বিশ্লেষণ করার পরামর্শ দিই।


1
আকর্ষণীয় সমাধান, তবে আমি যা দেখতে চাই তা প্রতি ব্যবহারকারী ভিত্তিতে কীভাবে "পরিবর্তন" হয় তা দেখতে সক্ষম হতে চাই। আমি পৃথক ব্যবহারকারীদের জন্য ক্রিয়াকলাপে ওঠানামা দেখতে চাই। এজন্য আমি প্রথমদিকে একটি লাইন বেছে নিয়েছি, তবে দৃশ্যায়ন এখন খুব বিশৃঙ্খলাযুক্ত।
নিয়মিত

ঠিক আছে, এটি আপনার ডেটাতে আপনি কী প্যাটার্নগুলি দেখতে সক্ষম হতে চান তার উপর নির্ভর করে, আপনি যদি আমাদের সন্ধানের চেষ্টা করছেন তা যদি আমাদের বলতে পারে তবে আমরা সমাধান নিয়ে আসতে পারি।
jem77bfp

আমার ব্যবহারকারীদের (শীর্ষ ব্যবহারকারীদের) একটি উপসেটের জন্য, আমি এটি অনুসন্ধান করতে চাই যে কোনও একটি নির্দিষ্ট তারিখে এপ্লিকেশনটির নতুন সংস্করণ পছন্দ করে নি that আমি পৃথক ব্যবহারকারীদের দ্বারা ক্রিয়া সংখ্যায় উল্লেখযোগ্য ড্রপ সন্ধান করছি।
নিয়মিত

@ Jem77bfp সাইটে আপনাকে স্বাগতম। তিনি বলেছিলেন যে তিনি সমস্ত তথ্য দেখতে চান। তবে আরও বিশদ থাকতে ভাল লাগবে, আমি সম্মত।
পিটার ফ্লুম - মনিকা

+1 - বাক্স প্লটগুলি দেখার পরিবর্তে লাইন গ্রাফগুলিতে সংক্ষিপ্তসার সংখ্যার সাথে সংযোগ স্থাপনে এটি কার্যকর হতে পারে। নীচের উদাহরণ এবং আলোচনার জন্য আমার এই উত্তরটি দেখুন ।
অ্যান্ডি ডাব্লু

7

অবশ্যই। প্রথমত, ক্রিয়াগুলির গড় সংখ্যা অনুসারে বাছাই করুন। তারপরে (বলুন) 4 টি গ্রাফ তৈরি করুন, প্রতিটি 25 টি লাইন, প্রতিটি চৌকোটির জন্য একটি করে। তার মানে আপনি y- অক্ষগুলি সঙ্কুচিত করতে পারেন (তবে y অক্ষের লেবেলটি পরিষ্কার করুন)। এবং 25 টি লাইনের সাহায্যে আপনি লাইন টাইপ এবং রঙ এবং সম্ভবত প্রতীক চিহ্নের চিহ্ন অনুসারে এগুলি পরিবর্তন করতে পারেন এবং কিছুটা স্পষ্টতা পেতে পারেন

তারপরে একটি একক সময় অক্ষের সাহায্যে গ্রাফগুলি উলম্বভাবে স্ট্যাক করুন।

এটি আর বা এসএএস-তে বেশ সহজ হবে (কমপক্ষে আপনার যদি এসএএস এর v। 9 থাকে)।


2
+1 - যদিও ছোট ছোট একাধিকের তুলনায় আরও কম রেখার পরামর্শ দিচ্ছি! বিষয়টিতে আমার সম্পর্কিত ব্লগ পোস্ট এবং একটি উদাহরণ দেখুন। বাছাই করাও একটি দুর্দান্ত ধারণা, এবং অন্যান্য সম্ভাব্য বিষয়গুলির মধ্যে বেসলাইন বা ফলো-আপের মান বা পরিবর্তনের ব্যবস্থা (যেমন ইতিবাচক বা নেতিবাচক opeাল, শতাংশ পরিবর্তন ইত্যাদি) অন্তর্ভুক্ত থাকতে পারে।
অ্যান্ডি ডাব্লু

নিস! কমিউনিটি ব্লগ কি? কীভাবে এটির জন্য একজন অ্যাক্সেস বা লিখতে পারে?
পিটার ফ্লুম - মনিকা পুনরায়

3
কীভাবে ব্লগে যোগ দিতে হবে তার বিশদ জন্য স্কিওড ডিস্ট্রিবিউশন চ্যাট রুমে নির্দ্বিধায় বন্ধ করুন। আমরা সম্প্রদায়ে সদস্যদের আরও অবদানের জন্য সর্বদা উন্মুক্ত।
অ্যান্ডি ডাব্লু

0

আমি দেখতে পেলাম যে অ্যানিমেশনের মাধ্যমে গ্রাফ এবং গ্রাফের সেটিংসের সময় পরিচয় পরিচয়ের প্রকারের সাথে সম্পর্কিত বিকল্পগুলি প্রদর্শন করার সর্বোত্তম উপায় কারণ এটি আপনাকে কাজ করার জন্য একটি অতিরিক্ত মাত্রা দেয় এবং সহজেই অনুসরণ করতে আপনাকে আরও তথ্য প্রদর্শন করতে দেয় । আপনার প্রাথমিক ফোকাসটি অবশ্যই শেষ ব্যবহারকারী অভিজ্ঞতার দিকে থাকতে হবে।


পিটার এলিস এখানে পোস্ট করেছেন এমন সমাধানের চেয়ে আপনার মনে কী কিছু আছে ? যদি তা হয় তবে আপনি কি দয়া করে এটি বিস্তারিতভাবে বলতে পারেন?
হোবার

0

আপনি যদি পৃথক ব্যবহারকারীর জন্য পরিবর্তনের বিষয়ে সবচেয়ে আগ্রহী হন তবে স্পার্কলাইন সংগ্রহের জন্য এটি বেশ ভাল পরিস্থিতি (পুডিংয়ের উদাহরণের মতো ):

পুডিংকুল থেকে স্পার্কলাইনগুলির উদাহরণ

এগুলি বেশ বিশদযুক্ত, তবে আপনি অক্ষ লেবেল এবং ইউনিটগুলি সরিয়ে একবারে আরও অনেকগুলি চার্ট প্রদর্শন করতে পারেন।

অনেকগুলি ডেটা সরঞ্জাম এগুলিতে তৈরি করা হয়েছে ( মাইক্রোসফ্ট এক্সেলের স্পার্কলাইন রয়েছে ) তবে আমি অনুমান করছি যে আপনি এগুলিকে আর এ তৈরি করতে কোনও প্যাকেজ টেনে আনতে চান d

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.